My RC2014 - Z80 Homebrew Computers

RC2014 logo

Introduction - RC2014 Pro

This page describes my experience with RC2014external link 8-bit computer, based on famous Zilogexternal link Z80 processor.

Delivered

I ordered RC2014 Pro kit on Tindie external link and received bunch of PCB's and components ...

Assembling

... then I spent two afternoons and nights with soldering. Everything is perfectly documented and if you do assembling and soldering closely it works without any troubleshoting.

Assembling

RC2014 Pro consist from 7 boards:

Aditional modules

Digital I/O board

There is 'must have' module: Digital I/Oexternal link board, that contains 8 buttons and 8 LED's. It's perfect for learning basic I/O operations.

Z80 PIO, Z80 CTC

I have four SC103external link Z80 PIO modules and one SC102external link with Z80 CTC from Small Computer Centralexternal link.

PIO's are connected to LED's using ULN2803A Darlingtons. It's perfect for learning how shift and rotation instructions worksexternal link.

I wrote the program that periodically fires interrupts from Z80 CTC. This program fires two independent interrupt routines - from channels #0 🡺 #1 and #2 🡺 #3. Those routines use RRCexternal link / RLCexternal link / RRexternal link / RLexternal link instructions to make rotation effectsexternal link. For correct function is necessary to connect IEO signal (pin #7) on SIO/2 module to bus pin #38 and put jumper on CTC board that connect this line to IEI pin on CTC. This establishes Interrupt Daisy-Chainexternal link (page #9).

Z80 SIO/2

I moved official SIO/2 module to another computer and built SC104external link Z80 SIO module.

SC104 – Z80 SIO/2 module

WiFi module

Another interesting toy is WiFi moduleexternal link. It's connected to channel B of SIO/2 module through enhanced bus. It allows connect to second channel remotely using Telnet session.

This videoexternal link shows controlling two power relays over WiFi using JAVA Telnet client. Here is my program that's testing buttons on I/O board and sends commands to SIO channel B, which is connected to WiFi module. On another PC is running Java telnet client, that's receiving those commands and switching ON/OFF my two power relays in my IOT solution. Also is possible read IOT sensors values and display it back on RC2014 console.

IOT sensors values

Z80 DMA

I built Z80 DMA module on Prototype PCBexternal link.

Z80 Direct Memory Access

For testing DMA I wrote program that sends programming sequence to Write Registers and starts memory-to-memory transfer.

I have also tested memory-to-I/O transfer by sending ASCII arts from DMA 🡺 SIO/2 🡺 WiFi modules to remote telnet session. Video hereexternal link.

SC108 – Z80 CPU, ROM and RAM module

When I used up all the BackPlane Pro slots, I decided to buy SC108external link module. I removed original CPU, ROM and RAM modules and gained two free slots.

SC108 – Z80 CPU ROM, and RAM module

ROM on this board contains Small Computer Monitor which is able to load CP/M from standard RC2014 Compact Flash module. Then ROM is paged out and 64kB RAM is used. BTW this module has 128kB RAM, but second 64kB bank not easy to use. Only one software that I know to do it is te editorexternal link, modified by Ladislau Szilagyi.

There is 74HCT74 dual flip-flop on this board (on 0x38H). First half is used to page IN/OUT ROM. Second one is used for switching between RAM banks. I have added two LEDs on unused output #8, so I can see which bank is selected.

Running CP/M 2.2

I use PuTTYexternal link for connecting to CP/M terminal. On images you can see session setting.

MBASIC

On this archiveexternal link is possible to download Microsoft BASIC Interpreter v5.21 for CP/M. To load any COM file is necessary use Binary to CP/M Packageexternal link. It converts MBASIC.COM file to text and then it's possible to paste it to PuTTY terminal (by mouse Right-click over window) and store file to CP/M disc using download.com command.

Developing software in assembler

For developing software for RC2014 I use different ways - I've tried four assemblers:

Editing ASM, AS and C sources

For editing sources I use Notepad++external link on PC or ZDE 1.6 editorexternal link on CP/M.

Developing

Another good editor is teexternal link.

te editor

TASM Development environment

In source directory I have following files:

Compiling: I run script like this: tasm -t80 -b hello.asm ./BIN/hello.com ./LST/hello.lst. If everything is OK, I can see result and compiled file is in BIN directory:

Compiling

ZAS Development environment

Transfering files from PC to RC2014

To store binary files (*.COM created by TASM or ZAS on emulator) to RC2014 using terminal, it needs convert it to text like this:

Converting

Open packaged file. You can see, that text contains three parts:

I usually modify first line like A:DOWNLOAD.COM X:filename.ext (where X: is a target drive), copy file to clipboard (^A ^C) and then make right mouse click on PuTTY terminal. DOWNLOAD.COM get file content from terminal and stores it to destination disc. It's work like a charm.

Z80 Simulator IDE

Z80 Simulator IDEexternal link is not directly related to RC2014, but it's useful software to learn Z80 assembler in Windows environment. It contains emulator, assembler, disassembler and debugger for the Zilog Z80 CPU, BASIC compiler and many more features.

HI-TECH C Compiler 3.09 for CP/M

On this pageexternal link is info about C compiler for CP/M.

Building and running AES-256 demo

In subdirectory examples/aes256 there is very interesting demo. I compiled it by following command:

I:c -V H:demo.c H:aes256.c

And here is screenshot that shows torturing Z80 CPU with this demanding computation:

Running AES256 demo
Sending file to remote PC

HI-TECH C Compiler 3.09 with emulator

On this GIT repositoryexternal link is HI-TECH-C-V3.09 with CP/M emulator. So it's easy to compile C sources on PC and then run COM's on emulator. As usually I use Windows packagerexternal link by Grant Searle to move COM's to my RC2014.

Compiling C source on PC

Using inline assembler in C sources

I have simple C source that mix assembler code using #asm and #endasm compiler directives.

It can be compiled on PC using emulator like cpm_orig c -V hello.c, but can't be run, because there are OUT instructions - unsuported by emulator.

On native CP/M (like on RC2014) it can be compiled and it runsexternal link without problems: I:c -V H:hello.c.

Borland Turbo Pascal

On this archiveexternal link is possible download Borland Turbo Pascal 3.01a external link for CP/M-80. Installation is same as MBASIC, I used FilePackage and modified text file to have pascal in drive P:.

Turbo editor

Borland Turbo Modula

On this archiveexternal link is possible download Borland Turbo Modula-2external link for CP/M-80. Installation is same as MBASIC, I used FilePackage and modified text file to have modula in drive M:.

Turbo Modula-2

Digital Research PL/I Compiler for CP/M-80

On this page is possible download PL/I Compilerexternal link for CP/M-80. PL/Iexternal link is a programming language oriented towards scientific and business programming. Digital Research provided implementations for their CP/M operating system as well as MS-DOS.

PL/I

This PL/I program computes the largest of three numbers:

/**********************************************/
/* This program computes the largest of three */
/* FLOAT BINARY numbers x, y, and z.          */
/**********************************************/

test:
	procedure options(main);
	declare
		(a,b,c) float binary;

	put list ('Type Three Numbers:');
	get list (a,b,c);
	put list ('The Largest Value is',max3(a,b,c));

/* this procedure computes the largest of x, y, and z */
max3: procedure(x,y,z) returns(float binary);

	declare
		(x,y,z,max) float binary;

	if x > y then
		if x > z then
			max = x;
		else
			max = z;
	else
		if y > z then
			max = y;
		else
			max = z;
	return(max);
end max3;

end test;
		

To build LARG3NUM.PLI use following approach:

I you are familiar with C language, good start point to learn PL/I is this pageexternal link.

MicroPro office software

Company MicroProexternal link created office packageexternal link with text editor WordStarexternal link , spreadsheet CalcStar and another applications: DataStar, ReportStar, InfoStar, SuperSort etc.

WordStar + CalcStar

When running with TerraTerm WordStar 4.0 have nice highlighted menu. Unfortunately CalcStar 1.45 not have it.

Games

On this pageexternal link is possible to download games for CP/M. For CatChum (like "Pac-Man") it's necessary to slow down CPU speed to not be eaten in one second.

Playing Catchum game

RTM/Z80 - Retro Tiny Multitasking system for Z80

On this pageexternal link is announced RTM/Z80 - a multitasking kernel, built for Z80. Here I have collected some notes about getting it to work.

Z80-SIM

For build RTM/Z80 is necessary to install Z80-SIMexternal link.

Preparing Z80-SIM on Linux (Debian 10.4 in my case): Download z80pack-1.37.tgz and extract in your home directory. Follow instructions on chapter "Quickstart to run the Digital Research OS's". I doing this as root. Then:

cd z80pack-1.37/cpmsim/

In cpmsim directory:

ln disks/library/hd-tools.dsk disks/drivei.cpm
cpmls -f z80pack-hd disks/drivei.cpm
mkdskimg i
mkdskimg j
./cpm2

Note: Make cpm2 eXecutable before to try run it. If everything is OK, Z80-SIM is started and you can see CP/M console.

Running z80pack

On CP/M shell explore drives:

A>dir
A>dir B
A>dir I
A>dir J

Use A:bye command to exit CP/M emulator.

Cpmtools 2.21

This package allows to access CP/M file systems and transer files between Linux filesystem and CP/M drives.

Download cpmtools-2.21.tar.gzexternal link. and extract it in your Linux home directory to cpmtools-2.21 and folllow instrunctions in INSTALL. I doing this as root. Read thisexternal link to understand, how it works. Linux CP/M tools manpages for commands important for as:

Note: CP/M emulator doesn't like, when disc content is changed outside. So before using Cpmtools commands, use A:bye command to exit CP/M emulator and after doing Cpmtools work, use ./cpm2 to run it again.

Building and running an RTM/Z80 application on CP/M

Follow instructions in chapter Building and running an RTM/Z80 application on CP/M in RTM-Z80 User manual. I use drive J: for build things for CP/M emulated on Z80-SIM.

	DEBUG	equ 0	;1=debug mode ON: verify task SP, task TCB, dealloc, lists, etc.
	SIM	equ 1	;1=Runs under Z80SIM, 0=Runs on RC2014(SC108+SC110)
	DIG_IO	equ 0	;1=RC2014 Digital I/O module is used
	CMD	equ 0	;1=CON CMD task is included
	RSTS	equ 0	;1=use RST for list routines (not for SIM)
	WATSON	equ 0	;1=Watson is used (not for SIM)
	C_LANG	equ 1	;1=Support for C language API
	IO_COMM	equ 1	;1=Support for async communications I/O
	SC108	equ 0	;1=SC108 is used (32KB ROM, 128KB RAM)
	MM	equ 0	;1=Memory Module is used (32KB ROM, 128KB RAM)
	M512	equ 0	;1=512KB ROM & RAM module is used (512KB ROM, 512KB RAM)
	BDOS	equ 1	;1=BDOS disk file support
	LPT	equ 0	;1=Parallel Printer (Compatibility mode)
	DYNM512	equ 0	;1=Extended dynamic memory support for M512 (set-it to 0 if M512=0)

Then copy (On Linux) content of [homedir]/z80pack-1.37/cpmsim/RTM-Z80_CPM + HTC309 to CP/M drive J:

cpmrm -f z80pack-hd ./disks/drivej.dsk *.* 

# Copy HiTech C compiler 3.0.9 to J:
cpmcp -f z80pack-hd ./disks/drivej.dsk HTC309/*.COM 0:
cpmcp -f z80pack-hd ./disks/drivej.dsk HTC309/*.OBJ 0:
cpmcp -f z80pack-hd ./disks/drivej.dsk HTC309/*.LIB 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk HTC309/*.H 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk HTC309/OPTIONS 0:

# Copy RTM-Z80 to J:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.sub 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.as 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.h 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.c 0:
cpmcp -t -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.mac 0:
cpmcp -f z80pack-hd ./disks/drivej.dsk RTM-Z80_CPM/*.hex 0:

On CP/M shell:

J>A:pip J:=A:xsub.com
J>A:submit make
J>A:submit makelib

J>c -iJ0: -o rtmdemo.c rand.as rt.lib
Compile demo
J>rtmdemo
Compile demo

Running an RTM/Z80 applications on RC2014

Follow instructions in chapter Running an RTM/Z80 application on RC2014 in RTM-Z80 User manual. I use drive I: for build things for RC2014 Pro with SC108 + SC102 + SIO/2. RTM/Z80 uses CTC channel #2. Recomended board is SC110external link – Z80 Serial+CTC board. Because I use dedicated CTC (SC102) board, jumper on it must be set to feed ch. #2 from xtal Oscillator 7.3728 MHz. Also note that Interrupt-daisy-chain must be established between SIO/2 and CTC as described above.

	DEBUG		equ 0	;1=debug mode ON: verify task SP, task TCB, dealloc, lists, etc.
	SIM		equ 0	;1=Runs under Z80SIM, 0=Runs on RC2014(SC108+SC110)
	DIG_IO		equ 1	;1=RC2014 Digital I/O module is used
	CMD		equ 0	;1=CON CMD task is included
	RSTS		equ 1	;1=use RST for list routines (not for SIM)
	WATSON		equ 0	;1=Watson is used (not for SIM)
	C_LANG		equ 1	;1=Support for C language API
	IO_COMM		equ 1	;1=Support for async communications I/O
	SC108		equ 1	;1=SC108 is used (32KB ROM, 128KB RAM)
	MM		equ 0	;1=Memory Module is used, 0=SC108 is used
	BDOS		equ 1	;1=BDOS disk file support
	LPT		equ 0	;1=Parallel Printer (Compatibility mode) (not for SIM)
	;
	;	ROM/RAM options (only if SIM=0)
	;
	RAM128K		equ 1	;0=only 64K RAM, 1= 2 x 64K RAM available

Then copy (On Linux) content of [homedir]/z80pack-1.37/cpmsim/RTM-Z80_RC2014 + HTC309 to CP/M drive I:

cpmrm -f z80pack-hd ./disks/drivei.dsk *.* 

# Copy HiTech C compiler 3.0.9 to I:
cpmcp -f z80pack-hd ./disks/drivei.dsk HTC309/*.COM 0:
cpmcp -f z80pack-hd ./disks/drivei.dsk HTC309/*.OBJ 0:
cpmcp -f z80pack-hd ./disks/drivei.dsk HTC309/*.LIB 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk HTC309/*.H 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk HTC309/OPTIONS 0:

# Copy RTM-Z80 to I:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.sub 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.as 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.h 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.c 0:
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.mac 0:
cpmcp -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/*.hex 0:

On CP/M shell (run those commands one-by-one line, don't use copy/paste whole content):

I>A:pip I:=A:xsub.com
I>A:submit make
I>A:submit makelib

I have three scripts for building various demos, such as rtmdemo. On CP/M shell I run:

Compile demo

On Linux shell:

cpmcp -f z80pack-hd ./disks/drivei.dsk 0:HEXBOOT.HEX hexboot.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:RTMDEMO.HEX rtmdemo.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:MSORT.HEX msort.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:TESTXR.HEX testxr.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:TESTXS.HEX testxs.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:TBDOS.HEX tbdos.hex
cpmcp -f z80pack-hd ./disks/drivei.dsk 0:GETXFILE.HEX getxfile.hex

Then use WinSCP to copy hexboot.hex and some program, e.g. rtmdemo.hex to your local directory. Open hexboot.hex and copy content to clipboard. Then switch to Putty connected to RC2014 and reset SC108. Make right-mouse-click over terminal to send content of hexboot.hex to RC2014. Type *gE000 and when you can see Ready to read RTM/Z80 HEX file do this same with rtmdemo.hex. Type dot . to omit breakpoint and Y to run demoexternal link.

RTM/Z80

Local Windows and remote Linux directory structure. Note: when you use WinSCP to upload C, H, AS, MAC, SUB and other from Windows to Linux - be sure that you have set Transfer setting as Text for those types.

Running own RTM/Z80 application on RC2014

I created simple demo application. Four independent tasks drive external link four Z80 PIO's.

On Linux shell (when CP/M is logged out using A:bye):

cpmrm -f z80pack-hd ./disks/drivei.dsk TESTPIOS.*
cpmcp -t -f z80pack-hd ./disks/drivei.dsk RTM-Z80_RC2014/testpios.c 0:

On CP/M shell I run I>A:SUBMIT mymake4.

On Linux shell:

cpmcp -f z80pack-hd ./disks/drivei.dsk 0:TESTPIOS.HEX testpios.hex

Next steps are the same as rtmdemo.

RC2014-CPM, te editor and other stuff

Ladislau Szilagyi created very interesting project, RC2014-CPMexternal link. This CP/M version is able to use SC108external link or 512k ROM 512k RAMexternal link extended memory and some programs as HiTech C or te editor can use it.

I tried version for SC108 with RC2014 Pro. Here is some my experiences:

Conclusion

RC2014 is amazing project. I had a lot of fun while building it and exploring possibilities of retrocomputing. That brought me back 30 years to 8 bit era when I built my first computer.

RC2014 Pro fully boarded

Finished RC2014 Pro. There is: Clock + SC108 [CPU-RAM-ROM] + DMA + CF + SIO/2 + 4 x PIO + CTC + WiFi + I/O.

RC2014 Pro fully boarded

RC2014 - Little Brother

Later I decided to build second small one - on BackPlane-5external link + CPUexternal link + 512k ROM 512k RAMexternal link RomWBWexternal link + SIO/2external link + 2 x CFexternal link + Digital IOexternal link. CPU module is gained from RC2014 Pro, where is SC108 module now.

RC2014 Little Brother

512k ROM 512k RAM RomWBW Module

512k ROM 512k RAMexternal link has been designed to run RomWBW operating system on the RC2014 with a Z80 CPU. Due to the 64k of addressable memory limitation of the Z80, the memory in this module is divided up in to multiple 32k pages.

512k ROM 512k RAM RomWBW Module

With RomWBWexternal link you can boot ROM based CP/M-80 2.2, Z-System or run MONITOR, BASIC, FORTH, play game or run custom ROM content.

Using two Compact Flash modules with RomWBW

Using two Compact Flash modules is little bit tricky. 1st CF is addressed on 0x10. If you have 2nd CF, it must use address 0x20. I solved it by routing pin #11 of 74LS138 decoder to 2nd card, where decoder isn't soldered. Because my BackPlane-5 is full, I stacked 2nd CF to 1st one.

Since we have added a second IDE interface, we will need to activate this interface using a custom ROM build:

IDECNT		.SET	2		; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH
IDE1MODE	.SET	IDEMODE_RC	; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC]
IDE1BASE	.SET	$20		; IDE 1: IO BASE ADDRESS

With this change you can see this on startup screen:

IDE: IO=0x10 MODE=RC
IDE0: 8-BIT LBA BLOCKS=0x0001E900 SIZE=61MB
IDE1: NO MEDIA
IDE: IO=0x20 MODE=RC
IDE2: 8-BIT LBA BLOCKS=0x0001E900 SIZE=61MB
IDE3: NO MEDIA
PPIDE: IO=0x20 PPI NOT PRESENT

   A:=MD1:0
   B:=MD0:0
   C:=IDE0:0
   D:=IDE0:1
   E:=IDE0:2
   F:=IDE0:3
   G:=IDE2:0
   H:=IDE2:1
   I:=IDE2:2
   J:=IDE2:3

For accessing other drives, you need to use ASSIGN command:

ASSIGN K:=IDE0:4
ASSIGN L:=IDE0:5
ASSIGN M:=IDE0:6
ASSIGN N:=IDE0:7
ASSIGN O:=IDE2:4
ASSIGN P:=IDE2:5

Connecting to BBS

I use following approach to connect Wintermute BBS, which operates on rc2014.ddns.net:2014:

# define RS232_INVERTED 0 // l.v.: was 1
Configuration of WEMOS

Extending Little Bro

Now my RC2014 Little Brother is extended with second BackPlane-5. There is another Digital I/O module and Output module for LED matrix.

8x8 LED matrixes with MAX7219

I have ported Arduino MaxMatrix libraryexternal link for driving 8x8 LED matrixesexternal link with MAX7219 to HI-TECH C Compiler syntax. Driver board uses 74HCT374 - circuit is same as official I/O board. There are also four two-color LED's for easier debugging.

Conclusion

Now RC2014 Little Brother is ready to discover possibilites of 8-bits retrocomputing.

RC2014 Little Brother fully boarded
RC2014 UA logo

Ukraine Red Cross Fundraiser RC2014 Zed

My 3rd one is RC2014 Zed Fundraiser kit for Red Cross Ukraine.

RC2014 Zed

DS1302 RTC Module

On RC2014 Zed I have DS1302 Real Time Clock Moduleexternal link. It is based around the DS1302 chip and is supported using RomWBW.

Bubble Display Module

Another interesting module is 7 Segment Bubble LED Displayexternal link. You can play with it with some various programsexternal link in different languages.

I wrote FizzBuzz sampleexternal link. My another program utilizes both RTC and Bubble Display Modules to turn RC2014 to digital clockexternal link.

Original Zilog documents

Mario Blunks tutorial set

Ken Shirriff's blog

This blog contains interesting informations about Z80 CPU internals.

Learning algorithms

Other

My own things

Valid XHTML 1.0!