Kevin's Blog<p><strong>RC2040</strong></p><p>I’ve recently gotten hold of a <a href="https://rc2014.co.uk/" rel="nofollow noopener" target="_blank">RC2014 computer</a> and it’s great. Once I’ve gone beyond some of the basic tutorials online I might start posting something about it at some point, so watch this space.</p><p>But also, I stumbled across the RC2040 project and kit from Extreme Kits (<a href="https://extkits.co.uk/product/rc2040/" rel="nofollow noopener" target="_blank">https://extkits.co.uk/product/rc2040/</a>). Described as a “Retro emulated Z80 CP/M computer kit” it is basically a rc2014 emulated on a Raspberry Pi Pico. So I just had to get one to have a play with that too!</p><p>It comes as a PCB, acrylic baseplate and then a pile of components – mostly resistors, buttons, jumper. The PCB itself has the surface mount footprint for the Raspberry Pi Pico – and as it is essentially emulating a RC2014, hence the name RC2040.</p><p>These are my “notes to self” to remind me what I did to get up and running as the instructions are somewhat spread around and I felt assume a bit of knowledge of the RC2014 and the Z80 ecosystem that I don’t yet have.</p><p>Main resources and references:</p><ul><li>Product page: <a href="https://extkits.co.uk/product/rc2040/" rel="nofollow noopener" target="_blank">https://extkits.co.uk/product/rc2040/</a></li><li>Project page: <a href="https://www.extremeelectronics.co.uk/the-rc2040/" rel="nofollow noopener" target="_blank">https://www.extremeelectronics.co.uk/the-rc2040/</a></li><li>Getting started page: <a href="https://www.extremeelectronics.co.uk/the-rc2040-get-you-started/" rel="nofollow noopener" target="_blank">https://www.extremeelectronics.co.uk/the-rc2040-get-you-started/</a></li><li>GitHub repository: <a href="https://github.com/ExtremeElectronics/RC2040" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040</a><ul><li>Schematic: <a href="https://github.com/ExtremeElectronics/RC2040/blob/main/Circuit%20dagram/rc2040V2.pdf" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040/blob/main/Circuit%20dagram/rc2040V2.pdf</a></li><li>SD Card Contents: <a href="https://github.com/ExtremeElectronics/RC2040/tree/main/SD%20Card%20Contents" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040/tree/main/SD%20Card%20Contents</a></li><li>Latest Firmware Release: <a href="https://github.com/ExtremeElectronics/RC2040/releases" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040/releases</a></li></ul></li><li>Relevant RC2014 Resources:<ul><li>ROM “Factory”: <a href="https://github.com/RC2014Z80/RC2014/tree/master/ROMs/Factory" rel="nofollow noopener" target="_blank">https://github.com/RC2014Z80/RC2014/tree/master/ROMs/Factory</a></li><li>Boot ROM options: <a href="https://rc2014.co.uk/1716/basic-cp-m-romwbw-or-small-computer-monitor/" rel="nofollow noopener" target="_blank">https://rc2014.co.uk/1716/basic-cp-m-romwbw-or-small-computer-monitor/</a></li><li>Running CP/M: <a href="https://rc2014.co.uk/1458/simple-guide-to-getting-cpm-running-on-rc2014/" rel="nofollow noopener" target="_blank">https://rc2014.co.uk/1458/simple-guide-to-getting-cpm-running-on-rc2014/</a></li></ul></li><li>Additional resources:<ul><li>rc2040.ini settings: <a href="https://www.extremeelectronics.co.uk/more-rc2040-settings/" rel="nofollow noopener" target="_blank">https://www.extremeelectronics.co.uk/more-rc2040-settings/</a></li><li>Pico GPIO settings: <a href="https://github.com/ExtremeElectronics/RC2040/blob/main/GPIO%20settings.md" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040/blob/main/GPIO%20settings.md</a></li><li>Serial CPM tools: <a href="https://github.com/ExtremeElectronics/RC2040/blob/main/SerialCPMtools.md" rel="nofollow noopener" target="_blank">https://github.com/ExtremeElectronics/RC2040/blob/main/SerialCPMtools.md</a></li></ul></li></ul><p>This post has the main usage points, which are mostly in the getting started pages, but with a few extras I had to figure out on the way too.</p><p><strong>PCB Build Notes</strong></p><p>If you’re thinking about getting one of these kits, take particularly note of the <strong><em>warning about the micro SD card connector</em></strong>.</p><p>This has to be soldered on using surface mount 1mm pitch connectors and to say it is fiddly is putting it mildly! And you almost certainly won’t know if you’ve succeeded until everything else is together and you’re reading data from the card…</p><p>There is a note on the product page to ask for help prior to ordering if you want it done for you.</p><p>I just went slowly with it, fixing one of the larger grounding pads first and then using that to orient the other pins before soldering any of the others. Then it was checked thoroughly with a magnifying glass before continuing.</p><p>Other things to consider:</p><ul><li>I went with the suggestion of using a slider switch for the USB/UART selector rather than jumper headers. This is connected to GP13 and used by the firmware to decide where to direct the serial output – over USB or to the UART. The outer position means UART, and the position nearer the Pico means USB.</li><li>There is a speaker socket, which links to GP14, GP15 and GND directly with no additional circuitry.</li><li>There is a FTDI socket which is connected to GP0, GP1, 5V (VBUS) and GND. There is a solder jumper (JP2) on the underside of the board that is unconnected by default, that determines if 5V comes from FDTI or not.</li><li>There is also a solder jumper (JP1) to select 3V3 or 5V serial on the FTDI header. This is connected by default for 5V operation as it connects a 22K resistor from the header “TX” pin to GND, making a resistor divider with the 10K in series resistor. Note: TX on the header goes to the Pico RX Pin (GP1), and RX goes to TX (GP0).</li><li>Although it isn’t shown on the schematic (that I could spot) there is also a solder jumper (JP3) on the underside of the board “has switches”. This is connected by default and indicates that there are configuration switches on this board (see later).</li><li>It wasn’t immediately obvious (to me) which way round the LED went, but probing with a meter, the cathode is the pin nearest the edge of the board which connects via the 1K resistor to GND.</li></ul><p>With hindsight, I suspect it would have been more useful for me to have had switches instead of the A13, A14, A15 jumpers and a jumper for the USB/UART setting.</p><p><strong>Boot Configurations</strong></p><p>This is one area I was getting quite confused over… I think there is where knowledge of the RC2014 boot options and ROM sets would really help, but what I think is happening is as follows.</p><p>The ROM file provided is 24886009.bin. Each number represents a single bank of the ROM and consequently an address jumper setting. Following the key <a href="https://github.com/RC2014Z80/RC2014/tree/master/ROMs/Factory" rel="nofollow noopener" target="_blank">from here</a>, this decodes as:</p><ul><li>Bank 0 – 000 – 2 – Microsoft BASIC, for 32k RAM, SIO/2, with origin 0x0000</li><li>Bank 1 – 001 – 4 – Microsoft BASIC, for 56k RAM, SIO/2, with origin 0x0000</li><li>Bank 2+3 – 010 – 88 – Small Computer Monitor for pageable ROM, 64k RAM, SIO/2 or 68B50 ACIA, with Microsoft BASIC and CP/M boot options</li><li>Bank 4 – 100 – 6 – CP/M Monitor, for pageable ROM, 64k RAM, SIO/2, CF Module at 0x10, with origin at 0x0000</li><li>Bank 5 – 101 – 0 – Empty</li><li>Bank 6 – 110 – 0 – Empty</li><li>Bank 7 – 111 – 9 – Small Computer Monitor for any ROM, any RAM, any UART</li></ul><p>When the RC2040 is oriented with USB on the left and the address jumpers at the bottom right of the board, the order is inverted. For the A13-A14-A15 Jumper settings: “1” is the position nearest the Pico; “0” is the position nearest the edge of the board.</p><p>So, in A13-A14-A15 order the options are:</p><ul><li>000 – Bank 0: Boot into MS Basic</li><li>001 – Bank 4: Z80 SBC Boot ROM</li><li>010 – Bank 2+3: SC monitor</li></ul><p>The following go into a loop for me:</p><ul><li>100 – Bank 1: Repeated “>” in a loop</li><li>111 – Bank 7: Repeated “Read Fail” then drops into SC monitor</li></ul><p>As might be expected the remaining two options (101,011) do nothing.</p><p>MS Basic (000) is the same as the standard image for RC2014 that I had by default with my kit.</p><p>Booting into the SC monitor (010) works fine too. When selecting help (“?”) there are three options at the bottom to boot into BASIC, WBASIC (“warm start” BASIC) or CPM.</p><p>Booting into the CP/M monitor appears to offer some basic options (once the “press [space] to access console” message appears and space has been pressed), but apparently only the boot into CP/M will work.</p><p>It would seem that the most versatile option is to use the SC monitor (010) mode for now.</p><a href="https://emalliab.wordpress.com/wp-content/uploads/2025/04/image.png" rel="nofollow noopener" target="_blank"></a><p><strong>A side note on boot configuration</strong></p><p>There are a number of places in the emulator code where a choice is made between reading configuration switches and using a configuration from the rc2040.ini file on the SD Card.</p><p>There is a hardware indication of using switches. This is determined by the setting of GP22. In the board, this is tied to GND which means “this board has switches” (i.e. address jumpers). But it is tied to GND via a (connected) solder jumper which doesn’t appear to be on the schematic. This also determines if the USB/UART jumper is present.</p><p>There is also a config setting which can determined if the switches should be overridden by what is in the config file. This is the setting [ROM]\ovjump. If this is present and set to 1 then the A13-A14-A15 values are read from the rc2040.ini file rather than the A13-A14-A15 jumper settings.</p><p>In the readme file for the SD card contents, two rc2040.ini configurations are described. The actual rc2040.ini file present is the SIO2 configuration.</p><p><strong>Usage Notes</strong></p><p>When using USB serial, the board will pause until a serial link is established. This is pretty handy as when resetting the Pico I lose the connection in PuTTY, but on “Restart Session” the session is re-established and the Pico will then boot up.</p><p>The buttons do the following:</p><ul><li>Pico RESET. This is hard-wired to the Pico RUN pin so does a proper hardware reset of the Pico.</li><li>Z80 RESET. This is on GP7 and performs a “soft” reset, in that it performs an emulator Z80 reset.</li><li>BUT. On GP8. This is related to fast file transfers apparently (tbd).</li><li>DUMP. GP9. Dumps the RAM contents to the serial terminal and SD card.</li></ul><p>There is a good reference for additional useful rc2040.ini file settings here: <a href="https://www.extremeelectronics.co.uk/more-rc2040-settings/" rel="nofollow noopener" target="_blank">https://www.extremeelectronics.co.uk/more-rc2040-settings/</a></p><p>GP16,17,18,19,20,21,26,27 are broken out on an additional header and form the 8 bits of a single Z80 IO port. By default this is at PORT address 0 but that can be changed with the [PORT]\pioa rc2040.ini file option.</p><p><strong>Conclusion</strong></p><p>This will do for the time being. I think I now understand how this can boot into either BASIC or CP/M, so next is to do some reading about how to get different programmes running under CP/M.</p><p>Kevin</p><p><a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/basic/" target="_blank">#basic</a> <a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/cpm/" target="_blank">#cpm</a> <a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/raspberry-pi-pico/" target="_blank">#raspberryPiPico</a> <a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/rc2014/" target="_blank">#rc2014</a> <a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/rc2040/" target="_blank">#rc2040</a> <a rel="nofollow noopener" class="hashtag u-tag u-category" href="https://emalliab.wordpress.com/tag/z80/" target="_blank">#z80</a></p>