我想首先提出我的问题,首先说我是一位经验丰富的程序员,特别是Java已经使用了8年.
我决定,为了提高我对硬件操作和操作系统主题的理解,编写一个简单的Gameboy模拟器.在几天内编写了核心功能后,我测试了模拟器,发现屏幕上没有任何内容.在我的模拟器中逐步执行几百个操作码并将其与BGB模拟器中的值进行比较后,我意识到所讨论的图块和精灵正被加载到内存中,而不是被绘制.从这一点我发现问题必须在我的一个或多个操作码实现中导致程序在某些时候表现出错误的行为.因此,我决定使用Blargg的cpu测试roms(http://gbdev.gg8.se/files/roms/blargg-gb-tests/)来帮助我解决这个问题.但是,运行第一个测试rom,会出现以下错误消息:
01-special
36E1FE30
DAA
Failed #6
Run Code Online (Sandbox Code Playgroud)
我已多次检查DAA操作,它似乎正确地实现了我.给出的错误代码("36E1FE30")完全没有用,因为我似乎无法找到这意味着什么.对我来说,这意味着DAA未正确实现,我只是看不到我的错误,或者用于验证DAA正确性的操作之一是不正确的.如果我运行任何其他测试,它们似乎无限循环
03-op sp,hl
03-op sp,hl
03-op sp,hl
03-op sp,hl
Run Code Online (Sandbox Code Playgroud)
作为参考,我的DAA实现在github上(https://github.com/qkmaxware/GBemu/blob/master/src/gameboy/cpu/Opcodes.java)或者如下所示:
Op DAA = new Op(0x27, "DAA", map, () -> {
int a = reg.a();
if(!reg.subtract()){
if(reg.halfcarry() || (a & 0xF) > 9)
a += 0x06;
if(reg.carry() || a > 0x9F)
a += 0x60;
}else{
if(reg.halfcarry())
a = (a - 0x6) & 0xFF;
if(reg.carry())
a = (a - 0x60) & 0xFF;
}
reg.a(a);
reg.zero(isZero(a));
reg.carry((a & 0x100) == 0x100);
reg.halfcarry(false); …Run Code Online (Sandbox Code Playgroud)