Страница 47 из 47
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
|