本项目使用 Rust 模拟 Intel 8080 CPU,加载并执行《太空侵略者》(Space Invaders)的原版街机 ROM。CPU 的寄存器、指令执行、标志位、栈和中断由 Rust 代码模拟,游戏逻辑由 ROM 中的机器码驱动。
除了 CPU,项目还实现了游戏所需的 ROM、工作内存、显存映射和部分输入端口,并通过 minifb 显示画面、采集键盘输入。
开发本项目目的是学习 CPU 如何执行指令,以及模拟器如何把内存、输入输出和画面更新连接起来。
Intel 8080 是一款 8 位处理器,使用 16 位地址寻址。项目中的 CPU 每次从程序计数器 PC 指向的位置读取指令,执行后更新寄存器、标志位或内存,并返回该指令消耗的时钟周期。
游戏主循环累计执行周期并请求中断,随后把显存内容转换为窗口像素。一次画面更新之间会执行多条 CPU 指令。键盘状态在刷新时采样,再通过输入端口供 ROM 读取,支持同时按住方向键和开火键。
| 模块 | 作用 |
|---|---|
| CPU | 模拟 8080 的寄存器、数据传送、算术与逻辑运算、跳转、调用、栈操作及中断 |
| 内存 | 为 CPU 提供统一的地址访问接口,区分 ROM、工作 RAM 和显存 |
| 游戏输入 | 将投币、开始、移动和开火按键组合为端口中的状态位 |
| 显示 | 将显存中的单色位图转换为 224 × 256 画面,默认以 2 倍大小显示 |
在项目根目录执行:
cargo run --release也可以先构建,再运行可执行文件:
cargo build --release启动后会进入演示画面。先按一下 C 并松开投币,再按 Enter 开始单人游戏。
| 按键 | 操作 |
|---|---|
| C | 投币 |
| Enter | 开始单人游戏 |
| ← / → | 左右移动 |
| Space | 开火 |
方向键和开火键可以同时按下。需要结束程序时,可在启动它的终端按 Ctrl+C。
编译时需要 res/ 中的四个 ROM 文件,每个文件为 2 KiB。运行时,程序将内嵌的 ROM 数据映射到以下地址:
| 地址范围 | 内容 |
|---|---|
0x0000–0x07FF |
res/invaders.h |
0x0800–0x0FFF |
res/invaders.g |
0x1000–0x17FF |
res/invaders.f |
0x1800–0x1FFF |
res/invaders.e |
0x2000–0x23FF |
工作 RAM,1 KiB |
0x2400–0x3FFF |
显存,7 KiB |
src/
├── cpu/ # Intel 8080 指令、寄存器和 I/O 接口
├── memory/ # 地址总线、ROM、工作 RAM 和显存
├── game/invaders/ # 游戏主循环、内存映射、输入及窗口显示
├── util/ # 数值处理工具
├── lib.rs # 导出 CPU 和内存接口
└── main.rs # 游戏启动入口
res/ # 游戏 ROM
resource/ # README 使用的截图
