-- File: [Indigo]Dragon>DragonProcessorImpl4.sak -- Dragon processor with random fetch -- 10-Mar-82 11:24:06 DIRECTORY DragonCache, DragonProcessor, RandomCard, SakuraRT, SimIO; DragonProcessorImpl4: MONITOR IMPORTS DragonCache, RandomCard, SakuraRT, SimIO EXPORTS DragonProcessor = { Processor: PUBLIC DEVICE = { IN ClockA, ClockB, Fault, Reject: BOOLEAN, InData: DragonCache.PbusType OUT Op: DragonCache.PbusOp, RQ: BOOLEAN, OutData: DragonCache.PbusType GUARDIAN {} CONTROL { Store: PROC [loc: CARDINAL, data: LONG CARDINAL]= { vp: LONG CARDINAL; bl: [0..37B]; word: [0..3]; printval: LONG CARDINAL; [vp, bl, word] _ SplitAddress[loc]; printval _ word+bl*4+vp*128; WHEN ClockB UP: { RQ _ TRUE; Op _ Store; OutData _ [Instruction[vp, bl, word]]}; DO WHEN ClockA UP: IF ~Reject THEN EXIT; ENDLOOP; SimIO.WF1[" Store started %ld*n", @printval]; WHEN ClockB UP: OutData _ [Data[data]]; -- Match WHEN ClockB UP: RQ _ FALSE; SimIO.WF1[" Store finished %ld*n", @printval]}; StoreAndRead: PROC [loc, prevloc: CARDINAL, data, prevdata: LONG CARDINAL] = { vp, prevvp: LONG CARDINAL; bl, prevbl: [0..37B]; word, prevword: [0..3]; printval: LONG CARDINAL; [vp, bl, word] _ SplitAddress[loc]; printval _ word+bl*4+vp*128; WHEN ClockB UP: { RQ _ TRUE; Op _ Store; OutData _ [Instruction[vp, bl, word]]}; DO WHEN ClockA UP: IF ~Reject THEN EXIT; ENDLOOP; [prevvp, prevbl, prevword] _ SplitAddress[prevloc]; SakuraRT.Delay[40]; DragonCache.CheckVal[prevvp, prevbl, prevword, prevdata]; SimIO.WF1[" Store started %ld*n", @printval]; WHEN ClockB UP: OutData _ [Data[data]]; -- Match WHEN ClockB UP: RQ _ FALSE; SimIO.WF1[" Store finished %ld*n", @printval]}; Read: PROC [prevloc: CARDINAL, prevdata: LONG CARDINAL] = { prevvp: LONG CARDINAL; prevbl: [0..37B]; prevword: [0..3]; DO WHEN ClockA UP: IF ~Reject 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: [0..37B], word: [0..3]] = { word _ loc MOD 4; loc _ loc / 4; bl _ loc MOD 40B; vp _ loc / 40B}; loc, prevloc: CARDINAL; data, prevdata: LONG CARDINAL; RQ _ FALSE; WHEN ClockB UP: NULL; WHEN ClockB UP: 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["++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"]; } }; }.