Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
29
Добавлен:
29.03.2016
Размер:
460.29 Кб
Скачать

Непосредственный вывод на экран

Поскольку обмен с дисплеем выполняется с помощью ВIО и операционной системы, для некоторых приложений это может существенно замедлить работу. Ускорить вывод графики и текста можно, записывая их напрямую в видеопамять. Например, адрес страницы О видеопамяти для режима 03 (цветной текст) — В800[0]H. Каждый символ занимает 2 байта памяти: один — собственно, для символа, и один — для его атрибутов. При размере области вывода на экране в 25 строк по 80 символов размер страницы в видеопамяти равен 80*25*2=4000 байтов.

Первые 2 байта в области видеопамяти соответствуют символу, расположенному на экране в левом верхнем углу (столбец 0, строка 0), а байты со смещениями F9ЕН иF9FН соответствуют правому нижнему угловому символу (столбец 79, строка 24). Запись символа и его атрибутов в видеопамять вызывает его немедленное отображение на экране. Для проверки справедливости этого утверждения можно использовать программуDEBUG. Сначала воспользуйтесь командойD В800:00 для просмотра содержимого видеопамяти по адресу В800[0]H. В памяти будет находиться текст, выведенный на экран в момент, когда вы ввели команду — обычно это набор байт, содержащих 20 07Н (пробелы с черным фоном и белым цветом символов). Заметьте, что и вы, и самDEBUGобращаетесь к одной и той же области памяти. Попробуйте выводить различные символы (например, сердечки (03Н)) с различными атрибутами (например, 25, 36 или 47) в верхней и нижней строках:

Программа, приведенная на рис. 9.6, — это пример прямой записи данных в видеопамять по адресу В900[0]H— то есть в страницу 1, а не 0. Программа использует директивуSEGMENTATдля определения области видеоданныхVIDEO_SEG, фактически как фиктивный сегмент.VID_AREAопределяет положение страницы 1 в начале сегмента. Программа выводит символы в строках с 5 по 20 в столбцах с 10 по 69. Первая строка содержит цепочку символов А (41Н) с атрибутом 01Н, вторая — символов В (42Н) с атрибутом 02Н, и т.д. — с последовательным перебором символов и атрибутов в каждой строке.

Программа устанавливает позицию в видеопамяти согласно формуле для определения любого адреса смещения в области:

Адрес смещения = [ (строка х 80) + столбец] х 2

Согласно этой формуле у символа в строке 5, столбце 10 будет смещение [(5x80+10]x2=410х2=820. После вывода одной строки программа перемещает курсор на 40 положений в области видеоданных до начала следующей строки и заканчивается, достигнув символаQ(51Н).

Сегмент видеоданных для страницы 1 определен как VIDEO_SEG, а страница — какVID_AREA. Программа использует регистрESв качестве сегментного регистра дляVIDEO_SEG. В начале выполнения программа сохраняет текущий видеорежим, устанавливает режим 03 и текущую страницу 01, а при завершении — восстанавливает исходный режим.

В процедуре В10DISPYначальный символ и атрибуты инициализируются в регистре АХ, а начальное смещение в видеопамяти — вDI. ИнструкцияMOVES:WORDPTR[DI],AXпомещает содержимое регистраAL(символ) в первый байт видеостраницы, а АН (атрибуты) — во второй байт. ИнструкцияLOOPвызывает 60-кратное повторение этого действия и вывод цепочки символов на экран. После этого значение символа и атрибутов увеличивается на 1, к значению в регистреDIдобавляется 40, т.е. 20 до конца строки и 20 как отступ от начала новой (по десять столбцов отступа от краев экрана) — и все повторяется вновь.

После завершения вывода программа ожидает нажатия клавиши и, восстановив исходный видеорежим, завершается.

Соседние файлы в папке Лекции