На самом деле графических видеорежимов несколько, как и текстовых, но принцип работы с ними одинаков, могут отличаться области памяти, а принцип сохраняется. В этой теме расскажу про работу в графическом видеорежиме с номером 4. Это видеорежим с разрешением 320x200, данный видеорежим может отображать 4 цвета для видеоадаптеров CGA, EGA, VGA, монитор должен быть соответствующим.
Удобнее всего использовать функции BIOS прерывания 10h, но для наглядности работы, в данной теме они использованы не будут.
Вывод изображения в графическом видеорежиме не является непрерывным, одна область видеопамяти (8000:0000) содержит данные о всех нечётных линиях, а другая область (B800:2000) содержит данные о всех чётных линиях.
Вид пикселей в видеопамяти:
Если мы хотим отображать на экране информацию в графическом видеорежиме, то необходимо научиться вычислять координаты пикселя и номер первого бита. Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номера битов в нем, управляющие пикселем с координатами (x,y):
Если y четное число, то смещение байта = 50h*(y/2)+(x/4)
Если y нечетное число, то смещение байта = 2000h+50h*((y-1)/2)+(x/4)
Номер первого бита = 7-mod(x/4)*2
Ниже таблица соответствия чисел цветам пикселя:
00 черный | альтернативный: черный
01 светло-синий | альтернативный: зеленый
10 малиновый | альтернативный: красный
11 ярко-белый | альтернативный: коричневый
Теперь, когда мы обладаем необходимыми для работы с видеопамятью в графическом режиме знаниями, приведу в пример программу, которая выводит разноцветную полоску, состоящую из 4-х пикселей в центр экрана:
Код: Выделить всё
.model tiny
.286
code segment
org 100h
start:
mov al, 4d ;video mode 320x200, 4 colors, EGA, CGA, VGA
int 10h
;50h*(y/2)+(x/4)
mov ax, 50h
mov bx, y
shr bx, 1d
mul bx
mov bx, x
shr bx, 2d
add ax, bx
mov cords, ax
;7-mod(x/4)*2 ;first bit of pixel
mov ax, x
mov bx, 4
xor dx, dx
div bx
shl dx, 1d
mov bx, 7d
sub bx, dx
add bx, cords
push 0B800h ;segment of video memory
pop es
mov byte ptr es:[bx], pixel
mov ah, 1d ;wait of press key
int 21h
xor ah, ah
mov al, 3d ;video mode 80x25
int 10h
push 0
ret
x equ 150d ;coordinate x
y equ 100d ;coordinate y
cords dw ? ;offset of pixel
pixel equ 01101101b ;bits of pixel
code ends
end start
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22, видеоадаптер VGA.
Спасибо за внимание!
С уважением, push0ret!