<> <> <> <<>> <> <> <> <> <> <> <<>> 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[ifuFPMaskFlags], Lev0BaddrBA = DragonIFU.PRtoByte[ifuFPMaskFlags], Lev0BaddrBA = DragonIFU.PRtoByte[ifuFPMode] ] ]; csUnload0AB _ FPCSUAluBA=unload OR FPCSUMultBA=unload; csUnload1AB _ csUnload1BA; IF FPCSLoadBA=load THEN [ ,functionAB] _DragonFP.ExtractLoadFunction[KBus] ELSE functionAB _ 0; IF Lev0BaddrBA = DragonIFU.PRtoByte[ifuFPMaskFlags] THEN { Dragon.Assert[NOT active]; KBus _ Dragon.LTD[maskFlagsBA] }; IF Lev0BaddrBA = DragonIFU.PRtoByte[ifuFPMode] THEN { Dragon.Assert[NOT active]; KBus _ BitOps.ICID[LOOPHOLE[modeBA], [0, 0], 32, 16, 16]}; IF cAddrBA = DragonIFU.PRtoByte[ifuFPMaskFlags] THEN { Dragon.Assert[NOT (active OR csUnload2BA)]; maskFlagsAB _ Dragon.LFD[KBus]} ELSE maskFlagsAB _ IF csUnload2BA THEN Dragon.LFD[ BitOps.IBID[TRUE, BitOps.ICID[0, Dragon.LTD[maskFlagsBA], 32, 16, 3], 32, LOOPHOLE[statusBA, CARDINAL] + 16] ] ELSE maskFlagsBA }; <<>> IF PhB THEN { maskFlagsBA _ maskFlagsAB; modeBA _ IF (functionAB / 64) = 3 THEN DragonFP.SetMode[modeAB, functionAB] ELSE modeAB; csUnload1BA _ csUnload0AB; csUnload2BA _ csUnload1AB; IF csUnload1AB THEN { statusBA _ FPStatusB; IF NOT BitOps.EBFD[ Dragon.LTD[maskFlagsAB], 32, LOOPHOLE[FPStatusB]] THEN {EPFaultB_FPFault; EPRejectB_TRUE} ELSE {EPFaultB_None; EPRejectB_FALSE} }; cAddrBA _ BitOps.ECFD[KBus, 32, 16, 8]; rejectBA _ EPRejectB }; ENDCELL