#gameboy #emulator #rom #game #research #bits #gb

app gekkio/mooneye-gb

一个用Rust编写的Game Boy研究项目和模拟器

1个不稳定版本

0.1.0 2015年9月27日

#5#gb

887 个星标 & 30 个关注者

GPL-3.0+

310KB
8K SLoC

Mooneye GB

Mooneye GB是一个用Rust编写的Game Boy研究项目和模拟器。

Build Status

本项目的目标是准确性和文档化。一些现有的模拟器(如Gambatte、BGB >= 1.5)非常准确,但文档不够清晰,因此它们并不是很好的模拟器开发者的参考。我希望这个项目尽可能清楚地记录为什么以某种方式模拟某些行为。这也意味着要编写大量的测试ROM,以了解边缘情况和实际硬件上的精确行为。

有关已知行为的文档,请参阅Game Boy:完整技术参考

正在寻找mooneye-gb测试ROM? 它们现在已成为Mooneye测试套件的一部分。

非目标

  • CGB(Game Boy Color)支持。虽然很好,但我想首先使普通Game Boy的支持非常稳健。
  • 调试器
  • 良好的用户界面。目前使用Rust构建本地UI有些痛苦。

警告:

  • 项目正在进行中
  • 没有启动ROM无法正常工作
  • 模拟器落后于硬件研究。如果我不确定硬件行为,我不愿意花时间在模拟器上做出短命的、可能不正确的修复。

性能

如果您关心性能,请始终以发布模式编译!

在i7-3770K台式机上,我通常可以以2000 - 4000%的速度运行ROM。未经优化的速度降至150 - 200%,这对于开发目的来说仍然足够。

带有X11桌面的树莓派可以工作,但由于没有OpenGL加速,速度太慢。

模拟器可在Android上运行,但交叉编译和打包非常麻烦,而且还需要实现触摸控制,因此目前我不支持Android。

运行模拟器

要求

  • Rust 1.26
  • 您的平台必须安装SDL2开发库

GUI

  1. cargorun --release
  2. 遵循说明

命令行

  1. 获取Game Boy引导程序,并将其放置在 $HOME/.local/share/mooneye-gb/bootroms/dmg_boot.bin
  2. cargo构建 --release
  3. cargorun --release --PATH_TO_GAMEBOY_ROM

在Windows上,还要下载包含SDL2.dll的SDL2包,并将其放置在 target/debugtarget/release

Game Boy按键

Game Boy 按键
Dpad 箭头键
A Z
B X
开始 回车
选择 退格

其他按键

功能 按键
快进 Shift
切换性能覆盖 F2

测试套件

Blargg的测试

测试 mooneye-gb
cpu指令 👍
dmg声音2
指令时序 👍
内存时序2 👍
oam错误2
cgb声音2

注意

  • cpu_instrs在MGB/SGB2硬件和正确模拟它们的模拟器上失败。ROM错误地将设备检测为CGB,并尝试执行CPU速度更改,导致冻结(禁用摇杆的STOP指令)
  • dmg_sound-2测试编号10可能在真实硬件上随机失败,似乎取决于非确定性行为。
  • oam_bug-2在所有CGB、AGB和AGS设备上失败
  • cgb_sound-2测试编号03在CPU CGB、CPU CGB A和CPU CGB B上失败

Mooneye GB验收测试

测试 mooneye-gb
add sp e 时序 👍
boot div dmg0
boot div dmgABCmgb
boot div S
boot div2 S
boot hwio dmg0
boot hwio dmgABCmgb
boot hwio S 👍
boot regs dmg0 👍
boot regs dmgABC 👍
boot regs mgb 👍
boot regs sgb 👍
boot regs sgb2 👍
call 时序 👍
call 时序2 👍
call cc 时序 👍
call cc 时序2 👍
di 时序 GS 👍
div 时序 👍
ei 序列 👍
ei 时序 👍
halt ime0 ei 👍
halt ime0 nointr 时序 👍
halt ime1 时序 👍
halt ime1 时序2 GS 👍
if ie 寄存器 👍
intr 时序 👍
jp 时序 👍
jp cc 时序 👍
ld hl sp e 时序 👍
oam dma_restart 👍
oam dma start 👍
oam dma 时序 👍
pop 时序 👍
push 时序 👍
rapid di ei 👍
ret 时序 👍
ret cc 时序 👍
reti 时序 👍
reti intr 时序 👍
rst 时序 👍

位(内存和寄存器中的不可用位)

测试 mooneye-gb
内存oam 👍
寄存器f 👍
未使用hwio GS 👍

指令

测试 mooneye-gb
daa 👍

中断处理

测试 mooneye-gb
ie push 👍

OAM DMA

测试 mooneye-gb
基本 👍
reg_read 👍
来源 GS 👍

PPU

测试 mooneye-gb
hblank ly scx 时序 GS 👍
intr 1 2 时序 GS 👍
intr 2 0 时序 👍
intr 2 mode0 时序 👍
intr 2 mode3 时序 👍
intr 2 oam ok 时序 👍
intr 2 mode0 时序精灵
lcdon 时序 GS
lcdon 写时序 GS
stat irq 阻塞
stat lyc 开关
vblank stat intr GS 👍

串行

测试 mooneye-gb
boot sclk align dmgABCmgb

定时器

测试 mooneye-gb
div 写 👍
rapid 切换 👍
tim00 div 触发 👍
tim00 👍
tim01 div 触发 👍
tim01  👍
tim10 分区触发 👍
tim10 👍
tim11 分区触发 👍
tim11 👍
tima 重新加载 👍
tima 写入重新加载 👍
tma 写入重新加载 👍

Mooneye GB 模拟器仅测试

MBC1

测试 mooneye-gb
位银行1 👍
位银行2 👍
位模式 👍
位ramg 👍
rom 512kb 👍
rom 1Mb 👍
rom 2Mb 👍
rom 4Mb 👍
rom 8Mb 👍
rom 16Mb 👍
ram 64kb 👍
ram 256kb 👍
多卡rom 8Mb 👍

MBC2

测试 mooneye-gb
位ramg 👍
位romb 👍
位未使用 👍
rom 512kb 👍
rom 1Mb 👍
rom 2Mb 👍
ram 👍

MBC5

测试 mooneye-gb
rom 512kb 👍
rom 1Mb 👍
rom 2Mb 👍
rom 4Mb 👍
rom 8Mb 👍
rom 16Mb 👍
rom 32Mb 👍
rom 64Mb 👍

Mooneye GB 手册测试

测试 mooneye-gb
精灵优先级 👍

Mooneye GB 其他测试

测试 mooneye-gb
引导分区A
引导分区cgb0
引导分区cgbABCDE
引导硬件IO C
引导寄存器A
引导寄存器cgb

测试 mooneye-gb
未使用硬件IO C

PPU

测试 mooneye-gb
垂直空白状态中断C

许可和版权

Mooneye GB 根据 GPLv3+ 许可。版权 (C) 2014-2020 Joonas Javanainen joonas.javanainen@gmail.com

依赖关系

~24-35MB
~580K SLoC