Игровая приставка Dendy Игровая приставка NES (NINTENDO ENTERTAINMENT SYSTEM), более известная в нашей стране под именем DENDY (а также КЕНГА, FAMICOM и еще под несколькими псевдонимами), одной из первых появилась на российском рынке и познакомила тысячи людей с увлекательным миром компьютерных игр. Она подключается к обычному телевизору через антенный или НЧ вход. К приставке можно подсоединить два игровых пульта GAMEPAD или один пульт GAMEPAD и световой пистолет ZAPPER. На корпусе устройства располагаются клавиши включения питания и перезапуска системы. Назначение кнопок на игровом пульте будет понятно даже тем, кто не знает английского языка и потому не в состоянии перевести надписи. Внутри устройства располагаются центральный процессор, являющийся аналогом известного микропроцессора 6502, аудио- и видеопроцессоры. Имеется также оперативное запоминающее устройство объемом 2 Кб. В игровом картридже находится ПЗУ с записанным в нем программным обеспечением и дополнительной видеопамятью. В некоторых модификациях содержится дополнительная память, позволяющая сохранять текущую игровую ситуацию. Модели отличаются друг от друга размером встроенного ОЗУ и звуковым процессором. По этой причине картриджи, нормально функционирующие на одних приставках, не работают с другими. Кроме того, приставки в зависимости от модификации формируют видеосигнал либо в системе PAL, либо в системе NTSC. Параметры этих устройств неодинаковы, и картридж, помеченный как «NTSC only», не сможет корректно работать с игровой приставкой системы PAL. 1.1. Технические характеристики Центральный процессор Тип аналог 6502 Разрядность шины данных 8 бит Разрядность шины адреса 16 бит Тактовая частота 1,773447 МГц Память ОЗУ 2 Кб ПЗУ отсутствует Видеопамять 2 Кб Видеопроцессор Тип графики спрайтовая Разрядность шины адреса 14 бит Разрядность шины данных 8 бит Количество спрайтов 64 Размер спрайтов 8x8 или 8x16 Разрешение 256x240 точек Количество цветов всего 52 одновременно на экране 16 1.2. Архитектура и принцип работы В этом разделе архитектура игровой приставки DENDY рассматривается с точки зрения программирования, подробно описываются центральный процессор, способы формирования изображения, работа аудиопроцессора. Особое внимание уделено внутренним регистрам игровой приставки и особенностям программного обеспечения. 1.2.1. Структурная схема Структурная схема игровой приставки DENDY приведена па рис. 1.1. Основой приставки является центральный процессор (CPU). Во всех приставках, совместимых со стандартом NES, используется процессор, аналогичный известному микропроцессору 6502. На одном кристалле с центральным размещен и музыкальный сопроцессор. В оригинальной приставке, производимой фирмой NINTENDO, применяется аудиопроцессор, реализующий четыре
аналоговых и один цифровой канал звука. Однако большинство приставок, поставляемых в Россию, являются корейскими аналогами, в них встроен звуковой сопроцессор без цифрового канала. Контроллер прямого доступа к памяти (Direct Memory Access, DMA) также располагается на кристалле центрального процессора. Игровые пульты и другие устройства подключаются к шине данных через модуль ввода/вывода, представляющий собой два буферных регистра. В самостоятельный блок выделено также ОЗУ объемом 2 Кб, которое предназначено для хранения переменных, игровых данных, стека процессора и т.д. Формирование картинки на экране телевизора обеспечивает видеопроцессор приставки (PPU). Информация об изображении хранится в видеопамяти (VRAM) объемом 2 Кб. Эта память не связана с основной памятью приставки, доступ к ней осуществляется только через регистры PPU. Видеопроцессор формирует стандартный видеосигнал, который подается на выходной разъем приставки. . Находящийся в корпусе модулятор преобразует сигналы изображения и звука в ВЧ сигнал, предназначенный для подачи на антенный вход телевизора. В пультах установлены кнопки управления и микросхема интерфейса, осуществляющая передачу байта данных центральному процессору приставки. В картридже, который подключается к приставке через 60-контактный (или 72-контактный в модели NES) разъем, располагаются постоянное запоминающее устройство объемом от 16 до 256 Кб, в котором записана игровая программа, и память видеопроцессора. Оперативная память с питанием от батарейки (SRAM), куда записывается игровая ситуация на время выключения приставки, также может находиться в картридже. Чтобы задействовать все ресурсы графического процессора, некоторые картриджи содержат дополнительное ПЗУ или ОЗУ для видеопроцессора (VRAM/VROM). Если объем ПЗУ картриджа превышает 32 Кб, то его обязательной частью является контроллер страниц памяти (МВС), который осуществляет переключение страниц, используемых центральным процессором. Питающее напряжение (+5 В) для приставки поступает от сетевого адаптера через встроенный стабилизатор. 1.2.2. Центральный процессор В данном разделе рассматриваются архитектура процессора, его внутренние регистры, способы адресации, система команд и прерывания. Здесь приводится лишь справочная информация; более полные сведения о программировании на языке ассемблера для процессора 6502 можно найти в изданиях, указанных в конце книги, и в сети Internet. Как отмечалось выше, в игровых приставках, совместимых со стандартом NES, используется центральный процессор, который аналогичен известному микропроцессору 6502 фирмы MOS TECHNOLOGY. От оригинала он отличается отсутствием десятичного режима выполнения арифметических команд. В PAL-версии приставки тактовая частота процессора составляет 1,773447 МГц,. а в NTSC-версии - 1,7897725 МГц. Микропроцессор обменивается информацией с другими устройствами посредством 16-разрядной шины адреса, 8-разрядной шины данных и шины управления. 16 разрядов шины адреса позволяют процессору обращаться к 64 Кб памяти (65535 байт). Регистры внешних устройств адресуются процессором так же, как и ячейки памяти, и находятся в общем адресном пространстве микропроцессора. Структурная схема центрального процессора игровой приставки DENDY приведена на рис. 1.2.
Рис. 1.2. Структурная схема центрального процессора игровой приставки DENDY Регистры процессора Центральный процессор игровой приставки DENDY содержит пять 8-разрядных регистров и один 16-разрядный. Каждый регистр имеет свое имя и отличается по способам использования. Аккумулятор является наиболее часто применяемым регистром микропроцессора. Он служит для загрузки данных в другие регистры, проведения любых математических, и логических операций, а также для иных целей. Фактически это 8-разрядный регистр, который в программах на языке ассемблера обозначается буквой «А». Индексный регистр X задействуется микропроцессором для доступа к ячейкам памяти посредством индексного метода адресации, о котором рассказывается ниже. Этот 8-разрядный регистр необходим при обработке таблиц, хранящихся в памяти. Индексный регистр Y по своему назначению и использованию аналогичен индексному регистру X. Однако в их функционировании есть некоторые различия, которые будут рассмотрены при описании методов адресации микропроцессора. Регистр состояния процессора Р хранит информацию о режиме работы процессора и о результатах проведенных вычислений. Каждый бит этого 8-разрядного регистра является флагом, то есть изменяет свое состояние при определенных условиях. На работу процессора можно влиять путем модификации содержимого этого регистра. Структура регистра состояния центрального процессора игровой приставки DENDY приведена на рис. 1.3.
Рис. 1.3. Структура регистра состояния центрального процессора игровой приставки DENDY Рассмотрим назначение отдельных разрядов регистра. Флаг С играет роль флага переноса, который используется при выполнении сложения или вычитания. Разряд С регистра состояния процессора становится равным 1, если результат выполнения команды сложения больше 255 (OFFh) или если результат выполнения команды вычитания меньше 0. Таким образом, этот флаг представляет собой как бы дополнительный разряд аккумулятора, позволяющий проводить арифметические операции с числами, разрядность которых превышает 8 бит. Флаг Z - флаг нулевого результата, который равен 1, если результатом выполнения команды является 0. Флаг I - флаг прерываний, устанавливаемый и сбрасываемый командами процессора SEI и CLI. 1 в этом разряде запрещает процессору обрабатывать запросы прерывания, поступающие по линии IRQ. Более подробно эта тема рассматривается при описании системы прерываний процессора. Флаг D - флаг десятичного режима. Микропроцессор игровой приставки не поддерживает работу арифметических команд в двоично-десятичном коде, поэтому состояние данного флага не влияет на функционирование процессора. Программист может использовать этот бит регистра состояния по своему усмотрению. Состояние флага изменяется программно командами SED и CLD. Оригинальный микропроцессор 6502 позволяет складывать и вычитать числа как в двоичном, так и в двоично-десятичном коде. Если флаг D равен 0, то операнды команд сложения и вычитания рассматриваются как двоичные числа, а если установлен в 1 - как двоично-десятичные. Флаг В - флаг программного прерывания, устанавливается при выполнении команды BRK. Флаг V - флаг переполнения. Равен 1, если результат арифметической операции над числами со знаком выходит за допустимые пределы или если при выполнении арифметической операции осуществлялся перенос из шестого разряда в седьмой. Флаг N - флаг знака, который равен седьмому разряду результата арифметической операции. Указатель стека S содержит младший байт адреса первой свободной ячейки в специальной структуре данных, называемой стеком. В стек можно записывать данные, а при обработке прерываний или при вызове подпрограммы здесь сохраняется адрес возврата. В рассматриваемом микропроцессоре стек всегда располагается в первой странице памяти, которая находится в диапазоне 0100h - 01FFh, таким образом, для указания адреса вершины стека достаточно 8-разрядного регистра. Стек растет вниз, то есть от адреса 01FFh к адресу 0100h. Счетчик команд PC представляет собой единственный 16-разрядный регистр центрального процессора игровой приставки DENDY. Его назначение - указывать адрес команды, которая выполняется микропроцессором. Центральный процессор приставки регулярно извлекает команду, размещенную в памяти по адресу, на который указывает счетчик команд, увеличивает значение счетчика, обрабатывает команду и повторяет этот цикл снова. Команды перехода позволяют изменить содержимое программного счетчика и задать необходимый порядок выполнения команд, размещенных в памяти. Способы адресации Большинство команд процессора обеспечивают выполнение действий с какими-либо данными. Например, для сложения нужны два числа. Один из операндов микропроцессора приставки всегда размещается в аккумуляторе, куда после выполнения команды помещается результат. Второй операнд содержится в памяти по исполнительному адресу. Исполнительный адрес - это фактический номер ячейки памяти, начиная с которой располагаются необходимые для процессора команды или данные. Возможные приемы формирования процессором исполнительного адреса называются способами адресации. Описываемый процессор насчитывает тринадцать различных способов адресации (см. ниже). Некоторые методы формирования исполнительного адреса в процессоре игровой приставки DENDY представлены на рис. 1.4. Аккумуляторная адресация. При использовании этого способа операция производится над содержимым аккумулятора.
Рис. 1.4. Методы формирования исполнительного адреса в процессоре игровой приставки DENDY Например: LSR А ; Логический сдвиг байта ; из аккумулятора вправо. Неявная адресация. Для команд, применяющих такой метод, расположение данных строго фиксировано и дополнительных указаний не требуется. Например: TAX ; Переслать данные из А в X. Непосредственная адресация. В этом случае 8-разрядный операнд хранится в памяти сразу за кодом команды, то есть по адресу РС+1 (рис. 1.4а). В программах на языке ассемблера непосредственная адресация обозначается знаком # перед операндом. Прямая адресация. При работе с данным алгоритмом адресации в команде указывается адрес расположения операнда в памяти компьютера (рис. 1.46). Прямая адресация нулевой страницы. Если операнд расположен в нулевой странице памяти (адреса 0000h - 00FFh), можно задействовать команды с прямой адресацией нулевой страницы, которые занимают меньше места в памяти и быстрее выполняются. Первый байт адреса всегда равен 0 и подставляется процессором автоматически. Этапы формирования исполнительного адреса представлены на рис. 1.4в. Индексированная по X адресация. Все команды, применяющие этот метод, занимают в памяти компьютера три байта. Первый байт содержит код команды, второй и третий - базовый адрес. Исполнительный адрес операнда получается суммированием базового адреса с содержимым регистра X, как показано на рис. 1.4г. Индексированная по Y адресация. Аналогична рассмотренной выше, только вместо регистра X используется регистр Y. Индексированная по X адресация нулевой страницы. В данном случае команды занимают два байта: первый содержит код команды, а второй - базовый адрес в нулевой странице памяти. Исполнительный адрес операнда образуется путем сложения базового адреса с содержимым регистра X микропроцессора, как показано на рис. 1.4д. При попытке адресоваться за пределы нулевой страницы (если сумма базового адреса и содержимого индексного регистра больше 0FFh) формируется исполнительный адрес 0000h. Индексированная по Y адресация нулевой страницы. Аналогична рассмотренному выше способу, только вместо регистра X применяется регистр Y микропроцессора. Индексно-косвенная адресация. Команды с таким методом адресации всегда двухбайтные. Первый байт включает в себя код команды, а второй -базовый адрес в нулевой странице памяти. Исполнительный адрес вычисляется по следующему алгоритму (рис. 1.4е): 1. Базовый адрес суммируется с содержимым регистра X. При этом старший байт полученного адреса всегда равен 00h (то есть FFh + 02h = 01h), а не 0101h. 2. Из ячейки с вычисленным адресом считывается младший байт адреса операнда. 3. Адрес ячейки памяти увеличивается на 1. Если адрес был 0FFh, то следующий адрес будет 00h, то есть адресации за пределы нулевой страницы не происходит. 4. Из ячейки памяти с полученным адресом считывается старший байт адреса операнда. 5. Из ячейки памяти с вычисленным адресом извлекается операнд. Косвенно-индексная адресация. Команды, использующие данный метод, также занимают в памяти компьютера два байта. Первый байт содержит код операции, а второй - адрес в нулевой странице. Исполнительный адрес операнда вычисляется по следующему алгоритму (рис. 1.4ж): 1. Из ячейки памяти, расположенной в нулевой странице по указанному в команде адресу, извлекается младший байт базового адреса. 2. Адрес ячейки памяти увеличивается на 1. Если адрес был 0FFh, то следующий адрес будет 00h, то уесть адресации за пределы нулевой страницы не происходит. 3. Из ячейки памяти с полученным адресом считывается старший байт базового адреса. 4. К базовому адресу прибавляется содержимое регистра Y. 5. Из ячейки памяти с вычисленным адресом извлекается операнд. Относительная адресация. Этот метод адресации применяется в командах перехода. Первый байт команды содержит код операции, а второй - смещение в диапазоне от -128 до 127. Отрицательное смещение указывается в дополнительном коде. При выполнении команды перехода смещение прибавляется к содержимому программного счетчика для получения адреса следующей выполняемой команды. Не забывайте, что смещение складывается с содержимым программного счетчика, когда тот указывает на команду, идущую за командой перехода. Косвенная адресация. С данным методом способна работать только команда безусловного перехода JMP. При этом в команде задается адрес ячейки памяти, содержащей адрес перехода. Обратите внимание: выхода за пределы страницы при извлечении адреса перехода из памяти не будет, то есть старший байт адреса не изменится. Например, при выполнении команды JMP ($C0FF) младший байт адреса извлекается из ячейки памяти с адресом с 0FFh, а старший байт - из ячейки с адресом С000h, а не С100h, как можно было бы ожидать. Система команд Центральный процессор игровой приставки DENDY способен выполнять 56 различных команд. Все команды процессора делятся на следующие основные группы: * команды пересылки данных: LDA, STA, LDX, STX, LDY, STY, TAX, TAY, ТХА, TYA, TSX, TXS; * команды арифметических операций: INC, DEC, INX, I NY, DEX, DEY, ADC, SBC; * команды логических операций: AND, ORA, EOR; * команды сравнения: CMP, CPX, CPY, BIT; * команды сдвига: ASL, ASR, ROL, ROR; * команды перехода: BCC, BCS, BEQ, BNE, BMI, BPL, BVC, BVS, JMP; * команды работы с подпрограммами: JSR, RTS; * команды управления процессором: CLC, SEC, CLD, SED, CLV, CLI, SEI, RTI, BRK, NOP; * команды работы со стеком: РHА, PHP, PLA, PLP. Полная информация о системе команд центрального процессора игровой приставки DENDY приведена в приложении 1. Система прерываний Центральный процессор игровой приставки DENDY может обрабатывать три независимых запроса на прерывание. В таком случае выполнение программы приостанавливается, в стеке сохраняется регистр состояния процессора и текущее значение программного счетчика, а затем из памяти считывается вектор прерывания. Вектор прерывания - это адрес программы, которая должна выполняться каждый раз, когда центральный процессор получает запрос на прерывания от внешних устройств. Прочитав из памяти вектор прерывания, процессор записывает его в программный счетчик и запускает процедуру обработки прерывания. Рассмотрим возможные типы прерываний и процедуры их обработки. Маскируемое прерывание IRQ. Процедуру обработки данного прерывания центральный процессор выполняет каждый раз, когда получает сигнал низкого уровня по шине IRQ, если флаг I в регистре состояния сброшен. Эту процедуру также можно вызвать, выполнив команду процессора BRK. В случае программного прерывания перед началом его обработки в регистре состояния процессора устанавливается флаг В. При обслуживании запроса на прерывание в стеке сохраняются состояния программного счетчика и регистра состояния процессора, после чего выполняется программа, адрес начала которой записан в ячейках памяти FFFEh и FFFFh. Для возврата из прерывания применяют команду RTI. При' этом из стека считываются сохраненные значения регистра состояния микропроцессора и программного счетчика, а затем продолжается исполнение прерванной программы. В стандартной конфигурации игровой приставки сигнал запроса маскируемого прерывания IRQ выведен на разъемы расширения и подключения картриджа, однако игровые программы используют только возможность программного прерывания при выполнении команды BRK. Немаскируемое прерывание NMI. Это самый важный запрос на прерывание в игровой приставке. Любая программа обязательно содержит процедуру его обработки. Каждый раз, когда заканчивается формирование очередного кадра (50 раз в секунду для стандарта PAL и 60 раз в секунду для стандарта NTSC), по переднему фронту кадрового гасящего импульса видеопроцессор приставки формирует сигнал запроса немаскируемого прерывания и посылает его центральному процессору. Процессор прерывает исполнение программы, сохраняет в стеке значения программного счетчика и регистра состояния, после чего запускает процедуру обслуживания немаскируемого прерывания, адрес которой записан в ячейках памяти FFFAh и FFFBh. Возврат из процедуры обработки осуществляется также командой RTI. Особая важность этого прерывания для игровой приставки объясняется тем, что центральный процессор может обмениваться данными с видеопамятью только в те моменты, когда формируется кадровый гасящий импульс, начало которого и вызывает запрос на прерывание. Таким образом, программа обработки немаскируемого прерывания в любой видеоигре осуществляет запись в регистры видеопроцессора и пересылку заранее подготовленных данных в видеопамять. Сброс микропроцессора. Данное прерывание происходит при включении питания приставки и при поступлении сигнала низкого уровня на вход RESET. При этом центральный процессор копирует в программный счетчик содержимое ячеек памяти с адресами FFFCh, FFFDh и начинает выполнение программы. Состояние регистров процессора не изменяется. Далее>>