Skip to the content
PCBKitNew board
2 layers88.9 × 88.9 mmByteMachine, the printed circuit board in 3D

A generic main board to build 8-bit computers

Size
88.9 × 88.9 mm
Copper layers
2
Thickness
1.6 mm
Parts
46
Nets
81
Pads
291
Tracks, vias
793, 47
Pours
1
Routed
Yes
KiCad
KiCad 5 (file 20171130)
Created
2 Sep 2015
Updated
15 May 2022

Overview

ByteMachine is an open-source printed circuit board by c0pperdragon, from the c0pperdragon/ByteMachine repository on GitHub. It is a 2-layer board of 88.9 × 88.9 mm with 46 parts on 81 nets, routed with 793 tracks and 47 vias.

It is built around the 74HC245D, 74AC00 and 74AC32PC, with the 74HC04D, 74HC574D and NE555 among its other parts. Its parts include 12 capacitors, 9 diodes, 8 ICs, 4 resistors and 1 switch. It belongs with the retro computing and games boards of this library.

Main components

6

README

README.md

ByteMachine

Building an 8-bit computer is not exactly trivial. There are always many components involved which are normally connected to some common address and data bus with complex control signal timings for RAM, ROM and IO controller parts and whatnot.

One common way for a hobbyist user to actually build such a contraption is using a pre-engineered PCB on which to solder all necessary parts. While this can be great fun in itself, it does not teach you much about the hardware beyond basic soldering skills.

Another way is creating the whole computer totally on breadboards. There are great resources and instructions available for this and it may actually give you the best learning experience. On the other hand, creating a huge breadboard circuit comes with its own troubles. The cables will often become a total mess, you easily disturb the wrong wires while changing anything, some wires may make bad contact and you may not get the machine to run at a higher system clock.

With this design as a building block, I wanted to provide some kind of middle ground. The PCB provides the circuity for the system bus, RAM, ROM, clock, powerup reset and rudimentary IO. You then need to add a relatively small circuit for the CPU board, depending on the type of CPU to use. This can be easily done with a single breadboard and a series of jumper links connecting this with the main board. In my experients this creates a pretty reliable setup which is even able to use clock frequencies of up to 16Mhz (for the 65Cxx types of CPUs). Currently I have built and tested setups for the following CPUs:

User oe7twj has provided me with all documention for this own setup:

alt text

CPU board connector

The main board has a 34 pin single-row connector that carries power and all signals necessary for the CPU to send and receive:

  • Power connectors GND and +5V
  • CPU Clock
  • Reset (active low)
  • WR (active low)
  • RD (active low)
  • ROM selector
  • 19 Address bus lines
  • 8 Data bus lines (bidirectional)

Clock generator

The main board provides a simple circuit to create a clock signal using a quartz crystal. The quartz itself is socketed, so you can easily exchange it to experiment with different frequencies. In my tests, this circuit runs reliably with frequencies from 8Mhz up to 20Mhz (but this may be too fast for your CPU).

Power-on reset

Most (probably all) supported CPUs need some external help to cleanly start upon power-up. The power-up reset line provides a low level signal for the first few milliseconds after power is available.

Reading and writing strobes

Beyond providing the CPU clock, the main board itself does not use this clock for anything itself, and all accesses to both RAM, ROM and IO are triggered by asynchronous signals.

When the CPU needs to do a read, it sets up the address lines as well as the ROM selector and then pulls the RD line low. As long as this is in its low state, the board will provide the requested data on the data bus. It is in the responsibility of the CPU to never drive the data bus itself as long as the RD line is low.

For writing data to the board, the CPU needs to provide both the address (and ROM selector) and the data on the data bus. Then it needs to pull WR low and set it high again (after some minimum setup-time). The data that is present at the rising edge will be written to the RAM (or IO).

ROM, RAM, IO

The main board contains 512K of RAM, 512K of ROM (actually a NAND-Flash IC in a ZIF socket for ease of re-programming) and two 74-series logic ICs to drive the input and output interface.

Contrary to most 8-bit computer designs, there is no dedicated address space to access IO (memory mapped IO) as this would require some complex address decoding logic. Also a dedicated IO space would reduce the address space available, and for a CPU with only 16 address lines total, this is a serious drawback.

In my solution, the only IO the CPU can do is to write into an 8-bit output port register and to read 8 bits from an input port. Writing to the output is simply done by writing anywhere to the ROM address range. The data byte written will be stored in the output register and will show up as voltages on the output port and will also directly drive the output LEDs. To also allow input with as little logic parts as possible, I chose the following mechanism: After a write to the ROM area (and in consequence to the output port as well), the main board switches to "IO mode". In IO mode, all reads from the RAM area will instead read data form the input port. To switch back to normal mode, the CPU needs to do a write to any RAM address. Using this scheme, the full range of ROM and RAM is available, as well as 8 output lines and 8 input lines.

Attaching IO

With a total of 8 output lines and 8 input lines (each with 10K pullups), basically any kind of serial IO protocol can be implemented by the CPU: SPI, I2C, UART.

To keep things simple, the ByteBoard does not directly support any kind of IO interrupt line. Therefore basically only IO schemes are possible where the CPU is the master of the timing. This is already an inherent characteristic of the I2C and SPI bus. To implement reliable UART communication, the connected device must support hardware flow control (RTS/CTS) at least on the incomming signal, so the CPU needs only to listen for data when it is itself prepared for that.

Bidirectional lines for I2C

To form the bi-directional line that is needed for I2C, one output and one input line can be combined. The output pin can for example drive an open-collector circuit (an IC or only a simple transistor circuit). An even simpler possibility is just a diode that pulls down the line when the output pin is driven low, but lets the line float when the pin is driven high. Due to the pullup resitors already present at the input port pins, this is basically all that is needed.

Reprogamming the Flash

From the perspective of the ByteMachine, its ROM is truly read-only. So you need an external programming device to get new content onto the NAND-Flash. I am using an TL866II+ device which works absolutely fine for me. But any other compatible programmer will work, and you can even create an Arduino-Based circuit for that.

Parts

46
QtyValueFootprintReferences
9LED_SmallLED_THT:LED_D3.0mmD0, D1, D2, D3, D4, D5, D6, D7, D9
8100nFCapacitor_THT:C_Disc_D3.8mm_W2.6mm_P2.50mmC1, C6, C7, C8, C9, C10, C11, C13
233pFCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC3, C5
2Conn_01x08_MaleConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJIN1, JOUT1
110kResistor_THT:R_Array_SIP9RN1
110uFCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC4
11MResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR3
11kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR4
11kResistor_THT:R_Array_SIP9RN4
122Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR2
1220kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_HorizontalR1
1470uFCapacitor_THT:CP_Radial_D8.0mm_P5.00mmC2
174AC00Package_DIP:DIP-14_W7.62mm_SocketU4
174AC32Package_DIP:DIP-14_W7.62mm_SocketU3
174HC04Package_DIP:DIP-14_W7.62mm_SocketU1
174HC245Package_DIP:DIP-20_W7.62mm_SocketU7
174HC574Package_DIP:DIP-20_W7.62mm_SocketU9
1AS6C4008Package_DIP:DIP-32_W15.24mm_SocketU2
1Barrel_Jack_SwitchConnector_BarrelJack:BarrelJack_HorizontalJPOWER1
1Conn_01x04_MaleConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJPOWER2
1Conn_01x34_FemaleConnector_PinSocket_2.54mm:PinSocket_1x34_P2.54mm_VerticalJBUS1
1CrystalCrystal:Crystal_HC18-U_VerticalY1
1NE555Package_DIP:DIP-8_W7.62mmU6
1SST39SF040ProjectFootprints:DIP-32_LargeHolesU5
1SW_DPDT_x2ProjectFootprints:DPDS SwitchSW1

The 42 most common of 46 parts.

Questions

How big is the ByteMachine PCB?

It measures 88.9 × 88.9 mm and has 2 copper layers, 1.6 mm thick.

What parts does the ByteMachine use?

46 parts, built around the 74HC245D, 74AC00, 74AC32PC and 74HC04D. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the ByteMachine KiCad files?

From the c0pperdragon/ByteMachine repository on GitHub, at the commit this page was made from: the board is mainboard/mainboard.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the ByteMachine design in my own project?

Its repository states no licence, so its author keeps all rights: ask c0pperdragon before reusing the design.

More from c0pperdragon/ByteMachine

3
  • 2 layers52.1 × 66 mmIoexpanderboard, the printed circuit board in 3D

    Ioexpanderboard

    c0pperdragon/ByteMachine

    A generic main board to build 8-bit computers

    14 parts20
  • 2 layers30.5 × 88.9 mm65c816board, the printed circuit board in 3D

    65c816board

    c0pperdragon/ByteMachine

    A generic main board to build 8-bit computers

    9 parts20
  • 2 layers65c02board, the printed circuit board in 3D

    65c02board

    c0pperdragon/ByteMachine

    A generic main board to build 8-bit computers

    6 parts20

Similar boards

  • 2 layersBreadBin, the printed circuit board in 3D

    BreadBin

    c0pperdragon/BreadBin

    A CPU made of 7400 logic on breadboards - inside a bread bin ;-)

    45 parts18
  • 2 layers233.4 × 280 mmCft board0, the printed circuit board in 3D

    Cft board0

    alexiosc/cft

    The CFT homebrew minicomputer

    299 parts6GPL-3.0
  • 2 layers306.1 × 130.2 mm8-Bit CPU 32k, the printed circuit board in 3D

    8-Bit CPU 32k

    slu4coder/Minimal-64-Home-Computer

    Legacy: Full TTL-only home computer with VGA and PS/2 and twice the processing power of a Commodore 64

    132 parts94
  • 4 layers76.7 × 76.7 mmOS816, the printed circuit board in 3D

    OS816

    c0pperdragon/OS816

    An experimental single-board computer using the 65C816

    40 parts28
  • 4 layers304.5 × 217.2 mmLatest Full Backplane, the printed circuit board in 3D

    Latest Full Backplane

    Trilobyte-CPU/8-bit-computer

    A DIY 8-bit computer built mostly with discrete logic chips

    478 parts2
  • 2 layers99.1 × 99.1 mmVga, the printed circuit board in 3D

    Vga

    rjw57/simplest-80s-computer

    This is my rough scratch repo where I keep experiments to do with desiging 80s computer peripherals. It is not in any sensible shape to be used by others yet, apologies.

    45 parts
  • 2 layers106.7 × 83.8 mmVdu sv, the printed circuit board in 3D

    Vdu sv

    zuiko21/minimOS

    Scalable OS for 6502/65816

    40 parts23MIT