您好,我正在为 Game Boy 编写模拟器。
我正在努力使用 SUB 指令
SUB a, 0x92
给定a = 0x90
。
我正在做的是:
0x90 + (-0x92)
我使用 2 补码方法进行减法。
-0x92 <=>
2_complement(0x92) <=>
2_complement(10010010) <=>
01101101 + 1 <=>
01101110
所以减法等价于下面的加法:
1001 0000 (0x90)
+0110 1110 (-0x92)
---------
1111 1110 (0xFE)
在这个过程中,没有进位,也没有半进位,所以我不设置标志。而且我认为这是一个错误,因为其他仿真器(例如BGB确实如此。请注意,结果是正确的,只有标志不正确。
所以我想真正的处理器不使用 2 补码方法,因为没有免费的方法来检索进位和半进位。
不过,我可以使用两个补码来模拟带有标志处理的 SUB 指令,还是应该依赖“经典”减法逻辑?