diff --git a/branches/wbw/Doc/RomWBW Architecture.pdf b/branches/wbw/Doc/RomWBW Architecture.pdf index f6e1ac3d..cff91572 100644 Binary files a/branches/wbw/Doc/RomWBW Architecture.pdf and b/branches/wbw/Doc/RomWBW Architecture.pdf differ diff --git a/branches/wbw/Doc/Source/RomWBW Architecture.docx b/branches/wbw/Doc/Source/RomWBW Architecture.docx index 8e3a5f9b..52505fca 100644 Binary files a/branches/wbw/Doc/Source/RomWBW Architecture.docx and b/branches/wbw/Doc/Source/RomWBW Architecture.docx differ diff --git a/branches/wbw/Source/kbd.asm b/branches/wbw/Source/kbd.asm index c8aba6fa..a060cfbd 100644 --- a/branches/wbw/Source/kbd.asm +++ b/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 diff --git a/branches/wbw/Source/ppk.asm b/branches/wbw/Source/ppk.asm index 1fa88fa0..64d6da5a 100644 --- a/branches/wbw/Source/ppk.asm +++ b/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