Жанр: Учеба
Ассемблер и программирование для IBM PC
...ши: Номе, 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.
Таким образом, после выполнения команды 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 и столбец
0 при нажатии клавиши Номе (скэн-код 47):
MOV AH,00 ;Выполнить ввод с клавиатуры
INT 16H ;
CMP AL,00 ;Функциональная клавиша?
JNE EXIT1 ; нет — выйти
CMP AH,47H ;Скэн-код для клавиши Home?
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 обеспечивает прием и распознавание
функциональных клавишей.
- Функциональные клавиши предполагают запрограммированный вызов
некоторых действий.
- Каждая клавиша на клавиатуре имеет конкретный скэн-код,
пронумерованный от 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.
ГЛАВА 10 Экранные операции III: Цвет и графика
__________________________________________________________________________
Ц е л ь: Показать расширенные возможности компьютера, связанные с
использованием цвета и графики на экране.
ВВЕДЕНИЕ
________________________________________________________________
Данная глава знакомит с использованием цвета для текстового и
графического режимов. Существуют следующие три типа видео мониторов,
используемые для изображения цветной графики (в порядке возрастания
стоимости и качества):
1. Немодифицированный цветной телевизионный приемник (обычный
домашний телевизор), применяемый многими для своих компьютеров.
2. Комбинированный видеомонитор, принимающий цветовой сигнал без
радиочастотной модуляции, и используемый для передачи по радиоволнам.
Обеспечивает высокое качество изображения.
3. RGB-монитор, посылающий входные сигналы на три раздельные
электронные пушки - красную, зеленую и синюю для каждого из трех
основных цветов. Являясь наиболее дорогим, RGB-монитор обеспечивает
наилучшее качество изображения.
Стандартный адаптер для цветного графического монитора (CGA -
Color/Graphics Adapter) использует 16К байт памяти, начинающейся по адресу
шест.B8000, 8К байт - для символов и 8К байт для их атрибутов. При работе
в формате 80х25 адаптер может хранить четыре страницы (0-3) дисплейного
буфера по 4К байт каждая. При работе в формате 40х25 адаптер может хранить
восемь страниц (0-7) по 2К байт каждая. По умолчанию используется нулевая
страница (в начале дисплейной памяти). Программа может вывести на экран
любую страницу и в это время формировать другую страницу в памяти для
последующего вывода на экран.
Усовершенствованный графический адаптер (EGA - Enhanced Graphics
Adapter) обеспечивает более высокую разрешающую способность, по сравнению
со стандартным цветным адаптером (CGA) и в большинстве случаев является
совместимым с ним. Разрешающая способность обеспечивает 320х200, 640х200 и
640х350 точек на экране.
Цветные адаптеры имеют два основных режима работы: текстовой
(алфавитно-цифровой) и графический, и возможны также дополнительные режимы
между двумя основными. По умолчанию используется текстовой режим.
Установка режима описана в главе 9 в разделе "Прерывание BIOS INT 10H"
(AH=0). Для установки графического режима или возврата в текстовой режим
используется прерывание BIOS INT 10H, как это показано в двух следующих
примерах:
MOV AH,00 ;Режим MOV AH,00 ;Режим
MOV AL,03 ;Цвет+текст MOV AL,04 ;Графика среднего
INT 10H INT 10H ; разрешения
ТЕКСТОВЫЙ (АЛФАВИТНО-ЦИФРОВОЙ) РЕЖИМ
________________________________________________________________
Текстовой режим предназначен для обычных вычислений с выводом букв и
цифр на экран. Данный режим одинаков для черно-белых (BW) и для цветных
мониторов за исключением того, что цветные мониторы не поддерживают
атрибут подчеркивания. Текстовой режим обеспечивает работу с полным
набором ASCII кодов (256 символов), как для черно-белых (BW), так и для
цветных мониторов. Каждый символ на экране может отображаться в одном из
16 цветов на одном из восьми цветов фона. Бордюр экрана может иметь также
один из 16 цветов.
Цвета
-------
Тремя основными цветами являются красный, зеленый и синий. Комбинируя
основные цвета, друг с другом, можно получить восемь цветов, включая
черный и белый. Используя два уровня яркости для каждого цвета, получим
всего 16 цветов:
I R G B I R G B
Черный 0 0 0 0 Серый 1 0 0 0
Синий 0 0 0 1 Ярко-синий 1 0 0 1
Зеленый 0 0 1 0 Ярко-зеленый 1 0 1 0
Голубой 0 0 1 1 Ярко-голубой 1 0 1 1
Красный 0 1 0 0 Ярко-красный 1 1 0 0
Сиреневый 0 1 0 1 Ярко-сиреневый 1 1 0 1
Коричневый 0 1 1 0 Желтый 1 1 1 0
Белый 0 1 1 0 Ярко-белый 1 1 1 1
Таким образом любые символы могут быть отображены на экране в одном
из 16 цветов. Фон любого символа может иметь один из первых восьми цветов.
Если фон и текст имеют один и тот же цвет, то текст получается невидимым.
Используя байт атрибута, можно получить также мигающие символы.
Байт-атрибут
--------------
Текстовой режим допускает использование байта атрибута,
рассмотренного в гл.9. В приведенной ниже таблице, атрибут BL обозначает
мигание (BLinking), RGB - соответственно красный, зеленый и синий цвет, I
- выделение яркостью:
Фон Текст
Атрибут: BL R G B I R G B
Номера битов: 7 6 5 4 3 2 1 0
Мигание и выделение яркостью относится к тексту. Ниже приведены
некоторые типичные атрибуты:
Текст по фону Бит: 7 6 5 4 3 2 1 0
BL R G B I R G B Шест.
Черный по черному 0 0 0 0 0 0 0 0 00
Синий по черному 0 0 0 0 0 0 0 1 01
Красный по синему 0 0 0 1 0 1 0 0 14
Голубой по зеленому 0 0 1 0 0 0 1 1 23
Светло-сиреневый по белому 0 1 1 1 1 1 0 1 7D
Серый по зеленому, мигание 1 0 1 0 1 0 0 0 A8
Байт-атрибут используется аналагично показанному для черно-белого
(BW) монитора. Тип монитора можно определить из программы с помощью
команды INT 11H. Для BW монитора код 07 устанавливает нормальный атрибут.
Для цветных мониторов можно использовать любую из цветовых комбинаций.
Цвет на экране сохраняется до тех пор, пока другая команда не изменит его.
Для установки цвета можно использовать в команде INT 10H функции AH=06,
AH=07 и AH=09. Например, для вывода пяти мигающих звездочек светло-зеленым
цветом на сиреневом фоне возможна следующая программа:
MOV AH,09 ;Функция вывода на экран
MOV AL,'*' ;Выводимый символ
MOV BH,00 ;Страница 0
MOV BL,0DAH ;Атрибут цвета
MOV CX,05 ;Число повторений
INT 10H ;Вызвать BIOS
ГРАФИЧЕСКИЙ РЕЖИМ
________________________________________________________________
Для генерации цветных изображений в графическом режиме используются
минимальные точки растра - пиксели или пэлы (pixel). Цветной графический
адаптер (CGA) имеет три степени разрешения:
1. Низкое разрешение (не поддерживается в ROM) обеспечивает
вывод 100 строк по 160 точек (т.е. четыре бита на точку). Каждая
точка может иметь один из 16 стандартных цветов, как описано в
предыдущем разделе "Цвета". Реализация данного режима включает прямую
адресацию контролера Motorola 6845 CRT. Для этого используются два
порта: шест.3D4 и 3D5.
2. Среднее разрешение для стандартной цветной графики
обеспечивает 200 строк по 320 точек. Каждый байт в этом случае
представляет четыре точки (т.е. два бита на точку).
3. Высокое разрешение обеспечивает 200 строк по 640 точек.
Поскольку в данном случае требуется 16К байт памяти, высокое
разрешение достигается только в черно-белом (BW) режиме. Каждый байт
здесь представляет 8 точек (т.е. один бит на точку). Нулевое значение
бита дает черный цвет точки, единичное - белый.
Заметим, что в графическом режиме ROM содержит точечные образы только
для первых 128 ASCII-кодов. Команда INT 1FH обеспечивает доступ к 1К
байтовой области в памяти, определяющей остальные 128 символов. (8 байт на
символ). Отображение графических байтов в видео сигналы аналогично, как
для среднего, так и для высокого разрешения.
РЕЖИМ СРЕДНЕГО РАЗРЕШЕНИЯ
________________________________________________________________
При среднем разрешении каждый байт представляет четыре точки,
пронумерованных от 0 до 3:
Байт: |C1 C0|C1 C0|C1 C0|C1 C0|
Пиксели: 0 1 2 3
В любой момент для каждой точки возможны четыре цвета, от 0 до 3.
Ограничение в 4 цвета объясняется тем, что двухбитовая точка имеет 4
комбинации значений битов: 00, 01, 10 и 11. Можно выбрать значение 00 для
любого из 16 возможных цветов фона или выбрать значение 01, 10, и 11 для
одной из двух палитр. Каждая палитра имеет три цвета:
C1 C0 Палитра 0 Палитра 1
0 0 фон фон
0 1 зеленый голубой
1 0 красный сиреневый
1 1 коричневый белый
Для выбора цвета палитры и фона используется INT 10H. Таким образом,
если, например, выбран фон желтого цвета и палитра 0, то возможны
следующие цвета точки: желтый, зеленый, красный и коричневый. Байт,
содержащий значение 10101010, соответствует красным точкам. Если выбрать
цвет фона - синий и палитру 1, то возможные цвета: синий, голубой,
сиреневый и белый. Байт, содержащий значение 00011011, отображает синюю,
голубую, сиреневую и белую точки.
Прерывание BIOS INT 10H для графики
-------------------------------------
Функция AH=00 команды INT 10H устанавливает графический режим.
Функция AH=11 команды INT 10H позволяет выбрать цвет палитры и вывести на
экран графический символ. Код в регистре AH определяет функцию:
AH=00: Установка режима. Нулевое значение в регистре AH и 04 в
регистре AL устанавливают стандартный цветной графический режим:
MOV AH,00 ;Функция установки режима
MOV AL,04 ;Разрешение 320х200
INT 10H
Установка графического режима приводит к исчезновению курсора с
экрана. Подробности по установке режима приведены в главе 9.
AH=0BH: Установка цветовой палитры. Число в регистре BH определяет
назначение регистра BL:
BH=00 выбирает цвета фона и бордюра в соответствии с содержимым
регистра BL. Цвет фона от 1 до 16 соответствует шест. значениям от 0
до F;
BH=01 выбирает палитру соответственно содержимому регистра BL (0
или 1):
MOV AH,0BH ;Функция установки цвета
MOV BH,01 ;Выбор палитры
MOV BL,00 ; 0 (зеленый, красный, корич.)
INT 10H ;Вызвать BIOS
Палитра, установленная один раз, сохраняется, пока не будет отменена
другой командой. При смене палитры весь экран меняет цветовую комбинацию.
При использовании функции AH=0BH в текстовом режиме, значение,
установленное для цвета 0 в палитре, определяет цвет бордюра.
AH=0CH: Вывод точки на экран. Использование кода 0C в регистре AH
позволяет вывести на экран точку в выбранном цвете (фон и палитра).
Например, для разрешения 320х200 загрузим в регистр DX вертикальную
координату (от 0 до 199), а в регистр CX - горизонтальную координату (от 0
до 319). В регистр AL поместим цвет точки (от 0 до 3):
MOV AH,0CH ;Функция вывода точки
MOV AL,цвет ;Цвет точки
MOV CX,столбец ;Горизонтальная координата
MOV DX,строка ;Вертикальная координата
INT 10H ;Вызвать BIOS
AH=0DH: Чтение точки с экрана. Данная функция позволяет прочитать
точку для определения ее цвета. В регистр DX должна быть загружена
вертикальная координата (от 0 до 199), а в регистр CX - горизонтальная (от
0 до 319). В регистре AH должно быть значение 0D. Функция возвращает цвет
точки в регистре AL.
ПРОГРАММА: УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА И ОТОБРАЖЕНИЕ ЦВЕТА
________________________________________________________________
Программа, приведенная на рис.10.1, использует команду INT 10H для
установки графического режима, выбора зеленого фона и вывода на экран
точек (40 строк по 320 столбцов). В программе происходит увеличение
значения цвета на 1 для каждой строки. Так как в определении цвета
участвуют только три правых бита, цвета повторяются через каждые семь
строк.
__________________________________________________________________________
TITLE GRAPHIX (COM) Пример цвета и графики
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
MAIN PROC NEAR
MOV AN,00 ;Установка режима графики
MOV AL,0DH ; для EGA (CGA=04)
MOV AH,0BH ;Установить палитру
MOV BH,00 ;Фон
MOV BL,02 ;Зеленый
INT 10H
MOV BX,00 ;Начальные цвет,
MOV CX,00 ; столбец
MOV DX,00 ; и строка
A50:
MOV AH,0CH ;Функция вывода точки
MOV AL,BL ;Установить цвет
INT 10H ;BX, CX, и DX сохраняются
INC CX ;Увеличить столбец
CMP CX,320 ;Столбец 320?
JNE A50 ; нет - цикл,
MOV CX,00 ; да - сбросить столбец
INS BL ;Изменить цвет
INS DX ;Увеличить строку
CMP DX,40 ;Строка 40?
JNE A50 ; нет - цикл,
RET ; да - завершить
MAIN ENDP
CODESG ENDS
END MAIN
__________________________________________________________________________
Рис.10.1 Вывод на экран в цветном графическом режиме.
После выполнения программы дисплей остается в графическом режиме.
Восстановление текстового режима возможно с помощью команды DOS MODE (MODE
CO80) или пользовательской COM программой, в которой для этой цели
используется команда INT 10H.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Память объемом 16К для цветного дисплея позволяет хранить
дополнительные страницы (экраны). Возможны четыре страницы для экранов на
80 столбцов или восемь страниц для экранов на 40 столбцов.
- Графический режим обеспечивает низкое разрешение (не поддерживается
в ROM), среднее разрешение (для цветной графики) и высокое разрешение (для
черно-белой графики).
- Точка растра (минимальный элемент графического изображения)
представляется определенным числом бит в зависимости от графического
адаптера и разрешающей способности (низкой, средней или высокой).
- Для графики среднего разрешения на цветном графическом адаптере
(CGA) можно выбрать четыре цвета, один из которых принадлежит к 16
возможным цветам, а три других формируют цветовую палитру.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
_________________________________________________________________
10.1. Сколько цветов возможно для фона и для текста на стандартном
цветном адаптере (CGA) в текстовом режиме?
10.2. Напишите байты атрибуты в двоичном формате для а) сиреневого на
ярко-голубом, б) коричневого на желтом, в)красного на сером с миганием.
10.3. Объясните разницу в количестве цветов, возможных при низком,
среднем и высоком разрешении.
10.4. Напишите команды для вывода пяти символов карточной масти
"бубны" в текстовом режиме ярко-зеленым цветом на сиреневом фоне.
10.5. Напишите команды для установки графического режима с разрешением
а) 320х200 в адаптере CGA и б) 640х200 в адаптере EGA.
10.6. Напишите команды для установки синего фона в графическом режиме.
10.7. Напишите команды для чтения точки на 12 строке и 13 столбце в
графическом режиме.
10.8. Модифицируйте программу на рис.10.1 для: а) графического режима
на вашем мониторе; б) красного фона; в) строк с 10 по 30; г) столбцов с 20
по 300.
__________________________________________________________________________
Ц е л ь: Объяснить назначение специальных цепочечных команд,
используемых для обработки символьных данных.
ВВЕДЕНИЕ
________________________________________________________________
Команды, показанные в предыдущих главах, оперировали одним байтом,
или одним словом за одно выполнение. Часто, однако, бывает необходимо
переслать или сравнить поля данных, которые превышают по длине одно слово.
Например, необходимо сравнить описания или имена для того, чтобы
отсортировать их в восходящей последовательности. Элементы такого формата
известны как строковые данные и могут являться как символьными, так и
числовыми. Для обработки строковых данных ассемблер имеет пять команд
обработки строк:
MOVS - переслать один байт или одно слово из одной области памяти в
другую;
LODS - загрузить из памяти один байт в регистр AL или одно слово в
регистр AX;
STOS - записать содержимое регистра AL или AX в память;
CMPS - сравнить содержимое двух областей памяти, размером в один байт
или в одно слово;
SCAS - сравнить содержимое регистра AL или AX с содержимым памяти.
Префикс REP позволяет этим командам обрабатывать строки любой длины.
СВОЙСТВА ОПЕРАЦИЙ НАД СТРОКАМИ
________________________________________________________________
Цепочечная команда может быть закодирована для повторяющейся
обработки одного байта или одного слова за одно выполнение. Например,
можно выбрать "байтовую" команду для обработки строки с нечетным числом
байт или "двухбайтовую" команду для обработки четного числа байт. Ниже
перечислены регистры, участвующие в цепочечных командах (для однобайтовых
и двухбайтовых вариантов). Предположим, что регистры DI и SI содержат
необходимые адреса:
Команда Операнды Байт Слово
MOVS DI,SI MOVSB MOVSW
LODS AL,SI или AX,SI LODSB LODSW
STOS DI,AL или DI,AX STOSB STOSW
CMPS
...Поділитися у соцмережах