<> <> Directory Dragon, DragOpsCross; Imports BitOps, RoseRun, RoseTesting; Library Cache, IFetcher; SimpleIDecoder: CELL [ <<>> <> PhA, PhB> InstReadyABOOL, -- used during PhB JumpTargetB>INT[32], -- used during PhB PreFetchFaultedB> DShift> IF PhA THEN BEGIN holdA _ DHold; IF NOT DHold THEN BEGIN resetA _ Reset; instReadyA _ InstReadyA; opA _ PreOpA; alphaA _ PreAlphaA; betaA _ PreBetaA; gammaA _ PreGammaA; deltaA _ PreDeltaA; iLengthA _ PreLengthA; preFetchFaultedA _ preFetchFaultedB; npcA _ npcB; END; END; IF PhB THEN BEGIN IF NOT holdA THEN BEGIN preFetchFaultedB _ PreFetchFaultedB; SELECT TRUE FROM resetA => BEGIN GetNextInstB _ FALSE; JumpB _ TRUE; npcB _ 64 -- fake --; END; InstReadyA => BEGIN OPEN DragOpsCross; SELECT TRUE FROM opA = dJB, (opA IN [dRJBformat..eRJBformat]) AND ((opA-dRJBformat) MOD 2) = 1 => BEGIN GetNextInstB _ FALSE; JumpB _ TRUE; npcB _ npcA+alphaA-(IF alphaA < 128 THEN 0 ELSE 256); END; opA = dJDB => BEGIN GetNextInstB _ FALSE; JumpB _ TRUE; npcB _ npcA+256*Dragon.Word[betaA]+alphaA-Dragon.Word[IF betaA < 128 THEN 0 ELSE 65536]; END; opA = dDFC => BEGIN GetNextInstB _ FALSE; JumpB _ TRUE; npcB _ 256*(256*(256*Dragon.Word[deltaA]+gammaA)+betaA)+alphaA; END; ENDCASE => BEGIN GetNextInstB _ TRUE; JumpB _ FALSE; npcB _ npcA+iLengthA; END; END; preFetchFaultedA => BEGIN GetNextInstB _ FALSE; JumpB _ TRUE; npcB _ 128 -- fake --; END; ENDCASE -- instruction not ready yet -- => BEGIN GetNextInstB _ JumpB _ FALSE; npcB _ npcA; END; JumpTargetB _ BitOps.ILID[source: npcB, container: JumpTargetB, containerWidth: 32, fieldPosition: 0, fieldWidth: 32]; END; END; ENDCELL; IFetcherTest: CELL [ <<>> <> PhA, PhB> DShift> <

> IPData: INT[32]; -- address to cache during PhA, data to/from cache during PhB IPCmd: Mnemonic["PBusCommands"]; -- during PhA IPReject: BOOL; -- during PhB IPFault: BOOL; -- during PhB IPPageFault: BOOL; -- during PhB IPParity: BOOL; -- during PhB IPNPError: BOOL; <> InstReadyA: BOOL; -- generated during PhA PreOpA, PreAlphaA, PreBetaA, PreGammaA, PreDeltaA: INT[8]; -- generated during PhA PreLengthA: INT[3]; -- generated during PhA GetNextInstB, JumpB: BOOL; -- used during PhB JumpTargetB: INT[32]; -- used during PhB PreFetchFaultedB: BOOL; -- generated during PhB (there's no hurry) <

> MData: INT[32]; MCmd: Mnemonic["MBusCommands"]; MNShared: BOOL; MParity: BOOL; MNError: BOOL; MReady: BOOL; MRq: BOOL; MNewRq: BOOL; MGnt: BOOL; fetcher: IFetcher[]; cache: Cache[PData: IPData, PCmd: IPCmd, PReject: IPReject, PFault: IPFault, PPageFault: IPPageFault, PParity: IPParity, PNPError: IPNPError]; decoder: SimpleIDecoder[] BlackBoxTest realHandle: REF RoseTesting.CellTestHandleRep; oldIO, newIO: IFetcherTestIORef; TRUSTED {realHandle _ LOOPHOLE[handle]}; oldIO _ NARROW[realHandle.tester.realCellStuff.oldIO]; newIO _ NARROW[realHandle.tester.realCellStuff.newIO]; instructions^ _ newIO^; IF oldIO^ = newIO^ AND (PhA OR PhB) THEN BEGIN -- user did nothing, so we push the simulation along ourselves wasPhA: BOOL = PhA; PhA _ PhB _ FALSE; [] _ RoseRun.Eval[handle]; PhB _ wasPhA; PhA _ NOT wasPhA; [] _ RoseRun.Eval[handle]; END; [] _ RoseRun.Eval[handle]; [] _ RoseRun.Eval[handle] ENDCELL