kbdout .equ 0f4h ; volba sloupce klávesnice kbdin .equ 0f5h ; čtení řádkové odezvy kbdcwr .equ 0f7h ; řídicí registr 8255 pro BEEPer RPT_DLY .equ 100 ; prodleva po stisku klávesy RPT_KAD .equ 15 ; prodleva mezi znaky při autorepeatu Cursor .equ 0c03eh ; adresa kurzoru (pro tisk v BIOSu) PrtOut .equ 8500h ; procedura BIOSu pro tisk .org 0 ; ****************************** ; Jednoduchá testovací procedura ; ****************************** mvi a,1ch ; CLS call PrtOut Start lda Cursor ; nastavit pozici tisku sui 8 ani 1fh adi 8 mov l,a mvi h,0e0h shld Cursor Wait call GetKey ; přečíst znak z klávesnice ana a ; test platného znaku jz Wait ; nebyl platný => čekej na takový call PrtOut ; tisk znaku call Chirp ; pípnout jmp Start ; tiskni a běhej ve smyčce ; ********************************************************** ; Ovladač alfanumerické klávesnice včetně funkce autorepeat. ; V ACC vrací ASCII kód klávesy (00h = není stisk) ; ********************************************************** GetKey call Inkey ; letmý test klávesnice mov a,d ana a jnz GetKeyPress ; něco bylo stisknuto lxi h,RptKad ; není stisk, mov a,m ana a rz ; klávesa už je mrtvá => neřeším xra a dcr m rnz ; běží rozestup ručního opakování sta GetKeyPress+1 ; nastavit "klávesa už není stisknuta" ret ; a tím povolit novou detekci GetKeyPress cpi 0 ; detekován stisk klávesy opakovaně? lxi h,RptDly jz GetKeyRepat ; ANO => pak běž na autorepeat sta GetKeyPress+1 ; když je změna, zaregistruj ji mvi m,RPT_DLY ; spustit čekání na AUTOREPEAT lxi h,RptKad mvi m,RPT_KAD ; kadence AUTOREPEATu ret ; ACC = platný znak - úvodní stisk GetKeyRepat xra a ; dokud není čas, znak se negeneruje dcr m ; odpočet doby po úvodním stisku rnz ; čekám na uplynutí této doby inr m ; pak už udržuju čítač na hodnotě 1 lxi h,RptKad dcr m ; rychlost autorepeatu rnz ; mezi autorepeat-znaky negeneruji nic mvi m,RPT_KAD ; reload autorepeat kadence lda GetKeyPress+1 ; a vracím opakovaně platný znak ret ; (fce autorepeat) RptDly .db 0 ; časovač úvodní prodlevy po stisku RptKad .db 0 ; časovač opakovaného generování znaku ; ********************************************* ; Letmý test klávesnice s konstantní délkou ; (ta je nutná kvůli isochronnímu autorepeatu). ; Vrací ASCII kód stisknutého znaku v reg. D ; (00h = není stisk). ; ********************************************* Inkey mvi d,0 ; neplatný znak (NULL) lxi h,tbKbdLayout ; rozložení znaků na klávesnici InkeyRow mov a,m ; načíst masku řádku inx h ; a posun na poslední znak ana a ; test masky rz ; 00h => konec tabulky mov c,a ; C = maska řádku mvi b,14 ; B = kód posledního sloupce InkeyCol mov a,b ; zvolený sloupec klávesnice out kbdout ; aktivovat in kbdin ; načíst řádkovou odezvu ori 80h ; odmaskovat nevyužitý bit cmp c ; test klávesy v řádku a SHIFT jnz InkeyNotLatch ; není stisk => přeskoč zápis mov d,m ; zapiš kód klávesy do D InkeyNotLatch inx h ; test předchozího sloupce dcr b ; odpočet platných 15 sloupců jp InkeyCol ; běž na další sloupec jmp InkeyRow ; nebo na další řádek ; ****************************************** ; Tabulka rozložení znaků na klávesnici ; Lze rozšířit i o kombinace s klávesou STOP ; ****************************************** tbKbdLayout .db 11111110b ; Kx .db 00h,00h,00h,00h,00h,00h,00h,00h .db 00h,00h,00h,00h,00h,00h,00h .db 11111101b ; 12345.. .db 00h,00h,00h,'}','_','0','9','8' .db '7','6','5','4','3','2','1' .db 11111011b ; QWERT.. .db 00h,00h,00h,'\','@','P','O','I' .db 'U','Z','T','R','E','W','Q' .db 11110111b ; ASDFG.. .db 00h,00h,00h,'[',':',';','L','K' .db 'J','H','G','F','D','S','A' .db 11101111b ; YXCVB.. .db 00h,00h,00h,00h,'/','.',',','M' .db 'N','B','V','C','X','Y',' ' .db 11011110b ; SHIFT + Kx .db 00h,00h,00h,00h,00h,00h,00h,00h .db 00h,00h,00h,00h,00h,00h,00h .db 11011101b ; SHIFT + 12345.. .db 00h,00h,00h,'{','=','-',')','(' .db 27h,'&','%','$','#',22h,'!' .db 11011011b ; SHIFT + QWERT.. .db 00h,00h,00h,'`','^','p','o','i' .db 'u','z','t','r','e','w','q' .db 11010111b ; SHIFT + ASDFG.. .db 00h,00h,00h,']','*','+','l','k' .db 'j','h','g','f','d','s','a' .db 11001111b ; YXCVB.. .db 00h,00h,00h,00h,'?','>','<','m' .db 'n','b','v','c','x','y',' ' .db 000h ; konec tabulky ; *************************** ; kliknutí při stisku klávesy ; *************************** Chirp mvi a,3 out kbdcwr ChirpDelay inr a jnz ChirpDelay mvi a,2 out kbdcwr ret .end