diff --git a/Source/HBIOS/duart.asm b/Source/HBIOS/duart.asm index 126c817f..5bbda846 100644 --- a/Source/HBIOS/duart.asm +++ b/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