DragonIDecode:
CEDAR
DEFINITIONS =
BEGIN
Level1:
TYPE =
RECORD [
a, b: Dragon.EURegisterIndex,
euControlTop: EUControlTop,
next2: Level2
];
Level2:
TYPE =
RECORD [
euCacheCmd: Dragon.PBusCommands,
euControlBot: EUControlBot,
next3: Level3
];
Level3:
TYPE =
RECORD [
c: Dragon.EURegisterIndex,
xcClass: XferControlClass,
pcSL: PcSLState
];
PcSLState:
TYPE =
RECORD [
pc: Dragon.Word,
s: Dragon.EURegisterIndex,
l: Dragon.EURegisterIndex
];
XferControlClass: TYPE = {ordinary, call, ret, cJmp, trap} ← ordinary;
EUControlTop:
TYPE =
RECORD [
kData: Dragon.Word, -- toIFU<=>cAdr=kAdr phA
aluOp: Dragon.ALUOps, -- phB
condition: Dragon.CondSelects, -- phB
condComp: BOOL, -- phB
condTrap: BOOL, -- phB
aAlu: {aRam, r1, r3} ← aRam, -- phB
bAlu: {bRam, k, r1, r3} ← bRam, -- phB
store1: {bRam, r1, r3} ← bRam -- phB
];
EUControlBot:
TYPE =
RECORD [
result2: { r1, r3} ← r1, -- phB
store3: {s2, r3} ← s2, -- phB
result3: {rdata, r2} ← r2 -- phB
wtEUCch: BOOL, derived from euCacheCmd phA
];
EUStatus:
TYPE =
RECORD [
condOut: BOOL, -- toIFU phB
kData: Dragon.Word -- toIFU<=>cAdr=kAdr phA
];
ILength:
PROC [ op: Dragon.Opcode ]
RETURNS [ length: [0..5] ];
END.