diff --git a/Source/HBIOS/duart.asm b/Source/HBIOS/duart.asm index b68347f0..126c817f 100644 --- a/Source/HBIOS/duart.asm +++ b/Source/HBIOS/duart.asm @@ -173,14 +173,15 @@ DUART_PREINIT: LD IY,DUART_CFG ; POINT TO START OF CFG TABLE DUART_PREINIT0: PUSH BC ; SAVE LOOP CONTROL - CALL DUART_INITUNIT ; HAND OFF TO GENERIC INIT CODE + CALL DUART_DETECT ; DETERMINE DUART TYPE POP BC ; RESTORE LOOP CONTROL -; - LD A,(IY + 1) ; GET THE DUART TYPE DETECTED + LD (IY + 1),A ; SAVE TYPE IN CONFIG TABLE OR A ; SET FLAGS JR Z,DUART_PREINIT1 ; SKIP IT IF NOTHING FOUND ; PUSH BC ; SAVE LOOP CONTROL + PUSH IY + POP DE ; DE := UNIT INSTANCE TABLE ADDRESS LD BC,DUART_FNTBL ; BC := FUNCTION TABLE ADDRESS CALL NZ,CIO_ADDENT ; ADD ENTRY IF DUART FOUND, BC:DE POP BC ; RESTORE LOOP CONTROL @@ -189,15 +190,25 @@ DUART_PREINIT1: LD DE,DUART_CFGSIZ ; SIZE OF CFG ENTRY ADD IY,DE ; BUMP IY TO NEXT ENTRY DJNZ DUART_PREINIT0 ; LOOP UNTIL DONE +; + LD B,DUART_CFGCNT ; LOOP CONTROL + LD IY,DUART_CFG ; POINT TO START OF CFG TABLE +DUART_PREINIT2: + PUSH BC ; SAVE LOOP CONTROL + CALL DUART_INITUNIT ; INITIALIZE UNIT + POP BC ; RESTORE LOOP CONTROL + LD DE,DUART_CFGSIZ ; SIZE OF CFG ENTRY + ADD IY,DE ; BUMP IY TO NEXT ENTRY + DJNZ DUART_PREINIT2 ; LOOP UNTIL DONE +; XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; ; DUART INITIALIZATION ROUTINE ; DUART_INITUNIT: - ; DETECT THE PRESENCE OF A DUART - CALL DUART_DETECT ; DETERMINE DUART TYPE - LD (IY + 1),A ; ALSO SAVE IN CONFIG TABLE + ; CHECK IF PORT IS PRESENT + LD A,(IY + 1) ; GET TYPE FROM CONFIG TABLE OR A ; SET FLAGS RET Z ; ABORT IF NOTHING THERE @@ -298,14 +309,36 @@ DUART_INITDEV: LD D,(IY + 8) ; HIGH BYTE ; DUART_INITDEV1: +#IF (DUART_DEBUG) + PRTS(" [TYPE=$") + + ; DEBUG: DUMP DUART TYPE + LD A,(IY + 1) + CALL PRTHEXBYTE + + ; DEBUG: DUMP PREVIOUS BAUD TABLE ENTRY + PRTS(" OLDBAUDTBL=$") + LD A,(IY + 5) + CALL PRTHEXBYTE +#ENDIF +; ; GET CLOCK SELECT FROM TABLE LD HL,DUART_BAUDTBL ; GET START OF TABLE IN HL LD A,D ; GET CONFIG MSB AND $1F ; ISOLATE ENCODED BAUD RATE CALL ADDHLA ; HL -> ENTRY LD A,(HL) ; A = ENTRY +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP BAUD TABLE ENTRY + PUSH AF + PRTS(" BAUDTBL=$") + CALL PRTHEXBYTE + POP AF +#ENDIF +; INC A ; A = $FF? - JR Z,DUART_INITDEVZ ; INVALID RATE, ERROR OUT + JP Z,DUART_INITDEVZ ; INVALID RATE, ERROR OUT DEC A ; GET ORIGINAL VALUE BACK ; ; GOT A VALID RATE, COMMIT NEW CONFIG @@ -330,6 +363,12 @@ DUART_INITDEV1: DUART_OUTP(DUART_CR) ; SET FOR RECEIVER LD A,DUART_CR_SET_TX_X DUART_OUTP(DUART_CR) ; SET FOR TRANSMITTER +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP BRG SELECT EXTEND BIT + PRTS(" X=1$") +#ENDIF +; JR DUART_INITDEV3 ; DUART_INITDEV2: @@ -339,16 +378,30 @@ DUART_INITDEV2: LD A,DUART_CR_CLR_TX_X DUART_OUTP(DUART_CR) ; CLEAR FOR TRANSMITTER ; +#IF (DUART_DEBUG) + ; DEBUG: DUMP BRG SELECT EXTEND BIT + PRTS(" X=0$") +#ENDIF +; DUART_INITDEV3: ; SET BRG CLOCK SELECT LD A,L ; GET BAUD TABLE ENTRY IN A AND $0F ; GET CLOCK SELECT BITS - LD L,A ; SAVE IT IN A + LD L,A ; SAVE IT IN L RLA RLA RLA RLA ; MOVE IT INTO THE HIGH NIBBLE OR L ; AND MERGE BACK IN LOW NIBBLE +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP CLOCK SELECT REGISTER + PUSH AF + PRTS(" CSR=$") + CALL PRTHEXBYTE + POP AF +#ENDIF +; DUART_OUTP(DUART_CSR) ; SET CLOCK SELECT ; ; SET PARITY AND WORD SIZE @@ -366,6 +419,15 @@ DUART_INITDEV3: AND %00000011 ; WORD LENGTH BITS ARE THE SAME OR B ; MERGE PARITY BITS OR DUART_MR1_RXRTS ; ALWAYS ENABLE RECEIVER CONTROL OF RTS +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP MODE REGISTER 1 + PUSH AF + PRTS(" MR1=$") + CALL PRTHEXBYTE + POP AF +#ENDIF +; DUART_OUTP(DUART_MR) ; WRITE MR1 (AND SET MR POINTER TO MR2) ; ; SET STOP BITS @@ -377,7 +439,16 @@ DUART_INITDEV3: ; DUART_INITDEV4: LD A,B ; GET MR2 IN A - OR DUART_MR2_TXCTS ; ALWAYS ENABLE CTS CONTROL OF TRANSMITTER + ;OR DUART_MR2_TXCTS ; ALWAYS ENABLE CTS CONTROL OF TRANSMITTER +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP MODE REGISTER 2 + PUSH AF + PRTS(" MR2=$") + CALL PRTHEXBYTE + POP AF +#ENDIF +; DUART_OUTP(DUART_MR) ; WRITE MR2 ; ; RE-ENABLE RECEIVER AND TRANSMITTER @@ -396,11 +467,22 @@ DUART_INITDEV5: ADD A,DUART_SOPR ; SET OUTPUT BITS LD C,A ; GET PORT IN C OUT (C),L ; OUTPUT PORT IS INVERTED BUT SO IS RTS +; +#IF (DUART_DEBUG) + PRTS(" SOPR=$") + LD A,L + CALL PRTHEXBYTE + PRTC(']') +#ENDIF ; XOR A ; SIGNAL SUCCESS RET ; DUART_INITDEVZ: +; +#IF (DUART_DEBUG) + PRTC(']') +#ENDIF ; INVALID BAUD RATE DEC A ; A WAS $00, GET BACK $FF RET ; RETURN ERROR STATUS @@ -491,7 +573,7 @@ DUART_DETECT: DUART_OUTP(DUART_CR) ; SEND COMMAND DUART_INP(DUART_MR) ; GET VALUE OF MR1 IN A CP 1 ; CHECK FOR TEST VALUE - JR NZ,DUART_DETECT_NONE ; NOPE, UNKNOWN DEVICE OR NOT PRESETN + JR NZ,DUART_DETECT_NONE ; NOPE, UNKNOWN DEVICE OR NOT PRESENT ; ; TEST FOR FUNCTIONAL GENERAL PURPOSE REG, IF NOT, WE HAVE A 2681 LD A,$5A ; LOAD TEST VALUE @@ -567,6 +649,13 @@ DUART_PRTCFG: LD E,(IY + 7) ; LOAD CONFIG LD D,(IY + 8) ; ... WORD TO DE CALL PS_PRTSC0 ; PRINT CONFIG +; +#IF (DUART_DEBUG) + ; DEBUG: DUMP BAUD TABLE ENTRY + PRTS(" BAUDTBL=$") + LD A,(IY + 5) + CALL PRTHEXBYTE +#ENDIF ; XOR A RET @@ -672,7 +761,7 @@ DUART1B_CFG: .DB 0 ; DUART TYPE (SET DURING INIT) .DB %00000011 ; MODULE 1, CHANNEL B .DB DUART1BASE ; BASE PORT (CHIP) - .DB DUART1BASE + $80 ; BASE PORT (CHANNEL) + .DB DUART1BASE + $08 ; BASE PORT (CHANNEL) .DB 0 ; BAUD TABLE ENTRY (SET DURING INITDEV) .DB 0 ; SHADOW ACR (SET DURING INITDEV) .DW DUART1BCFG ; LINE CONFIGURATION