

SVI-328-PicoROM
The SVI-328 PicoROM project is a ROM emulator for Spectravideo 328 which uses a Raspberry Pico 2 W microcontroller board to emulate a SVI-328 game ROM cartridge.
- Size
- 55 × 79.5 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 3
- Nets
- 42
- Pads
- 119
- Tracks, vias
- 187, 5
- Routed
- Yes
- KiCad
- KiCad 8.0 (file 20240108)
- Created
- 4 Apr 2025
- Updated
- 6 Apr 2025
Overview
SVI-328-PicoROM is an open-source printed circuit board by fitch, from the fitch/SVI-328-PicoROM repository on GitHub. It is a 2-layer board of 55 × 79.5 mm with 3 parts on 42 nets, routed with 187 tracks and 5 vias.
Its parts include 1 IC, 1 diode and 1 connector. It belongs with the retro computing and games and microcontroller boards boards and the RP2040 boards of this library.
README
README.mdSVI-328 PicoROM
Overview
SVI-328 PicoROM is a ROM emulator for Spectravideo 328 which uses a Raspberry Pico 2 W microcontroller board to emulate a SVI-328 game ROM cartridge.
Designed to integrate into the conventional cartridge slot of the SVI-328, this cartridge allows wireless transmission of ROM games from macOS/PC to the SVI-328 via Wi-Fi without any hardware modifications.


Repository contents
This repository contains:
- C firmware source code (pico directory) for Raspberry Pi Pico 2 W responsible for dynamic ROM emulation and wireless data transfer.
- PCB design files (pcb directory), including schematics and layouts, developed using KiCad, suitable for fabrication with, for example, PCBWay.
- Node.js JavaScript-based utility (send_rom.js) designed for remote ROM image transmission via WiFi.
- Z80 assembly language code (rom directory) constituting the boot-up ROM launcher, facilitating initial system configuration and operational initialization.
How to get it running quickly
Cartridge hardware
First, create the PCB by ordering it from PCBWay with the Gerber files provided in release/svi-328-picorom-gerber.zip.
Then get a Raspberry Pico 2 W (not the version 1, and make sure you order the Wi-Fi version W) and one atleast +5V diode (DigiKey part number 4878-1N4001CT-ND DIODE GEN PURP 50V 1A DO204AC works, for example).
Solder these together. :)
Cartridge software
Press Pico's BOOTSEL button (the only button on the board, see the board picture above) and while pressing plug it in to your computer via USB.
Then, find the UF2 flash binary file from release/svi-328-picorom.uf2.
Next, flash the Raspberry Pico 2 W by dragging the UF2 file on to the Pico USB drive and wait until Pico disconnects (displays Disk Not Ejected Properly in macOS) and the green LED light turns on to signal that the firmware booted correctly. Finally, remove the USB cable.
Booting up and sending a ROM
Connect the cartridge to SVI-328 and boot it up. (Warning: DO NOT connect anything to the cartridge USB port when it is attached to the SVI-328. This will destroy the cartridge.)

If you didn't flash the Wi-Fi credentials (see section Flashing Wi-Fi credentials to the cartridge), the SVI-328 should ask for your Wi-Fi SSID and password. Please note, that once you store successfully working credentials, there is no way (currently) to remove the stored credentials using SVI-328. You need to use the command line utility described in section Flashing Wi-Fi credentials to the cartridge.
The SVI-328 will remain waiting for a client.

To send a ROM from Windows or macOS, use the send_rom.js to send it. It should display the following information:
node js/send_rom.js Boulder\ Dash-MSX-to-SVI.rom
Waiting for SVI-328 at address 0.0.0.0...
Connecting to SVI-328 at 192.168.1.100...
Connected. Sending ROM upload command...
ROM sent. Listening for logs:After this, the SVI-328 should boot to the sent ROM.
NOTE: Only 32 kB ROM images are supported at the moment.
System prerequisites
The replication and deployment of this project requires the following environment configurations:
- Raspberry Pi Pico SDK installation and associated toolchains.
- Node.js runtime environment for executing the provided WiFi-based ROM transmission scripts.
- KiCad for PCB customization, schematic evaluation, and Gerber file generation.
The build scripts have been developed and tested with macOS Sonoma 14.6.1 and requires the following software to be installed:
- Visual Studio Code 1.98.2 or newer
- Raspberry Pico Visual Studio Code extensions with these instructions
- picotool 2.1.1,
brew install picotoolwith HomeBrew - z88dk version 2.3 (currently only z88dk-z80asm is used)
- openMSX emulator version 20.0 (which should be installed in /Applications/openMSX.app)
- Node.js version 22.12.10 or newer
- Node Version Manager 22.12.0 or newer (it's easier to manage Node versions with this, but you can omit this you install Node.js some other way)
- KiCad version 8.0.6 or newer
SVI-318 compatibility
The hardware will work with SVI-318 and the loader software should also work with it, altough it has not been tested on a real device yet.
Compiling the source code
The launcher ROM source code for SVI-328
The launcher ROM code is in rom directory and you can compile with the following commands:
nvm use
make productionThis will create the ROM binary and the includable rom.h (for the next step) in release directory. Copy the rom.h to pico directory for the next step:
cp release/rom.h ../pico/Raspberry Pico 2 W firmware source code
The Pico firmware source code is located in pico directory and you can compile it by opening the folder in Visual Studio Code. First time, if you have installed the Visual Studio Code extensions, VSCode will install the Pico SDK and then you can click the Compile button in the bottom bar.
If you have the cartridge connected via USB, you can use the Run button to flash the firmware directly to the cartridge. Another option is to get the UF2 file from the build directory, see section How to get it running quickly.
Flashing Wi-Fi credentials to the cartridge
You can flash your Wi-Fi credentials to the cartridge to save some valuable typing time on SVI-328, altough I suggest that you take the time to enjoy the never-seen-before experience to enter SSID and the Password on your Spectravideo 328. :)
Using the example wifi-credentials.config.example, create a wifi-credentials.config to the root of the project. Then connect the cartridge via USB and flash the credentials:
scripts/write_credentials.shTo remove stored credentials, use this command:
scripts/write_credentials.sh --clearOperational framework
Firmware architecture (Raspberry Pi Pico 2 W)
The firmware executed by the Raspberry Pi Pico 2 W addresses two critical operational roles:
-
ROM memory emulation:
The microcontroller interfaces directly with the SVI-328's cartridge slot to emulate ROM data storage. ROM contents are dynamically allocated and retrieved from the internal memory of the Pico.
-
WiFi-Based ROM data transmission:
ROM images are transmitted wirelessly to the Pico via WiFi. A dedicated JavaScript utility (
send_rom.js) facilitates the transfer and concurrently provides logging capabilities for debugging and operational monitoring.
The firmware source comprises:
main.c: Responsible for system initialization, WiFi configuration, and reception and handling of ROM data.wifi.c/h: Manages WiFi connectivity, session handling, and data exchange between the Pico and external hosts.svi-328-cartridge.c/h: Implements the logic necessary for cartridge ROM emulation.log.c/h: Provides logging utilities essential for debugging and real-time data monitoring.
Hardware design and PCB layout
The project hardware consists of a specialized PCB that integrates the Raspberry Pi Pico W and essential connectors for direct communication with the Spectravideo 328:
- Edge Connector: Engineered for direct compatibility with the standard SVI-328 cartridge interface.
- Raspberry Pi Pico W Module: Manages operational logic for ROM emulation and wireless communication protocols.

Communication between SVI-328 and Pico
The Pico-based cartridge presents itself to the SVI-328 as a memory-mapped ROM with additional control registers in the cartridge address space. The SVI-328 accesses the Pico’s “ROM” as if it were a normal cartridge memory, using the address range 0x0000–0x7FFF when the cartridge is enabled. The Pico’s firmware uses the RP2350’s GPIO to monitor the SVI’s address and control lines and to drive or sample the data bus accordingly:
- ROM Data Window (0x0000–0x3FFF): When the SVI reads from the lower 16KB of the cartridge space, the Pico responds with byte data from an emulated ROM. On reset, this window contains the boot loader and launcher code. Later, once a game is loaded, this window is updated to expose the game’s ROM data for the SVI to fetch. The Pico monitors the /CCS1 signal (chip-select for 0x0000–0x3FFF) to detect these accesses and output the correct data bytes from its internal memory buffer.
- Upper ROM Data Window and Control/Status Registers (0x4000–0x7FFF): The upper 16KB of the cartridge space is repurposed as a communication interface. The Pico firmware distinguishes accesses to this range via the /CCS2 signal (chip-select for 0x4000–0x7FFF) and does not treat them as normal ROM reads. Instead, certain addresses in this range act as pseudo-registers for handshaking:
- 0x7FFF – Pico Status Register: Reading from address 0x7FFF returns a state code byte indicating the Pico’s current status (described below). The SVI’s launcher program polls this address to know what the Pico is doing (e.g., waiting for data, busy, ready, etc.).
- To prevent accidental writes, the launcher uses an unlock sequence: the SVI must perform a specific sequence of dummy reads from three “signature” addresses (defined in the firmware) before the Pico will accept writes to 0x7F00–0x7F02.
- 0x7F00 & 0x7F01 – Data Write State Registers: Reading to these addresses allows the SVI to send data to the Pico. In this project, they are used to transmit WiFi credentials (e.g., SSID and password) or other input to the Pico.
- 0x7F02 – Termination Register: Reading address 0x7F02 signals the end of an input string (used to indicate that the full SSID or password has been sent). This lets the Pico know it has received the complete data item.
- 0x7F00 - 0x7FFF Data to be transmitted: Reading these addresses will translate to the bytes sent by SVI to Pico.
Special thanks
This project is based on A8PicoCart, PiCOLECO and learnings from SVI-328 MegaROM.
License
Detailed licensing information is documented within the included LICENSE file.
Parts
3| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | 2x15 pin Spectravideo ROM cartridge edge connector | Spectravideo:ROM cartridge edge connector | J1 |
| 1 | Diode +5V | Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal | D1 |
| 1 | Pico 2 W | Spectravideo:RPi_PicoW_SMD_TH | U1 |
Similar boards
- 2 layers40 × 30 mm

- 2 layers51.9 × 16 mm

Passive2-rpi non standard adapter
hzeller/rpi-rgb-led-matrix
Controlling up to three chains of 64x64, 32x32, 16x32 or similar RGB LED displays using Raspberry Pi GPIO
3 parts4.4kGPL-2.0 - 2 layers16.3 × 16.3 mm

- 2 layers

Sub
atopile/atopile
Design circuit boards with code! ✨ Get software-like design reuse 🚀, validation, version control and collaboration in hardware; starting with electronics ⚡️
3 parts4kMIT - 2 layers85 × 30 mm

- 2 layers124.5 × 33.7 mm

- 2 layers10.5 × 83 mm

- 2 layers21.2 × 51.3 mm

Pico reset
hackclub/sprig
🍃 Learn to code by making games in a JavaScript web-based game editor.
3 parts1.1kMIT
Questions
How big is the SVI-328-PicoROM PCB?
It measures 55 × 79.5 mm and has 2 copper layers, 1.6 mm thick.
What parts does the SVI-328-PicoROM use?
3 parts. 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 SVI-328-PicoROM KiCad files?
From the fitch/SVI-328-PicoROM repository on GitHub, at the commit this page was made from: the board is pcb/SVI-328-PicoROM.kicad_pcb and its schematic pcb/SVI-328-PicoROM.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the SVI-328-PicoROM design in my own project?
Its repository states no licence, so its author keeps all rights: ask fitch before reusing the design.