#gameboy #emulator #test-framework

save_state

mizu 保存状态机制实现

2 个版本

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

#268模拟器


2 个组件中使用 (通过 mizu-core)

MIT 许可证

14KB
359

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 输出所有音频通道 (默认)
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 相机。
  • 《塞尔达传说:时之笛 DX》(用于打印相册中的图像)。
  • 宝可梦(多个版本)(用于从宝可梦图鉴中打印宝可梦信息)。

按下 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 指令

调试和测试

依赖项

~0.9–1.5MB
~34K SLoC