KEY
Ovladač klávesnice
Ovladač klávesnice v systému Litos8 nevyužívá (na rozdíl od ostatních částí systému) standardní rozhraní BIOS, ale přistupuje přímo na porty. Důvodem je především to, aby bylo možné sledovat stisky a uvolnění jednotlivých kláves (k dispozici je mapa stisknutých kláves). To je důležité např. u her. Dalším důvodem je vyšší komfort v kódování kláves.
Každá klávesa je při stisku zaznamenána do kruhového zásobníku kláves. Hodnota klávesy je zakódována do 2-bajtového kódu tak, že obsahuje pořadové číslo klávesy na klávesnici (tzv. scan kód), aktuální stav modifikátorů (Alt, Ctrl a Shift) a odpovídající znakovou hodnotu (podle aktuálně nastaveného jazyku pomocí klávesy Scroll Lock). Scan kód může být základní nebo rozšířený - používá se z důvodu kompatibility se staršími XT klávesnicemi. Z toho důvodu se může kód klávesy zdát poměrně složitý na použití. Proto je k dispozici i několik funkcí, které z kódu klávesy separují potřebné údaje.
K načítání kláves z kruhového zásobníku je k dispozici několik funkcí. Klávesy je možné načítat buď všechny (včetně modifikátorů jako je Ctrl, Alt nebo Shift), nebo platné klávesy bez modifikátorů (kódy modifikátorů se ze zásobníku vypouštějí) nebo jako platné znaky - v tom případě se vypouštějí kromě modifikátorů i klávesy bez znakového významu.
Kód klávesy podrobně:
bit 15:
0=znaková klávesa
- bit 8..14: scan kód klávesy (0=generovaný znak)
- bit 0..7: kód znaku (1..0ffh)
1=řídicí, rozšířená nebo speciální klávesa
- bit 8..14: scan kód klávesy
- bit 7: 1=rozšířená klávesa (extendend scan)
- bit 6: Alt modifikátor
- bit 5: Ctrl modifikátor
- bit 4: Shift modifikátor
- bit 0..3: tabulkový ASCII znak
....... 0 = není ASCII znak (je to řídicí klávesa)
....... 1 = 08h (BS, Ctrl+H, BackSpace)
....... 2 = 09h (TAB, Ctrl+I, Tabulátor)
....... 3 = 0Ah (LF, Ctrl+J)
....... 4 = 0Dh (CR, Ctrl+M, Enter)
....... 5 = 1Bh (ESC, Ctrl+[, Esc)
....... 6 = 1Ch (FSEP, Ctrl+"\")
....... 7 = 1Dh (GSEP, Ctrl+])
....... 8 = 1Eh (RSEP, Ctrl+^)
....... 9 = 1Fh (USEP, Ctrl+_)
....... 10 = 20h (SPACE, mezerník)
....... 11 = 2Ah ("*")
....... 12 = 2Bh ("+")
....... 13 = 2Dh ("-")
....... 14 = 2Fh ("/")
....... 15 = 7Fh (DEL, Delete)
Modifikátor Alt typicky nastavuje znakovou hodnotu klávesy na 0 a mění klávesu na řídicí (bit 15 = 1). Modifikátor Ctrl maskuje znakovou hodnotu znakové klávesy maskou 1Fh, ostatní klávesy (s výsledkem maskování 0) mění na řídicí.
Získání scan kódu klávesy (0..7Fh,
funkce ScanFromKey):
code = (key >> 8) & 0x7F;
Získání rozšířeného scan kódu
klávesy (0..0FFh, funkce ExtFromKey):
code = (key >> 8) & 0x7F;
if (key < 0) code |= (key & 0x80);
Získání modifikátorů Ctrl, Alt, Shift
(0..7, funkce ModiFromKey):
if (key < 0) modi = ((key >> 4) & 7); else modi = 0;
Získání rozšířeného scan kódu s
modifikátory (0..7FFh, funkce ScanModiFromKey):
code = (key >> 8) & 0x7F;
if (key < 0) code |= (key & 0x80) | ((key & 0x70)
<< 4);
Získání znaku (0..0FFh, funkce CharFromKey):
if (key < 0) ascii = KeyCharTab[key & 0xF]; else ascii =
key & 0xFF
SetLang - set language
INPUT:
AL = new language (LANG_EN, LANG_CS)
NOTES: It temporaly disables interrupts.
GetLang - get current language
OUTPUT:
AL = current language (LANG_EN, LANG_CS)
TestChar - test if some character is ready
OUTPUT:
AL = character, 0=no character (CY)
CY = no character (AL = 0)
NOTES: Character is not removed from keyboard buffer. It temporaly disables interrupts.
GetChar - get character without waiting
OUTPUT:
AL = character, 0=no character (CY)
CY = no character (AL = 0)
NOTES: It temporaly disables interrupts.
GetCharWait - get character with waiting
OUTPUT:
AL = character (1..0ffh)
NOTES: It temporaly disables interrupts.
TestKey - test if some key is ready
OUTPUT:
AX = key code, 0=no key (CY)
CY = no key (AX = 0)
NOTES: Key is not removed from keyboard buffer. It temporaly disables interrupts.
GetKey - get key without waiting (without modifiers)
OUTPUT:
AX = key code, 0=no key (CY)
CY = no key (AX = 0)
NOTES: It temporaly disables interrupts.
GetKeyWait - get key with waiting (without modifiers)
OUTPUT:
AX = key code
NOTES: It temporaly disables interrupts.
KeyIsModi - check if key is modifier
INPUT:
AX = key code
OUTPUT:
NC = key is modifier (Cltr,ALt,Shift,x Lock)
TestKeyModi - test if some key is ready (incl. modifiers Ctrl,Alt...)
OUTPUT:
AX = key code, 0=no key (CY)
CY = no key (AX = 0)
NOTES: Key is not removed from keyboard buffer. It temporaly disables interrupts.
GetKeyModi - get key without waiting (including modifiers Ctrl, Alt...)
OUTPUT:
AX = key code, 0=no key (CY)
CY = no key (AX = 0)
NOTES: It temporaly disables interrupts.
GetKeyModiWait - get key with waiting (including modifiers Ctrl,Alt...)
OUTPUT:
AX = key code
NOTES: It temporaly disables interrupts.
KeyGetModi - get keyboard modifiers
OUTPUT:
AL = keyboard modifiers (KEY_MODI_SCROLL, ...)
KeySetModi - set keyboard modifiers (and LEDs)
INPUT:
AL = keyboard modifiers (KEY_MODI_SCROLL, ...)
NOTES: It temporaly disables interrupts.
KeyFlush - flush keyboard buffer
NOTES: It temporaly disables interrupts.
IsScrollLock - check Scroll Lock state
OUTPUT:
AL = Scroll Lock state (0=OFF and CY, 1=ON and NC)
CY = Scroll Lock is OFF (AL = 0)
IsNumLock - check Num Lock state
OUTPUT:
AL = Num Lock state (0=OFF and CY, 1=ON and NC)
CY = Num Lock is OFF (AL = 0)
IsCapsLock - check Caps Lock state
OUTPUT:
AL = Caps Lock state (0=OFF and CY, 1=ON and NC)
CY = Caps Lock is OFF (AL = 0)
IsInsert - check Insert state
OUTPUT:
AL = Insert state (0=OFF and CY, 1=ON and NC)
CY = Insert is OFF (AL = 0)
IsPause - check Pause state
OUTPUT:
AL = Pause state (0=OFF and CY, 1=ON and NC)
CY = Pause is OFF (AL = 0)
KeySetRate - set keyboard rate
INPUT:
AL = rate coefficient (0..31, 0->30 key/sec ... 31->2
key/sec)
AH = initial delay (0..3, 0->250 ms ... 3->1000 ms)
NOTES: It temporaly disables interrupts.
ReturnKey - return key into keyboard buffer ring (as first key)
INPUT:
AX = key code (should not be 0)
NOTES: It temporaly disables interrupts.
SetKey - write key into keyboard buffer ring (as last key)
INPUT:
AX = key code (should not be 0)
NOTES: It temporaly disables interrupts.
GetKeyMap - get bitmap of pressed keys
OUTPUT:
BX = pointer to 256-bit system key map, 1=key is pressed
NOTES: Use extended scan code as index into key bitmap.
KeyPressed - test if key is pressed
INPUT:
AL = key extended scan
code
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
CtrlPressed - test if left or right Ctrl is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
LCtrlPressed - test if left Ctrl is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
RCtrlPressed - test if right Ctrl is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
AltPressed - test if left or right Alt is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
LAltPressed - test if left Alt is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
RAltPressed - test if right Alt is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
ShiftPressed - test if left or right Shift is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
LShiftPressed - test if left Shift is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
RShiftPressed - test if right Shift is pressed
OUTPUT:
AL = key status, 1=pressed (NC), 0=released (CY)
CY = key is not pressed (AL = 0)
ScanFromKey - get base scan code from key code
INPUT:
AX = key code
OUTPUT:
AL = base scan code (0..7Fh)
ExtFromKey - get extended scan code from key code
INPUT:
AX = key code
OUTPUT:
AL = extended scan code (0..0FFh)
ModiFromKey - get modifiers from key code
INPUT:
AX = key code
OUTPUT:
AL = modifiers (0..7), B0=Shift, B1=Ctrl, B2=Alt
ScanModiFromKey - get extended scan code with modifiers from key code
INPUT:
AX = key code
OUTPUT:
AL = extended scan code (0..0FFh)
AH = modifiers (0..7), B0=Shift, B1=Ctrl, B2=Alt
CharFromKey - get character code from key code
INPUT:
AX = key code
OUTPUT:
AL = character (0..0ffh)
SetTimer2Gate - set Timer 2 gate
INPUT:
AL = Timer 2 gate 1=enable, 0=disable
NOTES: It temporaly disables interrupts. It takes aprox. 3 us.
GetTimer2Out - get Timer 2 output
OUTPUT:
AL = Timer 2 output (0 and CY, 1 and NC)
CY = output is 0 (AL = 0)
NOTES: Output from Timer 2 must be enabled using SetTimer2Gate. It takes aprox. 1.5 us.
SetSpeakerGate - set speaker gate
INPUT:
AL = speaker gate 1=enable, 0=disable
NOTES: It temporaly disables interrupts. It takes aprox. 3 us.
KEY_MODI_SCROLL: (=B0) Scroll Lock is ON
(LED hardcoded)
KEY_MODI_NUM: (=B1) Num Lock is ON (LED hardcoded)
KEY_MODI_CAPS: (=B2) Caps Lock is ON (LED hardcoded)
KEY_MODI_INSERT: (=B3) Insert is ON
KEY_MODI_PAUSE: (=B4) Pause is ON
LANG_EN: (=0) English
LANG_CZ: (=1) Czech (KEYBCS2)
KEYFLAG_SPEC: (=B15) control or special key
flag
KEYFLAG_EXT: (=B7) extended key flag
KEYFLAG_ALT: (=B6) Alt modifier flag
KEYFLAG_CTRL: (=B5) Ctrl modifier flag
KEYFLAG_SHIFT: (=B4) Shift modifier flag
KEYFLAG_MODI: (=B4+B5+B6) modifiers mask
KEYFLAG_TABNUM: (=16) number of table ASCII characters
KEYFLAG_MASK: (=0fh) table ASCII character mask
KEY_NONE: (=00h) no key
KEY_ESC: (=01h) Esc
KEY_1: (=02h) 1 !
KEY_2: (=03h) 2 @
KEY_3: (=04h) 3 #
KEY_4: (=05h) 4 $
KEY_5: (=06h) 5 %
KEY_6: (=07h) 6 ^
KEY_7: (=08h) 7 &
KEY_8: (=09h) 8 *
KEY_9: (=0Ah) 9 (
KEY_0: (=0Bh) 0 )
KEY_HYPHEN: (=0Ch) - _
KEY_EQU: (=0Dh) = +
KEY_BS: (=0Eh) BackSpace
KEY_TAB: (=0Fh) Tab
KEY_Q: (=10h) Q
KEY_W: (=11h) W
KEY_E: (=12h) E
KEY_R: (=13h) R
KEY_T: (=14h) T
KEY_Y: (=15h) Y
KEY_U: (=16h) U
KEY_I: (=17h) I
KEY_O: (=18h) O
KEY_P: (=19h) P
KEY_LBRACKET: (=1Ah) [ {
KEY_RBRACKET: (=1Bh) ] }
KEY_ENTER: (=1Ch) Enter
KEY_LCTRL: (=1Dh) Left Ctrl
KEY_CTRL: (=KEY_LCTRL) Ctrl base scan code
KEY_A: (=1Eh) A
KEY_S: (=1Fh) S
KEY_D: (=20h) D
KEY_F: (=21h) F
KEY_G: (=22h) G
KEY_H: (=23h) H
KEY_J: (=24h) J
KEY_K: (=25h) K
KEY_L: (=26h) L
KEY_SEMICOLON: (=27h) ; :
KEY_SQUOTE: (=28h) ' "
KEY_BACKQUOTE: (=29h) ` ~
KEY_LSHIFT: (=2Ah) Left Shift
KEY_BACKSLASH: (=2Bh) \ |
KEY_Z: (=2Ch) Z
KEY_X: (=2Dh) X
KEY_C: (=2Eh) C
KEY_V: (=2Fh) V
KEY_B: (=30h) B
KEY_N: (=31h) N
KEY_M: (=32h) M
KEY_COMMA: (=33h) , <
KEY_PERIOD: (=34h) . >
KEY_SLASH: (=35h) / ?
KEY_RSHIFT: (=36h) Right Shift
KEY_GREYSTAR: (=37h) Gray [*]
KEY_LALT: (=38h) Left Alt
KEY_ALT: (=KEY_LALT) Alt base scan code
KEY_SPACE: (=39h) SpaceBar
KEY_CAPSLOCK: (=3Ah) CapsLock
KEY_F1: (=3Bh) F1
KEY_F2: (=3Ch) F2
KEY_F3: (=3Dh) F3
KEY_F4: (=3Eh) F4
KEY_F5: (=3Fh) F5
KEY_F6: (=40h) F6
KEY_F7: (=41h) F7
KEY_F8: (=42h) F8
KEY_F9: (=43h) F9
KEY_F10: (=44h) F10
KEY_NUMLOCK: (=45h) NumLock
KEY_SCROLL: (=46h) ScrollLock
KEY_NUM7: (=47h) [7 Home]
KEY_NUM8: (=48h) [8 Up]
KEY_NUM9: (=49h) [9 PgUp]
KEY_GREYMINUS: (=4Ah) Gray [-]
KEY_NUM4: (=4Bh) [4 Left]
KEY_NUM5: (=4Ch) [5]
KEY_NUM6: (=4Dh) [6 Right]
KEY_GREYPLUS: (=4Eh) Gray [+]
KEY_NUM1: (=4Fh) [1 End]
KEY_NUM2: (=50h) [2 Down]
KEY_NUM3: (=51h) [3 PgDn]
KEY_NUM0: (=52h) [0 Ins]
KEY_DECIMAL: (=53h) [. Del]
KEY_SYSRQ: (=54h) SysRq (PrtScr with Alt)
KEY_BACKSLASH2 (=56h) \ | alternative
KEY_F11: (=57h) F11
KEY_F12: (=58h) F12
KEY_RESERVEDE0: (=60h) reserved, E0 prefix
KEY_RESERVEDE1: (=61h) reserved, E1 prefix
KEY_RESERVEDEE: (=6Eh) reserved, EE echo
KEY_RESERVEDFA: (=7Ah) reserved, FA acknowledge
KEY_RESERVEDFC: (=7Ch) reserved, FC failure
MF
KEY_RESERVEDFD: (=7Dh) reserved, FD failure AT
KEY_RESERVEDFE: (=7Eh) reserved, FE send error NACK
KEY_RESERVEDFF: (=7Fh) reserved, FF error, buffer full
Keyboard extended
SCAN codes (with E0 prefix):
(Some key send Ext. Left Shift (E0 2A), if Num Lock is ON)
KEY_MESSENGER: (=05h+B7) Messenger
KEY_EDITREDO: (=07h+B7) Edit Redo
KEY_EDITUNDO: (=08h+B7) Edit Undo
KEY_APPLEFT: (=09h+B7) Application Left
KEY_EDITPASTE: (=0Ah+B7) Edit Paste
KEY_SCRLNORM: (=0Bh+B7) Scroll Normal
KEY_MEDPREV: (=10h+B7) Media Previous
KEY_SCRLFAST: (=11h+B7) Scroll Fast
KEY_SCRLFASTER: (=12h+B7) Scroll Faster
KEY_WORD: (=13h+B7) Word
KEY_EXCEL: (=14h+B7) Excel
KEY_CALENDAR: (=15h+B7) Calendar
KEY_LOGOFF: (=16h+B7) Log Off
KEY_EDITCUT: (=17h+B7) Edit Cut
KEY_EDITCOPY: (=18h+B7) Edit Copy
KEY_MEDNEXT: (=19h+B7) Media Next
KEY_GREYENTER: (=1Ch+B7) Gray [Enter]
KEY_RCTRL: (=1Dh+B7) Right Ctrl (or with 0E1h with Pause/Break)
KEY_APPRIGHT: (=1Eh+B7) Application Right
KEY_SCRLFASTEST: (=1Fh+B7) Scroll Fastest
KEY_VOLMUTE: (=20h+B7) Volume Mute
KEY_CALCUL: (=21h+B7) Calculator
KEY_MEDPLAY: (=22h+B7) Media Play
KEY_SPELL: (=23h+B7) Spell, Wheel Press Down
KEY_MEDSTOP: (=24h+B7) Media Stop
KEY_LSHIFT2: (=2Ah+B7) Fake Left Shift (gen. by keyboard, ignored)
KEY_VOLDOWN: (=2Eh+B7) Volume -
KEY_VOLUP: (=30h+B7) Volume +
KEY_WWWHOME: (=32h+B7) WWW Home
KEY_GREYSLASH: (=35h+B7) Gray [/]
KEY_RSHIFT2: (=36h+B7) Fake Right Shift (gen. by keyboard,
ignored)
KEY_PRINT: (=37h+B7) PrintScr
KEY_RALT: (=38h+B7) Right Alt
KEY_HELP: (=3Bh+B7) Help
KEY_MYMUSIC: (=3Ch+B7) My Music
KEY_TASK: (=3Dh+B7) Task Pane
KEY_FILENEW: (=3Eh+B7) File New
KEY_FILEOPEN: (=3Fh+B7) File Open
KEY_FILECLOSE: (=40h+B7) File Close
KEY_EMAILREPLY: (=41h+B7) Email Reply
KEY_EMAILFRWRD: (=42h+B7) Email Forward
KEY_EMAILSEND: (=43h+B7) Email Send
KEY_PAUSE: (=45h+B7) Pause/Break (E1 1D 45
E1 9D C5)
KEY_BREAK: (=46h+B7) Break (Pause with Ctrl)
KEY_HOME: (=47h+B7) Home
KEY_UP: (=48h+B7) Up, Wheel Up
KEY_PAGEUP: (=49h+B7) Page Up
KEY_LEFT: (=4Bh+B7) Left
KEY_RIGHT: (=4Dh+B7) Right
KEY_END: (=4Fh+B7) End
KEY_DOWN: (=50h+B7) Down, Wheel Down
KEY_PAGEDOWN: (=51h+B7) Page Down
KEY_INSERT: (=52h+B7) Insert
KEY_DELETE: (=53h+B7) Delete
KEY_FILESAVE: (=57h+B7) File Save
KEY_FILEPRINT: (=58h+B7) File Print
KEY_LWIN: (=5Bh+B7) Left Win
KEY_RWIN: (=5Ch+B7) Right Win
KEY_MENU: (=5Dh+B7) Local Menu
KEY_POWER: (=5Eh+B7) Power
KEY_SLEEP: (=5Fh+B7) Sleep
KEY_RESERVEDXE0: (=60h+B7) reserved, E0 prefix
KEY_RESERVEDXE1: (=61h+B7) reserved, E1 prefix
KEY_WAKEUP: (=63h+B7) Wake Up
KEY_MYPIC: (=64h+B7) My Picture
KEY_FILESEARCH: (=65h+B7) File Search
KEY_WWWFAVOR: (=66h+B7) WWW Favorites
KEY_WWWREFRESH: (=67h+B7) WWW Refresh
KEY_WWWSTOP: (=68h+B7) WWW Stop
KEY_WWWFORWARD: (=69h+B7) WWW Forward
KEY_WWWBACK: (=6Ah+B7) WWW Back
KEY_MYCOMP: (=6Bh+B7) My Computer
KEY_EMAIL: (=6Ch+B7) E-mail
KEY_MEDIA: (=6Dh+B7) Media Select
KEY_RESERVEDXEE: (=6Eh+B7) reserved, EE echo
KEY_RESERVEDXFA: (=7Ah+B7) reserved, FA acknowledge
KEY_RESERVEDXFC: (=7Ch+B7) reserved, FC
failure MF
KEY_RESERVEDXFD: (=7Dh+B7) reserved, FD failure AT
KEY_RESERVEDXFE: (=7Eh+B7) reserved, FE send error NACK
KEY_RESERVEDXFF: (=7Fh+B7) reserved, FF error, buffer full