Программирование видеоадаптеров CGA, EGA и VGA



         

Регистр сравнения линий (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) {




Содержание  Назад  Вперед