<> <> <> DIRECTORY Basics, Process, XBus, XBusRS232; XBusRS232Impl: CEDAR PROGRAM IMPORTS Basics, Process, XBus EXPORTS XBusRS232 = BEGIN <<[Indigo]11.1>Heads>Private>TTYPortHeadDicentra.mesa>> <<[Indigo]11.1>Heads>Friends>MultibusAddresses.mesa>> scc0: LONG CARDINAL = 9000H; -- MultibusAddresses.scc0, the connector near the fan <> chanB: LONG POINTER TO Words = LOOPHOLE[scc0 + 00H]; chanA: LONG POINTER TO Words = LOOPHOLE[scc0 + 10H]; chan: LONG POINTER TO Words _ chanA; -- Line 0 Words: TYPE = RECORD [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15: WORD]; initialized: BOOL _ FALSE; PutChar: PUBLIC PROCEDURE [char: CHARACTER] = TRUSTED { IF ~initialized THEN Init[]; UNTIL ReadyToPut[] DO Process.CheckForAbort[]; ENDLOOP; IOWrite[@chan.r8, LOOPHOLE[char]]; }; ReadyToPut: PROCEDURE RETURNS [BOOLEAN] = TRUSTED { bits: WORD = IORead[@chan.r0]; RETURN[Basics.BITAND[bits, 4] # 0]; -- Tx Buffer Empty }; GetChar: PUBLIC PROCEDURE RETURNS [char: CHARACTER] = TRUSTED { IF ~initialized THEN Init[]; UNTIL ReadyToGet[] DO Process.CheckForAbort[]; ENDLOOP; char _ LOOPHOLE[Basics.BITAND[IORead[@chan.r8], 177B]]; }; ReadyToGet: PROCEDURE RETURNS [BOOLEAN] = TRUSTED { bits: WORD = IORead[@chan.r0]; RETURN[Basics.BITAND[bits, 1] # 0]; -- Rx Character Available }; Init: PUBLIC PROCEDURE = TRUSTED { IOWrite[@chanB.r0, 002H]; -- Shift Left (ADR0 is ignored) IOWrite[@chan.r9, 0C0H]; -- Hardware Reset IOWrite[@chan.r1, 000H]; -- No interrupts IOWrite[@chan.r3, 0C1H]; -- 8bits/char, RxE IOWrite[@chan.r4, 04AH]; -- 16xClock, 1.5 Stop Bits IOWrite[@chan.r5, 0EAH]; -- DTR, 8bits/char, TxE, RTS IOWrite[@chan.r11, 050H]; -- Clocks from BR Gen IOWrite[@chan.r12, 31]; -- Low byte of time constant IOWrite[@chan.r13, 000H]; -- High byte of time constant IOWrite[@chan.r14, 003H]; -- Enable Baud Rate Gen from PClk initialized _ TRUE; }; IORead: PROCEDURE [adr: LONG POINTER] RETURNS [data: CARDINAL] = TRUSTED { data _ XBus.IORead[LOOPHOLE[2*LOOPHOLE[adr, LONG CARDINAL]]]; }; IOWrite: PROCEDURE [adr: LONG POINTER, data: CARDINAL] = TRUSTED { XBus.IOWrite[LOOPHOLE[2*LOOPHOLE[adr, LONG CARDINAL]], data]; }; END.