Процессор Денди (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)

Таблица 1.

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.

 

Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Приложение 1
Приложение 2
Приложение 3
Приложение 4
Приложение 5
Приложение 6