About Archive Tags RSS Feed


Having fun with CP/M on a Z80 single-board computer.

17 April 2021 14:00

In the past, I've talked about building a Z80-based computer. I made some progress towards that goal, in the sense that I took the initial (trivial steps) towards making something:

  • I built a clock-circuit.
  • I wired up a Z80 processor to the clock.
  • I got the thing running an endless stream of NOP instructions.
    • No RAM/ROM connected, tying all the bus-lines low, meaning every attempted memory-read returned 0x00 which is the Z80 NOP instruction.

But then I stalled, repeatedly, at designing an interface to RAM and ROM, so that it could actually do something useful. Over the lockdown I've been in two minds about getting sucked back down the rabbit-hole, so I compromised. I did a bit of searching on tindie, and similar places, and figured I'd buy a Z80-based single board computer. My requirements were minimal:

  • It must run CP/M.
  • The source-code to "everything" must be available.
  • I want it to run standalone, and connect to a host via a serial-port.

With those goals there were a bunch of boards to choose from, rc2014 is the standard choice - a well engineered system which uses a common backplane and lets you build mini-boards to add functionality. So first you build the CPU-card, then the RAM card, then the flash-disk card, etc. Over-engineered in one sense, extensible in another. (There are some single-board variants to cut down on soldering overhead, at a cost of less flexibility.)

After a while I came across https://8bitstack.co.uk/, which describes a simple board called the the Z80 playground.

The advantage of this design is that it loads code from a USB stick, making it easy to transfer files to/from it, without the need for a compact flash card, or similar. The downside is that the system has only 64K RAM, meaning it cannot run CP/M 3, only 2.2. (CP/M 3.x requires more RAM, and a banking/paging system setup to swap between pages.)

When the system boots it loads code from an EEPROM, which then fetches the CP/M files from the USB-stick, copies them into RAM and executes them. The memory map can be split so you either have ROM & RAM, or you have just RAM (after the boot the ROM will be switched off). To change the initial stuff you need to reprogram the EEPROM, after that it's just a matter of adding binaries to the stick or transferring them over the serial port.

In only a couple of hours I got the basic stuff working as well as I needed:

  • A z80-assembler on my Linux desktop to build simple binaries.
  • An installation of Turbo Pascal 3.00A on the system itself.
  • An installation of FORTH on the system itself.
    • Which is nice.
  • A couple of simple games compiled from Pascal
    • Snake, Tetris, etc.
  • The Zork trilogy installed, along with Hitchhikers guide.

I had some fun with a CP/M emulator to get my hand back in things before the board arrived, and using that I tested my first "real" assembly language program (cls to clear the screen), as well as got the hang of using the wordstar keyboard shortcuts as used within the turbo pascal environment.

I have some plans for development:

  • Add command-line history (page-up/page-down) for the CP/M command-processor.
  • Add paging to TYPE, and allow terminating with Q.

Nothing major, but fun changes that won't be too difficult to implement.

Since CP/M 2.x has no concept of sub-directories you end up using drives for everything, I implemented a "search-path" so that when you type "FOO" it will attempt to run "A:FOO.COM" if there is no file matching on the current-drive. That's a nicer user-experience at all.

I also wrote some Z80-assembly code to search all drives for an executable, if not found in current drive and not already qualified. Remember CP/M doesn't have a concept of sub-directories) that's actually pretty useful:


I've also written some other trivial assembly language tools, which was surprisingly relaxing. Especially once I got back into the zen mode of optimizing for size.

I forked the upstream repository, mostly to tidy up the contents, rather than because I want to go into my own direction. I'll keep the contents in sync, because there's no point splitting a community even further - I guess there are fewer than 100 of these boards in the wild, probably far far fewer!



Comments on this entry

icon Peter Ehlert at 17:49 on 17 April 2021

Fascinating! My first personal computer at work was a Morrow Designs desktop CPM based machine. We used Basic programs for Land Surveying and Civil Engineering. Shortly later I bought my own for home use, but it was a Morrow Designs "luggable" with a tiny amber display and dual floppies. It was similar to the Osborn 1. It was very challenging.

Enjoy your adventures

icon Steve Kemp at 19:41 on 17 April 2021

Thanks for sharing!

I got started on the ZX Spectrum 48k machine, back in the 80s, where I did a fair bit of assembly-language stuff. But I didn't really ever use CP/M back then, apart from toying with systems belonging to other people.

icon Adam Kruszewski at 11:14 on 19 April 2021

Great article and thanks for the pointer to 8bitstack!

I didn't had a frequent access to CP/M machine, had original Sinclair 48k spectrum and later on Portuguese clone Timex 2048 (still have it and it is operational) but from time to time was able to work or rather learn on a Polish ZX Spectrum clone called Elwro 800 Junior which came with CP/M and I remember it as a real magical time.

Have a great day!

icon Pete Foster at 15:49 on 21 April 2021

Hey Steve

Been a long time.

I fell down this rabbit hole a little while ago. It was fun, and I had plans. As usual, real life got in the way. :(

I designed a CPU/RAM/ROM board with a 40 pin bus for expandability, including banked RAM. The boards were designed with a standard form factor so that expansion boards could be stacked. There's some photos that give the idea on the Twitter profile that was created for the project (https://twitter.com/z80kit).

I also made an STM32 based board that emulated the ROM. You could plug it into the ROM socket and update the "ROM" in realtime over serial. Of course, it could also be used as RAM, meaning you could examine/change memory content without the Z80 being aware.

I still have everything, and still may pick up the project again some time in the future.

Stay safe!

icon Pete Foster at 15:50 on 21 April 2021


17 May 2021???

icon Steve Kemp at 17:29 on 26 April 2021

Nice to see you Pete! Looks like I messed up on the date, but fixed now.

And yeah, life getting in the way was exactly the reason why I never got round to completing my own design. But I think there's no shame in that, there are enough single-board computers out there - I can enjoy the software and leave the hardware to other people.