Программирование EGA и VGA
Вызов функции 5: Установка активной экранной страницы.
Комментарии
Адаптер позволяет использовать несколько страниц (или экранов) информации в видеопамяти. Отображаемой в некоторый момент времени может быть только одна страница, называемая активной. Большинство функций обладают возможностью какой-либо модификации экрана (запись символа, построения точки, перемещение курсора, и т.д.), а также возможностью выбора модифицируемой страницы; следовательно, функции позволяют вносить изменения в невидимые экраны. Это позволяет сохранять на экране одно изображение в процессе формирования другого, после чего выполнять быструю замену изображений (наиболее часто такая методика применяется в мультипликации и при демонстрации слайдов). Функция позволяет определить, какой из экранов будет выведен на дисплей. По умолчанию активной является страница 0.
CGA в режимах 2 и 3 имеет ограничение 4 страницы. Монохромный дисплей поддерживает только одну страницу.
Необходимо отметить, что в следующей таблице приведены диапазоны номеров страниц, которые могут быть использованы в регистре AL. 0 означает, что возможна работа только с одной страницей (номер 0).
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 5
- AL: номер активизируемой страницы:
Режимы: Номера страниц: ------- ------------------------------------- 64K 128K 256KПриведенная ниже программа "пролистывает" четыре видеостраницы, останавливаясь на каждой из них. С каждым следующим циклом пауза становится короче. На каждой из страниц добавляется одно слово, формируя сообщение "This shows four pages".
Пример на языке ассемблера:
data segment public msg1 db ' This' msg2 db ' shows' msg3 db ' four' msg4 db ' pages.' pse dw 0F000h ;длительность паузы при выводе data ends code segment public assume CX:code main proc far start: push DS sub AX,AX push AX mov AX,data ;получить размещение сегмента данных mov ES,AX ;установить ES для вызова функции assume ES:data mov AX,data mov DS,AX assume DS:data mov AX,3 ;режим 3 (алфавитно-цифровой) int 10h mov DH,08 ;строка 8 mov DL,0ah ;столбец 10 mov BH,3 ;страница 3 mov BP,offset msg1 ;ES:BP указатель на строку mov BL,0fh ;белый высокой яркости mov CX,6 ;длина строки ;загрузка четырех страниц с сообщением loop: mov AL,1 ;курсор перемещается ;только строка символов ;атрибут в BL mov AH,13h ;функция 13h - запись строки int 10h ;вызов видео-BIOS add BP,6 ;указатель на следующее сообщение add DL,6 ;перемещение курсора для следующей ;страницы dec BH ;указатель на следующую страницу cmp BP,offset msg4 jbe loop ;вывод четырех страниц dsp: mov CX,4 lp2: mov AL,CX dec AX mov AH,5 int 10h push CX mov CX,2 ;задержка (2-й множитель ;для увеличения времени) ps1: push CX mov CX,pse ;длина паузы ps2: loop ps2 ;пустой цикл для задержки pop CX loop ps1 ;цикл через множитель pop CX loop lp2 mov AX,pse sub AX,1000h mov pse,AX cmp AX,0 ja dsp ;переустановка страницы 0 перед возвратом в DOS mov AL,0 mov AH,5 int 10h ret main endp code ends end startВызов функции 6: Прокрутка (скроллинг) активной страницы вверх.
Комментарии
С помощью этой функции выполняется прокрутка текста на экране: строки перемещаются снизу вверх, а внизу осуществляется вставка пустых строк. Могут быть определены координаты прокручиваемого окна, поэтому прокручиваться может только часть экрана. В регистр AL помещается значение, определяющее число прокручиваемых строк.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 6
- AL: число прокручиваемых строк (0 - очистка экрана)
- BH: символ атрибута новых строк (см. функцию 8)
- CH: номер верхней строки окна
- CL: номер левого столбца окна
- DH: номер нижней строки окна
- DL: номер правого столбца окна
Приведенная ниже программа печатает сообщение "This line will scroll (except for this part)" и прокручивает первую часть вверх на одну строку. Вторая часть сообщения не прокручивается, в результате чего эффект скроллинга виден особенно наглядно.
Пример на языке ассемблера:
data segment public msg1 db 'This line will scroll (except for' db 'this part)' msg2 db 'This line will not scroll' data ends code segment public assume CS:code main proc far start: push DS sub AX,AX push AX mov AX,data ;получить размещение сегмента данных mov ES,AX ;установить ES для вызова функции assume ES:data mov AX,data mov DS,AX assume DS:data mov AX,3 ;режим 3 (алфавитно-цифровой) int 10h mov DH,12 ;строка 12 mov DL,10 ;столбец 10 mov BH,0 ;страница 0 mov BP,offset msg1 ;ES:BP указатель на строку mov BL,0fh ;белый высокой яркости mov CX,44 ;длина строки mov AL,1 ;курсор перемещается ;только строка символов ;атрибут в BL mov AH,13h ;функция 13h - запись строки int 10h ;вызов видео-BIOS mov DH,13 ;строка 13 mov DL,10 ;столбец 10 mov BH,0 ;страница 0 mov BP,offset msg2 ;ES:BP указатель на строку mov BL,0fh ;белый высокой яркости mov CX,25 ;длина строки mov AL,1 ;курсор перемещается ;только строка символов ;атрибут в BL mov AH,13h ;функция 13h - вывод строки int 10h ;вызов видео-BIOS mov CX,2 ;задержка (множитель) ;для увеличения времени ps1: push CX mov CX,0ffffh ;длина паузы ps2: loop ps2 ;пустой цикл для задержки pop CX loop ps1 ;цикл через множитель mov CX,0 ;координата левого верхнего угла 0,0 mov DH,12 ;правый нижний угол на строке 12 mov DL,31 ;столбец 31 mov AL,1 ;переместить 1 строку mov BH,0fh ;атрибут новой строки mov AH,6 ;прокрутка вверх int 10h ;вызов видео-BIOS ret main endp code ends end start