-- File [Indigo]<Sakura>Dragon>DragonMemoryImpl.sak
-- 5-Mar-82 13:03:21
DIRECTORY
DragonCache,
DragonMemory,
SakuraRT;
DragonMemoryImpl: MONITOR
IMPORTS SakuraRT
EXPORTS DragonMemory = {
Memory: PUBLIC DEVICE = {
IN ClockA, ClockB, CMDIn, SharedIn: BOOLEAN, MDataIn: DragonCache.MbusType
OUT MDataOut: DragonCache.MbusType
GUARDIAN {}
CONTROL {
CalcData: PROC [rp: LONG CARDINAL, bl: [0..37B], word: [0..3]]
RETURNS [LONG CARDINAL] = {
ret: LONG CARDINAL ← rp*40B*4B + bl*4B + word;
ret ← 37777777777B - ret;
RETURN[ret]};
DO
WHEN ClockB UP: NULL;
IF CMDIn THEN
WITH m: MDataIn SELECT FROM
Instruction =>
SELECT m.command FROM
ReadQuad => {
rp: LONG CARDINAL ← m.rp;
bl: [0..37B] ← m.bl;
word: [0..3] ← m.word;
WHEN ClockA UP: NULL;
WHEN ClockB UP: NULL;
WHEN ClockA UP: NULL;
WHEN ClockB UP: NULL;
WHEN ClockA UP: NULL;
IF SharedIn THEN LOOP;
MDataOut ← [Data[CalcData[rp, bl, word]]];
WHEN ClockB UP: NULL;
WHEN ClockA UP: NULL;
MDataOut ← [Data[CalcData[rp, bl, (word+1) MOD 4]]];
WHEN ClockB UP: NULL;
WHEN ClockA UP: NULL;
MDataOut ← [Data[CalcData[rp, bl, (word+2) MOD 4]]];
WHEN ClockB UP: NULL;
WHEN ClockA UP: NULL;
MDataOut ← [Data[CalcData[rp, bl, (word+3) MOD 4]]]};
WriteQuad => ERROR;
WriteSingle => NULL;
NotReady => ERROR;
ReadMap => NULL;
DoMapOp => NULL;
SetRpDirty => NULL;
MapOpDone => NULL;
ENDCASE;
MapCommand =>
SELECT m.command FROM
ReadMap => NULL;
ReadQuad => ERROR;
MapOpDone => NULL;
ENDCASE => ERROR;
Data => ERROR;
ENDCASE => ERROR;
ENDLOOP}
};
}.