4.2.4. Внутренние контроллеры Внутренние контроллеры игровой приставки пересылают данные, формируют запросы на прерывание и управляют состоянием аппаратуры. В отличие от сопроцессоров, для работы с контроллерами не предусмотрено специальных команд; с точки зрения программирования они представляют собой несколько ячеек в общем адресном пространстве приставки. Ниже мы рассмотрим программную архитектуру таймера, контроллера прерываний и контроллера прямого доступа к памяти. Контроллер прерываний Контроллер прерываний формирует запросы на обслуживание прерываний, которые в дальнейшем будут обрабатываться сопроцессором управления системой. Контроллер использует два регистра с адресами lF801070hH 1F801074h. Разряды регистров управляют следующими прерываниями: D0 - прерывание по кадровому синхроимпульсу; D1 - прерывание от графического процессора; D2 - прерывание от контроллера CD-ROM; D3 - прерывание от контроллера прямого доступа к памяти; D4 - прерывание от канала 0 таймера; D5 - прерывание от канала 1 таймера; D6 - прерывание от канала 2 таймера; D7 - прерывание от пульта; D8 - прерывание от последовательного порта; D9 - прерывание от звукового процессора; D10 - прерывание от параллельного порта. Если вы сравните приведенный перечень со списком классов событий, возникающих при работе с аппаратурой, то увидите, что каждому типу прерываний соответствует определенный класс события. Чтобы процессор мог обслуживать запросы на прерывания, требуется разрешить формирование сигнала, поместив соответствующий разряд в регистр lF801074h, и допустить обработку запросов сопроцессором управления системой, для чего установить разряд D0 и один из разрядов D15 - D8, соответствующий данному прерыванию в регистре SR сопроцессора управления системой. После инициализации аппаратной части посредством функции openevent необходимо создать запись в таблице обрабатываемых событий с соответствующим классом и, наконец, вызвать функцию enableevent, чтобы разрешить обслуживание данного события. Перед завершением программа обслуживания прерывания должна передать контроллеру сигнал о своем завершении. Для этого необходимо сбросить соответствующий разряд в регистре подтверждения прерывания с адресом 1F801070h. В противном случае дальнейшая генерация запросов для данного прерывания будет блокирована. Таймер Таймер обычно применяется для синхронизации работы программы и различных блоков игровой приставки, а также для измерения временных интервалов с целью привязки функционирования процессора к реальному времени. Всего в таймере предусмотрено три независимых канала. Как отдельный таймер молено также использовать запрос прерывания по кадровому синхроимпульсу. На вход каждого из каналов таймера поступает опорный сигнал с фиксированной частотой, которая задается следующим образом: канал 0 - частота формирования точек на экране; канал 1 - частота строчной синхронизации; канал 2 - частота процессора, деленная на 8. При поступлении тактового импульса показания внутреннего 16-разрядного счетчика таймера увеличиваются на 1. Когда счетчик достигает значения FFFFh или значения, записанного в управляющем регистре, соответствующий канал таймера генерирует запрос на прерывание. С точки зрения программирования канал таймера представляет собой три регистра, о которых подробно рассказывается ниже. Счетчик канала 0 Адрес: 1F801100h. Назначение разрядов. Текущее 16-разрядное значение внутреннего счетчика канала 0. Управляющий регистр канала 0 Адрес: 1F801104h. Назначение разрядов: D0 - управление состоянием таймера: 0 — таймер включен; 1 - таймер в режиме ожидания. D3 - определение режима счета: 0 - счет до FFFFh; 1 - счет до заданного значения. D4, D6 - разряды должны быть равны 1, чтобы таймер формировал запрос на прерывание. D8, D9 - код опорной частоты: 00 - опорная частота 33,872 МГц; 01 - опорная частота равна частоте формирования точек изображения; 10, 11 - не используются. Регистр граничного значения канала 0 Адрес: 1F801108h. Назначение разрядов. Если разряд D3 в управляющем регистре установлен, то счет ведется до значения, заданного в этом регистре. Счетчик канала 1 Адрес: 1F801110h. Назначение разрядов. Текущее 16-разрядное значение внутреннего счетчика канала 1. Управляющий регистр канала 1 Адрес: 1F801114h. Назначение разрядов: DO - управление состоянием таймера: 0 - таймер включен; 1 - таймер в режиме ожидания. D3 - определение режима счета: 0 - счет до FFFFh; 1 - счет до заданного значения. D4, D6 - разряды должны быть равны 1, чтобы таймер формировал запрос на прерывание. D8, D9 - код опорной частоты: 00 - опорная частота 33,872 МГц; 01 - опорная частота равна частоте строчной развертки; 10, 11 - не используются. Регистр граничного значения канала 1 Адрес: 1F801118h. Назначение разрядов. Если разряд D3 в управляющем регистре установлен, счет ведется до значения, заданного в этом регистре. Счетчик канала 2 Адрес: 1F801120h. Назначение разрядов. Текущее 16-разрядное значение внутреннего счетчика канала 2. Управляющий регистр канала 2 Адрес: 1F801124h. Назначение разрядов: D0 - управление состоянием таймера: 0 - таймер включен; 1 - таймер в режиме ожидания. D3 - определение режима счета: 0 - счет до FFFFh; 1 - счет до заданного значения. D4, D6 - разряды должны быть равны 1, чтобы таймер формировал запрос на прерывание. D8, D9 - код опорной частоты: 00 - опорная частота 33,872 МГц; 10 - 4,234 МГц; 01, 11 - не используются. Регистр граничного значения канала 2 Адрес: 1F80112 8h. Назначение разрядов. Если разряд D3 в управляющем регистре установлен, счет ведется до значения, заданного в этом регистре. Чтобы использовать таймер в ваших программах, потребуется выполнить следующие действия: 1. Инициализировать таймер, поместив 0 в регистр счетчика и регистр режима. 2. Записать в регистр граничного значения необходимый предел для счета, затем ввести код требуемого режима в регистр управления. 3. Разрешить формирование запроса на прерывание, установив соответствующие разряды в регистрах контроллера прерываний (за прерывания от счетчиков отвечают разряды D4 - D6). 4. Создать запись в таблице событий, вызвав функцию openevent. В качестве параметров указать класс события F200 00 00h (если используется канал 0), F2000001h (для канала 1) или F2000002h (для канала 2),спецификаторсобытия ооо2h (прерывание) и режим 1000h (обработка прерывания). В регистре а3 задать адрес функции, которая будет обслуживать данное прерывание. 5. Разрешить обработку только что созданного события, вызвав функцию enableevent. 6.Убедиться, что сопроцессор управления системой будет принимать поступающие запросы на прерывание. Для этого разряды D10и D0в регистре SR должны быть установлены. Все необходимые действия выполнены. Ваш обработчик должен восстанавливать значения регистров и завершаться командой jrra. Контроллер прямого доступа к памяти Контроллер прямого доступа к памяти позволяет быстро передавать большие объемы данных между различными блоками системы без участия центрального процессора. Подобное устройство имеется практически в каждой игровой приставке и используется во всех программах. Контроллер ПДП SONY PLAYSTATION может обслуживать семь независимых каналов прямого доступа к памяти, каждый из которых характеризуется собственной функцией: канал 0 - вход декодера MDEC; канал 1 - выход декодера MDEC; канал 2 - графический процессор; канал 3 - CD-ROM; канал 4 - звуковой процессор; канал 5 - параллельный порт; канал 6 - очистка очереди. С точки зрения программирования контроллер прямого доступа к памяти SONY PLAYSTATION представляет собой два общих регистра управления и по три регистра для каждого из каналов. Общие регистры управления располагаются по адресам 1F8010F0h и 1F8010F4h. Регистры канала 0 занимают дреса 1F801080h, lF801084h и lF801088h, канала 1 - 1F801090h, 1F801094h и 1F801098h, канала 2 - 1F8010A0h, 1F8010A4h и 1F8010A8h и так далее до канала 6. Названные регистры аналогичны, поэтому ниже мы опишем их только для канала 0. Регистр разрешения работы каналов Адрес: 1F8010F0h. Назначение разрядов. Разряды регистра разрешают или запрещают работу отдельных каналов прямого доступа к памяти. Чтобы канал можно было использовать, надлежащий разряд нужно установить в 1. Соответствие разрядов регистра номерам каналов следующее: D3 - канал 0; D7 - канал 1; D11 - канал 2; D15 - канал 3 D19 - канал 4: D23 - канал 5 D27 - канал 6 Регистр управления прерываниями Адрес: 1F8010F4h. Назначение разрядов. Разряды регистра управляют генерацией запросов на прерывание от контроллера ПДП. Чтобы для выбранного канала прямого доступа к памяти формировался запрос на прерывание, здесь нужно установить определенный разряд: D16 для канала 0, D17 для канала 1, D18 для канала 2 и т.д. После обслуживания запроса программа должна установить бит подтверждения обработки: D24 для канала 0, D25 для канала 1, D26 для канала 2 и т.д. Это необходимо, чтобы запрос на прерывание мог генерироваться повторно. Разряды D23 и D31 всегда должны быть равны 1. Далее рассматриваются регистры, предназначенные для управления отдельным каналом прямого доступа к памяти. Вместо х следует подставлять соответствующую цифру базового адреса (8 для канала 0; 9 для канала 1; А для канала 2 и т.д.). Регистр базового адреса Адрес: 1F8010x0h. Назначение разрядов. В регистр записывается начальный адрес блока, который будет передаваться или приниматься посредством прямого доступа к памяти. Регистр размера блока Адрес: 1F8010x4h. Назначение разрядов. В разряды D15 - D0 регистра записывается размер передаваемого блока в словах, а в разряды D31 -D16- количество таких блоков. Убедитесь, что устройство, которому пересылаются данные, способно принять блоки заданной величины. Например, графический и звуковой процессоры игровой приставки могут получать блоки размером не более 16 слов. Регистр управления каналом Адрес: 1F8010x8h. Назначение разрядов. Регистр предназначен для управления отдельным каналом прямого доступа к памяти. D24 - канал свободен, если разряд сброшен. Передача данных начнется, когда сюда будет записана 1. Разряд автоматически сбрасывается после завершения пересылки данных. D10 - если разряд установлен, передается связанный список данных. Этот режим возможен только при работе с графическим процессором. D9 - если разряд установлен в 1, передается последовательный поток данных. D0 - если разряд сброшен, данные принимаются от устройства и записываются в память; если установлен - считываются из памяти и передаются устройству. 4.2.5. Видеопроцессор Графический процессор игровой приставки SONY PLAYSTATION (Graphics Picture Unit, GPU) является основным устройством, отвечающим за формирование картинки на экране. Для хранения данных об изображении графический процессор использует 1 Мб быстродействующей видеопамяти и 2 Кб кэш-памяти текстур. Процессор ориентирован на трехмерную полигональную графику, но может также работать с двумерной графикой и спрайтами. Для быстрой передачи данных от центрального процессора к графическому применяется канал прямого доступа к памяти. Видеопамять Знакомство с работой видеопроцессора мы начнем с описания различных областей памяти, которые используются при формировании изображения. К таким областям относятся буфер кадра, память текстур и цветовая таблица. В памяти кадра хранятся все графические данные, которые видеопроцессор применяет для построения очередного кадра. Для центрального процессора эта область памяти доступна только через регистры графического процессора, поэтому работа с ней имеет определенную специфику. С точки зрения программирования память кадра представляет собой массив точек: 1024 по горизонтали и 512 по вертикали. Каждая точка в памяти занимает одно слово (16 разрядов) и хранится в формате, изображенном на рис. 4.6а. Доступ к точке осуществляется по ее координатам, а не по адресу в видеопамяти. Верхнему левому углу соответствуют координаты (0, 0), а правому нижнему -(1023, 511). Когда графический процессор выводит рисунок на экран, из памяти кадра выбирается отображаемая область, на основе данных которой формируется выходной сигнал. Размеры показываемого фрагмента определяются путем записи координат его верхнего левого угла и размеров в регистры графического процессора. Кроме 15-разрядного, игровая приставка SONY PLAYSTATION может использовать 24-разрядный цвет. В таком случае две точки, выводимые на экран, представляются тремя точками в памяти кадра. Применяемый при этом формат хранения данных показан на рис. 4.66. Другой областью видеопамяти является память текстур. Текстурой называется двумерное изображение, накладываемое при выводе на полигон или спрайт. Шаблоны текстур представляют собой изображения фиксированного размера. В качестве места хранения текстур в SONY PLAYSTATION задействуется часть памяти кадра. Создаваемые текстуры могут быть 15-,. 8- или 4-разрядными. Разрядность текстуры определяет число битов, выделяемых для размещения информации о точке, и, следовательно, максимальное количество цветов, которые можно использовать для текстуры. Форматы хранения текстур представлены на рис. 4.6, ниже приведено их краткое описание. В 15-разрядных текстурах каждой точке соответствует одно слово (два байта), где располагаются 15-разрядный код цвета (в разрядах D0 - D14) и бит признака прозрачности (в разряде D15). О реализации эффекта прозрачности речь пойдет чуть позже. Таким образом, 15-разрядные текстуры обладают самой большой палитрой - до 32768 цветов, но также превосходят остальные и по объему занимаемой памяти. В 8-разрядных текстурах применен несколько иной формат хранения. В этом случае каждый байт содержит индекс цвета. Одно слово задает две точки, а в текстуре имеется 256 цветов. Графический процессор приставки получает индекс и считывает цвет с данным индексом из таблицы. Таблица представляет собой отдельную область памяти, в которой хранятся полные 15-разрядиые коды цвета. Структура таблицы цветов и принципы работы с нею будут описаны ниже. Число таблиц не ограничивается ничем, кроме объема памяти, но текстура может использовать только одну таблицу. 4-разрядные текстуры очень похожи на 8-разрядные, но для каждого цвета здесь требуется 4 бита. Соответственно такие текстуры являются 16-цветными. Для них также необходима таблица цветов. Рис. 4.6. Формат графических данных в экранной памяти Текстуры хранятся в специальной области памяти, называемой страницей текстур, которая является частью памяти кадра и имеет размер 256x256 точек независимо от установленного цветового режима. Точки в странице текстур адресуются относительно начала этой страницы, а не относительно начала памяти кадра. Таким образом, координаты верхнего левого угла страницы текстур всегда будут равны (0, 0), а координаты правого нижнего - (255, 255). В случае необходимости разрешается создать несколько страниц текстур. Графическому процессору при формировании изображения приходится производить чтение текстуры из памяти для каждого использующего ее примитива. Чтобы эти действия не приводили к большим потерям времени, в графическом процессоре установлена кэш-память текстур. Размер изображения, которое может храниться в кэше, зависит от применяемого формата текстуры и составляет 64x64 точки для 4-разрядных текстур, 64x32 точки для 8-разрядных и 32x32 точки для 15-разрядных. Для максимально быстрого исполнения программ следует использовать текстуры указанного размера. Таблица цветов Таблица цветов требуется при работе графического процессора с текстурами и представляет собой часть памяти кадра. Она содержит 256 слов для 256-цветного режима или 16 слов для 16-цветного. В каждом слове хранится код одного цвета в стандартном 15-разрядном формате, характерном и для приставки SONY PLAYSTATION. Цветовых таблиц может быть несколько, как и областей текстур, но каждый примитив способен использовать только одну таблицу цветов и одну страницу текстур. Возможности графического процессора Ознакомившись с областями памяти, применяемыми при формировании изображения, перейдем к рассмотрению возможностей графического процессора. Рисунок на экране строится из примитивов. Примитивы - это базовые графические элементы, используемые графическим процессором для создания изображений. Более сложные фигуры должны разделяться на составляющие их примитивы. Набор примитивов характерен для трехмерной графики. Точка - простейший элемент изображения, определяющий единственную точку и ее цвет. Фактически он обрабатывается графическим процессором как прямоугольник с размерами 1x1. Линия - несколько более сложный элемент, задающий прямую линию (совокупность точек) между двумя точками с указанными координатами. При рисовании линии можно использовать затенение Гуро. Полилиния характеризует ломаную линию, состоящую из нескольких отрезков. Прямоугольник - примитив, который представляет собой прямоугольную область экрана, специфицируемую координатами верхнего левого угла, высотой и шириной. При отображении такого элемента на экран выводится прямоугольник, закрашенный выбранным цветом. Спрайт - прямоугольник с текстурой, определяемый так же, как и любой прямоугольник, но имеющий в качестве дополнительного параметра расположение нужной текстуры. Хотя этот элемент и назван спрайтом, его возможности несколько меньше, чем в игровых приставках, ориентированных на спрайтовую графику. Полигон - выпуклый многоугольник, из набора которых строится изображение на экране. Графический процессор игровой приставки SONY PLAYSTATION способен рисовать полигонами с тремя и четырьмя вершинами, причем четырехугольник обрабатывается процессором как два треугольника. Каждый многоугольник описывается координатами своих вершин. При рисовании можно использовать затенение Гуро. Работа с полигонами осуществляется медленнее, чем вывод прямоугольников, и их назначение также различно: прямоугольники необходимы для изображения плоских объектов, а полигоны - для трехмерных. Полигон с текстурой - это полигон, который показывается вместе с выбранной текстурой. Текстура играет роль обоев, наклеиваемых на объект с целью нанесения сложного рисунка на его поверхность. Полигон с текстурой создается аналогично обычному полигону, но требует в качестве дополнительного параметра адрес используемой текстуры. Вид выводимых на экран примитивов определяют три параметра: прозрачность, освещенность и маскирование. Когда при формировании изображения используется режим прозрачности, цвет точки, которая будет показана на экране, вычисляется на основе цвета точки, уже записанной на этом месте в памяти кадра, и точки, которая рисуется. В зависимости от выбранного режима расчета прозрачности пригодна одна из следующих формул: 0,5В + 0.5F; 1,0В + 1,0F; 1,0В - 1.0F; 1,0В + 0,25F, где В - цвет точки из памяти кадра, a F - цвет рисуемой точки. Режим прозрачности разрешается задать для любого изображаемого примитива. Если примитив не использует текстуру, прозрачность применяется ко всему объекту. Если рисуется полигон с текстурой, возможны следующие варианты: * в случае 15-разрядных текстур режим задается индивидуально для каждой точки текстуры посредством флага, расположенного в старшем разряде; * в случае 8- или 4-разрядных текстур прозрачность указывается для каждого цвета. С этой целью в таблице цветов устанавливается старший разряд данных соответствующего оттенка. Применение такого режима замедляет работу графического процессора, поскольку для рисования точки на экране требуются две операции чтения и расчет значения цвета. Освещенность позволяет изменять цвет объекта в зависимости от положения источников света. В игровой приставке SONY PLAYSTATION имеется режим равномерной освещенности и освещенности по алгоритму Гуро. В первом случае для любого примитива используется одно значение, определяющее его яркость; во втором отдельные значения яркости указываются для каждой вершины примитива, а конечное значение вычисляется путем их интерполяции. Режим маскирования разрешает задавать в памяти кадра области отсечения, ограничивающие рисуемое изображение. Ниже мы рассмотрим основные принципы задания параметров, определяющих вид выводимого изображения. Более подробную информацию можно найти в разделе, посвященном командам графического процессора. Сначала надо указать размер экрана, которое будет использоваться в программе. Экран может быть 256, 320, 384, 512 или 640 точек шириной и 240 или 480 точек высотой. Этот параметр также определяет размер отображаемой области памяти в буфере кадра. Затем требуется определить, будет ли использоваться чересстрочный режим. Дело в том, что большинство телевизионных приемников не в состоянии показывать картинку с разрешением 480 точек по вертикали. В этом случае включается чересстрочный режим формирования изображения, когда на экран сначала выводятся четные строки, а затем нечетные. Для зрителя чередующиеся полукадры сливаются в один. Следующий шаг - выбор числа цветов: 15- или 24-разрядное кодирование цвета. Кроме того, нужно задать формат выходного сигнала. Игровая приставка SONY PLAYSTATION может формировать выходной сигнал, используя систему кодирования цветовой информации PAL или NTSC. Выбор системы осуществляется программным путем. Работа с графическим процессором Вся работа с графическим процессором игровой приставки ведется с применением двух 32-разрядных регистров: данных и управления. Для передачи данных графическому процессору часто используется контроллер ПДП. Особенности прямого доступа к памяти будут рассмотрены чуть позднее. Регистр данных графического процессора Адрес: 1F801810h. Назначение разрядов. Через регистр осуществляется обмен данными между центральным и графическим процессорами приставки. Регистр состояния графического процессора Адрес: 1F801814h. Назначение разрядов. Регистр применяется при управлении функционированием графического процессора и для получения информации о текущем режиме. Назначение разрядов различно при чтении и записи, поэтому работу с данным регистром мы рассмотрим отдельно для каждого режима. При чтении из регистра программа получает слово состояния графического процессора. Назначение разрядов этого слова следующее: D31 - состояние разряда используется только при работе в чересстрочном режиме. Если разряд сброшен, то видеопроцессор в данный момент формирует кадр с четными строками, если установлен в 1 - с нечетными строками. D29, D30 - состояние разрядов зависит от текущего режима работы контроллера прямого доступа к памяти. Возможны следующие комбинации: 00 - контроллер ПДП не применяется; 01 - неиспользуемая комбинация; 10 - данные передаются от центрального процессора к графическому; 11 - данные передаются от графического процессора к центральному. D28 - если разряд сброшен, графический процессор не готов к приему команды. D27 - если разряд сброшен, графический процессор не готов к пересылке изображения. D26 - если разряд сброшен, графический процессор занят рисованием примитива. Если разряд равен 1, графический процессор простаивает. D25, D24 - не используются. D23 - если разряд сброшен, графический процессор формирует изображение на экране, если установлен в 1 — графический процессор отключен, и изображение на экране отсутствует. D22 - ЕСЛИ РАЗРЯД УСТАНОВЛЕН в 1, ГРАФИЧЕСКИЙ ПРОЦЕССОР РАБОТАЕТ В ЧЕРЕССТРОЧНОМ РЕЖИМЕ. D21 - ЕСЛИ РАЗРЯД СБРОШЕН, ИСПОЛЬЗУЕТСЯ 15-РАЗРЯДНОЕ КОДИРОВАНИЕ ЦВЕТА; ЕСЛИ УСТАНОВЛЕН в 1 -24-РАЗРЯДНОЕ. D20 - ЕСЛИ РАЗРЯД УСТАНОВЛЕН В 1, ВИДЕОПРОЦЕССОР ФОРМИРУЕТ СИГНАЛ ИЗОБРАЖЕНИЯ В СИСТЕМЕ PAL, В ПРОТИВНОМ СЛУЧАЕ - в ФОРМАТЕ NTSC. D19 - ОПРЕДЕЛЯЕТ РАЗМЕР ИЗОБРАЖЕНИЯ ПО ВЕРТИКАЛИ: 0 - 240 ТОЧЕК; 1 - 480 ТОЧЕК. D18-D16 - УКАЗЫВАЮТ РАЗМЕР ИЗОБРАЖЕНИЯ ПО ГОРИЗОНТАЛИ: 000 - 256 ТОЧЕК; 001 - 384 ТОЧКИ; 010 - 320 ТОЧЕК; 100 - 512 ТОЧЕК; 110 - 640 ТОЧЕК. D15 - D13 - НЕ ИСПОЛЬЗУЮТСЯ. D12 - ЕСЛИ РАЗРЯД УСТАНОВЛЕН в 1, ТОЧКИ, У КОТОРЫХ УСТАНОВЛЕН БИТ МАСКИРОВАНИЯ (САМЫЙ СТАРШИЙ РАЗРЯД), НЕ ОТОБРАЖАЮТСЯ. D11 - ЕСЛИ РАЗРЯД УСТАНОВЛЕН В 1, АКТИВИЗИРУЕТСЯ РЕЖИМ МАСКИРОВАНИЯ; ИНАЧЕ ДАННЫЙ РЕЖИМ ВЫКЛЮЧЕН. D10 - УПРАВЛЕНИЕ РИСОВАНИЕМ В ОБЛАСТИ ЭКРАНА: ЕСЛИ РАЗРЯД УСТАНОВЛЕН, РИСОВАНИЕ РАЗРЕШЕНО, ЕСЛИ СБРОШЕН - ЗАПРЕЩЕНО. D9 - ВКЛЮЧЕНИЕ РЕЖИМА СМЕШИВАНИЯ ЦВЕТОВ. D8, D7 - ЗАДАНИЕ РАЗРЯДНОСТИ ЦВЕТА ТЕКСТУР: 00 - 4-РАЗРЯДНЫХ ТЕКСТУР; 01 - ДЛЯ 8-РАЗРЯДНЫХ; 10 - ДЛЯ 15-РАЗРЯДНЫХ; 11 - НЕ ПРИМЕНЯЕТСЯ. D6, D5 - КОД, ПОМЕЩАЕМЫЙ В ЭТИ РАЗРЯДЫ, ОПРЕДЕЛЯЕТ ФОРМУЛУ ДЛЯ РАБОТЫ С ПРОЗРАЧНЫМИ ТЕКСТУРАМИ. СООТВЕТСТВИЕ КОДОВ И ФОРМУЛ СЛЕДУЮЩЕЕ: 00 0,5В + 0.5F; 01 1,0В + 1.0F; 10 1,0В - 1.0F; 11 1.0B + 0.25F, ГДЕ В - ЦВЕТ ТОЧКИ, УЖЕ ЗАПИСАННОЙ в ПАМЯТИ КАДРА, A F - ЦВЕТ РИСУЕМОЙ ТОЧКИ ПРОЗРАЧНОЙ ТЕКСТУРЫ. D4 - ОПРЕДЕЛЕНИЕ ВЕРТИКАЛЬНОЙ КООРДИНАТЫ НАЧАЛА СТРАНИЦЫ ТЕКСТУР. ЕСЛИ РАЗРЯД СБРОШЕН, ОНА РАВНА 0, в ПРОТИВНОМ СЛУЧАЕ - 256. D3 - D0 - ЗАДАНИЕ ГОРИЗОНТАЛЬНОЙ КООРДИНАТЫ НАЧАЛА СТРАНИЦЫ ТЕКСТУР. ОНА РАВНА ЗНАЧЕНИЮ, ЗАПИСАННОМУ В ЭТИХ РАЗРЯДАХ, УМНОЖЕННОМУ НА 64, ТО ЕСТЬ МОЖЕТ ПРИНИМАТЬ ЗНАЧЕНИЯ 0,64,128,192 И Т.Д. ПРИ РАБОТЕ С ГРАФИЧЕСКИМ ПРОЦЕССОРОМ В РЕГИСТР УПРАВЛЕНИЯ ПОМЕЩАЮТСЯ КОМАНДЫ ДЛЯ ПРОЦЕССОРА, ПРИ ЭТОМ КОД КОМАНДЫ ЗАКЛЮЧАЕТСЯ В РАЗРЯДАХ D31 - D24, А ОСТАВШИЕСЯ РАЗРЯДЫ ПРИМЕНЯЮТСЯ ДЛЯ ПЕРЕДАЧИ ПАРАМЕТРОВ. РАССМОТРИМ НЕКОТОРЫЕ НАИБОЛЕЕ ЧАСТО ИСПОЛЬЗУЕМЫЕ КОМАНДЫ ГРАФИЧЕСКОГО ПРОЦЕССОРА. Сброс графического процессора Код команды: 00h. Параметры: 000000h. Назначение. КОМАНДА ИСПОЛЬЗУЕТСЯ ДЛЯ ИНИЦИАЛИЗАЦИИ ГРАФИЧЕСКОГО ПРОЦЕССОРА, А В НЕКОТОРЫХ СЛУЧАЯХ - ДЛЯ ПРЕКРАЩЕНИЯ ФОРМИРОВАНИЯ ИЗОБРАЖЕНИЯ. ПОСЛЕ ЕЕ ВЫПОЛНЕНИЯ В СЛОВЕ СОСТОЯНИЯ ГРАФИЧЕСКОГО ПРОЦЕССОРА УСТАНАВЛИВАЕТСЯ КОМБИНАЦИЯ ФЛАГОВ 14802000h. Сброс буфера команд Код команды: 01h. Параметры: 000000h. Назначение. КОМАНДА ОЧИЩАЕТ БУФЕР КОМАНД ГРАФИЧЕСКОГО ПРОЦЕССОРА. Сброс IRQ Код команды: 02h. Параметры: 000000h. Назначение. КОМАНДА ПРИНУДИТЕЛЬНО СБРАСЫВАЕТ ФОРМИРУЕМЫЙ ГРАФИЧЕСКИМ ПРОЦЕССОРОМ СИГНАЛ ЗАПРОСА НА ПРЕРЫВАНИЕ. Включение экрана Код команды: 03h. Параметры: 000000h - РАЗРЕШИТЬ ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ НА ЭКРАНЕ; 000001h - ЗАПРЕТИТЬ. Назначение. КОМАНДА СЛУЖИТ ДЛЯ УПРАВЛЕНИЯ ФОРМИРОВАНИЕМ ИЗОБРАЖЕНИЯ НА ЭКРАНЕ. В ВЫКЛЮЧЕННОМ СОСТОЯНИИ ГРАФИЧЕСКИЙ ПРОЦЕССОР НЕ ФОРМИРУЕТ ВЫХОДНЫХ СИГНАЛОВ И НЕ ОБРАЩАЕТСЯ К ВИДЕОПАМЯТИ. Установка прямого доступа к памяти Код команды: 04h. Параметры: 000000h - ПРЯМОЙ ДОСТУП К ПАМЯТИ ОТКЛЮЧЕН; 000002h- ДАННЫЕ ПЕРЕДАЮТСЯ ОТ ЦЕНТРАЛЬНОГО ПРОЦЕССОРА К ГРАФИЧЕСКОМУ; 000003H - ДАННЫЕ ПЕРЕДАЮТСЯ ОТ ГРАФИЧЕСКОГО ПРОЦЕССОРА К ЦЕНТРАЛЬНОМУ. Назначение. КОМАНДА УКАЗЫВАЕТ НАПРАВЛЕНИЕ ПЕРЕСЫЛКИ ДАННЫХ ПРИ ИСПОЛЬЗОВАНИИ ПРЯМОГО ДОСТУПА К ПАМЯТИ. Установка начала экрана Код команды: 05h. Параметры: в разрядах D0 - D9 задается координата по горизонтали (0-1023), в разрядах D10 -D18 - координата по вертикали (0-512). Назначение. Команда применяется для определения левого верхнего угла области видеопамяти, которая содержит выводимое на экран изображение. Задание режима отображения Код команды: 08h. Параметры: число, состояние разрядов которого характеризует включаемый режим. Назначение отдельных разрядов следующее: D6 - если разряд установлен, а разряды 0 и 1 сброшены, то размер экрана по горизонтали равен 384 точкам. Во всех остальных случаях этот разряд должен быть сброшен. D5 - если разряд установлен, включается чересстрочный режим формирования изображения. D4 - если в разряд записана 1, будет использо¬ваться 24-разрядный цвет; в противном случае -15-разрядный. D3 - видеорежим: 0 - PAL; 1 - NTSC. D2 - размер изображения по вертикали: 0 - 240 точек; 1 - 480 точек. D1, D0 - размер изображения по горизонтали: 00 - 256 точек; 01 - 320 точек; 10 - 512 точек; 11 - 640 точек. Получение параметров графического процессора Код команды: 10h. Параметры: номер требуемого параметра графического процессора. Назначение. Данная команда позволяет прочитать нужный параметр графического процессора из регистра данных. Например, если в качестве параметра команды передать код 000007h, то в регистре данных будет возвращен кодовый номер модели установленного графического процессора (для стандартной микросхемы, используемой в SONY PLAYSTATION, этот номер равен 2). Командные пакеты графического процессора Для того чтобы графический процессор создал изображение на экране, ему должны быть переданы все сведения о параметрах изображения (размер по вертикали и горизонтали, положение выводимого фрагмента в видеопамяти, разрядность цвета и т.д.), а также сведения о каждом из графических примитивов, составляющих картинку. Все данные относительно рисунка и его параметров передаются графическому процессору в виде пакетов команд. Каждый пакет сообщает об одном примитиве либо устанавливает какой-либо параметр изображения. Следует различать параметры изображения и дисплея: первые передаются как пакеты команд и характеризуют создаваемую картинку; вторые влияют на генерируемый графическим процессором видеосигнал и задаются через команды, записываемые в регистр управления графического процессора. Чтобы графический процессор правильно сформировал изображение, требуется указать как параметры дисплея, так и параметры изображения. Командные пакеты составляются работающей программой, после чего передаются пословно через порт данных графического процессора. Более предпочтительной из-за скорости и затрат времени центрального процессора является пересылка пакетов на основе прямого доступа к памяти. Чтобы упростить управление обменом большого числа пакетов, в игровой приставке SONY PLAYSTATION предусмотрен специальный режим прямого доступа к памяти, когда все передаваемые графическому процессору пакеты объединяются в связанный список, каждый элемент которого содержит сведения о его размере, адрес следующего элемента и собственно пакет данных. Отдельные части связанного списка не обязательно должны располагаться в памяти по порядку. Эта технология объясняется на рис. 4.7. Рис. 4.7. Связанный список пакетов команд для графического процессора Графический процессор обрабатывает пакеты в порядке их пересылки, следовательно, переданные ранее примитивы при рисовании будут перекрываться теми, которые получены позже. Если в список необходимо внести еще несколько пакетов команд, достаточно найти место, куда они будут помещены, заменить указатель найденного элемента списка на адрес добавляемого пакета, а в сам пакет вставить ссылку на следующий элемент списка. Чтобы в связанном списке легче было найти места для вставки новых пакетов, в игровой приставке SONY PLAYSTATION введена функция сортировки пакетов команд. С этой целью сначала строится пустой связанный список, который содержит только заголовки данных без самих пакетов. Теперь, если в список нужно добавить какой-либо пакет, достаточно выбрать его по индексу. Поскольку при формировании трехмерного изображения требуется, чтобы расположенные ближе к наблюдателю объекты рисовались позже тех, которые находятся дальше, в качестве индекса часто используется координата z отображаемого объекта. После того как программа создала все пакеты команд, которые будут передаваться графическому процессору, следует указать адрес первого элемента в списке и переслать все данные, используя контроллер прямого доступа к памяти. Отдельный канал контроллера ПДП может создавать такие отсортированные таблицы пакетов, что значительно упрощает программирование графического процессора. Рассмотрим структуру элемента связанного списка более подробно (рис. 4.8). Рис. 4.8. Структура элемента связанного списка В первом 32-разрядном слове содержится заголовок элемента списка, включающий в себя размер следующего за заголовком пакета команд в словах (старший байт) и указатель на следующий элемент (остальные байты). Для последнего элемента списка указатель должен быть равен FFFFFFh. Со второго слова начинается пакет команд. В самом старшем байте хранится код, определяющий тип пакета, а затем записаны параметры, количество которых зависит от типа пакета. Пакет команд всегда занимает целое число 32-разрядных слов. Работа c использованием прямого доступа к памяти Графический процессор игровой приставки SONY PLAYSTATION использует два канала прямого доступа к памяти. Канал 2 применяется для пересылки связанных списков, содержащих пакеты команд, от центрального процессора к графическому, а также для передачи изображения в буфер или обратно. Канал 6 предназначен для создания пустых связанных списков, назначение которых описывалось выше. Более подробно работа с контроллером прямого доступа к памяти и необходимые регистры были рассмотрены в соответствующем разделе. Основные приемы программирования графического процессора Теперь, изучив основные функции и команды графического процессора SONY PLAYSTATION, мы можем проанализировать основные алгоритмы, используемые в программах для него. Работа всегда начинается с инициализации графического процессора игровой приставки, которая выполняется по следующему алгоритму: 1. Передать графическому процессору команду сброса (код 00h). 2. Установить размеры изображения по горизонтали и вертикали, передав в регистр управления графического процессора команды с кодом 06h и 07h. 3.Задать режим дисплея командой 08h. 4. Указать координаты начала экранной области командой 05h. 5. Сформировать в памяти пакеты с кодами E1h (режим изображения), E3h, E4h (размеры изображения), E5h (координаты изображения) и последовательно передать их графическому процессору через порт данных или канал прямого доступа к памяти. 6. Разрешить генерацию изображения. Далее программа создает связанный список пакетов команд, содержащих информацию об изображении. Чтобы передать этот список графическому процессору, необходимо выполнить следующие действия: 1. Подождать, пока графический процессор подготовится к приему команд. Об этом сигнализирует установка разряда D28 в регистре состояния графического процессора. 2. Разрешить работу второго канала контроллера прямого доступа к памяти. 3. Установить режим пересылки данных от центрального процессора к графическому. 4.3аписать в регистр D2_MADR адрес начала списка пакетов команд. 5. Поместить В регистр D2_BCR 0. 6.Указать В регистре D2_CHCR число о1000401h. Этот набор флагов запускает передачу связанного списка из памяти В порт графического процессора на основе прямого доступа в память. Рассмотренные алгоритмы представляют собой лишь основы программирования графики для игровой приставки SONY PLAYSTATION. Пример реализации изложенных в этом разделе принципов приведен в приложении 2, где представлена учебная программа для игровой приставки, рисующая изображение путем передачи данных через порт графического процессора и с использованием прямого доступа в память. |