Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Переключение между текстовыми страницами. Часть 2

ОГЛАВЛЕНИЕ

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


   Функция 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