|
|
|
@ -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 |
|
|
|
|