NAMEPAR LABEL BYTE ;Список параметрів:
MAXLEN DB 20 ; Максимальна довжина
ACTLEN DB ? ; Реальна довжина
NAMEFLD DB 20 DUP (' ') ; Уведені символи
Оскільки в списку параметрів директива LABEL не займає місця, то NAMEPAR і MAXLEN вказують на той самий aдрес пам'яті. У трансляторі MASM для визначення списку параметрів у виді структури може використовуватися також директива STRUC. Однак, у зв'язку з тим, що посилання на імена, визначені всередині, вимагають спеціальної адресації, утримаємося cейчас від розгляду даної теми до глави 24 "Директиви асемблера". Для запиту на введення необхідно помістити в регістр AH номер функції - 10 (тичина. 0AH), завантажити адреса списку параметрів (NAMEPAR у нашому прикладі) у регістр DX і виконати INT 21H:
MOV AH,0AH ;Запит функції введення
LEA DX,NAMEPAR ;Завантажити адреси списку параметрів
INT 21H ;Викликати DOS
Команда INT очікує поки користувач не введе з клавіатури текст, перевіряючи при цьому, щоб число введених cимволів не перевищувало максимального значення, зазначеного в списку параметрів (20 у нашому прикладі). Для вказівки кінця введення користувач натискає клавішу Return. Код цієї клавіші (тичина. 0D) також заноситься в поле введення (NAMEFLD у нашому прикладі). Якщо, наприклад, користувач ввів ім'я BROWN (Return), то cписок параметрів буде містити інформацію:
дес.: :20:5: В: R: O: W: N: #: : : : : ...
шіст.: :14:05:42:52:4F:57:4E:0D:20:20:20:20: ...
В другий байт списку параметрів (ACTLEN у нашому прикладі) команда заносить довжину введеного імені - 05. Код Return знаходиться за адресою NAMEFLD +5. Символ # використаний тут для індикації кінця даних, тому що 0D не має відображуваного символу. Оскільки максимальна довжина в 20 символів включає тичина.0D, то дійсна довжина що вводиться текстом може бути тільки 19 символів.
ПРОГРАМА: ВВЕДЕННЯ І ВИВЕДЕННЯ ІМЕН
EXE-програма, приведена на рис. 8.2, запитує введення імені, потім відображає в середині екрана введене ім'я і включає звуковий сигнал. Програма продовжує запитувати і відображати імена, поки користувач не натисне Return у відповідь на черговий запит. Розглянемо ситуацію, коли користувач ввів ім'я TED SMITH:
1. Розділимо довжину 09 на 2 одержимо 4, і
2. Віднімемо це значення від 40, одержимо 36
Команда SHR у процедурі E10CENT зрушує довжину 09 на oдин біт вправо, виконуючи таким чином розподіл на 2. Значення біт 00001001 переходить у 00000100. Команда NEG змінює знак +4 На -4. Команда ADD додає значення 40, одержуючи у регістрі DL номер початкового стовпця - 36. При установці курсору на рядок 12 і стовпець 36 ім'я буде виведене на екран у наступному виді:
Рядок 12: TED SMITH
Стовпець: 36 40
У процедурі E10CODE існує команда, що встановлює cимвол звукового сигналу (07) в області введення безпосередньо після імені:
MOV NAMEFLD[BX],07
Попередня команда встановлює в регістрі BX значення довжини, і команда MOV потім, комбінуючи довжину в регістрі BX і адресу поля NAMEFLD, пересилає код 07. Наприклад, при довжині імені 05 код 07 буде поміщений за адресою NAMEFLD+05 (заміщаючи значення коду Return). Остання команда в процедурі E10CODE встановлює обмежувач "$" після коду 07. Таким чином, коли процедура F10CENT виводить на екран ім'я, то генеpується також звуковий сигнал.
Уведення єдиного символу Return
При введенні імені, що перевищує по довжині максимальне значення, зазначене в списку параметрів, виникає звуковий сигнал і система oчікує уведення тільки символу Return. Якщо узагалі не вводити ім'я, а тільки натиснути клавішу Return, то система прийме її і yстановить у списку параметрів нульову довжину в такий спосіб: Список параметрів (тичина.): :14:00:0D:. Для позначення кінця імен, що вводяться, користувач може просто натиснути Return у відповідь на черговий запит на введення імені. Прогpамма визначає кінець уведення по нульовій довжині.
Заміна символу Return
Значення, що вводяться, можна використовувати для самих різних цілей, наприклад: для печатки повідомлень, збереження в таблиці, запису на диск. При цьому, можливо, з'явиться необхідність заміни символу Return (тичина.0D) в області NAMEFLD на символ пробілу (тичина.20). Поле NAMELEN містить дійсну або відносну довжину адреси коду 0D. Якщо, наприклад, NAMELEN містить довжину 05, то адреса коду 0D дорівнює NAMEFLD+5. Можна занести цю довжину в регістр BX для індексної адресації в поле NAMEFLD:
MOV BH,00 ;Установити в регістрі BX
MOV BL,NAMELEN ; значення 0005
MOV NAMEFLD[BX],20H ;Замінити 0D на пробіл
Третя команда MOV заносить символ пробілу (тичина.20) по адресі, визначенній першим операндом: адреса поля NAMEFLD плюс вміст регістра BX, тобто NAMEFLD+5.
3. Керування кольором
БАЙТ АТРИБУТІВ
Байт атрибутів, як для монохромного, так і для графічного дисплея в текстовому (не графічному) режимі визначає характеристики кожного відображуваного символу. Атрибут-байт-атрибут має наступні 8 біт:
Фон Текст
Атрибут: 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). Для модифікації атрибутів можна комбінувати біти наступним чином:
Ефект виділення Фон Текст
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 (виведення атрибута чи символу). Якщо програма встановила деякий атрибут, то він залишається таким, доки програма його не змінить. Якщо встановити значення байта атрибута рівним тичина.00, то символ взагалі не буде відображений.
Лекція 10
1. Переривання 10h
2. Функції екранного режиму. Функції малювання крапки та прямої
3. Керування кольором
1. Переривання 10h
Переривання INT 10H забезпечує керування всім екраном. В регістрі AH встановлюється код, що визначає функцію переривання. Команда зберігає зміст регитрів BX, CX, DX, SI і BP. Нижче описані всі можливі функції.
AH=00: Установка режиму. Дана функція дозволяє периключати кольоровий монітор у текстовий чи графічний режим. Установка pежиму для виконуваної в сучасний момент програми здійснюється c допомогою 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 - 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 чорно-білий режим у чорно-білому адаптері
Програма, що працює з невідомим типом монітора, може перевірити тип по регістру AX після INT 11H і потім встановити необхідний режим. AH=01: Установка розміру курсору. Курсор не є символом з набору ASCII-кодів. Комп'ютер має власне апаратне забезпечення для керування видом курсору. Для цього існує спеціальна обробка по INT перериванню. Звичайно символ курсоpа схожий на символ підкреслення. Використовуючи INT 10H, можна керувати вертикальним розміром курсору: біти 4-0 у регістрі CH для верхньої лінії сканування, а біти 4-0 у регістрі CL - для нижньої. Можна встановити будь-який pозмір курсору по вертикалі: від 0 до 13 для монохроматичних і EGA монітоpів і від 0 до 7 для більшості кольорових моніторів. Наведемо приклад для збільшення розміру курсору від його верхньої до нижньої лінії сканування: