logo
0
0
WeChat Login
fyf<fyf@mail.com>
Add README

CHIP-8 模拟器

一个使用 Rust 编写的 CHIP-8 解释器/模拟器。

简介

CHIP-8 是一种解释型编程语言,最初由 Joseph Weisbecker 于 1970 年代中期开发,用于在 COSMAC VIP 和 Telmac 1800 等 8 位微型计算机上运行。本项目实现了一个完整的 CHIP-8 模拟器,可以运行经典的 CHIP-8 游戏和程序。

功能特性

  • ✅ 完整的 CHIP-8 指令集实现(35 条指令)
  • ✅ 64×32 像素单色显示(16 倍窗口缩放)
  • ✅ 16 个按键的键盘输入支持
  • ✅ 延迟定时器和声音定时器
  • ✅ 4KB 内存模拟
  • ✅ 16 个 8 位通用寄存器
  • ✅ 60 FPS 刷新率

系统要求

  • Rust 1.75+ (Edition 2024)
  • 支持图形显示的操作系统(Windows/Linux/macOS)

依赖

依赖库版本用途
rand0.8生成随机数(用于 Cxkk 指令)
minifb0.24窗口显示和键盘输入

安装与运行

编译项目

# 克隆项目 git clone <repository-url> cd chip8 # 编译 cargo build --release

运行模拟器

cargo run --release

默认会加载 roms/Tetris [Fran Dachille, 1991].ch8,你可以在 src/main.rs 中修改要加载的 ROM 文件路径。

键盘映射

CHIP-8 使用 16 个按键(0-F),映射到现代键盘如下:

CHIP-8 键盘 现代键盘 +-+-+-+-+ +-+-+-+-+ |1|2|3|C| |1|2|3|4| +-+-+-+-+ +-+-+-+-+ |4|5|6|D| |Q|W|E|R| +-+-+-+-+ --> +-+-+-+-+ |7|8|9|E| |A|S|D|F| +-+-+-+-+ +-+-+-+-+ |A|0|B|F| |Z|X|C|V| +-+-+-+-+ +-+-+-+-+

Escape 键退出模拟器。

包含的 ROM

项目 roms/ 目录下包含多个经典 CHIP-8 游戏和演示程序:

ROM 名称类型
Tetris游戏
Space Invaders游戏
Pong游戏
Breakout游戏
Brix游戏
Maze演示
IBM Logo测试
Keypad Test测试
Delay Timer Test测试

技术实现

内存布局

+---------------+= 0xFFF (4095) 内存结束 | | | | | 程序/数据空间 | | | | | +---------------+= 0x200 (512) 程序起始地址 | 系统预留区域 | +---------------+= 0x050 (80) 字体数据 | 解释器区域 | +---------------+= 0x000 (0) 内存起始

CPU 寄存器

  • V0-VF: 16 个 8 位通用寄存器(VF 用作标志寄存器)
  • I: 16 位索引寄存器
  • PC: 程序计数器
  • SP: 栈指针
  • DT: 延迟定时器
  • ST: 声音定时器

已实现的指令

操作码说明
00E0清屏
00EE从子程序返回
1NNN跳转到地址 NNN
2NNN调用子程序
3XNN如果 VX == NN 则跳过
4XNN如果 VX != NN 则跳过
5XY0如果 VX == VY 则跳过
6XNN设置 VX = NN
7XNN设置 VX = VX + NN
8XY0设置 VX = VY
8XY1设置 VX = VX OR VY
8XY2设置 VX = VX AND VY
8XY3设置 VX = VX XOR VY
8XY4设置 VX = VX + VY(带进位)
8XY5设置 VX = VX - VY(带借位)
8XY6设置 VX = VX >> 1
8XY7设置 VX = VY - VX(带借位)
8XYE设置 VX = VX << 1
9XY0如果 VX != VY 则跳过
ANNN设置 I = NNN
BNNN跳转到 V0 + NNN
CXNN设置 VX = 随机数 AND NN
DXYN绘制精灵
EX9E如果按键 VX 被按下则跳过
EXA1如果按键 VX 未被按下则跳过
FX07设置 VX = 延迟定时器
FX0A等待按键按下
FX15设置延迟定时器 = VX
FX18设置声音定时器 = VX
FX1E设置 I = I + VX
FX29设置 I = 字符 VX 的精灵地址
FX33存储 BCD 表示
FX55存储 V0-VX 到内存
FX65从内存加载 V0-VX

参考资料

许可证

MIT License