DIRECTORY Ieee USING [InitIeee, SetInvalidOperation], PrincOps USING [StateVector, UnboundLink, aFADD, aFSUB, aFMUL, aFDIV, aFCOMP, aFIX, aFLOAT, aFIXI, aFIXC, aFSTICKY, aFREM, aROUND, aROUNDI, aROUNDC, aFSQRT, aFSC, SD, sFADD, sFSUB, sFMUL, sFDIV, sFCOMP, sFIX, sFLOAT], PrincOpsUtils USING [MyLocalFrame], Real USING [], RealFns USING [SqRt], RealOps USING [FAdd, FComp, FDiv, FixMode, Float, FMul, FRem, FScale, FSub, RoundC, RoundI, RoundLI], TrapSupport USING [BumpPC, opTrapTable]; RealControl: PROGRAM IMPORTS PrincOpsUtils, Ieee, RealFns, RealOps, TrapSupport = BEGIN NoteTrap: PROC = { realTraps _ realTraps + 1; }; realTraps: INT _ 0; microSticky: CARDINAL _ 0; InitReals: PROC = { OPEN PrincOps, TrapSupport; SD[sFADD] _ SD[sFSUB] _ SD[sFMUL] _ SD[sFDIV] _ SD[sFCOMP] _ SD[sFIX] _ SD[sFLOAT] _ LOOPHOLE[UnboundLink, WORD]; opTrapTable.misc[aFADD] _ LOOPHOLE[TFAdd]; opTrapTable.misc[aFSUB] _ LOOPHOLE[TFSub]; opTrapTable.misc[aFMUL] _ LOOPHOLE[TFMul]; opTrapTable.misc[aFDIV] _ LOOPHOLE[TFDiv]; opTrapTable.misc[aFCOMP] _ LOOPHOLE[TFComp]; opTrapTable.misc[aFIX] _ LOOPHOLE[TFix]; opTrapTable.misc[aFLOAT] _ LOOPHOLE[TFloat]; opTrapTable.misc[aFIXI] _ LOOPHOLE[TFixI]; opTrapTable.misc[aFIXC] _ LOOPHOLE[TFixC]; opTrapTable.misc[aFSTICKY] _ LOOPHOLE[TFSticky]; opTrapTable.misc[aFREM] _ LOOPHOLE[TFRem]; opTrapTable.misc[aROUND] _ LOOPHOLE[TRound]; opTrapTable.misc[aROUNDI] _ LOOPHOLE[TRoundI]; opTrapTable.misc[aROUNDC] _ LOOPHOLE[TRoundC]; opTrapTable.misc[aFSQRT] _ LOOPHOLE[TSqRt]; opTrapTable.misc[aFSC] _ LOOPHOLE[TFSc]; Ieee.InitIeee[]; }; TFAdd: PROC [a, b: REAL] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.FAdd[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFSub: PROC [a, b: REAL] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.FSub[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFMul: PROC [a, b: REAL] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.FMul[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFDiv: PROC [a, b: REAL] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.FDiv[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFComp: PROC [a, b: REAL] RETURNS [i: INTEGER] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; i _ RealOps.FComp[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFix: PROC [a: REAL] RETURNS [li: LONG INTEGER] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; li _ RealOps.RoundLI[a, RealOps.FixMode]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFloat: PROC [a: LONG INTEGER] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.Float[a]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFixI: PROC [a: REAL] RETURNS [i: INTEGER] = { state: PrincOps.StateVector; state_ STATE; NoteTrap[]; i _ RealOps.RoundI[a, RealOps.FixMode]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFixC: PROC [a: REAL] RETURNS [c: CARDINAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.RoundC[a, RealOps.FixMode]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFSticky: PROC [c: CARDINAL] RETURNS [cr: CARDINAL] = { state: PrincOps.StateVector; state _ STATE; cr _ microSticky; microSticky _ c; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFRem: PROC [a, b: REAL] RETURNS [c: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.FRem[a, b]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TRound: PROC [a: REAL] RETURNS [li: LONG INTEGER] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; li _ RealOps.RoundLI[a]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TRoundI: PROC [a: REAL] RETURNS [i: INTEGER] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; i _ RealOps.RoundI[a]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TRoundC: PROC [a: REAL] RETURNS [c: CARDINAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; c _ RealOps.RoundC[a]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TSqRt: PROC [a: REAL] RETURNS [b: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; IF a < 0.0 THEN Ieee.SetInvalidOperation[]; b _ RealFns.SqRt[a]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; TFSc: PROC [a: REAL, scale: INTEGER] RETURNS [b: REAL] = { state: PrincOps.StateVector; state _ STATE; NoteTrap[]; b _ RealOps.FScale[a, scale]; TrapSupport.BumpPC[2]; state.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; TRANSFER WITH state; }; InitReals[]; END. L. Stewart, December 11, 1980 11:37 AM, modify for Pilot from RealControl.mesa L. Stewart, 4-Feb-81 18:31:04, change to new trap handling L. Stewart, 6-Feb-81 10:40:32, update trap procedure style R. Atkinson, 23-Mar-81 16:10:36, replaced Frame.MyLocalFrame[] with [frame[Frame.MyLocalFrame[]]] L. Stewart, June 3, 1982 11:11 am, added FScale and SqRt, removed SETS L. Stewart, August 27, 1982 1:15 pm, SAFE L. Stewart, January 14, 1984 4:58 pm, change to Ieee όRealControl.mesa - Microcode to Mesa floating point translator Copyright c 1985 by Xerox Corporation. All rights reserved. Stewart, January 14, 1984 4:58 pm Rovner, May 4, 1983 10:27 am Russ Atkinson (RRA) May 22, 1985 9:53:23 pm PDT Doug Wyatt, February 25, 1985 3:30:21 pm PST RRA: This procedure is here for debugging purposes. A trap is already so expensive that the additional cost should be negligible. Plant a Spy breakpoint here to see the users of trapping REAL instructions! Mainline code ΚB˜codešœ>™>Kšœ Οmœ1™