*                                          ***  EVALUATE PROGRAMMER-DEFINED FUNCTION  ***                                          *FORM8 LDA 1,I       LOAD ADDRESS OF FORMULA      [E]      JSB PSHST     SAVE VALUE OF                [E]      LDB TMPST       CURRENT POINTER TO         [E]      STB PBPTR,I       TEMPORARY STACK          [E]      JSB PSHST     SAVE ADDRESS OF              [E]      STA PBPTR,I     DEFINING FORMULA           [E]      LDA FORMX     SAVE FORMX                   [E]      STA OPDST,I     RETURN ADDRESS             [E]      JSB FORMX     EVALUATE ARGUMENT            [E]      LDA OPDST,I   SWAP                         [E]      LDB OPTRQ,I     OLD AND NEW                [E]      STB OPDST,I       ARGUMENT                 [E]      STA OPTRQ,I         ADDRESSES              [E]      CPA TMPST     PROTECT PARAMETER            [E]      JSB RSCHK       ON TEMPORARY STACK         [E]      LDA TEMP1     SWAP ADDRESSES               [E]      LDB PBPTR,I     OF CURRENT                 [E]      STB TEMP1         AND FUNCTION             [E]      STA PBPTR,I         FORMULAS               [E]      JSB FORMX     EVALUATE FUNCTION            [E]      LDB OPDST,I   POP                          [E]      LDA .-2         OPERAND                    [E]      ADA OPDST         STACK,                   [E]      STA OPDST           SAVING                 [E]      LDA OPDST,I           RESULT ADDRESS       [E]      STA OPTRQ,I             AND ADDRESS OF     [E]      STB OPDST,I               OLD PARAMETER    [E]      LDA PBPTR,I   RESTORE                      [E]      STA TEMP1       FORMULA POINTER            [E]      LDA PBPTR     POP                          [E]      ADA .-2         OPERATOR                   [E]      STA PBPTR         STACK                    [E]      LDA PBPTR,I   RESTORE ORIGINAL             [E]      STA TMPST       TEMPORARY STACK POINTER    [E]      JSB STTOP     LOAD FUNCTION RESULT         [E]*                               * **  RECORD RESULT OF FUNCTION  ** *                               * * *  PRE-DEFINED FUNCTIONS RETURN TO THIS POINT WITH THEIR*  RESULT IN (A) AND (B). * FOR10 DST TMPST,I   SAVE RESULT                  [E]      LDA OPDST,I   RESTORE FORMX                [E]      STA FORMX       RETURN ADDRESS             [E]      LDA TMPST     RECORD LOCATION              [E]      STA OPDST,I     OF RESULT                  [E]      LDB PBPTR     POP                          [E]      ADB .-2         FUNCTION                   [E]      STB PBPTR         ADDRESS                  [E]      ISZ TEMP1     SKIP OVER                    [E]      ISZ TEMP1       RIGHT PARENTHSIS           [E]      JMP FORM2     LEAVE RESULT ON OPERAND STACK[E]      SKP *                    ***  EVALUATE 'LEN'  ***                    *FOR12 JSB RSCHK     CREATE SPACE ON TEMPORARY STACK       LDA TEMP1,I   FIND      AND OPDMK       STRING'S      ADA .-1           SYMBOL      ALS                 TABLE       ADA SYMTB             ENTRY       INA           LOAD ADDRESS      LDA 0,I         OF STRING       ADA .-1       EXTRACT       LDA 0,I         STRING      AND B377          LENGTH      JSB FLOAT     STACK       DST TMPST,I     STRING LENGTH       LDA TMPST     STACK ADDRESS       STA OPDST,I     OF RESULT       JMP FOR12-3 *                             * **  PROCESS STRING CONSTANT  ** *                             * * *  WHEN STRING CONSTANTS ARE STACKED, AN APPROPRIATE*  ENTRY IS PLACED ON THE TEMPORARY STACK SO THAT ALL *  STRING OPERANDS HAVE THE SAME FORM:  A NEGATED BASE*  ADDRESS ON THE OPERAND STACK AND A TWO WORD ENTRY ON *  THE TEMPORARY STACK CONTAINING THE START-OF-STRING *  AND END-OF-STRING DESIGNATORS BIASED BY -1 (DEFAULT*  START-OF-STRING DESIGNATORS HAVE A STACK VALUE OF 0, *  DEFAULT END-OF-STRING DESIGNATORS HAVE A STACK VALUE *  OF -1).  IN THE CASE OF SUBSCRIPTED STRING VARIABLES,*  THE TEMPORARY IS CREATED WHEN THE ']' IS SCANNED; THE*  ENTRY FOR NON-SUBSCRIPTED STRING OPERANDS IS CREATED *  WHEN THEY ARE SCANNED. * FOR13 CLA,INA       PRINT STATEMENT       CPA EOL         STRING CONSTANT?      JSB STSTR     NO, STACK STRING CONSTANT       JMP FORM3     EXECUTE END-OF-FORMULA      SKP *                                ***  RECORD RESULT OF OPERATION  ***                                ** *  OPERATORS CREATING INTERMEDIATE RESULTS RETURN TO HERE.* FOR14 ISZ OPDST     STACK       ISZ OPDST       TEMPORARY       DST TMPST,I       RESULT      LDA TMPST     SAVE      STA OPDST,I     ADDRESS ON      JMP FORM4         OPERAND STACK *                            ***  EXIT FORMULA EVALUATOR  ***                            ** *  THIS WORD IS ACTUALLY PART OF THE FORMULA OPERATOR JUMP*  TABLE.  THE WORDS BETWEEN IT AND FOJT CORRESPOND TO*  OPERATORS WHICH ARE NOT EXECUTED, SO CODE IS INSERTED HERE *  TO UTILIZE THIS SPACE. *       DEF FORMX,I **                        *****  SET LOGICAL VALUES  *****                        **FALSE CLA           LOAD      CLB             ZERO      JMP FOR14 TRUE  LDA HALF      LOAD      LDB .+2         1.0       JMP FOR14 **                     ** ***  EXECUTE UNARY -  *** **                     ** EUMIN JSB STTOP     UNSTACK AND LOAD TOP OF STACK       JSB ARINV     NEGATE IT       JMP FOR14     STORE IT**                                 ** ***  FORMULA OPERATOR JUMP TABLE  *** **                                 ** FOJT  DEF ELBRC     [       DEF FORM1     (       DEF FORM4     UNARY +       DEF EUMIN     UNARY -       DEF ESCMA     SUBSCRIPT COMMA       DEF ESTR      ASSIGNMENT OPERATOR       DEF EFAD      +       DEF EFSB      -       DEF EFMP      *       DEF EFDV      /       DEF EPWR      ^       DEF EGTRT     >       DEF ELST      <       DEF ENEQL     #       DEF EEQL      =       NOP           UNUSED      NOP       NOP             OPERATOR      NOP       NOP               CODES       DEF EAND      AND       DEF EIOR      OR      DEF EMIN      MIN       DEF EMAX      MAX       DEF ENEQL     <>      DEF EGORE     >=      DEF ELORE     <=      DEF ENOT      NOT **                          *****  EXECUTE LEFT BRACKET  *****                          *** *  LOAD A DEFAULT SECOND SUBSCRIPT AND ENTER THE CODE FOR *  A SUBSCRIPT COMMA. * ELBRC LDA OPDST     LOAD      ADA .-2         -1      LDA 0,I           FOR A       CCB                 STRING,       SSA,RSS               0       CLB                     FOR       JMP ESCM1                 AN ARRAY**                             ** ***  EXECUTE SUBSCRIPT COMMA  *** **                             ** * *  BOTH SUBSCRIPTS ARE ROUNDED TO INTEGERS AND TESTED TO BE *  POSITIVE.  FOR STRINGS, THE TWO INTEGERS ARE SAVED ON THE*  TEMPORARY STACK AS A PSUEDO-ENTRY LATER USED BY PSTR.  FOR *  ARRAYS, THE SUBSCRIPTS ARE CHECKED AND IF WITHIN THE CURRENT *  BOUNDS THEY ARE COMBINED WITH THE BASE ADDRESS OF THE ARRAY. *  THE ARRAY ELEMENT ADDRESS THEN REPLACES THE BASE ADDRESS ON*  THE OPERAND STACK.  UNSUITABLE SUBSCRIPTS EXIT TO THE ERROR*  ROUTINE. * ESCMA JSB OPCHK     UNSTACK       DLD 1,I         SECOND SUBSCRIPT      JSB SBFIX     ROUND TO INTEGER      JSB RERRS+17,I  UNSUITABLE RESULT       LDA PBPTR     UNSTACK       ADA .-2         THE       STA PBPTR         '[' ESCM1 STB TEMP4     SAVE RESULT       JSB STTOP     POP FIRST SUBSCRIPT       JSB SBFIX     ROUND TO INTEGER      JSB RERRS+17,I  UNSUITABLE RESULT       STB TMPST,I   STORE IN TEMPORARY STACK      LDA OPDST,I   STRING      SSA,RSS         VARIABLE?       JMP ESCM2     NO, ARRAY VARIABLE      LDA TMPST     YES,      INA             SAVE      LDB TEMP4         SECOND SUBSCRIPT IN       STB 0,I             TEMPORARY STACK       JMP FORM1 ESCM2 ADA .-2       LOAD COLUMN       DLD 0,I         AND ROW BOUNDS      CMA,INA       IS SPECIFIED      ADA TMPST,I     ROW       SSA,RSS           LEGAL?      JSB RERRS+17,I  NO      STB TEMP5     YES       CMB,INB       IS SPECIFIED      ADB TEMP4       COLUMN      SSB,RSS           LEGAL?      JSB RERRS+17,I  NO      LDA TMPST,I   YES, COMPUTE ROW      MPY TEMP5       DISPLACEMENT      ADA TEMP4     ADD COLUMN DISPLACEMENT       ALS           DOUBLE FOR CORE WORDS       ADA OPDST,I   STORE ACTUAL      STA OPDST,I     ELEMENT ADDRESS       LDA TMPST     POP UNUSED      ADA .-2         TEMPORARY       STA TMPST         STACK       JMP FORM1           ENTRY **                   ** ***  EXECUTE STORE  *** **                   ** * *  IN ORDER TO ALLOW MULTIPLE ASSIGNMENT STATEMENTS, NO *  ASSIGNMENT CAN TAKE PLACE UNTIL THE RIGHT-HAND FORMULA *  IS EVALUATED; I.E. ONLY AN END-OF-FORMULA OPERATOR CAN *  FORCE AN ASSIGNMENT OPERATOR OFF OF THE STACK.  ASSIGNMENTS*  MAY BE NUMERICAL TO NUMERICAL TYPE OPERAND, IN WHICH CASE*  THE ASSIGNED QUANTITY IS SAVED FOR POSSIBLE ADDITIONAL *  ASSIGNMENTS; OR STRING TO STRING OPERAND.  IN THE LATTER *  CASE AN INTERMEDIATE STRING IS NECESSARY IF THE HEAD OF*  THE DESTINATION STRING LIES IN THE TAIL OF THE ACTUAL*  SOURCE STRING. * ESTR  LDB TEMP2     NEXT OPERATOR AN      SZB             END-OF-FORMULA?       JMP ESTR5     NO      CPB TEMP3     YES, FIRST STORE OF FORMULA?      JMP ESTR2     YES ESTR1 LDA OPDST,I   NO, SET       STA TEMP6       DESTINATION ADDRESS       DLD TEMP3,I   TRANSFER      DST TEMP6,I     THE NUMBER      LDA OPDST     UNSTACK       ADA .-2         DESTINATION       STA OPDST         OPERAND       JMP FORM4 ESTR2 LDA OPDST,I   STRING      SSA             OPERANDS?       JMP ESTR3     YES       JSB OPCHK     NO, UNSTACK SOURCE      STB TEMP3       AND SAVE VALUE ADDRESS      JMP ESTR1 ESTR3 LDA .-2       PREPARE       JSB PSTR        SOURCE      STA TEMP4         STRING      STB TPRME       CCA           PREPARE       JSB PSTR        DESTINATION STRING      LDB PBPTR     SAVE CORE       STB EST1        POINTER       LDA TEMP4     TRANSFER      CMA             TO      ADA TEMP5         HIGHER      SSA                 CORE?       JMP ESTR4     NO      ADA TPRME     YES,      ADA .+2         OVERLAPPING       SSA,RSS           TRANSFER?       JMP ESTR4     NO      LDA TEMP5     YES, SAVE       STA EST2        DESTINATION ADDRESS       INB           SET DESTINATION       BLS             ADDRESS TO START      STB TEMP5         OF FREE CORE      LDA TNULL     SAVE TRANSFER       STA EST3        LENGTH      CMA,INA       ALLOCATE      ARS             SPACE FOR       JSB CUSP          INTERMEDIATE      STA PBPTR           STRING      LDA FSCHA       JSB TRSTR     TRANSFER STRING TO FREE CORE      LDA EST3      RESTORE TRANSFER      STA TNULL       LENGTH      STA TPRME     RESET ACTUAL SOURCE LENGTH      LDA EST1      SET SOURCE      INA             ADDRESS TO      ALS               INTERMEDIATE      STA TEMP4           STRING      LDA EST2      RESTORE ORIGINAL      STA TEMP5       DESTINATION STRINGESTR4 LDA FSCHA       JSB TRSTR     COMPLETE TRANSFER       LDA EST1      RESTORE FREE      STA PBPTR       CORE POINTER      JMP FORM5     EXECUTE END-OF-FORMULAESTR5 ISZ PBPTR     DEFER       ISZ PBPTR       EXECUTION       LDA BASSO     GUARANTEE ASSIGNMENT         [E]      STA PBPTR,I     OPERATOR ON STACK          [E]      JMP FORM4+6 *                                                                [E]BASSO OCT 7402                                   [E]**               ** ***  EXECUTE +  *** **               ** EFAD  JSB BINOP       JSB .FAD      JMP FOR14       SKP **               ** ***  EXECUTE -  *** **               ** EFSB  JSB BINOP       JSB .FSB      JMP FOR14 **               ** ***  EXECUTE *  *** **               ** EFMP  JSB BINOP       JSB .FMP      JMP FOR14 **               ** ***  EXECUTE /  *** **               ** EFDV  JSB BINOP       JSB .FDV      JMP FOR14 **               ** ***  EXECUTE ^  *** **               ** *                ***  REAL POWER  ***                ** *  EXIT TO ERROR IF BASE IS NEGATIVE.  ELSE COMPUTE *  RESULT AS E^(POWER*LN(BASE)).* EPWR  LDB OPDST,I   LOAD      DLD 1,I         POWER       JSB IFIX      INTEGER?      JMP *+3       NO      SOS           YES, 16-BIT?      JMP IPWR      YES       JSB BINOP     NO, UNSTACK       RSS             ARGUMENTS EPWR1 JSB PCHK      CHECK ARGUMENTS       SSA           NEGATIVE BASE?      JSB RERRS+30,I  YES       LDB BINO1     NO, LOAD BASE ADDRESS       JSB .LOG      TAKE NATUAL LOG       JSB .FMP      MULTIPLY      DEF BINO2,I     BY POWER      JSB .EXP      EXPONENTIATE      JMP FOR14 *                   * **  INTEGER POWER  ** *                   * * *  MULTIPLY BASE REPEATEDLY, USING POWERS-OF-TWO METHOD *  TO SPEED PROCESS.  IF POWER IS NEGATIVE, TAKE RECIPROCAL *  FOR FINAL RESULT.* IPWR  STB TT1       SAVE SIGN       SSB           FORM ABSOLUTE       CMB,INB         VALUE OF POWER      STB TT2       SAVE IT       JSB BINOP     UNSTACK       RSS             ARGUMENTS IPWR0 JSB PCHK      CHECK ARGUMENTS       LDB BINO1     STORE       STA BINO1       STB BINO2       BASE      LDA HALF      INITIALIZE      STA TT3         RESULT      LDA .+2           TO      STA TT4             1.0 IPWR1 LDB TT2       DIVIDE POWER      SLB,BRS         BY 2      JMP IPWR4     ODD POWER       STB TT2       EVEN POWERIPWR2 SZB           ZERO?       JMP IPWR5     NO      LDA TT1       YES       SSA           POSITIVE POWER?       JMP IPWR3     NO      LDA TT3       YES, RETURN       LDB TT4         WITH      JMP FOR14         RESULTIPWR3 LDA HALF      TAKE      LDB .+2         RECIPROCAL      JSB .FDV          FOR       DEF TT3             FINAL       JMP FOR14             RESULTIPWR4 STB TT2       SAVE POWER      LDA BINO1     LOAD      LDB BINO2       BASE      JSB .FMP      MULTIPLY BY       DEF TT3         RESULT SO FAR       STA TT3       SAVE NEW      STB TT4         PARTIAL       LDB TT2           RESULT      JMP IPWR2 IPWR5 LDA BINO1     SQUARE      LDB BINO2       JSB .FMP        BASE      DEF BINO1       STA BINO1     RECORD      STB BINO2       NEW       JMP IPWR1         BASE      SKP **               ** ***  EXECUTE >  *** **               ** EGTRT JSB COMPR     COMPARE OPERANDS      SSA           < ?       JMP FALSE     YES       JMP ENEQL+1   NO**               ** ***  EXECUTE <  *** **               ** ELST  JSB COMPR     COMPARE OPERANDS      CMA,RSS       REVERSE COMPARISON SENSE**                *****  EXECUTE >=  *****                **EGORE JSB COMPR     COMPARE OPERANDS      SSA           < ?       JMP FALSE     YES       JMP TRUE      NO**               ** ***  EXECUTE =  *** **               ** EEQL  JSB COMPR     COMPARE OPERANDS      SZA           = ?       JMP FALSE     NO      JMP TRUE      YES **                *****  EXECUTE <=  *****                **ELORE JSB COMPR     COMPARE OPERANDS      SSA           >= ?      JMP TRUE      NO      JMP EEQL+1    YES **                     ** ***  EXECUTE # OR <>  *** **                     ** ENEQL JSB COMPR     COMPARE OPERANDS      SZA           # ?       JMP TRUE      NO      JMP FALSE     YES **                   ** ***  EXECUTE 'MAX'  *** **                   ** EMAX  JSB BINOP     SUBTRACT THE      JSB .FSB        TOP TWO OPERANDS      SSA,RSS       TOP OPERAND LARGER?       JMP ARG1      NOARG2  DLD BINO2,I   YES, RETRIEVE       JMP FOR14       ITS VALUE **                   ** ***  EXECUTE 'MIN'  *** **                   ** EMIN  JSB BINOP     SUBTRACT THE      JSB .FSB        TOP TWO OPERANDS      SSA,RSS       TOP OPERAND LARGER?       JMP ARG2      NOARG1  ISZ OPDST     YES,      ISZ OPDST       RETRIEVE      LDB OPDST,I       VALUE OF      DLD 1,I             NEXT-TO-TOP       JMP FOR14+2           OPERAND **                   ** ***  EXECUTE 'AND'  *** **                   ** EAND  JSB BINOP     UNSTACK       RSS             OPERANDS      SZA,RSS       TOP OPERAND ZERO?       JMP FALSE     YES       LDA BINO2,I   NO, CHECK       JMP ENEQL+1     NEXT-TO-TOP OPERAND **                  *****  EXECUTE 'OR'  *****                  **EIOR  JSB BINOP     UNSTACK       RSS             OPERANDS      SZA           TOP OPERAND NON-ZERO?       JMP TRUE      YES       LDA BINO2,I   NO, CHECK       JMP ENEQL+1     NEXT-TO-TOP OPERAND **                   ** ***  EXECUTE 'NOT'  *** **                   ** ENOT  JSB STTOP     LOAD TOP OPERAND      JMP EEQL+1    GO TO CHECK **                           ** ***  INSURE VALID POWERING  *** **                           ** * *  INSURES THAT A^B HAS ACCEPTABLE ARGUMENTS.  A=B=0 IS A NON-*  RECOVERABLE ERROR.  A=0 AND B<0 PRINTS A WARNING MESSAGE AND *  RETURNS THE MAXIMUM POSITIVE NUMBER AS THE RESULT. * #PCHK STB BINO1     LOAD HIGH PART      LDB BINO2,I     OF POWER      SZA           BASE ZERO?      JMP PCHK1     NO      SZB,RSS       YES, POWER ZERO?      JSB RERRS+29,I  YES       SSB,RSS       NO, POWER POSITIVE?       JMP FALSE     YES       JSB WERRS+2,I NO      LDA INF       USE POSITIVE      LDB .-2         INFINITY      JMP FOR14         FOR RESULTPCHK1 SZB,RSS       POWER ZERO?       JMP TRUE      YES, TAKE RESULT AS 1.0       JMP PCHK,I    NO      SKP **                                   ** ***  COMPARE TOP OPERANDS OF STACK  *** **                                   ** * *  ON EXIT (A) IS NEGATIVE IF THE TOP OPERAND OF THE*  STACK IS GREATER THAN THE NEXT-TO-TOP OPERAND, *  POSITIVE IF IT IS LESS, AND ZERO IF THEY ARE EQUAL.* #CMPR LDA OPDST,I   STRING      SSA             ARGUMENTS?      JMP COMP1     YES       JSB BINOP     NO, COMPARE       JSB .FSB        NUMERICAL       JMP COMPR,I       OPERANDSCOMP1 LDA .-2       PREPARE       JSB PSTR        COMPARISON      STA TEMP4         STRING      STB TPRME       LDA TNULL     SAVE SPECIFIED      STA CP0         LENGTH      LDA .-2       PREPARE       JSB PSTR        TEST STRING       STB CP1       SAVE ACTUAL LENGTH      ISZ TMPST     RESERVE SPACE       ISZ TMPST       FOR RESULTCOMP2 ISZ CP0       MORE SPECIFIED STRING?      JMP COMP3     YES       CLB           NO, LOAD A      JMP COMP4       NULL CHARACTERCOMP3 JSB FSCH      LOAD NEXT       LDA .+40B       COMPARISON      LDB 0             CHARACTER COMP4 ISZ TNULL     MORE SPECIFIED TEST STRING?       JMP COMP6     YES       CLA           NO, LOAD NULL CHARACTER COMP5 CMB,INB       COMPARE       ADA 1           CHARACTERS      SZA,RSS       EXIT ON NOT EQUAL       SZB,RSS         OR BOTH NULL      JMP COMPR,I       CHARACTERS      JMP COMP2 COMP6 LDA CP1       MORE ACTUAL       INA,SZA         TEST STRING?      JMP COMP7     YES       LDA .+40B     NO, LOAD A BLANK      JMP COMP5 COMP7 STA CP1       LDA TEMP5     EXTRACT       CLE,ERA       LDA 0,I         NEXT      SEZ,RSS       ALF,ALF           TEST      AND B377      ISZ TEMP5           CHARACTER       JMP COMP5 