【问题标题】:Overflow flag cleared after SBC with overflow in 6502 emulation?SBC 后溢出标志在 6502 仿真中溢出?
【发布时间】:2013-06-07 14:43:25
【问题描述】:

我已经“完成”了对 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........

【问题讨论】:

    标签: emulation cpu-registers signed 6502


    【解决方案1】:

    正如您所说的那样,如果结果不合适,则溢出适用于签名操作。请注意,有符号字节可以保存 -128 和 +127 之间的值,因此 -1 非常适合该范围。它已经越过零与有符号溢出无关,因为 0 在可表示范围的中间。它只对未签名的进位感兴趣。对于溢出,边界在 0x80 (-128),而这又与无符号操作无关。

    【讨论】:

    • 我可能会使用更广泛的有符号数据类型,例如整数。然后很容易检查(模拟)有符号和无符号溢出。
    • 是的,我想我会的。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多