Hacker News 中文摘要

RSS订阅

为 RP2350 打造的 386 PC -- A 386 PC for Your RP2350

官方页面 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 运行中

FRANK 386 运行截图 1

FRANK 386 运行截图 2

FRANK 386 运行截图 3

FRANK 386 运行截图 4

FRANK 386 运行截图 5

支持的板卡

该固件面向集成 VGA/HDMI、SD 卡和键盘输入的 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 中配置磁盘镜像。

运行时(磁盘管理器):

  1. 按 Win+F12 打开磁盘管理器
  2. 用方向键选择驱动器(A:、B:、C:、D:、E:)
  3. 按 Enter 浏览 386/ 目录中的磁盘镜像
  4. 选择镜像文件插入,或弹出当前磁盘
  5. 按 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:)

构建

前置条件

  1. 安装 Raspberry Pi Pico SDK(2.0 以上版本)
  2. 设置环境变量:export PICO_SDK_PATH=/path/to/pico-sdk
  3. 安装 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-PC
  • frank-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

致谢

本项目基于以下开源项目:

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)