Code
The Adafruit Arcade Machines library for Arduino contains example games for Fruit Jam (and Feather ESP32, but that's in a different guide).
These ports were created using Claude Code. See the bottom of this page for development notes from the porting sessions.
The project source code lives here on GitHub. There are instructions at the bottom of this page for compiling and flashing your board inside the Arduino IDE. But rather than compile it, you can download the latest drag-and-drop .UF2 releases here for:
- Space Invaders
- Lunar Rescue
- Galaga
- Pac-Man
- Ms. Pac-Man
- Donkey Kong
- Burger Time
and consoles/computer games:
- Nintendo Game Boy
- Nintendo Entertainment System
- ScummVM for point-and-click games
Head to the latest release and scroll down to the Assets section. Click on the .uf2 file you want to download.
Flash the Fruit Jam
Plug the Fruit Jam into your computer via USB C data cable. Turn the Fruit Jam's power switch to the ON position.
Next, put the Fruit Jam in to bootloader mode:
- Press and hold the BOOT button (labeled BUTTON #1 on the board)
- Pressing and release the Reset button
- Release the BOOT button
You'll see the RP2350 drive appear on your computer.
In File Explorer or Finder (depending on your operating system), drag and drop the invaders_fruitjam.uf2 file (or whichever you want) onto the RP2350 drive. After the file copies the board will automatically restart.
SD Card setup
Format your microSD card as FAT32/MBR. For arcade games, create two top level directories on the card:
- /rom/
- /samples/
File naming in /rom/: files are loaded in reverse alphabetical order starting at ROM address 0x0000. The standard MAME chip naming (.h → .g → .f → .e) naturally maps to the correct addresses. Other compatible ROMs will work as long as their chip files sort in the right order, or as a single flat 8 KB binary.
The rom/ directory represents the four memory chips on the original hardware, designated as slots h, g, f,e A typical ROM set will look like this:
/rom/
invaders.h
invaders.g
invaders.f
invaders.e
The samples/ directory contains WAV samples (we aren't emulating the original sound chip that synthesized the sounds in real-time, but instead play back samples of the originals):
/samples/
0.wav
1.wav
...
9.wav
Boot-time Errors
Errors show up as a solid-colored screen:
| Screen color | Meaning |
|---|---|
| Red | SD card missing or won't mount (check it's inserted and formatted FAT32 with an MBR partition scheme, not GPT/exFAT) |
| Yellow | Card mounted OK, but /rom/ had no usable ROM files, or every sample in /samples/ failed to load |
| (no color — game runs) | Everything loaded fine |
Per Game Assets
Here are the required assets for your SD card per game. Your best bet legally speaking is to acquire the ROM chips from an original arcade PCB and dump the ROMs onto your computer.
Lunar Rescue
/rom/
lrescue.1 (0x0000)
lrescue.2 (0x0800)
lrescue.3 (0x1000)
lrescue.4 (0x1800)
lrescue.5 (0x4000)
lrescue.6 (0x4800)
/samples/
alienexplosion.wav
rescueshipexplosion.wav
beamgun.wav
thrust.wav
bonus2.wav
bonus3.wav
shootingstar.wav
stepl.wav
steph.wav
/prom/
7643-1.cpu
Galaga
/rom/
gg1-1b.3p
gg1-2b.3m
gg1-3.2m
gg1-4b.2l
gg1-5b.3f
gg1-7b.2c
gg1-9.4l
gg1-11.4d
gg1-10.4f
prom-5.5n
prom-4.2n
prom-3.1c
prom-1.1d
Pac-Man
/rom/
pacman.6e
pacman.6f
pacman.6h
pacman.6j
pacman.5e
pacman.5f
82s123.7f
82s126.1m
82s126.3m
82s126.4a
Ms. Pac-Man
/rom/
pacman.6e pacman.6f pacman.6h pacman.6j <- Pac-Man program ROMs
u5 u6 u7 <- aux board ROMs
5e 5f <- graphics ROMs
82s123.7f 82s126.4a 82s126.1m <- colour + waveform PROMs
Donkey Kong
/rom/
c_5et_g.bin c_5ct_g.bin c_5bt_g.bin c_5at_g.bin <- Z80 program
v_5h_b.bin v_3pt.bin <- tile ROMs
l_4m_b.bin l_4n_b.bin l_4r_b.bin l_4s_b.bin <- sprite ROMs
c-2k.bpr c-2j.bpr v-5e.bpr <- palette + colour-code PROMs
s_3i_b.bin s_3j_b.bin <- 8035 program + sample ROM
Burger Time
/rom/
aa04.9b aa06.13b aa05.10b aa07.15b <- main 6502 program
ab14.12h <- sound 6502 program
aa12.7k ab13.9k ab10.10k <- charset #1 AND sprites
ab11.12k aa8.13k ab9.15k (same bytes, two layouts)
ab00.1b ab01.3b ab02.4b <- charset #2 (background tiles)
ab03.6b <- background TILEMAP, not gfx
Consoles use a slightly different SD card structure:
Game Boy
On your SD card create a directory named cart and put your game's .gb file inside of it. Note, you can't use .zip files.
/cart/
LinksAwakening.gb
Once you've played a game the console will add files next to the game:
/cart/
LinksAwakening.gb
LinksAwakening.sav <- battery save (games that have one)
LinksAwakening.fruitjam.cfg <- settings used on the Fruit Jam
LinksAwakening.feather.cfg <- settings used on the Feather
NES
On your SD card create a directory named cart and put your game's .nes file inside of it. Note, you can't use .zip files.
/cart/
SuperMarioBros.nes
Once you've played a game the console will add files next to the game:
/cart/
SuperMarioBros.nes
SuperMarioBros.sav <- battery save (games that have one)
SuperMarioBros.fruitjam.cfg <- settings used on the Fruit Jam
SuperMarioBros.feather.cfg <- settings used on the Feather
ScummVM
Loom (DOS EGA) as the example; any supported game is the same.
-
Format the card FAT32 with the MBR partition scheme.
-
Copy the game's files into a folder, exactly as they came, for example
/scumm/loom/. For DOS Loom that's the.LFLfiles. -
Make the marker: a text file in
/cartnamed.scummwhose only line is the game folder's path. From Terminal, with the card mounted asCARD:mkdir -p /Volumes/CARD/cart printf '/scumm/loom\n' > /Volumes/CARD/cart/loom.scumm
If you use a text editor instead, save as plain text and check the name: TextEdit adds
.txt(loom.scumm.txt) and Finder hides it, and the Fruit Jam then finds no marker (a yellow screen). -
Optional, AdLib music: make
/cart/loom.fruitjam.cfgholding the linemusic = adlib. The game also writes this file itself on its first boot, with every setting at its default, so you can instead boot once, edit the file on your computer and boot again. The music setting is read only at start-up. -
Put the card in the Fruit Jam and power it up. The game starts on its own; the marker that sorts first in
/cartis the one that boots.
The card then looks like this (loom.s01 and so on appear when you save):
/cart/loom.scumm /scumm/loom
/cart/loom.fruitjam.cfg music = adlib (optional; written at first boot)
/scumm/loom/00.LFL
/scumm/loom/01.LFL
... (the rest of the game's .LFL files)
/scumm/loom/loom.s01 a save, once you've saved
AdLib is for DOS Loom and Indiana Jones and the Last Crusade. Monkey Island 1 (EGA) plays its music through iMuse, which isn't included, so it stays on the PC speaker whatever the setting says.
Here's how to setup, compile, and flash from with the Arduino IDE:
-
Install the Raspberry Pi Pico/RP2040/RP2350 board core (Earle Philhower's, via Boards Manager — add
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.jsonas an additional board URL first). -
Install this library. Either Sketch → Include Library → Add .ZIP Library on a download of this repo, or clone it into your sketchbook's
libraries/folder. Its one dependency,PicoDVI - Adafruit Fork, comes from Library Manager (it is listed inlibrary.properties, so the IDE offers to install it for you). -
Select board Adafruit Fruit Jam RP2350.
-
Set Tools → Optimize to
-O2or-O3— each example'ssketch.yamlsays which, and the header comment at the top of every.inorepeats it. The core's default-Osis not fast enough for any game here. -
Prepare an SD card (FAT32, MBR partition scheme — not GPT/exFAT, which macOS Disk Utility defaults to on "Erase") with that game's own ROM/sample layout — see its README.
-
File → Examples → Adafruit Arcade Machines → Games → your game, and upload.
Page last edited October 09, 2026
Text editor powered by tinymce.