diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 696935d8..2030e570 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -75,11 +75,6 @@ KBD_IDLE .DB 0 ; IDLE COUNT ;__________________________________________________________________________________________________ ; KBD_INIT: -#IF ((INTMODE == 2) & INTPS2KBD) - CALL KBDQINIT ; INITIALIZE QUEUE - LD HL,KBD_INT ; INSTALL VECTOR - LD (IVT(INT_PS2KB)),HL ; IVT INDEX -#ENDIF CALL NEWLINE ; FORMATTING PRTS("KBD: IO=0x$") ; DISPLAY LD A,(IY+KBD_DAT) ; PORT SETTING @@ -101,7 +96,7 @@ KBD_INIT: ; LD A,$AA ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT - CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) + CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) ; CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE @@ -120,6 +115,12 @@ KBD_INIT1: LD DE,KBD_STR_MODEUNK KBD_INIT2: CALL WRITESTR +; +#IF ((INTMODE == 2) & INTPS2KBD) +; CALL KBDQINIT ; INITIALIZE QUEUE + LD HL,KBD_INT ; INSTALL VECTOR + LD (IVT(INT_PS2KB)),HL ; IVT INDEX +#ENDIF ; LD A,$60 ; SET COMMAND REGISTER CALL KBD_PUTCMD ; SEND IT @@ -244,7 +245,9 @@ KBD_PUTDATA2: ;__________________________________________________________________________________________________ KBD_GETDATA: ; -; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; DEPENDING ON ASSEMBLY CONFIGURATION KBD_GETDATA READS A BYTE FROM +; EITHER THE INTERRUPT QUEUE OR FROM THE KEYBOARD CONTROLLER PORT. ; LD B,KBD_WAITTO ; SETUP TO LOOP KBD_GETDATA0: @@ -267,6 +270,32 @@ KBD_GETDATA1: RET ; ;__________________________________________________________________________________________________ +KBD_GETDATA_P: +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT. +; + LD B,KBD_WAITTO ; SETUP TO LOOP +KBD_GETDATA0_P: + CALL KBD_IST_P ; GET INPUT REGISTER STATUS + JR NZ,KBD_GETDATA1_P ; BYTE PENDING, GO GET IT + CALL DELAY ; WAIT A BIT + DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED + XOR A ; NO DATA, RETURN ZERO + RET +KBD_GETDATA1_P: + CALL KBD_IN_P ; GET A KEY +#IF (KBDTRACE >= 2) + PUSH AF + CALL PC_SPACE + CALL PC_LT + CALL PRTHEXBYTE + POP AF +#ENDIF + OR A ; SET FLAGS + RET +; +;__________________________________________________________________________________________________ KBD_GETDATAX: ; ; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 2c9a285b..498eda69 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -56,11 +56,11 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; RESET THE QUEUE TO EMPTY ;__________________________________________________________________________________________________ ; -KBDQINIT: - XOR A - LD (KBDQGETX),A - LD (KBDQPUTX),A - RET +;KBDQINIT: +; XOR A +; LD (KBDQGETX),A +; LD (KBDQPUTX),A +; RET ; ;__________________________________________________________________________________________________ ; KEYBOARD INTERRUPT VECTOR @@ -146,13 +146,14 @@ KBDQPOP: ; RETURN A BYTE FROM THE KEYBOARD PORT ; KBD_IN: +#ENDIF +KBD_IN_P: EZ80_IO IN A,(C) ; GET THE DATA VALUE LD C,(IY+KBD_DAT) ; DATA PORT EZ80_IO IN A,(C) ; GET THE DATA VALUE RET -#ENDIF ; ;__________________________________________________________________________________________________ ; KEYBOARD INPUT STATUS @@ -166,13 +167,14 @@ KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE SUB (HL) RET #ELSE -KBD_IST: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING +KBD_IST: +#ENDIF +KBD_IST_P: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING LD C,(IY+KBD_ST) ; STATUS PORT EZ80_IO IN A,(C) ; GET STATUS AND $01 ; ISOLATE INPUT PENDING BIT RET -#ENDIF ; ;__________________________________________________________________________________________________ ; OUTPUT TO KEYBOARD COMMAND PORT