Поиск по сайту:


Смотри также:

Особенности сотовой связи - Статья.

Как составить программу для игровой приставки "DENDY" - Статья.

Как зарождалась сотовая связь - Статья.

MSDN по русски. Описание классов .NET - Статья.

Все новинки...

Статья «Как составить программу для "DENDY"»

Поделиться:

СОДЕРЖАНИЕ

1 Общие сведения
2 Внутреннее устройство "Dendy"
3 Центральный процессор
   3.1 Семейство микропроцессоров MCS65xx
   3.2 Распределение адресного пространства ЦП
4 Видеопроцессор
   4.1 Распределение адресного пространства ВП
   4.2 Структура ВП
   4.3 Формирование изображений
   4.4 Структура спрайтов
   4.5 Цветовые возможности
5 Организация портов, задействованных при работе ГИТС
   5.1 Порты джойстиков
   5.2 Порты музыкального сопроцессора
   5.3 Порт прямого доступа в память
   5.4 Порты видеопроцессора
   5.5 Порты, расположенные в картридже
6 Программирование в машинных кодах процессора MCS6502
7 Методика составления программы для ГИТС
8 Программы-эмуляторы
9 Разновидности телевизионных тестов
Список литературы
Приложение А - Ассемблерный листинг программы S-ROM (DS1)


5 ОРГАНИЗАЦИЯ ПОРТОВ, ЗАДЕЙСТВОВАННЫХ ПРИ РАБОТЕ ГИТС

 

5.1 ПОРТЫ ДЖОЙСТИКОВ

 

Работа с джойстиками в ”Dendy” осуществляется на программно-аппаратном уровне. Внутренний периферийный контроллер во время обратного хода кадровой развертки аппаратным образом формирует синхронизирующие импульсы опроса джойстиков и принимает ответы, посылая их поразрядно в соответствующий порт. Дальнейшая работа ложится на плечи программиста, который должен составить программу анализа пришедшей информации и определить, какая из кнопок джойстика была нажата.

 

Порты джойстиков имеют адреса 4016h и 4017h. Для обращения к джойстикам требуется вначале послать байты 01h и 00h по адресу 4016h. Затем из ячейки 4016h для первого (основного) и 4017h для второго (дополнительного) джойстика следует подряд считать 8 байтов данных, причем каждый раз “1” (“0”) в младшем разряде будет означать факт нажатия (не нажатия) определенной кнопки в строгой очередности: ВПРАВО, ВЛЕВО, ВНИЗ, ВВЕРХ, START, SELECT, B, A. Далее, младшие разряды всех считанных байтов выделяют маской и путем циклических сдвигов накапливают в какой-либо ячейке памяти, которую затем периодически опрашивают.

 

Подпрограмма опроса джойстиков составляется пользователем. Она должна располагаться в той части общей программы, которая обслуживает немаскируемые прерывания NMI (обратный ход кадровой развертки) и на которую дана ссылка в ячейках ПЗУ картриджа FFFAh, FFFBh. Без прерываний доступ к портам джойстика невозможен, что реализовано в “Dendy” аппаратным путем. Теперь становится понятным, почему импульсы опроса основного и дополнительного джойстиков имеют период, кратный 20 мс (частота 50 Гц), а промежутки между импульсами опроса в разных играх разные (подпрограммы опроса джойстиков пишут разные программисты, используя разные алгоритмы!).

 

5.2 ПОРТЫ МУЗЫКАЛЬНОГО СИНТЕЗАТОРА

 

Порты МС "Денди" подразделяются на 5 групп по числу каналов звукообразования. Адреса портов МС:

- 4000h – регистр формы сигнала генератора 1 (прямоугольные импульсы);

- 4001h – регистр качания частоты генератора 1 (прямоугольные импульсы);

- 4002h – регистр точной установки частоты генератора 1 (прямоугольные импульсы);

- 4003h – регистр грубой установки частоты генератора 1 (прямоугольные импульсы);

- 4004h – регистр формы сигнала генератора 2 (прямоугольные импульсы);

- 4005h – регистр качания частоты генератора 2 (прямоугольные импульсы);

- 4006h – регистр точной установки частоты генератора 2 (прямоугольные импульсы);

- 4007h – регистр грубой установки частоты генератора 2 (прямоугольные импульсы);

- 4008h – регистр формы сигнала генератора 3 (треугольный сигнал);

- 4009h – не используется;

- 400Ah – регистр точной установки частоты генератора 3 (треугольный сигнал);

- 400Bh – регистр грубой установки частоты генератора 3; (треугольный сигнал)

- 400Ch – регистр формы сигнала генератора 4 (шумовой сигнал);

- 400Dh – не используется;

- 400Eh – регистр точной установки ширины спектра генератора 4 (шумовой сигнал);

- 400Fh – регистр установки длительности генератора 4 (шумовой сигнал);

- 4010h…4013h – регистры управления цифрового “дельта”-канала, который в “Dendy” и “Famicom” по сравнению с NES имеет ограниченные возможности;

- 4015h – регистр включения/выключения каждого из пяти каналов.

 

Все генераторы МС работают независимо друг от друга. Принцип формирования звуков в каналах 1…4 – частотный (FM) с делением частоты сигнала опорного генератора на изменяющиеся во времени коэффициенты. Форма импульсов – прямоугольная, треугольная, шумоподобная. Форма огибающей – пилообразная. Направление качания частоты в каналах 1, 2 – от максимума к минимуму и наоборот.

 

Канал дельта-преобразования работает по принципу ИКМ (импульсно-кодовая модуляция). Канал используется для воспроизведения оцифрованной речи и музыкальных сэмплов, но требует большого расхода памяти РПЗУ картриджа.

 

Порт управления 4015h может включить или отключить любой из пяти каналов. Кроме того, это единственный порт МС, который работает не только на запись, но и на чтение, позволяя контролировать текущий статус.

 

Для проверки звукового тракта телевизора удобно использовать три типа сигналов:

1) непрерывные прямоугольные импульсы низкой и высокой частоты для оценки чувствительности и величины частотных искажений;

2) периодический сигнал с огибающей в виде пилы для оценки линейности амплитудной характеристики;

3) сигнал свип-генератора с возрастанием частоты от 27 до 12500 Гц для оценки АЧХ звукового тракта.

 

Пример программирования портов МС. Для получения частоты прямоугольных импульсов 400 Гц в порты 4015h, 4000h, 4001h, 4002h, 4003h следует записать байты соответственно 03h, 3Еh, 80h, F0h, 00h, для получения пилообразного периодического сигнала – байты 03h, 20h, 80h, F0h, 00h.

 

Порты МС доступны в любой момент времени. Звуки формируются независимо от выполняемой ЦП программы и обновляются при каждом обращении к портам МС. В целом, по разнообразию функций, простоте управления и количеству задействованных регистров, МС “Dendy” не уступает музыкальному сопроцессору AY3-8910/12 компьютера “ZX-SPECTRUM”. Приступая к созданию своих собственных звуковых эффектов, нелишним будет ознакомиться с уже наработанным программным обеспечением, анализируя подпрограммы извлечения звука в игровых картриджах “Dendy”.

 

5.3 ПОРТ ПРЯМОГО ДОСТУПА В ПАМЯТЬ

 

Контроллер ПДП имеет порт записи с адресом 4014h. Обычно канал ПДП используется для быстрого перемещения спрайтов во время прерывания NMI. Анализ игровых программ “Dendy” показывает, что для массива из 256 байтов, определяющих параметры спрайтов, в адресном пространстве ЦП программисты обычно отводят стандартное место 0200h...02FFh. В этом случае при обращении к каналу ПДП сначала в ячейку 2003h заносится байт 00h, затем в ячейку 4014h – байт 02h. Процесс переноса 256 байтов во внутренний буфер ВП, а затем на экран телевизора, происходит автоматически и занимает время около 100 мкс.


5.4 ПОРТЫ ВИДЕОПРОЦЕССОРА

 

С точки зрения программиста ВП является периферийным устройством с байтовым обменом через 8 портов ввода-вывода 2000h...2007h. Кстати, адреса портов ВП зеркально отображаются на карту памяти через каждые последующие 8 байтов. Например, доступ к порту 2001h возможен по адресам 2009h, 2019h и т.д.

Назначение портов ВП [3]:

- 2000h – регистр состояния;

- 2001h – регистр режимов;

- 2002h – регистр синхронизации;

- 2003h, 2004h – регистры адреса и данных ОЗУ спрайтов;

- 2005h – регистр скроллинга;

- 2006h, 2007h -  регистры адреса и данных ОЗУ пейзажа.

 

Назначение разрядов регистра состояния 2000h (запись/чтение):

- разряд 0 - младший разряд номера экранной области;          // 00 или 10 - 2000h…23FFh

- разряд 1 - старший разряд номера экранной области;           // 01 или 11 - 2400h…27FFh

- разряд 2 - "0/1" - приращение адреса на 1 или 32 байта;

- разряд 3 - “0/1” - фонт 0/1 спрайтов;

- разряд 4 - “0/1” - фонт 0/1 пейзажа;

- разряд 5 - “0/1” - обычные (8х8)/удвоенные (8х16) размеры спрайтов;

- разряд 6 - “0” - обычный режим, "1" - режим Hit Switch (некорректная работа);

- разряд 7 - “0/1” - запрет/разрешение прерываний NMI.

 

Назначение разрядов регистра режимов 2001h (запись/чтение):

- разряд 0 - “0/1” - цветное/черно-белое изображение;

- разряд 1 - “0/1” - да/нет маскировка левого столбца пейзажа;

- разряд 2 - “0/1” - да/нет маскировка левого столбца спрайтов;

- разряд 3 - “0/1” - запрет/вывод пейзажа;

- разряд 4 - “0/1” - запрет/вывод спрайтов;

- разряд 5 –  резерв

- разряд 6 –  резерв

- разряд 7 –  резерв

 

Регистр синхронизации 2002h (только чтение) обычно используется для организации задержек во времени. Каждые 20 мс во время обратного хода кадровой развертки его старший разряд устанавливается в “1”. Алгоритм задержки на время N*20 мс может быть следующим. Вначале производится чтение в цикле состояния регистра 2002h и выход из цикла при наличие “1” в старшем (седьмом) разряде. Повторение данной процедуры N раз пропорционально увеличивает задержку.

 

Регистр адреса ОЗУ спрайтов 2003h (только запись), как правило, участвует в рассмотренной ранее процедуре быстрого доступа к каналу ПДП. Теоретически возможна его совместная работа с регистром данных 2004h (запись/чтение) для изменения параметров спрайтов, но, ввиду низкого быстродействия, такой прием в программах “Dendy” редко встречается.

 

Регистр скроллинга 2005h (только запись) организует плавное перемещение (скроллинг) пейзажа в любом направлении с точностью до пиксела. Для сдвига изображения требуется последовательно послать в регистр 2005h два байта: первый – значение сдвига в пикселах по горизонтали, второй – по вертикали. В программах, формирующих статические изображения, в регистр скроллинга должны быть посланы два нуля.

 

Регистры адреса и данных ОЗУ пейзажа 2006h и 2007h в программах используются весьма часто. Они работают в паре и позволяют записывать (считывать) информацию в любую область адресного пространства ВП. Вначале в регистр 2006hзаписывают два байта, определяющие начальный адрес области доступа. Первым идет старший, вторым – младший байт адреса. Затем через регистр 2007h заносятся (считываются) байты данных, причем доступ к каждой последующей ячейке происходит автоматически при каждом новом обращении к регистру 2007h. При чтении данных следует учитывать, что первый полученный байт является недостоверным. При записи подобного ограничения не существует.

 

5.5 ПОРТЫ, РАСПОЛОЖЕННЫЕ В КАРТРИДЖЕ

 

Картриджи, рассчитанные на программы большого объема, содержат внутренний дешифратор банков, обычно называемый MMC (Multi-Memory Controller). Доступ к дешифратору банков производится в адресном пространстве S-ROM записью информации в определенные ячейки памяти (как к портам). Разновидностей дешифраторов банков очень много, поскольку разные фирмы-изготовители пытались таким образом защитить свои картриджи от несанкционированного копирования.

 

Известно несколько десятков вариантов построения дешифраторов банков. Каждую разновидность принято обозначать определенным порядковым номером карты памяти (Memory Mapper), например, #3. Самодельный картридж, примененный в ГИТС, не содержит дешифратора банков, поэтому номер Memory Mapper у него равен #0.

 

Некоторые картриджи содержат дополнительное ОЗУ в виде микросхемы обычной или FLASH-памяти, которое позволяет сохранять игровую ситуацию при выключении питания приставки. Обращение к ОЗУ картриджа производится по адресам 6000h…7FFFh, которые доступны ЦП.


6 ПРОГРАММИРОВАНИЕ В МАШИННЫХ КОДАХ ПРОЦЕССОРА MCS6502

 

Для составления собственных Dendy-программ необходимо научиться программировать на машинном языке процессора MCS6502, который, кстати, относится к числу наиболее легких для освоения. Исторически сложилось так, что опыт программирования в среде процессора MCS6502 в странах СНГ практически отсутствует. В свое время упор был сделан на восьмиразрядные процессоры КР580ВМ80А (аналог i8080) и Z80A. Большой парк контроллеров и домашних ЭВМ на их основе затмил так и не ставшие массовыми ПЭВМ “Агат”, построенные на базе процессора MCS6502. Тем не менее, литература на русском языке для программистов была выпущена [7, 8] и ее можно рекомендовать для углубленного изучения методов программирования на “Dendy”.

 

Процессор MCS6502 содержит 5 восьмиразрядных регистров: А – аккумулятор; X и Y – индексные регистры; P – регистр состояния флагов; SP – указатель стека. Все команды процессора в удобном для обозрения виде приведены в таблице 5.1, а примеры разных способов адресации – в таблице 5.2. Теперь можно легко и быстро сопоставить мнемонику команды с кодом операции.

 

Таблица 5.1 – Машинные коды процессора MCS6502

 

Условные обозначения, принятые в таблице 5.1:

а – двухбайтовый адрес в диапазоне 0000h...FFFFh;

е – однобайтовое относительное смещение (00h...FFh);

z – однобайтовый адрес в диапазоне "нулевой страницы" 0000h...00FFh;

#n – однобайтовая константа (00h...FFh);

А – аккумулятор;

X, Y – индексные регистры.

 

Таблица 5.2 - Примеры способов адресации процессора MCS6502

 

Разнообразие способов адресации лишь на первый взгляд кажется чересчур сложным. Это материал для понимания, а не для запоминания. В своих программах на первых порах можно ограничиться теми способами, которые наиболее понятны. Получающееся при этом некоторое увеличение объема программы, для случая ГИТС не имеет принципиального значения ввиду достаточности свободного места памяти РПЗУ.

 

Функциональное описание системы команд процессора MCS6502 приведено в таблице 5.3. В ней рассмотрены действия, которые совершает процессор над соответствующими операндами. Длительность выполнения команд составляет от 2 до 7 тактов и зависит от способа адресации [8].

 

Таблица 5.3 – Система команд процессора MCS6502

 

Условные обозначения:

m – однобайтовый или двухбайтовый аргумент; е – однобайтовое относительное смещение; С – флаг переноса; А – аккумулятор; XY – индексные регистры; P – регистр состояния; SP – указатель стека; AND – логическое “И”; OR – логическое “ИЛИ”; XRA – исключающее “ИЛИ”.

-----------------------------------------------------------------------------------------------------------

 

 

7 МЕТОДИКА СОСТАВЛЕНИЯ ПРОГРАММЫ ДЛЯ ГИТС

 

Приведенных выше данных достаточно для самостоятельного составления простых программ с ассемблированием кодов вручную. Именно так поступали первопроходцы, собиравшие в 80-х годах компьютеры “Микро-80” и “Радио-86РК”. Подобная практика и сейчас может пригодиться пользователям при разработке собственных телевизионных испытательных таблиц. Однако время не стоит на месте, и было бы большой ошибкой не воспользоваться средствами автоматизации составления программ, представителями которых выступают многочисленные ассемблеры, кроссассемблеры, отладчики.

 

Проще всего осуществить разработку собственной программы для ГИТС при помощи IBM-совместимого компьютера, используя ассемблеры SVASMO2 (John Michne, 1988) или TASM Assembler v2.7 (Speech Technology Inc., 1989). Первая программа ориентирована исключительно на машинные коды MCS6502, вторая – более универсальна и работает со многими типами процессоров. Если выбирать одну программу из двух, то следует предпочесть TASM Assembler, поскольку в ней имеется больше возможностей по диагностике ошибочных ситуаций. Программа TASM Assembler v2.7 для работы под DOS распространяется Shareware, ее архивированная копия находится, в частности, на ftp-сервере журнала “Радио” в виде файла “tasm276.zip”.

 

Опыт подсказывает, что научиться программированию на незнакомом для себя языке проще всего при наличие трех составляющих, во-первых, имея четко поставленную цель, во-вторых, осознавая ее перспективность и, в-третьих, изучая листинги реально работающих программ. В частности, для “Dendy” существует целый кладезь наработанного программного обеспечения, который доступен буквально каждому – это игровые программы, зашитые в игровых картриджах. Бинарные коды программ можно получить при помощи несложной приставки-копировщика "ROM-copier", подключаемой к LPT-порту любого IBM-совместимого компьютера [6]. Далее следует поработать с дизассемблером, понимающим коды процессора MCS6502, например, с многофункциональной программой IDA v3.7 (Data Rescue, 1997).

 

Другой путь – научиться программировать на конкретном специализированном примере, в качестве которого можно использовать программу, зашиваемую в РПЗУ DS1 для ГИТС (из журнала “Радио” [1]). В приложении А приведен ее полный листинг, полученный программой TASM Assembler в виде файла с расширением *.lst. В приложении Б приведены коды прошивки РПЗУ DS2.

 

Методика работы следующая. Вначале необходимо сформировать исходный текст ассемблерной программы в виде текстового DOS-файла под названием “gits.asm”, который легко получить из листинга приложения А, если удалить в каждой строке по 24 первых символов слева (до начала ассемблерных команд). Затем следует поместить файл “gits.asm” в каталог, где находится запускаемый файл “tasm.exe” программы TASM Assembler, после чего набрать в командной строке: tasm –65 –ggits.asm и нажать клавишу <ENTER>. После отработки программы в текущем каталоге должны появиться два новых файла: “gits.lst” (текст листинга, аналогичный приложению А) и “gits.obj” (бинарный файл длиной 1088 байтов для прошивки РПЗУ).

 

Теперь следует внимательно изучить логику работы программы ГИТС по ее ассемблерному тексту и сопоставить алгоритмы с приведенными в настоящем материале. Необходимо учесть, что при разработке базовой программы для ГИТС не ставилась задача получить минимальный объем кода, поэтому имеются резервы для ее сокращения. В частности, можно попытаться внести какие-либо усовершенствования в текст программы, затем сохранить файл с расширением *.asm, запустить еще раз в работу TASM Assembler, получить бинарный файл и прошить его в РПЗУ картриджа “Dendy”. Если все сделано правильно, то на экране телевизора появятся запрограммированные вами изменения в работе ГИТС.