; Метки T0600 и A0900 выравниваются на границу xx00h! ; ; RST 20h. Драйвер клавиатуры KeybDrv:or a ; a=0 иниц. клаву jp z,init_keyb dec a ; a=1 очистить буфер клавы jr z,func_35 dec a ; a=2 опрос без ожидания jr z,func_31 ;dec a ; a=3 тест нажатия клавиши (NZ-да, Z-нет) jr func_33 ;ret ;///////////////////////////////////////////////////////////////////// ; Функция #31. Опрос клавиатуры без ожидания. ; ; выход: A=код символа ; D=скен-код, Е=код символа ; B=биты Ctrl,Alt,Shift ; Z - нет клавиш ;///////////////////////////////////////////////////////////////////// func_31:;ld hl,D0641 ;ld a,(D0640) ;cp (hl) ;ret z ; нет клавиши call A06FC ld a,e ret ;///////////////////////////////////////////////////////////////////// ; Функция #33. Получить состояние клавиатуры. ; Возвращает состояние клавиатуры на данный момент. ; ; выход: Z - нет символов в буфере ; B=биты Ctrl,Alt,Shift ;///////////////////////////////////////////////////////////////////// func_33:ld hl,D0641 ld a,(D0640) cp (hl) ld bc,(D0642) ; флаги клавы ld a,0 ret z ; z - не нажата dec a ; nz - нажата ret ;///////////////////////////////////////////////////////////////////// ; Функция #35. Очистить буфер клавиатуры ;///////////////////////////////////////////////////////////////////// func_35:ld a,(D0641) ld (D0640),a ret ds 0100h-$ ; выровнить на границу xx00h ; раб. ячейки клавы T0600: ds 64 ; D0640: db 0 ; тек. адрес конца кольц. буфера? D0641: db 0 ; адрес начала кольц. буфера? ; флаги клавы D0642: db 2 db 0 db 0 db 3 ; D0646: dw 0 A06DD: ld hl,D0640 ld a,(D0641) sub 4 and 3Fh ; ограничить адрес конца кольц. буфера cp (hl) jr z,A0716 ; конец кольц. буфера ld a,(hl) inc (hl) ; ячейка D0640 inc (hl) inc (hl) inc (hl) res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) ld l,a ld h,T0600 / 256 ; 06h ст. байт адреса ld (hl),e inc l ld (hl),d inc l ld (hl),b inc l ld (hl),c ret A06FC: ld hl,D0641 ld a,(D0640) cp (hl) ret z ; нет клавиши ld a,(hl) inc (hl) inc (hl) inc (hl) inc (hl) res 6,(hl) ; значение 40h -> 00h (сбр. конец кольц. буфера?) ld l,a ld h,T0600 / 256 ; 06h ст. байт адреса ld e,(hl) inc l ld d,(hl) inc l ld b,(hl) inc l ld c,(hl) ret ; бип A0716: ex af,af' bit 0,(ix+3) jr z,A0728 exx ld de,230 ; задержка внутр. цикла ld hl,50 ; задержка внеш. цикла call beep ; звук exx A0728: ex af,af' ret A072A: set 7,(ix+2) jr A0740 A0730: set 6,(ix+2) ; уст. бит "отжата" jr A0740 A0736: set 5,(ix+2) jr A0740 ; сканирование клавы keyb_scan: ld ix,D0642 ; флаги клавы A0740: in a,(19h) ; порт статуса bit 0,a ; 0-bit, байт пришел ? ret z ; нет ld a,1 ld (KeyPres+1),a ; драйвер мышки in a,(18h) cp 0F0h ; клавиша отжата ? jr z,A0730 ; да cp 0E0h jr z,A072A ;7bit cp 0E1h ; Pause jr z,A0736 ;5bit bit 6,(ix+2) jr nz,A07B3 ld l,a call A0990 call A0892 res 7,(ix+2) res 5,(ix+2) ret z call A09B4 ; ld hl,1C00h ; Caps Lock and a sbc hl,de call z,A07C8 ld hl,0B800h ; Space + Ctrl, Alt and a sbc hl,de call z,A07D1 ld hl,5000h ; Ins and a sbc hl,de call z,A07EF ld hl,4900h ; Num Lock and a sbc hl,de call z,A07F8 ; инв. 3-й бит (бит Num Lock) ld hl,0C900h ; Pause или Num Lock+80h (Num Lock+Ctrl/Atl/Shift) and a sbc hl,de call z,A0801 ld hl,4800h ; Scroll Lock and a sbc hl,de call z,A081E ; инв. 2-й бит (бит Scroll Lock) ld hl,0CF00h ; Del+80h (с Shift) and a sbc hl,de call z,reboot_system ; тест на Ctrl+Alt ld bc,(D0642) ; флаги клавы jp A06DD ;call A06DD ; сохр. de,bc в кольц. буфере клавы ;ret ; не оптимизить A07B3: res 6,(ix+2) ld l,a call A0990 call A0837 res 7,(ix+2) ld h,0 ld (D0646),hl ret A07C8: ld a,(ix+0) xor 1 ld (ix+0),a ret A07D1: bit 5,(ix+1) ; бит Ctrl ret z ld a,(ix+0) xor 80h ; 7-й бит (1=RUS,0=LAT) ld (ix+0),a bit 1,(ix+3) ret z exx ld de,190 ; задержка внутр. цикла ld hl,20 ; задержка внеш. цикла call beep ; звук exx ret A07EF: ld a,(ix+0) xor 2 ; 1-й бит (Ins) ld (ix+0),a ret A07F8: ld a,(ix+0) xor 8 ; 3-й бит ld (ix+0),a ret ; Pause или Num Lock + Ctrl, Atl, Shift A0801: bit 5,(ix+1) ; бит Ctrl ? ret z ; нет ; pop hl ; ?? ld a,(ix+0) xor 40h ; 6-й бит ld (ix+0),a bit 6,(ix+0) ret z ei A0815: halt bit 6,(ix+0) jr nz,A0815 di ret A081E: ld a,(ix+0) xor 4 ld (ix+0),a ret ; клавиша Del reboot_system: ;bit 5,(ix+1) ; бит Ctrl ;ret z ;bit 4,(ix+1) ; бит Alt ;ret z ld c,00110000b ; биты Ctrl, Alt ld a,(ix+1) and c cp c ret nz ; софтовый ребут xor a ld bc,01FDh rst 08h ret ;db 0,0; A0837: ld a,l cp 37h jr nz,A084A res 2,(ix+1) bit 0,(ix+1) ret nz res 4,(ix+1) ret ; A084A: cp 39h jr nz,A085C res 0,(ix+1) bit 2,(ix+1) ret nz res 4,(ix+1) ret ; A085C: cp 36h jr nz,A086E res 3,(ix+1) bit 1,(ix+1) ret nz res 5,(ix+1) ret ; A086E: cp 3Ah jr nz,A0880 res 1,(ix+1) bit 3,(ix+1) ret nz res 5,(ix+1) ret ; A0880: cp 29h jr nz,A0889 res 7,(ix+1) ret ; A0889: cp 34h ;jr nz,A0891 ret nz res 6,(ix+1) ret ;A0891: ret A0892: ld a,l cp 37h jr nz,A08A0 set 2,(ix+1) set 4,(ix+1) ret ; A08A0: cp 39h jr nz,A08AD set 0,(ix+1) set 4,(ix+1) ret ; A08AD: cp 36h jr nz,A08BA set 3,(ix+1) set 5,(ix+1) ret ; A08BA: cp 3Ah jr nz,A08C7 set 1,(ix+1) set 5,(ix+1) ret ; A08C7: cp 29h jr nz,A08D0 set 7,(ix+1) ret ; A08D0: cp 34h ;jr nz,A08D8 ret nz set 6,(ix+1) ret ;A08D8: ret A0990: bit 7,(ix+2) jr z,A09B0 cp 11h ld l,39h ret z cp 14h ld l,3Ah ret z cp 5Ah ld l,4Eh ret z cp 4Ah ld l,4Ah ret z cp 7Ch ld l,47h ret z ld l,a A09B0: ld h,A0900 / 256 ; 09h ст. байт адреса ld l,(hl) ret A09B4: ld d,l ld e,0 bit 7,(ix+0) jp nz,A09F6 ld a,(ix+1) and 0C0h jr nz,A09E3 set 7,d bit 4,(ix+1) ret nz bit 5,(ix+1) ret nz ld d,l bit 0,(ix+0) ld bc,T0B75 jr nz,A09DE ld bc,T0AC1 A09DE: ld h,0 add hl,bc ld e,(hl) ret ; A09E3: ld bc,T0B1B bit 0,(ix+0) jr z,A09EF ld bc,T0BCF A09EF: ld h,0 add hl,bc ld e,(hl) set 7,d ret ; A09F6: ld a,(ix+1) and 0C0h jr nz,A0A1B set 7,d bit 4,(ix+1) ret nz bit 5,(ix+1) ret nz ld d,l bit 0,(ix+0) ld bc,T0CDD jr nz,A0A16 ld bc,T0C29 A0A16: ld h,0 add hl,bc ld e,(hl) ret ; A0A1B: ld bc,T0C83 bit 0,(ix+0) jr z,A0A27 ld bc,T0D37 A0A27: ld h,0 add hl,bc ld e,(hl) set 7,d ret ds 0400h-$ ; выровнить на границу xx00h ; Должно начинаться с границы xx00h! ; 144 байта. A0900: db 0,43h,0,3Fh,3Dh,3Bh,3Ch,46h db 0,44h,42h,40h,3Eh,0Fh,0,0 db 0 db 37h,29h,0 db 36h,10h,2,0 db 0,0,2Ah,1Eh,1Dh,11h,3,0 db 0,2Ch,2Bh,1Fh,12h,5,4,0 db 0,38h,2Dh,20h,14h,13h,6,0 db 0,2Fh,2Eh,22h,21h,15h,7,0 db 0 A0939: db 0 A093A: db 30h,23h,16h,8,9,0,0,31h db 24h,17h,18h,0Bh,0Ah A0947: db 0,0,32h A094A: db 33h,25h,26h,19h A094E: db 0Ch,0,0,0,27h,0,1Ah,0Dh db 0,0,1Ch,34h db 28h,1Bh,0,35h db 0,0,0,0,0,0,0,0 db 0Eh,0,0,51h,0,54h,57h,0 db 0,0,50h,4Fh,52h,55h,56h,58h db 1,49h,45h,4Dh,53h,4Ch db 4Bh,59h db 48h,0,0,0,0,41h,0,0 db 0,0,0,0,0,0,0,0 db 0,0 ; Таблица кодов клавиш (8 секций по 90 байт) T0AC1: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 db 9,"q","w","e","r","t","y","u","i","o","p","[","]" db 0 ; CapsLock db "a","s","d","f","g","h","j","k","l",";","'",0Dh db 0 ; Left Shift db "z","x","c","v","b","n","m",",",".","/" db 0 ; Right Shift db '\' db 0 ; Ctrl db 0 ; Alt db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0B1B: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 db 9,"Q","W","E","R","T","Y","U","I","O","P","{","}" db 0 ; CapsLock db "A","S","D","F","G","H","J","K","L",":",'"',0Dh db 0 ; Left Shift db "Z","X","C","V","B","N","M","<",">","?" db 0 ; Right Shift db "|",0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0B75: db "`",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 db 9,"Q","W","E","R","T","Y","U","I","O","P","[","]",0 db "A","S","D","F","G","H","J","K","L",";","'",0Dh,0 db "Z","X","C","V","B","N","M",",",".","/",0 db '\',0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0BCF: db "~",1Bh,"!","@","#","$","%","^","&","*","(",")","_","+",8 db 9,"q","w","e","r","t","y","u","i","o","p","{","}",0 db "a","s","d","f","g","h","j","k","l",":",'"',0Dh,0 db "z","x","c","v","b","n","m","<",">","?",0 db "|",0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0C29: db "ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 db "я","ч","с","м","и","т","ь","б","ю",".",0 db '\',0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0C83: db "Ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 db "Я","Ч","С","М","И","Т","Ь","Б","Ю",",",0 db "|",0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0CDD: db "Ё",1Bh,"1","2","3","4","5","6","7","8","9","0","-","=",8 db 9,"Й","Ц","У","К","Е","Н","Г","Ш","Щ","З","Х","Ъ",0 db "Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э",0Dh,0 db "Я","Ч","С","М","И","Т","Ь","Б","Ю",".",0 db '\',0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 ; NumLock db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ; ; T0D37: db "ё",1Bh,"!",'"',"#","$",":",",",".",";","?","%","_","+",8 db 9,"й","ц","у","к","е","н","г","ш","щ","з","х","ъ",0 db "ф","ы","в","а","п","р","о","л","д","ж","э",0Dh,0 db "я","ч","с","м","и","т","ь","б","ю",",",0 db "|",0,0 db 20h ; Space db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; доп. поле db 0 db "/","*","-","+",0Dh db 0,0,0,0,0,0,0,0,0,0,0 ;------------------------------------------------- ; Иниц. LPT-портов для клавы ;------------------------------------------------- init_keyb: ld a,0 out (19h),a ld a,1 out (19h),a ld a,0 out (19h),a ld a,3 out (19h),a ld a,0C1h out (19h),a ld a,4 out (19h),a ld a,7 out (19h),a ld a,5 out (19h),a ld a,62h out (19h),a ret ; Звук. ; вход: hl=задержка внеш. цикла ; de=задержка внутр. цикла beep: ld a,10h out (0FEh),a ; порт ld b,d ld c,e dec bc ld a,b or c jr nz,$-3 ld a,0 out (0FEh),a ; порт ld b,d ld c,e dec bc ld a,b or c jr nz,$-3 dec hl ld a,h or l jr nz,beep ret