Организация видеопамяти и видеорежимов.
Видео-ОЗУ Sprinter-а составляет 256 килобайт. В дальнейшем предполагается его расширение до 512 килобайт, для получения более высоких режимов разрешения.
В режиме Spectrum-овского экрана вся организация такая же как в стандартном ZX-Spectrum. В остальных режимах включается Sprinter-овский экран, структура которого включает в себя Спектрумовский экран как часть схемы.
Устройство экрана.
Весь экран разбит на квадраты, размером в стандартное Спектрумовское знакоместо. Для каждого квадрата устанавливается свой собственный режим вывода, а так же адрес видео-ОЗУ, откуда производится вывод в этот квадрат.
В каждом знакоместе может быть задан свой собственный режим вывода. В данный момент можно устанавливать такие режимы:
ZX-40 - обычный спектрумовский режим с одним битпланом и одним атрибутом на знакоместо.
ZX-80 - Режим, похожий на спектрумовский по строению символов, но в каждом знакоместе оказывается два символа, сжатые по горизонтали.
G256-8 - Графический режим. Квадрат представляет собой массив 8x8 точек. В каждой точке задается один из 256-ти цветов, выбираемых из палитры 16 миллионов цветов. Квадраты могут иметь разные палитры. Таких палитр для режима G256-8 - четыре.
G16-16 - Графический режим. Квадрат представляет собой массив 16x8 точек. Каждая точка имеет один из 16 цветов, выбираемых из палитры 16 миллионов цветов. Так же, как и G256-8 в квадрате может быть установлена одна из 4-х палитр. Палитры графических режимов пересекаются друг с другом. Палитра 16-тицветного режима это первые 16 цветов из палитры 256-тицветного.
BORDER - В квадрат выводится цвет бордера.
BLANK - Квадрат гасится - становится черным.
Объем данных режима квадрата составляет 2 байта, поэтому изменение режима всего экрана сводится к перезаписи 2.5 килобайт данных в видео-ОЗУ.
Подобная структура экрана позволяет легко производить скроллинги как всего, так и частей экрана по знакоместам.
Режим экрана устанавливается при включении, а так же с помощью функций биоса. Функции биоса позволяют открывать на экране графические и текстовые окна в нужных местах и нужного размера.
В биосе имеются функции открытия графического экрана на весь экран 320x256 точек. После открытия этого режима экран представляет собой. набор из 256-ти линий, длиной по 320 байт. Соседние точки в линии - это соседние байты. Переключение линий производится через PORT_Y, в котором устанавливается номер линии, выводимой на экран. Hомера линий считаются сверху экрана, начиная с нулевой.
Для вывода в графический экран так же требуется открыть соответствующую страницу основного ОЗУ. В этой странице будет содержаться копия видеоизображения.
Видео-ОЗУ является теневым ОЗУ, поэтому информация, находящаяся в основном ОЗУ, под которым находится видео-ОЗУ не обязательно будет совпадать с информацией, находящейся в этом видео-ОЗУ. Запись видео-данных может производиться и без перезаписи данных в оснвном ОЗУ, что оказывается полезным при работе, например, со спрайтами. Для работы со спрайтами так же предусмотрен режим записи в видео-ОЗУ с прозрачным цветом. В этом режиме информация, передаваемая в видео-ОЗУ проверяется на наличие байта #FF. Если этот байт обнаруживается, то цикл записи пропускается и на экране в этом месте остается те данные, какие были ранее. Таким образом на экране можно быстро прорисовывать спрайты, представляющие из себя прямоугольные картинки с "прозрачными" цветами.
Пример программы вывода прямоугольной картинки на экран:
Код:
PAGE3 EQU #E2
RGADR EQU #89
LD A,#50 ; страница графического видеоэкрана
OUT (PAGE3),A ; установить в PAGE3
LD HL,Pucture ; адрес картинки (Прямые Данные)
LD DE,#C040+HorPlace ; положение картинки на экране по горизонтали
LD A,VerPlace ; положение картинки на экране по вертикали
OUT (RGADR),A
LD B,VerSize ; высота картинки
LOOP: PUSH DE ; запомнить положение на линии
PUSH BC ; запомнить счетчик высоты
LD BC,HorSize ; длина картинки
LDIR ; копировать линию
POP BC
POP DE
INC A ; следующая координата по Y
OUT (RGADR),A
DJNZ LOOP ; повторять нужное количество раз
Управление режимом вывода на экран (включение вывода с прозрачными цветами, отключение копирования в основное ОЗУ) осуществляется через младшие биты порта страницы графического экрана.
Акселератор операций с ОЗУ.
Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по заполнению ОЗУ одним байтом. Акселератор присутствует в чисто Sprinter-овских конфигурациях и поэтому никак не мешает работе обычных Spectrum-овских программ.
Основой акселератора является быстрое внутреннее ОЗУ в ППЛМ. Операции по пересылке данных производятся путем записи блока данных в это внутреннее ОЗУ, а затем копировании его в нужное место памяти из этого ОЗУ. После одной записи копирование может производиться несколько раз и таким образом можно производить заполнение экрана текстурами.
Для заполнения экрана одним цветом используется другой режим акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ производится запись данных с шины процессора, которые в этот момент не изменяются.
Блок данных, записываемый в ОЗУ акселератора может иметь различную длинну из диапазона 1..256 байт.
Управление акселератором производится непосредственно из программы. Для этого изпользуются команды процессора, которые фактически являются операциями типа NOP.
Это команды LD A,A; LD B,B; LD C,C; LD D,D; LD E,E; LD H,H, LD L,L
Hазначение команд следующее:
LD B,B - выключить акселетарор.
LD D,D - включить акселератор в режим приема байта размера блока далее следует команда типа LD A,dat, где dat и будет новым размером блока. Если размер блока был установлен ранее, его можно не устанавливать.
LD C,C - Операция Fill - заполнение одним байтом. Последующая команда типа LD (HL),A приведет к заполнению указанного ранее количества байт значением A
LD E,E - Операция Fill для графического экрана - заполнение вертикальных линий.
LD H,H - rezerved
LD L,L - копирование блока. Последующая команда типа LD A,(HL) приведет к заполнению ОЗУ акселератора данными из адреса (HL), а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ акселератора в основное или видео-ОЗУ.
LD A,A - копирование блока для графического экрана подобна команде LD L,L, но работает с вертикальными линиями экрана.
Пример использования акселератора:
Код:
; Считаем, что экранная страница уже открыта по адресу #C000
LD HL,#C040 ; адрес начала линии первого экрана
LD DE,#C180 ; адрес начала линии второго экрана
LD BC,#140 ; длина экрана по горизонтали
DI ; запретить прерывания для работы с акселератором
LD D,D ; включить акселератор на установку размера блока
LD A,0 ; установить размер блока - 256 байт
LD A,A ; установить акселератор на копирование
; вертикальных линий.
LDIR ; копировать !
LD B,B ; выключить акселератор
EI ; включить прерывания
Этот отрезок программы произведет копирование всего экрана с одного экрана на другой. Время его исполения составляет примерно 1.2 инта.
Дополнительные функции акселератора (AND, OR, XOR) работают подобным же образом. Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL).
Пример кодирования блока в 256 байт.
Код:
LD HL,ADRES_1
LD DE,XOR_DAT
DI
LD D,D
LD A,0 ; число байт, которые надо закодировать
LD L,L
LD A,(DE) ; взять блок данных в ОЗУ акселератора
XOR (HL) ; произвести операцию XOR с данными акселератора
LD (HL),A ; запомнить в ОЗУ результат операции
LD B,B
EI
Скорость работы акселератора ограничивается только физической скоростью работы основного ОЗУ. Определить время работы команды с акселератором можно по такой примерной формуле:
Время работы = время работы команды без акселератора + время работы акселератора
Время работы акселератора = число пересылаемых байт /7000000 (секунд)
Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно меняется система команд процессора и программа на прерывании не сможет работать нормально.
=== Cut ===
Протосы сбежали. Зерлинги смотались. Пора и мне закругляться. Ivan.
- Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX]
... http://st-rektal.chat.ru * http://www.atlant.ru/peters