- •Видеосистема
- •Введение
- •Компоненты видеосистемы
- •Монитор
- •Область памяти дисплея
- •Видеоконтроллер
- •Видео-bios
- •Видеорежимы
- •Атрибуты
- •Функции прерывания iнт 10н
- •Функция 0н прерывания int10н: установка видеорежима
- •Функция 01н прерывания int10н: установка размера курсора
- •Функция 02н прерывания int10н: установка положения курсора
- •Функция 0зн прерывания int10н: получение состояния курсора
- •Функция 05н прерывания int10н: выбор активной страницы
- •Функция 06н прерывания int10н: прокрутка экрана вверх
- •Функция 07н прерывания int10н: прокрутка экрана вниз
- •Функция 08н прерывания int10н: считывание символа и его атрибутов в положении курсора
- •Функция 09н прерывания int10н: вывод том символа и атрибутов в положение курсора
- •Функция 0ан прерывания int10н: вывод символа в положение курсора
- •Непосредственный вывод на экран
Непосредственный вывод на экран
Поскольку обмен с дисплеем выполняется с помощью В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 как отступ от начала новой (по десять столбцов отступа от краев экрана) — и все повторяется вновь.
После завершения вывода программа ожидает нажатия клавиши и, восстановив исходный видеорежим, завершается.