

Gb devcart
A simple, original Game Boy (DMG) / ModRetro Chromatic homebrew development cartridge. 512 KB of rewritable NOR flash, 8 KB of battery-free F-RAM, and an MBC5-subset mapper built from discrete 74HC logic.
- Size
- 56 × 49.5 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 26
- Nets
- 52
- Pads
- 186
- Tracks, vias
- 868, 118
- Pours
- 3
- Routed
- Yes
- KiCad
- KiCad 10.99 (file 20260901)
- Created
- 1 Oct 2026
- Updated
- 2 Oct 2026
Overview
Gb devcart is an open-source printed circuit board by fabPlane, from the fabPlane/gb-devcart repository on GitHub. It is a 2-layer board of 56 × 49.5 mm with 26 parts on 52 nets, routed with 868 tracks and 118 vias.
It is built around the SST39SF040-55-4I-NHE-T, SN74HC32DR(LX) and SN74HC00DR(LX), with the 74HC574D, FM18W08-SGTR and CC0603KRX7R9BB104 among its other parts. Its parts include 7 capacitors, 6 resistors, 6 ICs and 1 connector.
Main components
7SST39SF040-55-4I-NHE-T
PLCC-32(11.4x14)-40℃~+85℃ 100 Years 100,000 cycles 100uA 14MHz 4.5V~5.5V 4Mbit Hardware write protection、Software write protection Parallel PLCC-32(11.4x14) NOR FLASH ROHSMicrochip TechnologyNOR FLASHSN74HC32DR(LX)
SOP-14Logic GateslingxingicSN74HC00DR(LX)
SOP-14Logic Gateslingxingic74HC574D
SOP-20L-40℃~+125℃ 1 13ns 15ns@6V,50pF 2.7V~6V 20uA 28MHz 5ns 6.5pF 7.8mA 7.8mA 74HC Series 8 D-Type Enable Rising Edge Tri-State SOP-20L Flip Flops ROHSMDDFlip FlopsFM18W08-SGTR
SOIC-28-40℃~+85℃ 100,000,000,000,000 Cycles 12mA 151 Years 2.7V~5.5V 20uA 256Kbit Parallel Port (Parallel) SOIC-28-300mil FRAM ROHSInfineon TechnologiesFRAMCC0603KRX7R9BB104
0603100nF 50V X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTCL31A106KBHNNNE
120610uF 50V X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSSamsung Electro-MechanicsMultilayer Ceramic Capacitors MLCC - SMD/SMT
README
README.mdGB DEVCART r1 — open hardware
A simple, original Game Boy (DMG) / ModRetro Chromatic homebrew development cartridge. 512 KB of rewritable NOR flash, 8 KB of battery-free F-RAM, and an MBC5-subset mapper built from discrete 74HC logic. 2-layer, 56 x 49.5 mm, 32 edge fingers at 1.5 mm pitch, 5 V bus.

Status: fully routed (2 layers, Freerouting through fabdesk), DRC/ERC clean, in-stock JLCPCB parts with LCSC numbers, JLC gerbers/BOM/CPL in
exports/jlcpcb/. Not yet built or tested on hardware.
Designed with fabPlane (fabdesk) driving Claude Code. Inspired by the ModRetro "Demo Cartridge", but an original, much simpler design: no FPGA, no level shifters, no regulators.
| What | Where |
|---|---|
| KiCad project (schematic, board, custom symbols/footprint) | board.kicad_*, lib/, circuit.netlist.json |
| 3D models of every part, 3D renders, STEP of the whole board | 3dmodels/, renders/, exports/board.step |
| USB programmer (Arduino Mega firmware + PC tool + cart simulator) | programmer/ |
| Demo homebrew game "Bit Catcher" (GBDK-2020) | game/ |
| JLCPCB / LCSC price list | docs/jlcpcb-pricing.md |
Quick start
# build the demo game (GBDK-2020)
make -C game GBDK_HOME=/path/to/gbdk
# test the programmer end to end against the cart simulator (no hardware needed)
programmer/test_e2e.sh
# flash a real cart through an Arduino Mega 2560 (see programmer/README.md for wiring)
python3 programmer/host/gbflash.py --port /dev/ttyACM0 flash game/dist/bitcatcher.gb| Top | Bit Catcher on the cart |
|---|---|
![]() | ![]() |
Memory map
| GB address | Access | Function |
|---|---|---|
| 0x0000–0x3FFF | R | ROM bank 0 (fixed): flash 0x00000–0x03FFF |
| 0x4000–0x7FFF | R/W | ROM bank N (switchable): flash N*0x4000 + (addr & 0x3FFF), N = 0–31 |
| 0x2000–0x2FFF | W | Bank register (74HC574, bits 0–4 used, bits 5–7 latched but unconnected) |
| 0xA000–0xBFFF | R/W | 8 KB F-RAM (FM18W08, A13/A14 tied low), always enabled |
Notes:
- 0x3000–0x3FFF is deliberately not decoded, so MBC5 software that writes bit 8 there does not clobber the bank register.
- No RAM-enable register and no RAM bank latch. Upgrade path: use the FRAM's A13/A14 with a 2-bit latch.
- The bank register is undefined at power-up. Bank-0 code must write it before using 0x4000–0x7FFF.
- Writes to 0x4000–0x7FFF are the only ones that reach the flash /WE.
Logic
| Signal | Equation |
|---|---|
| Flash /CE | A15 |
| Flash /OE, FRAM /OE | /RD |
| Flash /WE | `/WR |
| Latch clock (rising edge latches) | `/WR |
| Latch /OE | /A14; outputs are pulled down (2.2 kΩ), so A14=0 gives bank 0 |
| FRAM /CE | `/CS |
| FRAM /WE | /WR |
The flash sees A0–A13 from the bus and A14–A18 from the latch (D0–D4).
Flashing from the Game Boy
Run the flasher from WRAM/HRAM, because the flash returns status instead of data while busy. Interrupts off. All command cycles go through the switchable window, so bank-register writes at 0x2000 never reach the flash.
The SST39SF040 decodes commands on address bits A14–A0 only: 0x5555 and 0x2AAA.
0x5555needs chip A14 = 1, so select an odd bank (e.g. 1) and write to GB0x5555.0x2AAAneeds chip A14 = 0, so select an even bank (e.g. 0) and write to GB0x6AAA.
Byte program of data to chip address X:
[0x2000]=1; [0x5555]=0xAA[0x2000]=0; [0x6AAA]=0x55[0x2000]=1; [0x5555]=0xA0[0x2000]=X>>14; [0x4000 + (X & 0x3FFF)]=data- Poll the same address until DQ7 equals data bit 7 (or DQ6 stops toggling), about 20 µs.
Sector erase (4 KB) at SA: the same first two cycles, then [0x2000]=1; [0x5555]=0x80,
[0x5555]=0xAA, [0x2000]=0; [0x6AAA]=0x55, then [0x2000]=SA>>14; [0x4000+(SA&0x3FFF)]=0x30.
Chip erase: the same, with the last cycle [0x2000]=1; [0x5555]=0x10. Then poll as above.
Program a 16 KB bank only from a bank other than the one being written, or from RAM, and verify by read-back. Keep bank 0 (vectors, header, flasher stub) write-protected by software convention.
Hardware notes
/RESEThas a 10 kΩ pull-up (R1).AUDIO_INis unconnected except for test pad TP6.- Test pads: TP1 VCC, TP2 GND, TP3 CLK, TP4 /WR, TP5 /RD, TP6 AUDIO_IN.
- Edge fingers are on the component side, 0.5 mm back from the board edge; order the board with ENIG.
- Pin 1 (VCC) is at the left, looking at the component side. Order: VCC, CLK, /WR, /RD, /CS, A0–A15, D0–D7, /RESET, AUDIO_IN, GND.
- 3.5 mm boss hole at (28, 39) mm from the top-left; all parts are kept above y = 41.5 mm.
- Latch outputs are tri-stated and pulled down for bank 0, so the bank-0 address-to-data path depends on a ~2.2 kΩ RC settle (about 40–80 ns). Check the timing on a real console.
- The
/CSdecode assumes/CSis asserted for A15 = 1; verify on the target hardware. - Bus is 5 V logic (HC family). Confirm that your target's cartridge port tolerates 5 V.
BOM
| Ref | Qty | Value | Package | Suggested MPN |
|---|---|---|---|---|
| U1 | 1 | 512 KB 5 V NOR flash | PLCC-32 | SST39SF040-70-4C-NHE |
| U2 | 1 | 32 KB F-RAM | SOIC-28W | FM18W08-SG |
| U3 | 1 | 74HC574 | SOIC-20W | SN74HC574DWR |
| U4, U5 | 2 | 74HC32 | SOIC-14 | SN74HC32DR |
| U6 | 1 | 74HC00 | SOIC-14 | SN74HC00DR |
| C1–C6 | 6 | 100 nF X7R | 0603 | — |
| C7 | 1 | 10 µF X5R | 1206 | — |
| R1 | 1 | 10 kΩ | 0603 | — |
| R2–R6 | 5 | 2.2 kΩ | 0603 | — |
| TP1–TP6 | 6 | test pad D1.5 mm | — | — |
| J1 | 1 | edge fingers (PCB feature) | gbdev:GB_Cart_Edge_32 | — |
Programming over USB
The cart is programmed by an Arduino Mega 2560 (5 V I/O, so no level shifters) wired to a
32-pin Game Boy cartridge slot. The PC runs programmer/host/gbflash.py
(info, flash, dump, erase, save-backup, save-restore). The flashing algorithm lives in
programmer/firmware/gbflash/gbflash_core.h, which also compiles into a native simulator of this
cart for hardware-free tests. See programmer/README.md for the wiring table.
3D models
Every component carries a 3D model, vendored in 3dmodels/ and referenced as
${KIPRJMOD}/3dmodels/…, so the project renders and exports (STEP/GLB) with no global KiCad
3D library. The passives and SOIC models come from the official KiCad 3D library
(CC-BY-SA 4.0 with the KiCad library exception). KiCad ships no PLCC-32 model, so
scripts/make_plcc32_model.py generates one with CadQuery (JEDEC MS-016 body, 32 J-leads)
matching the KiCad footprint. Regenerate the renders with:
kicad-cli pcb export glb --include-pads --include-silkscreen --include-soldermask -o renders/board.glb board.kicad_pcb
kicad-cli pcb export step -o exports/board.step board.kicad_pcb
cd scripts/render3d && npm install && CHROMIUM_PATH=/path/to/chrome npm run render # -> renders/3d-*.pngOrdering
See docs/jlcpcb-pricing.md for bare-PCB and assembled prices at
JLCPCB with LCSC part numbers. Order ENIG (or hard-gold fingers with a 45° bevel) and 1.0 mm
thickness so the board fits a standard DMG cartridge shell.
JLC order files (regenerate with KICAD_CLI=… python3 scripts/jlc_export.py):
| File | Upload as |
|---|---|
exports/jlcpcb/gerbers.zip | Gerber files (2 layers, 56 × 49.5 mm) |
exports/jlcpcb/bom.csv | Assembly BOM: 9 lines, every line with an LCSC part number |
exports/jlcpcb/cpl.csv | Assembly pick-and-place (19 parts, top side) |
Check the rotation preview on JLC's assembly page before confirming. SOIC and PLCC reels sometimes need a ±90° correction.
| Routed top (F.Cu) | Routed bottom (B.Cu) |
|---|---|
![]() | ![]() |
Snapshot from 2026-10-01 (USD, before shipping):
| Qty | Bare PCB, ENIG | PCB + Economic assembly |
|---|---|---|
| 5 | $18.60 ($3.72/board) | |
| 10 | $21.60 ($2.16/board) | |
| 30 | $28.90 ($0.96/board) | |
| 100 | $62.70 ($0.63/board) |
Before ordering:
- Stock. The design now uses the in-stock drop-ins: SST39SF040-55-4I-NHE-T (C632847, the same flash in a faster, industrial grade) and FM18W08-SGTR (C55945, the same F-RAM on tape and reel). Stock was 17 and 45 on 2026-10-01, so re-check it before ordering. The F-RAM is about 60% of the assembled cost.
- Gold-finger size rule. JLC's bevelled gold-finger option needs boards of at least 50 mm on both sides. This board is 49.5 mm tall, so widen it to 50 mm (r1.1) or order a panel. Plain ENIG needs no change.
Project files
scripts/sync_fields.pycopies MPN / Manufacturer / LCSC from the netlist intoboard.kicad_pcbandboard.kicad_sch.scripts/jlc_export.pywrites the JLC gerbers, BOM and CPL.scripts/gen.pygenerateslib/gbdev.kicad_sym,lib/gbdev.pretty/andcircuit.netlist.json. The netlist is the source of truth;board.kicad_*are built from it.- Symbols and the edge footprint are custom (
gbdevlibrary) because the build environment has no KiCad symbol libraries.
Project status
- Netlist: 26 components, 46 nets. Custom
gbdevsymbols and edge footprint; placement inside the 56 x 49.5 mm outline, with all parts above y = 41.5 mm and the 3.5 mm boss hole at (28, 39). - Routing: done with Freerouting 2.4.1 (Java 25) through fabdesk's
route_run. All 134 connections are routed in one run.- Rules: 0.2 mm tracks, 0.15 mm clearance, 0.5/0.3 mm vias, all within JLCPCB's standard 2-layer process.
- Keepouts: a copper keepout around the boss hole and rules for the finger zone.
- Power: VCC/GND widened to 0.25–0.4 mm where neighbouring tracks allow. A GND pour on B.Cu would be a good r1.1 change.
- DRC: 0 errors, 0 warnings, 0 unconnected, 0 schematic-parity conflicts. ERC: 0 errors.
- What didn't work: fabdesk's built-in
capacityrouter (fab_router) could not route this dense 2-layer bus. Its best result was 63 of 134 connections, and long runs block the bridge process until fabdesk times out. To get to the result above, parts were moved (U2, U3, C2, C3, C6, R2–R6), the rules were tightened as listed, and Freerouting was enabled. - Board thickness: still the KiCad default (1.6 mm). Choose 1.0 mm in the fab order so the board fits a DMG shell.
- Hand edits: the silkscreen text and the J1 reference position were added to
board.kicad_pcbby hand. Acircuit_buildwithfresh: truewill discard them, along with the routing. - Not yet verified on hardware: bus timing (bank-0 pull-down settling), the
/CSdecode assumption, and the JLC rotation offsets.
Parts
26| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 100nF | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C4, C5, C6 |
| 5 | 2.2k | Resistor_SMD:R_0603_1608Metric | R2, R3, R4, R5, R6 |
| 2 | 74HC32 | Package_SO:SOIC-14_3.9x8.7mm_P1.27mm | U4, U5 |
| 1 | 10k | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | 10uF | Capacitor_SMD:C_1206_3216Metric | C7 |
| 1 | 74HC00 | Package_SO:SOIC-14_3.9x8.7mm_P1.27mm | U6 |
| 1 | 74HC574 | Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm | U3 |
| 1 | FM18W08 | Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm | U2 |
| 1 | GB_Cart_Edge_32 | gbdev:GB_Cart_Edge_32 | J1 |
| 1 | SST39SF040 | Package_LCC:PLCC-32_11.4x14.0mm_P1.27mm | U1 |
| 1 | TP_AUDIO_IN | TestPoint:TestPoint_Pad_D1.5mm | TP6 |
| 1 | TP_CLK | TestPoint:TestPoint_Pad_D1.5mm | TP3 |
| 1 | TP_GND | TestPoint:TestPoint_Pad_D1.5mm | TP2 |
| 1 | TP_RD | TestPoint:TestPoint_Pad_D1.5mm | TP5 |
| 1 | TP_VCC | TestPoint:TestPoint_Pad_D1.5mm | TP1 |
| 1 | TP_WR | TestPoint:TestPoint_Pad_D1.5mm | TP4 |
Questions
How big is the Gb devcart PCB?
It measures 56 × 49.5 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Gb devcart use?
26 parts, built around the SST39SF040-55-4I-NHE-T, SN74HC32DR(LX), SN74HC00DR(LX) and 74HC574D. 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 Gb devcart KiCad files?
From the fabPlane/gb-devcart repository on GitHub, at the commit this page was made from: the board is board.kicad_pcb and its schematic board.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Gb devcart design in my own project?
Its repository states no licence, so its author keeps all rights: ask fabPlane before reusing the design.
Similar boards
- 6 layers300 × 248.8 mm

- 2 layers79.6 × 47.2 mm

- 2 layers97.8 × 97.2 mm

TR4org
nanamitm/td4-kicad
TD4 4-bit CPU (from the book CPUの創りかた) as a KiCad 10 hierarchical schematic
136 parts - 2 layers149.6 × 73.9 mm

PortableLIBS
nfbeier/HusseinLab_UltrafastPlasmaScience
Github repository for hardware and software interfacing of the smart system used by the Hussein Ultrafast Plasma Science group at the University of Alberta for experiments LIBS and high-repetition-rate, femtosecond…
33 parts1 - 2 layers82.5 × 85.3 mm

- 4 layers180 × 67 mm

- 6 layers310 × 284 mm

Osc core
Takazudo/zudo-osc-hole-field
This directory retains the rejected #38 nine-board-era schematic, PCB and route receipts at base commit 1fc6e5347308fe5e8166d5828ba3ba6fa8e101c7. It is excluded from the current ten-board manifest.
3,986 parts - 4 layers37.1 × 37.2 mm

Doorman
AzonInc/Doorman
ESP32-S3 based Intercom Gateway (TCS / Koch / Niko / Scantron / Analogue Systems)
44 parts252GPL-3.0



