1个不稳定版本
0.1.0 | 2015年9月27日 |
---|
#5 在 #gb
887 个星标 & 30 个关注者
310KB
8K SLoC
Mooneye GB
Mooneye GB是一个用Rust编写的Game Boy研究项目和模拟器。
本项目的目标是准确性和文档化。一些现有的模拟器(如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
cargorun --release
- 遵循说明
命令行
- 获取Game Boy引导程序,并将其放置在
$HOME/.local/share/mooneye-gb/bootroms/dmg_boot.bin
cargo构建 --release
cargorun --release --PATH_TO_GAMEBOY_ROM
在Windows上,还要下载包含SDL2.dll的SDL2包,并将其放置在 target/debug
和 target/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