Official page: frank.rh1.tech — hub for all FRANK boards and firmware.
i386 PC Emulator for RP2350 (Raspberry Pi Pico 2) with VGA/HDMI output, SD card storage, PS/2 and USB keyboard/mouse, NES gamepad, and audio output.
Based on Tiny386 by Chunhui He.

This firmware is designed for RP2350-based boards with integrated VGA/HDMI, SD card, and keyboard input:
Note: When USB HID is enabled, the native USB port is used for keyboard/mouse input. USB serial console (CDC) is disabled in this mode; use UART for debug output.
Four GPIO layouts are supported: M1, M2, PC (Olimex), and Z2 (Waveshare).
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| Base | 6 | 12 |
| Range | 6-13 | 12-19 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 2 | 6 |
| CMD | 3 | 7 |
| DAT0 | 4 | 4 |
| DAT3/CS | 5 | 5 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 0 | 2 |
| DATA | 1 | 3 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 14 | 0 |
| DATA | 15 | 1 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 14 | 20 |
| DATA | 16 | 26 |
| LATCH | 15 | 21 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| DATA | 26 | 9 |
| BCLK | 27 | 10 |
| LRCLK | 28 | 11 |
Create a 386/ directory on your SD card:
SD Card Root/
└── 386/
├── config.ini # Configuration file
├── bios.bin # SeaBIOS ROM (required)
├── vgabios.bin # VGA BIOS ROM (required)
├── dos622.img # Hard disk image
├── boot.img # Floppy image
└── ... # Other disk images
Download SeaBIOS and VGA BIOS from the SeaBIOS releases or use bios.bin/vgabios.bin from sdcard/386.
Create 386/config.ini:
[pc]
mem=8M
bios=bios.bin
vga_bios=vgabios.bin
[frank-386]
cpu_freq=504
psram_freq=166
Floppy Images (.img):
dd if=/dev/zero of=floppy.img bs=512 count=2880Hard Disk Images (.img):
dd if=/dev/zero of=hdd.img bs=1M count=512CD-ROM Images (.iso):
At Boot:
Configure disk images in config.ini as shown above.
At Runtime (Disk Manager):
386/ directoryChanges made via Disk Manager are saved to config.ini automatically.
| Shortcut | Action |
|---|---|
| Win+F12 | Open Disk Manager |
| Win+F11 | Open Settings Menu |
| Ctrl+Alt+Delete | System reset (sent to guest OS) |
Configure emulator settings at runtime:
Settings are saved to config.ini and take effect after restart.
Manage disk images without restarting:
export PICO_SDK_PATH=/path/to/pico-sdk# Clone the repository
git clone https://github.com/rh1tech/frank-386.git
cd frank-386
# Build with default settings (M2 board, 378MHz, PS/2 keyboard)
./build.sh
# Build for M1 board
./build.sh -M1
# Build with USB keyboard support
./build.sh --usb-hid
# Custom build
./build.sh -b M1 -c 504 -p 166 --debug
| Option | Description |
|---|---|
-b, --board <M1|M2|PC|Z2> | Board variant (default: M2) |
-c, --cpu <MHz> | CPU speed: 378 (default), 504 |
-p, --psram <MHz> | PSRAM speed: 133 (default), 166 |
--usb-hid | Enable USB keyboard (disables USB serial) |
--hdmi | Force HDMI output |
--debug | Enable debug output |
-clean | Clean build directory first |
| Option | Description |
|---|---|
-DPICO_BOARD=pico2 | Build for RP2350 (default) |
-DBOARD=M1 | Use M1 GPIO layout |
-DBOARD=M2 | Use M2 GPIO layout (default) |
-DBOARD=PC | Use Olimex PICO-PC layout |
-DBOARD=Z2 | Use Waveshare RP2350-PiZero layout |
-DCPU_SPEED=378 | CPU clock in MHz (378, 504) |
-DPSRAM_SPEED=133 | PSRAM clock in MHz (133, 166) |
-DUSB_HID_ENABLED=ON | Enable USB keyboard (disables USB serial) |
-DDEBUG_ENABLED=ON | Enable verbose debug logging |
-DFORCE_HDMI=ON | Force HDMI output |
To build all firmware variants:
# Interactive (prompts for version)
./release.sh
# With version number
./release.sh 1.02
This creates firmware files in the release/ directory:
frank-386_m1_<version>.uf2 - M1 board (Murmulator)frank-386_m2_<version>.uf2 - M2 board (Murmulator)frank-386_pc_<version>.uf2 - Olimex PICO-PCfrank-386_z2_<version>.uf2 - Waveshare RP2350-PiZero# With device in BOOTSEL mode:
picotool load build/frank-386.uf2
# Or use the flash script:
./flash.sh
Use setup /im to bypass memory check.
Use patcher9x.
Set redirector = 1 in config.ini.
--usb-hid option386/ directory exists on SD cardMIT License. See LICENSE for details.
Mikhail Matveev & DnCraptor
This project is based on the following open-source projects:
Hacker News (1)
C
95.7%
C++
2.5%
Official page: frank.rh1.tech — hub for all FRANK boards and firmware.
i386 PC Emulator for RP2350 (Raspberry Pi Pico 2) with VGA/HDMI output, SD card storage, PS/2 and USB keyboard/mouse, NES gamepad, and audio output.
Based on Tiny386 by Chunhui He.

This firmware is designed for RP2350-based boards with integrated VGA/HDMI, SD card, and keyboard input:
Note: When USB HID is enabled, the native USB port is used for keyboard/mouse input. USB serial console (CDC) is disabled in this mode; use UART for debug output.
Four GPIO layouts are supported: M1, M2, PC (Olimex), and Z2 (Waveshare).
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| Base | 6 | 12 |
| Range | 6-13 | 12-19 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 2 | 6 |
| CMD | 3 | 7 |
| DAT0 | 4 | 4 |
| DAT3/CS | 5 | 5 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 0 | 2 |
| DATA | 1 | 3 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 14 | 0 |
| DATA | 15 | 1 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| CLK | 14 | 20 |
| DATA | 16 | 26 |
| LATCH | 15 | 21 |
| Signal | M1 GPIO | M2 GPIO |
|---|---|---|
| DATA | 26 | 9 |
| BCLK | 27 | 10 |
| LRCLK | 28 | 11 |
Create a 386/ directory on your SD card:
SD Card Root/
└── 386/
├── config.ini # Configuration file
├── bios.bin # SeaBIOS ROM (required)
├── vgabios.bin # VGA BIOS ROM (required)
├── dos622.img # Hard disk image
├── boot.img # Floppy image
└── ... # Other disk images
Download SeaBIOS and VGA BIOS from the SeaBIOS releases or use bios.bin/vgabios.bin from sdcard/386.
Create 386/config.ini:
[pc]
mem=8M
bios=bios.bin
vga_bios=vgabios.bin
[frank-386]
cpu_freq=504
psram_freq=166
Floppy Images (.img):
dd if=/dev/zero of=floppy.img bs=512 count=2880Hard Disk Images (.img):
dd if=/dev/zero of=hdd.img bs=1M count=512CD-ROM Images (.iso):
At Boot:
Configure disk images in config.ini as shown above.
At Runtime (Disk Manager):
386/ directoryChanges made via Disk Manager are saved to config.ini automatically.
| Shortcut | Action |
|---|---|
| Win+F12 | Open Disk Manager |
| Win+F11 | Open Settings Menu |
| Ctrl+Alt+Delete | System reset (sent to guest OS) |
Configure emulator settings at runtime:
Settings are saved to config.ini and take effect after restart.
Manage disk images without restarting:
export PICO_SDK_PATH=/path/to/pico-sdk# Clone the repository
git clone https://github.com/rh1tech/frank-386.git
cd frank-386
# Build with default settings (M2 board, 378MHz, PS/2 keyboard)
./build.sh
# Build for M1 board
./build.sh -M1
# Build with USB keyboard support
./build.sh --usb-hid
# Custom build
./build.sh -b M1 -c 504 -p 166 --debug
| Option | Description |
|---|---|
-b, --board <M1|M2|PC|Z2> | Board variant (default: M2) |
-c, --cpu <MHz> | CPU speed: 378 (default), 504 |
-p, --psram <MHz> | PSRAM speed: 133 (default), 166 |
--usb-hid | Enable USB keyboard (disables USB serial) |
--hdmi | Force HDMI output |
--debug | Enable debug output |
-clean | Clean build directory first |
| Option | Description |
|---|---|
-DPICO_BOARD=pico2 | Build for RP2350 (default) |
-DBOARD=M1 | Use M1 GPIO layout |
-DBOARD=M2 | Use M2 GPIO layout (default) |
-DBOARD=PC | Use Olimex PICO-PC layout |
-DBOARD=Z2 | Use Waveshare RP2350-PiZero layout |
-DCPU_SPEED=378 | CPU clock in MHz (378, 504) |
-DPSRAM_SPEED=133 | PSRAM clock in MHz (133, 166) |
-DUSB_HID_ENABLED=ON | Enable USB keyboard (disables USB serial) |
-DDEBUG_ENABLED=ON | Enable verbose debug logging |
-DFORCE_HDMI=ON | Force HDMI output |
To build all firmware variants:
# Interactive (prompts for version)
./release.sh
# With version number
./release.sh 1.02
This creates firmware files in the release/ directory:
frank-386_m1_<version>.uf2 - M1 board (Murmulator)frank-386_m2_<version>.uf2 - M2 board (Murmulator)frank-386_pc_<version>.uf2 - Olimex PICO-PCfrank-386_z2_<version>.uf2 - Waveshare RP2350-PiZero# With device in BOOTSEL mode:
picotool load build/frank-386.uf2
# Or use the flash script:
./flash.sh
Use setup /im to bypass memory check.
Use patcher9x.
Set redirector = 1 in config.ini.
--usb-hid option386/ directory exists on SD cardMIT License. See LICENSE for details.
Mikhail Matveev & DnCraptor
This project is based on the following open-source projects:
Hacker News (1)
C
95.7%
C++
2.5%