Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_лаб_ПЗСУ.doc
Скачиваний:
11
Добавлен:
07.02.2016
Размер:
483.84 Кб
Скачать

Додаток д

Таблиця Д.1

Скан-коди основної клавіатури

Рис.Д.1 Скан-коди клавіш основної клавіатури

Рис Д.2. Скан-коди клавіш додаткової клавіатури

Рис. Д.3 Скан-коди клавіш цифрової клавіатури

Додаток ж Загальні команди контролера 8042

− DFh - дозволити управління лінією А20.

− DDh - заборонити управління лінією А20.

− D1h - запис у порт виводу 8042.

− D0h - читання порту виводу 8042.

− C0h - читання порту введення 8042.

− AEh - дозвіл клавіатури.

− ADh - заборона клавіатури.

− ACh - читання ОЗУ контролера.

− ABh - тест синхронізації і даних.

− AAh - внутрішній тест контролера.

− 60h - запис у контролер.

− 20h - читання контролера.

Команди управління клавіатурою AT:

− FF - Reset - скидання і тест клавіатури.

− FE - Resend - повтор останньої передачі.

− FB-FD - Set Key Types - установка автоповтора окремих клавіш.

− F7-FA - Set All Keys - установка операції автоповтора клавіатури.

− F6 - Set Default - скидання в початковий стан і дозвіл сканування.

− F5 - Default Disable - скидання в початковий стан і заборона сканування. − F4 - Enable KB - клавіатура відповість байтом підтвердження АСК і продовжить сканування.

− F3 - Set Typematic Rate/Delay - завдання затримки і частоти повтору кодів.

Наступний байт даних має наступний формат:

− Біт 7=0.

− Біти | 6:5 | - затримка, мс: 00=250, 01=500, 10=750, 11=1000.

− Біти | 4:0 |=00-lFh - швидкість повторів, 1/з:

00h=30,0 08h=15,0 0Ah=12,0 12h=6,0

01h=26,7 09h=13,3 0Ch=10,0 14h=5,0

02h=24,0 05h=18,5 0Dh=9,2 17h=4,0

03h=21,8 06h=17,1 0Fh=8,0 1Ah=3,0

04h=20,0 07h=16,0 10h=7,5 1Fh-2,0

− F2 - Read ID Code запит на 2-байтный ідентифікатор.

− ЕЕ - Echo - луна-діагностика: повертає 0EEh.

− ED - Set/Reset Mode Indicators - управління індикаторами клавіатури.

Наступний байт даних:

− Біт 0:1=уключити Scroll Lock.

− Біт 1:1=уключити Num Lock.

− Біт 2:1=уключити Caps Lock.

− AD - заборона сканування.

− АЕ - дозвіл сканування.

З регістра даних контролера крім скан-кодов можливе одержання відповідей на команди, префікса коду відпускання клавіші (FO) або кодів особливих випадків. Коди особливих випадків:

- FA - АСК - підтвердження прийому команди.

- АА - Test OK - внутрішній тест пройшов.

- FD - Diag. Failure - помилка внутрішнього тесту.

- ЕЕ - Echo Response - відповідь на луну-команду.

- 00, FF - Buffer Error - переповнення буфера або неідентифікована клавіша.

Додаток з введення даних із клавіатури

Процедура введення даних із клавіатури простіша, ніж вивід на екран. Для введення, що використовує базову DOS, область уведення вимагає наявності списку параметрів, що містить поля, що необхідні при виконанні команди INT. По-перше, повинна бути визначена максимальна довжина тексту, що вводиться. Це необхідно для попередження користувача звуковим сигналом, якщо набрано занадто довгий текст; символи, що перевищують максимальну довжину не приймаються. По-друге, у списку параметрів повинне бути визначене поле, куди команда повертає дійсну довжину введеного тексту в байтах.

Нижче наведений приклад, у якому визначений список параметрів для області введення. LABEL являє собою директиву з атрибутом BYTE. Перший байт містить максимальну довжину даних, що вводиться. Тому що це однобайтове поле, те можливе максимальне значення його - шістн. FF або 255. Другий байт необхідний DOS для занесення в нього дійсного числа введених символів. Третім байтом починається поле, що буде містити введені символи.

NAMEPAR LABEL BYTE ;Список параметрів:

MAXLEN DB 20 ; Максимальна довжина

ACTLEN DB ? ; Реальна довжина

NAMEFLD DB 20 DUP (' ') ; Введені символи

Тому що в списку параметрів директива LABEL не займає місця, то NAMEPAR і MAXLEN указують на той самий адреса пам'яті. У трансляторі MASM для визначення списку параметрів у вигляді структури може використовуватися також директива STRUC.

Для запиту на введення необхідно помістити в регістр AH номер функції - 10 (шістн. 0AH), завантажити адреса списку параметрів (NAMEPAR у нашому прикладі) у регістр DX і виконати INT 21H:

MOV AH,0AH ;Запит функції введення

LEA DX,NAMEPAR ;Завантажити адреси списку параметрів

INT 21H ;Викликати DOS

Команда INT очікує поки користувач не введе з клавіатури текст, перевіряючи при цьому, щоб число введених символів не перевищувало максимального значення, зазначеного в списку параметрів (20 у нашому прикладі). Для вказівки кінця введення користувач натискає клавішу Return. Код цієї клавіші (шістн. 0D) також заноситься в поле введення (NAMEFLD у нашому прикладі). Якщо, наприклад, користувач ввів ім'я BROWN (Return), то список параметрів буде містити інформацію:

дес.: |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 символів.

При введенні імені, що перевищує по довжині максимальне значення, зазначене в списку параметрів, виникає звуковий сигнал і система очікує введення тільки символу Return. Якщо взагалі не вводити ім'я, а тільки натиснути клавішу Return, то система прийме її й установить у списку параметрів нульову довжину в такий спосіб:

Список параметрів (шістн.): |14|00|0D|...

Для позначення кінця імен, що вводяться, користувач може просто натиснути 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.

Нижче наведені команди, що ілюструють використання функції введення з клавіатури в розширеній версії DOS:

INAREA DB 20 DUP (' ') ;Область уведення

MOV AH,3FH ;Запит на введення

MOV BX,00 ;Номер для клавіатури

MOV CX,20 ;Максимум байт для введення

LEA DX,INAREA ;Адреса області введення

INT 21H ;Виклик DOS

Команда LEA завантажує відносну адресу INAREA у регістр DX. Команда INT очікує, поки користувач не введе символи з клавіатури, але не перевіряє чи перевищує число введених символів максимальне значення в регістрі CX (20 у наведеному прикладі). Натискання клавіші Return (код шістн. 0D) указує на завершення введення. Наприклад, після введення тексту "PC Users Group" INAREA буде містити:

PC Users Group, шістн. 0D, шістн.0A

Після введеного тексту безпосередньо випливає символ повернення каретки (шістн. 0D), що був уведений, і символ кінця рядка (шістн. 0A), що не був уведений. У силу даної особливості максимальне число символів і розмір області введення повинні передбачати місце для двох символів. Якщо буде введено символів менше максимального значення, то область пам'яті за введеними символами збереже колишнє значення.

У результаті успішної операції буде очищений прапор CF (що можна перевірити) і в регістрі AX буде встановлене число байт, уведених із клавіатури. У попередньому прикладі це число буде дорівнює 14 плюс 2 для перекладу каретки і кінця рядка, тобто 16. Відповідним чином програма може визначити дійсне число введених символів. Хоча дана властивість досить тривіальна для відповідей типу YES або NO, воно може бути корисно для відповідей з перемінною довжиною, таких, наприклад, як імена. Помилка введення може виникнути, якщо визначено неправильний номер файлу. У цьому випадку буде встановлений прапор CF і в регістр AX буде поміщений код помилки (6 у даному випадку). Тому що регістр AX може містити або довжину введених даних, або код помилки, те єдиний спосіб визначення наявності помилки - перевірка прапора CF.

Якщо вводити текст, що перевищує максимальну довжину, встановлену в регістрі CX, то будуть прийматися всі символи. Розглянемо ситуацію, коли регістр CX містить 08,а користувач уведе символи "PC Exchange". У результаті перші вісім символів "PC Excha" потраплять в область уведення без кодів повернення каретки і кінця рядка. У регістрі AX буде встановлена довжина 08. Наступна команда INT буде приймати дані з клавіатури, а з власного буфера, оскільки там ще залишилися попередні дані. Таким чином, в область уведення будуть прийняті символи "ngе", символ перекладу каретки і символ нового рядка, у регістрі AX буде встановлене значення 05. Обидві операції введення є цілком нормальними і прапор CF буде очищений.

Перший INT: PC Excha AX = 08

Другий INT: ngе,0D,0A AX = 05

Програма може визначити факт уведення закінченого тексту, якщо а) у регістрі AX вийде значення менше, ніж у регістрі CX або б) якщо вмісти AX і CX рівні, але останні два символи в області введення - 0D і 0A.

Вбудовані в DOS перевірки за функції 0AH для введення з клавіатури мають більш могутні засоби. Їхній вибір для використання в програмах є кращим.

Нижче перераховані інші функції DOS, що можуть виявитися корисними в роботі. Код функції встановлюється в регістрі AH і, потім, видається команда INT 21H.

AH=01: Уведення з клавіатури з луну відображенням. Дана функція повертає значення в регістрі AL. Якщо вміст AL не дорівнює нулеві, то воно являє собою стандартний ASCII−символ, наприклад, букву чи цифру. Нульове значення в регістрі AL свідчить про те, що на клавіатурі була натиснута спеціальна функціональна клавіша, наприклад, Номе,F1 або PgUp. Для визначення скэн-кода клавіш, необхідно повторити виклик функції. Дана функція реагує на запит Ctrl/Break.

AH=02: Вивід символу. Для виводу символу на екран у поточну позицію курсору необхідно помістити код даного символу в регістр DL. Коди табуляції, повернення каретки і кінця рядка діють звичайним образом.

AH=07: Прямій уведення з клавіатури без відгук відображення. Дана функція працює аналогічно функції 01 із двома відмінності мі: уведений символ не відображається на екрані, тобто немає відгук, і відсутня реакція на запит Ctrl/Break.

AH=08: Уведення з клавіатури без відгуку відображення. Дана функція діє аналогічно функції 01 з одною відмінністю: уведений символ не відображається на екран, тобто немає відгук.

AH=0B: Перевірка стану клавіатури. Дана функція повертає тичину. FF у регістрі AL, якщо введення з клавіатури можливий, у противному випадку - 00. Цей засіб зв'язаний з функціями 01, 07 і 08, що не очікують уведення з клавіатури.

Введення з клавіатури по команді BIOS int 16h.

Команда BIOS INT 16H виконує спеціальну операцію, що відповідно до коду в регістрі AH забезпечує наступні три функції введення з клавіатури.

AH=00: Читання символу. Дана функція поміщає в регістр AL черговий ASCII символ, уведений із клавіатури, і встановлює скэн-код у регістрі AH. Якщо на клавіатурі натиснута одна зі спеціальних клавішею, наприклад, Hоме або 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