Как работают таймеры GPU/PPU на Gameboy?

Я пишу эмулятор gameboy и пришел к реализации графики. Однако я не могу понять, как он работает с процессором, когда идут циклы синхронизации. Выполняет ли процессор определенное количество циклов (если так, сколько), а затем передает его в графический процессор? Или gameboy всегда находится в состоянии hblank/vblank и GPU использует процессор между ними? Я не могу найти никакой информации, которая помогает мне в этом, только как использовать контрольные регистры.

2 ответа

На этот вопрос ответили по адресу https://forums.nesdev.com/viewtopic.php?f=20&t=17754&p=225009.

Оказывается, я совершенно не прав, и они совершенно разные.

Вот этот пост:

Процессор Game Boy и PPU работают параллельно. Основные тактовые частоты 4,2 МГц также являются точечными часами. Он делится на 2, чтобы сформировать тактовую частоту доступа к памяти PPU 2,1 МГц, и делится на 4, чтобы сформировать многофазную тактовую частоту 1,05 МГц, используемую процессором.

Длина каждой строки сканирования составляет 456 точек (114 циклов ЦП) и состоит из режима 2 (поиск OAM), режима 3 (активное изображение) и режима 0 (горизонтальное гашение). Режим 2 имеет длину 80 точек (2 для каждой записи OAM), режим 3 - около 168 плюс еще около 10 для каждого спрайта в данной строке, а режим 0 - остальное. После прорисовки 144 линий сканирования получаются 10 строк режима 1 (вертикальное гашение), всего 154 строки или 70224 точки на экран. Процессор не может видеть VRAM (записи игнорируются, а чтения - $FF) в режиме 3, но он может это делать в других режимах. Процессор не может видеть OAM в режимах 2 и 3, но он может видеть в режимах гашения (0 и 1).

Ссылка дает больше общего ответа вместо специфики реализации, поэтому я хочу дать свои 2 цента.

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

Например, некоторые инструкции процессора читают и записывают память как часть одной инструкции. Это означает, что для выполнения инструкции потребуется Gameboy CPU 4 (чтение) + 4 (запись) цикла. Итак, в эмуляторе вы выполняете чтение, передаете 4 цикла в GPU, делаете запись, передаете 4 цикла в GPU. Вы делаете то же самое для других компонентов, которые работают параллельно с процессором, как таймеры и звук.

На самом деле важно сделать это таким образом, вместо того, чтобы эмулировать всю инструкцию, а затем синхронизировать все остальное. Не знаю о реальных ПЗУ, но есть тестовые ПЗУ, которые проверяют это точное поведение. 8 циклов - это длительное время, и в середине нескольких обращений к памяти некоторые другие компоненты Gameboy могут внести изменения.

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