Процессор Денди (CPU).
Как отмечалось ранее, первая (многокорпусная) модель NES
строилась на базе процессора 6502 (6527). Все последующие модели сверху вниз
совместимы с ней. По неподтвержденной информации контроллер UM6561 – намного
более совершенен, имеет расширенную систему команд и другие "возможности" (которые, надо понимать,
в дань совместимости, никто не использует). Поэтому, говоря о процессоре
Денди, – опираемся на архитектуру 6502.
Итак - CPU 6502 имеет:
- Шина Адреса – 16 бит (адресное пространство 64кб);
- Шина Данных – 8 бит;
- Частота (для версии PAL) – 1.79 МГц;
- Встроенный pAPU (4 аналоговых + 1 цифровой канал);
- Контроллер DMA;
Подробнее о программной модели 6502 можно прочитать в приложении
1. Примеры принципиальных схем и их описания в приложении
5.
Здесь же мы рассмотрим, как этот процессор используется
в Денди. Модель 6502 предусматривает единое адресное пространство кода и
данных. Также в процессоре отсутствуют инструкции обращения к портам ввода/вывода
(типа in/out) – порты должны отражаться на адресное пространство памяти.
Т.е. адресное пространство процессора делится между портами и памятью. В
архитектуре Денди это происходит так (кстати, по-моему, не очень рационально):
Адрес |
Размер |
Назначение |
$0000-$07FF |
2k |
RAM |
$0800-$1FFF |
6k |
RAM
Mirror (x3) |
$2000-$2007 |
$8
= 8 байт |
Registers
Video |
$2008-$3FFF |
$1FF8
= 8184 байта |
Registers
Video Mirror (x1023) |
$4000-$4017 |
$20
= 32 байта |
Registers
Audio
& DMA & I/O |
$4018-$4FFF |
$0FE8
= 4072 байта |
Not
used |
$5000-$5FFF |
4k |
Expansion
ROM (for MMC5) |
$6000-$7FFF |
8k |
SRAM
(WRAM) |
$8000-$BFFF |
16k |
PRG-ROM
(1) |
$C000-$FFFF |
16k |
PRG-ROM
(0) |
Таблица 1.
RAM – 2кб. Оперативной памяти (на плате приставки
или внутри контроллера) – её распределение следующее:
- $0000-$00FF – “Нулевая страница” (Zero Page) – используется
для системных целей (для программ предпочтительны адреса $10-$9F, прочие
лучше не трогать). Процессор имеет отдельные инструкции, обеспечивающие
быстрый доступ к нулевой странице.
- $0100-$01FF – Аппаратный стек от старших адресов
(размер, понятно, 256 байт).
- $0200-$07FF – Пользовательская область.
Начиная с адреса $0800 из-за неполной дешифрации адреса,
идут три «зеркала» оперативной памяти RAM. Т.е. обращение к ячейке $0000
эквивалентно обращению к $0800 или к $1000 или к $1800. (Интересно, что мешало
разработчикам установить еще 6 килобайт памяти – лишнего, наверное, бы не
было).
Registers Video – 8 шт. Через эти регистры видеопроцессора
(и только через эти регистры) осуществляется связь центрального процессора
с видеопроцессором, а через него и с видеопамятью. Подробнее см. главу «Видеопроцессор
Денди (PPU)». Далее с адреса $2008 идут «зеркала» регистров видеопроцессора.
Registers Audio & DMA & I/O – 24 шт. Регистры
звукового сопроцессора, контроллера DMA и портов ввода/вывода. Подробнее
см. соответствующие главы. Назначение остальных ($0FE8=4072шт.) адресов не
определено, но может использоваться внешними звуковыми процессорами, располагающимися
на картридже.
Expansion ROM (for MMC5) – 4кб. Расширение ОЗУ (или
любое другое) – реально используется у маппера MMC5 (см. главу «Картридж
Денди»)
SRAM – 8кб. (она же WRAM) – статическое ОЗУ,
которое может находиться на картридже. Являясь полноценным ОЗУ, для процессора,
может использоваться для любых целей, в том числе и для хранения (исполнения)
программы, как правило в этой области, игры хранят данные текущей карты (маппер
MMC3). При необходимости сохранения игровых ситуаций, эта микросхема питается
от батарейки, расположенной на картридже (сохранение игры на время выключения
питания, с возможностью последующего продолжения).
PRG-ROM – 2 окна по 16кб (иногда 4 по 8кб или другой
вариант логического разбиения - в зависимости от маппера, см. главу «Картридж
Денди») . Чтобы подробно рассмотреть назначение этих участков памяти
– необходимо иметь представление об архитектуре картриджа (а вариантов тут
много), о чем пойдет речь несколько позже. Здесь же рассмотрим самую простую
модель картриджа: картридж содержит две ПЗУ размером 32кб и 8кб, подключаются
они к шинам процессора (CPU) и видеопроцессора (PPU) соответственно (см. рис.1).
Первая (в нашем примере 32кб) микросхема ПЗУ функционально называется PRG-ROM,
и содержит в себе программу и возможно данные. Первые 16кб ПЗУ отображаются
в окне 1 ($8000-$BFFF), последние 16кб в окне 0 ($C000-$FFFF). Организовано
это на схемотехническом уровне. В конце нулевого окна располагаются вектора
прерываний процессора. Некоторыми мапперами пространство $8000 - $FFFF «разбивается»
не на два окна, а более (например в MMC3 – для более гибкого варьирования
страничной адресацией памяти картриджа).
Процессор 6502 предусматривает всего 3 прерывания. Рассмотрим
подробнее случаи их возникновения, предварительно указав адреса в таблице
векторов прерываний.
· $FFFA
– NMI (VBlink)
Немаскируемое прерывание. Поступает с видеопроцессора и
сигнализирует о том, что PPU закончил прорисовку очередного кадра и «луч»
пошел обратно (в начало экрана). Обработчик этого прерывания должен производить
необходимые, по программе, обновления данных видеопамяти. Во время прорисовки
кадра видеопамять недоступна. Существует возможность программного отключения
видеопроцессора – NMI формироваться не будет, но также будет отсутствовать
и картинка на экране – в этом режиме доступна запись (используется при начальной
инициализации).
· $FFFC
– RESET
Происходит по факту включения питания или при нажатии на
клавишу «Reset». Стоит помнить, что в последнем случае изменяется только
программный счетчик, все регистры, а тем более память сохраняют свои значения.
· $FFFE
- IRQ/BRK
Единственное в системе «пользовательское» прерывание. Возникает
по активному сигналу на входе процессора (выведен на разъём картриджа и
порты джойстиков). Или может вызываться программно – инструкция BRK.
Соответственно по этим адресам должны находиться адреса
обработчиков соответствующих прерываний. Приоритет прерываний следующий (от
более приоритетного к менее): RESET, NMI, IRQ/BRK.