Глава 4. Основы видео
Для многих людей дисплей и есть компьютер. О программе
некоторые "гении" судят исключительно по качеству "картинки"
на экране. В этой главе мы расскажем о том, как формируется
изображение и покажем как использовать это на практике.
4.1 Адаптеры дисплеев
Большинство пользователей компьютеров семейства Спектрум
сталкиваются с таким понятием, только когда читают журналы о
IBM PC. 99% имеющий стандартных Спектрум даже не подозревают
о существовании других экранов. Всем им суждено работать со
стандартным экраном.
На текущий момент мне известны следущие типы адаптеров:
Стандартный адаптер
(Standart Graphics Adapter SGA)
Улучшенный адаптер
(Enhanced Graphics Adapter EGA)
Моноадапер Профи
(Profi-mono Graphics Adapter PMGA)
Цветной адаптер Профи
(Profi-color Graphics Adapter PCGA)
Адаптер АТМ
(ATM-Turbo Graphisc Adapter AGA)
Все они отличаются своими характеристиками. Наилучшим из
них является EGA. Все эти адаптеры являются графическими, в
них нет такого принципиального режима как текстовой (за иск-
лючением АEGA)
В последнее время появилась информация о АТМ-ТУРБО 2,
где имеется улучшенный адаптер AEGA (ATM-Turbo 2 Enhanced
Graphics Adapter). Он имеет характеристики как у EGA+AGA, но
кроме всего этого имеет текстовой режим. К сожалению я не
имел общения с ним, поэтому утверждать точно не буду. Вот их
характеристики:
SGA
256*192 2 цвета из 8*2 для 8*8 точек.
EGA
640*350 16 цветов для каждой точки
PMGA
512*240 2 цвета на весь экран
PCGA
512*240 8 цветов+мерцание на 8 точек
512*240 16 цветов на 8 точек
AGA
640*200 8 цветов для каждой строки
320*200 16 цветов для каждой точки
Так как в настоящее время распростроннен SGA, поэтому мы
и будем рассмотривать только его.
4.2 Видеопамять SGA
Видеопамять, или, точнее, оперативная память, использу-
ется для хранения изображения, физически расположена вместе
с остальными компанентами на плате компьютера. Логически эта
память является частью адресного пространства процессора.
Для этого зарезервирована область памяти, начиная с адреса
#4000. Область логически разделена на две части: область
черно-белого изображения и область атрибутов - цветов. Об-
ласть черно-белого изображения и область атрибутов очень
сложна, поэтому мы рассмотрим ее подробно. Начинается об-
ласть с #4000 до #5AFF, что дает 6144 байта. Спектрумовский
SGA экран разделен на знакоместа (тексел от TEXt ELement) -
области в виде квадратиков 8 на 8 точек. Для каждого знако-
места свои атрибуты. На экране 24 ряда по 32 символа в ряду:
всего 768 атрибутов. Каждые 8 точек храняться в одном байте,
т.е на хранение изображения 1 знакоместа тратиться 8 байт +
1 байт знакоместа 768*8, что и дает 6144.
Вообще существует два способа изучить структуру экранной
области ZX Spectrum. Один - рассмотреть как грузиться экран
с кассеты, другой это внимательно прочить данныю главу. Если
вы выбрали последнее крайне рекомендую набирать все примеры
на клавиатуре, это будет способствовать большему запоминанию
материала.
Экран начинается с адреса 16384. Попробуетм закрасить
крайний левый верхний угол. Дадим ряд команд:
LD A,%11111111 LET A=255
LD (#4000),A POKE 16384,A
LD A,%00001111 LET A=15
LD (#4000),A POKE 16384,A
LD A,%10101010 LET A=170
LD (#4000),A POKE 16384,A
После этого примера вы наверно убедились, что биты в
байте соответствуют пикселям на экране.
LD (#4001),A
LD (#4002),A
..... и так далее
Вы будете изменять содержимое экрана, двигаясь по гори-
зонтали или говоря точнее, вы будете модифицировать нулевые
линии в нулевом знакоместе нулевого ряда. Увеличивая адрес
вы перемещаетеся вправо по экрану, ходясь в том же нулевой
линии. Т.к. столбцов 32 то попробуем пропустить 32 байта и
занести туда значение: LD (#4000+#20),A
Но в результате мы получили нечто иное чем, следовало
ожидать. Изменилась нулевая линия в первом ряду. Чтобы изме-
нить первую линию в нулевом знакоместе следует пропустить
256 байт.
Теперь вы убедились в сложности экрана. Чтобы немного
отдохнуть можете позагружать картинки, пройти 72 комнату
EXOLON'а и выпить 2-3 кружечки кофю, после чего можете про-
должить сие чтиво.
На первый взгляд такое расположение экранной области не-
лепо. Но на практике это облегчает работу (шутка) - надо
толкьо все понять.
Итак, вернемся к экрану. Экрана также разбит на трети.
Отсчет в каждой трети начинается заного. Каждая треть начи-
нается с адресов:
#4000
#4800
#5000
В кодах адрес как правило храниться в регистровой паре
HL. Полный адрес можно представить в виде:
-------H------¬ -------L------¬
-+T-T-T-T-T-T-T+T+T-T-T-T-T-T-T+¬
¦0¦1¦0¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L-+-+-+T+T+T+-+T+T+-+T+T+-+-+-+T-
LT- L-T-- L-T-- L---T----
1 2 3 4
1 Номер трети
2 Смещение внутри знакоместа
3 Номер ряда
4 Номер столбца
Чтобы сместиться вправо дадим команду INC L. Чтобы пере-
меститься по вертикали в одном знакоместе дадим команду INC
H. Когда вы пройдете все знакоместо и выйдете за границу,
номер столбца обнулиться, а номер рада увеличиться. Все
просто, пока дело не доходит до других третей.
На практике часто на экране графика используется только
на одной трети. КОнечно она есть и на других третях, но чаще
статическая, не подвижная.
Большую теоретическую информацию вы найдете в любой ли-
тературе по Спектруму, а нам пора перейти к атрубутам, пред-
варительно пройдя уровень ZYNAPS'а
Атрибуты каждого знакоместа занимают 1 байт, причем
структура их очень проста. Байты распологаются слева направо
и сверху вниз. Адрес можно вычислить как 22588+32*Y+X.
На ассемблере это деляется следующим образом:
LD D,X
LD E,Y
LD H,0
LD L,Y
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,E
ADD A,L
LD L,A
JR NC,$+3
LD DE,#5800
ADD HL,DE
В результате чего мы получими в регистре HL адрес байта
в памяти. У нас еще остался бордур. На него конечно нельзя
выводить графику, но можно менять цвет. Для этого код цвета
нужно выдать в порт #00FE.
Цвета кодируются следующим образом:
0 черный
1 синий
2 красный
3 фиолетовый или малиновый
4 зеленый
5 голубой
6 желтый
7 белый
Следует вспомнить, что в "128К" имеется два экрана. В
ПЗУ нет подпрограмм, которые бы работали с новым экраном.
Структура его такая же как и старого, адреса его расположе-
ния другой (#C000, 7 страница). Для получения адреса можно
выше указанной схемой для регистра HL, с некоторым отличием.
Старший бит регистра Н быдет указывать номер экрана.
Для активизации нового экрана следует активизировать 7
страницу и установить бит 3 порта #7FFD или ячейки #5B5C,
после чего можно вернуть прежнюю страницу.
Для активизации старого экрана достаточно сбросить бит
#7FFD. И напоследок главы совет: полезно изменять координаты
печать по X не с помощью команды INC L, а с помощью: LD A,L
ADD A,1 LD L,A
Это конечно несет потерю в 4 байта, но иммет некоторые
плюсы, связанные с флагами. Вообще, на пактике часто приме-
няется следующий прием: в памяти граняниться таблица с адре-
сами всех строк экрана и адрес можно выбирать как смещение
внутри таблицы.
4.3 Управление дисплеем
Управлять экраном дисплея, как и выполнять другие опера-
ции на компьютере, можно тремя способами:
- используя функции языка программирования
- используя служебные функции DOS или ROM-BIOS
- управляя аппаратурой напрямую через память или порты
Служебные функции для работы с изображениями доступные
через языки программирования, автоматически помящяют данные
в видеопамять ROM-BIOS имеет множество очень мощьных функций
выполняющих почти все операции, необходимые для генерации
вывода на экран.
Выбирая прямой вывод на экран мы должны отдавать себе
отсчет в том, что при этом мы может мешать другим системам,
например работающими с окнами. Тем не менее, многие сущест-
вующие программы созданные для ZX-Spectruma, генерируют не-
посредственный вывод информации на экран, настолько многие,
что это уже стало стандартным способом вызова. Все понимают,
что это не хорошо, но все так и поступают.
Вообще прямой вывод следует применять только когда в
этом есть особая необходимость.