smparsons/retroboy

一个用 Rust 编写的 Game Boy 模拟器。你可以在 Web 上玩它。点击这里尝试

简介

Retro Boy 是一个使用 Rust 编写的、周期精确的 Game Boy 模拟器。它使用 wasm-pack 将 Rust 代码转换为 WebAssembly,使其可以在 Web 上运行。Web 前端使用 Web Audio API 和 HTML Canvas 来处理音频和图形。它还利用浏览器的本地存储来持久化卡带 RAM 数据,以支持带电池的 MBC 卡带。

功能

如何编译为 WebAssembly

要将实现编译为 WebAssembly,你需要先使用命令 cargo install wasm-pack 安装 wasm-pack(如果尚未安装)。然后,运行 sh ./build-wasm.sh 来构建核心项目,并在 Web 前端目录中生成 JavaScript 绑定代码。

Web 前端

此模拟器的 Web 前端是一个使用 Material UI 设计的 React/TypeScript 应用程序,位于 frontends/web 文件夹中。UI 提供了加载 ROM 以及播放、暂停或重置模拟器的功能。它还提供了一个全屏模式。

要运行 Web 前端:

  1. 如“如何编译为 WebAssembly”部分所述,将 Rust 代码编译为 WebAssembly 并生成 JavaScript 绑定代码。
  2. 生成绑定代码后,它将被添加到 frontends/web/src/core 目录。
  3. frontends/web 目录中运行 yarn install 以安装所有依赖项。
  4. 在同一目录中运行 yarn start 以在本地运行应用程序。

截图

测试 ROM

此模拟器通过了 Blargg 测试 ROM 集合中的以下测试套件:

  1. CPU 指令测试
  2. CPU 指令时序测试
  3. 内存时序测试
  4. 内存时序测试 2
  5. 中断时序测试 (CGB)
  6. APU 测试 (DMG)
  7. APU 测试 (CGB)

此外,此模拟器通过了所有 JSON CPU tests,以及来自 Mooneye test ROM collection 的部分测试。

测试套件

该项目包含一个相当广泛的测试套件,因为大部分逻辑都是使用 TDD 方法设计的。有很多测试用于执行 CPU 操作码,以及执行 GPU 的基本测试。运行 cargo test 来运行测试套件。

有用的资源

为了方便起见,以下是我用于构建此模拟器的资源列表:

  1. Gameboy CPU Manual
  2. Pan Docs
  3. Blargg's Test ROM Collection
  4. Gameboy Doctor
  5. Imran Nazar's Gameboy Emulator Tutorial