Тестирование эмулятора 6502: гнездо
Я реализую свой собственный эмулятор процессора MOS 6502 для будущего эмулятора NES. Я использую nesttest для проверки корректности эмулятора. Кажется, все находит, пока я не достигну этой строки:
Как вы можете видеть, регистр состояния (6F) помещается в стек. В следующей инструкции он вытягивается из стопки в накопителе. В следующей выборке журнал показывает A: 7F. Есть ли в этом смысл? Не должно ли быть 6F?
Я использую этот журнал: http://www.qmtpro.com/~nes/misc/nestest.log
Думаю, поскольку он исходит от Nintendulator, он должен быть надежным.
Я ошибаюсь или этот журнал ненадежен?
2 ответа
По причинам, лучше объясненным здесь и здесь, PHP
всегда устанавливает флаг прерывания, когда он помещает регистр состояния в стек. Тем не менее, существует репрезентативная разница между тем, как этот флаг физически реализован, и тем, как мы его визуализируем - на самом деле он вообще не хранится в регистре состояния, а представляется так, как будто он есть.
Когда 6502 выполняет PHP
команда устанавливает бит 4 в значении регистра состояния, который записывается в стек, но это не отражается как фактическое изменение самого регистра состояния. Таким образом, ваш журнал показывает регистр статуса как неизменный после PHP
, но когда ты PLA
этот байт имеет бит 4. Вы можете убедиться в этом сами, используя свой монитор, чтобы сломать после PHP
инструкции, а затем взгляните на байт в области памяти стека ($01xx).
Биты регистра статуса (P) 5 (иногда называемые R для зарезервированных) и 4 (часто называемые B для прерывания) на самом деле не существуют как сохраненные битовые ячейки в кремнии, как и другие флаги.
R всегда будет выдаваться как 1. B выдвигается как 1 PHP или BRK, а 0 прерываниями IRQ и NMI.
#$6F просто потому, что автор эмулятора решил оставить B чистым в эмулируемом P.