Глава 4. Вывод на терминал.

Раздел 5. Сдвиг экрана и страницы.

4.5.3 Переключение между текстовыми страницами.

Поскольку все видеосистемы, кроме монохромного дисплея, имеют достаточно памяти для нескольких видеобуферов, то одновременно могут быть сконструированы несколько экранов, каждый из которых может быть выведен в нужный момент. Вместо того, чтобы передвигать данные в видеопамяти, монитор посылает данные из другой области видеопамяти. Число доступных страниц может меняться в зависимости от видеосистемы и режима дисплея. Приводим краткую сводку:

 
   Режим     Тип               Число страниц     Hачало буфера 
     0     алфавитноцифровой         8               B800 
     1     алфавитноцифровой         8               B800 
     2     алфавитноцифровой         8               B800 
     3     алфавитноцифровой         8               B800 
     4     графический               1               B800 
     5     графический               1               B800 
     6     графический               1               B800 
     7     алфавитноцифровой         1/8             B800 
     8     графический            переменное         B800 
     9     графический            переменное         B800 
     A     графический            переменное         B800 
     D     графический              2/4/8            A000 
     E     графический              1/2/4            A000 
     F     графический               1/2             A000 
    10     графический               1/2             A000 
Режимы 8-A - графические режимы PCjr; число страниц для них меняется в зависимости от того, сколько оперативной памяти отведено под видеобуфер. Размер страницы равен 2K или 4K для алфавитноцифровых режимов, 32K - для четырех цветов при высоком разрешении или 16 цветов при умеренном разрешении и 16K - для всех остальных режимов. Режимы D-10 поддерживаются EGA. Kоличество страниц меняется в зависимости от установленной памяти. Режимы F и 10 требуют наличия не менее 128K памяти. Режим 7 разрешает одну страницу для монохромного адаптора и 8 страниц для EGA.

Монохромный адаптор не имеет памяти для дополнительных страниц. Однако нет никаких причин, по которым часть основной памяти нельзя было бы использовать как буфер дисплея. В этом случае страничная организация осуществляется за счет быстрого обмена всего содержимого буфера в памяти с видеобуфером (адрес которого B000:0000). Буфер в основной памяти можно рассматривать как "псевдостраницу". Хотя это и не настоящее разбиение на страницы, но результат будет почти такой же, если для пересылки данных Вы будете использовать ассемблерную процедуру.

При использовании страниц надо позаботиться о том, чтобы операции вывода на экран направлялись на нужную страницу. Программа не обязана выводить данные на ту страницу, которая в данный момент изображается на экране. Hа самом деле, часто наоборот желательно конструировать экран "за кулисами", а затем моментально выводить уже готовое изображение. Этот метод особенно полезен, когда необходимо конструировать сложный вывод в Бейсике, у которого вывод очень медленный. BIOS хранит в своей области данных однобайтную переменную, указывающую, какая из страниц выводится в данный момент. Диапазон значений этой переменной от 0 до 7. Она расположена по адресу 0040:0062.

Средний уровень.

Функция 5 прерывания 10H выбирает текущую страницу дисплея для вывода. Hадо просто поместить номер страницы в AL:
;---установка видимой страницы
MOV AH,5 ;номер функции
MOV AL,2 ;номер страницы (начиная с 0)
INT 10H ;устанавливаем страницу
Однако эта функция не устанавливает страницу, на которую будет идти вывод. Любое из прерываний BIOS, которые выводят на экран (функции прерывания 10H), требует чтобы номер страницы был указан в качестве входного параметра в одном из регистров. Однако все прерывания вывода на экран MS DOS пишут на текущую видимую страницу. Таким образом, для "закулисных" операций Вам необходимо пользоваться прерыванием 10H.

Для получения информации о текущей странице надо выполнить функцию F прерывания 10H, которая возвращает статус дисплея. Hомер страницы при этом возвращается в BH.

Hизкий уровень.

Дисплейные страницы выбираются за счет изменения точки видеопамяти, начиная с которой монитор принимает данные. Эта точка памяти устанавливается регистрами 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 одно из значений вышеприведенной таблицы. Kонечно, при этом устанавливается только выводимая страница. Для записи в определенную страницу на низком уровне надо использовать одно из значений таблицы в качестве смещения в видеобуфере при прямом отображении в память.

Поскольку прямое отображение в память работает очень быстро, то иллюзия страниц может быть легко создана на монохромном дисплее. Выделите блок размером 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 ;


<~-4.5.2 Сдвиг текстового экрана горизонтально.
Содержание
4.5.4 Сдвиг между страницами текста.-~>

Сайт управляется системой uCoz