Як вказано в 7.1,два байти пам'яті по адресам 40:17h
та 40:18h (див. Табл.7.1) зберігають поточний стан шифт- та тригерних клавіш.
Безпосередній доступ до цих байтів дає можливість отримати дозширену
інфоормацію, недоступну при використанні функції AH=02 переривання 16h BIOS або
ії аналога bioskey(2). Наведемо приклад функції getsh_kb(), котра повертає
розширену інформацію про поточий стан шифт- та тригерних клавіш комп’ютера;
стан повертається в змінній unsigned, на котру вказує old_status:
/*L7_11.C*/
#include<dos.h>
Void getsh_kb(unsigned *old_status)
{ unsigned _es *shift_adress=(unsigned _es*)0x17;
disable();
_ES=0x40;
*old_status=*shift_adress;
enable();
}
Інтерпритація поточного стану шифт- та тригерних
клавіш дозволяє визначити їх натиснення і використовувати їх в якості „гарячих”
клавіш, що активізуватимуть резудентну програму: наприклад, запустити ту чи
іншу TSR при одночасному натисненні Shift Left, Shift Right та Ctrl. Можна
уявити і більш екзотичну комбінацію.
Фукція getsh_kb() на відміну від функції Turbo C
bioskey() повертає стан не тільки байта по адресі 40:17h та байта по адресі 40:18h.
Це дає додаткові можливості при управлінні системою.
Встановлення необхідних значень шифт- та тригерних клавіш дозволяє програмі привести клавіатуру комп’ютера в очікуваний нею стан, наприклад визначити, що при завантаженні програми по замовчанню встановлюється режим Ins – включено, нижній регістр (строкові літери, CapsLock включений), цифрова клавіатура вимкнена (NumLock - вимкнений) і т.д. Далі приведений приклад функції setsh_kb(), що виконує встановлення потрібних значень шифт- та тригерних клавіш. Параметром являється покажчик на структурну змінну по шаблону struct shft_status, що зберігає нові установки для шифт- та тригерних клавіш.
/*L7_12.C*/
#include<dos.h>
#include ”kb.h”
void setsh_kb(unsigned * new_ststus)
{ unsigned _es *shift_address=
(unsigned _es*)0x17;
disable();
_ES=0x40;
*shift_address=*new_status;
enable();
}
Персональні комп’ютери ЕС-1840 та ЕС-1841 мають одну інтерфейсну особливістьпри роботі з шифт-прапорами. ISR BIOS переривання 9 цих комп’ютерів при натисненні клавіші Лат встановлює в 1 обидва прапори Ctrl Left та Alt Left. При натисненні клавіші Рус обидва ці прапори переходять в 0. При початковому завантаженні комп’ютера встановлюється по замовчанню значення 0. Таким чином, прочитавши значення Ctrl Left та Alt Left (біти 0 та 1 00418h), завжди можна визначити поточне значення регістру Рус/Лат. Зміни цих бітів для програми користувача міняє і регістр клавіатури. Правда при цьому не змінюється стан світодіодів, що може привести до помилки: на клавіатурі буде світитися лампочка Рус, але при цьому будуть генеруватися латинські літери, і навпаки.
![]() |
![]() |
![]() |