Тестирование эмулятора 6502: гнездо - PullRequest
0 голосов
/ 25 августа 2018

Я реализую свой собственный эмулятор процессора MOS 6502 для будущего эмулятора NES. Я использую nesttest для проверки корректности эмулятора. Кажется, все находит, пока я не достигну этой строки:

enter image description here

Как видите, регистр состояния (6F) помещается в стек. В следующей инструкции он вытягивается из стопки в накопителе. В следующей выборке журнал показывает A: 7F. Есть ли в этом смысл? Не должно ли быть 6F?

Я использую этот журнал: http://www.qmtpro.com/~nes/misc/nestest.log

Так как он исходит от Nintendulator, он должен быть надежным, я думаю.

Я ошибаюсь или этот журнал ненадежен?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Биты регистра статуса (P) 5 (иногда называемые R для зарезервированных) и 4 (часто называемые B для прерывания) на самом деле не существуют как сохраненные битовые ячейки в кремнии, как и другие флаги.

R всегда будет выдаваться как 1. B выдвигается как 1 PHP или BRK, а 0 - прерываниями IRQ и NMI .

# $ 6F просто потому, что автор эмулятора решил сохранитьB ясно в эмулируемой P.

0 голосов
/ 26 августа 2018

По причинам, лучше объясненным здесь и здесь , PHP всегда устанавливает флаг Break , когда он переносит регистр состояния в стек. Тем не менее, существует репрезентативная разница между тем, как этот флаг физически реализован, и тем, как мы его визуализируем - на самом деле он вообще не хранится в регистре состояния, а представляется так, как будто он есть.

Когда 6502 выполняет инструкцию PHP, он устанавливает бит 4 в значении регистра состояния, который записывается в стек , но это не отражается как фактическое изменение в регистре состояния сам. Таким образом, ваш журнал показывает регистр состояния как неизмененный после PHP, но когда вы PLA этот байт, он имеет бит 4, установленный . Вы можете убедиться в этом сами, используя свой монитор для прерывания после инструкции PHP, а затем посмотрите на байт в области памяти стека ($ 01xx).

...