Ассемблер и программирование для IBM PC

     

Экранные операции II: Расширенные возможности


------------------------------------------------------------

Экранные операции II: Расширенные возможности

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

ВВЕДЕНИЕ ------------------------------------------------------------

В главе 8 были показаны основные возможности системы для управления выводом на экран и ввода с клавиатуры. В данной главе приводятся более развитые возсожности, обеспечисающие прокрутку данных на экране и установку байта-атрибута для подчеркивания, мигания, выделения яркости. Материал первого раздела этой главы (по прерыванию BIOS 10) подходит, как для монохромных, так и для цветных дисплеев. Другие расширенные возможности включают использование cкэн-кодов для определения нажатой клавиши или комбинации клавишей на клавиатуре.

Монохромный дисплей

Для работы монохромного дисплея имеется память объемом 4К, начинающаяся по адресу шест. B0000 (дисплейный буфер). Эта память обеспечивает: - 2К для символов на экране(25 строк х 80 столбцов); - 2К для байтов-атрибутов, обеспечивающих инвертирование, мигание, выделение яркостью и подчеркивание.

Цветной/графический дисплей

Для работы стандартного цветного графического дисплея имеется 16 Кбайт памяти (дисплейный буфер), начинающийся по адресу шест.B8000. Такой дисплей может являться текстовым (для нормального ASCII-кода) или графическим и работать как в цветном, так и в черно-белом (BW) режиме. Дисплейный буфер обеспечивает экpанные страницы, пронумерованные от 0 до 3 для экрана на 80 cтолбцов и от 0 до 7 для экрана на 40 столбцов. Номер страницы по умолчанию - 0. В следующей главе будет подробно рассмотрено управление цветом и графикой.

БАЙТ АТРИБУТОВ ------------------------------------------------------------

Байт атрибутов, как для монохромного, так и для графичес кого дисплея в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 бит:


Ассемблер для IBM PC. Глава 9 201


Фон Текст Атрибут: BL R G B I R G B Номер битов: 7 6 5 4 3 2 1 0
Буквы RGB представляют битовые позиции, управляющие красным (red), зеленым (green) и синим (blue) лучем в цветном моноторе. Бит 7 (BL) устанавливает мигание, а бит 3 (I) - уровень яркости. На монохромных мониторах текст высвечивается зеленым или оранжевым на темном фоне, хотя в данной главе такое изображение называется черно-белым (BW). Для модификации атрибутов можно комбинировать биты следующим oбразом:
Эффект выделения Фон Текст RGB RGB Неотображаемый (черный по черному) 000 000 Подчеркивание (не для цвета) 000 001 Нормальный (белый по черному) 000 111 Инвертированный (черный по белому) 111 000
Цветные мониторы не обеспечивают подчеркивания; вместо этого установка бит подчеркивания выбирает синий цвет для текста и получается отображение синим по черному. Ниже приведены некоторые атрибуты, основанные на комбинации битов фона, текста, мигания и выделения яркостью:
Двоичный Шест. Эффект выделения код код 0000 0000 00 Неотображаемый (для паролей) 0000 0111 07 Белый по черному (нормальный) 1000 0111 87 Белый по черному (мигание) 0000 1111 0F Белый по черному (яркий) 0111 0000 70 Черный по белому (инвертированый) 1111 0000 F0 Черный по белому (инверт. мигающий)
Эти атрибуты подходят для текстового режима, как для моно хромных, так и для цветных дисплеев. В следующей главе будет показано, как выбирать конкретные цвета. Для генерации атри бута можно использовать команду INT 10H. При этом регистр BL должен содержать значение байта-атрибута, а регистр AH один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка вниз), 08 (ввод атрибута или символа), 09 (вывод атрибута или символа). Если программа установила некотоpый атрибут, то он остается таким, пока программа его не изменит. Если установить значение байта атрибута равным шест.00, то символ вообще не будет отображен.
ПРЕРЫВАНИЕ BIOS INT 10H ------------------------------------------------------------
Ассемблер для IBM PC. Глава 9 202


Прерывание INT 10H обеспечивает управление всем экраном. В регистре AH устанавливается код, определяющий функцию прерывания. Команда cохраняет содержимое регитров BX, CX, DX, SI и BP. Ниже описывается все возможные функции.
AH=00: Установка режима. Данная функция позволяет пере ключать цветной монитор в текстовый или графический режим. Установка pежима для выполняемой в текущий момент программы осуществляется c помощью INT 10H. При установке происходит очистка экрана. Содержимое регистра AL может быть следующим:
00 40 х 25 черно-белый текстовый режим 01 40 х 25 стандартный i6-цветовой текстовый режим 02 80 х 25 черно-белый текстовый режим 03 80 х 25 стандартный 16-цветовой текстовый режим 04 320 х 200 стандартный 4-цветовой графический режим 05 320 х 200 черно-белый графический режим 06 640 х 200 черно-белый графический режим 07 80 х 25 черно-белый стандартный монохромный 08 - 0A форматы для модели PCjr 0D 320 х 200 16-цветовой графический режим (EGA) 0E 640 х 200 16-цветовой графический режим (EGA) 0F 640 х 350 черно-белый графический режим (EGA) 10 640 х 350 64-цветовой графический режим (EGA)
EGA (Enhanced Graphics Adapter) - обозначает усовершенст вованный графический адаптер. Следующий пример показывает установку стандартного 16-цветового текстового режима
MOV AH,00 ;Функция установки режима MOV AL,03 ;Стандартный цветной текст 80 х 25 INT 10H ;Вызвать BIOS
Для определения типа адаптера, установленного в системе, служит прерывание BIOS INT 11H. Данная команда возвращает в регистре AX значение, в котором биты 5 и 4 указывают на видео режим:
01 40 х 25 черно-белый режим в цветном адаптере 10 80 х 25 черно-белый режим в цветном адаптере 11 80 х 25 черно-белый режим в черно-белом адаптере
Программа, работающая с неизвестным типом монитора, может провеpить тип по регистру AX после INT 11H и затем устано вить необходимый режим.
AH=01: Установка размера курсора. Курсор не является символом из набора ASCII-кодов. Компьютер имеет собственное аппаратное обеспечение для управления видом курсора. Для этого имеется специальная обработка по INT прерыванию. Обычно символ курсоpа похож на символ подчеркивания. Используя INT 10H, можно управлять вертикальным размером курсора: биты 4-0 в регистре CH для верхней линии


Ассемблер для IBM PC. Глава 9 203
сканирования, а биты 4-0 в регистре CL - для нижней. Можно установить любой pазмер курсора по вертикали: от 0 до 13 для монохромных и EGA монитоpов и от 0 до 7 для большинства цветных мониторов. Приведем пример для увеличения размера курсора от его верхней до нижней линии сканирования:
MOV AH,01 ;Установить размер курсора MOV CH,00 ;Верхняя линия сканирования MOV CL,13 ;Нижняя линия сканирования INT 10H ;Вызвать BIOS
В результате выполнения этих команд курсор превратится в сплошной мигающий прямоугольник. Можно установить любой размер курсора между верхней и нижней границами, например, 04/08, 03/10 и т.д. Курсор сохраняет свой вид, пока программа не изменит его. Использование размеров 12/13 (для моно) и 6/7 (для цвета) переводит курсор в его нормальный вид.
AH=02: Установка позиции курсора. Эта функция устанавлива ет курcор в любую позицию на экране в соответствии с коорди натами cтроки и столбца. Номер страницы обычно равен 0, но может иметь значение от 0 до 3 при 80 столбцах на экране. Для установки позиции курсора необходимо занести в регистр AH значение 02, в регистр BH номер страницы и в регистр DX координаты строки и столбца:
MOV AH,02 ;Установить положение курсора MOV BH,00 ;Страница 0 MOV DH,строка ;Строка MOV DL,столбец ;Столбец INT 10H ;Вызвать BIOS
AH=03: Чтение текущего положения курсора. Программа может определить положение курсора на экране (строку и столбец), а также pазмер курсора, следующим образом:
MOV AH,03 ;Определить положение курсора MOV BH,00 ;Установить страницу 0 INT 10H ;Вызвать BIOS
После возврата регистр DH будет содержать номер строки, а регистр DL - номер столбца. В регистре CH будет верхняя линия cканирования, а в регистре CL - нижняя.
AH=04: Чтение положения светового пера. Данная функция используeтся в графическом режиме для определения положения светового пеpа.
AH=05: Выбор активной страницы. Новая страница устанавли вается для цветных текстовых режимов от 0 до 3. Для режима 40 х 25 возможно устанавливать до 8 страниц (от 0 до 7), а для режима 80 х 25 - до 4 страниц (от 0 до 3).


Ассемблер для IBM PC. Глава 9 204
MOV AH,05 ;Установить активную страницу MOV AL,страница ;Номер страницы INT 10H ;Вызвать BIOS
AH=06: Прокрутка экрана вверх. Когда программа пытается выдать текст на строку ниже последней на экране, то происхо дит переход на верхнюю строку. Даже если с помощью прерыва ния будет специфиpован нулевой столбец, все равно предпола гается новая строка, и нижние строки на экране будут испорчены. Для решения этой проблемы используется прокрутка экрана. Ранее код 06 использовался для очистки экрана. В тексто вом режиме установка в регистре AL значения 00 приводит к полной прокрутке вверх всего экрана, очищая его пробелами. Установка ненулевого значения в регистре AL определяет количество строк прокрутки экрана вверх. Верхние строки уходят с экрана, а чистые строки вводятся снизу. Следующие команды выполняют прокрутку всего экрана на одну строку:
MOV AX,0601H ;Прокрутить на одну строку вверх MOV BH,07 ;Атрибут: нормальный, черно-белый MOV CX,0000 ;Координаты от 00,00 MOV DX,184FH ; до 24,79 (полный экран) INT 10H ;Вызвать BIOS
Для прокрутки любого количества строк необходимо устано вить соответствующее значение в регистре AL. Регистр BH содержит атрибут для нормального или инвертированного отобра жения, мигания, установки цвета и т.д. Значения в регистрах CX и DX позволяют прокручивать любую часть экрана. Ниже объясняется стандартный подход к прокрутке:
1. Определить в элементе ROW (строка) значение 0 для установки строки положения курсора. 2. Выдать текст и продвинуть курсор на следующую строку. 3. Проверить, находится ли курсор на последней строке (CMP ROW,22). 4. Если да, то увеличить элемент ROW (INC ROW) и выйти. 5. Если нет, то прокрутить экран на одну строку и, исполь зуя ROW переустановить курсор.
AH=07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана вниз обозначает удаление нижних строк и вставка чистых строк сверху. Регистр AH должен содержать 07, значения остальных регистpов аналогичны функции 06 для прокрутки вверх.


AH=08: Чтение атрибута/символа в текущей позиции курсора. Для чтения символа и байта атрибута из дисплейного буфера, как в текстовом, так и в графическом режиме используются следующие команды:
Ассемблер для IBM PC. Глава 9 205
MOV AH,08 ;Запрос на чтение атр./симв. MOV BH,00 ;Страница 0 (для текстового реж.) INT 10H ;Вызвать BIOS
Данная функция возвращает в регистре AL значение символа, а в AH - его атрибут. В графическом режиме функция возвращает шест. 00 для не ASCII-кодов. Так как эта функция читает только один cимвол, то для символьной строки необходима организация цикла.
AH=09: Вывод атрибута/символа в текущую позицию курсора. Для вывода на экран символов в текстовом или графическом режиме с установкой мигания, инвертирования и т.д. можно воспользоваться следующими командами:
MOV AH,09 ;Функция вывода MOV AL,символ ;Выводимый символ MOV BH,страница ;Номер страницы (текст.реж.) MOV BL,атрибут ;Атрибут или цвет MOV CX,повторение ;Число повторений символа INT 10H ;Вызвать BIOS
В регистр AL должен быть помещен выводимый на экран символ. Значение в регистре CX определяет число повторений символа на экране. Вывод на экран последовательности различных симво лов требует организации цикла. Данная функция не перемещает курсор. В следующем примере на экран выводится пять мигающих "сердечек" в инвертированном виде:
MOV AH,09 ;Функция вывода MOV AL,03H ;Черви (карточная масть) MOV BH,00 ;Страница 0 (текст. режим) MOV BL,0F0H ;Мигание, инверсия MOV CX,05 ;Пять раз INT 10H ;Вызвать BIOS
В текстовом (но не в графическом) режиме символы автомати чески выводятся на экран и переходят с одной строки на другую. Для вывода на экран текста запроса или сообщения необходимо составить программу, которая устанавливает в регистре CX значение 01 и в цикле загружает в регистр AL из памяти выводимые символы текста. Так как регистр CX в данном случае занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого символа необходимо дополнительно продвигать курсор в следующий столбец (функция 02). В графическом режиме регистр BL используется для определе ния цвета графики. Если бит 7 равен 0, то заданный цвет заме няет текущий цвет точки, если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.


AH=0A: Вывод символа в текущую позицию курсора. Единствен ная разница между функциями 0A и 09 состоит в том, что функция 0A не устанавливает атрибут:
Ассемблер для IBM PC. Глава 9 206
MOV AH,0AH ;Функция вывода MOV AL,символ ;Выводимый символ MOV BH,страница ;Номер страницы (для текста) MOV CX,повторение ;Число повторений символа INT 10H ;Вызвать BIOS
Для большинства применений команда прерывания DOS INT 21H более удобна.
AH=0E: Вывод в режиме телетайпа. Данная функция позволяет использовать монитор, как простой терминал. Для выполнения этой функции необходимо установить в регистре AH шест. значение 0E, в pегистр AL поместить выводимый символ, цвет текста (в графическом режиме) занести в регистр BL и номер страницы для текстового режима - в регистр BH. Звуковой сигнал (код 07H), возврат на одну позицию (08H), конец строки (0AH) и возврат каретки (0DH) действуют, как команды для форматизации экрана. Данная функция автоматически продви гает курсор, переводит символы на следующую cтроку, выполня ет прокрутку экрана и сохраняет текущие атрибуты экрана.
AH=0F: Получение текущего видео режима. Данная функция возвращает в регистре AL текущий видео режим (см.функцию AH=00), в pегистре AH - число символов в строке (20, 40 или 80), в регистре BH - номер страницы.
AH=13: Вывод символьной строки (только для AT). Данная функция позволяет на компьютерах типа AT выводить на экран символьные строки с установкой атрибутов и перемещением курсора:
MOV AH,13H ;Функция вывода на экран MOV AL,сервис ;0, 1, 2 или 3 MOV BH,страница ; LEA BP,адрес ;Адрес строки в ES:BP MOV CX,длина ;Длина строки MOV DX,экран ;Координаты на экране INT 10H ;Вызвать BIOS
Возможен следующий дополнительный сервис: 0 - использовать атрибут и не перемещать курсор; 1 - использовать атрибут и переместить курсор; 2 - вывести символ, затем атрибут и не перемещать курсор; 3 - вывести символ, затем атрибут и переместить курсор.
ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ И ПРОКРУТКА ------------------------------------------------------------


Ассемблер для IBM PC. Глава 9 207
Программа, приведенная на рис. 9.1, принимает ввод имен с клавиатуры и выводит их на экран. Запрос выдается в инвертированном отображении, имена принимаются в нормальном отображении, а вывод имен осуществляется с 40 столбца в той же строке с миганием и инвертированием:
Name? Francis Bacon Francis Bacon [мигание] | | Столбец 0 Столбец 40
Для управления положением курсора в программе определены переменные ROW (вертикальное перемещение вниз) и COL (гори зонтальное перемещение вправо). Команда INT 10H не перемеща ет курсор автоматически. Программа выводит имена сверху вниз, пока не достигнет 20-й строки. После этого выполняется прокрутка экрана вверх на одну строку для каждого нового запроса. Для ввода имен в процедуре D10INPT используется команда DOS INT 21H. Для замены на BIOS INT 10H необходимо:
1. Инициализировать счетчик для адреса области ввода и счетчик для длины имени. 2. Выполнить INT 10H (функция 08) с 08 в регистре AH и 00 в BH. Функция возвращает каждый символ в регистре AL. 3. Если регистр AL не содержит символа RETURN и счетчик длины достиг максимального значения, выдать звуковой сигнал и выйти из процедуры. 4. Переслать содержимое AL в область ввода имени. 5. Если регистр AL содержит символ RETURN, выйти из процедуры. 6. Увеличить счетчик длины и адрес области ввода имени. 7. Переместить курсор на один столбец. 8. Перейти на пункт 2.
При выходе из процедуры область ввода содержит имя и символ RETURN, а счетчик - число введенных символов.
РАСШИРЕННЫЙ ASCII КОД ------------------------------------------------------------
ASCII-коды от 128 до 255 (шест. 80-FF) представляют собой ряд специальных символов полезных при формировании запросов, меню, специальных значков с экранными атрибутами. Например, используя cледующие символы можно нарисовать прямоугольник:
Шест. Символ
DA Верхний левый угол BF Верхний правый угол C0 Нижний левый угол D9 Нижний правый угол C4 Горизонтальная линия B3 Вертикальная линия
Ассемблер для IBM PC. Глава 9 208


Следующие команды с помощью INT 10H выводят горизонталь ную линию на 25 позиций в длину:
MOV AH,09 ;Функция вывода на экран MOV AL,0C4H ;Горизонтальная линия MOV BH,00 ;Страница 0 MOV BL,0FH ;Выделение яркостью MOV CX,25 ;25 повторений MOV 10H ;Вызвать BIOS
Напомним, что курсор не перемещается. Вывод вертикальной линии включает цикл, в котором курсор перемещается вниз на одну строку и выводится символ шест. B3. Для штриховки может быть полезен символ с точками внутри:
Шест. Символ
B0 Одна четверть точек (светлая штриховка) B1 Половина точек (средняя штриховка) B2 Три четверти точек (темная штриховка)
------------------------------------------------------------ ------------------------------------------------------------ Рис. 9.1. Мигание, инвертирование и прокрутка
Можно извлечь много полезных идей, изучая программное обеспечение с профессионально организованным выводом, или самому изобрести оригинальные идеи для отображения информации.
ДРУГИЕ ОПЕРАЦИИ ВВОДА/ВЫВОДА В DOS ------------------------------------------------------------
Ниже перечислены другие функции DOS, которые могут оказаться полезными в работе. Код функции устанавливается в регистре AH и, затем, выдается команда INT 21H.
AH=01: Ввод с клавиатуры с эхо отображением. Данная функ ция возвращает значение в регистре AL. Если содержимое AL не равно нулю, то оно представляет собой стандартный ASCII- cимвол, например, букву или цифру. Нулевое значение в регист ре AL свидетельствует о том, что на клавиатуре была нажата специальная функциональная клавиша, например, Номе, F1 или PgUp. Для определения скэн-кода клавиш, необходимо повторить вызов функции (см. "Дополнительные функциональные клавиши" в последующих разделах). Данная функция реагирует на запрос Ctrl/Break.
AH=02: Вывод символа. Для вывода символа на экран в текущую позицию курсора необходимо поместить код данного символа в pегистр DL. Коды табуляции, возврата каретки и конца строки действуют обычным образом.
Ассемблер для IBM PC. Глава 9 209


AH=07: Прямой ввод с клавиатуры без эхо отображения. Дан ная функция работает аналогично функции 01 с двумя отличия ми: введенный символ не отображается на экране, т.е. нет эхо, и oтсутствует реакция на запрос Ctrl/Break.
AH=08: Ввод с клавиатуры без эхо отображения. Данная функ ция действует аналогично функции 01 с одним отличием: введенный символ не отображается на экран, т.е. нет эхо.
AH=0B: Проверка состояния клавиатуры. Данная функция возвращает шест.FF в регистре AL, если ввод с клавиатуры возможен, в противном случае - 00. Это средство связано с функциями 01, 07 и 08, которые не ожидают ввода с клавиатуры.
ВВОД С КЛАВИАТУРЫ ПО КОМАНДЕ BIOS INT 16H ------------------------------------------------------------
Команда BIOS INT 16H выполняет специальную операцию, которая в соответствии с кодом в регистре AH обеспечивает следующие три функции ввода с клавиатуры.
AH=00: Чтение символа. Данная функция помещает в регистр AL oчередной ASCII символ, введенный с клавиатуры, и устанавливает скэн код в регистре AH. (Скэн-коды объясняются в следующем разделе). Если на клавиатуре нажата одна из специальных клавишей, например, Номе или F1, то в регистр AL заносится 00. Автоматическое эхо символа на экран по этой функции не происходит.
AH=01: Определение наличия введенного символа. Данная функция сбрасывает флаг нуля (ZF=0), если имеется символ для чтения с клавиатуры; очередной символ и скэн-код будут помещены в регистры AL и AH соответственно и данный элемент останется в буфере.
AH=02: Определение текущего состояния клавиатуры. Данная функция возвращает в регистре AL состояние клавиатуры из адреса памяти шест. 417:
Бит 7 Состояние вставки активно (Ins) 6 Состояние фиксации верхнего регистра (Caps Lock) переключено 5 Состояние фиксации цифровой клавиатуры (Num Lock) переключено 4 Состояние фиксации прокрутки (Scroll Lock) переключено 3 Нажата комбинация клавишей Alt/Shift 2 Нажата комбинация клавишей Ctrl/Shift 1 Нажата левая клавиша Shift 0 Нажата правая клавиша Shift


Ассемблер для IBM PC. Глава 9 210
ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ ------------------------------------------------------------
Клавиатура располагает тремя основными типами клавишей:
1. Символьные (алфавитно-цифровые) клавиши: буквы от a до z, цифры от 0 до 9, символы %, $, # и т.д.
2. Функциональные клавиши: Номе, End, Возврат на позицию, стрелки, Return, Del, Ins, PgUp, PgDn и программно- функциональные клавиши.
3. Управляющие клавиши: Alt, Ctrl и Shift, которые работают совместно с другими клавишами.
Функциональная клавиша не вырабатывает какой-либо символ, но чаще формирует запрос на некоторые действия. Аппаратная реализация не требует от функциональных клавишей выполнения каких-либо специфических действий. Задачей программиста является определить, например, что нажатие клавиши Номе должно присести к установке курсора в верхний левый угол экрана, или нажатие клавиши End должно установить курсор в конец текста на экране. Можно легко запрограммировать функциональные клавиши для выполнения самых различных действий. Каждая клавиша имеет собственный скэн-код от 1 (Esc) до 83 (Del) или от шест.01 до шест.53. Посредством этих скэн- кодов программа может определить нажатие любой клавиши. Нпример, запрос на ввод одного символа с клавиатуры включает загрузку 00 в регистр AH и обращение к BIOS через INT 16H:
MOV AH,00 ;Функция ввода с клавиатуры INT 16H ;Вызвать BIOS
Данная операция имеет два типа ответов в зависимости от того, нажата символьная клавиша или функциональная. Для символа (например, буква A) клавиатура посылает в компьютер два элемента информации:
1. ASCII-код символа A (шест.41) в регистре AL; 2. Скэн-код для клавиши A (шест.1E) в регистре AH.
Если нажата функциональная клавиша (например, Ins) клавиатура также передает два элемента:
1. Нуль в регистре AL; 2. Сскэн-код для клавиши Ins (шест.52) в регистре AH.
Ассемблер для IBM PC. Глава 9 211
Таким образом, после выполнения команы INT 16H необходимо прежде проверить содержимое регистра AL. Если AL содержит нуль, то была нажата функциональная клавиша, если не нуль, то получен код символьной клавиши. Ниже приведен пример такой проверки:


MOV AH,00 ;Функция ввода INT 16H ;Вызвать BIOS CMP AL,00 ;Функциональная клавиша? JZ exit ; да - выйти
Скэн-Коды
На рис. 9.2 приведены скэн- коды для некоторых функциональ ных клавишей. Клавиатура имеет по две клавиши для таких символов как *, + и -. Нажатие "звездочки", например, устанавливает код символа шест.2A в регистре AL и один из двух скэн-кодов в регистре AH в зависимости от того, какая из клавишей была нажата: шест.09 для звездочки над цифрой 8 или шест.29 для звездочки на клавише PrtSc. Ниже приведена логика проверки скэн-кода для звездочки:
CMP AL,2AH ;Звездочка? JNE EXIT1 ; нет - выйти CMP AH,09H ;Какой скэн-код? JE EXIT2
------------------------------------------------------------ Функциональные клавиши Скэн-коды Alt/A - Alt/Z 1E - 2C F1 - F10 3B - 44 Home 47 Стрелка вверх 48 PgUp 49 Стрелка влево 4B Стрелка вправо 4D End 4F Стрелка вниз 50 PgDn 51 Ins 52 Del 53 ------------------------------------------------------------ Рис. 9.2. Скэн-коды некоторых функциональных клавишей
Приведем пример программы для установки курсора в строку 0 и cтолбец 0 при нажатии клавиши Номе (скэн-код 47):
MOV AH,00 ;Выполнить ввод с клавиатуры INT 16H ; CMP AL,00 ;Функциональная клавиша? JNE EXIT1 ; нет -- выйти CMP AH,47H ;Скэн-код для клавиши Home?
Ассемблер для IBM PC. Глава 9 212
JNE EXIT2 ; нет -- выйти MOV AH,02 ; MOV BH,00 ;Установить курсор MOV DX,00 ; по координатам 0,0 INT 10H ;Вызвать BIOS
Функциональные клавиши F1 - F10 генерируют скэн-коды от шест.3B до шест.44. Следующий пример выполняет проверку на функциональную клавишу F10:
CMP AH,44H ;Клавиша F10? JE EXIT1 ; Да
По адресу EXIT1 программа может выполнить любое необходимое действие. Полный список скэн-кодов приводится в руководстве по языку BASIC. Техническое описание IBM PC содержит подробное описание всех скэн-кодов, а также описание использования клавишей Alt, Ctrl и Shift.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ ------------------------------------------------------------
ъ Монохромный дисплей использует 4К байт памяти, 2К байт на символы и 2К байт на атрибуты для каждого символа. ъ Цветной дисплей использует 16К байт памяти и может рабо тать в цветном или черно-белом (BW) режимах. Возможно использование, как текстового режима для отображения ASCII-символов, так и графического режима для любых изображений. ъ Байт-атрибут используется и для монохромных дисплеев и для цветных в текстовом режиме. Атрибут обеспечивает мигание, инвертирование и выделение яркостью. Для цветных дисплеев в текстовом режиме биты RGB позволяют выбирать цвета, но не имеют режима подчеркивания. ъ Команда BIOS INT 10H обеспечивает полную экранную обработку: установку режимов, установку положения курсора, прокрутку экрана, чтение с клавиатуры и вывод на экран. ъ Если ваша программа выводит вниз экрана, то не забывай те выполнять прокрутку прежде, чем курсор выйдет из последней строки. ъ При использовании атрибутов для мигания и инвертирова ния, не забывайте сбрасывать их в отключенное состояние. ъ Для функций по команде INT 10H, выплняющих чтение и вывод на экран, помните о перемещении курсора. ъ Команда BIOS INT 16H обеспечивает прием и распознавание функциональных клавишей. ъ Функциональные клавиши предполагают запрограммированный вызов некоторых действий.


Ассемблер для IBM PC. Глава 9 213
ъ Каждая клавиша на клавиатуре имеет конкретный скэн-код, пронумерованный от 1 (Esc) до 83 (Del), или от шест.01 до шест.53. ъ Нажатие символьной клавиши на клавиатуре передает код символа в регистр AL и скэн-код клавиши в регистр AH. ъ Нажатие функциональной клавиши на клавиатуре передает нуль в регистр AL и скэн-код клавиши в регистр AH.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ ------------------------------------------------------------
9.1. Определите атрибуты экрана для а) мигания с подчеркива нием, б) нормальной яркости, в) инвертирования с выделением яркостью.
9.2. Составте процедуры для а) установки режима экрана BW (черно-белый) на 80 столбцов, б) установки вида курсо ра, начинающегося на 5 линии сканирования и заканчиваю щегося на 12 линии, в) прокрутки экрана на 10 строк, г) вывода десяти мигающих символов штриховки с половиной точек (шест. B1).
9.3. Напишите скэн-коды для следующих функциональных клавишей: а) стрелка вверх, б) клавиша F3, в) Home, г) PgUp.
9.4. Используя отладчик DEBUG, проверте воздействие на содер жимое регистра AX при нажатии клавишей на клавиатуре. Для ввода ассемблерных команд используйте команду A 100 (Return). Ведите следующие команды:
MOV AH,00 INT 16H JMP 100
Используя команду U 100,104, дисассемблируйте программу и с помощью G 104 выполните команды MOV и INT. На команде INT выполнение программы остановиться и система перейдет в ожидание вашего ввода. Для проверки регистра AH нажмите любую клавишу. Продолжая вводить команду G 104, и, нажимая различные клавиши, проверьте работу программы. Для выхода введите команду Q.
9.5. Составте команды для определения нажатия клавиши: если нажата клавиша PgDn, то необходимо установить курсор по координатам - строка 24 и столбец 0.
Ассемблер для IBM PC. Глава 10 228


    Содержание раздела