From 65413e50d13896c9d600a886c8fe96a05d224bab Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 1 Dec 2024 21:19:33 +0800 Subject: [PATCH] Fix initialization table setup for duo recovery --- Source/HBIOS/cfg_MASTER.asm | 1 + Source/HBIOS/hbios.asm | 6 +- Source/HBIOS/kbd.asm | 49 ++------- Source/HBIOS/ps2iface.inc | 207 ++++++++++++++++++++++++++++++++++++ Source/HBIOS/tms.asm | 2 +- 5 files changed, 223 insertions(+), 42 deletions(-) create mode 100644 Source/HBIOS/ps2iface.inc diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 61ac19ae..367a234d 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -64,6 +64,7 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 1000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +INTPS2KBD .EQU FALSE ; USE INTERRUPTS FOR PS2 KEYBOARD DEFSERCFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2f0f9e7a..8e4ecb25 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3392,7 +3392,7 @@ IS_REC_M1: CALL CALLLIST ; ;-------------------------------------------------------------------------------------------------- -; NV-SWITCH INITITIALISATION +; NV-SWITCH INITIALISATION ; Requires functional RTC NVR ;-------------------------------------------------------------------------------------------------- ; @@ -3818,7 +3818,7 @@ INITSYS4: ; HB_PCINIT_REC: ; - #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) + #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC) | (PLATFORM == PLT_DUO)) .DW UART_PREINIT ; .DW CALLDUMMY #ENDIF @@ -3827,7 +3827,7 @@ HB_PCINITRLEN .EQU (($ - HB_PCINIT_REC) / 2) ; HB_INIT_REC: ; - #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) + #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC) | (PLATFORM == PLT_DUO)) .DW UART_INIT .DW MD_INIT .DW PPIDE_INIT diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 75171cb0..dd30be91 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -59,10 +59,18 @@ KBD_IDLE .DB 0 ; IDLE COUNT DEVECHO "KBD: ENABLED\n" ; ;__________________________________________________________________________________________________ +; HARDWARE LEVEL INTERFACE +;__________________________________________________________________________________________________ +; +#INCLUDE "ps2iface.inc" +;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION ;__________________________________________________________________________________________________ ; KBD_INIT: +#IF (INTPS2KBD) + CALL KBDQINIT ; INITIALIZE QUEUE +#ENDIF CALL NEWLINE ; FORMATTING PRTS("KBD: IO=0x$") LD A,(IY+KBD_DAT) @@ -159,35 +167,6 @@ KBD_FLUSH: RET ; ;__________________________________________________________________________________________________ -; HARDWARE INTERFACE -;__________________________________________________________________________________________________ -; -;__________________________________________________________________________________________________ -KBD_IST: -; -; KEYBOARD INPUT STATUS -; 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 -; -;__________________________________________________________________________________________________ -KBD_OST: -; -; KEYBOARD OUTPUT STATUS -; A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE -; - LD C,(IY+KBD_ST) ; STATUS PORT - EZ80_IO - IN A,(C) ; GET STATUS - AND $02 ; ISOLATE OUTPUT EMPTY BIT - XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES - RET -; -;__________________________________________________________________________________________________ KBD_PUTCMD: ; ; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT @@ -211,9 +190,7 @@ KBD_PUTCMD1: CALL PC_GT CALL PRTHEXBYTE #ENDIF - LD C,(IY+KBD_CMD) ; COMMAND PORT - EZ80_IO - OUT (C),A ; WRITE IT + CALL KBD_CMDOUT ; OUTPUT CMD TO PORT KBD_PUTCMD2: XOR A ; SIGNAL SUCCESS RET @@ -241,9 +218,7 @@ KBD_PUTDATA1: CALL PC_GT CALL PRTHEXBYTE #ENDIF - LD C,(IY+KBD_DAT) ; DATA PORT - EZ80_IO - OUT (C),A ; WRITE IT + CALL KBD_DTAOUT ; WRITE IT KBD_PUTDATA2: XOR A ; SIGNAL SUCCESS RET @@ -262,9 +237,7 @@ KBD_GETDATA0: XOR A ; NO DATA, RETURN ZERO RET KBD_GETDATA1: - LD C,(IY+KBD_DAT) ; DATA PORT - EZ80_IO - IN A,(C) ; GET THE DATA VALUE + CALL KBD_IN ; GET A KEY #IF (KBDTRACE >= 2) PUSH AF CALL PC_SPACE diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc new file mode 100644 index 00000000..d5d93776 --- /dev/null +++ b/Source/HBIOS/ps2iface.inc @@ -0,0 +1,207 @@ +;__________________________________________________________________________________________________ +; HARDWARE INTERFACE FOR POLLED AND INTERRUPT DRIVEN PS2 KEYBOARD. +; +; IN POLLED MODE THE KEYBOARD DEVICE IS IDENTIFED BY THE TABLE POINTED TO BY IY +; IN INTERRUPT MODE THE KEYBOARD DEVICE IS UNKNOWN SO PREDEFINED PORT VALUES ARE USED. +;__________________________________________________________________________________________________ +; +#IF (INTPS2KBD) +KBDPORT .DB PS2PORT+1 ; READ - KEYBOARD STATUS : WRITE - COMMAND REGISTER + .DB PS2PORT ; READ / WRITE DATA PORT + +;__________________________________________________________________________________________________ +; KEYBOARD QUEUE FOR INTERRUPTS +;__________________________________________________________________________________________________ +; +; +KBDQSIZ .EQU 8 ; MUST BE POWER OF TWO, <=128 +KBDQGETX .DB 0 ; QUEUE INDEX +KBDQPUTX .DB 0 ; QUEUE INDEX + .DB $55 ; GUARD BYTE FOR DEBUGGING +KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER + .DB $AA ; GUARD BYTE FOR DEBUGGING + +KBDQINIT: ; RESET THE QUEUE TO EMPTY + XOR A + LD (KBDQGETX),A + LD (KBDQPUTX),A + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD INTERRUPT VECTOR +;__________________________________________________________________________________________________ +; +KBD_INT: + LD A,(KBDPORT+KBD_ST) ; READ CONTROLLER STATUS + LD C,A + IN A,(C) + AND 1 + RET Z + LD A,(KBDPORT+KBD_DAT) ; GET THE RESPONSE + LD C,A + IN A,(C) +; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE +; RET +; +;__________________________________________________________________________________________________ +; ADD A BYTE TO THE KEYBOARD QUEUE +;__________________________________________________________________________________________________ +; +KBDQPUSH: ; ADD A SCAN CODE TO THE QUEUE + PUSH AF + CALL KBDQFULL + JR Z,KBDQISF ; EXIT IF THE QUEUE IS FULL +; + LD HL,KBDQPUTX + LD A,(HL) ; CREATE QUEUE INDEX + AND KBDQSIZ-1 + INC (HL) ; UPDATE INDEX +; + LD HL,KBDQ ; INDEX INTO THE QUEUE + LD B,0 + LD C,A + ADD HL,BC + POP AF + LD (HL),A ; SAVE THE CHARACTER IN THE QUEUE +; + RET +; +KBDQISF:POP AF + RET + +KBDQFULL: ; RETURN Z IF QUEUE IS FULL + CALL KBDQLEN ; RETURN NZ IF STILL SPACE IN QUEUE + SUB KBDQSIZ + RET +#ENDIF +;__________________________________________________________________________________________________ +; KEYBOARD READ +;__________________________________________________________________________________________________ +; +#IF (INTPS2KBD) +; +; RETURN A BYTE TO FROM KEYBOARD QUEUE +; +KBD_IN: +KBDQPOP: + CALL KBDQLEN + RET Z ; EXIT IF THE QUEUE IS EMPTY +; + LD HL,KBDQGETX + LD A,(HL) ; CREATE QUEUE INDEX + AND KBDQSIZ-1 + INC (HL) ; UPDATE INDEX +; + LD HL,KBDQ ; INDEX INTO THE QUEUE + LD B,0 + LD C,A + ADD HL,BC + LD A,(HL) ; GET THE CHARACTER FROM THE QUEUE +; LD (HL),B ; DEBUG - CLEAN QUEUE +; + RET +; +#ELSE +; +; RETURN A BYTE FROM THE KEYBOARD PORT +; +KBD_IN: + 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 +;__________________________________________________________________________________________________ +; +#IF (INTPS2KBD) +KBD_IST: +KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE + LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE + LD HL,KBDQGETX + SUB (HL) + RET +#ELSE +KBD_IST: ; 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 +;__________________________________________________________________________________________________ +; +KBD_CMDOUT: + LD C,(IY+KBD_CMD) ; COMMAND PORT + EZ80_IO + OUT (C),A + RET +;__________________________________________________________________________________________________ +; OUTPUT TO KEYBOARD COMMAND DATA +;__________________________________________________________________________________________________ +; +KBD_DTAOUT: + LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO + OUT (C),A + RET +;__________________________________________________________________________________________________ +; KEYBOARD OUTPUT STATUS - A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE +;__________________________________________________________________________________________________ +; +KBD_OST: + LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO + IN A,(C) ; GET STATUS + AND $02 ; ISOLATE OUTPUT EMPTY BIT + XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES + RET +; +;__________________________________________________________________________________________________ +; DEBUG QUEUE +;__________________________________________________________________________________________________ +; +#IF ((INTPS2KBD & (1)) +KBDQDBG: + PUSH HL + PUSH DE + PUSH BC + PUSH AF + + CALL NEWLINE ; PRINT QUEUE CONTENTS WITH PRE AND POST GUARD BYTES + LD B,KBDQSIZ+2 + LD HL,KBDQ-1 +KBDQPRT: + LD A,(HL) + CALL PRTHEXBYTE + INC HL + DJNZ KBDQPRT + + LD A,' ' ; PRINT QUEUE INDEX + CALL COUT + LD A,(KBDQGETX) + CALL PRTHEXBYTE + + LD A,' ' ; PRINT QUEUE INDEX + CALL COUT + LD A,(KBDQPUTX) + CALL PRTHEXBYTE + + LD A,' ' ; PRINT # SCAN CODES IN QUEUE + CALL COUT + CALL KBDQLEN + CALL PRTHEXBYTE + CALL NEWLINE + + POP AF + POP BC + POP DE + POP HL + RET +#ENDIF diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index e8f57b37..858bd4c5 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -267,7 +267,7 @@ TMS_INIT: LD A,TMS_DATREG CALL PRTHEXBYTE CALL TMS_PROBE ; CHECK FOR HW EXISTENCE - JR Z,TMS_INIT1 ; CONTINUE IF PRESENT + JR TMS_INIT1 ; CONTINUE IF PRESENT ; ; *** HARDWARE NOT PRESENT *** PRTS(" NOT PRESENT$")