home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-05-05 | 34.4 KB | 1,231 lines |
- $MACRO_FILE CALC;
- {******************************************************************************
- MULTI-EDIT MACRO FILE CALC
- CALC - The calculator
- PASTECALC - Pastes the current calculator value in at the current cursor position
-
- (C) Copyright 1989 by American Cybernetics, Inc.
- ******************************************************************************}
-
- $MACRO CALC;
- {*******************************MULTI-EDIT MACRO******************************
-
- Name: CALC
-
- Description: The pop-up calculator.
-
- Parameters:
- /NT= If 1, disables the tape.
- /TL= Determines the tape length. Defaults to 10.
- /STR= If 1, tells the calc to not actually invoke the calculator,
- but instead return a string representing a certain value
- passed to it in a certain base passed to it. Primarily
- created for pasting in the calculator result to the current
- window. The following parameters are only pertinent to the
- existance of this parameter:
- /RS= The string representation in decimal of the real value.
- /BASE= The desired base.
- /DPO= If 1, then there is a fraction behind the decimal
- point. Only applicable if /BASE=10.
- /DPL= Amount of decimal places of accuracy desired. Only
- applicable if /BASE=10 and /DPO=1.
-
- (C) Copyright 1989 by American Cybernetics, Inc.
- ******************************************************************************}
-
- Def_Int(Word_Length,Base,T_Int,Dec,Bin,Oct,Hex,Decimal_Places,Decimal_Point,
- Shift_Places,Function_Pending,Calc_X,Calc_Y,T_Explosions,Which_One,
- Word_Length_Mask,T_Lock_Stat,Visable_Tape_Length,Tape_On,Last_Key_Type,
- Actual_Tape_Length,Legal_Count,Error_Flag,Tape_Length,T_Flag,Ev_Count);
- Def_Real(T_Real,Accumulator,Entry,Memory,Max_Pos,Min_Neg);
- Def_Str(Numeric_Chars[16],T_Str,Func_Str1[3],Func_Str2[3],Disp_Str[39],
- T_Tape[60]);
- Def_Char(Input_Char,T_Char);
-
- {
- Last_Key_Type is used as a flag to tell what was done before the present
- keystroke. Here are the legal values and their meanings:
- 0 = Clear
- 1 = Numeric input
- 2 = Operation
- 3 = Result
- }
- {These are variables used as constants}
- Refresh := False;
- Numeric_Chars := '0123456789ABCDEF';
- Max_Pos := 2147483647.0;
- Min_Neg := -2147483647.0;
- {Need to investigate if it is possible for INT_R to work with this value.
- Min_Neg := -2147483648.0;
- }
- Bin := 2;
- Oct := 8;
- Dec := 10;
- Hex := 16;
- Ev_Count := 3;
- {Word_Length is a constant here. I've allowed for the possibility of saving
- into a global variable. In this case, Word_Length_Mask must be calculated.}
- Word_Length := 32;
- IF (Word_Length < 32) THEN
- Word_Length_Mask := ($FFFFFFFF Shr (32 - Word_Length));
- ELSE
- Word_Length_Mask := $FFFFFFFF;
- END;
- Set_Global_Str('Calc_Base_Display2',' Bin ');
- Set_Global_Str('Calc_Base_Display8',' Oct ');
- Set_Global_Str('Calc_Base_Display10',' Dec ');
- Set_Global_Str('Calc_Base_Display16',' Hex ');
-
- {initialize calculator variables according to Calc_Params and check and correct
- for anything out of range}
- Tape_On := Parse_Int('/NT=',MParm_Str) = 0;
- Tape_Length := Parse_Int('/TL=',MParm_Str);
- IF (Tape_Length = 0) THEN
- Tape_Length := 10;
- END;
- Calc_X := Parse_Int('/X=',Global_Str('Calc_Params'));
- Calc_Y := Parse_Int('/Y=',Global_Str('Calc_Params'));
- IF (Calc_X < 1) THEN
- Calc_X := 20;
- END;
- IF (Calc_Y = 0) THEN
- Calc_Y := Min_Window_Row + 12;
- END;
- Return_Int := Min_Window_Row + 2;
- IF (Calc_Y < Return_Int) THEN
- Calc_Y := Return_Int;
- END;
- Return_Int := Screen_Width - 44;
- IF (Calc_X > Return_Int) THEN
- Calc_X := Return_Int;
- END;
- Return_Int := Max_Window_Row - 9;
- IF (Calc_Y > Return_Int) THEN
- Calc_Y := Return_Int;
- END;
- Which_One := Parse_Int('/WO=',Global_Str('Calc_Params'));
- IF ((Which_One > 1) or (Which_One < 0)) THEN
- Which_One := 0;
- END;
- Last_Key_Type := Parse_Int('/LK=',Global_Str('Calc_Params'));
- IF ((Last_Key_Type > 3) or (Last_Key_Type < 0)) THEN
- Last_Key_Type := 0;
- END;
- Decimal_Places := Parse_Int('/DPL=',Global_Str('Calc_Params'));
- IF ((Decimal_Places > 10) or (Decimal_Places < 0)) THEN
- Decimal_Places := 0;
- END;
- Decimal_Point := Parse_Int('/DPO=',Global_Str('Calc_Params'));
- IF ((Decimal_Point > 1) or (Decimal_Point < 0)) THEN
- Decimal_Point := 0;
- END;
- Func_Str1 := Parse_Str('/FS1=',Global_Str('Calc_Params'));
- Func_Str2 := Parse_Str('/FS2=',Global_Str('Calc_Params'));
- Function_Pending := Parse_Int('/FP=',Global_Str('Calc_Params'));
- IF ((Function_Pending > 1) or (Function_Pending < 0)) THEN
- Function_Pending := 0;
- END;
- IF (RVal(Memory,Parse_Str('/MEM=',Global_Str('Calc_Params')))) THEN
- Memory := 0.0;
- END;
- IF (RVal(Accumulator,Parse_Str('/ACC=',Global_Str('Calc_Params')))) THEN
- Accumulator := 0.0;
- END;
- IF (RVal(Entry,Parse_Str('/ENT=',Global_Str('Calc_Params')))) THEN
- Entry := 0.0;
- END;
- Base := Parse_Int('/BASE=',Global_Str('Calc_Params'));
- IF (XPos(' ' + Str(Base) + ' ',' 2 8 10 16 ',1) = 0) THEN
- Base := 10;
- END;
-
- {This is the part for paste in of calculator result. Actually, it is more
- generic than that. You actually pass as parameters the string representation
- of the real value and the base, and it will return a string based on that. So
- it does not neccesarily have to be what's in the calculator.}
- IF (Parse_Int('/STR=',MParm_Str)) THEN
- IF (RVal(T_Real,Parse_Str('/RS=',MParm_Str))) THEN
- T_Real := 0.0;
- END;
- Base := Parse_Int('/BASE=',MParm_Str);
- IF (XPos(' ' + Str(Base) + ' ',' 2 8 10 16 ',1) = 0) THEN
- Base := 10;
- END;
- Decimal_Places := Parse_Int('/DPL=',MParm_Str);
- IF ((Decimal_Places > 10) or (Decimal_Places < 0)) THEN
- Decimal_Places := 0;
- END;
- Decimal_Point := Parse_Int('/DPO=',MParm_Str);
- IF ((Decimal_Point > 1) or (Decimal_Point < 0)) THEN
- Decimal_Point := 0;
- END;
- Call PASTE_IN;
- Goto SPECIAL_EXIT;
- END;
-
- {Save some stuff into variables so we can restore them later}
- T_Explosions := Explosions;
- T_Lock_Stat := Peek(0,$417);
-
- Push_Labels;
- Flabel('Help ',1,All);
- Flabel('Clear ',2,All);
- Flabel('ClrEnt',3,All);
- Flabel('And ',4,All);
- Flabel('Or ',5,All);
- Flabel('Xor ',6,All);
- Flabel('Base ',7,All);
- Flabel('+/- ',8,All);
- Flabel('Memory',9,All);
- Flabel('Tape',10,All);
- Flabel('Paste',12,All);
- Flabel('ClrTap',13,All);
- Call MAKE_FACEPLATE;
-
- Explosions := False;
- Visable_Tape_Length := 0;
- Call NUM_LOCK_ON;
-
- IF (Which_One = 1) THEN
- T_Real := Accumulator;
- ELSE
- T_Real := Entry;
- END;
-
- Save_Box(Calc_X,Calc_Y - 2,Calc_X + 44,Calc_Y - 1);
- Call DISPLAY_TAPE;
- IF (Function_Pending) THEN
- IF (Which_One) THEN
- Write(Func_Str1,Calc_X + 37,Calc_Y + 1,0,M_T_Color);
- END;
- Call MAKE_DISPLAY;
- Call WRITE_TO_DISPLAY;
- T_Real := 0.0;
- Goto GET_KEY;
- END;
-
- DISPLAY_AND_GET_KEY:
- Call MAKE_DISPLAY;
- Call WRITE_TO_DISPLAY;
- GET_KEY:
- {
- Call DISPLAY_VARS;
- }
- Read_Key;
- IF (Key1 = 0) THEN
- IF (Key2 = 250) THEN
- RM('USERIN^CHECKEVENTS /M=1/G=CALCEV/#=' + Str(Ev_Count));
-
- IF (Return_Int) THEN
-
- RM('USERIN^CHECKEVENTS /M=2/G=CALCEV/#=' + Str(Ev_Count));
- Return_Int := Parse_Int('/R=',Return_Str);
- IF (Return_Int > 127) THEN
- Key2 := Return_Int - 128;
- Goto MOUSE_KEY2;
- ELSE
- Key1 := Return_Int;
- Goto MOUSE_KEY1;
- END;
- END;
- {Mouse event}
- {
- ┌─────────────────────────────────────────╖
- ├───────────────Calculator────────────────╢
- │╔ Dec <F7>══════════════════════════════╕║▒▒
- │║ 0│║▒▒
- │╙───────────────────────────────────────┘║▒▒
- │And<F4> A B 7 8 9 Clr<F2> ║▒▒
- │Or <F5> C D 4 5 6 * / ║▒▒
- │Xor<F6> E F 1 2 3 + - ║▒▒
- │Mem<F9> CE<F3> 0 . ±<F8> =<ENTER>║▒▒
- ╘ClrTape<ShftF3>══Done<ESC>══Paste<ShftF2>╝▒▒
- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
- }
- IF (Mou_Last_Y = (Calc_Y + 4)) THEN
- {First row of "buttons"
- And<F4> A B 7 8 9 Clr<F2>
- }
- IF ((Mou_Last_X > (Calc_X)) and (Mou_Last_X < (Calc_X + 8))) THEN
- Key2 := 62;
- Goto MOUSE_KEY2;
- END;
- IF (Mou_Last_X = (Calc_X + 11)) THEN
- Key1 := 65;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 15)) THEN
- Key1 := 66;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 20)) THEN
- Key1 := 55;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 24)) THEN
- Key1 := 56;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 28)) THEN
- Key1 := 57;
- Goto MOUSE_KEY1;
- END;
- IF ((Mou_Last_X > (Calc_X + 33)) and (Mou_Last_X < (Calc_X + 41))) THEN
- Key2 := 60;
- Goto MOUSE_KEY2;
- END;
- END;
- IF (Mou_Last_Y = (Calc_Y + 5)) THEN
- {Second row of "buttons"
- Or <F5> C D 4 5 6 * /
- }
- IF ((Mou_Last_X > (Calc_X)) and (Mou_Last_X < (Calc_X + 8))) THEN
- Key2 := 63;
- Goto MOUSE_KEY2;
- END;
- IF (Mou_Last_X = (Calc_X + 11)) THEN
- Key1 := 67;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 15)) THEN
- Key1 := 68;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 20)) THEN
- Key1 := 52;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 24)) THEN
- Key1 := 53;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 28)) THEN
- Key1 := 54;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 34)) THEN
- Key1 := 42;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 38)) THEN
- Key1 := 47;
- Goto MOUSE_KEY1;
- END;
- END;
- IF (Mou_Last_Y = (Calc_Y + 6)) THEN
- {Third row of "buttons"
- Xor<F6> E F 1 2 3 + -
- }
- IF ((Mou_Last_X > (Calc_X)) and (Mou_Last_X < (Calc_X + 8))) THEN
- Key2 := 64;
- Goto MOUSE_KEY2;
- END;
- IF (Mou_Last_X = (Calc_X + 11)) THEN
- Key1 := 69;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 15)) THEN
- Key1 := 70;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 20)) THEN
- Key1 := 49;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 24)) THEN
- Key1 := 50;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 28)) THEN
- Key1 := 51;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 34)) THEN
- Key1 := 43;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 38)) THEN
- Key1 := 45;
- Goto MOUSE_KEY1;
- END;
- END;
- IF (Mou_Last_Y = (Calc_Y + 7)) THEN
- {Fourth row of "buttons"
- Mem<F9> CE<F3> 0 . ±<F8> =<ENTER>
- }
- IF ((Mou_Last_X > (Calc_X)) and (Mou_Last_X < (Calc_X + 8))) THEN
- Key2 := 67;
- Goto MOUSE_KEY2;
- END;
- IF ((Mou_Last_X > (Calc_X + 10)) and (Mou_Last_X < (Calc_X + 17))) THEN
- Key2 := 61;
- Goto MOUSE_KEY2;
- END;
- IF (Mou_Last_X = (Calc_X + 20)) THEN
- Key1 := 48;
- Goto MOUSE_KEY1;
- END;
- IF (Mou_Last_X = (Calc_X + 24)) THEN
- Key1 := 46;
- Goto MOUSE_KEY1;
- END;
- IF ((Mou_Last_X > (Calc_X + 26)) and (Mou_Last_X < (Calc_X + 32))) THEN
- Key2 := 66;
- Goto MOUSE_KEY2;
- END;
- IF ((Mou_Last_X > (Calc_X + 33)) and (Mou_Last_X < (Calc_X + 42))) THEN
- Key1 := 13;
- Goto MOUSE_KEY1;
- END;
- END;
- IF (Mou_Last_Y = Fkey_Row) THEN
- {
- RM('MOUSE^MOUSEFKEY');
- }
- RM('USERIN^MOUSEFKEY');
- Goto GET_KEY;
- END;
-
- IF (Mou_Last_Y = (Calc_Y + 1)) THEN
- IF ((Mou_Last_X > (Calc_X + 18)) and (Mou_Last_X < (Calc_X + 22))) THEN
- IF (Memory <> 0.0) THEN
- Key2 := 67;
- Goto MOUSE_KEY2;
- END;
- END;
- IF ((Mou_Last_X > (Calc_X + 2)) and (Mou_Last_X < (Calc_X + 11))) THEN
- Key2 := 65;
- Goto MOUSE_KEY2;
- END;
- END;
- {
- IF ((Mou_Last_Y = (Calc_Y + 2)) and ((Mou_Last_X > (Calc_X + 1)) and
- (Mou_Last_X < (Calc_X + 41)))) THEN
- Key2 := 85;
- Goto MOUSE_KEY2;
- END;
- }
- IF (((Mou_Last_Y < Calc_Y) and (Mou_Last_Y >= (Calc_Y - Visable_Tape_Length))) and ((Mou_Last_X > (Calc_X + 1)) and
- (Mou_Last_X < (Calc_X + 42)))) THEN
- Push_Key(key1,key2);
- Key2 := 68;
- Goto MOUSE_KEY2;
- END;
-
- IF (Mou_Last_Y = Calc_Y) THEN
- IF ((Mou_Last_X >= Calc_X) and (Mou_Last_X < (Calc_X + 43))) THEN
- Call MOUSE_MOVE;
- Goto DISPLAY_AND_GET_KEY;
- END;
- END;
- {
- IF ((Mou_Last_X = Calc_X) or (Mou_Last_X = (Calc_X + 42))) THEN
- IF ((Mou_Last_Y >= Calc_Y) and (Mou_Last_Y < (Calc_Y + 9))) THEN
- Call MOUSE_MOVE;
- Goto DISPLAY_AND_GET_KEY;
- END;
- END;
- IF ((Mou_Last_Y = Calc_Y) or (Mou_Last_Y = (Calc_Y + 8))) THEN
- IF ((Mou_Last_X >= Calc_X) and (Mou_Last_X < (Calc_X + 43))) THEN
- Call MOUSE_MOVE;
- Goto DISPLAY_AND_GET_KEY;
- END;
- END;
- }
- {
- IF (((Mou_Last_Y = Calc_Y) and ((Mou_Last_X = Calc_X) or (Mou_Last_X = Calc_X + 1)))
- or ((Mou_Last_Y = (Calc_Y + 1)) and (Mou_Last_X = Calc_X))) THEN
- Call MOUSE_MOVE;
- Goto DISPLAY_AND_GET_KEY;
- END;
- }
- {if mouse was clicked outside the boundry of the calculator, exit}
- IF ((Mou_Last_X < Calc_X) or (Mou_Last_X > (Calc_X + 44)) or
- (Mou_Last_Y < (Calc_Y - Visable_Tape_Length - 1)) or
- (Mou_Last_Y > (Calc_Y + 9))) THEN
- Push_Key(Key1,Key2);
- Goto GO_BYE_BYE;
- END;
- Goto GET_KEY;
- END;
- MOUSE_KEY2:
- IF (Key2 = 244) THEN
- Goto GO_BYE_BYE;
- END;
- IF (Key2 = 86) THEN
- Call CLEAR_TAPE;
- Goto GET_KEY;
- END;
- IF (Key2 = 85) THEN
- Kill_Box;
- Kill_Box;
- Return_Int := 1;
- Goto EXIT;
- END;
- IF (Key2 = 59) THEN
- Help('CA');
- Goto GET_KEY;
- END;
- IF (Key2 = 60) THEN
- Call CLEAR;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Key2 = 61) THEN
- Entry := 0.0;
- T_Real := 0.0;
- Decimal_Places := 0;
- Decimal_Point := False;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Key2 = 62) THEN
- Func_Str2 := 'And';
- Input_Char := 'A';
- Goto MATH_OPERATION;
- END;
- IF (Key2 = 63) THEN
- Func_Str2 := 'Or ';
- Input_Char := 'O';
- Goto MATH_OPERATION;
- END;
- IF (Key2 = 64) THEN
- Func_Str2 := 'Xor';
- Input_Char := 'X';
- Goto MATH_OPERATION;
- END;
- IF (Key2 = 65) THEN
- IF (Base = Bin) THEN
- Base := Oct;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Base = Oct) THEN
- Base := Dec;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Base = Dec) THEN
- Base := Hex;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Base = Hex) THEN
- Base := Bin;
- Goto DISPLAY_AND_GET_KEY;
- END;
- END;
- IF (Key2 = 66) THEN
- Entry := 0.0 - Entry;
- T_Real := Entry;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Key2 = 67) THEN
- Call MEMORY_MENU;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (Key2 = 68) THEN
- Call TAPE_MENU;
- Goto DISPLAY_AND_GET_KEY;
- END;
-
- IF (XPos(Char(Key2),'|72|80|75|77|240|241|242|243',1)) THEN
- {Cursor keys}
- IF ((Key2 = 72) or (Key2 = 240)) THEN
- {Up}
- IF (Calc_Y > (Min_Window_Row + 2)) THEN
- --Calc_Y;
- END;
- END;
- IF ((Key2 = 80) or (Key2 = 241)) THEN
- {Down}
- IF (Calc_Y < (Max_Window_Row - 10)) THEN
- ++Calc_Y;
- END;
- END;
- IF ((Key2 = 75) or (Key2 = 242)) THEN
- {Left}
- IF (Calc_X > 1) THEN
- --Calc_X;
- END;
- END;
- IF ((Key2 = 77) or (Key2 = 243)) THEN
- {Right}
- IF (Calc_X < (Screen_Width - 44)) THEN
- ++Calc_X;
- END;
- END;
-
- Kill_Box;
- Kill_Box;
- Call MAKE_FACEPLATE;
- Save_Box(Calc_X,Calc_Y - 2,Calc_X + 44,Calc_Y - 1);
- Call DISPLAY_TAPE;
- Goto DISPLAY_AND_GET_KEY;
- END;
- ELSE
- MOUSE_KEY1:
- IF (Key1 = 27) THEN
- GO_BYE_BYE:
- Kill_Box;
- Kill_Box;
- Return_Int := 0;
- Goto EXIT;
- END;
- Input_Char := Caps(Char(Key1));
- IF (Base = Dec) THEN
- IF ((Input_Char = '.') and ((Decimal_Point = False) or (Last_Key_Type = 3))) THEN
- Decimal_Point := True;
- Goto NUMERIC_CHAR;
- END;
- END;
- IF (XPos(Input_Char,Copy(Numeric_Chars,1,Base) + '|8',1)) THEN
- NUMERIC_CHAR:
- Func_Str2 := '';
- {Be sure that we are not about to exceed the amount of significant digits}
- IF ((Input_Char <> '|8') and (Last_Key_Type = 1)) THEN
- Call CHECK_WORD_LENGTH;
- IF (Return_Int) THEN
- Goto GET_KEY;
- END;
- END;
- IF (Last_Key_Type <> 1) THEN
- Entry := 0.0;
- T_Real := 0.0;
- IF (Input_Char <> '.') THEN
- Decimal_Point := 0;
- END;
- Decimal_Places := 0;
- Disp_Str := '0';
- END;
- Write('═══',Calc_X + 37,Calc_Y + 1,0,M_B_Color);
- Which_One := 0;
- Call INPUT_NUMERIC;
- IF (Error_Flag) THEN
- Goto ERROR;
- END;
- Entry := T_Real;
- Last_Key_Type := 1;
- Goto DISPLAY_AND_GET_KEY;
- END;
- IF (XPos(Input_Char,'+-*/',1)) THEN
- Func_Str2 := ' ' + Input_Char + ' ';
- MATH_OPERATION:
- T_Real := Entry;
- Return_Str := Input_Char;
- Call PUSH_TAPE;
- IF (Function_Pending) THEN
- T_Real := Accumulator;
- Call DO_FUNCTION;
- IF (Error_Flag) THEN
- Goto ERROR;
- END;
- Accumulator := T_Real;
- Call MAKE_DISPLAY;
- Call WRITE_TO_DISPLAY;
- ELSE
- Function_Pending := True;
- Accumulator := Entry;
- END;
- Which_One := 1;
- Decimal_Point := False;
- Decimal_Places := 0;
- Func_Str1 := Func_Str2;
- Entry := 0.0;
- T_Real := 0.0;
- Write(Func_Str1,Calc_X + 37,Calc_Y + 1,0,M_T_Color);
- Last_Key_Type := 2;
- Goto GET_KEY;
- END;
- IF (XPos(Input_Char,'=|13',1)) THEN
- IF (Func_Str2 <> '') THEN
- Write('═══',Calc_X + 37,Calc_Y + 1,0,M_B_Color);
- Entry := Accumulator;
- END;
- Which_One := 1;
- Return_Str := '=';
- Call PUSH_TAPE;
-
- IF ((Func_Str1 <> '') and (Function_Pending = True)) THEN
-
- T_Real := Accumulator;
- Function_Pending := False;
- Call DO_FUNCTION;
- IF (Error_Flag) THEN
- Goto ERROR;
- END;
-
- ELSE
- T_Real := Entry;
- END;
-
- Accumulator := T_Real;
- Entry := T_Real;
- Call MAKE_DISPLAY;
- Return_Str := ' ';
- Call PUSH_TAPE;
- Return_Str := '─';
- Call PUSH_TAPE;
- Func_Str2 := ' = ';
- Last_Key_Type := 3;
- Goto DISPLAY_AND_GET_KEY;
-
- END;
- END;
- Goto GET_KEY;
-
- ERROR:
- Write(' Error! Press any key...',Calc_X + 2,Calc_Y + 2,0,M_S_Color);
- Read_Key;
- Call CLEAR;
- Goto DISPLAY_AND_GET_KEY;
-
- {********************************** SUBROUTINES ******************************}
- {
- DISPLAY_VARS:
- {For debugging only!}
- {
- Write('Last_Key_Type= [' + Str(Last_Key_Type) + '] ',1,1,0,Error_Color);
- Write('Which_One= [' + Str(Which_One) + '] ',1,2,0,Error_Color);
- }
-
- Write('Decimal_Point= [' + Str(Decimal_Point) + '] ',1,1,0,Error_Color);
- Write('Decimal_Places= [' + Str(Decimal_Places) + '] ',1,2,0,Error_Color);
- Write('T_REAL= [' + RSTR(T_Real,10,10) + '] ',1,3,0,Error_Color);
- Write('ACCUMULATOR= [' + RSTR(Accumulator,10,10) + '] ',1,4,0,Error_Color);
- Write('ENTRY= [' + RSTR(Entry,10,10) + '] ',1,5,0,Error_Color);
- Write('MEMORY= [' + RSTR(Memory,10,10) + '] ',1,6,0,Error_Color);
- Write('Func_Str2= [' + Func_Str2 + '] ',1,7,0,Error_Color);
- Write('Func_Str1= [' + Func_Str1 + '] ',1,8,0,Error_Color);
- Write('Function_Pending=[' + Str(Function_Pending) + '] ',1,9,0,Error_Color);
- Write('Which_One= [' + Str(Which_One) + '] ',1,10,0,Error_Color);
- {
- T_Int := 0;
- WHILE (T_Int < Tape_Length) DO
- ++T_Int;
- Write('Calc_Tape' + Str(T_Int) + '=[' + Global_Str('Calc_Tape' + Str(T_Int)) + '] ',1,T_Int,0,Error_Color);
- END;
- }
- RET;
- }
- MOUSE_MOVE:
- RM('WINDOW^MOVE_WIN /X1=' + str(calc_x) +
- '/Y1=' + str(calc_y) +
- '/X2=' + str(calc_x + 42) +
- '/Y2=' + str(calc_y + 8) +
- '/MX1=1/MY1=' + str(min_window_row + 1) +
- '/MX2=' + str(screen_width) + '/MY2=' + Str(Max_window_row - 2) );
- calc_x := parse_int('/X1=',return_str);
- calc_y := parse_int('/Y1=',return_str);
- kill_box;
- kill_box;
- Call MAKE_FACEPLATE;
- Save_Box(Calc_X,Calc_Y - 2,Calc_X + 44,Calc_Y - 1);
- Call DISPLAY_TAPE;
- RET;
-
- NUM_LOCK_ON:
-
- Poke(0,$417,Peek(0,$417) or $20);
- RET;
-
- NUM_LOCK_OFF:
- Poke(0,$417,Peek(0,$417) and $DF);
- RET;
-
- CHECK_WORD_LENGTH:
- IF (Base = Dec) THEN
- T_Real := Entry;
- Call GET_DECIMAL_PLACES;
- Return_Str := RStr(Entry,0,Return_Int);
- Return_Int := ((Length(Return_Str) - (XPos('.',Return_Str,1) > 0) -
- (Entry < 1.0)) > 9);
- ELSE
- Return_Int := (Copy(Remove_Space(Disp_Str),1,1) <> '0');
- END;
- RET;
-
- TAPE_MENU:
- {Build global strings for DVMENU}
- T_Int := 0;
- Legal_Count := 0;
- WHILE (T_Int < Actual_Tape_Length) DO
- ++T_Int;
- T_Tape := Global_Str('Calc_Tape' + Str(T_Int));
- T_Char := Parse_Str('/OP=',T_Tape);
- Return_Int := XPos(T_Char,'─C',1);
- IF (Return_Int = False) THEN
- ++Legal_Count;
- END;
- Set_Global_Str('Calc_Tape_Dv' + Str(Actual_Tape_Length - T_Int + 1),
- Copy(Parse_Str('/DS=',T_Tape) + ' '
- ,((Return_Int = 2) * 39) + 1,39) + Copy(' ─',(Return_Int = 1) + 1,1) + Copy(T_Char + ' ─|254 |254 ',
- ((Return_Int) * 2) + 1,2));
- END;
- IF (Legal_Count = 0) THEN
- Ret;
- END;
- Call NUM_LOCK_OFF;
- IF (Tape_On = False) THEN
- Put_Box(Calc_X,Calc_Y - Visable_Tape_Length - 1,Calc_X + 42,Calc_Y,0,M_B_Color,'',False);
- END;
- {
- Write(' = select <Enter> = recall <Esc> = exit',Calc_X + 1,Calc_Y - Visable_Tape_Length - 1,0,M_T_Color);
- }
- Write('╞═════════════════════════════════════════╣',Calc_X,Calc_Y,0,M_B_Color);
-
- RM('USERIN^DVMENU /P=CALC_TAPE_DV/H=CA/NR=1/I=%/WW=41/SK=1/#=' +
- Str(Actual_Tape_Length) + '/X=' + Str(Calc_X) + '/Y=' +
- Str(Calc_Y - Visable_Tape_Length - 1) + '/SN=' + Str(Actual_Tape_Length) +
- '/MH=' + Str(Visable_Tape_Length));
-
- IF (Tape_On = False) THEN
- Kill_Box;
- END;
- IF (Return_Int) THEN
- {Turn the string into a real value, then stuff it into the entry}
- Return_Int := Actual_Tape_Length - Global_Int('DVINT') + 1;
- Return_Str := Remove_Space(Copy(Parse_Str('/DS=',Global_Str('Calc_Tape' +
- Str(Return_Int))),1,39));
- T_Int := Parse_Int('/B=',Global_Str('Calc_Tape' + Str(Return_Int)));
- IF (T_Int = Bin) THEN
- Call STRIP_SPACES;
- END;
- Return_Int := T_Int;
- IF (Base = Dec) THEN
- Decimal_Point := XPos('.',Return_Str,1);
- IF (Decimal_Point) THEN
- Decimal_Places := Length(Return_Str) - Decimal_Point;
- Decimal_Point := True;
- END;
- END;
- Call STRING_TO_REAL;
- Entry := T_Real;
- Which_One := 0;
- Func_Str2 := '';
- END;
- Call NUM_LOCK_ON;
- Kill_Box;
- Kill_Box;
- Call MAKE_FACEPLATE;
- Save_Box(Calc_X,Calc_Y - 2,Calc_X + 44,Calc_Y - 1);
- Call DISPLAY_TAPE;
- RET;
-
- CLEAR_TAPE:
- T_Int := Tape_Length;
- WHILE (T_Int) DO
- Set_Global_Str('Calc_Tape' + Str(T_Int),'');
- --T_Int;
- END;
- Call DISPLAY_TAPE;
- RET;
-
- PUSH_TAPE:
- T_Int := Tape_Length - 1;
- WHILE (T_Int) DO
- Set_Global_Str('Calc_Tape' + Str(T_Int + 1),Global_Str('Calc_Tape' + Str(T_Int)));
- --T_Int;
- END;
- IF (Return_Str = '/') THEN
- Return_Str := '//';
- END;
- IF (Return_Str = 'C') THEN
- Set_Global_Str('Calc_Tape1','/DS= 0/OP=' + Return_Str + '/B=' + Str(Base));
- ELSE
- IF (Return_Str = '─') THEN
- Set_Global_Str('Calc_Tape1','/DS=───────────────────────────────────────/OP=' + Return_Str + '/B=' + Str(Base));
- ELSE
- Set_Global_Str('Calc_Tape1','/DS=' + Disp_Str + '/OP=' + Return_Str + '/B=' + Str(Base));
- END;
- END;
- Call DISPLAY_TAPE;
- RET;
-
- DISPLAY_TAPE:
- {First, determine how long the tape is currently}
- T_Int := Tape_Length;
- WHILE (((Remove_Space(Parse_Str('/DS=',Global_Str('Calc_Tape' + Str(T_Int)))) = '') or (Parse_Str('/OP=',Global_Str('Calc_Tape' + Str(T_Int))) = 'C'))
- and
- (T_Int > 0)) DO
- --T_Int;
- END;
- Actual_Tape_Length := T_Int;
- {Determine if the position of the calculator will restrict displaying all of
- tape}
- Return_Int := Calc_Y - Min_Window_Row - 1;
- IF (T_Int > Return_Int) THEN
- T_Int := Return_Int;
- END;
- Visable_Tape_Length := T_Int;
- {Redraw the box around the tape}
- Kill_Box;
- Save_Box(Calc_X,Calc_Y - Visable_Tape_Length - 1,Calc_X + 44,Calc_Y - 1);
- IF (Tape_On = False) THEN
- Ret;
- END;
- T_Int := 0;
- WHILE (T_Int < Visable_Tape_Length) DO
- ++T_Int;
- Write('│ ║',Calc_X,Calc_Y - T_Int,0,M_B_Color);
- IF (Parse_Str('/OP=',Global_Str('Calc_Tape' + Str(T_Int))) = 'C') THEN
- Write(' ',Calc_X + 1,
- Calc_Y - T_Int,0,M_T_Color);
- ELSE
- IF (Parse_Str('/OP=',Global_Str('Calc_Tape' + Str(T_Int))) = '─') THEN
- Write('─────────────────────────────────────────',
- Calc_X + 1,Calc_Y - T_Int,0,M_T_Color);
- ELSE
- Write(Parse_Str('/DS=',Global_Str('Calc_Tape' + Str(T_Int))) + ' ' +
- Parse_Str('/OP=',Global_Str('Calc_Tape' + Str(T_Int)))
- ,Calc_X + 1,Calc_Y - T_Int,0,M_T_Color);
- END;
- END;
- END;
- Write('┌─────────────────────────────────────────╖',Calc_X,Calc_Y - T_Int - 1,0,M_B_Color);
- RET;
-
- MEMORY_MENU:
- {
- Write('MEM: <CR>=MIn +=M+ R=MRec <ESC>=Exit',Calc_X + 2,Calc_Y + 1,0,M_T_Color);
- }
- Write('MEM:',Calc_X + 2,Calc_Y + 1,0,M_T_Color);
- Set_Global_Str('MEMEV1','/T=MIn/KC=<ENTER>/W=10/K1=13/K2=28/R=13/Y=' +
- Str(Calc_Y + 1) + '/X=' + Str(Calc_X + 7));
- Set_Global_Str('MEMEV2','/T=M+/KC=<+>/W=5/K1=43/K2=78/R=43/Y=' +
- Str(Calc_Y + 1) + '/X=' + Str(Calc_X + 18));
- Set_Global_Str('MEMEV3','/T=MRec/KC=<R>/W=7/K1=82/K2=19/R=82/Y=' +
- Str(Calc_Y + 1) + '/X=' + Str(Calc_X + 24));
- Set_Global_Str('MEMEV4','/T=Exit/KC=<ESC>/W=9/K1=27/K2=1/R=27/Y=' +
- Str(Calc_Y + 1) + '/X=' + Str(Calc_X + 32));
- RM('USERIN^CHECKEVENTS /M=2/G=MEMEV/#=4');
-
- Read_Key;
- IF ((Key1 = 0) and (key2 = 250)) THEN
- RM('USERIN^CHECKEVENTS /M=1/G=MEMEV/#=4');
- IF (Return_Int) THEN
- Key1 := Parse_Int('/R=',Global_Str('MEMEV' + Str(Return_Int)));
- ELSE
- Push_Key(Key1,Key2);
- Goto MEMORY_EXIT;
- END;
- END;
- IF (Key1 = 27) THEN
- Goto MEMORY_EXIT;
- END;
- IF (Key1 = 13) THEN
- IF (Which_One = 1) THEN
- Memory := Accumulator;
- ELSE
- Memory := Entry;
- END;
- Goto MEMORY_EXIT;
- END;
- IF (Key1 = 43) THEN
- IF (Which_One = 1) THEN
- Memory := Memory + Accumulator;
- ELSE
- Memory := Memory + Entry;
- END;
- Goto MEMORY_EXIT;
- END;
- IF ((Key1 = 114) or (Key1 = 82)) THEN
- Entry := Memory;
- T_Real := Memory;
- Which_One := 0;
- Func_Str2 := '';
- Goto MEMORY_EXIT;
- END;
- Goto MEMORY_MENU;
-
- MEMORY_EXIT:
- Write('<F7>══════════════════════════════',Calc_X + 7,Calc_Y + 1,0,M_B_Color);
- RET;
-
- MAKE_FACEPLATE:
- set_virtual_display;
-
- Put_Box(Calc_X,Calc_Y,Calc_X + 44,Calc_Y + 9,0,M_B_Color,'Calculator',True);
- IF (Tape_On) THEN
- Write('├',Calc_X,Calc_Y,0,M_B_Color);
- Write('╢',Calc_X + 42,Calc_Y,0,M_B_Color);
- END;
- Write('╔ <F7> ═════════════════════════════╕',Calc_X + 1,Calc_Y + 1,0,M_B_Color);
- Write('║ │',Calc_X + 1,Calc_Y + 2,0,M_B_Color);
- Write('╙───────────────────────────────────────┘',Calc_X + 1,Calc_Y + 3,0,M_B_Color);
- Write('And<F4> A B 7 8 9 Clr<F2>',Calc_X + 1,Calc_Y + 4,0,M_B_Color);
- Write('Or <F5> C D 4 5 6 * /',Calc_X + 1,Calc_Y + 5,0,M_B_Color);
- Write('Xor<F6> E F 1 2 3 + -',Calc_X + 1,Calc_Y + 6,0,M_B_Color);
- Write('Mem<F9> CE<F3> 0 . ±<F8> =<ENTER>',Calc_X + 1,Calc_Y + 7,0,M_B_Color);
-
- Set_Global_Str('CALCEV1','/T=Done/KC=<ESC>/W=9/K1=27/K2=1/R=27/Y=' +
- Str(Calc_Y + 8) + '/X=' + Str(Calc_X + 18));
- Set_Global_Str('CALCEV2','/T=ClrTape/KC=<ShftF3>/W=15/K1=0/K2=86/R=214/Y=' +
- Str(Calc_Y + 8) + '/X=' + Str(Calc_X + 1));
- Set_Global_Str('CALCEV3','/T=Paste/KC=<ShftF2>/W=13/K1=0/K2=85/R=213/Y=' +
- Str(Calc_Y + 8) + '/X=' + Str(Calc_X + 29));
-
- RM('USERIN^CHECKEVENTS /M=2/G=CALCEV/#=' + Str(Ev_Count));
- update_virtual_display;
- reset_virtual_display;
- RET;
-
- WRITE_TO_DISPLAY:
- {
- Write(Global_Str('Calc_Base_Display' + Str(Base)) + Copy('══M ',
- ((Memory <> 0.0) * 2) + 1,2), Calc_X + 2,Calc_Y + 1,0,M_B_Color);
- }
- Write(Copy('═══ M ',((Memory <> 0.0) * 3) + 1,3),Calc_X + 19,Calc_Y + 1,0,
- M_B_Color);
- Write(Global_Str('Calc_Base_Display' + Str(Base)),Calc_X + 2,Calc_Y + 1,0,
- M_B_Color);
- Write(Disp_Str,Calc_X + 2,Calc_Y + 2,0,M_S_Color);
- GotoXY(Calc_X + 40,Calc_Y + 2);
- RET;
-
- CLEAR:
- Which_One := 0;
- Decimal_Places := 0;
- Decimal_Point := False;
- Accumulator := 0.0;
- Entry := 0.0;
- T_Real := 0.0;
- Func_Str1 := '';
- Func_Str2 := '';
- Last_Key_Type := 0;
- Function_Pending := False;
- Write('═══',Calc_X + 37,Calc_Y + 1,0,M_B_Color);
- Return_Str := 'C';
- Call PUSH_TAPE;
- RET;
-
- DO_FUNCTION:
- Error_Flag := False;
- IF (Func_Str1 = ' + ') THEN
- T_Real := T_Real + Entry;
- IF (T_Real > Max_Pos) THEN
- Error_Flag := True;
- END;
- END;
- IF (Func_Str1 = ' - ') THEN
- T_Real := T_Real - Entry;
- IF (T_Real < Min_Neg) THEN
- Error_Flag := True;
- END;
- END;
- IF (Func_Str1 = ' * ') THEN
- T_Real := T_Real * Entry;
- IF (T_Real > Max_Pos) THEN
- Error_Flag := True;
- END;
- END;
- IF (Func_Str1 = ' / ') THEN
- IF (Entry = 0.0) THEN
- Error_Flag := True;
- Ret;
- END;
- T_Real := T_Real / Entry;
- END;
- {if we are doing And Or Xor, we need to convert to integer type first,
- do the operation, then convert back to real.}
- IF (Func_Str1 = 'And') THEN
- T_Real := Real_I(Int_R(T_Real) and Int_R(Entry));
- END;
- IF (Func_Str1 = 'Or ') THEN
- T_Real := Real_I(Int_R(T_Real) or Int_R(Entry));
- END;
- IF (Func_Str1 = 'Xor') THEN
- T_Real := Real_I(Int_R(T_Real) xor Int_R(Entry));
- END;
- IF ((Base = Dec) and (Error_Flag = False)) THEN
- {Adjust decimal_Places}
- Call GET_DECIMAL_PLACES;
- Decimal_Places := Return_Int;
- END;
- RET;
-
- GET_DECIMAL_PLACES:
- Return_Str := RStr(T_Real,0,10);
- Return_Str := Copy(Return_Str,XPos('.',Return_Str,1),11);
- T_Int := 11;
- WHILE (Copy(Return_Str,T_Int,1) = '0') DO
- --T_Int;
- END;
- --T_Int;
- Return_Int := T_Int;
- RET;
-
- STRIP_SPACES:
- Return_Int := XPos(' ',Return_Str,1);
- IF (Return_Int) THEN
- Return_Str := Str_Del(Return_Str,Return_Int,1);
- Goto STRIP_SPACES;
- END;
- RET;
-
- INPUT_NUMERIC:
- Call MAKE_DISPLAY;
- Return_Str := Remove_Space(Disp_Str);
- IF (Base = Bin) THEN
- Call STRIP_SPACES;
- END;
- IF (Base = Dec) THEN
- IF ((Decimal_Point = True) and (Input_Char <> '.')) THEN
- IF (Input_Char = '|8') THEN
- IF (Decimal_Places = 0) THEN
- Decimal_Point := False;
- Goto DELETE_DEC;
- END;
- --Decimal_Places;
- {
- IF (Decimal_Places = 0) THEN
- }
- Goto DELETE_DEC;
- {
- END;
- }
- ELSE
- ++Decimal_Places;
- END;
- ELSE
- IF (Input_Char = '|8') THEN
- DELETE_DEC:
- Return_Str := Copy(Return_Str,1,Length(Return_Str) - 1);
- END;
- END;
- ELSE
- IF (Input_Char = '|8') THEN
- Return_Str := Copy('0' + Return_Str,1,Length(Return_Str));
- ELSE
- Return_Str := Copy(Return_Str,2,31);
- END;
- END;
- IF (XPos(Input_Char,'.|8',1) = 0) THEN
- Return_Str := Return_Str + Input_Char;
- END;
- {now, convert it back to a real}
- Return_Int := Base;
- {We are storing Base into Return_Int just so we can accomodate a call to the
- following label}
- STRING_TO_REAL:
- IF (Return_Int = Dec) THEN
- Return_Int := RVal(T_Real,Return_Str);
- ELSE
- T_Real := 0.0;
- T_Int := Length(Return_Str);
- WHILE (T_Int > 0) DO
- T_Real := T_Real + Real_I((XPos(Copy(Return_Str,Length(Return_Str) - T_Int
- + 1,1),'0123456789ABCDEF',1) - 1) Shl (Shift_Places * (T_Int - 1)));
- --T_Int
- END;
- END;
-
- IF ((T_Real > Max_Pos) or (T_Real < Min_Neg)) THEN
- Error_Flag := True;
- ELSE
- Error_Flag := False;
- END;
- RET;
-
- MAKE_DISPLAY:
- {This routine will change T_Real into a string representation according to the
- base}
- IF (Base = Dec) THEN
- Disp_Str := RStr(T_Real,0,Decimal_Places);
- IF ((Decimal_Point = True) and (Decimal_Places = 0)) THEN
- Disp_Str := Disp_Str + '.';
- END;
- ELSE
- Return_Int := Int_R(T_Real) and Word_Length_Mask;
- Disp_Str := '';
- IF (Base = Bin) THEN
- Shift_Places := 1;
- END;
- IF (Base = Oct) THEN
- Shift_Places := 3;
- END;
- IF (Base = Hex) THEN
-
- Shift_Places := 4;
- END;
-
- WHILE (Return_Int <> 0) DO
- Disp_Str := Copy('0123456789ABCDEF',((Return_Int and (Base - 1)) + 1),1) + Disp_Str;
- Return_Int := Return_Int shr Shift_Places;
- END;
- Return_Int := Svl(Disp_Str);
- IF (Return_Int < (Word_Length / Shift_Places)) THEN
- Disp_Str := Copy('00000000000000000000000000000000',1,(Word_Length / Shift_Places) - Return_Int) + Disp_Str;
- END;
- END;
- IF (Base = Bin) THEN
- {Put in spaces every 4 bits for clarity}
- T_Int := (Word_Length / 4) - 1;
- WHILE (T_Int) DO
- Disp_Str := Str_Ins(' ',Disp_Str,(T_Int * 4) + 1);
- --T_Int;
- END;
- END;
- Disp_Str := Copy(' ',1,39 - (Svl(Disp_Str))) + Disp_Str;
- RET;
-
- PASTE_IN:
- Call MAKE_DISPLAY;
- Return_Str := Remove_Space(Disp_Str);
- RET;
-
- {*****************************************************************************}
-
- EXIT:
- {Save all pertainant stuff into a global}
- Set_Global_Str('Calc_Params',
- '/X=' + Str(Calc_X) +
- '/Y=' + Str(Calc_Y) +
- '/WO=' + Str(Which_One) +
- '/LK=' + Str(Last_Key_Type) +
- '/BASE=' + Str(Base) +
- '/DPL=' + Str(Decimal_Places) +
- '/DPO=' + Str(Decimal_Point) +
- '/FS1=' + Func_Str1 +
- '/FS2=' + Func_Str2 +
- '/FP=' + Str(Function_Pending) +
- '/MEM=' + RStr(Memory,10,10) +
- '/ACC=' + RStr(Accumulator,10,10) +
- '/ENT=' + RStr(Entry,10,10)
- );
- {Restore all altered system vars, etc.}
- RM('USERIN^CHECKEVENTS /M=3/G=CALCEV/#=' + Str(Ev_Count));
- RM('USERIN^CHECKEVENTS /M=3/G=MEMEV/#=4');
- Set_Global_Str('CALCEV1','');
- Poke(0,$417,(Peek(0,$417) and $DF) or (T_Lock_Stat and $20));
- Explosions := T_Explosions;
- Pop_Labels;
- IF (Return_Int) THEN
- {If they want to paste in the result, do it}
- Call PASTE_IN;
- Text(Return_Str);
- END;
- SPECIAL_EXIT:
- Return_Int := 1;
- END_MACRO;
-
- $MACRO PASTE_CALC;
- {*******************************MULTI-EDIT MACRO******************************
-
- Name: PASTE_CALC
-
- Description: Will place the value last displayed on the calculator at the
- current cursor position.
-
- (C) Copyright 1989 by American Cybernetics, Inc.
- ******************************************************************************}
-
- {Determine if the value last displayed is an entry or a result, then use the
- appropriate value}
- IF (Parse_Int('/WO=',Global_Str('Calc_Params')) = 1) THEN
- Return_Str := Parse_Str('/ACC=',Global_Str('Calc_Params'));
- ELSE
- Return_Str := Parse_Str('/ENT=',Global_Str('Calc_Params'));
- END;
- RM('CALC /STR=1/RS=' + Return_Str + '/BASE=' +
- Parse_Str('/BASE=',Global_Str('Calc_Params')) + '/DPL=' +
- Parse_Str('/DPL=',Global_Str('Calc_Params')) + '/DPO=' +
- Parse_Str('/DPO=',Global_Str('Calc_Params')));
-
- Text(Return_Str);
- END_MACRO;