-- File: [Indigo]<Sakura>Dragon>DragonMapImpl.sak
-- 14-Mar-82 19:37:18
DIRECTORY
DragonCache: TYPE,
DragonMap: TYPE,
SakuraRT: TYPE;
DragonMapImpl: MONITOR
IMPORTS SakuraRT
EXPORTS DragonMap
= BEGIN
MapProcessor: PUBLIC PROC
[ClockA, ClockB, CMDIn: SakuraRT.Handle, MDataIn: SakuraRT.Handle,
CMDOut: SakuraRT.Handle, MDataOut: SakuraRT.Handle] = {
{ENABLE {ABORTED => GO TO Aborted};
DO SakuraRT.GetNew[ClockB, TRUE]; NULL;
IF NARROW[SakuraRT.Get[CMDIn], REF BOOLEAN]↑ THEN
WITH m: NARROW[SakuraRT.Get[MDataIn], REF DragonCache.MbusType]↑ SELECT FROM
Instruction =>
SELECT m.command FROM
ReadQuad => NULL;
WriteQuad => NULL;
WriteSingle => NULL;
NotReady => ERROR;
ReadMap => ERROR;
ReadMapAndSetRpDirty => ERROR;
DoMapOp => ERROR;
SetRpDirty =>
{SakuraRT.GetNew[ClockA, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← TRUE]];
SakuraRT.Put[MDataOut, NEW
[DragonCache.MbusType ← [MapCommand[MapOpDone, , , , ]]]];
SakuraRT.GetNew[ClockA, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← FALSE]]};
MapOpDone => ERROR
ENDCASE;
MapCommand =>
SELECT m.command FROM
ReadMap =>
{SakuraRT.GetNew[ClockB, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← TRUE]];
SakuraRT.Put[MDataOut, NEW
[DragonCache.MbusType ←
[MapCommand[MapOpDone, , FALSE, FALSE, m.vp]]]];
SakuraRT.GetNew[ClockA, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← FALSE]]};
ReadMapAndSetRpDirty =>
{SakuraRT.GetNew[ClockB, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← TRUE]];
SakuraRT.Put[MDataOut, NEW
[DragonCache.MbusType ←
[MapCommand[MapOpDone, , FALSE, TRUE, m.vp]]]];
SakuraRT.GetNew[ClockA, TRUE];
SakuraRT.Put[CMDOut, NEW[BOOLEAN ← FALSE]]};
ReadQuad => NULL;
MapOpDone => NULL
ENDCASE => ERROR;
Data => ERROR
ENDCASE => ERROR
ENDLOOP;
SakuraRT.ProcessEnd[]}
EXITS
Aborted => SakuraRT.Abort[]};
END.