PPU reset logic




RES = NOT(/RES);
RC = RES | RESET_FF;
RESET_FF = RC & NOT(RESCL);

Ну или так:
if (RES) RESET_FF = 1;
if (RESCL) RESET_FF = 0;
RC = RESET_FF;

/RES: input reset pad
RES: internal reset control line
RC: register clear control line
RESCL: clear reset flip/flop
RESET_FF: reset flip/flop

Контрольная линия RC ("очистить регистры") будет активна до тех пор, пока PPU не сгенерирует сигнал RESCL (очистить защелку RESET).
Сделано это для того, чтобы если сигнал сброса возник посреди кадра, то регистры были бы в статусе "сброса" до конца текущего кадра и весь следующий (в H/V логике добавлена специальная задержка).
Это гарантирует что все регистры очистятся правильно и контекст PPU будет снова девственно чистым.

В связи с этим каждая игра NES имет вначале следующий код: 

WAIT_VBLANK1
   LDA PPU_STATUS
   BPL WAIT_VBLANK1 

WAIT_VBLANK2
   LDA PPU_STATUS
   BPL WAIT_VBLANK2

 Это связано как раз с логикой сброса PPU. Необходимо подождать 2 кадра, для того чтобы PPU "стабилизировал" свое внутреннее состояние.



Назад...