Программирование дисплейного адаптера будет использоваться при выполнении лабораторных работ на встроенном ассемблере, поэтому приведем краткую справочную информацию.
При работе адаптера в текстовом режиме изображение состоит, как правило, из 25 строк по 80 символов в каждой. Этот режим имеет номер 3 (для функции переключения режимов). Имеется возможность использовать также режим с 40 символами в строке, полезный для демонстрационных мониторов (режим номер 1). Изображение размещается в видеобуфере с началом по адресу B800h:0000h. Каждому символу на экране соответствует два байта – с четным и нечетным адресом. Байты с четными адресами (0, 2, 4…) содержат ASCII-коды отображенных на экране символов, байты с нечетными адресами (1, 3, 5…) – их цветовые атрибуты, а именно цвет символа, цвет фона (последний задается для каждого знакоместа отдельно, а не сразу для всего экрана) и признак аппаратного мерцания (если он установлен, символ высвечивается и гаснет с частотой примерно два раза в секунду). Формат атрибутного байта следующий:
Здесь биты R, G, B означают включение красного, зеленого, синего цветовых компонентов соответственно, I (Intensity) – признак повышенной яркости, F (Flash) – атрибут мерцания. Очевидно, что можно получить 16 цветов символа, 8 цветов фона, наличие или отсутствие мерцания. Например, байт 00001010 задает ярко-зеленый символ на черном фоне; байт 10010110 – желтый (R+G) мерцающий символ на синем фоне.
Из всех графических режимов обратим внимание только на наиболее простой – режим 320х200х256. Это означает разрешающую способность 320 точек (пикселов) по оси Х, 200 пикселов по оси Y, 256 цветов. Этот режим имеет номер 13h (для функции переключения режимов). Организация видеопамяти (видеобуфера) здесь предельно проста: каждому пикселу соответствует свой байт, и эти байты размещаются линейным образом, начиная с адреса A000h:0000h. В дисплейном адаптере существуют также так называемые регистры палитры и регистры ЦАП, но, если не менять из содержимое, то можно считать, что значения байтов видеопамяти (каждый байт=0…255) однозначно определяют цвета соответствующих пикселов на экране. Отметим, что первые 16 цветов (значения 0…15) совпадают с цветами для текстового режима.
Смещение в видеобуфере (offset), соответствующее значению пиксела с координатами (X, Y), можно вычислить по очень простой формуле:
offset = 320*Y + X.
Если вести речь о программировании непосредственно на Паскале, то запись значения нужного пиксела можно выполнить так:
MEM[$A000:(320*Y+X)] := color;
Нам, однако, предстоит делать это на ассемблере, в качестве упражнения при изучении системы команд микропроцессора.
Переключение режимов адаптера. В составе BIOS (Base Input-Output System) компьютеров типа IBM PC существует очень простая функция, предназначенная для этого. В регистр AH следует записать 0, в регистр AL – номер режима (в частности, 1, 3, 13h, упомянутые выше) и затем выполнить команду Int 10h. Эта команда вызывает программное прерывание номер 10h, которое соответствует функциям обслуживания дисплейного адаптера. При отработке функции переключения режимов происходит также очистка экрана дисплея.
Пример: вывод символа в текстовом режиме в левом верхнем углу.
Program EXAMPLE;
Begin
ASM
MOV AH, 0
; очистили экран путем реинициализации текстового режима
MOV AL, 3
INT 10H
PUSH DS
; сохранили сегментный регистр в стеке
MOV AX, $B800
; задали новый сегмент (указывающий на видеобуфер)
MOV DS, AX
MOV BX, 0
; смещение в видеобуфере = 0
MOV CX, 65
; код буквы А
MOV [BX], CX
; выдали на экран (применена косвенная адресация)
MOV byte ptr [BX+1], $86
; а это – догадайтесь сами !
POP DS
; восстановили старое содержимое сегментного регистра
End;
Readln { ждем нажатия клавиши Enter }
End.
Назад | Содержание | Вперед |