      HED COMPILATION AND DECOMPILATION * * ******************************                       ** ***  'COMPILE' THE PROGRAM  ******                       ** * *************************** * *  CFLAG[I] = 0 IMPLIES THE PROGRAM IS IN 'SOURCE':  ALL*  OPERANDS ARE IN SYMBOLIC FORM (SYMTB = 0).  CFLAG[I] = 1 *  INDICATES THAT THE PROGRAM WAS PREVIOUSLY 'COMPILED':*  VARIABLE OPERANDS ARE POINTERS TO A SYMBOL TABLE *  WHOSE ENTRIES CONTAIN POINTERS TO A VALUE TABLE OR *  IN THE CASE OF FUNCTIONS TO THE DEFINING FORMULA.*  STATEMENT REFERENCES ARE REPLACED BY ABSOLUTE POINTERS.*  BEFORE BUILDING THE SYMBOL TABLE, SET THE INTERPRETER'S*  PROGRAM COUNTER TO THE STATEMENT REFERENCED BY THE 'RUN' *  COMMAND (THE LOWEST NUMBERED STATEMENT IS THE DEFAULT CHOICE). * CMPLE LDB PBUFF     NULL      CPB PBPTR       PROGRAM?      JMP DONEA,I   YES       STB PRGCT     NO, INITIALIZE PROGRAM COUNTER      JSB SINIT     SIMPLE      JSB GETCR       'RUN' ?       JMP CMPL0     YES       JSB BCKSP     NO      JSB BLDIN     DEMAND AN INTEGER       CPA .+15B     END OF RECORD?      CLA,RSS       YES       JSB RERRS+12,I  NO      CPA SYMTB     'COMPILED' ?      LDA PBPTR     NO, SYMTB = 0       ADA SYMTB     YES, SYMTB = SPTR       JSB FNDPS     SEEK REFERENCED STATEMENT       JMP DONEA,I   NOT WITHIN PROGRAM      NOP           SET       STB PRGCT       PROGRAM COUNTER CMPL0 LDA SYMTB     PROGRAM       SZA             'COMPILED' ?      JMP VALUE     YES       STA FILTB     NO      CLF 0       LDA LMSK      SET       IOR CFLAG       PROGRAM MODE      STA CFLAG         TO 'COMPILED'       STF 0       SKP **                            *****  BUILD THE SYMBOL TABLE  *****                            *** *  THE PROGRAM IS EXAMINED STATEMENT BY STATEMENT.  ALL *  VARIABLE OPERANDS ARE REPLACED BY POINTERS (RELATIVE *  TO THE START OF THE SYMBOL TABLE) TO TWO WORD ENTRIES. *  SYMBOL TABLE ENTRIES KEEP THE SYMBOL IN THE FIRST WORD *  AND INFORMATION IN THE SECOND.  FOR FUNCTIONS THE*  SECOND WORD CONTAINS A POINTER TO THE DEFINING FORMULA *  (0 BEFORE FINDING THE <DEF STATEMENT>).  FOR SIMPLE*  VARIABLES THE SECOND WORD IS USED TO FORM A LINKED LIST*  OF UNMATCHED FOR-VARIABLES (OTHERWISE IT IS 0) WITH*  FLINK POINTING TO THE INNERMOST NESTED FOR-VARIABLE. *  FOR ARRAY AND STRING VARIABLES THE SECOND WORD IS 0*  UNLESS THE VARIABLE APPEARS IN A <DIM STATEMENT>, IN *  WHICH CASE IT POINTS TO THE DIMENSIONS IN THE CODE.*  PROGRAM INTEGERS ARE REPLACED BY A POINTER TO THE*  STATEMENT THEY REFERENCE.  ON EXIT TO VALUE OR DCMPL,*  SPTR POINTS TO THE FIRST WORD NOT PROCESSED. *       LDB PBPTR     CREATE POINTER      STB SYMTB       TO SYMBOL TABLE       CCA       STA FLINK     SET FOR-QUEUE TO EMPTY      JSB PRNST     INITIALIZE      DEF CMP11       COMPILATION       SEZ,RSS       WAS FLAG BIT SET?       JMP CMPL3     NO*                                  ***  PROCESS NON-VARIABLE OPERAND  ***                                  *      ADA .-4       PROGRAM       SSA,RSS         INTEGER?      JMP PRNS2     NO, MUST BE A PARAMETER CMPL1 ISZ SPTR      YES, MOVE       LDB SPTR        TO NEXT WORD      CPB NSPTR     STATEMENT FINISHED?       JMP CMP11     YES       LDA SYMTB     NO, SEARCH FOR      LDB SPTR,I      STATEMENT REFERENCED      JSB FNDPS         BY INTEGER      NOP           NOT       JMP CMPL2       FOUND       STB SPTR,I    FOUND, REPLACE INTEGER      JMP CMPL1       WITH ABSOLUTE ADDRESS CMPL2 JSB DCMPL     DECOMPILE       JSB RERRS,I   NON-EXISTENT STATEMENT NUMBER *                              ***  PROCESS VARIABLE OPERAND  ***                              *CMPL3 STA STMP1     SAVE SYMBOL       AND .+17B       CPA .+17B     FUNCTION?       JMP CMPL6     YES       SZA,RSS       NO, STRING VARIABLE?      JMP CMPL9-3   YES       ADA .-4       NO,       SSA             ARRAY?      JMP CMPL9     YES       JSB SSYMT     NO, COMPILE       ISZ SPTR        SIMPLE VARIABLE       CPB FOROP     FOR-VARIABLE OF 'FOR' ?       JMP CMPL4     YES       CPB NXTOP     NO, FOR-VARIABLE OF 'NEXT' ?      RSS           YES       JMP PRNS2+1   NO      LDB STMP2     MATCH LATEST      CPB FLINK       <FOR STATEMENT> ?       JMP *+3       YES       JSB DCMPL     NO, DECOMPILE       JSB RERRS+1,I NEXT NOT PRECEDED BY PROPER FOR       LDA STMP2,I   REMOVE      STA FLINK       VARIABLE      CLA               FROM      STA STMP2,I         FOR-QUEUE       JMP PRNS2+1 CMPL4 LDA STMP2,I   LOAD SECOND WORD OF TABLE ENTRY       SZA           ALREADY IN FOR-QUEUE?       JMP CMPL5     YES       LDA FLINK     NO,       STA STMP2,I     ADD       LDB STMP2         TO      STB FLINK           FOR-QUEUE       ISZ STYPE     DESTROY STATEMENT TYPE      JMP PRNS2+1 CMPL5 JSB DCMPL     DECOMPILE       JSB RERRS+2,I NESTED "FOR'S" WITH SAME VARIABLE CMPL6 JSB SSYMT     COMPILE FUNCTION NAME       CPB DEFOP     FUNCTION DEFINITION?      RSS           YES       JMP PRNS2     NO      LDB STMP2,I   PREVIOUSLY      SZB             DEFINED?      JMP CMPL8     YES       LDA STMP2     NO      ISZ STYPE     DESTROY STATEMENT TYPECMPL7 LDB SPTR      ADVANCE       ADB .+3         PROGRAM       STB SPTR          POINTER       STB 0,I       SAVE      JMP PRNS2+1     POINTER CMPL8 ISZ SPTR      JSB DCMPL     DECOMPILE       JSB RERRS+3,I FUNCTION DEFINED TWICE      JSB SSYMT     COMPILE STRING VARIABLE       ISZ STMP1     SET TO 'SINGLY SUBSCRIPTED'       RSS           PROCESS POSSIBLE DECLARATIONCMPL9 JSB ASYMT     COMPILE ARRAY VARIABLE      CPB DIMOP     'DIM' ?       RSS           YES       JMP PRNS2     NO      LDB STMP2,I   WAS VARIABLE      SZB             PREVIOUSLY DIMENSIONED?       JMP CMP10     YES       LDB SPTR      NO, SAVE      ADB .+2         POINTER TO      STB STMP2,I       DIMENSIONS      LDA STMP1     RETRIEVE SYMBOL       SLA,RSS       ADVANCE       ADB .+2         POINTER       ADB .+2           PAST      STB SPTR            ONE OR TWO      JMP PRNS2+2 CMP10 ISZ SPTR      JSB DCMPL     DECOMPILE       JSB RERRS+4,I VARIABLE DEFINED TWICE*                              ***  PROCESS END OF STATEMENT  ***                              *CMP11 CPB SYMTB     END OF PROGRAM?       RSS           YES       JMP PRNS1     NO      STB SPTR      INSURE CORRECT SETTING FOR SPTR       LDA STYPE     LAST STATEMENT      CPA ENDOP       AN 'END' ?      JMP CMP12     YES       JSB DCMPL     NO, DECOMPILE       JSB RERRS+5,I MISSING 'END'       JSB DCMPL     DECOMPILE       JSB RERRS+6,I 'FOR' WITHOUT 'NEXT'CMP12 ISZ FLINK     ALL 'FOR'S MATCHED?       JMP *-3       NO      LDB PBPTR     YES, SET POINTER      STB FILTB       TO FILE TABLE * *  VALTB = -1 AT THIS POINT UNLESS THE PROGRAM CONTAINS A *  <FILES STATEMENT>.  THE CALL TO SCHLB,I LEAVES VALTB = *  FILTB+7*(NUMBER OF FILES REQUESTED).  IF NO <FILES STATEMENT>*  APPEARS, VALTB = FILTB.*       ISZ VALTB     <FILES STATEMENT> ?       JMP CMP13     YES       STB VALTB     NO      JMP VALUE+2 CMP13 JSB SCHLB,I   REQUEST FILE TABLE      DEF FILIB       JSB RERRS+13,I  BAD FORMAT OR ILLEGAL NAME      JSB RERRS+14,I  MISSING OR PROTECTED FILE       JSB RERRS+10,I  OUT OF STORAGE      JMP VALUE+2   SUCCESSFUL REQUEST      SPC 1 DONEA DEF EXIT3       SKP **                           ** ***  BUILD THE VALUE TABLE  *** **                           ** * *  IF NO VALUE TABLE EXISTS, ONE IS BUILT FROM THE SYMBOL *  TABLE AND INITIALIZED; IF IT ALREADY EXISTS, IT IS *  INITIALIZED.  IN BUILDING THE VALUE TABLE, EACH ENTRY*  IN THE SYMBOL TABLE IS CHECKED: FOR FUNCTIONS THE*  EXISTENCE OF A DEFINING FORMULA IS CHECKED; FOR SIMPLE *  VARIABLES TWO WORDS ARE ALLOCATED AND SET TO 'UNDEFINED' *  AND A POINTER TO THEM IS PLACED IN THE SECOND WORD OF*  THE SYMBOL TABLE ENTRY; FOR ARRAYS FOUR WORDS ARE*  ALLOCATED FOR THE DECLARED AND DYNAMIC DIMENSIONS, *  THE DIMENSIONS ARE INITIALIZED EITHER FROM A *  <DIM STATEMENT> IN THE PROGRAM OR THE DEFAULT*  DIMENSIONS, ARRAY SPACE IS ALLOCATED AT TWO WORDS PER*  ARRAY ELEMENT CONTIGUOUS WITH THE DIMENSIONS,  THE *  ELEMENTS ARE INITIALIZED TO 'UNDEFINED,' AND A *  POINTER TO THE FIRST ELEMENT IS PLACED IN THE SECOND *  WORD OF THE SYMBOL TABLE ENTRY; FOR STRINGS FOLLOW THE *  PATTERN FOR ARRAYS WITH ONE WORD HOLDING THE PHYSICAL*  DIMENSION IN BITS 15-8 AND THE DYNAMIC DIMENSION IN*  BITS 7-0 (DIMENSION HERE MEANS LENGTH AS NUMBER OF *  CHARACTERS), STRING SPACE IS ALLOCATED ONE WORD PER*  TWO CHARACTERS, AND THE DYNAMIC LENGTH IS INITIALIZED*  TO ZERO.  FOR "DON'T KNOW" ARRAY ENTRIES, THE SECOND *  WORD OF THE SYMBOL TABLE ENTRY IS COPIED FROM THE*  ASSOCIATED SINGLY OR DOUBLY SUBSCRIPTED ENTRY (OR*  EXIT TO ERROR IF NONE EXISTS).  IF A VALUE TABLE *  ALREADY EXISTS, VALUES OF SIMPLE VARIABLES AND ARRAY *  ELEMENTS ARE SET TO 'UNDEFINED' AND DYNAMIC ARRAY*  DIMENSIONS ARE SET TO DECLARED DIMENSIONS; THE DYNAMIC *  LENGTHS OF STRINGS ARE SET TO ZERO.  EXIT TO XEC IF*  PROCESSING IS SATISFACTORILY COMPLETED.* VALUE LDB FCORE     INSURE CORRECT      STB PBPTR       SETTING FOR PBPTR       LDB SYMTB     SET (B) TO      RSS             SYMBOL TABLEVALU1 INB           SYMBOL TABLE      CPB FILTB       EXHAUSTED?      JMP XECA,I    YES       LDA 1,I       NO, LOAD SYMBOL       INB           POINT (B) TO VALUE TABLE POINTER      SZA,RSS       NULL SYMBOL?      JMP VAL14     YES       AND .+17B     NO      CPA .+17B     FUNCTION?       JMP VALU4     YES       SZA,RSS       NO, STRING VARIABLE?      JMP VAL15     YES       ADA .-4       NO,       SSA             ARRAY?      JMP VALU5     YES       SKP *                                ***  INITIALIZE SIMPLE VARIABLE  ***                                *      LDA 1,I       SIMPLE VARIABLE       SZA,RSS       STORAGE ALLOCATED?      JMP VALU3     NOVALU2 STA VTMP1     YES, SAVE POINTER TO VALUE      LDA MNEG      SET       STA VTMP1,I       ISZ VTMP1       VALUE TO      LDA MNEG+1      STA VTMP1,I       'UNDEFINED'       JMP VALU1 VALU3 LDA .+2       ALLOCATE      JSB CUSP        STORAGE       STA PBPTR         FOR VALUE       ADA .-2       PUT VALUE POINTER       STA 1,I         INTO SYMBOL TABLE       JMP VALU2 *                    ***  CHECK FUNCTION  ***                    *VALU4 LDA 1,I       WAS FUNCTION      SZA             DEFINED?      JMP VALU1     YES       JSB DCMPL     NO, DECOMPILE       JSB RERRS+7,I UNDEFINED FUNCTION*                      ***  INITIALIZE ARRAY  ***                      *VALU5 CPA .-1       IS ARRAY TYPE "DON'T KNOW" ?      JMP VAL13     YES       STB VTMP1     NO, SAVE POINTER TO SYMBOL TABLE      INA           SAVE INFORMATION ON       STA VTMP2       NUMBER OF DIMENSIONS      LDA 1,I       HAS       CMA,INA         STORAGE       ADA 1             BEEN      SSA                 ALLOCATED?      JMP VAL12     YES       LDB VTMP1,I   NO, LOAD POINTER TO DIMENSIONS      LDA PBPTR     SET POINTER TO      STA VTMP3       DIMENSION ENTRY       LDA .+4       ALLOCATE      JSB CUSP        SPACE       STA PBPTR         FOR ENTRY       STA VTMP1,I   SYMBOL TABLE POINTER TO ARRAY       SZB,RSS       DEFAULT DIMENSIONS?       JMP VAL11     YES       LDA 1,I       NO, LOAD ROW DIMENSION      ADB .+2       BUMP POINTERVALU6 ISZ VTMP2     TWO DIMENSIONAL?      CLB,INB,RSS   NO, SET COLUMN DIMENSION TO 1       LDB 1,I       YES, LOAD COLUMN DIMENSION      STA VTMP3,I   PUT       ISZ VTMP3       DECLARED DIMENSIONS       STB VTMP3,I       IN VALUE TABLEVALU7 ISZ VTMP3     PUT       STA VTMP3,I     DYNAMIC DIMENSIONS      ISZ VTMP3         IN      STB VTMP3,I         VALUE TABLE       MPY VTMP3,I   COMPUTE NUMBER OF ARRAY ELEMENTS      SZB,RSS       TOO       SSA             LARGE?      JMP VAL10     YES       STA VTMP4     SAVE POSITIVE       CMA,INA         AND NEGATIVE      STA VTMP2         COUNT       LDB VTMP3     HAS       INB             ARRAY BEEN      CPB PBPTR         ALLOCATED?      JMP VALU9     NOVALU8 LDA MNEG      YES       STA 1,I       INITIALIZE      INB             ARRAY       LDA MNEG+1        ELEMENT       STA 1,I             TO      INB                   'UNDEFINED'       ISZ VTMP2     DONE?       JMP VALU8     NO      LDB VTMP1     YES       JMP VALU1 VALU9 ADA .2500     ARRAY       SSA             TOO LARGE?      JMP VAL10     YES       LDA VTMP4     NO      ALS           ALLOCATE      JSB CUSP        SPACE       STA PBPTR         FOR ARRAY       JMP VALU8 VAL10 JSB DCMPL     DECOMPILE       JSB RERRS+8,I ARRAY TOO LARGE VAL11 LDA .+10      LOAD (A) WITH 10      LDB A.10      LOAD (B) WITH       JMP VALU6       ADDRESS OF 10 VAL12 LDA VTMP1,I   LOAD      ADA .-4       STA VTMP3       DECLARED      LDA VTMP3,I       ISZ VTMP3         DIMENSIONS      LDB VTMP3,I       JMP VALU7 VAL13 LDA 1,I       LOAD POINTER      CMA,INA       IS      ADA 1           POINTER SET       SSA               TO VALUE TABLE?       JMP VALU1     YES       LDA 1,I       NO, GET       LDA 0,I         AND STORE       STA 1,I           POINTER TO      JMP VALU1           VALUE TABLE VAL14 JSB DCMPL     DECOMPILE       JSB RERRS+9,I NUMBER OF DIMENSIONS NOT KNOWN      SKP *                                ***  INITIALIZE STRING VARIABLE  ***                                *VAL15 STB VTMP1     SAVE (B)      LDA 1,I       HAS       CMA,INA         STORAGE       ADA 1             BEEN      SSA                 ALLOCATED?      JMP VAL17     YES       LDB VTMP1,I   NO, SAVE LENGTH POINTER       LDA PBPTR     SET POINTER TO      STA VTMP3       LENGTH ENTRY      INA           MORE      CPA LWAUS       USER SPACE?       JSB RERRS+10,I  NO      STA PBPTR     YES, SET POINTER TO STRING      STA VTMP1,I     INTO SYMBOL TABLE ENTRY       SZB,RSS       DEFAULT LENGTH?       CLA,INA,RSS   YES, SET (A) = 1      LDA 1,I       NO, LOAD DECLARED LENGTH      ALF,ALF       STORE PHYSICAL LENGTH       STA VTMP3,I     ALONG WITH ZERO       ALF,ALF           LOGICAL LENGTH      INA           ALLOCATE      ARS             SPACE       JSB CUSP          FOR       STA PBPTR           STRINGVAL16 LDB VTMP1     RESTORE       JMP VALU1       (B) VAL17 CCB           RESET       ADB VTMP1,I       LDA 1,I         LOGICAL LENGTH      AND M256      STA 1,I           TO ZERO       JMP VAL16       SKP **                                      *****  DECOMPILE ALL OR PART OF PROGRAM  *****                                      *** *  IF CFLAG[I] = 0 PROGRAM IS IN SOURCE, EXIT IMMEDIATELY;*  ELSE SET CFLAG[I] = 0 AND DECOMPILE PROGRAM.  SPTR POINTS*  INITIALLY TO LAST WORD+1 OF COMPILED PROGRAM.  ABSOLUTE*  ADDRESSES ARE REPLACED BY THE SEQUENCE NUMBERS TO WHICH*  THEY POINT.  VARIABLE OPERAND POINTERS ARE REPLACED BY *  THEIR SYMBOL.  PBPTR IS SET TO LAST WORD+1 OF PROGRAM. * #DCMP LDA LMSK      PROGRAM       AND CFLAG       SZA,RSS         COMPILED?       JMP DCMPL,I   NO      CLF 0         YES       XOR CFLAG     SET PROGRAM MODE      STA CFLAG       TO 'UNCOMPILED'       STF 0       LDA PBPTR     NULL      CPA PBUFF       PROGRAM?      JMP DCMP3+2   YES       LDA SPTR      NO, SET TERMINATION       STA FILTB       ADDRESS       JSB PRNST     INITIALIZE      DEF PRNS1       DECOMPILATION       CLB,SEZ,RSS   WAS FLAG BIT SET?       JMP DCMP2     NO*                                  ***  PROCESS NON-VARIABLE OPERAND  ***                                  *      ADA .-4       PROGRAM       SSA,RSS         INTEGER?      JMP PRNS2     NODCMP1 ISZ SPTR      YES, MOVE TO      LDB SPTR        NEXT WORD       CPB FILTB     DONE?       JMP DCMP3     YES       CPB NSPTR     NO, STATEMENT DONE?       JMP PRNS1+1   YES       LDA SPTR,I    NO, REPLACE       LDA 0,I         ABSOLUTE ADDRESS      STA SPTR,I        WITH SEQUENCE       JMP DCMP1           NUMBER*                              ***  PROCESS VARIABLE OPERAND  ***                              *DCMP2 ADA .-1       COMPUTE       RRR 15          SYMBOL TABLE      ADB SYMTB         ADDRESS       LDA SPTR,I    EXTRACT       AND OPMSK       OPERATOR      IOR 1,I       REPLACE OPERATOR-       STA SPTR,I      OPERAND PAIR IN CODE      LDB STYPE       CPB DIMOP     'DIM' ?       RSS           YES       JMP PRNS2     NO      LDB SPTR      INB       CPB FILTB     DONE?       JMP DCMP3     YES       INB           NO      AND .+17B     STRING      SZA,RSS         VARIABLE?       INA           YES, SET TO SINGLE SUBSCRIPT MODE       JMP CMP10-5 DCMP3 LDA SYMTB     SET ACTIVE USER AREA POINTER      STA PBPTR       TO LAST WORD+1 OF PROGRAM       CLB           ZERO      STB SYMTB       POINTER       JMP DCMPL,I       SKP 