Программы, в которых осуществляется просмотр произвольных видеостраниц, на которые предварительно записана информация способом прямого программирования видеобуфера, удобно писать с применением функции 05h int 10h BIOS.
Рис. 2. Структура байта атрибутов
Структура байта атрибутов приведена на рис. 2.
Типичная схема использования адресного пространства компьютера приведена на рис. 1.
Распределение адресного пространства
Прямое программирование видеобуфера в текстовом режиме
Перезагрузка операционной системы INT 19h.
Вызов прикладной программой прерывания INT 19h приведет к перезагрузке операционной системы.
Адресное пространство - это просто набор адресов, которые умеет формировать процессор; совсем не обязательно все эти адреса отвечают реально существующим ячейкам памяти.
Начальный килобайт оперативной памяти занят векторами прерываний, которые обеспечивают работу системы прерываний компьютера, и включает 256 векторов по 4 байта каждый.
Вслед за векторами прерываний располагается область данных BIOS, которая занимает всего 256 байт, начиная с сегментного адреса 40h. В области данных BIOS хранятся данные, используемые программами BIOS в своей работе. Так, здесь размещаются:
- входной буфер клавиатуры, куда поступают коды нажимаемых пользователем клавиш;
- адреса видеоадаптера, а также последовательных и параллельных портов;
- данные, характеризующие текущее состояние видеосистемы (форма курсора и его текущее положение на экране, видеорежим, используемая видеостраница и проч.);
- ячейки для отсчета текущего времени и т.д.
BIOS (от Basic In-Out System, базовая система ввода-вывода) является частью операционной системы, хранящейся в постоянном запоминающем устройстве (ПЗУ BIOS). ПЗУ BIOS располагается на системной плате компьютера и является, таким образом, примером встроенного, или "зашитого" программного обеспечения. В функции BIOS входит тестирование компьютера при его включении, загрузка в оперативную память собственно операционной системы MS-DOS, управление штатной аппаратурой компьютера - клавиатурой, экраном, дисками и прочим.
В области памяти, начиная с адреса 500h, располагается собственно операционная система MS-DOS, которая обычно занимает несколько десятков Кбайт. Программы MS-DOS, как и другие системные составляющие (векторы прерываний, область данных BIOS) записываются в память автоматически в процессе начальной загрузки компьютера.
Вся оставшаяся память до границы 640 Кбайт свободна для загрузки любых системных или прикладных программ. Как правило, в начале сеанса в память загружают резидентные программы (русификатор, антивирусные программы). При наличии резидентных программ объем свободной памяти уменьшается.
Далее следует старшая, или верхняя (upper) память.
Часть адресного пространства старшей памяти отводится для адресации к графическому и текстовому видеобуферам графического адаптера. Графический адаптер представляет собой отдельную микросхему, в состав которой входит собственное запоминающее устройство (видеопамять). Схемы управления видеопамятью настроены на диапазоны адресов A0000h...AFFFFh и B8000h...BFFFFh, входящих в общее с памятью адресное пространство процессора.Поэтому любая программа может обратиться по этим адресам и, например, записать данные в видеобуфер, что приведет к появлению на экране некоторого изображения. Если видеосистема находится в текстовом режиме, а запись осуществляется по адресам текстового видеобуфера, на экране появятся изображения тех или иных символов (букв, цифр, различных знаков). Если же перевести видеосистему в графический режим, и записывать данные в графический видеобуфер, то на экране появятся отдельные точки или линии. Можно также прочитать текущее содержимое ячеек видеобуфера.
Для того чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. В текстовом режиме для VGA-совместимых систем для видеопамяти отводится адресное пространство начинающееся с логического адреса B800h:0000h и заканчивающееся адресом BF00h:0FFFh.Данная область разбивается на 8 секторов по числу видеостраниц (4 Кбайта на страницу). Постраничное деление адресного пространства видеопамяти в текстовом режиме имеет следующий вид:
На экране отображается видеобуфер, соответствующий активной странице. В текстовых режимах для изображения каждого символа отводится 2 байта: байт с ASCII-кодом символа и байт с его атрибутом.
По адресу B800h:0000h находится байт с кодом символа (левый верхний угол экрана), а в B800h:0001h – атрибут этого символа; B800h:0002h – код второго символа, а в B800h:0003h – атрибут второго символа и т.д.
При формировании изображения непосредственно в видеобуфере, в обход программ DOS и BIOS, все управляющие коды ASCII теряют свои управляющие функции и отображаются в виде соответствующих символов.
Из рис. 2 следует, что каждый символ может принимать любой из 16 возможных цветов, определяемых сочетанием младших 4-х битов. Биты 4-6 байта атрибутов задают цвет фона под данным символом. Последний бит 7, в зависимости от режима видеоадаптера, определяет либо яркость фона под данным символом (тогда фон также может принимать 16 разных цветов), либо мерцание символа(устанавливается DOS по умолчанию).
При загрузке машины устанавливается стандартная палитра, коды цветов которой приведены в табл. 1. Переключение назначения бита 7 осуществляется подфункцией 03h функции 10h прерывания int 10h.
Табл. 1. Коды цветов стандартной палитры
Код
Цвет
Код
Цвет
0h
Чёрный
8h
Серый
1h
Синий
9h
Голубой
2h
Зелёный
0Ah
Салатовый
3h
Бирюзовый
0Bh
Светло-бирюзовый
4h
Красный
0Ch
Розовый
5h
Фиолетовый
0Dh
Светло-фиолетовый
6h
Коричневый
0Eh
Жёлтый
7h
Белый
0Fh
Ярко- белый
Двухбайтовые коды символов записываются в видеобуфер в том порядке, в каком они должны появиться на экране: первые 80*2 байт соответствуют первой строке экрана, вторые 80*2 байт – второй и т.д. При этом переход на следующую строку экрана определяется не управляющими кодами возврата каретки и перевода строки, а размещением кода в другом месте видеобуфера.
Для того чтобы из программы получить доступ к видеобуферу, надо занести в один из сегментных регистров данных сегментный адрес видеобуфера. После этого, задавая те или иные смещения, можно выполнить запись в любые места (ячейки) видеобуфера. Вычислить смещение ячейки в координатах "строка-столбец" (row, clm) можно так:
VidAdd r= (row*160) + (clm*2)
При большом объёме выводимых данных, информационный кадр формируется заранее в буфере пользователя, располагающегося в сегменте данных программы.
Пример: Запись строки в видеобуфер 0-страницы.
;Очистка экрана
…
;Настроим сегментный регистр ES на страницу 0 видеобуфера, а
lodsb ;Загрузка в al очередного символа (al ← ds:si)
stosw ;Выгрузка “символ + атрибут” из ах в
;видеобуфер (ax→es:di)
loop cycle ;Повторить msglen раз
…
;Поля данных в сегменте данных программы.
msg db ‘*TEST*’
msglen=$-msg
…
Видеопамять в графическом режиме 12h организована следующим образом:
–начало видеобуфера находится по адресу 0A0000h.
–память организована в виде битовых матриц.
В режиме 12h этих матриц четыре. Каждому пикселю экрана соответствует один бит каждой из битовых матриц. Таким образом каждой адресуемой ячейке видеопамяти - байту - соответствует восемь пикселей. Значение цвета пикселя получается как результат объединения значений соответствующего ему бита всех битовых матриц.
Режим 12h имеет разрешающую способность - 640х480 пикселов. В видеопамяти задействованы все четыре цветовых слоя. Структура видеопамяти показана на рисунке 3.
Рис. 3. Структура видеопамяти режима 12h.
Формулы, используемые для вычисления битов, управляющих данным пикселом экрана, соответствуют формулам режима 10h.