Тестирование эмулятора 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.

Другие вопросы по тегам