I am writing a book about old computers. Oh, sorry: I mean "vintage computers" from the '80s. My primary goal is to show how one can build an 8-bit computer from scratch. This means: how to set up a CPU, how to connect memories, how to connect peripheral chips, and why to connect.
This computer is a "demo construction:" a computer, based on 8085 CPU, with 32kB of (EEP)ROM and 32kB of RAM, serial connection, and parallel ports. All should be as simple as possible. And here is a result.
It is simple. OMEN is an abbreviation (of course) of Czech expression "Osmibitový Mikropočítač pro Elektronické Nadšence," which means "an 8-bit Microcomputer for Electro Enthusiasts".
Of course - when I have connected the speaker and played a tune, the first tune I have implemented was... right, "The Omen" by Prodigy!
Hurry up the production and innovation cycle, become a patron...
Monitor v3 has four commands:
- D is for memory dump
- M is for memory change
- G is for Go
- : is for load a HEX file
- B invoke the TINY BASIC
- X sets the break point
- R shows/alters the registers after program break
- C is for continue after break
You can set desired values into registers by the R command, including the PC register, and then run program by the C command.
EEPROM contains TINY BASIC at address 1000h, so enter G1000 to start BASIC.
You can find all of the source codes and ready made images on GitHub.
- Support for undocumented 8085 instructions DSUB B, ARHL, RDEL, LDHI d8, LDSI d8, LHLX D, SHLX D, JNK a16, JK a16, RSTV
- Command R displays all flags of F register (SZKA3PVC). If flag is not set dash '-' is displayed.
- Added restart vector RST 8 (0040h) for possibility to handle RSTV call.
- Changed TRACE mode. After entering TRACE mode, instruction on actual PC and content of registers (if it is switched on) are displayed. Entering a space ' ' executes this instruction, and returns to the 'T>' prompt with the next instruction.
- Instructions LXI, DAD, INX, DCX displays argument 'SP' rather than 'S'.
- Commands that requires 1 byte parameter raises error if entered value not fit to 1 byte.
- Command 'C' checks overlap of source and destination block and for copying uses appropriate direction.
- Command 'F' checks <start> and <end> parameters and raises error, if <end> is lower than <start>.
- Added command 'H' to send out memory content in Intel HEX format.
- Sending of LF and CR characters were reversed and are sent in the usual order - CR first and followed by LF.
As easy, just write a program in assembly language, compile it to the HEX and copy/paste to serial monitor. Then use G command (as GO) to run.
See this video:
A little bit improved PCB is on its own way - 10 pieces should arrive next week. So I will test it and upload SCH, BRD as well as Gerber files.
Simple SPI simulation by port PC of 8255.
The second version of PCB has some new features:
- System connector (24 pins) with data bus, A0-A2, /RD and /WR, seven /CS (decoded), system clock and an interrupt
- Selectable IRQ (RST7.5) for external interrupt request
- Switchable /WE for EEPROM to enable in-place programming
Here is parts placing image:
- JP1 is a serial port. Pins are (from bottom to up): GND, TxD, RxD (next to "JP1" label)
- JP2, JP3, JP4: Parallel ports from 8255. A square marks pin 1, see below to schematics. JP2 is port PA, JP3 is for PB, JP4 is for PC
- JP5 is a EEPROM write enable. Connect pins 1-2 to disable writing, connect 2-3 to enable (pin 1 is the leftmost, pin 3 is next to the label "JP5")
- JP7 is RST7.5 enabler. Close to disable interrupt, open to enable.
System connector (at the upper edge, square marks pin 1)
JP2, 3, 4: square marks the "Vcc" pin.
(Of course, it's compiled and totally unoptimalized for now...)
Here is the classic peripheral device for a single board computer: LED 7segment display and a hexadecimal keyboard.
Of course I can use the classic keyboard matrix and some 7segment displays, a bunch of resistors and transistors and solder a vintage one. Yes, I can, and it's easy. Instead I have used the cheap LED+key module from China. Its type is QYF-TM1638. This is it:
It provides the modern LED display driver and keyboard scanner. It has a serial interface - not an UART, but some kind of SPI with bidirectional data line.
You need three pins to connect this module: strobe pin (output from CPU), clock pin (output from CPU) and data (bidir). So there was a problem: How to achieve a bidir interface in the OMEN Alpha?
I have used the 82C55 parallel interface, port C. Port C can be split into two groups (higher and lower half, PC7-PC4 and PC3-PC0), which can be configured as input or output independently. Ports A and B has the same direction for the whole port.
So I have set the lower half of port C as output for STB and CLK, and the upper one I can switch between input and output. Data pin DIO is connected to port C pin 7.
Here is a source code for the driver. It is not optimized, straightforward and rather ugly, but it works!
My Tindie shop is out of stock, so I decided to fabricate a new batch of PCBs. I have skipped the Issue 3 (backplane version) and made a new, slightly improved version, Issue 4. The improvements are:
- Signals RESET and READY are added to the application / system bus
- 10k pull-up resistor between READY and Vcc to drive this line with open collector drivers
- Removed the LED and 330R resistor. Three pins are added: SID, SOD and GND to enjoy a serial port.
- One place for 22pF capacitor was removed.
The question is simple: Do you want a Zilog Z80 based simple computer kit, similar to the OMEN Alpha? Please vote here.
See GitHub page for news and download