Browse Source

Finalized keyboard driver

Enhanced documentation
import/raw
wayne 13 years ago
parent
commit
97b2a16694
  1. BIN
      branches/wbw/Doc/RomWBW Architecture.pdf
  2. BIN
      branches/wbw/Doc/Source/RomWBW Architecture.docx
  3. 108
      branches/wbw/Source/kbd.asm
  4. 7
      branches/wbw/Source/ppk.asm

BIN
branches/wbw/Doc/RomWBW Architecture.pdf

Binary file not shown.

BIN
branches/wbw/Doc/Source/RomWBW Architecture.docx

Binary file not shown.

108
branches/wbw/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

7
branches/wbw/Source/ppk.asm

@ -133,6 +133,13 @@ PPK_READ:
JR PPK_READ ; AND LOOP
;
PPK_READ1:
LD A,(PPK_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,(PPK_SCANCODE) ; GET SCANCODE
OR E ; COMBINE WITH EXTENDED BIT
LD C,A ; STORE IT IN C FOR RETURN
LD A,(PPK_KEYCODE) ; GET KEYCODE
LD E,A ; SAVE IT IN E
LD A,(PPK_STATE) ; GET STATE FLAGS

Loading…
Cancel
Save