Страница 46 из 47
Средний уровень. Функция 5 прерывания 10H выбирает текущую страницу дисплея для вывода. Надо просто поместить номер страницы в AL:
;---установка видимой страницы MOV AH,5 ;номер функции MOV AL,2 ;номер страницы (начиная с 0) INT 10H ;устанавливаем страницу
Однако эта функция не устанавливает страницу, на которую будет идти вывод. Любое из прерываний BIOS, которые выводят на экран (функции прерывания 10H), требует чтобы номер страницы был указан в качестве входного параметра в одном из регистров. Однако все прерывания вывода на экран MS DOS пишут на текущую видимую стра- ницу. Таким образом, для "закулисных" операций Вам необходимо пользоваться прерыванием 10H. Для получения информации о текущей странице надо выполнить функцию F прерывания 10H, которая возвращает статус дисплея. Номер страницы при этом возвращается в BH.
Низкий уровень. Дисплейные страницы выбираются за счет изменения точки видео- памяти, начиная с которой монитор принимает данные. Эта точка памяти устанавливается регистрами 12 (старший байт) и 13 (младший байт) микросхемы 6845, которые называются регистрами стартового адреса. Значения адресов раздела страниц для буфера, начинающего- ся с B800 такие:
40 символов 80 символов страница 0 0000H 0000H 1 0400H 0800H 2 0800H 1000H 3 0C00H 1800H 4 1000H 5 1400H 6 1800H 7 1C00H В [4.1.1] объясняется как программировать регистры микросхемы 6845, а в [4.5.4] содержится пример программирования стартового адреса. В последнем примере надо просто присвоить BX одно из значений вышеприведенной таблицы. Конечно, при этом устанавли- вается только выводимая страница. Для записи в определенную стра- ницу на низком уровне надо использовать одно из значений таблицы в качестве смещения в видеобуфере при прямом отображении в па- мять. Поскольку прямое отображение в память работает очень быстро, то иллюзия страниц может быть легко создана на монохромном дисп- лее. Выделите блок размером 4000 байтов для хранения страницы. Хотя монохромный адаптер не может непосредственно читать из обыч- ной памяти, содержимое этого буфера и видеобуфера можно обменять настолько быстро, что никто не зметит разницы. Следующая процеду- ра обменивает содержимое этих двух областей. ;---в сегменте данных PPAGE DW 2000 DUP(720H) ;заполняем буфер пробелами
;---пересылка между псевдостраницей и видеобуфером MOV AX,0B000H ;указываем на видеобуфер MOV ES,AX ; MOV AX,SEG PPAGE ;указываем на псевдостраницу MOV DS,AX ; REPEAT: MOV DI,0 ;DI на начало видеобуфера MOV SI,OFFSET PPAGE ;SI на начало псевдостраницы CLD ;направление вперед MOV CX,2000 ;будем пересылать 2000 слов NEXT_WORD: MOV BX,ES:[DI] ;берем слово из видеобуфера в BX LODSW ;слово из псевдостраницы в AX STOSW ;слово из AX в видеобуфер MOV DS:[DI]-2,BX ;слово из BX в псевдостраницу LOOP NEXT_WORD ;
PCjr хранит регистр страницы в порте с адресом 3DFH. Значение битов этого регистра следующее:
биты 2-0 какая страница выводится (от 0 до 7) 5-3 какая страница пишется (от 0 до 7) при выводе по адресу сегмента B800H
7-6 = 00 для всех текстовых режимов = 01 для графических режимов с 16K = 11 для графических режимов с 32K
|