<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gabriel Womelsdorf</title>
    <description>The latest articles on Forem by Gabriel Womelsdorf (@silverwarriorin).</description>
    <link>https://forem.com/silverwarriorin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F862034%2F775b7710-5d65-4cfb-bbc8-aa39f82294a2.jpg</url>
      <title>Forem: Gabriel Womelsdorf</title>
      <link>https://forem.com/silverwarriorin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/silverwarriorin"/>
    <language>en</language>
    <item>
      <title>Is My Thermostat Lying? Designing a Low-Power Multi-Sensor Node (Series)</title>
      <dc:creator>Gabriel Womelsdorf</dc:creator>
      <pubDate>Fri, 10 Apr 2026 19:45:43 +0000</pubDate>
      <link>https://forem.com/silverwarriorin/is-my-thermostat-lying-designing-a-low-power-multi-sensor-node-series-24dk</link>
      <guid>https://forem.com/silverwarriorin/is-my-thermostat-lying-designing-a-low-power-multi-sensor-node-series-24dk</guid>
      <description>&lt;h1&gt;
  
  
  A Cruel Thermostat
&lt;/h1&gt;

&lt;p&gt;I'm sure many of you can relate to the lies that our thermostats push to us every day, 68 degrees my foot. Jokes aside, it's well established that the temperature across the room is not constant, with variation from the floor to ceiling, as well as local hot-spots near heat generating equipment or personnel. This creates a need for localized heat monitoring to track and log these hot-spots.&lt;/p&gt;

&lt;h1&gt;
  
  
  Where There's One There's Another
&lt;/h1&gt;

&lt;p&gt;Additionally, in spaces with large heat generation, specifically from additive manufacturing or soldering, there is a marked increase in VOC, NOx, and CO2 generating. This poses several risks to occupants, from CO2 accumulation, to long term health degradation from exposures to VOCs such as styrene. &lt;/p&gt;

&lt;h1&gt;
  
  
  Engineering a solution
&lt;/h1&gt;

&lt;p&gt;To track and monitor these quantities, I began work on a small air quality monitoring project. The first version began as a DHT11 connected to a raspberry pi pico. But after its untimely destruction, and with the accuracy of the DHT11 having much to be desired, I set out to create a new unit.&lt;/p&gt;

&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;p&gt;The system was designed with four primary constraints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No daughterboards (fully integrated design)&lt;/li&gt;
&lt;li&gt;High-accuracy sensors&lt;/li&gt;
&lt;li&gt;On-board power (battery operation)&lt;/li&gt;
&lt;li&gt;Compact footprint&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Version 1
&lt;/h1&gt;

&lt;p&gt;The first official version of my air quality sensor, dubbed the &lt;em&gt;Air Sentry&lt;/em&gt; was based off of the ESP32. Unfortunately, I did not include a USB interface on the PCB, which made programming and powering difficult. Apart from that small oversight, it was powered off of an internal battery, and could take 5 different measurements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Temperature via SHT45&lt;/li&gt;
&lt;li&gt;Humidity via SHT45&lt;/li&gt;
&lt;li&gt;CO2 via STCC4&lt;/li&gt;
&lt;li&gt;VOC Index via SGP41&lt;/li&gt;
&lt;li&gt;NOx Index via SGP41&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The primary motivator behind the ESP32 was fourfold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A large amount of computing power&lt;/li&gt;
&lt;li&gt;Ease of hardware integration&lt;/li&gt;
&lt;li&gt;Programming over the USB interface&lt;/li&gt;
&lt;li&gt;Relatively inexpensive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The ability to program over USB, rather than with a dedicated debugger gave me the ability to quickly program on the fly, rather than finding where I put the programmer. The ease of integration allowed me to focus on the design of the sensors, rather than the complex RF integration that BLE requires.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fartscqlzqsnff1qlty9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fartscqlzqsnff1qlty9s.png" alt="version1" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Numerous electrical issues primarily related to power regulation prevented reliable operation, leading to a rapid redesign.&lt;/p&gt;

&lt;h1&gt;
  
  
  Version 2
&lt;/h1&gt;

&lt;p&gt;Version 2 addressed the power delivery issues identified in the first design and improved overall board stability. It also included some LEDs but kept the same sensors. There were also numerous electrical fixes that were identified from the first version. Before I manufactured this board, however, I shifted towards a longer and less square layout requirement. This was to try turning it into a commercial product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6eotb8vhjdybp0qd0xkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6eotb8vhjdybp0qd0xkq.png" alt="version2" width="800" height="898"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Version 4
&lt;/h1&gt;

&lt;p&gt;Funny enough, I skipped version 3 accidentally, but nonetheless, version 4 was built with this new requirement. Again, based around the ESP32, it included a new BMP390 barometric pressure sensor, and removed most of the LEDS. This was the first version to be successfully constructed. And after some driver development with ESPHome, I had a fully functional sensor node to play around with. However, power management with ESPHome proved challenging. As the project shifted toward longer-term data collection, I needed the device to operate for at least a week on battery power, something the current architecture struggled to support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbiz4cjwejc1hepcj6jg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbiz4cjwejc1hepcj6jg1.png" alt="version4" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Version 5
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg0rx3v0fnmjz30t35so.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg0rx3v0fnmjz30t35so.png" alt="Version5" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Version 5 of the Air Sentry introduced the first major architectural redesign of the device since its inception. Thus, past version 5, the name officially changed to the Air Sentry &lt;em&gt;Neo&lt;/em&gt;. The Neo replaced the ESP32 with a nRF52810 MCU, and consolidated the battery charging and voltage regulation using the nPM1304 PMIC. The combination allows me to have full control over the power of the device, with a sleep current under 500 µA. This transition traded the simplicity of ESP32-based layout and integration for lower idle current and more granular control over power modes. The improved efficiency also enabled a smaller board footprint without introducing thermal drift issues in the temperature sensor. On the software side, the system transitioned to Zephyr RTOS, and initial bring-up was successful with reliable sensor readings.&lt;/p&gt;

&lt;p&gt;Unfortunately, there were issues with the clock generation, which led to a kernel panic when the BLE systems were turned on. This leads to the current state of the project: Version 6, which is focused on stabilizing the clock system and finalizing the design.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;What started as a simple attempt to verify a thermostat reading evolved into a full design of a low-power, multi-sensor environmental monitoring system.&lt;/p&gt;

&lt;p&gt;Across multiple iterations, the project highlighted several key lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power architecture is critical for battery-operated systems&lt;/li&gt;
&lt;li&gt;Rapid hardware iteration exposes design flaws early&lt;/li&gt;
&lt;li&gt;Platform choice (ESP32 vs nRF52) has a significant impact on power performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Version 5, the system reached a point of functional maturity, achieving reliable sensing and a substantial reduction in power consumption. However, challenges with clock stability and BLE integration remain.&lt;/p&gt;

&lt;p&gt;Version 6 is currently in development and is focused on resolving these timing issues and finalizing the design for long-term deployment.&lt;/p&gt;

&lt;p&gt;Ultimately, the goal is to use this system to generate and publish data on environmental conditions in additive manufacturing spaces—providing greater transparency into how these environments impact temperature and air quality.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>programming</category>
      <category>opensource</category>
      <category>design</category>
    </item>
    <item>
      <title>Designing some memory for the Z80 supercomputer</title>
      <dc:creator>Gabriel Womelsdorf</dc:creator>
      <pubDate>Wed, 18 May 2022 13:25:18 +0000</pubDate>
      <link>https://forem.com/silverwarriorin/designing-some-memory-for-the-z80-supercomputer-5a0f</link>
      <guid>https://forem.com/silverwarriorin/designing-some-memory-for-the-z80-supercomputer-5a0f</guid>
      <description>&lt;p&gt;I have heard the comparison of CPUs to brains, and while this is good for teaching the basics of computer operation, I tend to disagree with this analogy as you dive deeper into the computer hardware world. I disagree with this because a brain is made up of many parts, one of which is memory, which is a fundamental part of the operation of computer systems and biological organisms alike. That said today I am going to design a memory module for the Z80 supercomputer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is memory?
&lt;/h2&gt;

&lt;p&gt;Understanding exactly &lt;em&gt;what&lt;/em&gt; memory is and how it works is a fundamental part of designing computer systems. Think of memory in this case as the computers working memory, as well as its short term memory. We will use it to store variables, programs, results from computations as well any other storage that does not need to be stored after power down. &lt;/p&gt;

&lt;h2&gt;
  
  
  How much memory is enough?
&lt;/h2&gt;

&lt;p&gt;There is no definitive answer to this question, an iPhone with 1Mb of memory would not be very useful, but a Z80 with the same would be extremely overkill. In this case, due to the memory requirements of 1024 bit numbers, which take up a whole whopping 128 bytes of memory, or .128Kb I will have around 512Kb of working memory. Due note that only one 1024 bit number wouldn't be very useful, so in order to have 256 of them we would need 32Kb of RAM, still not 512Kb but that gives me a good amount of memory for future features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What kind of memory?
&lt;/h2&gt;

&lt;p&gt;There are many kinds of memory, from the magnetic core memory used in the Apollo Guidance computer, to the NOR and NAND flash memory in the USB stick. However when talking about volatile memory, the kind used in RAM sticks and modules, SRAM and DRAM rule supreme. DRAM is expensive and generally higher capacity, however SRAM is abundant, uses less circuitry and is less expensive in smaller chip capacities. Finding memory chips with a capacity of 512Kb is not difficult, but first we need to convert to Kbits in order to make our search easier, this is a fairly easy tasks by just multiplying Kbytes by 8 to get Kbits, 512 * 8 = 4096 or 4Mbits. Another important characteristic of memory is the organization, memory comes in many different forms in order to be compatible with many different processors, in this case we need a 512x8 chip, meaning it has 512 banks of 8 bit values. The IS61C5128AL-10TLI by ISSI fits these requirements perfectly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring the chip to a Z80
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data lines
&lt;/h3&gt;

&lt;p&gt;Wiring the data lines for this chip is fairly straight forward and we can follow the same general steps as the processor&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F565wjs3u3siqii2lscqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F565wjs3u3siqii2lscqz.png" alt="Data Lines" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Control Lines
&lt;/h3&gt;

&lt;p&gt;Next up are the control lines for the memory chip, in order to address the chip properly we need to use some logic to ensure the chip is only read from during a memory read, and not an IO read, same goes for writing to the chip. This can be accomplished with a simple OR gate, since the RD/WR lines as well as the MEMRQ lines are active low, as well as the RD/WR lines on the SRAM chip.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsyozfua0qivgy85xi50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsyozfua0qivgy85xi50.png" alt="Control Lines" width="800" height="806"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Address Lines 0-15
&lt;/h3&gt;

&lt;p&gt;Connecting these is also straightforward, its only lines 16-18 that are a tad complicated&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmqv7rp6ruslt9murc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmqv7rp6ruslt9murc4.png" alt="First Address Lines" width="800" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Address Lines 16-18
&lt;/h3&gt;

&lt;p&gt;Now these lines are a bit more complicated because the Z80 only has 16 bits for address space, so we need to employ some tricks to expand this address space using a technique called bank switching. In order to do this we are going to use something called a D Latch in combination with some IO logic using something called a multiplexer. However that will be built in a separate module, however for now we can add the latches using a 74hc573&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85wfpee0si72ubat45c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85wfpee0si72ubat45c0.png" alt="Latches" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The ROM
&lt;/h3&gt;

&lt;p&gt;All computers need some sort of read only memory that executes immediately at startup, in this case I am going to use a 64Kbit or 8Kb, which may seem small but this can't be written to so it won't be used as RAM, for this I am going to use the at28hc64bf, This can be wired in the same way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsq9ca8vx5n7fpqnlhfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsq9ca8vx5n7fpqnlhfc.png" alt=" " width="800" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The #CS pin
&lt;/h3&gt;

&lt;p&gt;This pin is used in order to select the memory chips we are accessing, because this chip shares memory space with the ram chip, we effectively need to disable the RAM chip when in the ROMS address space, which can be done with a ton of OR gates. And an inverter.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepygx9iq0y49ij1393dh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepygx9iq0y49ij1393dh.png" alt=" " width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Placing and routing
&lt;/h3&gt;

&lt;p&gt;This is the same process as last time, here is the result after using an autorouter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3op6gegv22y91ltnmkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3op6gegv22y91ltnmkh.png" alt=" " width="800" height="1128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's next
&lt;/h3&gt;

&lt;p&gt;There are many more boards to design, including control boards, expansion modules such as an enhanced ALU, output boards and all sorts of other boards, but I think next I will design the output board, since many of the expansion boards need to be designed before the control boards.&lt;/p&gt;

</description>
      <category>supercomputing</category>
      <category>programming</category>
      <category>hardware</category>
      <category>retro</category>
    </item>
    <item>
      <title>Designing an 8-bit supercomputer</title>
      <dc:creator>Gabriel Womelsdorf</dc:creator>
      <pubDate>Fri, 13 May 2022 19:16:12 +0000</pubDate>
      <link>https://forem.com/silverwarriorin/designing-an-8-bit-supercomputer-5hbm</link>
      <guid>https://forem.com/silverwarriorin/designing-an-8-bit-supercomputer-5hbm</guid>
      <description>&lt;p&gt;In this short series I will be designing one of the first Z80 based supercomputers, in order to accomplish this we need to make useful modules for the multiple Z80 processors to use, this will include external APUs that can handle the large floating point numbers that the machine will be able to compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Z80 Compute Modules
&lt;/h2&gt;

&lt;p&gt;In order for this machine to have any usable modules first we need to build some Z80 processor cards, this can easily be accomplished with a few small boards.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Z80
&lt;/h3&gt;

&lt;p&gt;The Z80 is an 8-bit processor with 16 bits of address space, there are a multitude of control and status lines as well that need to be controlled in order for the processor to run properly, first of which are the power (+5V) and ground (GND) connections, which supply power to the Z80, the +5V line should also have a decoupling capacitor to ground with a 100nF value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbll1u05n3ix70gm88hh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbll1u05n3ix70gm88hh.png" alt="Z80 with the power connected" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next are the control signals, ordinarily you would tie the majority of these to ground with a resistor, however in this case they will be needed later down the design process in order to control and monitor certain aspects of the running system, as such we will tie them to ground with an external input for control using a D Type latch. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fincxm9t952u8dk8tghur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fincxm9t952u8dk8tghur.png" alt="Z80 with IO sorted" width="800" height="828"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a lot going on here, but basically I am attaching these pins to a latch so external circuitry can control them.&lt;/p&gt;

&lt;p&gt;The final pieces of the puzzle for now are the data lines and address lines as well as a few other outputs and inputs, these will be used in tandem with the BUSREQ control line in order for the processors to access the memory and peripherals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvllqplcxpland1t08fe7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvllqplcxpland1t08fe7.png" alt="All hooked up" width="800" height="787"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this being the final schematic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Routing the traces
&lt;/h3&gt;

&lt;p&gt;Routing PCB traces is a massive pain, so I am going to use an autorouter to do the job for me, more specifically a tool called FreeRouting&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/freerouting" rel="noopener noreferrer"&gt;
        freerouting
      &lt;/a&gt; / &lt;a href="https://github.com/freerouting/freerouting" rel="noopener noreferrer"&gt;
        freerouting
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Advanced PCB auto-router
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/freerouting/freerouting/master/assets/social_preview/freerouting_social_preview_1280x960_v2.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffreerouting%2Ffreerouting%2Fmaster%2Fassets%2Fsocial_preview%2Ffreerouting_social_preview_1280x960_v2.png" alt="Freerouting" title="Freerouting"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Freerouting&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h5 class="heading-element"&gt;Freerouting is an advanced autorouter for all PCB programs that support the standard Specctra or Electra DSN interface.&lt;/h5&gt;
&lt;/div&gt;

&lt;p&gt;
    &lt;a href="https://github.com/freerouting/freerouting/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/602706fe29c939f95f586f087af7c72e9da6b4f91a1555df93d800ab893a8efc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f66726565726f7574696e672f66726565726f7574696e67" alt="Release version"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8c09d41127752cf59213948920b6b903422f9319d74d1afeeb9f01308133b346/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f66726565726f7574696e672f66726565726f7574696e672f746f74616c"&gt;&lt;img src="https://camo.githubusercontent.com/8c09d41127752cf59213948920b6b903422f9319d74d1afeeb9f01308133b346/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f66726565726f7574696e672f66726565726f7574696e672f746f74616c" alt="Downloads"&gt;&lt;/a&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/81d5ad8c9816bd0216a79c9cb01c42bb6a11d820b2f326b88adfd39e06ba8d40/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f66726565726f7574696e672f66726565726f7574696e672f76322e312e302f746f74616c"&gt;&lt;img src="https://camo.githubusercontent.com/81d5ad8c9816bd0216a79c9cb01c42bb6a11d820b2f326b88adfd39e06ba8d40/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f66726565726f7574696e672f66726565726f7574696e672f76322e312e302f746f74616c" alt="Downloads"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/freerouting/freerouting/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f132ce63ae29d67a66edf1691952ae67ac331b9b8a79004348971a97ded6b6e4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f66726565726f7574696e672f66726565726f7574696e67" alt="License"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/freerouting/freerouting/blob/master/docs/code_of_conduct.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4ae39ae593b602cf0ae07972b61c73728b77ec8e2cf40f579a2441948208036b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e7472696275746f72253230436f76656e616e742d322e312d3462616161612e737667" alt="Contributor Covenant"&gt;&lt;/a&gt;
&lt;/p&gt;



&lt;p&gt;&lt;a href="https://github.com/freerouting/freerouting/releases" rel="noopener noreferrer"&gt;&lt;strong&gt;Download installers for Windows, Linux, and macOS here.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Freerouting is a powerful PCB autorouter compatible with any PCB design software that supports the standard Specctra or Electra DSN interface. It imports &lt;code&gt;.dsn&lt;/code&gt; files generated by the host system's Specctra interface and exports &lt;code&gt;.ses&lt;/code&gt; Specctra session files.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You can interact with Freerouting using the Graphical User Interface (&lt;a href="https://github.com/freerouting/freerouting#graphical-user-interface-gui" rel="noopener noreferrer"&gt;GUI&lt;/a&gt;), the Command Line Interface (&lt;a href="https://github.com/freerouting/freerouting#command-line-interface-cli" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;), or the Freerouting &lt;a href="https://github.com/freerouting/freerouting#freerouting-api" rel="noopener noreferrer"&gt;API&lt;/a&gt;. All interfaces support command-line arguments to set input/output files or modify settings.&lt;/p&gt;

&lt;p&gt;Integrations are available with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kicad.org/" rel="nofollow noopener noreferrer"&gt;KiCad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eagle.autodesk.com/" rel="nofollow noopener noreferrer"&gt;Autodesk EAGLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ibfriedrich.com/en/index.html" rel="nofollow noopener noreferrer"&gt;Target3001!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.easyeda.com/" rel="nofollow noopener noreferrer"&gt;EasyEDA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tscircuit.com/" rel="nofollow noopener noreferrer"&gt;tscircuit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pcb-rnd.com/" rel="nofollow noopener noreferrer"&gt;pcb-rnd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/freerouting/freerouting/docs/integrations.md" rel="noopener noreferrer"&gt;Click here for more details&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Graphical User Interface (GUI)&lt;/h3&gt;

&lt;/div&gt;


&lt;ol&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Launch Freerouting&lt;/strong&gt;: Upon launching, you'll see the main interface
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/910321/383555681-4086cd74-313e-4d17-8e25-5e006497e566.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzU3NzY1MzQsIm5iZiI6MTc3NTc3NjIzNCwicGF0aCI6Ii85MTAzMjEvMzgzNTU1NjgxLTQwODZjZDc0LTMxM2UtNGQxNy04ZTI1LTVlMDA2NDk3ZTU2Ni5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNDA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDQwOVQyMzEwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jNDdjYzI5N2EyOWY4NTFhODJjMTQ1YTYyNjM2MGMxMDU4M2E0MjU2OGVkMjZmNmJkYzU3MzBhYTllMzcwNWEyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.OsqltJ8bpaWnNWbYmGpGbuGdgWT_Jjcnub0f7NF2gSo"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F910321%2F383555681-4086cd74-313e-4d17-8e25-5e006497e566.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzU3NzY1MzQsIm5iZiI6MTc3NTc3NjIzNCwicGF0aCI6Ii85MTAzMjEvMzgzNTU1NjgxLTQwODZjZDc0LTMxM2UtNGQxNy04ZTI1LTVlMDA2NDk3ZTU2Ni5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNDA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDQwOVQyMzEwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jNDdjYzI5N2EyOWY4NTFhODJjMTQ1YTYyNjM2MGMxMDU4M2E0MjU2OGVkMjZmNmJkYzU3MzBhYTllMzcwNWEyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.OsqltJ8bpaWnNWbYmGpGbuGdgWT_Jjcnub0f7NF2gSo" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open Your Design&lt;/strong&gt;: Go to &lt;code&gt;File&lt;/code&gt; &amp;gt; &lt;code&gt;Open...&lt;/code&gt; and select your &lt;code&gt;.dsn&lt;/code&gt; input…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/freerouting/freerouting" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Prior to routing:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5lkp8k7p1d52ett6zfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5lkp8k7p1d52ett6zfg.png" alt="Prior to routing" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After reorganizing:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz5fakwfxexx4plucu1d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz5fakwfxexx4plucu1d.png" alt=" " width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After routing:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kr2m3cbtepmm5wxq3e3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kr2m3cbtepmm5wxq3e3.png" alt=" " width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3D Render:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv83zbpbesgv7rik1a854.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv83zbpbesgv7rik1a854.png" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next Up: Memory Modules&lt;/p&gt;

</description>
      <category>retro</category>
      <category>z80</category>
      <category>hardware</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
