КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Теоретичні відомості.Даний спосіб базується на стандартному наборі функцій ВІOS, що використовують переривання – int 16h. Список всіх функцій представлений в табл. 3.1. Слід відмітити, що для підтримки 84-клавішеих клавіатур використовуються тільки ВІOS функції 00h, 01h i 02h. Функції 10h, 11h i 12h підтримують 83-клавішні і 102-клавішні пристрої. Функції 20h, 21h i 22h підтримують всі види клавіатур.
Таблиця 3.1. Список функцій ВІOS Функція 00h– дозволяє отримати скан-код і ASKII-код натисненої клавіші. За допомогою даної функції неможливо отримати код додаткових клавіш на розширеній клавіатурі. Для цього потрібно примінити функцію 10h, яка буде розглянута пізніше. Функція зчитує символ з буфера клавіатури, потім очищає його. При отриманні коду управляючих клавіш, наприклад – пробіл, в регістр AL буде записаний рівний 0. Використання: при використанні функції в регістр AH потрібно помістити код функції 00h; викликати переривання int 16h. Після виконання в регістр АН буде записаний скан-код ВІOS символу, а в регістр AL - ASKII-код символу. Стандартний набір значень скан-кодів символів представлений в табл.3.2, а розширений – в табл.3.3.
Таблиця 3.2. Скан-коди клавіатури
Таблиця 3.3. Коди для розширеної клавіатури
Таблиця 3.4. Символи управління ASCII Покроковий хід роботидля написання програми функції 00h на мові Асемблер, яка допомагає визначити, чи була натиснута клавіша управління: 1. Організація циклового повторення @repeat для умовного натискання клавіші управління. 2. Помістити в регістр AH код функції 00h. 3. Виклик переривання int 16. 4. Перевіряємо регістр AL. 5. Якщо натиснута не клавіша управління, повторяємо. 6. Переписуємо код управління в регістр AL з регістра АН.
Функція 01h – дозволяє перевірити натиснення клавіші на клавіатурі. Якщо клавіша була натиснута, функція запише скан-код і ASKII-код у відповідні регістри. Буфер клавіатури не очищається. Використання: регістр AH потрібно помістити код функції 01h; визвати переривання Int 16h. Після виконання функції в регістр AH буде записано скан-код BIOS символу, а в регістр AL - ASKII-код символу. Крім того, якщо не було натиснення клавіші символу, то прапор ZF буде встановлений в 1. Якщо клавіша була натиснута, то прапор ZF буде скинутий, (0). Приклад з натисканням клавіші <ESC>. Покроковий хід роботидля написання програми функції 01h на мові Асемблер, яка дозволяє перевірити натиснення клавіші на клавіатурі. 1. Організація циклового повторення @repeat для умовного натискання клавіші управління. 2. Записуємо в регістр АН код функції 01h. 3. Викликаємо переривання int 16h. 4. Натиснення клавіші не було, повторюємо запит. 5. Клавіша натиснута, читаємо код клавіші. 6. Викликаємо переривання int 16h. 7. Порівнюємо отриманий ASKII-код з кодом ESC (1Bh). 8. Якщо ASKII-код не відповідає клавіші ESC, повторяємо.
Функція 02h – дозволяє перевірити стан спеціальних клавіш на клавіатурі: <Shift>, <Ctrl>, <Alt>, <Num Lock>, <Scroll Lock>, <Caps Lock> i <Insert>. Використання: регістр AH потрібно помістити код функції 02h; визвати переривання іnt 16h. Після виконання функції в регістр AL буде зберігати стан спеціальних клавіш. Формат цього байта представлений в табл.3.5.
Таблиця 3.5. Формат байта стану клавіатури Покроковий хід роботидля написання програми функції 02h на мові Асемблер, яка дозволяєперевірити стан спеціальних клавіш на клавіатурі.
1. Очікування прийняття натискання спеціальних клавіш на клавіатурі. 2. Записати в регістр AH код функції 02h. 3. Викликаємо переривання int 16h. 4. Перевіряємо в регістрі AL нижній біт (8). 5. Жодна клавіша Alt не була натиснута, повторити процедуру натискання.
Функція 03h – дозволяє встановити режим автоповторення і час затримки. Використання: в регістр AH потрібно розмістити код функції 03h; в регістр AL потрібно записати 3 операції: 00h значення по замовчуванню для автоповторення і часу затримки; 04h відключення автоповтору (тільки для деяких клавіатур РS/2; 05h встановлення кількості повторень і часу затримки для всіх стандартних клавіатур; 06h отримання текучого значення частоти повторень і часу затримки (для деяких нових клавіатур РS/2). В регістр ВН необхідно записати значення коду затримки (табл.3.6). В регістр ВL – значення коду частоти повторення (табл.3.7). Викликати переривання int 16h. Після виконання функції регістр ВL буде зберігати значення частоти повторення, а регістр ВН – час затримки. Вхідні параметри дійсні тільки для типу операції з кодом 06h.
Таблиця 3.6. Код затримки
Таблиця 3.7. Код частоти повторень Покроковий хід роботидля написання програми функції 03h на мові Асемблер, яка дозволяє встановити режим автоповторення і час затримки. 1. Записуємо в регістр AH код функції 03h. 2. Записуємо в регістр AL тип операції (5). 3. Записуємо в регістр ВН час затримки 750 мс з кодом 2 наприклад. 4. Запис в регістр ВL операції повторення частоти 20 символів/с з кодом 4. 5. Викликаємо переривання int 16h.
Функція 04h – дозволяє управляти установкою звукового сигналу для натиснення клавіш (як сигнал клацання). При активізації сигналу кожне натискання буде супроводжуватися характерним сигналом клацання. Використання: в регістр AH потрібно розмістити код функції 04h; в регістр AL потрібно записати код операції управління (1-включити звуковий сигнал, 0-відключити звуковий сигнал). Викликати переривання int 16h. Функція не має спеціальних вихідних параметрів. Покроковий хід роботидля написання програми функції 04h на мові Асемблер, яка дозволяє управляти установкою звукового сигналу для натиснення клавіш. 1. Записуємо в регістр AH код функції 04h. 2. Включаємо в регістр AL звуковий сигнал (код 1). 3. Викликаємо переривання int 16h.
Функція 05h – дозволяє записати визначений символ в буфер клавіатури. Особливість функції в тому, що вона дозволяє імітувати натискування клавіш. Використання: регістр AH потрібно помістити код функції 05h; в регістр СН потрібно занести скан-код потрібної клавіші; в регістр СL – записати ASKII-код тієї ж клавіші; викликати переривання int 16h. Після виконання цієї функції регістр AL буде зберігати результат операції: 00h – функція успішно завершена, 01h – функція не виконана із-за переповнення буфера клавіатури. Якщо функція не завершена, буде встановлений прапор СF. Запишемо символ «а» в буфер клавіатури: Покроковий хід роботидля написання програми функції 05h на мові Асемблер, яка дозволяє записати необхідний символ в буфер клавіатури. 1. Записуємо в регістр AH код функції 05h. 2. Вписуємо в регістр СН скан-код букви 'а' рівний 1Еh (код 30). 3. Записуємо в регістр СL ASKII-код букви 'а'. 4. Викликаємо переривання int 16h.
Дану функцію можна використовувати для запису в буфер клавіатури любої команди DOS (наприклад DATE), використовуючи тільки ASKII-коди: Покроковий хід роботи для написання програми функції 05h на мові Асемблер, яка дозволяє записати необхідну команду в буфер клавіатури. 1. Записуємо в регістр СL ASKII-код букви ‘d’. 2. Відправляємо її в буфер клавіатури. 3. Записуємо в регістр СL ASKII-код букви ’а’. 4. Відправляємо її в буфер клавіатури. 5. Записуємо в регістр СL ASKII-код букви ‘t’. 6. Відправляємо її в буфер клавіатури. 7. Записуємо в регістр СL ASKII-код букви ‘e’. 8. Відправляємо її в буфер клавіатури. 9. Записуємо в регістр СL ASKII-код переводу лінійки 0Ah. 10. Відправляємо її в буфер клавіатури. 11. Записуємо в регістр СL ASKII-код повернення каретки 0Dh. 12. Відправляємо її в буфер клавіатури. 13. Виходимо з програми командою ret. 14. Процедура для запису байту в буфер клавіатури. 15. Записуємо в регістр АН код функції 05h. 16. Записуємо в регістр CН скан-код 0 (не використовуємо). 17. Викликаємо переривання int 16h. 18. Закінчення процедури.
Функція 09h – дозволяє визначити набір функцій, які підтримуються клавіатурою, і, відповідно, взнати їx тип (84, 102 або 122 клавіші). Визначити, чи підтримується дана функція BIOS, можна за допомогою функції С0h переривання int 15h. Використання: регістр АН потрібно помістити код функції 09h; викликати переривання int 16h. Після виконання функції регістр АL буде зберігати бітову маску функцій підтримки. Формат бітової маски представлений в табл. 3.8.
Таблиця 3.8. Бітова маска набору функцій. Наприклад, щоб взнати, чи підтримуються функції 20h, 21h і 22h клавіатурою (122 клавіш), потрібно написати відповідний код: Покроковий хід роботидля написання програми функції 09h на мові Асемблер, яка дозволяє визначити набір функцій, які підтримуються клавіатурою, і вказати їx тип (кількість клавіш). 1. Записуємо в регістр AH код функції 09h. 2. Викликаємо переривання int 16h. 3. Перевіряємо біт 6 в регістрі AL командою 40h. 4. Функції не підтримуються. Видання помилки ErrorHnd.
Функція 0Аh – дозволяє прочитати ідентифікатор установленої клавіатури. Перед викликом цієї функції потрібно викликати функцію 09h, щоб переконатися в її підтримці BIOS. Використання: в регістр АН потрібно помістити код функції 0Аh; викликати переривання int 16h. Після виконання функції регістр ВХ буде зберігати ідентифікатор клавіатури: 0000h-клавіатура відсутня, 41АВh, 54АВh, 83АВh, 84АВh-японська клавіатура, 86АВh - 122-клавішна клавіатура. Розглянемо приклад отримання ідентифікатора підключеної клавіатури. Покроковий хід роботидля написання програми функції 0Аh на мові Асемблер, яка дозволяє прочитати ідентифікатор установленої клавіатури.
1. Записуємо в регістр AH код функції ОАh. 2. Викликаємо переривання int 16h. 3. Перевіряємо в регістрі BX наявність клавіатури (0). 4. Клавіатура не підключена (NoKeyb). 5. Порівнюємо в регістрі BX код 86ABh - 122 клавішна клавіатура. 6. Порівнюємо NoKeyb_122 не 122-клавішна клавіатура.
Функція 10h – дозволяє прочитати любий символ з розширеної клавіатури. Вона подібна на функцію 00h і підтримує розширений набір символів. Використання: в регістрі АН потрібно помістити код функції 10h; викликати переривання int 16h. Після виконання функції в регістр АН буде розміщений скан-код BIOS символу із розширеного набору, а в регістр АL - ASKII-код символу. Покроковий хід роботидля написання програми функції 10h на мові Асемблер, яка дозволяє записати необхідний символ в буфер клавіатури. 1. Записуємо в регістр AH код функції 10h. 2. Вписуємо в регістр СН скан-код букви на розширеній клавіатурі. 3. Записуємо в регістр СL ASKII-код букви. 4. Викликаємо переривання int 16h.
Функція 11h – дозволяє перевірити натискування клавіші на розширеній клавіатурі. Якщо клавіша була натиснута, функція записує скан-код і ASKII-код клавіші у відповідні регістри. Вона подібна на функцію 00h тільки підтримує розширений набір символів. Використання: в регістр АН потрібно розмістити код функції 11h; викликати переривання int 16h. Після виконання функції в регістр АН буде розміщено розширений скан-код BIOS символу, а в регістр АL - ASKII-код символу. Якщо ж натискування клавіші не було, прапор ZF буде встановлений в 1, в протилежному випадку буде скинутий. Покроковий хід роботидля написання програми функції 11h на мові Асемблер, яка допомагає визначити, чи була натиснута клавіша управління: 1. Організація циклового повторення @repeat для умовного натискання клавіші управління. 2. Помістити в регістр AH код функції 11h. 3. Виклик переривання int 16. 4. Перевіряємо регістр AL. 5. Якщо натиснута не клавіша управління, повторяємо. 6. Переписуємо код клавіші управління в регістр AL з регістра АН.
Функція 12h – дозволяє отримати стан спеціальних клавіш, отриманих на розширеній клавіатурі: <Shift>, <Ctrl>, <Alt>, <Num Lock>, <Scroll Lock>, <Caps Lock> i <Insert>. Використання: в регістр АН потрібно розмістити код функції 12h; викликати переривання int 16h. Після виконання функції в регістр АН буде розміщено значення спеціальних клавіш. Формат значень повернення викладений в табл.3.9.
Таблиця 3.9. Формат значення про стан розширеної клавіатури Покроковий хід роботидля написання програми функції 12h на мові Асемблер, яка дозволяєперевірити стан спеціальних клавіш на розширеній клавіатурі. 1. Очікування натискання спеціальних клавіш на розширеній клавіатурі. 2. Записати в регістр AH код функції 12h. 3. Викликаємо переривання int 16h. 4. Перевіряємо в регістрі AL нижній біт (8). 5. Ні одна клавіша не була натиснута, повтор.
Функція 20h – дозволяє прочитати любий символ з розширеної клавіатури. Вона подібна на функцію 10h і підтримує 122-клавішні клавіатури. Використання: в регістр АН потрібно розмістити код функції 20h; викликати переривання int 16h. Після виконання функції в регістр АН буде розміщено скан-код BIOS символу з розширеного набору, а в регістр АL - ASKII-код символу. Покроковий хід роботидля написання програми функції 20h на мові Асемблер, яка дозволяє прочитати будь-який символ з розширеної клавіатури. 1. Записуємо в регістр AH код функції 20h. 2. Вписуємо в регістр СН скан-код букви на розширеній клавіатурі. 3. Записуємо в регістр СL ASKII-код букви. 4. Викликаємо переривання int 16h.
Функція 21h – дозволяє перевірити натискування клавіші на розширеній клавіатурі. Якщо клавіша була натиснута, функція записує скан-код і ASKII-код клавіші у відповідні регістри. Вона подібна на функцію 11h, тільки підтримує 122-клавішні клавіатури. Використання: в регістр АН потрібно розмістити код функції 21h; викликати переривання int 16h. Після виконання функції в регістр АН буде розміщено скан-код BIOS символу, а в регістр АL - ASKII-код символу. Якщо ж натискування клавіші не було, прапор ZF буде встановлений в 1, якщо клавіша булла натиснута, прапор ZF буде скинений. Покроковий хід роботидля написання програми функції 21h на мові Асемблер, яка допомагає визначити, чи була натиснута клавіша на розширеній клавіатурі. 1. Організація циклового повторення @repeat для умовного натискання клавіші управління. 2. Помістити в регістр AH код функції 21h. 3. Виклик переривання int 16. 4. Перевіряємо регістр AL. 5. Якщо натиснута не клавіша управління, повторяємо. 6. Переписуємо код управління в регістр AL з регістра АН.
Функція 22h – дозволяє отримати стан спеціальних клавіш на розширеній клавіатурі: <Shift>, <Ctrl>, <Alt>, <Num Lock>, <Scroll Lock>, <Caps Lock> i <Insert>. Подібна на функцію 11h тільки підтримує 122-клавішні клавіатури. Використання: в регістр АН потрібно розмістити код функції 22h; викликати переривання int 16h. Після виконання функції в регістр АХ буде розміщено значення спеціальних клавіш. Формат значень повернення був викладений в табл.3.9. Покроковий хід роботидля написання програми функції 22h на мові Асемблер, яка дозволяєотримати стан спеціальних клавіш на розширеній 122- клавішній клавіатурі. 1. Очікування натискання спеціальних клавіш на розширеній клавіатурі. 2. Записати в регістр AH код функції 22h. 3. Викликаємо переривання int 16h. 4. Перевіряємо в регістрі AL нижній біт (8). 5. Ні одна клавіша не була натиснута, повтор.
Функція FFh – дозволяє добавити символ в кінець буфера клавіатури. Використання: в регістр АН потрібно розмістити код функції FFh; в регістр DX потрібно записати скан-код бажаного символу; викликати переривання int 16h. Після виконання функції регістр AL буде зберігати результат операції: 00h – функція успішно завершена, 01h – виникла помилка. Запишемо скан-код букви «Q» в буфер клавіатури: 1. Записуємо в регістр AH код функції 0FFh. 2. Заносимо в регістр DX скан-код букви «Q» (10h). 3. Викликаємо переривання int 16h. 4. Перевіряємо регістр AL на 0 5. Виникла помилка ErrorHnd
На цьому і розглянуто основні функції BIOS і перейдемо до самостійних варіантів їх програмування. Самостійно виконайте програму функцій вашого варіанта на мові асемблер:
|