-- Copyright (C) 1984 by Xerox Corporation. All rights reserved.
-- TTYPortHeadDicentra.mesa, HGM, 14-Sep-84 8:18:03
DIRECTORY
DicentraInputOutput USING [
Input, InterruptLevel, IOAddress, Output, SetPhonelineCSB, SetWakeupMask],
Inline USING [BITAND],
MultibusAddresses USING [scc2],
TTYPortFace USING [DeviceStatus, Parameter, TransferStatus];
TTYPortHeadDicentra: MONITOR
IMPORTS DicentraInputOutput, Inline
EXPORTS TTYPortFace =
BEGIN
-- Krock: Use second connector because it doesn't fit.
scc0: DicentraInputOutput.IOAddress = MultibusAddresses.scc2;
chanB: LONG POINTER TO Words = scc0 + 00H;
chanA: LONG POINTER TO Words = 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];
GetCommand: PUBLIC PROCEDURE [CARDINAL]
RETURNS [data: CHARACTER, stat: TTYPortFace.TransferStatus] =
BEGIN
IF ~ReadyToGet[] THEN RETURN[TRASH, notReady];
data ← Inline.BITAND[DicentraInputOutput.Input[@chan.r8],177B];
stat ← success;
END;
GetLineCount: PUBLIC PROCEDURE RETURNS [CARDINAL] = {RETURN[1]};
GetStatus: PUBLIC PROCEDURE [CARDINAL] RETURNS [TTYPortFace.DeviceStatus] =
BEGIN
RETURN[[
readyToPut: ReadyToPut[],
readyToGet: ReadyToGet[],
dataTerminalReady: TRUE,
requestToSend: TRUE]];
END;
PutCommand: PUBLIC PROCEDURE [lineNumber: CARDINAL, data: CHARACTER]
RETURNS [TTYPortFace.TransferStatus] =
BEGIN
IF ~ReadyToPut[] THEN RETURN[notReady];
DicentraInputOutput.Output[data, @chan.r8];
RETURN[success];
END;
SendBreak: PUBLIC PROCEDURE [lineNumber: CARDINAL] =
BEGIN
END;
SetParameter: PUBLIC PROCEDURE [lineNumber: CARDINAL, parameter: TTYPortFace.Parameter] =
BEGIN
END;
On: PUBLIC PROCEDURE [lineNumber: CARDINAL, mask: UNSPECIFIED] =
BEGIN
DicentraInputOutput.SetPhonelineCSB[NIL];
DicentraInputOutput.Output[002H, @chanB.r0]; -- Shift Left (ADR0 is ignored)
DicentraInputOutput.Output[0C9H, @chan.r9]; -- Hardware Reset, MIE, V, VIS
DicentraInputOutput.Output[012H, @chan.r1]; -- Rx All Int, Tx Int En
DicentraInputOutput.Output[0C0H, @chan.r2]; -- Init Vector Base
DicentraInputOutput.Output[0C1H, @chan.r3]; -- 8bits/char, RxE
DicentraInputOutput.Output[04AH, @chan.r4]; -- 16xClock, 2 Stop Bits
DicentraInputOutput.Output[0EAH, @chan.r5]; -- DTR, 8bits/char, TxE, RTS
DicentraInputOutput.Output[050H, @chan.r11]; -- Clocks from BR Gen
DicentraInputOutput.Output[006H, @chan.r12]; -- Low byte of time constant
DicentraInputOutput.Output[000H, @chan.r13]; -- High byte of time constant
DicentraInputOutput.Output[003H, @chan.r14]; -- Enable Baud Rate Gen from PClk
DicentraInputOutput.SetWakeupMask[mask, phoneLine];
END;
Off: PUBLIC PROCEDURE [CARDINAL] = BEGIN END;
InitializeCleanup: PROCEDURE = BEGIN END;
ReadyToGet: PROCEDURE RETURNS [BOOLEAN] =
BEGIN
bits: WORD = DicentraInputOutput.Input[@chan.r0];
DicentraInputOutput.Output[010H, @chan.r0]; -- Reset Ext/Status Interrupts
RETURN[Inline.BITAND[bits, 1] # 0]; -- Rx Character Available
END;
ReadyToPut: PROCEDURE RETURNS [BOOLEAN] =
BEGIN
bits: WORD = DicentraInputOutput.Input[@chan.r0];
DicentraInputOutput.Output[028H, @chan.r0]; -- Reset Tx Int Pending
RETURN[Inline.BITAND[bits, 4] # 0]; -- Tx Buffer Empty
END;
-- Mainline code
InitializeCleanup[];
END....