Читайте также:
|
|
Два регистра - регистр старшего байта позиции курсора (Cursor Location Register - CLR_h, high byte) (индекс 0Eh) и регистр младшего байта позиции курсора (Cursor Location Register - CLR_l, low byte) (индекс 0Fh) определяют положение курсора на экране (cм. рисунок 8.6). Регистры доступны как для записи, так и для чтения.
Рисунок 8.6 Отображение курсора на экране.
Программа, приведенная ниже считывает значения из регистров позиции курсора (на момент запуска программы) и отображает их на экране дисплея:
// чтение регистра положения курсора #include <stdio.h>#include <graph.h>#include "sysp.h"#include "sysgraph.h" void main(void) { int crt_port; unsigned char h_pos, l_pos; BIOS_VAR _far *bios_var_ptr; // получаем указатель на область переменных видеофункций BIOS bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410); // определяем адрес порта индексного регистра контроллера ЭЛТ crt_port = bios_var_ptr -> crt_address; // выбираем старший байт регистра положения курсора WriteReg(crt_port, 0x0E); // считываем значение старшего байта регистра положения курсора h_pos = ReadReg(crt_port + 1); // выбираем младший байт регистра положения курсора WriteReg(crt_port, 0x0F); // считываем значение младшего байта регистра положения курсора l_pos = ReadReg(crt_port + 1); printf("\nТекущий адрес курсора %X:%X\n", (unsigned char) h_pos, (unsigned char) l_pos);}Начало обратного вертикального хода луча (VRSR) (индекс 10h)
Регистр определяет начало обратного вертикального хода луча. Для EGA этот регистр содержит 9, а для VGA - 10 битов. Дополнительные биты расположены в регистре OVR.
Данный регистр доступен только для записи.
Конец обратного вертикального хода луча (VRER) (индекс 11h)
Данный регистр видеоадаптеров EGA и VGA доступен только для записи.
Регистр устанавливает конец обратного вертикального хода луча, а также выполняет некоторые другие функции.
D3-D0 Конец обратного вертикального хода луча.D4 Сброс вертикального прерывания.D5 Разрешения вертикального прерывания.D6 Изменение скорости регенирации экрана. (Только VGA.)D7 Защита от записи. (Только VGA.)Регистр адреса светового пера (LPAR)
Это 16-битовый регистр, который имеется в видеоадаптерах CGA и EGA, доступен только для чтения. Регистр LPAR дает возможность определить положение светового пера на экране. Регистр содержащий старший байт адреса светового пера имеет индекс 10h, а регистр содержащий младший байт - индекс 11h.
LPAR сохраняет адрес видеопамяти, которая регенерировалась в момент включения светового пера.
Завершение отображения вертикальной развертки (VDER) (индекс 12h)
Регистр определяет момент, когда заканчивается видемая часть вертикальной развертки и происходит гашение луча. Регистр содержит число, на единицу меньшее, чем количество горизонтальных линий растра.
Для видеоадаптера EGA регистр VDER содержит 9, а для VGA - 10 бит. Девятыи и десятый биты доступны через дополнительный регистр (OVR).
Логическая ширина экрана (OFR) (индекс 13h)
Регистр может быть использован для отображения большего, чем обычно, количества символов в строке. Например, для перевода видеоадаптера в режим отображения 132 симвов в строке.
В графических режимах регистр OFR задает логическую длину (в 16-битных словах или 32-битных двойных словах) горизонтальной линии развертки. Если линия num развертки начинается по адресу adr, то следующая линия развертки num+1 начинается по адресу adr+offset, где offset это значение регистра OFR.
В текстовых режимах регистр содержит смещение между соседними строками текста, заданное в 16-битных словах.
Использование регистраа OFR иллюстрируется рисунком 8.7. На верхней части рисунка видеоадаптер находится в стандартном текстовом режиме с разрешением 80 символов в строке. При этом значение регистра логической ширины экрана равно 40. На нижней части рисунка представлен результат увеличения содержимого регистра до 41. Логическая ширина экрана в этом случае увеличивается до 82 символов в строке. Последние два символа каждой строки не помещаются на экране. Для их отображения надо выполнить горизонтальную свертку экрана.
Рисунок 8.7 Логическая ширина экрана.
Положение подчеркивания символа (ULR) (индекс 14h)
Регистр ULR используется только в текстовых режимах. Он определяет положение подчеркивания символа. Подчеркивание предстовляет собой одну из линий в матрице символа. Подчеркивание отображается, если установлен атрибут подчеркивания. Отображение подчеркивания можно запретить, записав в регистр ULR величину большую, чем высота символов.
Программа, приведенная ниже, использует регистры контроллера ЭЛТ для перевода видеоадаптеров EGA и VGA в нестандартный текстовый режим, имеющий разрешение по вертикали 43 строки. Данная программа переводит видеоадаптер в текстовый режим с разрешением по вертикали 43 символа и затем отображает на экране диспля 43 строки текста.
#include <graph.h> void Set43Line(void); void main(void) { int i; // устанавливаем текстовый режим, принятый по умолчанию; // функция _setvideomode определена в графической библиотеке // трансляторов Microsoft Quick C 2.5 и C 6.0 _setvideomode(_DEFAULTMODE); // перепрограммируем видеоадаптер для отображения 43 строк Set43Line(); // выводим на экран дисплея 43 строки текста for(i = 0; i < 43; i++) printf("text line number %d\n", i); getch(); // восстанавливаем режим с 25 текстовыми строками _setvideomode(_DEFAULTMODE);} /***.Name Set43Line**.Title Установка текстового режима, использующего 43 строки.**.Descr Переводит адаптеры EGA и VGA в режим отображения 43 * строк текста.**.Proto void Set43Line(void)**.Params Отсутствуют.***.Return Не используется.**.Sample 43line.c**/void Set43Line(void) { #define CHAR_SIZE 8 // новая высота символов _asm {; устанавливаем регистр es на начало оперативной памяти xor ax,ax mov es,ax; получаем адрес порта индексного регистра контроллера ЭЛТ; (3B4h/3D4h),; в монохромных режимах для адресации к индексному регистру; используется порт с адресом 3B4h, а в цветных - порт 3D4h mov dx,es:[463h]; выбираем для обмена регистр максимальной линии сканирования; этот регистр задает высоту символов на экране дисплея mov al,9 out dx,al; вычисляем адрес порта регистра данных контроллера ЭЛТ,; в монохромных режимах для адресации к регистру данных; используется порт с адресом 3B5h, а в цветных - порт 3D5h inc dx; биты D4-D0, регистра максимальной линии сканирования содержат; число, меньшее на единицу, чем высота символов в пикселах mov al,CHAR_SIZE-1 out dx,al; вычисляем адрес порта индексного регистра контроллера ЭЛТ dec dx; выбираем для обмена регистр положения подчеркивания mov al,14h out dx,al; вычисляем адрес порта регистра данных контроллера ЭЛТ inc dx; определяем положение подчеркивания символов mov al,CHAR_SIZE out dx,al; вычисляем адрес порта индексного регистра контроллера ЭЛТ dec dx; выбираем для обмена регистр завершения отображения; вертикальной развертки; регистр завершения отображения вертикальной развертки; содержит восемь младших бит, определяющих число отображаемых; горизонтальных линий растра минус один mov al,12h out dx,al; вычисляем адрес порта регистра данных контроллера ЭЛТ inc dx; для отображения 43 текстовых символов, при высоте символов; 8 пикселов, необходимо иметь 43 * 8 = 344 горизонтальных; линий растра; помещаем в регистр завершения отображения вертикальной; развертки младшие 8 бит числа 344 mov al,(43 * CHAR_SIZE - 1 - 256) out dx,al; устанавливаем новые значения переменных BIOS; число символов в строке равно восьмидесяти mov WORD PTR es:[44Ah],80; число строк текста минус один mov BYTE PTR es:[484h],(350/CHAR_SIZE)-1; высота символов в пикселах mov WORD PTR es:[485h],CHAR_SIZE; загружаем нулевую таблицу знакогенератора, расположенную во втором; цветовом слое, набором символов (размера 8х8 пикселов) из ПЗУ BIOS; процесс загрузки шрифтов более подробно описан в разделе "Загрузка; таблиц знакогенератора" из главы "Дополнительные средства BIOS для; управлния EGA и VGA" mov ax,1112h xor bl,bl int 10h }}Начало импульса гашения вертикальной развертки (SVBR) (byltrc 15h)
Регистр определяет момент начала гашения луча в прцессе вертикальной развертки.
Для EGA регистр имеет 9, а для VGA - 10 битов. Девятый бит и для EGA и для VGA расположен в дополнительном регистре (OVR). Десятый бит для VGA расположен в регистре высоты символов текста (MSLR).
Конец импульса гашения вертикальной развертки (EVBR) (индекс 16h)
В момент, когда младшие 5 битов регистра для EGA или все 8 битов для VGA равны счетчику горизонтальных линий, заканчивается сигнал гашения вертикальной развертки.
Управление режимом (MCR) (индекс 17h)
Регистр содержит набор битов, управляющих контроллером ЭЛТ.
D6 D5 | 1х | ||
MA0 | MA13 | MA15 | |
MA1 | MA0 | MA0 | |
MA2 | MA1 | MA1 | |
MA3 | MA2 | MA2 | |
MA4 | MA3 | MA3 | |
MA5 | MA4 | MA4 | |
MA6 | MA5 | MA5 | |
MA7 | MA6 | MA6 | |
MA8 | MA7 | MA7 | |
MA9 | MA8 | MA8 | |
MA10 | MA9 | MA9 | |
MA11 | MA10 | MA10 | |
MA12 | MA11 | MA11 | |
MA13 | MA12 | MA12 | |
MA14 | MA13 | MA13 | |
MA15 | MA14 | MA14 |
Таблица 8.11 Преобразование адреса.
Бит D5 равен нулю только для видеоадаптеров EGA с объемом видеопамяти 64К байт. При этом происходит сцепление слоев в графических режимах с высоким разрешением.
Регистр сравнения линий (Line Compare Register - LCR) (индекс 18h)
Обеспечивает разделение экрана на две независимые части. При этом одну из них можно свертывать, содержимое другой части экрана остается на месте.
Данный регистр используют совместно с регистром начального адреса. Когда счетчик горизонтальных линий сканирования достигает значения, записанного в регистре LCR, происходит сброс счетчика адреса регенерируемой видеопамяти в ноль. В результате экран разбивается на две части, где в верхней отображаются данные, на которые указывает регистр начального адреса, а в нижней - данные, находящиеся в начале видеопамяти. На рисунке 8.8 иллюстрируется процесс разделения экрана:
Рисунок 8.8 Процесс разделения экрана.
Содержимое верхнего окна можно перемещать, изменяя содержимое регистра начального адреса.
Заметим, что у видеоадаптера EGA регистр сравнения линий состоит из 9 бит. Доступ к девятому биту возможен через дополнительный регистр (OVR) контроллера ЭЛТ. Видеоадаптер VGA имеет дополнительно еще и десятый бит, расположенный в регистре MSLR.
При изменении режима работы видеоадаптера, BIOS записывает в регистр сравнения линий значение 0FFh.
Следующая программа выводит на экран дисплея 25 строк текста, а затем, после нажатия любой клавиши, разделяет экран на две части.
// пример разделения экрана дисплея на две части при помоши// регистра сравнения линий контроллера ЭЛТ #include <dos.h>#include <stdio.h> void Split(unsigned); void main(void) { int i; // выводим на экран дисплея 25 строк текста for(i = 0; i < 25; i++) printf("Строка номер %d.",i); getch(); // разделяем экран по линии 200 Split(200); getch();// после завершения программы// значения регистров не восстанавливаются!} /***.Name Split**.Title Разделение экрана.**.Descr Функция разделяет экран на две части. Функция работает* только на EGA и VGA.**.Proto void Split(unsigned split_line)**.Params unsigned split_line - линия горизонтальной развертки, * в которой происходит разделение экрана дисплея.**.Return Не используется.**.Sample split.c**/void Split(unsigned split_line) { _asm {; устанавливаем регистр es на начало оперативной памяти xor ax,ax mov es,ax; получаем адрес порта индексного регистра контроллера ЭЛТ; (3B4h/3D4h),; в монохромных режимах для адресации к индексному регистру; используется порт с адресом 3B4h, а в цветных - порт 3D4h mov dx,es:[463h]; вычисляем адрес порта регистра состояния 1,; в монохромных режимах для адресации к регистру состояния 1; используется порт с адресом 3BAh, а в цветных - порт 3DAh add dx,6; ожидаем начало обратного вертикального хода луча in al,dx nop; если бит D3 равен единице, то происходит обратный; вертикальный ход луча test al,8 jz wait_on wait_off: in al,dx; задержка nop test al,8 jnz wait_off wait_on: in al,dx nop test al,8 jz wait_on; вычисляем адрес порта индексного регистра контроллера ЭЛТ; (3B4h/3D4h) sub dx,6; выбираем для обмена регистр сравнения линий mov al,18h out dx,al; вычисляем адрес порта регистра данных контроллера ЭЛТ,; в монохромных режимах для адресации к регистру данных; используется порт с адресом 3B5h, а в цветных - порт 3D5h inc dx; определяем линию горизонтальной развертки, в которой происходит; разделение экрана дисплея mov ax,split_line; у видеоадаптера EGA регистр сравнения линий состоит из 9 бит,; доступ к девятому биту происходит через дополнительный регистр; контроллера ЭЛТ;; видеоадаптер VGA имеет еще и десятый бит, расположенный в регистре; высоты символов текста; записываем младшие 8 битов в регистр сравнения линий out dx,al; вычисляем адрес порта индексного регистра контроллера ЭЛТ dec dx; вызываем функцию чтения конфигурации видеосистемы,; данная функция подробно описана в главе; "Дополнительные средства BIOS для управлния EGA и VGA" mov ax,1A00h int 10h; если после вызова функции регистр al не равен 1Ah, то используемый; видеодаптер не VGA cmp al,1Ah je vga jmp ega vga:; считываем в al состояние дополнительного регистра mov al,7 out dx,al inc dx in al,dx; модифицируем бит D4 дополнительного регистра mov bx,split_line mov cl,4 shl bh,cl and bh,00010000b and al,11101111b or al,bh out dx,al; сбрасываем бит D6 регистра высоты символов текста dec dx mov al,9 out dx,al inc dx in al,dx and al,10111111b out dx,al jmp quit_split ega: mov bx,split_line mov cl,4 shl bh,cl and bh,00010000b cmp dx,3B4h; монохромный режим? je default_1Fh; если да, то переходим; на метку default_1Fh; определяем наличие улучшенного цветного дисплея по положению; переключателей на плате EGA mov al,es:[488h] and al,0Fh; положение переключателей "off off on on"? cmp al,3 je default_1Fh; положение переключателей "off on on off"? cmp al,9 je default_1Fh; для видеосистем с монохромным или цветным дисплеями,; дополнительный регистр по умолчанию содержит 11h or bh,1 jmp set_overflow; для видеосистем с улучненным цветным дисплеем или в монохромных; текстовых режимах дополнительный регистр по умолчанию содержит; значение 1Fh default_1Fh: or bh,0Fh; устанавливаем дополнительный регистр set_overflow: mov al,07h out dx,al inc dx mov al,bl out dx,al quit_split: }}
Дата добавления: 2015-09-02; просмотров: 72 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Регистры начального адреса | | | Задача. |