在SBC中溢出标志在6502仿真中溢出后清除溢出标志?

时间:2013-06-07 14:43:26

标签: emulation cpu-registers signed 6502

我已经“完成”模拟我的6502处理器,而我现在正处于测试阶段。作为我的初学者,我已经在这个问题上坚持了几个小时。我正在进行NES测试,它基本上只是一个自制ROM和一个有人制作的日志,并且它说明在通过内存之后每个寄存器中应该有什么值。我被困在一个部分,其中日志显示在立即SBC指令之后溢出标志被清除,即使累加器具有值0x40,并且第一个参数(存储器pc + 1)等于0x41。这意味着0x40 - 0x41应该是0xFF,即-1,这意味着有溢出,对吧?我读了一些关于溢出标志的文章,并指出当一个值太大或太小而无法保存在有符号字节中时会产生溢出,因此溢出到另一侧(即2个8位正数变为8有点负面,反之亦然)。我在想错误的方法吗?这是日志行:

CBC6  E9 41     SBC #$41    A:40 X:AA Y:73 P:E5 

此后的行表明P寄存器已变为0xA4,这意味着进位和溢出标志都被清除。我得到了携带部分,但没有溢出部分。这是下一行,如果关心它:

CBC8  20 62 F9  JSR $F962   A:FF X:AA Y:73 P:A4
顺便说一下;第二行证明了我的观点:A寄存器确实变为0xFF,有符号字节中的0xFF等于256 - 255 = -1 ........

1 个答案:

答案 0 :(得分:2)

正如您所说,如果结果不合适,溢出将用于签名操作。请注意,有符号字节可以保存介于-128和+127之间的值,因此-1非常适合该范围。它已经越过零与签名溢出无关,因为0位于可表示范围的中间。这对于无符号携带来说很有意思。对于溢出,边界位于0x80(-128),这反过来与无符号运算无关。