APU Sprite DMA


Разобрал схему спрайтовой DMA:
Изображение

Принцип работы:
- Старшие 8 разрядов адреса (HI) - это константа, которая записывается в регистр $4014
- Младшие 8 разрядов (LO) - это up-counter, считает от 0 до 255. После переполнения - DMA прекращает работу.
При загрузке нового значения в $4014 - младший адрес (LO) очищается.
- Адрес DMA попеременно меняется с текущего значения HI:LO, на $2004 (порт записи PPU), при этом порт $2003 (начальный адрес в спрайтовой памяти) должен быть установлен ручками, до запуска DMA.
Понятно это сделано для того, чтобы вначале прочитать байт по адресу HI:LO, а затем записать его в $2004.
Переключение адреса делает flip/flop, который можно найти внизу схемы.
- На время DMA CPU бездействует (RDY=0)
- DMA стартует при записи в $4014 (устанавливается защелка START), а останавливается только после отправки всех 256 байт.

Работа спрайтовой DMA тесно переплетается с DMC. Во время DMC (RUNDMC=1) спрайтовая DMA временно приостанавливается.
Также DMC как-то завязана на линию RDY (я пока точно не выяснил).

Контрольные линии на схеме:
- SPRS: sprite step, увеличить счетчик адреса
- SPRE: sprite DMA end, после переполнения счетчика DMA останавливается
- DOSPR: спрайтовая DMA в процессе
- SPR/PPU : спрайтовая DMA работает по направлению SPRITE BUFFER->PPU
- SPR/CPU : спрайтовая DMA работает по направлению MEMORY->SPRITE BUFFER

Маленькая "звиздюлина", которая мелькала в стримах - это sprite buffer, временное хранилище для спрайтовой DMA.

Назад...