Процессор Денди (CPU).
Как отмечалось ранее, первая (многокорпусная) модель NES/Famicom строилась на базе процессора Ricoh RP2A03 (архитектура 6502) или его аналога. Все последующие модели сверху вниз совместимы с ней. Не исключено, что SoC UM6561 более совершенен, имеет расширенную систему команд, а возможно и другие "фичи" (которые, надо понимать, в дань совместимости, как правило, не используются). Поэтому, говоря о процессоре Денди, – опираемся на базовую архитектуру 6502, реализованную в «классическом» RP2A03 (универсальном), или RP2A07 - только для варианта PAL.
Итак - CPU 6502 имеет:
- Шина Адреса – 16 бит (адресное пространство 64k);
- Шина Данных – 8 бит;
- Частота (для версии PAL) – 1.79 МГц;
- Встроенный звуковой сопроцессор «pAPU» (пятиканальный: 4 «аналоговых» + 1 «цифровой» DMC-канал);
- Контроллер 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\RAM (etc. in MMC5) |
$6000-$7FFF | 8k | SRAM (aka WRAM) (etc. in MMC3) |
$8000-$BFFF | 16k | PRG-ROM (1) |
$C000-$FFFF | 16k | PRG-ROM (0) |
RAM – Оперативная память (на плате приставки или внутри SoC) объемом 2k – её распределение следующее:
- $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\RAM [4k] – расширение ПЗУ\ОЗУ (или любое другое, располагающееся на картридже) – используется, например, маппером MMC5 (см. главу «Картридж Денди»)
SRAM (она же WRAM) [8k] – статическое ОЗУ, которое также может находиться на картридже. Являясь полноценным ОЗУ для процессора, может использоваться для любых целей, в том числе и для хранения (исполнения) программы. Как правило, в этой области игры хранят данные состояния текущей игровой локации в процессе игры (маппер MMC3). При необходимости сохранения игровых ситуаций, эта микросхема питается от батарейки, расположенной на картридже (сохранение игры на время выключения питания, с возможностью последующего продолжения).
PRG-ROM [32k] – зачастую представлено 2 окнами по 16k (иногда 4 по 8k или другой вариант логического разбиения - в зависимости от маппера, для более гибкого варьирования страничной адресацией памяти картриджа, см. главу «Картридж Денди»). Чтобы подробно рассмотреть механизмы эффективного использования этого участка памяти – необходимо иметь представление об архитектуре конкретного картриджа (а вариантов тут много), речь о них пойдет позже. Самая простая архитектура картриджа маппера не содержит, в картридже есть лишь две ПЗУ размером 32k и 8k, подключаются они к шинам процессора (CPU) и видеопроцессора (PPU) соответственно (см. рис.1). Первая (в нашем примере 32k) микросхема ПЗУ функционально называется PRG-ROM, и содержит в себе программу и возможно данные. Первые 16k ПЗУ отображаются в окне 1 ($8000-$BFFF), последние 16k в окне 0 ($C000-$FFFF). Организовано это на схемотехническом уровне. В конце нулевого окна располагаются вектора прерываний процессора.
Система прерываний.
Архитектура 6502 предусматривает всего 3 прерывания. Рассмотрим подробнее случаи их возникновения, предварительно указав адреса в таблице векторов прерываний.
$FFFA – NMI (VBlink)
Немаскируемое прерывание. Поступает с видеопроцессора и сигнализирует о том, что PPU закончил прорисовку очередного кадра и «луч пошел обратно» (в начало экрана). Обработчик NMI должен производить в этот момент (ограниченное время) необходимые по программе обновления данных видеопамяти, т.к. во время прорисовки строк кадра видеопамять недоступна (из нее осуществляет чтение PPU). Существует возможность программного отключения видеопроцессора – в этом режиме доступна запись в видеопамять (неограниченное время) прерывание NMI формироваться не будет, но также будет отсутствовать и картинка на экране (используется при начальной инициализации).
$FFFC – RESET
Происходит по факту включения питания или при нажатии на клавишу «Reset». Стоит помнить, что в последнем случае изменяется только программный счетчик, все регистры, а тем более память сохраняют свои значения.
$FFFE - IRQ/BRK
Единственное в системе «пользовательское» прерывание. Возникает по активному сигналу на соответствующем входе процессора, который выведен на разъём картриджа и порт расширений (или может вызываться программно – инструкция BRK). Таким образом вызывать обработчик данного прерывания может как периферия, расположенная на картридже (например, маппер), так и устройства, подключенные к порту расширений («разъем второго джойстика»).
Соответственно по указанным адресам (в «таблице векторов прерываний») должны находиться инструкции перехода к обработчикам соответствующих прерываний. Приоритет прерываний следующий (от более приоритетного к менее): RESET, NMI, IRQ/BRK.