Графический видеорежим

Модератор: push0ret

Ответить
Аватара пользователя
push0ret
Набирающий обороты
Сообщения: 23
Зарегистрирован: Вс дек 29, 2024 2:48 pm
Благодарил (а): 12 раз
Поблагодарили: 22 раза

Графический видеорежим

Сообщение push0ret »

Hello, World!

На самом деле графических видеорежимов несколько, как и текстовых, но принцип работы с ними одинаков, могут отличаться области памяти, а принцип сохраняется. В этой теме расскажу про работу в графическом видеорежиме с номером 4. Это видеорежим с разрешением 320x200, данный видеорежим может отображать 4 цвета для видеоадаптеров CGA, EGA, VGA, монитор должен быть соответствующим.

Удобнее всего использовать функции BIOS прерывания 10h, но для наглядности работы, в данной теме они использованы не будут.

Вывод изображения в графическом видеорежиме не является непрерывным, одна область видеопамяти (8000:0000) содержит данные о всех нечётных линиях, а другая область (B800:2000) содержит данные о всех чётных линиях.

Вид пикселей в видеопамяти:
вид_пикселей_в_видеопамяти.PNG
вид_пикселей_в_видеопамяти.PNG (1.5 КБ) 43 просмотра
Если мы хотим отображать на экране информацию в графическом видеорежиме, то необходимо научиться вычислять координаты пикселя и номер первого бита. Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номера битов в нем, управляющие пикселем с координатами (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
Результат работы программы:
пиксели.PNG
пиксели.PNG (8.72 КБ) 43 просмотра
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22, видеоадаптер VGA.

Спасибо за внимание!
С уважением, push0ret!
Ответить

Вернуться в «Системное программирование»