Browse Source

Fix initialization table setup for duo recovery

pull/459/head
b1ackmai1er 1 year ago
parent
commit
65413e50d1
  1. 1
      Source/HBIOS/cfg_MASTER.asm
  2. 6
      Source/HBIOS/hbios.asm
  3. 49
      Source/HBIOS/kbd.asm
  4. 207
      Source/HBIOS/ps2iface.inc
  5. 2
      Source/HBIOS/tms.asm

1
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!!!)

6
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

49
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

207
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

2
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$")

Loading…
Cancel
Save