Картридж Денди.

Денди спроектирована так, что вся программа и все данные хранятся исключительно на картридже. Сама приставка не содержит никакой постоянной памяти. Картридж устанавливается в разъём, на который выведены как шины CPU, так и PPU (см. приложение 4). До сих пор мы, для простоты и наглядности, ссылались на модель картриджа, содержащую 32k PRG-ROM и 8k CHR-ROM без наличия маппера. Такие картриджи подходят для хранения небольших игр - их память полностью адресуется CPU и PPU. Для большинства же игр такой объём явно недостаточен – поэтому большинство картриджей имеют значительно больший объём памяти (до 1024k PRG-ROM и 1024k CHR-ROM). Понятно, что непосредственно процессор не может адресовать такой объём памяти. В Денди применяется метод «страничной адресации» памяти картриджа. Картриджи большого объёма содержат, помимо микросхем памяти, еще и переключатель страниц (маппер). Маппер («mapper») – комбинационная схема (или контроллер), состояние которого однозначно определяет блоки ПЗУ картриджа, отображаемые в данный момент в адресное пространство процессора, или знакогенератор PPU. Размер переключаемых окон адресного пространства CPU зависит от типа маппера, а с некоторыми мапперами может даже варьироваться, типичные конфигурации - 2*16k, 2*8k+16k, 4*8k (возможны и иные конфигурации - причем, как правило, последнее окно непереключаемое).

Видов мапперов существует очень много (наиболее распространены около десяти) – каждый из них имеет свой функционал по управлению аппаратной частью картриджа: поддержка того или иного вида и объёма используемых в картридже микросхем памяти, возможность использования дополнительной памяти (ОЗУ), наличие других дополнительных функций (звукового процессора, таймеров и пр.). Мапперы имеют свои (отличные от других) «системы команды» управления их состоянием. Большим количеством модификаций «классических» мапперов мы обязаны «пиратам» - стремящимся либо с сэкономить на железе, любо запихнуть на один картридж много всего разного, а зачастую - и то и другое сразу ;-) Несмотря на все разнообразие (см. перечень мапперов), базовый функционал всех без исключения мапперов по большому счету идентичен – состояние регистров маппера определяет (управляет) старшими линиями адреса микросхем PRG-ROM и/или CHR-ROM (для которых не хватает адресных линий в разъеме картриджа).

И так, при наличии маппера, картридж Денди содержит:

PRG-ROM – микросхема ПЗУ, хранящая программу и данные (неотъемлемая часть любого картриджа). Подключается к шинам процессора. Старшие линии адреса микросхемы ПЗУ, а также управляющие входы подключаются к мапперу (если маппер предусматривает переключение страниц PRG-ROM).

CHR-ROM/CHR-RAM – микросхема памяти, подключаемая к шинам PPU - возможен один из двух вариантов:

  • ПЗУ (CHR-ROM) – хранит заранее «прошитые» знакогенераторы PPU, которые могут переключаться, если это предусматривает маппер. Подключается к шинам PPU и мапперу (если маппер предусматривает переключение страниц знакогенератора).
  • ОЗУ (CHR-RAM) – статическая память, размером 8k (два знакогенератора). В этом случае «иконки» знакогенераторов должны храниться в PRG-ROM (или генерироваться алгоритмически) и программно (через регистры управления PPU) загружаться в CHR-RAM. Преимуществом такой организации является то, что есть возможность изменения одной иконки знакогенератора (или даже ее части), при сохранении всех остальных иконок неизменными. В предыдущем случае (CHR-ROM) имелась возможность только выбирать заранее созданные и прошитые в ПЗУ пресеты знакогенераторов (если их несколько) – зато путем переключения можно намного быстрее изменить группу иконок, чем поштучно их подгружать.

Mapper – комбинационная схема (или контроллер), осуществляющие коммутацию блоков микросхем ПЗУ в адресные пространства CPU и/или PPU – т.е. фактически управляет старшими линиями адреса микросхем ПЗУ, для которых «не хватает» адресных линий в слоте картриджа и/или адресном пространстве процессора. Маппер находится на картридже и подключается к шинам CPU и/или PPU и соответствующим микросхемам памяти. Некоторые мапперы состоят из нескольких микросхем. Любая программа (игра) пишется под определенный тип маппера. Т.е., говоря современным языком: драйвер маппера «вшивается» в код программы, более того – он зачастую «размазан» по всему коду … Возможность адаптировать (модифицировать) программу (дамп игры) под другой маппер – задача довольно рутинная – нужно найти и откорректировать все места, где происходит управление маппером.

Также картридж (в редких случаях) может содержать:

SRAM (она же WRAM) - (Адресное пространство CPU $6000-$7FFF) – Статическое ОЗУ, может питаться от компактной батарейки, располагающейся на картридже. Предназначено для «сохранения» игр (если есть батарейка), или просто служит дополнительным ОЗУ (хорошее дополнение). Для него зарезервировано «окно» в адресном пространстве CPU размером 8k (в 4 раза больше встроенного в приставку ОЗУ, а скорость таже и прямая адресация) - существуют картриджи, несущие на борту до 32k ОЗУ (т.е. 4 страницы, переключаемые маппером в этом окне).

Expansion ROM\RAM - (Адресное пространство CPU $5000-$5FFF) – Дополнительные 4k памяти (для CPU). В целом аналогично SRAM (используется, как правило, с маппером MMC5).

VRAM - (Адресное пространство PPU $2800-$2FFF) – «Недостающие» 2k VRAM для двух экранных страниц PPU (3 и 4). Редкая фишка - используется очень немногими играми.

Звуковой процессор - предназначен для более качественного синтеза звука, нежели это реализуется встроенным pAPU (например, в мапперах VRC6, VRC7 и других).

Большинство аппаратных возможностей Денди могут быть использованы (дополнены), например, маппером MMC5 или MMC3 (большинство технологичных игр используют именно их). Разумеется, ничто не мешает разработать новый маппер самому (в архитектуре приставки ничего менять не придется! - всю логику управления маппером содержит программа на картридже), чем китайские разработчики («пираты») увлекаются больше других, а вместе с этим производят и совместимые аналоги «официальных» микросхем мапперов – наиболее популярные из которых следующие:

MMC1 – AX5904

MMC3 – AX5202

VRC4 – AX5208

Программирование мапперов.

В адресном пространстве CPU - адреса $8000-$FFFF выделены для отражения на них памяти картриджа - PRG-ROM. Логически может быть организовано несколько окон, управляемых маппером. Размер и количество окон определяется архитектурой маппера, некоторые типы предусматривают переменный размер переключаемого окна (например, MMC3). Наиболее распространенный вариант 2*16k, 2*8k+16k или 4*8k - в последнее окно ($xxxx-$FFFF) позиционируется или «хвост» ПЗУ, или его начало. Также, зачастую, последнее окно переключению не подлежит (в нем находятся вектора прерываний).

Каждый маппер имеет определенное количество регистров управления, доступных только для записи. Адресуются они через области, отведенные для PRG-ROM. То есть – чтение из памяти по адресам $8000-$FFFF приводит к чтению ПЗУ (PRG-ROM), а запись, по некоторым адресам из этого диапазона, приводит к записи управляющих слов в соответствующие регистры маппера.

Подробное описание разных мапперов – не цель данного материала, однако некоторые из них рассмотрим подробнее.

Маппер UNROM.

Для примера рассмотрим маппер UNROM – один из самых простейших мапперов, но весьма удобный для знакомства с программированием Денди и написания несложных программ. Он предусматривает работу с PRG-ROM объёмом 128k (17 линий адреса, 3-мя старшими линиями управляет маппер), в качестве CHR используется непосредственно ОЗУ размером 8k (без участия маппера). Маппер строится на базе двух микросхем (74HC161 и 74HC32) и программно представлен как один регистр, который отражается на всё пространство PRG-ROM ($8000-$FFFF). То есть запись по любому адресу из этого диапазона приведет к записи в регистр маппера. Записываемый байт (а вернее 3 младших его бита) определяет блок микросхемы ПЗУ (16k), подключаемый в окно $8000-$BFFF (т.е. при A14=0) - блоки нумеруются с нуля и с начала адресации микросхемы ПЗУ. В окно $C000-$FFFF (т.е. при A14=1, вне зависимости от содержимого регистра маппера) всегда подключен последний блок (последние 16k) ПЗУ (A14=A15=A16=1 на адресных входах ПЗУ). Таким образом, возможен вариант (при «xxxxx111» в регистре маппера) когда последний блок ПЗУ будет последовательно продублирован в адресном пространстве.

Знакогенератор CHR-RAM - заполняется программно, через регистры PPU ($2006,$2007) – запись должна производиться в адресное пространство PPU, отведенное под знакогенератор ($0000-$1FFF). Вид отражения экранных страниц определяется распайкой (коммутацией) перемычки на плате картриджа.

Принципиальная схема маппера UNROM такова:

mapper-002.png

Разумеется, на схеме выбор (из двух) логических входов элементов 2-ИЛИ может быть произвольным, как и выбор используемых 3 из 4 таких элементов 2-ИЛИ из микросхемы 74HC32 (аналог «ЛЛ1») – на рисунке изображен один из множества возможных вариантов (точная копия коммутации на примере реализации в картридже на плате HVC-UNROM-03). Счетчик 74HC161 (аналог «ИЕ10») в данной схеме используется фактически как регистр (а не счетчик).

Super Hik.

Отдельно можно отметить такое древнее и весьма интересное инженерное решение китайских разработчиков как «Super Hik» - это картридж, содержащий в себе несколько (как правило, от 4 до 8) полноценных «больших» игр под маппер MMC3 (каждая)! Большинство игр MMC3 имеют размер 128k или 256k PRG-ROM и столько же CHR-ROM. Супер-хики имеют микросхемы памяти 512k или 1024k, в роли маппера MMC3 выступает совместимый (китайский) аналог AX5202 (в корпусе DIP-40 или бескорпусном варианте), также на нескольких логических микросхемах (триггерах, мультиплексорах, дешифраторах) сконструирован еще один маппер - «маппер верхнего (по отношению к MMC3) уровня». Получается так: в слоте картриджа присутствует 15 линий адреса (32k), штатный маппер MMC3 (в исполнении AX5202) берет на себя (в т.ч.) управление 16-ой  и 17-ой линиями адреса памяти (ПЗУ 128k) и 18-ой (ПЗУ 256k) – что обеспечивает штатное функционирование любой из игр. Переключение же игр – управление линиями адреса 18-ой  и 19-ой (ПЗУ 512k – 4 игры) и 20-ой (ПЗУ 1024k – 7 или 8 игр) осуществляется маппером верхнего уровня (сконструированного, например, на связке 74LS174 и 74LS157 для четырех игр), управляется он записью по адресу, не пересекающемуся с управлением MMC3, в неиспользуемое пространство памяти программ одной из игр добавляется код меню выбора игры (этакий «патч»), который и записывает требуемое значение в соответствии с выбранной игрой в регистр маппера верхнего уровня, для MMC3 это абсолютно прозрачно. В качестве примера работы маппера картриджа «Supper Hik» рассмотрим маппер под номером «49».

Маппер 49 (Super Hik 4-in-1).

Многие игры используют далеко не весь функционал, предоставляемый маппером MMC3, и в первую очередь в части размера PRG и CHR. Таким образом, выглядит вполне логичным (с технической точки зрения) создание мульти-игрового картриджа без микросхемы ОЗУ (WRAM), где под каждую из игр зарезервирован слот размером 128k (и в PRG и в CHR) – т.е. применение микросхем емкостью 4 мегабита (19 адресных линий). Игр, которым такой объем ресурсов совместно с маппером MMC3 (его аналогом AX5202) достаточен - предостаточно!

Рассмотрим механизм переключения слотов с играми такого мульти-игрового картриджа с точки зрения схемотехники и управления ей. Фактически мульти-игровой картридж «Super Hik» содержит в себе два маппера! ММС3 (полноценный, аппаратный) – именно с ним работают игры (выбранная в данный момент игра), и «маппер верхнего уровня» (этакий «гипервизор») – который обеспечивает выбор слота с игрой, которая и будет запущена … А так как для каждой из игр маппер верхнего уровня прозрачен (что логично), рассмотрим именное его принцип работы.

Маппер верхнего уровня представляет собой регистр «только для записи», доступный в диапазоне $6000-$7FFF. Т.к. за доступ к данному диапазону адресов отвечает MMC3, то необходимо сначала разрешить такой доступ (управляющая команда к MMC3). Конечно жаль, что из-за такого способа обращения к регистру маппера теряется возможность установки на картридж WRAM и стало быть запуска игр, требующих дополнительное ОЗУ по этим адресам, но сейчас не об этом.

Общая цель маппера верхнего уровня проста – обеспечить выбор (адресацию) старших адресных линий микросхем ПЗУ (PRG и CHR) за пределами 128k, которыми управляет MMC3. Т.е. должна быть возможность управления линиями A17 и A18 у обоих микросхем ПЗУ, хотя и изменять состояние этих линий предстоит вобщем то не часто: при включении/сбросе приставе на этапе выбора игры (слота с игрой внутри микросхем памяти).

Принципиальная схема «маппера верхнего уровня» внутри «маппера 49» такова:

mapper-049.png

Таким образом, в регистре маппера присутствуют только 5 бит. С программной точки зрения возможны два режима работы маппера (выбираемые битом D0) в части переключения страниц PRG-ROM.

«Основной режим» (D0=1) – в этом режиме слот с игрой (один из четырех) выбирается битами D6 и D7 (выполняют роль сигналов адресных линий A17 и A18 физических ПЗУ как PRG-ROM, так и CHR-ROM); значение бит D4 и D5 в регистре - безразлично; адресными линиями A13-A16 PRG-ROM и A10-A16 CHR-ROM управляет маппер MMC3. Игра не выходит за пределы своего слота и управляет только маппером MMC3.

«Альтернативный режим» (D0=0) – именно этот режим активируется при загрузке (сбросе), т.к. аналоговая часть схемотехники маппера верхнего уровня (RC-цепочка) сбрасывает весь регистр маппера в ноль. В этом режиме MMC3 не управляет адресными линиями PRG-ROM – ими управляет исключительно маппер верхнего уровня. Биты D6 и D7, как и прежде, подключены к линиям A17 и A18 как и PRG-ROM, так и CHR-ROM (т.е. для CHR-ROM оба режима абсолютно одинаковы) – а вот биты регистра маппера D4 и D5 теперь задают значения адресных линий A15 и A16 PRG-ROM соответственно, а линии A13 и A14 берутся непосредственно со слота картриджа. В этом режиме получается программная модель переключения страниц PRG-ROM, в некоторой степени, аналогичная мапперу UNROM – в данном случае 4 старших бита регистра маппера выбирают одну из 16 страниц размером 32k микросхемы PRG-ROM, подключаемую в окно $8000-$FFFF (после сброса – самое начало ПЗУ). Повторюсь: переключение страниц CHR-ROM в «альтернативном режиме» происходит аналогично «основному режиму» - линии A17 и A18 выбираются маппером верхнего уровня (биты D6 и D7), более младшими битами CHR-ROM всегда управляет маппер MMC3.

В целом, для использования такого симбиоза мапперов в конечном решении, необходимо как минимум вносить изменение в дамп игры, помещаемый в первый слот. Т.е. искать игру у которой, хотя бы, хвост первых 32k дапма свободен для размещения векторов прерываний, а также в этом блоке есть место для размещения их обработчиков (в лучшем случае - кода для реализации меню выбора игр, или накрайняк – для переключения банков «альтернативным способом» на более свободный, где уже и разместить код меню). Не забываем, что картинку меню придется складывать из иконок выбранного блока CHR-ROM (что возможно повлечет необходимость или выбора одной из игр с подходящими символами в одной из страниц, которую нужно будет выбрать двумя мапперами, или поиск игры с неиспользуемыми ячейками CHR-ROM, в которые можно разместить нужные символы).

 

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