【问题标题】:Determining carry and overflow flag in 6502 emulation in Java?在 Java 中确定 6502 仿真中的进位和溢出标志?
【发布时间】:2013-05-30 21:09:38
【问题描述】:

我正在制作一个 6502 仿真器,但在开始(实现 ADC 操作)时我已经被卡住了(或者我认为至少是卡住了)。问题是我必须确定是否有进位或溢出。问题是,在我的实现中,我无法真正掌握它们之间的区别。我知道进位是在操作后存在第 9 位时,并且我知道当结果大于 255 时会发生溢出。这不是确定进位和溢出标志是一回事吗?

if(result > 255) { 
    carry = 1;
    overflow = 1;
} else { 
    carry = 0; 
    overflow = 0;
}

这不正确吗?如果不是,什么是正确的,为什么?

【问题讨论】:

  • 谢谢。因为暂时没时间细读,所以就略读了一遍,这就是我所了解的。基本上,我对进位的看法是正确的。如果结果高于 255,则有进位。当有加法并且数字为负数时,或者有减法并且数字为正数时,就会出现溢出(当使用 8 位有符号字节时)。这是正确的,还是我错过了什么?无论如何,谢谢,我明天会进一步研究。
  • IMO,如果您没有时间详细阅读它,那么您就没有时间对模拟器进行编程。模拟器就是细节,既繁琐又耗时,没有什么大捷径。
  • 别担心。当我问这个问题并得到你的答复时,就像午夜一样,即我只是在睡觉前浏览了这篇文章。我确实有时间,尤其是因为暑假快到了,但是,是的,我刚刚提到这一点是因为我即将离开电脑。

标签: java emulation flags 6502 carryflag


【解决方案1】:

溢出标志指示数字的符号何时发生不正确的更改。因此,如果将两个正数相加并得到否定结果,则会出现溢出。如果两个负数相加得到正数,也会溢出。

添加两个不同的符号时不会溢出,因为范围不允许。最小的正数加上最大的负数是 0 + (-128),这很合适——0 加上任何适合 8 位的东西显然都适合 8 位。最小的负数加上最大的正数是 -1 + 127 = 126。这很合适。

(编辑:即使有进位,0 + -128 + 1 = -127,适合,-1 + 127 + 1 = 127,适合)

因此,如果两个具有相同符号的输入产生具有不同符号的结果,则会设置溢出。否则就很清楚了。

您可以将其表示为对符号位的简单按位运算。假设你有 a + b = c。

a ^ b

如果符号不同,符号位将有一个 1。你想知道相反的情况。所以:

~(a ^ b)

如果符号相同,则在符号位中给出 1。这是测试的第一部分。假设 a 和 b 具有相同的符号,您可以针对其中任何一个测试 c。这次你确实想测试差异,所以这只是:

a ^ c

您需要在测试的两个部分中设置测试位,因此您可以将它们与二进制和(留下大量括号以链接到口头推理):

(~(a ^ b))&(a ^ c)

你只想要符号位,所以屏蔽掉它:

(~(a ^ b))&(a ^ c)&0x80

如果溢出标志应该被清除,那将评估为0x00,如果应该设置它,则评估为0x80。因此,只需将其转移到位。

(除此之外:尽管在 6502 上设置了许多指令标志并且只有一个公开了状态寄存器,因此仿真器通常以任何方便的形式单独保存标志并根据需要组合状态寄存器,在这种情况下您不会打扰移动和组合,你只需存储结果)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2013-10-18
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多