|
|
|
@ -76,7 +76,8 @@ KBD_INIT: |
|
|
|
CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) |
|
|
|
LD A,$60 ; SET COMMAND REGISTER |
|
|
|
CALL KBD_PUTCMD ; SEND IT |
|
|
|
LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS |
|
|
|
; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS |
|
|
|
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS |
|
|
|
CALL KBD_PUTDATA ; SEND IT |
|
|
|
|
|
|
|
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED |
|
|
|
@ -119,7 +120,6 @@ KBD_STAT3: |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
KBD_READ: |
|
|
|
; CALL KBD_STAT ; CHECK TO SEE IF KEY READY |
|
|
|
LD A,(KBD_STATUS) ; GET STATUS |
|
|
|
AND KBD_KEYRDY ; ISOLIATE KEY READY BIT |
|
|
|
JR NZ,KBD_READ1 ; READY, GO GET THE KEY AND RETURN |
|
|
|
@ -127,6 +127,13 @@ KBD_READ: |
|
|
|
JR KBD_READ ; AND LOOP |
|
|
|
; |
|
|
|
KBD_READ1: |
|
|
|
LD A,(KBD_STATE) ; GET STATE |
|
|
|
AND $01 ; ISOLATE EXTENDED SCANCODE BIT |
|
|
|
RRCA ; ROTATE IT TO HIGH ORDER BIT |
|
|
|
LD E,A ; SAVE IT IN E FOR NOW |
|
|
|
LD A,(KBD_SCANCODE) ; GET SCANCODE |
|
|
|
OR E ; COMBINE WITH EXTENDED BIT |
|
|
|
LD C,A ; STORE IT IN C FOR RETURN |
|
|
|
LD A,(KBD_KEYCODE) ; GET KEYCODE |
|
|
|
LD E,A ; SAVE IT IN E |
|
|
|
LD A,(KBD_STATE) ; GET STATE FLAGS |
|
|
|
@ -252,13 +259,13 @@ KBD_RESET: |
|
|
|
CALL KBD_PUTDATA ; SEND IT |
|
|
|
CALL KBD_GETDATA ; GET THE ACK |
|
|
|
LD B,0 ; SETUP LOOP COUNTER |
|
|
|
PPK_RESET0: |
|
|
|
KBD_RESET0: |
|
|
|
PUSH BC ; PRESERVE COUNTER |
|
|
|
CALL KBD_GETDATA ; TRY TO GET THE RESPONSE |
|
|
|
POP BC ; RECOVER COUNTER |
|
|
|
JR NZ,PPK_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP |
|
|
|
DJNZ PPK_RESET0 ; LOOP TILL COUNTER EXHAUSTED |
|
|
|
PPK_RESET1: |
|
|
|
JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP |
|
|
|
DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED |
|
|
|
KBD_RESET1: |
|
|
|
LD A,B |
|
|
|
XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...) |
|
|
|
RET ; DONE |
|
|
|
@ -417,20 +424,14 @@ KBD_DEC1: ; PROCESS NEXT SCANCODE |
|
|
|
LD (KBD_SCANCODE),A ; SAVE SCANCODE |
|
|
|
|
|
|
|
KBD_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES |
|
|
|
; |
|
|
|
; KEYBOARD INSERTION DETECTION HAS BEEN REMOVED BELOW BECAUSE THE SCAN CODE |
|
|
|
; OF $AA IS AMBIGUOUS WHEN SCAN SET 2 IS IN USE. $AA COULD MEAN EITHER A LEFT |
|
|
|
; SHIFT KEY BREAK EVENT OR A KEYBOARD INSERTION EVENT. OBVIOUSLY, A SHIFT BREAK |
|
|
|
; EVENT CANNOT BE ALLOWED TO TRIGGER A KEYBOARD RESET, SO WE CANNOT INTERPRET |
|
|
|
; $AA AS A KEYBOARD INSERTION. UNFORTUNATE, BUT IS SEE NO ALTERNATIVES. |
|
|
|
; |
|
|
|
; LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE |
|
|
|
; CP $AA ; KEYBOARD INSERTION? |
|
|
|
; JR NZ,KBD_DEC3 ; NOPE, BYPASS |
|
|
|
; CALL KBD_RESET ; RESET KEYBOARD |
|
|
|
; CALL KBD_SETLEDS ; SET LEDS |
|
|
|
; CALL KBD_SETRPT ; SET REPEAT RATE |
|
|
|
; JP KBD_DECNEW ; RESTART THE ENGINE |
|
|
|
LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE |
|
|
|
CP $AA ; KEYBOARD INSERTION? |
|
|
|
JR NZ,KBD_DEC3 ; NOPE, BYPASS |
|
|
|
CALL LDELAY ; WAIT A BIT |
|
|
|
CALL KBD_RESET ; RESET KEYBOARD |
|
|
|
CALL KBD_SETLEDS ; SET LEDS |
|
|
|
CALL KBD_SETRPT ; SET REPEAT RATE |
|
|
|
JP KBD_DECNEW ; RESTART THE ENGINE |
|
|
|
|
|
|
|
KBD_DEC3: ; DETECT AND HANDLE SCANCODE PREFIXES |
|
|
|
LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE |
|
|
|
@ -448,8 +449,8 @@ KBD_DEC3B: ; HANDLE SCANCODE PREFIX $E1 (PAUSE KEY) |
|
|
|
JR NZ,KBD_DEC4 ; NOPE MOVE ON |
|
|
|
LD A,$EE ; MAP TO KEYCODE $EE |
|
|
|
LD (KBD_KEYCODE),A ; SAVE IT |
|
|
|
; SWALLOW NEXT 5 SCANCODES |
|
|
|
LD B,5 ; LOOP 5 TIMES |
|
|
|
; SWALLOW NEXT 7 SCANCODES |
|
|
|
LD B,7 ; LOOP 5 TIMES |
|
|
|
KBD_DEC3B1: |
|
|
|
PUSH BC |
|
|
|
CALL KBD_GETDATA ; RETRIEVE NEXT SCANCODE |
|
|
|
@ -458,19 +459,12 @@ KBD_DEC3B1: |
|
|
|
JP KBD_DEC6 ; RESUME AFTER MAPPING |
|
|
|
|
|
|
|
KBD_DEC4: ; DETECT AND FLAG BREAK EVENT |
|
|
|
LD A,(KBD_SCANCODE) |
|
|
|
LD E,A ; SAVE SCANCODE IN E |
|
|
|
RES 7,A ; CLEAR THE BREAK BIT FROM THE KEYCODE |
|
|
|
LD (KBD_SCANCODE),A ; SAVE UPDATED SCANCODE |
|
|
|
LD A,E ; RECOVER ORIGINAL SCANCODE |
|
|
|
AND $80 ; ISOLATE BREAK BIT |
|
|
|
RLCA ; ROTATE BIT TO POSITION... |
|
|
|
RLCA ; OF BREAK BIT IN STATUS |
|
|
|
LD E,A ; SAVE IT IN E |
|
|
|
LD A,(KBD_STATUS) ; GET THE STATUS FLAGS |
|
|
|
AND ~KBD_BREAK ; CLEAR THE BREAK BIT |
|
|
|
OR E ; OR IN NEW BREAK BIT |
|
|
|
LD (KBD_STATUS),A ; SAVE IT |
|
|
|
CP $F0 ; BREAK (KEY UP) PREFIX? |
|
|
|
JR NZ,KBD_DEC5 ; NOPE MOVE ON |
|
|
|
LD A,(KBD_STATUS) ; GET STATUS |
|
|
|
OR KBD_BREAK ; SET BREAK BIT |
|
|
|
LD (KBD_STATUS),A ; SAVE STATUS |
|
|
|
JR KBD_DEC1 ; LOOP TO DO NEXT SCANCODE |
|
|
|
|
|
|
|
KBD_DEC5: ; MAP SCANCODE TO KEYCODE |
|
|
|
LD A,(KBD_STATUS) ; GET STATUS |
|
|
|
@ -687,30 +681,36 @@ KBD_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
KBD_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE |
|
|
|
.DB $FF,$1B,'1','2','3','4','5','6','7','8','9','0','-','=',$08,$09 |
|
|
|
.DB 'q','w','e','r','t','y','u','i','o','p','[',']',$0D,$B2,'a','s' |
|
|
|
.DB 'd','f','g','h','j','k','l',';',$27,'`',$B0,'\','z','x','c','v' |
|
|
|
.DB 'b','n','m',',','.','/',$B1,$CC,$B4,' ',$BC,$E0,$E1,$E2,$E3,$E4 |
|
|
|
.DB $E5,$E6,$E7,$E8,$E9,$BD,$BE,$C6,$C7,$C8,$CD,$C3,$C4,$C5,$CE,$C0 |
|
|
|
.DB $C1,$C2,$C9,$CA,$EC,$FF,$FF,$FA,$EB |
|
|
|
.DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF |
|
|
|
.DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF |
|
|
|
.DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF |
|
|
|
.DB $FF,'n','b','h','g','y','6',$FF,$FF,$FF,'m','j','u','7','8',$FF |
|
|
|
.DB $FF,',','k','i','o','0','9',$FF,$FF,'.','/','l',';','p','-',$FF |
|
|
|
.DB $FF,$FF,$27,$FF,'[','=',$FF,$FF,$BC,$B1,$0D,']',$FF,'\',$FF,$FF |
|
|
|
.DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,$FF,$FF,$FF |
|
|
|
.DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF |
|
|
|
.DB $FF,$FF,$FF,$E6,$EC |
|
|
|
; |
|
|
|
KBD_MAPSIZ .EQU ($ - KBD_MAPSTD) |
|
|
|
; |
|
|
|
KBD_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE |
|
|
|
.DB $FF,$1B,'!','@','#','$','%','^','&','*','(',')','_','+',$08,$09 |
|
|
|
.DB 'Q','W','E','R','T','Y','U','I','O','P','{','}',$0D,$B2,'A','S' |
|
|
|
.DB 'D','F','G','H','J','K','L',':',$22,'~',$B0,'|','Z','X','C','V' |
|
|
|
.DB 'B','N','M','<','>','?',$B1,$DC,$B4,' ',$BC,$E0,$E1,$E2,$E3,$E4 |
|
|
|
.DB $E5,$E6,$E7,$E8,$E9,$BD,$BE,$D6,$D7,$D8,$DD,$D3,$D4,$D5,$DE,$D0 |
|
|
|
.DB $D1,$D2,$D9,$DA,$EC,$FF,$FF,$FA,$EB |
|
|
|
.DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF |
|
|
|
.DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Z','S','A','W','@',$FF |
|
|
|
.DB $FF,'C','X','D','E','$','#',$FF,$FF,' ','V','F','T','R','%',$FF |
|
|
|
.DB $FF,'N','B','H','G','Y','^',$FF,$FF,$FF,'M','J','U','&','*',$FF |
|
|
|
.DB $FF,'<','K','I','O',')','(',$FF,$FF,'>','?','L',':','P','_',$FF |
|
|
|
.DB $FF,$FF,$22,$FF,'{','+',$FF,$FF,$BC,$B1,$0D,'}',$FF,'|',$FF,$FF |
|
|
|
.DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,$FF,$FF,$FF |
|
|
|
.DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF |
|
|
|
.DB $FF,$FF,$FF,$E6,$EC |
|
|
|
; |
|
|
|
KBD_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES |
|
|
|
.DB $38,$B5, $1D,$B3, $5B,$B6, $5C,$B7 |
|
|
|
.DB $5D,$EF, $5E,$FA, $5F,$FB, $35,$CB |
|
|
|
.DB $1C,$CF, $63,$FC, $4F,$F3, $4B,$F8 |
|
|
|
.DB $47,$F2, $52,$F0, $53,$F1, $50,$F7 |
|
|
|
.DB $4D,$F9, $48,$F6, $51,$F5, $37,$ED |
|
|
|
.DB $49,$F4, $46,$FD, $00,$00 |
|
|
|
.DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7 |
|
|
|
.DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB |
|
|
|
.DB $5A,$CF, $5E,$FC, $69,$F3, $6B,$F8 |
|
|
|
.DB $6C,$F2, $70,$F0, $71,$F1, $72,$F7 |
|
|
|
.DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED |
|
|
|
.DB $7D,$F4, $7E,$FD, $00,$00 |
|
|
|
; |
|
|
|
KBD_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES |
|
|
|
.DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D |
|
|
|
|