Лекция №11. Работа с графикой на ассемблере. Функции BIOS. Видеопамять.
Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения.
Различают следующие типы графических режимов:
– монохромный (1-битное кодирование);
– 16-цветный EGA/VGA (4-битное кодирование);
– 256-цветный SVGA (8-битное кодирование);
– HiColor (16-битное кодирование);
– TrueColor (24-битное / 32-битное кодирование).
Для работы с графическим адаптером, в BIOS используется прерывание INT 10h. Оно позволяет устанавливать графические режимы работы, выводить символы и графику. Выбор графического режима – Функция 0 (ah=0) прерывания INT 10h устанавливает видеорежим, который был указан в регистре AL.
Режим
Разрешение
Количествоцветов
06h
640x200
0Dh
320x200
0Eh
640x200
0Fh
640x350
10h
640x350
11h
640x480
12h
640x480
13h
320x200
6Ah *
800x600
Режим 6Ah утвержден VESA, но его поддерживают не все видео адаптеры
Существуют также дополнительные режимы, которые используются для SVGA и XGA адаптеров. Они устанавливаются вызовом VESA BIOS Extension (AX=4F02h INT 10h).
Функция 0Chпрерывания INT 10h.
Цвет – в AL;
Видеостраница – в BH;
КоординатаY – в DX;
КоординатаX – в CX.
Пример: нарисовать точку с цветом 1, с координатами X=50 и Y=20.
movah,0Ch ; функция рисования точкиmoval,1 ; цвет точкиmovbh,0 ; видео страницаmovcx,50 ; координата Xmovdx,20 ; координата Yint10h ; вызов прерывания BIOS
Функция 0Ch исполняется очень медленно, особенно при рисовании множества точек. Настоящие графические программы (такие как игры) записывают непосредственно в видеопамять, после того, как они рассчитали цвет и расположение точки.
Эта программа переключается в графический режим, рисует длинную линию, используя функцию 0Сh, затем ожидает нажатия клавиши и возвращается в прежний режим.
.model small .stack 100h .386Mode_6 = 6 ; 640 X 200, 2 colors Mode_13 = 0Dh ; 320 X 200, 16 colors Mode_14 = 0Eh ; 640 X 200, 16 colors Mode_15 = 0Fh ; 640 X 350, 2 colors Mode_16 = 10h ; 640 X 350, 16 colors Mode_17 = 11h ; 640 X 480, 2 colors Mode_18 = 12h ; 640 X 480, 16 colors Mode_19 = 13h ; 320 X 200, 256 colors Mode_6A = 6Ah ; 800 X 600, 16 colors .datasaveMode db ; Сохранить текущий видео режимcurrentX dw 100 ; координата XcurrentY dw 100 ; координата Ycolor db 1 ; номер цвета; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий .code start:mov ax,@data mov ds,ax; Получить текущий видеорежимmov ah,0Fhint 10hmov saveMode,al ; Переключиться в графический режимmov ah,0 ; установка видеорежимаmov al,Mode_17 ; номеррежимаint 10h ; РисованиепрямойлинииLineLength = 100mov dx,currentYmov cx,LineLength ; счетчикцикла L1:push cxmov ah,0Ch ; рисование точкиmov al,color ; цвет точкиmov bh,0 ; видео страницаmov cx,currentXint 10hinc currentX;inc color; используйте для разноцветной линииpop cxloop L1 ; Ожидаем нажатия клавишиmov ah,0int 16h; Возврат в прежний видеорежимmov ah,0 ; установить видео режимmov al,saveMode ; сохраненный видео режимint 10h ; Выход из программыmov ax,4C00hint 21hend start