SoftcardOps.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Willie-Sue, October 9, 1986 4:10:08 pm PDT
DIRECTORY
DragOpsCross USING [Word],
Rope USING [ROPE];
SoftcardOps:
CEDAR
DEFINITIONS =
BEGIN
ROPE: TYPE = Rope.ROPE;
Addr: TYPE = LONG CARDINAL;
EUInternal: TYPE = [0..17B]; -- tbd
EUPBusCmd:
TYPE =
MACHINE
DEPENDENT
RECORD[
-- tbd
unused (0: 0..6): [0..177B] ← 0,
userMode (0: 7..7): BOOL ← FALSE,
unspecifiedAsYet (0: 8..15): [0..377B] ← 0
];
IFUPBusCmd: TYPE = MACHINE DEPENDENT {noAccess (0), access (1)};
IFUInternalState:
TYPE =
MACHINE
DEPENDENT
RECORD[
-- tbd
w0: WORD,
w1: WORD,
w2: WORD,
w3: WORD
];
Error: SIGNAL[code: ATOM, explanation: ROPE ← NIL];
EstablishConnection: PROC[host: ROPE] RETURNS[ok: BOOL];
CloseConnection: PROC;
SetEUBrkPtAddr: PROC[addr: Addr]; -- EU will brkpt when this address is accessed
SetIFUBrkPtAddr: PROC[addr: Addr]; -- IfU will brkpt when this address is accessed
ReadEUCmd: PROC RETURNS[euPBusCmd: EUPBusCmd];
ReadIFUCmd: PROC RETURNS[ifuPBusCmd: IFUPBusCmd];
ReadEUPBusData: PROC RETURNS[value: DragOpsCross.Word];
ReadIFUPBusData: PROC RETURNS[value: DragOpsCross.Word];
ReadClock: PROC RETURNS[value: LONG CARDINAL];
*************************
-- EU internal registers tbd
ReadEUInternalRegsiter:
PROC[which: EUInternal]
RETURNS[value, extra: DragOpsCross.Word];
WriteEUInternalRegsiter: PROC[which: EUInternal, value, extra: DragOpsCross.Word];
ReadIFUInternalState:
PROC
RETURNS[ifuState: IFUInternalState];
the IFU has only one internal state register
WriteIFUInternalState:
PROC[ifuState: IFUInternalState];
the IFU has only one internal state register
*************************
ClockControl:
TYPE =
MACHINE
DEPENDENT
RECORD[
reserved (0: 0..7): [0..377B],
freqSelect (0: 8..9): [0..3], -- choice of four frequencies for the Dragon clock
phaseAdjust (0: 10..12): [0..7], -- adjust phase between Dragon and Softcard
delay (0: 13..15): [0..7] -- adjust the delay between FA and FB
];
ReadClockControl: PROC RETURNS[clockControl: ClockControl];
WriteClockControl: PROC[clockControl: ClockControl];
*************************
Control and status bits.
NOTE: virtualMemAccessXX:
if TRUE, the XX accesses to Dragon memory are using virtual addresses; if FALSE, physical addresses are being used
ControlBit:
TYPE = {
interruptDragonToIOP,
interruptDragonToMesa,
writeParity,
allows selection of even or odd parity for subsequent writes; reads are always done with TDB parity; thus one can create a parity error
virtualMemAccessIOP,
virtualMemAccessMesa,
virtualMemAccessIFU,
virtualMemAccessEU,
ifuBreakpointEnabled,
euBreakpointEnabled,
iopIntToDragon,
mesaIntToDragon
};
DragonPhase:
TYPE = { phaseA, betweenAandB, phaseB, betweenBandA};
Notation: Fx/Fy => between Fx and Fy
ReadControlBit: PROC[which: ControlBit] RETURNS[current: BOOL];
SetControlBit: PROC[which: ControlBit] RETURNS[previous: BOOL];
ResetControlBit: PROC[which: ControlBit] RETURNS[previous: BOOL];
ResetIFUCacheStateMachine: PROC;
ResetEUCacheStateMachine: PROC;
DisableIFUCache:
PROC;
enable by doing a FlushIFUCache
DisableEUCache:
PROC;
enable by doing a FlushEUCache
FlushIFUCache: PROC;
FlushEUCache: PROC;
DragonHaltOrStep:
PROC[phase: DragonPhase ← phaseA];
halt the dragon in the specified phase; if already halted, moves the Dragon to the specified phase (including a full step from Fx to Fx or from Fx/Fy to Fx/Fy)
DragonRun:
PROC;
no-op if Dragon is already running
ResetCounter: PROC;
The following status bits can be read & reset
StatusBit:
TYPE = {
periodicIntToDragon, -- 16HZ periodic interrupt
memoryError, -- IOP access to Dragon memory caused a parity error
euBkptReached,
ifuBkptReached,
mapError
};
ReadStatusBit: PROC[which: StatusBit] RETURNS[current: BOOL];
ResetStatusBit: PROC[which: StatusBit] RETURNS[previous: BOOL];
*************************
Mapping between 2 megabytes of Daybreak physical address space and Dragon memory
MesaMapEntry:
TYPE =
MACHINE
DEPENDENT
RECORD[
unused (0: 0..11): [0..3777B] ← 0,
dp (0: 12..15): [0..17B] ← 0
];
MesaMapIndex: TYPE = [0..7];
ReadMesaMap: PROC[index: MesaMapIndex] RETURNS[value: MesaMapEntry];
WriteMesaMap: PROC[index: MesaMapIndex, value: MesaMapEntry];
*************************
Access to the Dragon Map
DragonMapEntry:
TYPE =
MACHINE
DEPENDENT
RECORD[
fault (0: 0..0): BOOL ← TRUE,
unused (0: 1..5): [0..37B] ← 0,
rp (0: 6..15): [0..1777B] ← 0
];
DragonMapIndex: TYPE = [0..37777B];
ReadDragonMap: PROC[index: DragonMapIndex] RETURNS[value: DragonMapEntry];
WriteDragonMap: PROC[index: DragonMapIndex, value: DragonMapEntry];
END.