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

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

   Режим     Тип               Число страниц     Начало буфера

     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.  Количество страниц ме-
няется в зависимости от установленной памяти.  Режимы F и 10 тре-
буют наличия не менее 128K памяти. Режим 7 разрешает одну страни-
цу для монохромного адаптора и 8 страниц для EGA.
   Монохромный  адаптор не имеет памяти для дополнительных  стра-
ниц.  Однако нет никаких причин, по которым часть основной памяти
нельзя  было  бы использовать как буфер дисплея.  В  этом  случае
страничная  организация  осуществляется  за  счет быстрого обмена
всего  содержимого буфера в памяти с видеобуфером (адрес которого
B000:0000).  Буфер  в  основной  памяти  можно  рассматривать как
"псевдостраницу".  Хотя это и не настоящее разбиение на страницы,
но результат будет почти такой  же,  если для пересылки данных Вы
будете использовать ассемблерную процедуру.
   При  использовании страниц надо позаботиться о том, чтобы опе-
рации вывода на экран направлялись  на нужную страницу. Программа
не  обязана выводить данные на ту страницу, которая в данный  мо-
мент изображается на экране.  На самом деле, часто наоборот жела-
тельно  конструировать  экран "за кулисами", а затем  моментально
выводить уже готовое  изображение.  Этот  метод особенно полезен,
когда необходимо конструировать сложный вывод в Бейсике, у  кото-
рого вывод очень  медленный.  BIOS  хранит в своей области данных
однобайтную переменную, указывающую, какая из страниц выводится в
данный момент.  Диапазон значений этой переменной от 0 до 7.  Она
расположена по адресу 0040:0062.


   Высокий уровень.

   Бейсик  использует  команду SCREEN для установки страницы,  на
которую будет идти вывод (активной страницы) и выводимой страницы
(видимой  страницы).  Страницы нумеруются от 0 до 3 для текстов с
80 символами в строке и от 0 до 7 для 40-символьных. Третий пара-
метр   за  командой  SCREEN  устанавливает   активную   страницу.
SCREEN,,2 приводит к тому, что все операторы PRINT будут работать
со страницей 2.  Четвертый параметр устанавливает видимую страни-
цу.  SCREEN,,,1 приводит  к  тому,  что на экран будет выводиться
страница 1.  Когда видимая страница не указывается, то  автомати-
чески принимается, что она совпадает с активной.
   Для выделения памяти под  страницы на PCjr используется опера-
тор CLEAR.  Этот оператор устанавливает общее количество  памяти,
отводимое под буфер экрана, которое при старте равно 16384 байта.
Чтобы   добавить   вторую   страницу   размером   16K,   напишите
CLEAR,,,32768. Добавочные  текстовые страницы требуют 4096 байтов
каждая.   При  условии, что таким образом была  отведена  память,
команды оператора SCREEN для  работы  со страницами работают опи-
санным образом.  Только PCjr имеет добавочный параметр  оператора
SCREEN, который стирает страницу (т.е. переводит ее в цвет фона).
Детали  описаны в руководстве по Бейсику.  Оператор  PCOPY  также
уникален для PCjr. Он  копирует  изображение  из одной страницы в
другую.  Например, PCOPY 2,1 целиком копирует страницу 2 на стра-
ницу 1.
   Хотя монохромный адаптор не имеет  памяти для страниц дисплея,
однако  имеется  способ устроить  своего  рода  "псевдостраницы".
Нижеприведенная процедура  на  машинном  языке рассматривает блок
памяти  как дисплейную страницу.  При вызове этой  процедуры  она
обменивает содержимое видеобуфера с содержимым этой области памя-
ти.   В  результате мы имеем как бы две дисплейные страницы.   (В
приложении Г объясняется как  включать  подпрограммы  на машинном
языке в программы на Бейсике.)
   Вы должны отвести блок памяти размером 4000 байт для псевдост-
раницы, помимо памяти, содержащей  программу на машинном языке. В
примере  блок  начинается с адреса сегмента  &H2000, а  процедура
помещена по адресу &H2200.   Сегментный  адрес блока содержится в
9-м и 10-м байтах машинного кода и Вы легко можете изменить  его.
Видно, что адрес  &H2000  представлен  как &H00, &H20 в операторе
DATA.  Это следствие того, что младшие цифры всегда размещаются в
младших ячейках памяти. Если Вы хотите разместить блок, скажем по
адресу 1234:0000, то надо изменить байты 9 и 10 на &H34, &H12.
   Вам  может  потребоваться очистить  псевдостарницу  от  всякой
ерунды, оставшейся от  других  программ.   В  строках 230-260 это
достигается  за счет засылки символа пробела (ASCII 32) в  каждый
байт (32 служит "нормальным" байтом  атрибутов).  Программа может
осуществлять  вывод на экран обычным образом, а затем  переносить
содержимое на псевдостраницу.   Но если хотите, то Вы можете осу-
ществлять вывод прямо на псевдостраницу, используя прямое отобра-
жение в память.


100 '''машинный код
110 DATA &H1E, &H06, &HB8, &H00, &HB0, &H8E, &HC0
120 DATA &HB8, (3&H00, &H20), &H8E, &HD8, &HBF, &H00
130 DATA &H00, &HBE, &H00, &H00, &HFC, &HB9, &HD0
140 DATA &H07, &H26, &H8B, &H1D, &HAD, &HAB, &H89
150 DATA &H5D, &HFE, &HE2, &HF6, &H07, &H1F, &HCB
160 '''помещаем код в память
170 DEF SEG = &H2200   'указываем адрес процедуры
180 FOR N = 0 TO 34    'начинаем с первого байта
190 READ Q             'читаем байт процедуры
200 POKE N,Q           'пишем его в память
210 NEXT               '
220 '''чистим псведостраницу
230 DEF SEG = &H2000   'адрес начала псевдостраницы
240 FOR N = 0 TO 3999  'для каждого символа и атрибута
250 POKE N,32          'помещаем код 32
260 NEXT               'пока не очистим весь буфер

500 '''пишем прямо в псевдостраницу
510 DEF SEG = &H2000   'указываем на ее адрес
520 S$ = "PSEUDOPAGE"  'выводим слово посреди страницы
530 M = LEN(S$)        'получаем длину строки
540 FOR N = 1 TO M     'для каждого символа строки
550 POKE N*2+2000, ASC(MID$(S$,N,1))   'помещаем его в буфер
560 NEXT               '

600 '''теперь используем процедуру
610 PRINT "SCRREN 1"   'печатаем сообшение на экран
620 DEF SEG = &H2200   'указываем на процедуру
630 PSEUDOPAGE = 0     'начинаем с начала процедуры
640 CALL PSEUDOPAGE    'обмениваем страницы
650 CALL PSEUDOPAGE    'повторяем обмен
660 ...

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

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

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий