<> <> <> <> <> Directory DragonMicroPLA; Imports Atom, BitOps, Dragon, DragonIFU; IALRegAddr: CELL [ SAB INT[8], LSum0A > EvalSimple IF PhB THEN BEGIN sBA _ SAB; lBA _ LAB; addBus0 _ SELECT ASum0B FROM s => SAB, l => LAB, cBase => DragonIFU.PRtoByte[euConstant], aBase => DragonIFU.PRtoByte[euAux], iRef => DragonIFU.PRtoByte[ifuXBus]+4, zero => 0, ENDCASE => ERROR; addBus1 _ SELECT ASum1B FROM op47 => OpBA MOD 16, alpha => AlphaBA, alpha03 => AlphaBA/16, alpha47 => AlphaBA MOD 16, beta => BetaBA, beta03 => BetaBA/16, beta47 => BetaBA MOD 16, minus4 => -4, minus3 => -3, minus2 => -2, minus1 => -1, zero => 0, one => 1, two => 2, three => 3, ENDCASE => ERROR; END; IF PhA THEN BEGIN addBus0 _ SELECT LSum0A FROM s => sBA, l => lBA, xBus => BitOps.ECFD[XBus, 32, xBusPos, 7], zero => 0, ENDCASE => ERROR; addBus1 _ SELECT LSum1A FROM alpha => AlphaBA, zero => 0, one => 1, ENDCASE => ERROR; END; sum _ (addBus0+addBus1+256) MOD 256; IF PhB THEN Lev0AaddrBA _ SELECT ASum0B FROM s, l => sum MOD 128, ENDCASE => sum; IF PhA THEN LAB _ sum MOD 128; Initializer xBusPos _ NARROW[ NARROW[initData, Atom.PropList].GetPropFromList[$xBusPos], REF INT]^; ENDCELL; IBSRegAddr: CELL [ LAB INT[8], SSum0A > EvalSimple IF PhB THEN BEGIN sBA _ SAB; lBA _ LAB; addBus0 _ SELECT BSum0B FROM s => SAB, l => LAB, cBase => DragonIFU.PRtoByte[euConstant], aBase => DragonIFU.PRtoByte[euAux], iRef => DragonIFU.PRtoByte[ifuXBus]+4, zero => 0, ENDCASE => ERROR; addBus1 _ SELECT BSum1B FROM op47 => OpBA MOD 16, alpha => AlphaBA, alpha03 => AlphaBA/16, alpha47 => AlphaBA MOD 16, beta => BetaBA, beta03 => BetaBA/16, beta47 => BetaBA MOD 16, minus4 => -4, minus3 => -3, minus2 => -2, minus1 => -1, zero => 0, one => 1, two => 2, three => 3, ENDCASE => ERROR; END; IF PhA THEN BEGIN addBus0 _ SELECT SSum0A FROM s => sBA, l => lBA, xBus => BitOps.ECFD[XBus, 32, xBusPos, 7], zero => 0, ENDCASE => ERROR; addBus1 _ SELECT SSum1A FROM alpha => AlphaBA, deltaS => DeltaSPlus2A-2, zero => 0, one => 1, ENDCASE => ERROR; END; sum _ (addBus0+addBus1+256) MOD 256; IF PhB THEN Lev0BaddrBA _ SELECT BSum0B FROM s, l => sum MOD 128, ENDCASE => sum; IF PhA THEN SAB _ sum MOD 128; Initializer xBusPos _ NARROW[ NARROW[initData, Atom.PropList].GetPropFromList[$xBusPos], REF INT]^; ENDCELL; ICRegAddr: CELL [ SAB INT[8], XBus =INT[32], ReadSLimitA BOOL, PhA > EvalSimple IF PhB THEN BEGIN sBA _ SAB; lBA _ LAB; sLimitBA _ sLimitAB; addBus0 _ SAB; addBus1 _ 127-sLimitAB; -- that is, NOT sLimitAB END; IF PhA THEN BEGIN Dragon.Assert[ NOT (ReadSLimitA AND SetSLimitA) ]; IF ReadSLimitA THEN XBus _ BitOps.ICID[sLimitBA, XBus, 32, 32-7, 7]; sLimitAB _ IF SetSLimitA THEN BitOps.ECFD[XBus, 32, 32-7, 7] ELSE sLimitBA; addBus0 _ SELECT CSum0A FROM s => sBA, l => lBA, cBase => DragonIFU.PRtoByte[euConstant], aBase => DragonIFU.PRtoByte[euAux], iRef => DragonIFU.PRtoByte[ifuXBus]+4, zero => 0, ENDCASE => ERROR; addBus1 _ SELECT CSum1A FROM op47 => OpBA MOD 16, alpha => AlphaBA, alpha03 => AlphaBA/16, alpha47 => AlphaBA MOD 16, beta => BetaBA, beta03 => BetaBA/16, beta47 => BetaBA MOD 16, minus4 => -4, minus3 => -3, minus2 => -2, minus1 => -1, zero => 0, one => 1, two => 2, three => 3, ENDCASE => ERROR; END; sum _ (addBus0+addBus1+256) MOD 256; IF PhB THEN EStkOverflowBA _ (sum MOD 128) IN [0..15); <> IF PhA THEN Lev0CaddrA _ SELECT CSum0A FROM s, l => sum MOD 128, ENDCASE => sum; ENDCELL