{
LispBox.mc
Last edit: by don 16-Feb-84 10:35:14 fixed for big mem
Created: 29-Nov-83 15:36:28 by don
}
SetTask[0];
{- - - - - - - - - - - - - - - - - - - - - - - - - -
# name len-1 stk level effect UFN table entry
366 BOXIPLUS 0 -1 \BOXIPLUS
367 BOXIDIFFERENCE 0 -1 \BOXIDIFFERENCE
Same as IPLUS2, IDIFFERENCE, except store result @tos {stack - 1} -- first arg is
number box (for which optionally check) -- and no overflow check.
- - - - - - - - - - - - - - - - - - - - - - - - - -}
@BOXIPLUS: opcode[366'b],
MAR ← [rhS, S + 0], L2 ← L2.boxiplus, c1;
uTOSH ← TOSH, GOTO[BoxComStart], c2;
TOS ← Rx + TOS, CarryBr, c3, at[L2.boxiplus, 10, ArithDOp]; {boxplus}
L3Disp, BRANCH[$, ArithBoxAddCar], c1;
TOSH ← TT + TOSH, DISP4[ArithBoxCom], c2;
ArithBoxAddCar:
TOSH ← TT + TOSH + 1, DISP4[ArithBoxCom], c2;
@BOXIDIFFERENCE: opcode[367'b],
MAR ← [rhS, S + 0], L2 ← L2.boxidiff, c1;
uTOSH ← TOSH, GOTO[BoxComStart], c2;
BoxComStart:
Rx ← MD, uTOS ← TOS, L3 ← L3.FptArg1, c3;
Q ← TOSH and 0FF, c1;
Ybus ← Q xor smallpl, ZeroBr, c2;
Ybus ← Q xor smallneg, ZeroBr, BRANCH[$, ArithBoxPos], c3;
BRANCH[ArithBoxnotsmall, ArithBoxNeg], c1;
ArithBoxPos:
TOSH ← 0, CANCELBR[$], c1;
, c2;
GOTO[ArithA1done], c3;
ArithBoxNeg:
TOSH ← TOSH xor ~TOSH, c2;
GOTO[ArithA1done], c3;
ArithBoxnotsmall:
, c2;
GOTO[ArithBoxE], c3;
TOS ← Rx - TOS, CarryBr, c3, at[L2.boxidiff, 10, ArithDOp]; {boxdiff}
L3Disp, BRANCH[$, ArithBoxSubCar], c1;
TOSH ← TT - TOSH - 1, DISP4[ArithBoxCom], c2;
ArithBoxSubCar:
TOSH ← TT - TOSH, DISP4[ArithBoxCom], c2;
GOTO[ufnZ1], c3, at[L3.FptArg1, 10, ArithBoxCom];
TT ← uChain, c3, at[L3.FptArg2, 10, ArithBoxCom];
Map ← [rhTT, TT], L0 ← L0.RedoBox, c1;
Q ← rhTT, c2;
rhRx ← Rx ← MD, XwdDisp{XDirtyDisp}, c3;
MAR ← [rhRx, TT + 0], DISP2[ArithBoxMap], c1, at[L0.RedoBox, 10, WMapFixCaller];
MDR ← TOSH, c2, at[1, 4, ArithBoxMap];
TOSH ← Q, c3;
MAR ← [rhRx, TT + 1], c1;
MDR ← TOS, CANCELBR[$, CB2], LOOPHOLE[wok], c2;
TOS ← TT, c3;
S ← S - 2, GOTO[IB.pc1], c1;
GOTO[WLMapFix], c2, at[0, 4, ArithBoxMap];
GOTO[WLMapFix], c2, at[2, 4, ArithBoxMap];
GOTO[WLMapFix], c2, at[3, 4, ArithBoxMap];
{ E N D }