#gameboy #emulator

save_state_derive

mizu 中保存状态机制的 proc macro 实现

2 个版本

0.1.1 2022 年 5 月 27 日
0.1.0 2021 年 5 月 17 日

#55 in #gameboy


用于 3 个 crate(通过 save_state

MIT 许可证

26KB
626

Mizu

Build status codecov crate.io dependency status

Mizu 是一个使用 Rust 编写的准确 Gameboy 仿真器。

特性

  • 仿真原始 gameboy(DMG)和 gameboy color 硬件。
  • 通过大多数硬件测试(见 TESTING.md)。
  • 更好的保存支持。
  • 控制 SRAM 保存文件,并能够禁用 SRAM 保存。
  • MBC3 映射器精确的 RTC 仿真。
  • 带有 48KHz 音频的精确 APU 仿真。
  • SFML 图形用户界面。
  • 强大的测试框架,用于持续测试。
  • 轻松更改仿真速度。
  • 功能映射器
    • NoMapper
    • MBC1
    • MBC2
    • MBC3
    • MBC5
  • 打印机仿真
  • 保存状态

控制

SFML 前端提供以下键盘绑定

Gameboy

Gameboy
J B
K A
U Select
I Start
W
S
A
D

额外

功能
Enter A+B+Select+Start*
+ 增加 5 到 FPS**
- 从 FPS 减去 5**
P 打开打印机
(NUM1~NUM0) 保存状态
Shift + (NUM1~NUM0) 加载状态
C 输出 All 音频通道(默认)
V 只输出 Pulse1 音频通道
B 只输出 Pulse2 音频通道
N 只输出 Wave 音频通道
M 只输出 Noise 音频通道

* 我创建这个功能是因为在 Zelda: Link's awakening 中,需要在同一帧上按这些按钮来打开保存菜单,这很烦人。

** 这里的 FPS 与正常游戏的 FPS 不同,低 FPS 只会使游戏卡顿,这里的 FPS 控制仿真速度。通常它会以 60 FPS 运行。如果用户将 FPS 设置为 30,则仿真速度减半,包括音频和 CPU 仿真。

打印机窗口键

功能
C 清除当前图像缓冲区
S 将图像缓冲区保存到文件

打印机

Gameboy 打印机是一种串行设备,可以连接到 gameboy,并被一些卡带用于打印图像。使用它的流行卡带包括

  • Gameboy Camera。
  • Zelda: Link's Awakening DX(用于从相册打印图像)。
  • Pokemon(几个版本)(用于从口袋妖怪图鉴打印口袋妖怪信息)。

通过按 P 键可以打开打印机。

打印机仿真允许将打印的图像保存到磁盘。窗口只会显示 160x144 像素,但图像可以滚动。

保存状态

保存状态是仿真器应具备的非常有用的功能,它允许在任何时间点保存整个仿真器的状态,并在以后任何时候加载。 mizu 的保存状态文件保存在这些文件夹中

Linux:   /home/<user>/.local/share/mizu/saved_states
Windows: C:\Users\<user>\AppData\Local\Amjad50\Mizu\data\saved_states
macOS:   /Users/<user>/Library/Application Support/Amjad50.Mizu/saved_states

保存文件的版本结构为 2

偏移量 大小 字段
0x00 4 MAGIC: "MST\xee" (4D 53 54 EE)
0x04 8 保存状态文件版本
0x0C 32 卡带 sha256 哈希
0x2C 变量 zstd 默认压缩级别压缩的保存状态

文件版本之间没有迁移(除了从 12),这意味着从仿真器旧版本保存的文件将无法在仿真器的新版本中加载。(如果您有任何关于如何实现这一点的建议,欢迎您提交PR。)

使用 hash 确保我们正在加载同一款游戏。

zstd 压缩出现在版本 2 中,这也是我们可以通过解压缩加载版本 s 的原因。压缩内容是通过使用 save_state 库获得的。

构建和安装

为了安装或构建 mizu,我们将使用 cargo

构建

如果您想使用 mizu 的开发版本,您可以自己构建项目。下载/克隆存储库后,可以使用以下命令进行构建:

$ cargo build

使用发布选项

$ cargo build --release

安装

如果您想使用来自 crates.io 的最新稳定版本

$ cargo install mizu

另一个Gameboy仿真器?

为什么不呢?它既有趣又有教育意义,尽管我计划尽可能使其精确。如果您想查看酷炫的仿真器,请查看我以前的工作 Plastic

参考资料

通用Gameboy

CPU指令

调试和测试

依赖项

~1.5MB
~35K SLoC