Browse Source

Initialize interrupt vector after kbd controller detected

pull/460/head
b1ackmai1er 1 year ago
parent
commit
1a73a9614b
  1. 43
      Source/HBIOS/kbd.asm
  2. 18
      Source/HBIOS/ps2iface.inc

43
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

18
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

Loading…
Cancel
Save