我一直在为 MOS 6502 开发仿真器,但我似乎无法让 ADC 和 SBC 正常工作。我正在使用在模拟内存中加载到 0x4000 的AllSuiteA 程序测试我的模拟器,对于 test09,我当前的 ADC 和 SBC 实现没有得到正确的标志。我无数次尝试改变他们的算法,但每次,进位标志和溢出标志都足够重要,并导致测试分支/不分支。
memory[0x10000] 是累加器。它存储在内存范围之外,所以我可以有一个单独的寻址开关语句。
这是我对这些功能的实现之一:
case "ADC":
var t = memory[0x10000] + memory[address] + getFlag(flag_carry);
(memory[0x10000] & 0x80) != (t & 0x80) ? setFlag(flag_overflow) : clearFlag(flag_overflow);
signCalc(memory[0x10000]);
zeroCalc(t);
t > 255 ? setFlag(flag_carry) : clearFlag(flag_carry);
memory[0x10000] = t & 0xFF;
break;
case "SBC":
var t = memory[0x10000] - memory[address] - (!getFlag(flag_carry));
(t > 127 || t < -128) ? setFlag(flag_overflow) : clearFlag(flag_overflow);
t >= 0 ? setFlag(flag_carry) : clearFlag(flag_carry);
signCalc(t);
zeroCalc(t);
memory[0x10000] = t & 0xFF;
break;
在这一点上我完全没有想法,但我也遇到了与这里提供的数据相同的问题。 因此,我在这里失败的不仅仅是一个实施计划。