<> <> <<>> <> <> <> <> <> <> <<>> Imports BitOps, Dragon, DragonFP, DragonIFU; IFP: CELL [ FPStatusB > active: BOOL _ FPCSLoadBA=load OR FPCSUAluBA=unload OR FPCSUMultBA=unload; Dragon.Assert[NOT (rejectBA AND active)]; -- IPipe should insure this Dragon.Assert[NOT Dragon.MoreThanOneOf[ FPCSLoadBA=load OR FPCSUAluBA=unload OR FPCSUMultBA=unload, cAddrBA = DragonIFU.PRtoByte[fpMaskFlags], Lev0BaddrBA = DragonIFU.PRtoByte[fpMaskFlags], Lev0BaddrBA = DragonIFU.PRtoByte[fpMode] ] ]; csUnload0AB _ FPCSUAluBA=unload OR FPCSUMultBA=unload; csUnload1AB _ csUnload1BA; functionAB _ IF FPCSLoadBA=load THEN DragonFP.ExtractFunction[KBus] ELSE 0; IF Lev0BaddrBA = DragonIFU.PRtoByte[fpMaskFlags] THEN { Dragon.Assert[NOT active]; KBus _ BitOps.ICID[maskBA, [0, 0], 32, 0, 16]; KBus _ BitOps.ICID[flagsBA, KBus, 32, 16, 16] }; IF Lev0BaddrBA = DragonIFU.PRtoByte[fpMode] THEN { Dragon.Assert[NOT active]; KBus _ BitOps.ICID[LOOPHOLE[modeBA], [0, 0], 32, 16, 16]}; IF cAddrBA = DragonIFU.PRtoByte[fpMaskFlags] THEN { Dragon.Assert[NOT active]; maskAB _ BitOps.ECFD[KBus,32,0,16]; flagsAB _ BitOps.ECFD[KBus,32,16,16]} ELSE { maskAB _ maskBA; flagsAB _ flagsBA}; flagsAB _ IF csUnload2BA THEN BitOps.IBIW[TRUE, BitOps.ICIW[0, flagsBA, 16, 0, 3], 16, LOOPHOLE[statusBA]] ELSE flagsBA }; <<>> IF PhB THEN { maskBA _ maskAB; flagsBA _ flagsAB; modeBA _ IF (functionAB / 64) = 3 THEN DragonFP.SetMode[modeAB, functionAB] ELSE modeAB; csUnload1BA _ csUnload0AB; csUnload2BA _ csUnload1AB; IF csUnload1AB THEN { statusBA _ FPStatusB; IF NOT BitOps.EBFW[maskAB, 16, LOOPHOLE[FPStatusB]] THEN {EPFaultB_FPFault; EPRejectB_TRUE} ELSE {EPFaultB_None; EPRejectB_FALSE} }; cAddrBA _ BitOps.ECFD[KBus, 32, 16, 8]; rejectBA _ EPRejectB }; ENDCELL