|
|
|
@ -562,6 +562,29 @@ DUART_DEVICE: |
|
|
|
; |
|
|
|
DUART_DETECT: |
|
|
|
; |
|
|
|
; FIRST SEE IF IT LOOKS LIKE A 16X50-STYLE UART |
|
|
|
LD A,(IY + 3) ; GET BASE PORT OF CHIP |
|
|
|
ADD A,6 ; BASE + 6 = CTU (DUART), MSR (1ST 16X50) |
|
|
|
LD B,A ; B := CTU/MSR PORT ADDRESS |
|
|
|
INC A ; BASE + 7 = CTL (DUART), SCR (1ST 16X50) |
|
|
|
LD D,A ; D := CTL/SCR PORT ADDRESS |
|
|
|
ADD A,7 ; BASE + 14 = STCR (DUART), MSR (2ND 16X50) |
|
|
|
LD E,A ; E := STCR/MSR PORT ADDRESS |
|
|
|
LD A,$A5 ; TEST VALUE |
|
|
|
LD C,B ; CTU |
|
|
|
OUT (C),A ; WRITE TEST VALUE TO CTU |
|
|
|
LD A,$FF ; LARGE VALUE TO PREVENT CTL FROM ROLLING OVER WHILE WE TEST |
|
|
|
LD C,D ; CTL |
|
|
|
OUT (C),A ; WRITE LARGE VALUE TO CTL |
|
|
|
LD C,E ; STCR |
|
|
|
IN A,(C) ; START COUNTER/TIMER (LATCH CTU, CTL) |
|
|
|
LD C,B ; CTU |
|
|
|
IN A,(C) ; READ BACK TEST VALUE |
|
|
|
CP $A5 ; CHECK FOR TEST VALUE |
|
|
|
JR NZ,DUART_DETECT_NONE ; NO, PROBABLY NOT A DUART |
|
|
|
IN A,(C) ; CHECK TEST VALUE AGAIN, |
|
|
|
CP $A5 ; ... IN RARE CASE DELTAS IN MSR WERE SET TO OUR TEST |
|
|
|
JR NZ,DUART_DETECT_NONE ; ALMOST CERTAINLY NOT A DUART |
|
|
|
; SEE IF MR1 AND MR2 ARE DISTINCT |
|
|
|
LD A,DUART_CR_MR1 ; SET MR POINTER TO MR1 |
|
|
|
DUART_OUTP(DUART_CR) ; SEND COMMAND |
|
|
|
|