<> <> <> DIRECTORY Cluster2, Dragon, EU2, EU2Utils, HandCodingUtil, IFU2, IFUPLAInstrDecode, IFUPLAMainPipeControl, IO, Rope, TerminalIO; IFU2Utils: CEDAR PROGRAM IMPORTS Cluster2, HandCodingUtil, IO, Rope, TerminalIO = BEGIN <> <> <> <> <> <> <<_ Cluster2.lastKs.state[0].data[3].OpAB>> <<_ Cluster2.lastKs.clusterIOPort[IFU2.II[IPData]].lc>> <> ROPE: TYPE = Rope.ROPE; II: TYPE = IFU2.II; IFUState: TYPE = IFU2.IFUState; NextMacro: TYPE = IFUPLAInstrDecode.NextMacro; CondEffect: TYPE = IFUPLAMainPipeControl.CondEffect; CondSelects: TYPE = Dragon.CondSelects; ALULeftSources: TYPE = Dragon.ALULeftSources; ALURightSources: TYPE = Dragon.ALURightSources; Store2ASources: TYPE = Dragon.Store2ASources; ALUOps: TYPE = Dragon.ALUOps; AluOpRp: ARRAY ALUOps OF ROPE = ["Or", "And", "VAd2", "BChk", "SAdd", "SSub", "LAdd", "LSub", "Xor", "?9", "FOP", "?11", "VAdd", "VSub", "UAdd", "USub"]; LtSrcRp: ARRAY ALULeftSources OF ROPE = ["a", "r", "c", "?"]; RtSrcRp: ARRAY ALURightSources OF ROPE = ["b", "r", "c", "k", "f", "?", "?", "?"]; StSrcRp: ARRAY Store2ASources OF ROPE = ["b", "r", "c", "?"]; PhRp: ARRAY Dragon.Phase OF ROPE = ["A", "B"]; BoolRp: ARRAY BOOL OF ROPE = [FALSE: "F", TRUE: "T"]; NextMacroRp: ARRAY NextMacro OF ROPE = ["Get", NIL, NIL, "Jmp", NIL, "Hld"]; CondEffectRp: ARRAY CondEffect OF ROPE = ["macroT", "macroJ", "microJ", "bubble"]; -- %6g CondSelectRp: ARRAY CondSelects OF ROPE = [ -- %3g "--", "EZ", "LZ", "LE", "?4", "NE", "GE", "GZ", "Ovf", "BC", "IL", "?11", "?12", "nBC", "nIL", "MFt"]; OpCodeRpRef: HandCodingUtil.NameArray _ HandCodingUtil.GetInstArray[]; OpCodeRp: PROC[op: [0..256)] RETURNS [ROPE] = {RETURN[OpCodeRpRef[LOOPHOLE[op]]]}; CondRope: PROC[rope: ROPE, cond: BOOL] = {IF cond THEN TerminalIO.WriteRope[rope] ELSE WriteSpace[rope.Length[]] }; WriteSpace: PROC[size: INT] = {THROUGH [0..size) DO TerminalIO.WriteChar[IO.SP] ENDLOOP}; ShowHistory: PROC = { tos: IO.STREAM _ TerminalIO.TOS[]; states: ARRAY [0..Cluster2.historySize) OF Cluster2.ClusterState _ Cluster2.lastKs.state; TerminalIO.WriteF["%L\n", IO.char['f]]; FOR i: INT DECREASING IN [0..Cluster2.historySize-1) DO ia: REF IFU2.IFUState _ NARROW[states[i+1].data[ifu]]; ib: REF IFU2.IFUState _ NARROW[states[i].data[ifu]]; ea: EU2.EU2State _ NARROW[states[i+1].data[eu]]; eb: EU2.EU2State _ NARROW[states[i].data[eu]]; xbus: IFU2.RegAddrRec _ LOOPHOLE[ib.XBus]; IF states[i].phase=a THEN LOOP; IF states[i+1].phase#a THEN ERROR; IF states[i].phase#b THEN ERROR; IF states[i].cycle#states[i+1].cycle THEN ERROR; tos.PutF["%3g ", IO.int[states[i].cycle] ]; <> CondRope[ "Rdy ", ia.InstReadyAB ]; tos.PutF["%6g ", IO.rope[ OpCodeRp[ ia.OpAB ] ] ]; tos.PutF["%g ", IO.rope[ NextMacroRp[ ib.NextMacroBA ] ] ]; <> <> CondRope[ "ILock ", ib.Stage1BHoldBA ]; tos.PutF["X:%02x ", IO.int[ xbus.aAddr ] ]; tos.PutF["%02x ", IO.int[ xbus.bAddr ] ]; tos.PutF["%02x ", IO.int[ xbus.cAddr ] ]; tos.PutF["l:%g ", IO.rope[ LtSrcRp[ xbus.aluLeftSrc ] ] ]; tos.PutF["r:%g ", IO.rope[ RtSrcRp[ xbus.aluRightSrc ] ] ]; <> <> tos.PutF["%4g ", IO.rope[ AluOpRp[ ib.ctlPipe2AB.aluOp ] ] ]; tos.PutF["2:%g ", IO.rope[ CondSelectRp[ ib.ctlPipe2AB.condSel ] ] ]; CondRope[ "Cnd ", ib.EUCondition2BA ]; <> CondRope[ "Rd", ib.ctlPipe3AB.rdFromPBus ]; <> tos.PutF["%8x", IO.card[ ea.simRegs[EU2Utils.left]]]; tos.PutF["%8x", IO.card[ ea.simRegs[EU2Utils.right]]]; tos.PutF["%8x", IO.card[ eb.simRegs[EU2Utils.r2B]]]; <<>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <> <> <<>> TerminalIO.WriteLn[] ENDLOOP; TerminalIO.WriteLn[]}; <<>> END.