Assembler - язык неограниченных возможностей

         

Регистры синхронизатора (03C4h– 03C5h)


Для обращения к регистрам синхронизатора следует записать индекс нужного регистра в порт 03C4h, после чего можно будет читать и писать данные для выбранного регистра в порт 03C5h. Точно так же, если требуется только запись в регистры, можно просто поместить индекс в AL, посылаемый байт — в АН и выполнить команду вывода слова в порт 03CEh.

00h: Регистр сброса синхронизации

бит 1: запись нуля сюда вызывает синхронный сброс

бит 0: запись нуля сюда вызывает асинхронный сброс

01h: Регистр режима синхронизации

бит 5: 1 — обмен данными между видеопамятью и дисплеем выключен

бит 3: 1 — частота обновления для символов уменьшена в два раза

бит 0: 1/0 — ширина символа 8/9 точек

02h: Регистр маски записи

бит 3: разрешена запись CPU в цветовую плоскость 3

бит 2: разрешена запись CPU в цветовую плоскость 2

бит 1: разрешена запись CPU в цветовую плоскость 1

бит 0: разрешена запись CPU в цветовую плоскость 0

03h: Регистр выбора шрифта

бит 5: если бит 3 атрибута символа = 1, символ берется из шрифта 2

бит 4: если бит 3 атрибута символа = 0, символ берется из шрифта 2

биты 3 – 2: номер таблицы для шрифта 2

биты 1 – 0: номер таблицы для шрифта 1

(00, 01, 10, 11) = (0 Кб, 16 Кб, 32 Кб, 48 Кб от начала памяти шрифтов VGA)

04h: Регистр организации видеопамяти

бит 3: 1 — режим CHAIN-4 (используется только в видеорежиме 13h)

бит 2: 0 — четные адреса обращаются к плоскостям 0, 2, нечетные — к 1, 3

бит 1: объем видеопамяти больше 64 Кб

Хотя BIOS и позволяет использовать некоторые возможности этих регистров, в частности работу со шрифтами (INT 10h АН = 11h) и выключение обмена данными между видеопамятью и дисплеем (INT 10h, АН = 12h, BL = 32h), прямое программирование регистров синхронизатора вместе с регистрами контроллера CRT позволяет значительно изменять характеристики видеорежимов VGA, вплоть до установки нестандартных видеорежимов. Наиболее популярными режимами являются так называемые режимы «X» с 256 цветами и с разрешением 320 или 360 пикселей по горизонтали и 200, 240, 400 или 480 пикселей по вертикали. Так как такие режимы не поддерживаются BIOS, для их реализации нужно написать все необходимые процедуры — установку видеорежима, вывод пикселя, чтение пикселя, переключение страниц, изменение палитры, загрузку шрифтов. При этом для всех режимов из этой серии, кроме 320x240x256, приходится также учитывать измененное соотношение размеров экрана по вертикали и горизонтали, чтобы круг, выведенный на экран, не выглядел как эллипс, а квадрат — как прямоугольник.


Установка нового режима выполняется почти точно так же, как и в предыдущем примере, — путем модификации существующего. Кроме того, нам придется изменять частоту кадров (биты 3 – 2 регистра MOR), а это приведет к сбою синхронизации, если мы не выключим синхронизатор на время изменения частоты (записью в регистр 00h):

; процедура set_modex ; переводит видеоадаптер VGA в один из режимов X с 256 цветами ; ввод: DI = номер режима ; 0: 320x200, соотношение сторон 1,2:1 ; 1: 320x400, соотношение сторон 2,4:1 ; 2: 360x200, соотношение сторон 1,35:1 ; 3: 360x400, соотношение сторон 2,7:1 ; 4: 320x240, соотношение сторон 1:1 ; 5: 320x480, соотношение сторон 2:1 ; 6: 360x240, соотношение сторон 1,125:1 ; 7: 360x480, соотношение сторон 2,25:1 ; DS = CS ; Для вывода информации на экран в этих режимах ; см. процедуру putpixel_x setmode_x proc near mov ax,12h ; очистить все четыре цветовые int 10h ; плоскости видеопамяти, mov ax,13h ; установить режим 13h, который будем int 10h ; модифицировать cmp di,7 ; если нас вызвали с DI > 7, ja exit_modex ; выйти из процедуры ; (оставшись в режиме 13h), shl di,1 ; умножить на 2, так как x_modes - ; таблица слов, mov di,word ptr x_modes[di] ; прочитать ; адрес таблицы настроек для ; выбранного режима mov dx,03C4h ; порт 03C4h - индекс синхронизатора mov ax,0100h ; регистр 00h, значение 01 out dx,ax ; асинхронный сброс mov ax,0604h ; регистр 04h, значение 06h out dx,ax ; отключить режим CHAIN4 mov dl,0C2h ; порт 03C2h - регистр ; MOR на запись mov al,byte ptr [di] ; записать в него ; значение частоты кадров out dx,al ; и полярности развертки ; для выбранного режима mov dl,0D4h ; порт 03D4h - индекс ; контроллера CRT mov si,word ptr offset [di+2] ; адрес строки с настройками ; для выбранной ширины в DS:SI mov cx,8 ; длина строки настроек в СХ rep outsw ; вывод строки слов ; в порты 03D4/03D5 mov si,word ptr offset [di+4] ; настройки для ; выбранной высоты в DS:SI mov сх,7 ; длина строки настроек в СХ rep outsw mov si,word ptr offset [di+6] ; настройки ; для включения/выключения удвоения ; по вертикали (200/400 и 240/480 строк) mov сх,3 rep outsw mov ax, word ptr offset [di+8] ; число байт в строке mov word ptr x_width,ax ; сохранить ; в переменной x_width mov dl,0C4h ; порт 03C4h - индекс синхронизатора mov ах,0300h ; регистр 00h, значение 03 out dx,ax ; выйти из состояния сброса exit_modex: ret



; таблица адресов таблиц с настройками режимов x_modes dw offset mode_0,offset mode_1 dw offset mode_2,offset mode_3 dw offset mode_4,offset mode_5 dw offset mode_6,offset mode_7

; таблица настроек режимов: значение регистра MOR, адрес строки ; настроек ширины, адрес строки настроек высоты, адрес строки ; настроек удвоения по вертикали, число байт в строке mode_0 dw 63h,offset mode_320w,offset mode_200h,offset mode_double,320/4 mode_1 dw 63h,offset mode_320w,offset mode_400h,offset mode_single,320/4 mode_2 dw 67h,offset mode_360w,offset mode_200h,offset mode_double,360/4 mode_3 dw 67h,offset mode_360w,offset mode_400h,offset mode_single,360/4 mode_4 dw 0E3h,offset mode_320w,offset mode_240h,offset mode_double,320/4 mode_5 dw 0E3h,offset mode_320w,offset mode_480h,offset mode_single,320/4 mode_6 dw 0E7h,offset mode_360w,offset mode_240h,offset mode_double,360/4 mode_7 dw 0E7h,offset mode_360w,offset mode_480h,offset mode_single,360/4

; настройки CRT. В каждом слове младший байт - номер регистра, ; старший - значение, которое в этот регистр заносится mode_320w: ; настройка ширины 320 ; Первый регистр обязательно 11h, хотя он и не относится ; к ширине - он разрешает запись в остальные регистры, ; если она была запрещена (!) dw 0E11h,5F00h,4F01h,5002h,8203h,5404h,8005h,2813h mode_360w: ; настройка ширины 360 dw 0E11h,6B00h,5901h,5A02h,8E03h,5E04h,8A05h,2D13h mode_200h: mode_400h: ; настройка высоты 200/400 dw 0BF06h,1F07h,9C10h,0E11h,8F12h,9615h,0B916h mode_240h: mode_480h: ; настройка высоты 240/480 dw 0D06h,3E07h,0EA10h,0C11h,0DF12h,0E715h,0616h mode_single: ; настройка режимов без удвоения dw 4009h,0014h,0E317h mode_double: ; настройка режимов с удвоением dw 4109h,0014h,0E317h setmode_x endp

x_width dw ? ; число байт в строке ; эту переменную инициализирует setmode_x, а использует putpixel_x

; процедура putpixel_x ; выводит точку с заданным цветом в текущем режиме X ; Ввод: DX = строка ; СХ = столбец ; ВР = цвет ; ES = A000h ; DS = сегмент, в котором находится переменная x_width



putpixel_x proc near pusha mov ax, dx mul word ptr x_width ; AX = строка * число байт в строке mov di,cx ; DI = столбец shr di,2 ; DI = столбец/4 (номер байта в строке) add di,ax ; DI = номер байта в видеопамяти mov ax,0102h ; AL = 02h (номер регистра), ; АН = 01 (битовая маска) and cl,03h ; CL = остаток от деления ; столбца на 4 = номер ; цветовой плоскости shl ah,cl ; теперь в АН выставлен в 1 бит, ; соответствующий нужной ; цветовой плоскости mov dx,03C4h ; порт 03C4h - индекс ; синхронизатора out dx,ax ; разрешить запись только ; в нужную плоскость mov ax,bp ; цвет в AL stosb ; вывод байта в видеопамять рора ret putpixel_x endp


Содержание раздела