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: 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 CALL NEWLINE ; FORMATTING
PRTS("KBD: IO=0x$") ; DISPLAY PRTS("KBD: IO=0x$") ; DISPLAY
LD A,(IY+KBD_DAT) ; PORT SETTING LD A,(IY+KBD_DAT) ; PORT SETTING
@ -101,7 +96,7 @@ KBD_INIT:
; ;
LD A,$AA ; CONTROLLER SELF TEST LD A,$AA ; CONTROLLER SELF TEST
CALL KBD_PUTCMD ; SEND IT 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? CP $55 ; IS IT THERE?
JR Z,KBD_INIT1 ; IF SO, CONTINUE JR Z,KBD_INIT1 ; IF SO, CONTINUE
@ -120,6 +115,12 @@ KBD_INIT1:
LD DE,KBD_STR_MODEUNK LD DE,KBD_STR_MODEUNK
KBD_INIT2: KBD_INIT2:
CALL WRITESTR 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 LD A,$60 ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT CALL KBD_PUTCMD ; SEND IT
@ -244,7 +245,9 @@ KBD_PUTDATA2:
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
KBD_GETDATA: 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 LD B,KBD_WAITTO ; SETUP TO LOOP
KBD_GETDATA0: KBD_GETDATA0:
@ -267,6 +270,32 @@ KBD_GETDATA1:
RET 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: KBD_GETDATAX:
; ;
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT ; 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 ; 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 ; KEYBOARD INTERRUPT VECTOR
@ -146,13 +146,14 @@ KBDQPOP:
; RETURN A BYTE FROM THE KEYBOARD PORT ; RETURN A BYTE FROM THE KEYBOARD PORT
; ;
KBD_IN: KBD_IN:
#ENDIF
KBD_IN_P:
EZ80_IO EZ80_IO
IN A,(C) ; GET THE DATA VALUE IN A,(C) ; GET THE DATA VALUE
LD C,(IY+KBD_DAT) ; DATA PORT LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO EZ80_IO
IN A,(C) ; GET THE DATA VALUE IN A,(C) ; GET THE DATA VALUE
RET RET
#ENDIF
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; KEYBOARD INPUT STATUS ; KEYBOARD INPUT STATUS
@ -166,13 +167,14 @@ KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE
SUB (HL) SUB (HL)
RET RET
#ELSE #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 LD C,(IY+KBD_ST) ; STATUS PORT
EZ80_IO EZ80_IO
IN A,(C) ; GET STATUS IN A,(C) ; GET STATUS
AND $01 ; ISOLATE INPUT PENDING BIT AND $01 ; ISOLATE INPUT PENDING BIT
RET RET
#ENDIF
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; OUTPUT TO KEYBOARD COMMAND PORT ; OUTPUT TO KEYBOARD COMMAND PORT

Loading…
Cancel
Save