Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primery_nebolwih_podprogramm_na_Assembl-.doc
Скачиваний:
2
Добавлен:
14.05.2015
Размер:
161.79 Кб
Скачать

Рисование в svga

Пикселы расположены линейно в памяти видеоадаптера. В 256-цветных режимах пиксел представляется одним байтом. Поэтому смещение точки с координатами (x,y) можно вычислить как 640*y+x в режиме с 640 пикселами по горизонтали. Единственное ограничение, связанное с такими вычисленими, - это то, что последний доступный пиксел, к которому может быть получен доступ, имеет координаты x=255, y=102, его смещение 65535. Это известное ограничение 64Kбайтных сегментов.

Чтобы обойти это ограничение, применяется переключение банков памяти. При этом переопределяется расположение физического адреса, которое соответствует логическому адресу. Так, логический адрес 0 соответствует физическому адресу 65536 если активен первый банк в видеодаптером с размером "окна" (granularity) 64 KB.

Логический адрес точки с координатами (x,y) определяется как 640*y+x-B*WG где B - номер банка и WG - размер "окна". Банк памяти может быть переключен с помощью функции AX=4F05h прерывания 10h в видеоадаптерах, поддерживающих стандарт VESA.

Следующая процедура рисует пиксел на экране. Координаты пиксела находятся в регистрах AX и BX, а в регистре CX передается цвет пиксела. В процедуре предполагается, что размер "окна" равен 64 KB, что справедливо, например, для чипов S3.

SVGA_bank dw 0 ;номер активного банка памяти

S_rivi dw 640 ;длина строки в байтах

VGA_seg dw 0A000h ;сегмент памяти экрана VGA

CBpxl$ proc ;рисует пиксел с координатами x=AX, y=BX, цвет=CX

xchg AX,BX ;теперь x=BX, y=AX

mul S_rivi

add AX,BX

adc DX,0 ;в DX помещается требуемый номер банка

mov DI,AX ;логический адрес

cmp DX,SVGA_bank ;банк корректен?

je Cxl256_OK

mov SVGA_bank,DX ;новый банк

mov AX,4F05h

xor BX,BX ;функция: устанавливаем банк DX, окно A

int 10h

Cxl256_OK:

mov BX,ES ;сохраняем сегмент

mov AL,CL ;цвет

mov ES,VGA_seg

stosb ;рисуем пиксел

mov ES,BX

ret

CBpxl$ endp

Пишем напрямую в видеопамять

; полностью завершенная COM-программа

codeseg segment

assume cs:codeseg, ds:codeseg, es:codeseg

org 100h

Code: jmp Start

x dw 50 ;координата x выводимого текста

y dw 20 ;координата y выводимого текста

Text db 'string to be printed',0 ;не забываем 0

Start:

mov AX,80 ;вычисляем адрес

mul y

add AX,x

shl AX,1 ;адрес в AX=160*y+2*x

mov DI,AX

mov SI,offset Text

push ES ;сохраняем ES

mov AX,0B800h ;сегмент экранной памяти в текстовом режиме

mov ES,AX

Print:

lodsb ;загружаем AL из DS:[SI]

or AL,AL ;конец строки?

jz Ready ;да, AL=0

mov ES:[DI],AL ;символ для отображения

add DI,2 ;пропускаем байт атрибутов

jmp Print

Ready: pop ES ;восстанавливаем ES

;---------------------------------------

int 20H

codeseg ends

end Code

Рисуем пиксел в графическом режиме

Графические режимы могут быть разбиты на шесть групп в зависимости от количества бит, отводимых каждому пикселу:

1 бит/пиксел, 2 цвета, одна битовая плоскость:

CGA mode 6 разрешение 640*200

2 бит/пиксел, 4 цвета, одна битовая плоскость:

CGA mode 4 разрешение 320*200

4 бит/пиксел, 16 цветов, четыре битовых плоскости:

EGA mode 0Dh разрешение 320*200

EGA mode 0Eh разрешение 640*200

EGA mode 10h разрешение 640*350

VGA mode 12h разрешение 640*480

VESA mode 102h разрешение 800*600

VESA mode 104h разрешение 1024*768

VESA mode 106h разрешение 1280*1024

8 бит/пиксел, 256 цветов, одна битовая плоскость:

VGA mode 13h разрешение 320*200

VESA mode 100h разрешение 640*400

VESA mode 101h разрешение 640*480

VESA mode 103h разрешение 800*600

VESA mode 105h разрешение 1024*768

16 бит/пиксел, 65536 цветов, одна битовая плоскость(существуют также 32768-цветные режимы):

VESA mode 111h разрешение 640*480

VESA mode 114h разрешение 800*600

24 бит/пиксел, 16777216 цветов, одна битовая плоскость:

VESA mode 112h разрешение 640*480

Исключая 4-битные режимы пикселы в памяти располагаются на одной плоскости (plane), т.е., если координаты пиксела (x,y), то адрес, по которому располагается этот пиксел в памяти может быть вычислен как Address = LineLength*y + Bits*x/8 где LineLength - количество байтов, занимаемых каждой строкой пикселов, а Bits - количество бит, занимаемым пикселом.

Исключениями являются режимы CGA номер 4 и 6, у которых четные и нечетные линии расположены в различных сегментах памяти.

В шестнадцатицветных режимах экранная память разделяется на 4 битовые плоскости. Каждый бит значения цвета пиксела расположен на своей плоскости. Адрес байта, хранящего пиксел с координатами x,y можно вычислить как Address = LineLength*y + x/8 где LineLength - число байтов, занимаемых одной строкой.

Рисование пиксела с координатами x,y в 16-цветных режимах подразумевает установку бита во всех четырех плоскостях. Активная в данный момент плоскость выбирается записью в соответствующие порты видеокарты.

Режимы CGA, EGA и VGA поддерживаются всеми стандартными BIOS. Переключение в эти режимы обычно осуществляется простым вызовом функций BIOS.

Pixel$

Во всех режимах VGA следующая процедура Pixel$ может нарисовать пиксел. Нужно отметить, что процедура достаточно медленная, т.к. используются вызовы функций BIOS.

Pixel$ proc

;Рисует пиксел во всех режимах VGA.

;Входные данные: x в AX, y в BX, цвет в CX

;Выходные данные: регистры не сохраняются

mov DX,BX ;строка y

xchg AX,CX ;CX - колонка x, AL - цвет

sub BH,BH ;0 страница

mov AH,0Ch ;выводим пиксел

int 10h

ret

Pixel$ endp

Самый интересный режим VGA - это режим 13h с возможностью отображения 256 цветов и разрешением 320*200. Номер цвета 0...255 соответствуют значениям в палитре, где все цвета представлены в виде определенных сочетаний красной, зеленой и синей компонент. Следующая процедура VGApxl$ рисует пиксел в этом режиме. Она работает достаточно быстро, однако существуют еще более быстрые варианты.

;данные:

VGA_seg dw 0A000h ;сегмент памяти экрана VGA

VGApxl$ proc

;Рисует пиксел в режиме VGA 13h.

;Входные данные: x в AX, y в BX, цвет в CX

;Выходные данные: регистры AX и BX не сохраняются

xchg BH,BL ;умножаем y на 256, BL=0

add AX,BX ;AX = x+256y

shr BX,1 ;делим 256y на два

shr BX,1 ;BX = 256y/4 = 64y

add BX,AX ;BX = x+320y

mov AX,ES ;сохраняем значение ES

mov ES,VGA_seg ;сегмент памяти экрана VGA

mov ES:[BX],CL ;выводим байт на экран

mov ES,AX ;восстанавливаем значение регистра ES

ret

VGApxl$ endp

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]