6502仿真器测试:nestest
6502 emulator testing: nestest
我正在为未来的 NES 模拟器实现我自己的 MOS 6502 cpu 模拟器。我正在使用 nestest 来测试模拟器的正确性。一切似乎都找到了,直到我到达这条线:
如您所见,状态寄存器 (6F) 被压入堆栈。在下一条指令中,它从累加器的堆栈中被拉出。在下一次提取中,日志显示 A:7F。这有意义吗? A不应该是6F吗?
我正在使用这个日志:
http://www.qmtpro.com/~nes/misc/nestest.log
既然来自Nintendulator,我想应该是可靠的。
是我记错了还是这个日志不可靠?
出于更好解释的原因 here and here,PHP
在将状态寄存器推送到堆栈时总是设置 Break 标志。但是,该标志的物理实现方式与我们对其的可视化方式之间存在代表性差异 - 它实际上根本不保存在状态寄存器中,而是呈现为好像它是。
当 6502 执行 PHP
指令时,它会在状态寄存器的值中设置位 4 并写入堆栈 ,但这并没有反映出来作为对状态寄存器本身的实际更改。因此,您的日志显示状态寄存器在 PHP
之后没有变化,但是当您 PLA
那个字节时,它 位 4 设置 。您可以通过使用监视器在 PHP
指令之后中断然后查看堆栈内存区域中的字节 ($01xx).
来亲眼看到这一点
状态寄存器 (P) 的第 5 位(有时称为 R 表示保留)和第 4 位(通常称为 B 表示中断)实际上并不像其他标志那样作为存储位单元存在于硅片中。
R will always be pushed as 1. B is pushed as 1 by a PHP or BRK, and 0 by IRQ and NMI interrupts.
#$6F 只是因为模拟器作者选择在模拟的 P 中保持 B 清晰。
我正在为未来的 NES 模拟器实现我自己的 MOS 6502 cpu 模拟器。我正在使用 nestest 来测试模拟器的正确性。一切似乎都找到了,直到我到达这条线:
如您所见,状态寄存器 (6F) 被压入堆栈。在下一条指令中,它从累加器的堆栈中被拉出。在下一次提取中,日志显示 A:7F。这有意义吗? A不应该是6F吗?
我正在使用这个日志: http://www.qmtpro.com/~nes/misc/nestest.log
既然来自Nintendulator,我想应该是可靠的。
是我记错了还是这个日志不可靠?
出于更好解释的原因 here and here,PHP
在将状态寄存器推送到堆栈时总是设置 Break 标志。但是,该标志的物理实现方式与我们对其的可视化方式之间存在代表性差异 - 它实际上根本不保存在状态寄存器中,而是呈现为好像它是。
当 6502 执行 PHP
指令时,它会在状态寄存器的值中设置位 4 并写入堆栈 ,但这并没有反映出来作为对状态寄存器本身的实际更改。因此,您的日志显示状态寄存器在 PHP
之后没有变化,但是当您 PLA
那个字节时,它 位 4 设置 。您可以通过使用监视器在 PHP
指令之后中断然后查看堆栈内存区域中的字节 ($01xx).
状态寄存器 (P) 的第 5 位(有时称为 R 表示保留)和第 4 位(通常称为 B 表示中断)实际上并不像其他标志那样作为存储位单元存在于硅片中。
R will always be pushed as 1. B is pushed as 1 by a PHP or BRK, and 0 by IRQ and NMI interrupts.
#$6F 只是因为模拟器作者选择在模拟的 P 中保持 B 清晰。