Руководство по HamsterCMS от TomoTomoTan
Ручной «Хомяк» – наглядное пособие по Hamster CMS. Предисловие и глава 1. - Как включить
Ручной «Хомяк» – наглядное пособие по Hamster CMS. Глава 2 - О шаблонах и содержимом
Ручной «Хомяк» – наглядное пособие по Hamster CMS. Глава 3 - Доступ к сайту через FTP, редактирование шаблона
Ручной «Хомяк» – наглядное пособие по Hamster CMS. Глава 4 - Устройство шаблона. Немного о включениях.
Ручной «Хомяк» – наглядное пособие по Hamster CMS. Глава 5 - Создание собственного шаблона. Загрузка файлов на сайт с помощью WebFTP

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

Moderator: push0ret

User avatar
push0ret
Набирающий обороты
Posts: 32
Joined: Sun Dec 29, 2024 2:48 pm
Has thanked: 22 times
Been thanked: 26 times

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

Post by push0ret »

Hello, World!

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

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

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

Вид пикселей в видеопамяти:
вид_пикселей_в_видеопамяти.PNG
Если мы хотим отображать на экране информацию в графическом видеорежиме, то необходимо научиться вычислять координаты пикселя и номер первого бита. Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номера битов в нем, управляющие пикселем с координатами (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-х пикселей в центр экрана:

Code: Select all

.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
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22, видеоадаптер VGA.

Спасибо за внимание!
С уважением, push0ret!
You do not have the required permissions to view the files attached to this post.

Code: Select all

push 0
ret

Return to “Системное программирование”