Sorted by Squirrels.

Sunday, 7 April 2013


What do you get when you cross an Arduino and a Z80? Well, one of these of course!

I've made a few shields lately and this has to be the meatiest. From L to R we have a venerable Z80. Next to that is a svelte 32KByte RAM. Continuing on we have the ubiquitous reset button and last - but definitely not least - a little CPLD. In this case it's a Xilinx XC9536XL.

The idea came about after some back-and-forth discussion with a friend about making a Z80 based trainer and what would be involved. The theme of AVRs came up and after a brief dalliance with the idea of putting an Arduino on the nascent Z80 board to act as a communication port it naturally flipped over and the concept of the Z80 shield was born.

The Arduino acts as clock source, CPLD programmer, bootstrap ROM and IO handler. The CPLD performs the fairly ordinary task of being a memory and IO controller. It also has a Dirty Little SecretTM.

The more observant may have noticed that the board is a little unusual as there's no ROM. And no, I didn't just forget it. It's not a problem. All you need to be able to do is get program and data into memory. The bootstrapping of the Z80's program therefore needs to be performed using a little hackery. Which is where the CPLD's DLS comes in.

Hold on - I can't keep referring to the CPLD as 'the CPLD'. That wouldn't be fair. When it arrived from the kindly Mr. Farnell's shoppe it was called 'the CPLD'. But once programmed then I'm sure you'll agree it has become something more than the sum of its parts. A custom chip no less. Amiga has Agnes, the 64 has Sid. If I'm to be true to the board then I must insist that from now on we refer to this fine chip as Alan, the name it chose. OK. Continue.

Alan can store and output a byte upon request. The Arduino can write and read this byte, as can the Z80. Aha! It's starting to come together! As Alan controls the Z80's access to memory then it's a simple matter of casually outputting the content of the latch onto the data bus at opportune moments, rather than the content of memory. Just assert a control line so Alan knows when you'd like this behaviour, and you can deliver instructions to the Z80 at your will. Construct your bootloader such that it doesn't need to read RAM or loop and you are, as some might say, golden.

Alan exposes a read-only copy of the Z80's RD line, which can be used to synchronise writes to the latch. The process goes like this:

Assert Z80s RESET line
Assert 'bootload' signal
Pre-warm the latch with the first byte of your bootstrap program
Release Z80s RESET line

Repeat until all bytes of bootstrap written:
  Wait for RD to go low  (z80 is reading an instruction, delivered from the latch)
  Wait for RD to go high  (z80 processing instruction)
  Write the next byte of the bootstrap program to the latch

De-assert 'bootload' signal
Reset Z80

From there you have a program stored in RAM which the Z80 happily executes ad infinitum, or until the PC powers down. Whichever is soonest.

The Z80 can instigate data exchange with the Arduino. This is achieved using IO requests. To avoid critical timing constraints I opted to use a cool feature of the Z80 - the ability to pause processing whilst an IO request completes. Alan notices when an IO request is in progress and asserts the Z80's WAIT line, which puts the processor into suspended animation until such time as the line is cleared. At this point normal service is resumes and processing continues as if nothing had happened. The WAIT line is exposed to the Arduino so it can detect when an IO is under way. Used in conjunction with the RD line it can be used to detect both IO writes (Z80 wants to send data to Arduino) and reads (Z80 wants data from Arduino).

Z80 IO read:
  IN instruction is detected by Alan
  WAIT is asserted
  Arduino detects the request & puts data byte into Alan's latch
  WAIT is released by arduino
  IO instruction completes, data from the latch is taken from the data bus

Z80 IO write:
  OUT instruction is detected by Alan, data from the bus is stored in the latch
  WAIT is asserted
  Arduino detects the request & reads the latch
  WAIT is released by arduino
  IO instruction completes

The project is still in its infancy, but is working to an encouraging level :D

All the materials needed to make one of these for yourself (Eagle files, Verilog code for the CPLD and Arduino sketches) will be available on google code very soon.

No comments:

Contact Form


Email *

Message *

This is how we do it

MMC (9) acorn atom (7) zx81 (7) arduino (5) multicart (4) sord m5 (4) Atari 800 (3) Sord (3) c128 (3) sd card (3) sd2iec (3) sio2sd (3) tatung einstein (3) 6502 (2) Chuckie egg (2) M5 (2) M5Multi (2) Max6956 (2) QL (2) RCM (2) assembler (2) avr (2) c64 (2) cadsoft eagle (2) eeprom (2) einSDein (2) mmbeeb (2) multi-cart (2) spi (2) system 80 (2) ufat2 (2) vic20 (2) video genie (2) 6502 second processor (1) 6522 (1) 8255 (1) Acorn BBC Micro (1) Apple 2e (1) Apple ][ 2 two (1) BBC 6502 second processor (1) BBC micro (1) DevicePrint (1) Double Choc Chip Muffins (1) FAT (1) IO (1) Jupiter Ace (1) LED (1) Master 128 (1) PCB (1) PIC (1) POV (1) PROGMEM (1) Pineapple (1) ST (1) Spectrum 128 (1) antex (1) arcade spinner (1) arduino shield (1) atari (1) atmel (1) bakewell tart (1) beer (1) bird's nest (1) bitbucket (1) brokenated XC special (1) cake (1) cassette (1) cassette interface (1) compact flash (1) convert (1) dac (1) de-yellowing (1) dev cart (1) eaca (1) efficient (1) einsdein. z80 (1) esp32 (1) esp8266 (1) eye strain (1) failosophy (1) filesystem (1) finally (1) fram (1) french polishing (1) fuse (1) fuses (1) gaming (1) github (1) glue (1) google chrome (1) heroic failure (1) high voltage programming (1) hot irons (1) if (1) jiffydos (1) joey beltram (1) lego robot (1) library (1) lying (1) machine code (1) matron (1) microcode (1) mmc interface (1) mmc2iec (1) mmm (1) mouse guts (1) oscilloscopes (1) pcm (1) pic32mx (1) porn (1) proto shield (1) purple (1) repo (1) retro computer museum (1) retro hard-on (1) rom box (1) sd (1) sd-x (1) sd2mmc (1) seadragon (1) silliness (1) small (1) software master (1) soldering (1) spi software master (1) stray capacitance (1) string (1) techadventure (1) test equipment porn (1) ts1000 (1) turtle cheesecake (1) tweaking (1) vc20 (1) video head (1) video ram replacement (1) weewee (1) wingasm (1) wire library (1) wodges of IO (1) xilinx cpld (1) yellowing (1) zx spectrum (1) zxpander (1)
Unless otherwise stated all of the original work presented here is:

Creative Commons License
Licensed under a Creative Commons Attribution-Noncommercial 2.5 Generic License.

The work of others where referenced will be attributed appropriately. If I've failed to do this please let me know.