Основная теория эмуляции NES - я застрял - PullRequest
6 голосов
/ 08 июля 2010

Заранее прошу прощения за открытость и общую слабость этого вопроса, потому что, честно говоря, мое знание темы очень неоднозначно, и мне трудно даже описать мою проблему. Я действительно не хотел оставлять сообщения, но я полностью застрял.

Я запустил эмулятор NES. Это интерпретируется (поэтому без динамического перекомпоновки).

АТМ может загружать и отображать roms (mapper 0 roms) и выполнять код инициализации вплоть до того места, где мне приходится иметь дело с прерываниями и PPU. Вот где я застрял.

Вот пример выходных данных из моего emu atm. Выполнение начинается в 8000, и я нахожусь на бесконечном цикле в 800a, где я понятия не имею, как продвигаться оттуда.

8002: LDA #$10    ; read immediate value to set PPU control registers 
8004: STA $2000   ; store value 
8007: LDX #$FF    ; load immediate value into X register 
8009: TXS         ; store X register into stack 
800a: LDA $2002   ; read PPU flags into accumulator (set N flag based on bit 7) 
800d: BPL         ; test N flag, branch to 800a if not positive, (N is set) 
800a: LDA $2002
800d: BPL
800a: LDA $2002
800d: BPL
800a: LDA $2002
800d: BPL
etc, etc etc (inf loop)

Итак, мой вопрос, может ли кто-нибудь объяснить, пожалуйста, основы 1 итерации по рендеру PPU для меня, включая такие вещи, как счетчик циклов, прерывания и т. Д. (Т. Е. Нарисуйте один весь экран 240 строк развертки и перейдите на рядом).

1 Ответ

1 голос
/ 08 июля 2010

Там есть эмуляторы, вы смотрели на их источники для ответа? как правило, они написаны для повышения производительности и не очень читабельны, но вы можете найти небольшой кусочек, чтобы начать работу. код ожидает выполнения прерывания и выполнили ли вы это прерывание? Может быть, прерывание изменяет адрес возврата и позволяет программе продолжаться? бесконечный цикл опроса немного в регистре? или это безусловная ветвь для себя?

...