-- File: [Indigo]Dragon>DragonProcessorImpl4.sak -- Dragon processor with random fetch -- 10-Mar-82 11:24:06 DIRECTORY DragonCache: TYPE, DragonProcessor: TYPE, RandomCard: TYPE, SakuraRT: TYPE, SimIO: TYPE; DragonProcessorImpl4: MONITOR IMPORTS DragonCache, RandomCard, SakuraRT, SimIO EXPORTS DragonProcessor = BEGIN Processor: PUBLIC PROC [ClockA, ClockB, Fault, Reject: SakuraRT.Handle, InData: SakuraRT.Handle, Op: SakuraRT.Handle, RQ: SakuraRT.Handle, OutData: SakuraRT.Handle] = { Store: PROC [loc: CARDINAL, data: LONG CARDINAL] = { vp: LONG CARDINAL; bl: INTEGER [0..37B]; word: INTEGER [0..3]; printval: LONG CARDINAL; [vp, bl, word] _ SplitAddress[loc]; printval _ word + bl * 4 + vp * 128; SakuraRT.GetNew[ClockB, TRUE]; {SakuraRT.Put[RQ, NEW[BOOLEAN _ TRUE]]; SakuraRT.Put[Op, NEW[DragonCache.PbusOp _ Store]]; SakuraRT.Put[OutData, NEW[DragonCache.PbusType _ [Instruction[vp, bl, word]]]]}; DO SakuraRT.GetNew[ClockA, TRUE]; IF NOT NARROW[SakuraRT.Get[Reject], REF BOOLEAN]^ THEN EXIT ENDLOOP; SimIO.WF1[" Store started %ld*n", @printval]; SakuraRT.GetNew[ClockB, TRUE]; SakuraRT.Put[OutData, NEW[DragonCache.PbusType _ [Data[data]]]]; -- Match SakuraRT.GetNew[ClockB, TRUE]; SakuraRT.Put[RQ, NEW[BOOLEAN _ FALSE]]; SimIO.WF1[" Store finished %ld*n", @printval]}; StoreAndRead: PROC [loc, prevloc: CARDINAL, data, prevdata: LONG CARDINAL] = { vp, prevvp: LONG CARDINAL; bl, prevbl: INTEGER [0..37B]; word, prevword: INTEGER [0..3]; printval: LONG CARDINAL; [vp, bl, word] _ SplitAddress[loc]; printval _ word + bl * 4 + vp * 128; SakuraRT.GetNew[ClockB, TRUE]; {SakuraRT.Put[RQ, NEW[BOOLEAN _ TRUE]]; SakuraRT.Put[Op, NEW[DragonCache.PbusOp _ Store]]; SakuraRT.Put[OutData, NEW[DragonCache.PbusType _ [Instruction[vp, bl, word]]]]}; DO SakuraRT.GetNew[ClockA, TRUE]; IF NOT NARROW[SakuraRT.Get[Reject], REF BOOLEAN]^ THEN EXIT ENDLOOP; [prevvp, prevbl, prevword] _ SplitAddress[prevloc]; SakuraRT.Delay[40]; DragonCache.CheckVal[prevvp, prevbl, prevword, prevdata]; SimIO.WF1[" Store started %ld*n", @printval]; SakuraRT.GetNew[ClockB, TRUE]; SakuraRT.Put[OutData, NEW[DragonCache.PbusType _ [Data[data]]]]; -- Match SakuraRT.GetNew[ClockB, TRUE]; SakuraRT.Put[RQ, NEW[BOOLEAN _ FALSE]]; SimIO.WF1[" Store finished %ld*n", @printval]}; Read: PROC [prevloc: CARDINAL, prevdata: LONG CARDINAL] = { prevvp: LONG CARDINAL; prevbl: INTEGER [0..37B]; prevword: INTEGER [0..3]; DO SakuraRT.GetNew[ClockA, TRUE]; IF NOT NARROW[SakuraRT.Get[Reject], REF BOOLEAN]^ THEN EXIT ENDLOOP; [prevvp, prevbl, prevword] _ SplitAddress[prevloc]; SakuraRT.Delay[40]; DragonCache.CheckVal[prevvp, prevbl, prevword, prevdata]}; SplitAddress: PROC [loc: CARDINAL] RETURNS [vp: LONG CARDINAL, bl: INTEGER [0..37B], word: INTEGER [0..3]] = { word _ loc MOD 4; loc _ loc / 4; bl _ loc MOD 40B; vp _ loc / 40B}; loc, prevloc: CARDINAL; data, prevdata: LONG CARDINAL; {ENABLE {ABORTED => GO TO Aborted}; SakuraRT.Put[RQ, NEW[BOOLEAN _ FALSE]]; SakuraRT.GetNew[ClockB, TRUE]; NULL; SakuraRT.GetNew[ClockB, TRUE]; NULL; [] _ RandomCard.InitRandom[-1]; prevloc _ RandomCard.Choose[0, 3777B]; prevdata _ RandomCard.Random[] * 200000B + RandomCard.Random[]; Store[prevloc, prevdata]; THROUGH [0..300] DO loc _ RandomCard.Choose[0, 3777B]; data _ RandomCard.Random[] * 200000B + RandomCard.Random[]; StoreAndRead[loc, prevloc, data, prevdata]; prevloc _ loc; prevdata _ data ENDLOOP; Read[prevloc, prevdata]; SimIO.WF0["++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"]; SakuraRT.ProcessEnd[]} EXITS Aborted => SakuraRT.AbortAll[]}; END.