;›;Floating Point Routines for ACTION!›;›DEFINE REAL="BYTE ARRAY"›;›; Allows declarations like REAL X(6)›;›;›; OS Equates follow›;›BYTE CIX=$00F2›BYTE POINTER FR0=$D4,FR1=$E0››PROC AFP =$D800 () ;OS Ascii--> Fltpt routine›PROC FASC=$D8E6 ();OS Fltpt--> ASCII routine›PROC FPI =$D9D2 ();OS Fltpt--> Integer›PROC IFP =$D9AA ();OS Integer-->Fltpt›PROC FADD=$DA66 ();OS Fltpt ADD›PROC FSUB=$DA60 ()›PROC FMUL=$DADB ()›PROC FDIV=$DB28 ()›PROC FLOG=$DECD ()›PROC FLOG10=$DED1()›PROC FEXP=$DDC0 ();OS e**X›PROC FEXP10=$DDCC();OS 10**X››;›; Routines to INPUT Real Numbers›;››PROC InputR(REAL NUM)››InputS($580) ›POKEC($F3,$581)›CIX=0 ›AFP() ›MoveBlock(NUM,FR0,6) ›RETURN››PROC InputRD(BYTE channel, REAL NUM)›BYTE default›default=device›device=channel›InputR(NUM)›device=default›RETURN››;›; Routines to PRINT Real Numbers›;››PROC PrintR(REAL NUM)››BYTE POINTER INBUFF›MoveBlock(FR0,NUM,6)›FASC()›INBUFF=PEEKC($00F3)›WHILE INBUFF^<128› DO Put(INBUFF^) INBUFF==+1 OD›Put(INBUFF^&127)›RETURN››PROC PrintRE(REAL NUM)›PrintR(NUM)›PutE()›RETURN››PROC PrintRD(BYTE channel, REAL NUM)›BYTE default›default=device›device=channel›PrintR(NUM)›device=default›RETURN››PROC PrintRDE(BYTE channel, REAL NUM)›BYTE default›default=device›device=channel›PrintRE(NUM)›device=default›RETURN››;›; Routine used to make OS calls›;››PROC RealOPS(BYTE Operator,REAL Destination,N1,N2)››MoveBlock(FR0,N1,6)›MoveBlock(FR1,N2,6)›IF Operator=1 THEN FADD()› ELSEIF Operator=2 THEN FSUB()› ELSEIF Operator=3 THEN FMUL()› ELSEIF Operator=4 THEN FDIV()› ELSEIF Operator=5 THEN FLOG()› ELSEIF Operator=6 THEN FLOG10()› ELSEIF Operator=7 THEN FEXP()› ELSEIF Operator=8 THEN FEXP10()›FI›MoveBlock(Destination,FR0,6)›RETURN›››;›; Routines called by user to do›; Floating Point operations›;›; ››PROC RealADD(REAL Destination,N1,N2)›RealOPS(1,Destination,N1,N2)›RETURN››PROC RealSUB(REAL Destination,N1,N2)›RealOPS(2,Destination,N1,N2)›RETURN››PROC RealMUL(REAL Destination,N1,N2)›RealOPS(3,Destination,N1,N2)›RETURN››PROC RealDIV(REAL Destination,N1,N2)›RealOPS(4,Destination,N1,N2)›RETURN››PROC LOG(REAL Destination,NUM)›RealOPS(5,Destination,NUM)›RETURN››PROC LOG10(REAL Destination,NUM)›RealOPS(6,Destination,NUM)›RETURN››PROC EXP(REAL Destination,NUM)›RealOPS(7,Destination,NUM)›RETURN››PROC EXP10(REAL Destination,NUM)›RealOPS(8,Destination,NUM)›RETURN››;›; Routine to do Real-to-Integer Conversion›;›; =ROUND()›;››CARD FUNC ROUND(REAL NUM)››MoveBlock(FR0,NUM,6)›FPI()›RETURN (FR0^)››;›; Routine to do Integer-to-Real Conversion›;››PROC Float(CARD Integer, REAL Result)››CARD POINTER P›P=FR0›P^=Integer›IFP()›MoveBlock(Result,FR0,6)›RETURN›››