Browse Source

DUART: try not to step on 16x50 UART configuration

pull/133/head
Chris Odorjan 6 years ago
parent
commit
ceb1826bed
  1. 23
      Source/HBIOS/duart.asm

23
Source/HBIOS/duart.asm

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

Loading…
Cancel
Save