5. Если нет, то прокрутить экран на одну строку и, используя ROW
переустановить курсор.
AH=07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана
вниз обозначает удаление нижних строк и вставка чистых строк сверху.
Регистр AH должен содержать 07, значения остальных регистpов аналогичны
функции 06 для прокрутки вверх.
AH=08: Чтение атрибута/символа в текущей позиции курсора. Для чтения
символа и байта атрибута из дисплейного буфера, как в текстовом, так и в
графическом режиме используются следующие команды:
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 не устанавливает
атрибут:
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 - вывести символ, затем атрибут и переместить курсор.
ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ И ПРОКРУТКА
________________________________________________________________
Программа, приведенная на рис. 9.1, принимает ввод имен с клавиатуры
и выводит их на экран. Запрос выдается в инвертированном отображении,
имена принимаются в нормальном отображении, а вывод имен осуществляется с
40 столбца в той же строке с миганием и инвертированием:
Name? Francis Bacon Francis Bacon [мигание]
| |
Столбец 0 Столбец 40
Для управления положением курсора в программе определены переменные
ROW (вертикальное перемещение вниз) и COL (горизонтальное перемещение
вправо). Команда INT 10H не перемещает курсор автоматически. Программа
выводит имена сверху вниз, пока не достигнет 20-й строки. После этого
выполняется прокрутка экрана вверх на одну строку для каждого нового
запроса.
__________________________________________________________________________
page 60,132
TITLE NMSCROLL (EXE) Инвертирование, мигание, прокрутка
; -------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKG 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 AX,0600H
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 ;Следующий символ в имени
INC COL ;Следующий столбец
CALL Q20CURS
DEC COUNT ;Уменьшение счетчика
JNZ B20 ;Повторить n раз
RET
B10PRMP ENDP
; вод имени с клавиатуры:
; ----------------------
D10INPT PROC NEAR
MOV AN,0AH
LEA DX,NAMEPAR
INT 21H
RET
D10INPT ENDP
; Вывод имени с миганием и инверсией:
; ----------------------------------
E10NAME PROC NEAR
LEA SI,NAMEFLD ;Адрес имени
MOV COL,40 ;Установить столбец
E20:
CALL Q20CURS ;Установить курсор
MOV BL,0FOH ;Мигание и инверсия
CALL F10DISP ;Подпрограмма вывода
INS SI ;Следующий символ в имени
INS COL ;Следующий столбец на экране
DES ACTNLEN ;Уменьшить счетчик длины
JNZ E20 ;Циклить n раз
CMP ROW,20 ;Последняя строка экрана?
JAE E30 ; нет
INC ROW
RET
E30: MOV AX,0601H ; да --
CALL Q10CLR ; очистить экран
RET
E10NAME ENDP
; Вывод символа на экран:
; ----------------------
F10DISP PROC NEAR ;BL (атрибут) уже установлен
MOV AN,09 ;Функция вывода на экран
MOV AL,[SI] ;Получить символ из имени
MOV BH,00 ;Номер страницы
MOV CX,01 ;Один символ
INT 10H ;Вызов BIOS
RET
F10DISP ENDP
; Очистка экрана:
; --------------
Q10CLR PROC NEAR ;AX установлен при вызове
MOV BH,07 ;Нормальный ч/б
MOV CX 0000
MOV DX,184FH
INT 10H ;Вызов BIOS
RET
Q10CLR ENDP
; Установить курсор (строка/столбец):
; ----------------------------------
Q20CURS PROC NEAR
MOV AN,02
MOV BH,00
MOV DH,ROW
MOV DL,COL
INT 10H
RET
Q20CURS ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.9.1. Мигание, инвертирование и прокрутка.
Для ввода имен в процедуре 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ледующие символы
можно нарисовать прямоугольник: