Сист. прогр. Ч1 (1085770), страница 14
Текст из файла (страница 14)
Прерывание INT 10H обеспечивает управление всем экраном. В регистре АН устанавливается код, определяющий функцию прерывания. Команда сохраняет содержимое регистров ВХ, СХ, DX, SI и ВР. Ниже описывается все возможные функции.
АН = 00: Установка режима. Данная функция позволяет переключать цветной монитор в текстовый или графический режим. Установка режима для выполняемой в текущий момент программы осуществляется с помощью INT 10H. При установке происходит очистка экрана. Содержимое регистра AL может быть следующим:
00 40 х 25 черно-белый текстовой режим
01 40 х 25 стандартный 16-цветовой текстовой режим
02 80 х 25 черно-белый текстовой режим
03 80 х 25 стандартный 16-цветовой текстовой режим
04 320 х 200 стандартный 4-цветовой графический
05 320 х 200 черно-белый графический режим
06 640 х 200 черно-белый графический режим
07 80 х 25 черно-белый стандартный монохромный
08 - 0А форматы для модели PCjr
0D 320 х 200 16-цветовой графический режим (EGA)
0Е 640 х 200 16-цветовой графический режим (EGA)
0F 640 х 350 черно-белый графический режим (EGA)
10 640 х 350 64-цветовой графический режим (EGA)
EGA обозначает усовершенствованный графический адаптер. Следующий пример показывает установку стандартного 16-цветового текстового режима:
MOV АН,00 ;Функция установки режима
MOV AL,03 ;Стандартный цветной текст 80x25
INT 10H ;Вызвать BIOS
Для определения типа адаптера, установленного в системе, служит прерывание BIOS INT 11H. Данная команда возвращает в регистре АХ значение, в котором биты 5 и 4 указывают на видеорежим:
01 40x25 черно-белый режим в цветном адаптере
10 80x25 черно-белый режим в цветном адаптере
11 80x25 черно-белый режим в черно-белом адаптере
Программа, работающая с неизвестным типом монитора, может проверить тип по регистру АХ после INT 11H и затем установить необходимый режим.
АН = 01: Установка размера курсора. Курсор не является символом из набора ASCII-кодов. Компьютер имеет собственное аппаратное обеспечение для управления видом курсора. Для этого имеется специальная обработка по INT-прерыванию. Обычно символ курсора похож на символ подчеркивания. Используя INT 10Н, можно управлять вертикальным размером курсора: биты 4-0 в регистре СН для верхней линии сканирования, а биты 4-0 в регистре CL - для нижней. Можно установить любой размер курсора по вертикали: от 0 до 13 для монохромных и EGA-мониторов и от 0 до 7 для большинства цветных мониторов. Приведем пример для увеличения размера курсора от его верхней линии сканирования до нижней:
MOV АН,01 ;Остановить размер курсора
MOV CH,00 ;Верхняя линия сканирования
MOV CL,13 ;Нижняя линия сканирования
INT 10Н ; Вызвать BIOS
В результате выполнения этих команд курсор превратится в сплошной мигающий прямоугольник. Можно установить любой размер курсора между верхней и нижней границами, например 04/08, 03/10 и т.д. Курсор сохраняет свой вид, пока программа не изменит его. Использование размеров 12/13 (для моно) и 6/7 (для цвета) переводит курсор в его нормальный вид.
АН = 02: Установка позиции курсора. Эта функция устанавливает курсор в любую позицию на экране в соответствии с координатами строки и столбца. Номер страницы обычно равен 0, но может иметь значение от 0 до 3 при 80 столбцах на экране. Для установки позиции курсора необходимо занести в регистр АН значение 02, в регистр ВН - номер страницы и в регистр DX -координаты строки и столбца:
MOV АН,02 ;Установить положение курсора
MOV BH,00 ;Страница 0
MOV DH,строка ;Строка
MOV DL,столбец ;Столбец
INT 10H ;Вызвать BIOS
АН = 03: Чтение текущего положения курсора. Программа может определить положение курсора на экране (строку и столбец), а также размер курсора следующим образом:
MOV АН,03 ;Определить положение курсора
MOV BH,00 ;Страница 0
INT 10Н ;Вызвать BIOS
После возврата регистр DH будет содержать номер строки, а регистр DL - номер столбца. В регистре СН будет верхняя линия сканирования, а в регистре CL - нижняя.
АН = 04: Чтение положения светового пера. Данная функция используется в графическом режиме для определения положения светового пера.
АН = 05: Выбор активной страницы. В текстовом режиме с
форматом экрана 80 х 25 устанавливается до 4 страниц (от 0 до
3), а для формата 40 х 25 - до 8 страниц (от 0 до 7).
MOV АН,05 ;Установить активную страницу
MOV AL,страница ;Номер страницы
INT 10Н ; Вызвать BIOS
АН = 06: Прокрутка экрана вверх. Когда программа пытается выдать текст на строку ниже последней на экране, то происходит переход на верхнюю строку. Даже если с помощью прерывания будет специфицирован нулевой столбец, нижние строки на экране будут испорчены. Для решения этой проблемы используется прокрутка экрана.
Ранее код 06 использовался для очистки экрана. В текстовом режиме установка в регистре AL значения 00 приводит к полной прокрутке вверх всего экрана, очищая его пробелами. Установка ненулевого значения в регистре AL определяет количество строк прокрутки экрана вверх. Верхние строки уходят с экрана, а чистые строки вводятся снизу. Следующие команды выполняют прокрутку всего экрана на одну строку:
MOV AX,0601H ;Прокрутить на одну строку вверх
MOV BH,07 ;Атрибут: нормальный, черно-белый
MOV СХ,0000 ;Координаты от 00,00
MOV DX,184FH ;до 24,79 (весь экран)
INT 10Н ; Вы звать BIOS
Для прокрутки любого количества строк необходимо
установить соответствующее значение в регистре AL. Регистр ВН содержит атрибут для нормального или инвертированного отображения, мигания, установки цвета и т.д. Значения в регистрах СХ и DX позволяют прокручивать любую часть экрана. Ниже объясняется стандартный подход к прокрутке.
1. Определить в элементе ROW (строка) значение 0 для установки строки положения курсора.
2. Выдать текст и продвинуть курсор на следующую строку.
3. Проверить, находится ли курсор на последней строке (СМР ROW,22).
4. Если да, то увеличить элемент ROW (INC ROW) и выйти.
5. Если нет, то прокрутить экран на одну строку и, используя ROW, переустановить курсор.
АН = 07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана вниз обозначает удаление нижних строк и вставку чистых строк сверху. Регистр АН должен содержать 07, значения остальных регистров аналогичны функции 06 для прокрутки вверх.
АН = 08: Чтение атрибута/символа в текущей позиции курсора.
Для чтения символа и байта-атрибута из дисплейного буфера как в текстовом, так и в графическом режиме используются следующие команды:
MOV АН,08 ;3апрос на чтение атрибута/символа
MOV BH,00 ;Страница 0 (для текстового режима)
IHT 10Н ;Вызвать BIOS
Данная функция возвращает в регистре AL значение символа, а в АН его атрибут. В графическом режиме функция возвращает 00 для не ASCII-кодов. Так как эта функция читает только один символ, то для символьной строки необходима организация цикла.
АН = 09: Вывод атрибута/символа в текущую позицию курсора.
Для вывода на экран символов в текстовом или графическом режиме с установкой мигания, инвертирования и т.д. можно воспользоваться следующими командами:
MOV АН,09 ;Функция вывода
MOV AL,символ ;Выводимый символ
MOV BH,страница ;Номер страницы (текстовой режим)
MOV BL,атрибут ;Атрибут или цвет
MOV CX,повторение ;Число повторений
INT 10Н ; Вызвать BIOS
В регистр AL должен быть помещен выводимый на экран символ. Значение в регистре СХ определяет число повторений символа на экране. Вывод на экран последовательности различных символов требует организации цикла. Данная функция не перемещает курсор. В следующем примере на экран выводится пять мигающих "сердечек" в инвертированном виде:
MOV АН,09 ;функция вывода
MOV AL,03H ;Черви (карточная масть)
MOV ВН,00 ;Страница 0 (текстовой режим)
MOV BL,0F0 ;Мигание, инверсия
MOV CX,05 ;Пять раз
INT 10H ;Вызвать BIOS
В текстовом (но не в графическом) режиме символы автоматически выводятся на экран и переходят с одной строки на другую. Для вывода на экран текста запроса или сообщения необходимо составить программу, которая устанавливает в регистре СХ значение 01 и в цикле загружает в регистр AL из памяти выводимые символы текста. Так как регистр СХ в данном случае занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого символа необходимо дополнительно продвигать курсор в следующий столбец (функция 02).
В графическом режиме регистр BL используется для определения цвета графики. Если бит 7 равен 0, то заданный цвет заменяет текущий цвет, если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.
АН = 0А: Вывод символа в текущую позицию курсора.
Единственная разница между функциями 0А и 09 состоит в том, что функция 0А не устанавливает атрибут:
MOV AH.,0AH ;Функция вывода
MOV AL, символ ; Выводимый символ
MOV BH, страница ;Номер страницы (для текста)
MOV СХ, повторение ;Число повторений
INT 10Н ;Вызвать BIOS
Для большинства применений команда прерывания DOS INT
21Н более удобна.
АН = 0Е: Вывод в режиме телетайпа. Данная функция позволяет использовать монитор как простой терминал. Для выполнения этой функции необходимо установить в регистре АН шестнадцатеричное значение 0Е, в регистр AL поместить выводимый символ, цвет текста (в графическом режиме) занести в регистр BL и номер страницы для текстового режима - в регистр ВН, Звуковой сигнал (код 07Н), возврат на одну позицию (08Н), перевод строки (0АН) и возврат каретки (0DН) действуют, как команды для форматизации экрана. Данная функция автоматически продвигает курсор, переводит символы на следующую строку, выполняет прокрутку экрана и сохраняет текущие атрибуты экрана.
АН = 0F: Получение текущего видеорежима. Данная функция возвращает в регистре AL текущий видеорежим (см.функцию АН = 00), в регистре АН - число символов в строке (20, 40 или 80), в регистре ВН - номер страницы.
АН = 13: Вывод символьной строки (только для AT). Данная функция позволяет на компьютерах типа AT выводить на экран символьные строки с установкой атрибутов и перемещением курсора;
MOV АН,13Н ;4>-ция вывода на экран
MOV AL,сервис ;0, 1, 2 или 3
MOV ВН,страница ;
LEA BP,адрес ;Адрес строки в ES:BP
MOV CX,длина ;Длина строки
MOV DX,экран ;Координаты на экране
INT 10Н ;Вызвать BIOS
Значения в регистре AL указывают:
0 - использовать атрибут и не перемещать курсор;
1 - использовать атрибут и переместить курсор;
2 - вывести символ, затем атрибут и не перемещать
курсор;
3 - вывести символ, затем атрибут и переместить курсор.
ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ, ПРОКРУТКА
Программа, приведенная на рис.8.3, принимает ввод имен с клавиатуры и выводит их на экран. Запрос выдается в инвертированном отображении, имена принимаются в нормальном отображении, а вывод имен осуществляется с 40-го столбца в той же строке с миганием и инвертированием:
Name? Francis Francis [мигание]
Столбец 0 Столбец 40
page 60,132
TITLE NMSCROLL (EXE) Инверсия,мигание,прокрутка
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ; Список параметров:
MAXNLEN DB 20 ; макс. длина имени
ACTNLEN DB ? ; число введенных символов
NAMEFLD DB 20 DUP(' ') ; имя
COL DB 00
COUNT DB ?
PROMPT DB 'Name? '
ROW DB 00
DATASG ENDS
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG, ES:DATASG
PUSH DS
SUB AX, AX
PUSH DS
MOV AX, DATASG
MOV ES,AX
MOV АХ, 060Н
CALL Q10CLR ;Очистить экран
A20LOOP:
MOV COL, 00 ;Установить столбец 0
CALL Q20CURS
CALL B10PRMP ; Выдать текст запроса
CALL D10INPT ; Ввести с клавиатуры
CMP ACTNLEN, 00 ;Нет имени? (т.е. конец)
JNE A30
MOV AX, 0600H
CALL Q10CLR ;Если да, то очистить экран.
RET ;и завершить программу
A30:
CALL E10NAME ; Вывести имя на экран
JMP A20LOOP
BEGIN ENDP
;Вывод текста запроса:
B10PRMP PROC NEAR
LEA SI, PROMPT ;Адрес текста
MOV COUNT, 05
B20:
MOV BL, 70H ;Видеоинверсия
CALL F10DISP ; Подпрограмма вывода
INC SI ;Следукщий символ