官方页面 frank.rh1.tech 汇集了所有 FRANK 板卡与固件。项目将 Chunhui He 的 Tiny386 移植到 RP2350(Raspberry Pi Pico 2,树莓派 Pico 2),实现完整 i386 CPU 模拟,部分支持 i486、i586,可选 x87 浮点单元,内存最高 8MB。它提供 VGA 与 HDMI 输出,支持文本模式和最高 640x480 图形;音频涵盖 AdLib OPL2、Sound Blaster 16、PC 喇叭等。SD 卡可挂载软盘、硬盘和 CD-ROM 镜像,还能热插拔换盘、调整设置,输入兼容 PS/2、USB 键鼠与 NES 手柄,可启动 DOS、Windows 3.x、Windows 95 和 Linux。
正文
官方页面:frank.rh1.tech —— 所有 FRANK 板卡和固件的中心。
面向 RP2350(Raspberry Pi Pico 2)的 i386 PC 模拟器,带 VGA/HDMI 输出、SD 卡存储、PS/2 和 USB 键鼠、NES 游戏手柄以及音频输出。
基于 Chunhui He 的 Tiny386。
特性
- 完整的 i386(部分 i486/i586)CPU 模拟,可选 x87 FPU
- 最高 8MB RAM(使用 8MB PSRAM)
- VGA 和 HDMI 图形输出(文本模式,以及最高 640x480 的图形)
- 声音:AdLib OPL2、Sound Blaster 16、PC Speaker、Tandy、Covox、Disney Sound Source
- SD 卡支持软盘、硬盘和 CD-ROM 镜像
- 运行时磁盘管理器(Win+F12),可热插拔磁盘镜像
- 设置菜单(Win+F11),可修改模拟器配置
- PS/2 键盘和鼠标输入
- USB 键盘和鼠标输入(通过原生 USB Host)
- NES 游戏手柄支持,带鼠标模拟模式
- 可启动 DOS、Windows 3.x、Windows 95、Linux 等
屏幕截图
FRANK 386 运行中





支持的板卡
该固件面向集成 VGA/HDMI、SD 卡和键盘输入的 RP2350 板卡:
- FRANK —— 带 VGA 输出的多用途开发板
- Murmulator —— 基于 RP Pico 2 的紧凑型复古计算平台(M1 和 M2 版本)
- Olimex PICO-PC —— Olimex 的 RP2350 PC 板
- Waveshare RP2350-PiZero —— Waveshare RP2350 板
硬件要求
- Raspberry Pi Pico 2(RP2350)或兼容板
- 8MB PSRAM(扩展内存必需)
- VGA 或 HDMI 接口
- SD 卡模块(SPI 模式)
- PS/2 键盘(直连)—— 或 —— USB 键盘(通过原生 USB 口)
- 音频输出(可选):I2S DAC 或 PWM
注意: 启用 USB HID 时,原生 USB 口用于键鼠输入,此模式下 USB 串口控制台(CDC)被禁用;调试输出请使用 UART。
板卡配置
支持四种 GPIO 布局:M1、M2、PC(Olimex)和 Z2(Waveshare)。
VGA / HDMI
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | Base | 6 | 12 | | Range | 6-13 | 12-19 |
SD 卡(SPI 模式)
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | CLK | 2 | 6 | | CMD | 3 | 7 | | DAT0 | 4 | 4 | | DAT3/CS | 5 | 5 |
PS/2 键盘
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | CLK | 0 | 2 | | DATA | 1 | 3 |
PS/2 鼠标
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | CLK | 14 | 0 | | DATA | 15 | 1 |
NES/SNES 游戏手柄
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | CLK | 14 | 20 | | DATA | 16 | 26 | | LATCH | 15 | 21 |
I2S 音频
| 信号 | M1 GPIO | M2 GPIO | | --- | --- | --- | | DATA | 26 | 9 | | BCLK | 27 | 10 | | LRCLK | 28 | 11 |
SD 卡设置
目录结构
在 SD 卡上创建 386/ 目录:
config.ini—— 配置文件bios.bin—— SeaBIOS ROM(必需)vgabios.bin—— VGA BIOS ROM(必需)dos622.img—— 硬盘镜像boot.img—— 软盘镜像- 其他磁盘镜像
BIOS 文件
从 SeaBIOS 发布页下载 SeaBIOS 和 VGA BIOS,或使用 sdcard/386 中的 bios.bin/vgabios.bin。
配置文件(config.ini)
创建 386/config.ini:
[pc] 段:mem=8M、bios=bios.bin、vga_bios=vgabios.bin
[frank-386] 段:cpu_freq=504、psram_freq=166
准备磁盘镜像
软盘镜像(.img):
- 标准 1.44MB 软盘镜像(1474560 字节)
- 创建命令:
dd if=/dev/zero of=floppy.img bs=512 count=2880 - 用 DOS 格式化,或使用现成的 DOS 启动盘
硬盘镜像(.img):
- 最大 2GB 的原始磁盘镜像
- 创建命令:
dd if=/dev/zero of=hdd.img bs=1M count=512 - 用 DOS 的 FDISK 和 FORMAT 分区并格式化
CD-ROM 镜像(.iso):
- 标准 ISO 9660 镜像
- 用光盘刻录软件从光盘创建 ISO
加载磁盘镜像
启动时: 按上面的说明在 config.ini 中配置磁盘镜像。
运行时(磁盘管理器):
- 按 Win+F12 打开磁盘管理器
- 用方向键选择驱动器(A:、B:、C:、D:、E:)
- 按 Enter 浏览
386/目录中的磁盘镜像 - 选择镜像文件插入,或弹出当前磁盘
- 按 Escape 关闭磁盘管理器
通过磁盘管理器所做的更改会自动保存到 config.ini。
操作
键盘快捷键
| 快捷键 | 动作 | | --- | --- | | Win+F12 | 打开磁盘管理器 | | Win+F11 | 打开设置菜单 | | Ctrl+Alt+Delete | 系统复位(发送给客户机操作系统) |
设置菜单(Win+F11)
在运行时配置模拟器:
- 内存大小(1-8 MB)
- CPU 代次(386/486/586)
- FPU 模拟开/关
- 声音设备(AdLib、SB16、PC Speaker、Tandy、Covox、MPU-401、DSS)
- PS/2 或 USB 鼠标开/关
- NES 鼠标开/关(用 NES 手柄方向键模拟鼠标,B=左键,A=右键)
- RP2350 CPU 频率和电压
- PSRAM / Flash 频率
设置会保存到 config.ini,重启后生效。
磁盘管理器(Win+F12)
无需重启即可管理磁盘镜像:
- 插入/弹出软盘镜像(A:、B:)
- 插入/弹出硬盘镜像(C:、D:)
- 插入/弹出 CD-ROM 镜像(E:)
构建
前置条件
- 安装 Raspberry Pi Pico SDK(2.0 以上版本)
- 设置环境变量:
export PICO_SDK_PATH=/path/to/pico-sdk - 安装 ARM GCC 工具链
构建步骤
克隆仓库:git clone https://github.com/rh1tech/frank-386.git,然后 cd frank-386
- 默认设置构建(M2 板、378MHz、PS/2 键盘):
./build.sh - 为 M1 板构建:
./build.sh -M1 - 带 USB 键盘支持构建:
./build.sh --usb-hid - 自定义构建:
./build.sh -b M1 -c 504 -p 166 --debug
构建选项(build.sh)
| 选项 | 说明 |
| --- | --- |
| -b, --board <M1|M2|PC|Z2> | 板卡版本(默认:M2) |
| -c, --cpu <MHz> | CPU 速度:378(默认)、504 |
| -p, --psram <MHz> | PSRAM 速度:133(默认)、166 |
| --usb-hid | 启用 USB 键盘(禁用 USB 串口) |
| --hdmi | 强制 HDMI 输出 |
| --debug | 启用调试输出 |
| -clean | 先清理构建目录 |
构建选项(CMake)
| 选项 | 说明 |
| --- | --- |
| -DPICO_BOARD=pico2 | 为 RP2350 构建(默认) |
| -DBOARD=M1 | 使用 M1 GPIO 布局 |
| -DBOARD=M2 | 使用 M2 GPIO 布局(默认) |
| -DBOARD=PC | 使用 Olimex PICO-PC 布局 |
| -DBOARD=Z2 | 使用 Waveshare RP2350-PiZero 布局 |
| -DCPU_SPEED=378 | CPU 时钟,MHz(378、504) |
| -DPSRAM_SPEED=133 | PSRAM 时钟,MHz(133、166) |
| -DUSB_HID_ENABLED=ON | 启用 USB 键盘(禁用 USB 串口) |
| -DDEBUG_ENABLED=ON | 启用详细调试日志 |
| -DFORCE_HDMI=ON | 强制 HDMI 输出 |
发布构建
要构建所有固件版本:./release.sh(交互式,提示输入版本),或 ./release.sh 1.02(带版本号)。
这会在 release/ 目录中生成固件文件:
frank-386_m1_<version>.uf2—— M1 板(Murmulator)frank-386_m2_<version>.uf2—— M2 板(Murmulator)frank-386_pc_<version>.uf2—— Olimex PICO-PCfrank-386_z2_<version>.uf2—— Waveshare RP2350-PiZero
刷写
设备处于 BOOTSEL 模式时:picotool load build/frank-386.uf2,或使用刷写脚本 ./flash.sh。
疑难解答
Windows 95 安装时出现「0 bytes of memory」
使用 setup /im 跳过内存检查。
Windows 95 启动时出现「Protection error」
使用 patcher9x。
启用 mapdrive.com 支持(重定向器),把 SD 卡映射为网络驱动器 H
在 config.ini 中设置 redirector = 1。
键盘无输入
- PS/2:检查键盘连接和 GPIO 引脚
- USB:确认固件是用
--usb-hid选项构建的
检测不到 SD 卡
- 确认 SD 卡格式化为 FAT32
- 检查 SD 卡模块连接
- 确认 SD 卡上存在
386/目录
许可证
MIT 许可证,详见 LICENSE。
作者与贡献者
Mikhail Matveev & DnCraptor
- frank-386 移植与开发(2026)
- 仓库:https://github.com/rh1tech/frank-386
致谢
本项目基于以下开源项目:
Tiny386
- 项目:Tiny386 - x86 PC Emulator
- 作者: Chunhui He
- 许可证: BSD 3-Clause
- 说明: 核心 i386 CPU 模拟器和 PC 外设模拟(8259 PIC、8254 PIT、8042 键盘控制器、VGA、声音设备)。
Pico-286
- 项目:Pico-286
- 作者: xrip
- 许可证: MIT
- 说明: RP2350 平台集成、磁盘管理、VGA 驱动概念。
QuakeGeneric
- 项目:QuakeGeneric
- 作者: DnCraptor
- 许可证: GPL v2
- 说明: RP2350 硬件集成模式、Murmulator 平台支持,以及 PS/2 鼠标驱动实现。
QEMU
- 项目:QEMU
- 作者: Fabrice Bellard(2003-2017)、Vassili Karpov "malc"(2003-2005)、Joachim Henke(2006)
- 许可证: MIT
- 说明: PC 外设模拟代码,包括 8259 PIC、8254 PIT、8257 DMA、8042 键盘控制器、PCI 总线、PC speaker、VGA 和 AdLib OPL2 代理。
MAME FM 声音发生器
- 项目:MAME
- 作者: Tatsuyuki Satoh(1999-2000)
- 许可证: LGPL 2.1+
- 说明: 用于 AdLib 模拟的 FM OPL 声音发生器(fmopl),从 MAME 分支并按 LGPL 重新授权。
inih
- 项目:inih
- 作者: Ben Hoyt(2009-2020)
- 许可证: BSD 3-Clause
- 说明: 用于配置文件处理的简单 INI 解析器。
SeaBIOS
- 项目:SeaBIOS
- 作者: Kevin O'Connor 及贡献者
- 许可证: GNU LGPL v3
- 说明: x86 BIOS 和 VGA BIOS 固件。
FatFs
- 项目:FatFs
- 作者: ChaN(2014、2021)
- 许可证: FatFs License(BSD 风格)
- 说明: 用于 SD 卡访问的通用 FAT 文件系统模块。
FatFs 工具函数
- 作者: Carl John Kugler III(2021)
- 许可证: Apache 2.0
- 说明: 用于错误处理和结果字符串转换的 FatFs 工具函数。
Raspberry Pi Pico SDK
- 项目:Pico SDK
- 作者: Raspberry Pi (Trading) Ltd.(2020)
- 许可证: BSD 3-Clause
- 说明: 用于 SD 卡通信的 PIO SPI 驱动。
评论
社区普遍惊叹于仅用低价微控制器便能模拟带显示与声音的 386 系统,并唤起怀旧情绪;少数人则更关心性能、外设接口和无 MMU 的实现原理。
惊叹廉价 MCU 竟能模拟 386 平台
- 多条评论表达对用灵活 IO 的微控制器(如 RP2350)实现图形与声卡乃至系统模拟的喜爱,认为该芯片被严重低估(认可度:较多人) > 这颗 RP2350 大概是当下最被低估的微控制器了(@cold_pizz4)
追问性能与外设兼容细节
- 不少用户疑惑项目是否公开了运行性能数据,能否模拟串口并口以复活老嵌入式设备,以及缺少 MMU 如何完成系统仿真(认可度:较多人) > 页面上似乎没提到性能表现,我没能找到(@nickcw)
怀旧早年系统与软件收藏
- 多人回忆 Slackware、386BSD、Windows 96 等旧系统,跃跃欲试想验证旧内核或发行版能否运行,并聊起早期光盘包装与软件库(认可度:较多人) > 我以前在 4MB 内存、25MHz 的 386 上用过旧版 Slackware,它应该也能跑(@weinzierl)
有价值的补充
- 有用户指出展示截图实为 EGA 而非 VGA,纠正了常见认知(@momocowcow)
- 历史类比:三十多年前在 386 上模拟 Commodore 64,后来模拟 Amiga,暗示硬件模拟的循环(@guenthert)
- 社区提议可尝试移植到 PicoCalc 或翻出 386bsd 印证,代表趣味探索方向(@jwrallie、@Tepix)