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


Процесс разделения экрана.



Рисунок 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: } }









Начало  Назад  Вперед