mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Reintegrate wbw -> trunk
This commit is contained in:
108
Source/kbd.asm
108
Source/kbd.asm
@@ -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,20 +459,13 @@ 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
|
||||
AND KBD_EXT ; EXTENDED BIT SET?
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user