
MCL86jr
MicroCoreLabs/Projects
Ted Fried's MicroCore Labs Projects - FPGA CPU cores and emulators for the 8088, 8086, 8051, 6502, 68000, Z80, Risc-V, and also Typewriter and EPROM Emulator projects.

z80neo, another z80 board
Z80neo is an open-source printed circuit board by TurBoss, from the TurBoss/z80neo repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board with 34 parts on 74 nets, routed with 1 track and 0 vias.
It is built around the SN74LVC245APW. Its parts include 15 resistors, 7 switches, 4 capacitors, 4 ICs and 1 diode. It belongs with the retro computing and games boards and the RP2040 boards of this library.

████ ████
█░░░ █ █░░░██
██████░█ ░█░█ █░█ ███████ █████ ██████
░░░░██ ░ ████ ░█ █ ░█░░██░░░██ ██░░░██ ██░░░░██
██ █░░░ █░██ ░█ ░██ ░██░███████░██ ░██
██ ░█ ░█░█ ░█ ░██ ░██░██░░░░ ░██ ░██
██████░ ████ ░ ████ ███ ░██░░██████░░██████
░░░░░░ ░░░░ ░░░░ ░░░ ░░ ░░░░░░ ░░░░░░
A computer built around a real Z80 CPU.
z80neo is not an emulator. A genuine Zilog Z0840004 (NMOS, TTL-level)
runs real code, while an Olimex RP2350-PICO2-BB48 (RP2350B, 48 GPIOs)
acts as its RAM, ROM and all of its I/O. The Pico captures the Z80 bus
cycle-by-cycle through PIO, services each access and stalls the CPU with
WAIT — so the two chips share one bus exactly like a classic microcomputer.
On top of that it emulates an MMU, a serial console (and a second UART), a 15-drive CP/M sector disk, an OLED status display, a keypad menu, and it drives an optional FPGA VDP over SPI. It boots CP/M 2.2, Fuzix and bare-metal Z80 programs from an SD card.
Z80NEO.INIram[4][16384]), optionally
extended with PSRAM, behind a 4-page MMU on ports 0xF0–0xF3.0x80/0x81) plus an independent second UART
(UART1, 0x90–0x93) with runtime-configurable baud/format.CPMDISK0..14.IMG.0xA0–0xA7), with directory
walking into subdirectories.ESC g
protocol, mirrored over SPI to an FPGA VDP.Schematics live in hardware/; see the pinout and datasheets in doc/.

Bus capture (PIO) — two PIO0 state machines watch MREQ and IORQ. On
a cycle they assert WAIT, push a bus snapshot to the FIFO and block on
PULL. The ARM core services the cycle, reads the address/data through the
SEL1/2/3 mux and releases WAIT. Because the Z80 is stalled for the whole
service time, timing is independent of the emulated clock speed.
Memory / MMU — src/memory.c. 16-bit addresses map through mmu_page[]
into the 16 KB banks; PSRAM can extend them.
I/O ports — handled in io_read_port() / io_write_port():
| Port(s) | Function |
|---|---|
0x80/0x83 | console data |
0x81 | console status |
0x90/0x91 | UART1 data / status |
0x92/0x93 | UART1 baud code / line format config |
0x94/0x95 | NullVDP console byte / link status |
0xA0–0xA7 | SD-card file API (command, name, data, seek/size) |
0xD1 | I2C EEPROM |
0xE0–0xE3 | CP/M disk (data/command, track, sector/status, drive select) |
0xF0–0xF3 | MMU page select |
Clock / reset — src/z80clock.pio generates the Z80 clock; frequency
(Z80_KHZ, 32..1000) and duty (Z80_DUTY, 5..95 %) are settable from
Z80NEO.INI.
Display / keys — core 1 drives the OLED and the debounced ADC keypad menu; core 0 owns the bus loop and UARTs.
Boot — mount SD → read Z80NEO.INI → load the Intel HEX program into
banks → hold reset → start PIO → release reset.
See AGENTS.md for an in-depth description of every subsystem and the
hardware/timing gotchas.
Requires the Raspberry Pi pico-sdk 2.x and an arm-none-eabi toolchain.
firmware/build.sh hardcodes the local SDK paths — edit it for your setup.
cd firmware
./build.sh # cmake -B build -S . -DPICO_BOARD=z80neo_bb48 -DPSRAM_ENABLE=ONThe output ELF is firmware/build/z80neo/z80neo.elf. Build with
PICO_BOARD=z80neo_bb48, never pico2 — pico2 is the RP2350A (30 GPIOs),
so GPIO30–47 (clock, reset, keypad) are silently dropped. main.c #errors on
the wrong package.
Flash over CMSIS-DAP/OpenOCD:
cd firmware
./upload.sh # openocd ... program build/z80neo/z80neo.elf verify reset exitDebug (OpenOCD + GDB):
cd firmware
./debug.sh # standard gdbinit
./debug.sh serial # serial-tracing gdb scriptThere is no unit-test framework; verify by building, flashing and watching
UART0 (115200 8N1) plus the OLED. tools/z80_boot_sim.py is the only offline
harness. The full pipeline — firmware + OS + SD deploy — is ./build_all.sh.
Copy sdcard/Z80NEO.INI, your program image and the CP/M disk images to the
card root. The preferred INI format is order-independent KEY=VALUE:
| Key | Meaning |
|---|---|
MACHINE | machine name |
CANCEL2,CANCEL,OK,BACK,DOWN,UP | ADC keypad thresholds |
PROG1..PROG4 | program filenames (PROG1 is loaded at boot) |
DEBUG | 1 = hold in a busy loop at boot |
FUZIX | full-RAM load + hardware /INT (Fuzix) |
BAUD | UART0 console baud (default 115200) |
UART1_BAUD, UART1_FORMAT | second UART, e.g. 115200 / 8N1 |
Z80_KHZ, Z80_DUTY | Z80 clock frequency / duty |
MIDI_GROUP_X10, MIDI_BYTE_X10 | MIDI player speed trim (tenths of a ms) |
MIDI_PANEL | 1/0 firmware MIDI channel monitor |
SCREENSAVER, SS_MODE, SS_IDLE | idle OLED screensaver settings |
The default sdcard/Z80NEO.INI boots CP/M. Program images are Intel HEX —
both the .hex (CP/M) and .ihx (z88dk) spellings load.
software/cpm/z80neo/, built with make into
build/cpmz80neo.hex. CCP/BDOS at 0xD400, BIOS at 0xEB00; 15 sector
disks A:–O: from CPMDISK0..14.IMG. CP/M disk helpers live in tools/
(pack_cpm_collection.py, install_cpm_disks.py) and the PySide6
TBCPMTools GUI can inspect/edit the images.software/Fuzix/, an FCC-built banked kernel.software/cpm/ also holds turboterm/ (TTERM.COM,
bridges the CP/M console to UART1), the midiplayer/, a regulus-radiant-crucible/
Forth, and the te/ editor sources.software/bbcbasic{, -z80}/) and
software/Tiny-Basic-Z80/.zcc +z80neo) — the in-tree z88dk target links at
ORG 0x0000, owns page 0 and uses ports 0x80/0x81. It ships a
bitmap graphics layer (z80neo_gfx_*) speaking the VDP ESC g protocol.
See software/z80neo/.software/z80neo/monitor/, a full machine monitor/debugger
(dump/edit, disassemble, breakpoints, single-step, HEX load, MMU control).software/z80neo/midiplayer/ (bare metal) and
software/cpm/midiplayer/ (MIDI.COM): SD-card Standard MIDI File players
driving UART1 at 31250 baud, with a firmware-side SMF parser and monitor.software/asm/, built with z88dk
(./build_hex.sh <name>).PORT_LEDS: equ 0x40
VAL_A equ 0xBA
VAL_B equ 0xAB
main:
ld sp, 0x3fff
loop:
ld A, VAL_A
out (PORT_LEDS), A
ld A, VAL_B
out (PORT_LEDS), A
JP loop
topOfStackvdp/) — a fork of VersaTerm used as a standalone RP2350/RP2040
VGA serial terminal (a separate board). Talks over UART1 and implements
the console protocol in doc/vdp_protocol.md.vdp/NullVDP/) — a Verilog VDP on a Sipeed Tang Primer 20K
FPGA with HDMI output, spoken to over SPI by the firmware.sdl_client/) — a PC-side SDL3 VT100/VT102 terminal for
/dev/ttyACM0, including the ESC g bitmap layer.the thing

back wiring

pulse view capture

display

serial out

Join the live chat:
| Qty | Value | Footprint | References |
|---|---|---|---|
| 15 | R_Small | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15 |
| 7 | SW_DIP_x01 | Button_Switch_THT:SW_PUSH_6mm | SW1, SW2, SW3, SW4, SW5, SW6, SW7 |
| 4 | C_Small | Capacitor_THT:C_Disc_D4.3mm_W1.9mm_P5.00mm | C1, C2, C3, C4 |
| 3 | SN74LVC245APW | Package_DIP:CERDIP-20_W7.62mm_SideBrazed_LongPads_Socket | U1, U2, U3 |
| 1 | LED_Small | LED_THT:LED_D3.0mm | D1 |
| 1 | Micro_SD_Card | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Horizontal | J2 |
| 1 | RaspberryPi_Pico | Module:RaspberryPi_Pico_Common_Unspecified | A1 |
| 1 | SSD1306 | Display:Adafruit_SSD1306_No_Mounting_Holes | Brd1 |
| 1 | Z084000xP | Package_DIP:DIP-40_W15.24mm | U4 |

MicroCoreLabs/Projects
Ted Fried's MicroCore Labs Projects - FPGA CPU cores and emulators for the 8088, 8086, 8051, 6502, 68000, Z80, Risc-V, and also Typewriter and EPROM Emulator projects.

fliperama86/neopico-hd
Digital video and audio capture with HDMI output for Neo Geo MVS arcade hardware using Raspberry Pi Pico 2

lmcapacho/ESP32_LogicAnalyzer
Low-cost logic analyzer using ESP32 for fast digital signal debugging

ceteras/PicoLVDS
Tested with B089AW01-V.0 and HSD089IFW1-A00-V1.0 on a breadboard. I'm sure it will work with other displays from old netbooks.

gianluca-rainis/Z80DevBoard
An advanced development board for the Z80 microprocessor, powered by an RP2040.

KungfuPancake/longboi
Possibly the longest controller board to control the BoxTurtle AFC


BlackPancakes/RP2040-Logic-Analyzer
An open-source, high-speed, multi-channel logic analyzer based on the popular Raspberry Pi RP2040 microcontroller. The board was designed in KiCad with a strong focus on signal integrity and miniaturization.
34 parts, built around the SN74LVC245APW. 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.
From the TurBoss/z80neo repository on GitHub, at the commit this page was made from: the board is hardware/main.kicad_pcb and its schematic hardware/main.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).