Peanut-GB 是一个基于 GameBoy 模拟器的单文件头 Game Boy 模拟器库。目的是制作一个高速且可移植的 Game Boy (DMG) 仿真器库,可用于任何具有 C99 编译器的平台。
这个模拟器速度非常快。以至于它可以在 Raspberry Pi Pico 上全速运行!查看 BENCHMARK.md 了解 Peanut-GB 的基准测试。
目前仅支持原始 Game Boy (DMG),但支持 Game Boy Color 的初步工作已经完成(请参阅#50)。
该模拟器仍在开发中,可能不准确(尽管它确实通过了 Blargg 的 CPU 指令和指令计时测试)。因此,某些游戏可能无法正常运行或根本无法运行。如果准确性很重要,请寻找替代模拟器。
花生_sdl.c 中给出了旗舰示例实现,它使用 SDL2 绘制屏幕并接受输入。在./examples/sdl2/文件夹中运行cmake
或make
进行编译。
运行peanut-sdl
,它会创建一个拖放区窗口,您可以将 ROM 文件拖放到其中。或者,使用peanut-sdl game.gb
在终端中运行,如果找不到游戏,它将自动创建游戏的保存文件game.sav
。或者,运行peanut-sdl game.gb save.sav
来指定保存文件。
注意:此处显示的动画 GIF 仅限于 50 fps,而仿真则以本机 ~60 fps 运行。这是因为流行的 GIF 解码器将最大 FPS 限制为 50。
行动 | 键盘 | 手柄 |
---|---|---|
一个 | z | 一个 |
乙 | x | 乙 |
开始 | 返回 | 开始 |
选择 | 退格键 | 后退 |
方向键 | 方向键 | DPAD |
重复A | 一个 | |
重复B | s | |
正常速度 | 1 | |
涡轮 x2(保持) | 空间 | |
Turbo X2(切换) | 2 | |
Turbo X3(切换) | 3 | |
Turbo X4(切换) | 4 | |
重置 | r | |
改变调色板 | p | |
重置调色板 | Shift + p | |
全屏 | F11/f | |
跳帧(切换) | 哦 | |
隔行扫描(切换) | 我 | |
转储 BMP(切换) | 乙 |
默认情况下,跳帧和隔行扫描模式均处于关闭状态。 Frameskip 在 60 FPS 和 30 FPS 之间切换。
按“b”会将每个帧转储为当前文件夹中的 24 位位图文件。请参阅 /screencaps/README.md 了解更多信息。
以下项目使用 Peanut-GB,排名不分先后,且并非详尽无遗。
函数原型的文档可以在花生_gb.h 的底部找到。
前端实现必须向库提供许多函数。这些函数在调用 gb_init 时设置。
可以定义以下可选函数以实现更多功能。
LCD绘图需要此功能。使用 gb_init_lcd 设置此函数,并通过在包含花生_gb.h 之前将 ENABLE_LCD 定义为 1 来启用 Peanut-GB 中的 LCD 功能。如果之前未定义,ENABLE_LCD 默认设置为 1。如果未调用 gb_init_lcd 或 lcd_draw_line 设置为 NULL,则禁用 LCD 绘制。
发送到 lcd_draw_line 的像素数据带有阴影和图层数据。前两个最低有效位是阴影数据(黑色、深色、浅色、白色)。位 4 和位 5 是图层数据(OBJ0、OBJ1、BG),可用于向游戏添加更多颜色,就像 Game Boy Color 对旧版 Game Boy 游戏所做的那样。
这些功能是音频仿真和输出所必需的。 Peanut-GB 不包含音频仿真,因此必须使用外部库。在包含花生_gb.h 之前,必须定义这些函数,并且必须通过将 ENABLE_SOUND 定义为 1 来启用音频输出。
这些功能是串行通信所必需的。使用 gb_init_serial 设置这些函数。如果未设置这些功能,则仿真将如同未连接链路电缆一样运行。
这些功能由 Peanut-GB 提供。
此功能会重置正在玩的游戏,就像控制台已关闭然后再打开一样。 gb_reset由gb_init调用来初始化CPU寄存器。
此函数返回正在玩的游戏的保存大小。如果游戏不使用任何保存数据,则此函数返回 0。
此函数运行 CPU,直到将全帧渲染到 LCD 上。
该函数计算游戏标题的哈希值。该哈希值的计算方式与 Game Boy Color 相同,为 Game Boy 游戏添加颜色。
该函数返回游戏的名称。
设置实时时钟 (RTC) 的时间。有些游戏使用此 RTC 数据。
已弃用:不使用。 RTC 在内部勾选。
重置时执行 bootrom 映像。调用 gb_set_bootrom 后必须执行重置才能使这些更改生效。这是因为gb_init调用了gb_reset,但是gb_set_bootrom必须在gb_init之后调用。 bootrom 必须是 DMG 或 MGB bootrom。
该项目已获得 MIT 许可证的许可。