|
||||||||||||||||||||||||||||||
Статья «Как составить программу для DENDY»Стр 1 из 5Следующая ⇒ Статья «Как составить программу для "DENDY"»
СОДЕРЖАНИЕ 1 Общие сведения 1 ОБЩИЕ СВЕДЕНИЯ
Итак, предположим, что пользователь внимательно прочитал статьи в журнале “Радио” [1], [10] и изготовил самодельный картридж ГИТС с двумя микросхемами РПЗУ. После их прошивки и установки картриджа в слот “Dendy”, на экране телевизора должны появиться картинки испытательных тестов. В принципе, на этом можно остановиться, используя ГИТС для ремонта и покупки телевизоров, формирования тестовых заставок кабельного телевидения, настройки декодеров PAL, проверки работоспособности “Dendy”. Однако, никто не мешает пользователю пойти дальше и попытаться дополнить уже существующие тесты новыми, добавляя в них свою уникальную графику, меню, звуковые треки и даже русифицированные надписи.
Все это получится, если хорошо разобраться во внутреннем устройстве “Dendy” и освоить программирование в среде микропроцессора МСS6502. Предлагаемый материал не требует от читателя узкопрофильной технической подготовки или многолетней практики программирования. Дорогу осилит идущий!
2 ВНУТРЕННЕЕ УСТРОЙСТВО “DENDY”
Первые восьмибитные ИВП появились в середине 80-х годов, благодаря стараниям японской фирмы “Nintendo Co. Ltd.”. Задуманная, как дешевая альтернатива персональным домашним компьютерам, приставка “Nintendo Entertainment System” (сокращенно NES) очень быстро завоевала поклонников во всех уголках земного шара. В Японии она называлась “Famicom” и отличалась конструкцией картриджа. Вскоре клонированные сестры “Famicom” появились на просторах одной шестой части суши под торговой маркой “Dendy”. В начале 90-х годов удачная телевизионная реклама фирмы “Steepler Trade Ltd.” помогла “Dendy” стать нарицательным именем и прочно войти в лексикон миллионов людей, как синоним всех восьмибитных игровых консолей.
Так сложилось, что анализом внутренней структуры “Dendy” первыми стали заниматься радиолюбители, к которым по традиции несли на ремонт всю неисправную импортную электронику. Логично, что и первая публикация на техническую тематику о “Dendy” появились именно в радиолюбительской литературе [2]. Далее последовали углубленные анализы внутреннего устройства с точки зрения программиста [3, 4] и электронщика [5, 6].
Базовой опорой приставки “Dendy” служит связка центрального процессора (ЦП) и видеопроцессора (ВП). Дополняет картину отдельный музыкальный сопроцессор (МС), обменивающийся информацией с ЦП при помощи портов ввода-вывода. Ванглоязычной литературе ЦП называют CPU (Central Processing Unit), ВП - PPU (Picture Processing Unit), MC - APU (Audio Processing Unit).
Адресное пространство ЦП занимает 64 Кб, внутри которого располагается ОЗУ и часть ПЗУ картриджа. Адресное пространство ВП в 8 раз меньше, чем у ЦП. Оно физически не пересекается с адресным пространством ЦП, имея отдельную область ОЗУ и часть ПЗУ картриджа. Чтобы различать, какие компоненты относятся к ЦП, а какие – к ВП, в обозначении первых вводится буква “S”, а последних – “V”. Например, S-ROM и V-ROM – это соответственно ПЗУ в адресном пространстве ЦП и ВП.
Архитектура “Dendy” построена по схеме, ставшей в дальнейшем классической для ИВП следующих поколений. В системе обязательно присутствует ЦП (один или несколько), под руководством которого работают ВП и МС. Каждая из этих частей имеет свою оперативную память. Связь с периферийными устройствами (джойстиками, световым пистолетом) происходит через специализированный контроллер, обрабатывающий по определенному алгоритму поступающую информацию и выставляющий ее для доступа ЦП через порты ввода-вывода. Картридж “Dendy” содержит два отдельных ПЗУ, обслуживающих ЦП (S-ROM) и ВП (V-ROM). Иногда в картридже располагаются микросхемы ОЗУ с литиевой батарейкой для сохранения игровых ситуаций, а также стандартные логические микросхемы.
Рассмотрим подробнее составные части архитектуры “Dendy”.
3 ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР
3.1 СЕМЕЙСТВО МИКРОПРОЦЕССОРОВ MCS65xx
ЦП “Dendy” принадлежит к семейству восьмиразрядных микропроцессоров, программно совместимых с серией MCS65хх разработки фирмы MOS Technology. В свою очередь это семейство представляет собой усовершенствованный вариант процессоров МС68хх фирмы Motorola. Сходства и различия у них примерно такие же, как у микропроцессоров i8080 (Intel) и Z80А (Zilog). Тем не менее, совместимость по машинному коду между MCS65xx и MC68xx отсутствует, хотя архитектуры их аналогичны.
В семейство MCS65xx входит более десяти разновидностей микропроцессоров, но особой популярностью пользуется MCS6502, применявшийся в начале 80-х годов в составе домашних и конторских компьютеров: Commodore-64, Apple-II, BBC Model2, Acorn Atom. Из отечественных машин наиболее близкой по устройству является ПЭВМ “Агат” с производительностью 700 тысяч операций в секунду, которую в свое время предполагали сделать базовой для комплектования компьютерных классов в учебных заведениях. Ее прототипом был компьютер “Apple-II” (1977 год, фирма “Apple Computer”, США).
Совместимые с семейством MCS65xx лицензионные процессоры выпускались параллельно несколькими фирмами: Synertec, UMC, Rockwell International. Последняя известна своими попытками разработки универсального однокристального микрокомпьютера R6531 на базе архитектуры MCS65xx, добавляя на кристалл ОЗУ, ПЗУ и периферийные схемы. Именно такой подход был выбран разработчиками “Dendy”.
Первыми появились так называемые многокристальные модели “Dendy”, в которых применялись две БИС: микросхема ВП серии 6538 (MCS6538, HA6538) и микросхема серии 6527 (MCS6527, HA6527), содержащая вычислительное ядро ЦП и МС. Позднее появились однокристальные модели “Dendy” на основе СБИС серии 6561 (UM6561A), содержащей внутри: ЦП, МС, ВП, ОЗУ, а также контроллер периферийных устройств.
Система команд микропроцесоров многокристальных и однокристальных приставок “Dendy” идентична. Однако, фирмы-изготовители СБИС, в целом придерживаясь принципа сохранения программной совместимости “снизу-вверх”, часто добавляли в систему команд свои собственные новые операции. Например, более десяти новых команд, отсутствующих у MCS6502, выполняют процессоры фирмы Rockwell R65C00/21, R65C02.
Поскольку разработчики СБИС “Dendy” не спешат раскрывать подробности внесенные ими программных новшеств, то предлагается наиболее простое решение – за постулат принимается предположение, что система команд ЦП совместима со “старейшиной” семейства – микропроцессором MCS6502. Практика программирования в кодах MCS6502 показывает полную состоятельность выдвинутой гипотезы.
3.2 РАСПРЕДЕЛЕНИЕ АДРЕСНОГО ПРОСТРАНСТВА ЦП
Микропроцессор MCS6502 имеет несколько необычную структуру, определяющую изначальную разорванность его адресного пространства. Традиционно принято всю доступную ЦП память 64 Кб разбивать на страницы, каждая емкостью 256 байт. Можно образно представить все адресное пространство ЦП в виде книги, состоящей из 256 таких страниц. Распределение адресного пространства ЦП приведено на рисунке 3.1.
Рисунок 3.1 – Распределение адресного пространства ЦП “Dendy”
Некоторые страницы памяти имеют устоявшиеся названия и выполняют строго определенные функции. Так, например, на нулевой странице (Zero Page) по адресам 0000h...00FFh размещается системная область, ячейки которой использует ЦП при работе с МС, ВП и периферийными устройствами. Считается, что в “Dendy” программист может без риска использовать “серединку” нулевой страницы по адресам 0010h...009Fh. Это выгодно с точки зрения экономии размера программы и быстродействия, поскольку система команд MCS6502 содержит специальные короткие обращения к нулевой странице.
Однако при разработке нового программного продукта лучше не искушать судьбу и вначале использовать другие области памяти, которые недоступны системе. В дальнейшем, после первичной отладки программы, можно будет без труда ассемблером переназначить ячейки для работы на нулевой странице.
Страница под номером 1 находится по адресам 0100h...01FFh. Она зарезервирована под стек, длина которого аппаратно ограничена 256 байтами. Стек “растет” вниз (в форме сталактита) в сторону младших адресов. Далее идет ОЗУ пользователя 0200h...07FFh. Нулевая страница, область стека и основное ОЗУ вследствие неполной дешифрации адресов отображается на карту памяти еще три раза.
Часть пространства 2000h...3FFFh отводится для связи ЦП с ВП. Основной интерес в этой области представляют 8 портов ввода-вывода, расположенные по адресам 2000h...2007h. Общение ЦП с МС и периферийными устройствами также производится через порты, но имеющие адреса в диапазоне 4000h...401Fh.
Верхнюю половину памяти 8000h...FFFFh занимает ПЗУ картриджа S-ROM. Здесь располагаются коды игровых программ, а также три важные точки входа. Каждая из этих точек занимает два байта в области FFFAh...FFFFh. В частности, ячейкиFFFAh, FFFBh содержат адрес программы обработки немаскируемого прерывания NMI; FFFCh, FFFDh – “холодного” старта RESET; FFFEh, FFFFh – маскируемого прерывания IRQ. Объем ПЗУ картриджа может быть меньше или больше 32 Кб. В первом случае ячейки ПЗУ должны обязательно занимать область FFFAh...FFFFh, во втором случае требуется аппаратное переключение страниц памяти в картридже.
Информация в ОЗУ и ПЗУ размещается по принципу “младший байт в младшем адресе”, как у КР580ВМ80A и Z80A. Это означает, что, например, младшая часть адреса, с которого запускается игровая программа при включении питания “Dendy”, находится в ячейке FFFCh, а старшая – в FFFDh. Образец: FFFCh = DCh, FFFDh = 84h, адрес начального запуска 84DCh.
Приоритет прерываний (от высшего к низшему): RESET, NMI, IRQ. Важное следствие наличия трех точек входа на вершине карты памяти ЦП заключается в необходимости заполнения 6 старших ячеек в любой микросхеме РПЗУ, в которой будет размещена запускаемая программа. Этим объясняется факт прошивки в ГИТС [1] 6 дополнительных ячеек при замене РПЗУ емкостью 2 Кб (К573РФ5) на РПЗУ емкостью 8 Кб (КР573РФ6А).
4 ВИДЕОПРОЦЕССОР
4.1 РАСПРЕДЕЛЕНИЕ АДРЕСНОГО ПРОСТРАНСТВА ВП
Адресное пространство ВП занимает 8 Кб (рисунок 4.1). Начальные адреса 0000h...1FFFh отводятся под видео-ПЗУ картриджа V-ROM. В нем хранятся образы графических блоков, из которых строится изображение на экране телевизора. По адресам 2000h...23FFh, 2400h...27FFh, 2800h...2BFFh, 2C00h...2FFFh располагаются четыре экранные области с номерами соответственно 0, 1, 2, 3. Физически их ячейки памяти находятся во внутреннем видео-ОЗУ ВП общей емкостью 2 Кб. Поскольку на каждую экранную область отводится 1 Кб, то в “Dendy” оказываются доступными лишь первые две области из четырех.
Рисунок 4.1 – Распределение адресного пространства ВП “Dendy”
ВП содержит 32 восьмиразрядных регистра цвета, условно называемые RG00...RG1F, запись в которые возможна по адресам соответственно 3000h...301Fh. Кроме того, ВП имеет внутренний буфер емкостью 256 байт. Особенностью буфера является то, что он не отображается на адресное пространство ВП и не имеет конкретного места на карте памяти. Данный нюанс становится понятным, если учесть, что обращение к буферу происходит через канал прямого доступа в память (ПДП).
4.2 СТРУКТУРА ВП
ГИТС формирует статические изображения, принцип построения которых невозможно уяснить без глубокого знания возможностей ВП. Рассмотрим организацию экранной области “Dendy” с акцентом на малоизвестные факты. Материал достаточно сложный, поэтому потребуется определенная внимательность. Фактически речь пойдет о прямом программировании функций ВП, что в более сложных вычислительных системах скрыто от пользователя посредством микропрограммного управления.
ВП, содержащийся в "Dendy", формирует телевизионный сигнал стандарта PAL (256х240) с частотой кадровой развертки 50 Гц. Для справки, американские (NES) и японские (“Famicom”) версии приставки имеют ВП стандарта NTSC (256x224) с частотой кадровой развертки 60 Гц.
На любом изображении, формируемом в “Dendy”, можно выделить три составляющие: фон, пейзаж и спрайты. Чтобы уяснить различия между этими терминами, удобно воспользоваться понятием “план изображения”.
На экранной картинке “Dendy” различают 4 плана изображения. Самым глубоким (план 4) является фон или, по-другому, холст однотонного цвета. План 2 – это пейзаж, представляющий собой рисунок декорации, на которой происходят игровые действия. Спрайты (фигурки игровых персонажей) могут перемещаться как между холстом и пейзажем (план 3), так и поверх пейзажа (план 1). Часть пикселов, входящих в пейзаж и спрайты, могут задаваться прозрачными, через них будет просвечиваться фон изображения. В итоге получается картинка, похожая на съемку мультипликационного фильма.
ВП автономно формирует телевизионный растр с прогрессивной разверткой размером 256 х 240 пикселов (256 точек изображения в каждой из 240 строк). Сравнение с разрешающей способностью телевизора, имеющего 625 строк разложения в кадре, явно не в пользу “Dendy”. Это понятно, ведь вычислительная мощность у ВП не так велика. Тем не менее, изображение занимает всю площадь экрана, правда, за счет увеличения размеров пикселов и увеличения "зернистости" картинок.
Фон может окрашивать сразу весь экран на выбор одним из 56 оттенков цвета. Пейзаж также строится во весь экран, но разбивается на 960 (32 х 30) блоков. Совокупность из 16 (4 х 4) блоков называется окном. Каждый блок имеет размер 8 х 8 пикселов. Внутри блока может быть создан любой точечный рисунок, содержащий палитру максимум из четырех разных цветов.
То, что в “Dendy” принято называть спрайтом [4], занимает один блок размером 8 х 8 пикселов. Одновременно на экране могут присутствовать 64 независимых спрайта, из которых строятся фигурки персонажей. “Лишними” спрайтами заполняют “бреши” в пейзаже. Как видно, в “Dendy” фигурка персонажа и спрайт – это не одно и то же.
На рисунке 4.2 показана привязка блоков к абсолютным адресам экранной области ВП. Здесь и далее речь идет об экранной области 2400h...27FFh, которая выбрана основной в ГИТС. Структура области 2000h…23FFh – аналогична.
Итого, на экранной области можно выделить следующие элементы: - блок = 8 х 8 пикселов; - кластер = 4 блока = 16 х 16 пикселов; - окно = 4 кластера = 16 блоков = 32 х 32 пикселов; - экран = 56 полных + 8 неполных окон = 240 кластеров = 960 блоков = 256 х 240 пикселов.
4.3 ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЙ
В каждой ячейке памяти 2400h...27BF адресного пространства ВП содержится байт, указывающий на координату местонахождения графического образа блока в V-ROM, который будет выведен на конкретное место экрана согласно рисунку 4.2. Байт, хранящийся в ячейке памяти, определяет условный код блока (УКБ), выраженный шестнадцатиричным числом от 00h до FFh.
Каждому УКБ поставлены в соответствие определенные 16 байтов в памяти видео-ПЗУ V-ROM по адресам 0000h...1FFFh. Поскольку объем видео-ПЗУ составляет 8 Кб, то в нем помещается информация о 512 УКБ. Важное следствие - если в картридже ГИТС в роли РПЗУ DS2 будет установлена микросхема К573РФ5, то количество разновидностей УКБ уменьшится до 128. Чтобы не запутаться, первые 256 УКБ считают относящимися к фонту 0, они занимают ячейки 0000h...0FFFh, вторые – к фонту 1, они занимают ячейки 1000h...1FFFh.
Рисунок 4.2 - Раскладка экранной области “Dendy” по адресам 2400h...27FFh
Пример. По адресу 252Eh записан код 23h. Номер УКБ равен 23h, следовательно, на экран телевизора в блок, имеющий координаты “столбец 15 – строка 10”, будет выведено графическое изображение, содержащееся в видео-ПЗУ по адресам 0230h...023Fh для фонта 0 или 1230h...123Fh для фонта 1. Номер фонта определяет программист, предварительно записывая определенное число в один из регистров связи с ВП (более точно – соответственно “0” или “1” в разряд 4 регистра 2000h).
Графическое изображение любого блока формируется из двух шаблонов, сложенных “стопкой”. В памяти видео-ПЗУ они располагаются последовательно друг за другом, сначала нижний, затем верхний шаблон, по 8 байт каждый. На рисунке 4.3 показан пример построения буквы “Н” для УКБ с номером F7h из фонта 1. Подобным образом можно сформировать буквы кириллицы и цифры от 0 до 9.
Рисунок 4.3 - Графический образ буквы “Н”
Каркас буквы определяется нижним шаблоном с байтами 1F70h...1F77h. Наличие “1” в конкретном разряде каждого байта указывает на обязательную засветку одной точки (пиксела) на экране телевизора, наличие “0” – засветка может как присутствовать, так и отсутствовать, что зависит от кода верхнего шаблона.
Следующие 8 байтов 1F78h…1F7Fh относятся к верхнему шаблону, определяющему код цвета (КЦ) каждого пиксела блока. Общий контур цветного изображения получается наложением верхнего шаблона на нижний, при этом теоретически можно использовать любые 4 цветовых оттенка из 56, а в пределах всего экрана – не более 13. Если все байты верхнего шаблона имеют одинаковое значение, то контур изображения будет определяться только нижним шаблоном, причем максимум в двухцветной раскраске.
Некоторые пояснения. Как определить номер КЦ? Вначале следует мысленно переместить верхний шаблон на нижний, причем так, чтобы байты 1F70h и 1F78h совпадали друг с другом. Теперь каждый из получившихся 64 пикселов можно охарактеризовать двумя цифрами, первой записывается цифра “0” или ”1” верхнего, а затем - нижнего шаблонов. Например, крайний слева вверху пиксел на рисунке 4.3 – это разряд 7 ячейки 1F70h нижнего шаблона и разряд 7 ячейки 1F78h верхнего шаблона. Поскольку в обоих разрядах присутствует цифра “0”, то общий код равен “00”, следовательно, КЦ=0. Аналогично, пикселы центральной дужки буквы “Н” имеют КЦ=2 (код “10”), “боковинок” – КЦ=1 (код “01”), а их верхних частей – КЦ=3 (код “11”). Каждый КЦ входит в формулу, которая однозначно определяет номер регистра цвета, которым подсвечиваются пикселы.
Случай КЦ=0 означает “прозрачный” цвет пиксела, то есть через него в случае раскраски пейзажа или спрайта будет просвечиваться низлежащий план изображения. Графический рисунок целого блока может совсем исчезнуть, если регистры цвета, участвующие в его формировании, будут настроены на вывод одинакового цветового оттенка. Если же все 16 (32) регистра цвета будут иметь одинаковый код, тогда весь экран автоматически окрасится одним цветом. К примеру, таким приемом в ГИТС осуществляется формирование сигналов однотонного цвета “равномерно светящееся поле”.
Адреса 27С0h...27FFh в области памяти ВП отводятся под атрибуты пейзажа. Каждый из этих 64 байтов задает параметры окна, состоящего из четырех кластеров (см. рисунок 4.2). Под кластером понимается совокупность из 4 рядом расположенных блоков пейзажа. Итого, каждый байт атрибутов пейзажа отвечает за параметры своего строго определенного квадратного окна размером 4 х 4 блока. Исключение составляют байты 27F8h…27FFh, которым “достались” нижние половинки окон экрана размером 2 х 4 блока.
Для блоков, входящих в один кластер, атрибуты пейзажа одинаковы, что задается кодом кластера (КК) по образцу таблицы 4.1. В качестве примера на рисунке 4.2 было показано, какие разряды байта атрибутов пейзажа ячейки 27E9h определяют коды близлежащих кластеров.
Таблица 4.1 - Назначение разрядов байта атрибута пейзажа
4.4 СТРУКТУРА СПРАЙТОВ
Описание ВП будет неполным без рассмотрения структуры спрайтов. Спрайт занимает один блок 8 х 8 пикселов, информация о параметрах которого заносится во внутренний буфер ВП. На каждый спрайт отводится четыре последовательно расположенных в буфере байта, следовательно, всего в “Dendy” может быть сформировано 256 / 4 = 64 спрайта. Назначение байтов, характеризующих параметры спрайта: - байт с условным номером N – вертикальная координата Y; - байт N+1 – номер УКБ из области видео-ПЗУ V-ROM, определяющий графический рисунок спрайта; - байт N+2 – атрибут спрайта; - байт N+3 - горизонтальная координата X.
Координаты отсчитываются в пикселах от левого верхнего угла телевизионного растра и относятся к левому верхнему углу спрайта. По оси Y возможны 240 (00h...EFh), по оси Х – 256 (00h...FFh) значений. Основные функции разрядов байта атрибутов спрайтов приведены в таблице 4.2. Код спрайта (КС) может принимать четыре значения: “00”, “01”, “10”, “11”, ограничивая до четырех количество одновременно присутствующих в каждом спрайте цветов. Спрайты и пейзаж могут использовать графические рисунки одних и тех же УКБ, различаться будут лишь номера регистров цвета.
|
||||||||||||||||||||||||||||||
|