Skip to the content
PCBKitNew board
2 layers56 × 49.5 mmGb devcart, the printed circuit board in 3D

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

7

README

README.md

GB 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.

GB DEVCART r1, 3D render

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.

WhatWhere
KiCad project (schematic, board, custom symbols/footprint)board.kicad_*, lib/, circuit.netlist.json
3D models of every part, 3D renders, STEP of the whole board3dmodels/, 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 listdocs/jlcpcb-pricing.md

Quick start

bash
# 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
TopBit Catcher on the cart
topgame

Memory map

GB addressAccessFunction
0x0000–0x3FFFRROM bank 0 (fixed): flash 0x00000–0x03FFF
0x4000–0x7FFFR/WROM bank N (switchable): flash N*0x4000 + (addr & 0x3FFF), N = 0–31
0x2000–0x2FFFWBank register (74HC574, bits 0–4 used, bits 5–7 latched but unconnected)
0xA000–0xBFFFR/W8 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

SignalEquation
Flash /CEA15
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.

  • 0x5555 needs chip A14 = 1, so select an odd bank (e.g. 1) and write to GB 0x5555.
  • 0x2AAA needs chip A14 = 0, so select an even bank (e.g. 0) and write to GB 0x6AAA.

Byte program of data to chip address X:

  1. [0x2000]=1; [0x5555]=0xAA
  2. [0x2000]=0; [0x6AAA]=0x55
  3. [0x2000]=1; [0x5555]=0xA0
  4. [0x2000]=X>>14; [0x4000 + (X & 0x3FFF)]=data
  5. 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

  • /RESET has a 10 kΩ pull-up (R1). AUDIO_IN is 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 /CS decode assumes /CS is 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

RefQtyValuePackageSuggested MPN
U11512 KB 5 V NOR flashPLCC-32SST39SF040-70-4C-NHE
U2132 KB F-RAMSOIC-28WFM18W08-SG
U3174HC574SOIC-20WSN74HC574DWR
U4, U5274HC32SOIC-14SN74HC32DR
U6174HC00SOIC-14SN74HC00DR
C1–C66100 nF X7R0603—
C7110 µF X5R1206—
R1110 kΩ0603—
R2–R652.2 kΩ0603—
TP1–TP66test pad D1.5 mm——
J11edge 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:

bash
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-*.png

Ordering

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):

FileUpload as
exports/jlcpcb/gerbers.zipGerber files (2 layers, 56 × 49.5 mm)
exports/jlcpcb/bom.csvAssembly BOM: 9 lines, every line with an LCSC part number
exports/jlcpcb/cpl.csvAssembly 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)
topbottom

Snapshot from 2026-10-01 (USD, before shipping):

QtyBare PCB, ENIGPCB + Economic assembly
5$18.60 ($3.72/board)$129 ($25.75/board)
10$21.60 ($2.16/board)$215 ($21.46/board)
30$28.90 ($0.96/board)$496 ($16.55/board)
100$62.70 ($0.63/board)$1,497 ($14.97/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.py copies MPN / Manufacturer / LCSC from the netlist into board.kicad_pcb and board.kicad_sch.
  • scripts/jlc_export.py writes the JLC gerbers, BOM and CPL.
  • scripts/gen.py generates lib/gbdev.kicad_sym, lib/gbdev.pretty/ and circuit.netlist.json. The netlist is the source of truth; board.kicad_* are built from it.
  • Symbols and the edge footprint are custom (gbdev library) because the build environment has no KiCad symbol libraries.

Project status

  • Netlist: 26 components, 46 nets. Custom gbdev symbols 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 capacity router (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_pcb by hand. A circuit_build with fresh: true will discard them, along with the routing.
  • Not yet verified on hardware: bus timing (bank-0 pull-down settling), the /CS decode assumption, and the JLC rotation offsets.

Parts

26
QtyValueFootprintReferences
6100nFCapacitor_SMD:C_0603_1608MetricC1, C2, C3, C4, C5, C6
52.2kResistor_SMD:R_0603_1608MetricR2, R3, R4, R5, R6
274HC32Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU4, U5
110kResistor_SMD:R_0603_1608MetricR1
110uFCapacitor_SMD:C_1206_3216MetricC7
174HC00Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU6
174HC574Package_SO:SOIC-20W_7.5x12.8mm_P1.27mmU3
1FM18W08Package_SO:SOIC-28W_7.5x17.9mm_P1.27mmU2
1GB_Cart_Edge_32gbdev:GB_Cart_Edge_32J1
1SST39SF040Package_LCC:PLCC-32_11.4x14.0mm_P1.27mmU1
1TP_AUDIO_INTestPoint:TestPoint_Pad_D1.5mmTP6
1TP_CLKTestPoint:TestPoint_Pad_D1.5mmTP3
1TP_GNDTestPoint:TestPoint_Pad_D1.5mmTP2
1TP_RDTestPoint:TestPoint_Pad_D1.5mmTP5
1TP_VCCTestPoint:TestPoint_Pad_D1.5mmTP1
1TP_WRTestPoint:TestPoint_Pad_D1.5mmTP4

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

  • 2 layers79.6 × 47.2 mmICMemCard, the printed circuit board in 3D

    ICMemCard

    captainys/FM

    Code for Fujitsu FM-7 and FM TOWNS series computers

    31 parts27
  • 2 layers97.8 × 97.2 mmTR4org, the printed circuit board in 3D

    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 mmPortableLIBS, the printed circuit board in 3D

    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 mmBSPD-27, the printed circuit board in 3D

    BSPD-27

    Full-Blue-Racing/BSPD-27

    BSPD for the fbr27 car

    108 parts
  • 4 layers180 × 67 mmTbc, the printed circuit board in 3D

    Tbc

    philmcm/tbc

    130 parts
  • 6 layers310 × 284 mmOsc core, the printed circuit board in 3D

    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 mmDoorman, the printed circuit board in 3D

    Doorman

    AzonInc/Doorman

    ESP32-S3 based Intercom Gateway (TCS / Koch / Niko / Scantron / Analogue Systems)

    44 parts252GPL-3.0