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

ОГЛАВЛЕНИЕ

     4.5.4 Сдвиг между страницами текста.


   Поскольку страницы текста прилегают друг к другу в  видеобуфе-
ре, то небольшой текстовый массив может целиком помещаться в этой
памяти.  В этом случае текст сдвигаться вверх и вниз по экрану не
передвигаясь реально в буфере.  Вместо этого экран начинает пока-
зывать  содержимое буфера, начиная с различных точек и тем  самым
создавая иллюзию сдвига. Этот  метод  называется аппаратным сдви-
гом.
   Аппаратный  сдвиг  достигается за  счет  изменения  стартового
адреса дисплея, который является  числом, указывающим на символ в
видеобуфере,  который будет выводиться в левом верхнем углу экра-
на.  Добавление 80 к  этому  числу  "сдвигает" весь экран на одну
строку вверх, а вычитание 80 - на одну строку вниз. В режиме с 40
символами в строке надо вместо 80 прибавлять или вычитать 40.  На
рис. 4-7 приведена диаграмма аппаратного сдвига.
   Отметим, что регистр стартового адреса не считает байты  атри-
бутов, поэтому Вы должны  вычислять адреса памяти по-другому, чем
при прямом отображении в память. Имейте также ввиду, что несмотря
на наличие разрывов  памяти  между  границами  страниц (96 байтов
между 80-символьными страницами и 48 байтов между  40-символьными
страницами) микросхема 6845 пропускает эти области и сдвиг непре-
рывно происходит с одной страницы на следующую.  Аппаратный сдвиг
происходит настолько быстро, что Вам  может оказаться необходимым
вставить процедуру задержки, чтобы пользователь имел  возможность
увидеть насколько сдвинулся экран.
   BIOS хранит  текущее  значение  регистра  стартового  адреса в
переменной  в своей области данных.  Эта  двухбайтная  переменная
расположена по адресу 0040:004EH.

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


   Стартовый адрес содержится в  регистрах 12 (старший байт) и 13
(младший байт) микросхемы 6845. В [4.1.1] объясняется работа этой
микросхемы.  Прежде  чем  адресуемый  байт  направляется в порт с
адресом  3D5H,  необходимо послать номер адресуемого  регистра  в
порт 3D4H. В данном примере  экран сдвигается вверх на одну стро-
ку. Переменная START_ADDRESS содержит адрес первого символа теку-
щей верхней строки экрана.

   MOV  BX,START_ADDRESS  ;начинаем с начала буфера
   ADD  BX,80             ;сдвигаем на 1 строку (80 символов)
   MOV  DX,3D4H           ;вывод в адресный регистр
   MOV  AL,12             ;адресуем регистр 12
   OUT  DX,AL             ;посылаем запрос
   INC  DX                ;теперь выводим в командный регистр
   MOV  AL,BH             ;старшее слово в AL
   OUT  DX,AL             ;посылаем его в регистр 12
   DEC  DX                ;обратно к адресному регистру
   MOV  AL,13             ;адресуем регистр 13
   OUT  DX,AL             ;посылаем запрос
   INC  DX                ;снова командный регистр
   MOV  AL,BL             ;младшее слово в AL
   OUT  DX,AL             ;посылаем в регистр 13