* 
* 
* 
*         OUTPUT TO FORMATTER 
* 
.FMT  NOP 
      CLF INTP
      LDB .FMT,I    GET ADDRESS 
      ISZ .FMT      ADJUST RETURN 
      CLA,CLE       INDICATE STARTING FORMAT
      JSB FMTR,I   GO TO FORMATTER
      JMP .FMT,I   RETURN 
* 
* 
* 
* 
* 
      SKP 
*         PROGRAM COMMAND 
* 
PCMD  CPA ABY       EXIT OPDSN? 
      JMP OPDSN,I   EXIT
      CPA ALF       LIST SOURCE FILE
      JMP PLF       YES 
      CPA ACF       CLEAR SOURCE FILE?
      JMP PCF       YES 
      CPA ADB       DEFINE BUFFER?
      JMP PDB       YES 
      CPA ALO       LIST OUTPUT BUFFER? 
      JMP PLO       YES 
      CPA ALI       LIST INPUT BUFFER?
      JMP PLI       YES 
      CPA ACB       CLEAR BUFFER? 
      JMP PCB       YES 
      CPA AGO       START EXECUTION?
      JMP PGO       YES 
* 
CMDL  NOP           (MAY BE OVERLAYED BY A JSB) 
      RSS 
      JMP IRQ 
* 
INER  JSB .FMT      INPUT ERROR 
      DEF MSG2
      JMP IRQ       TRY AGAIN 
MSG1  ASC 3,OPDSN/
.MSG1 ASC 1,@_
MSG2  ASC 6,INPUT ERROR/
      SKP 
*         LIST PROGRAM
* 
PLF   JSB PDVC      CHECK FOR FAST DEVICE LIST
      LDA SUPA      SET STARTING OF LIST
      STA PRPTR       POINTER 
PLFL  LDA PRPTR,I   CHECK TO PRINT STATEMNET
      SZA,RSS       IS IT THE END OF LIST 
      JMP IRQ       YES 
      LDB SW9       CHECK TO
      JSB SWRT,I      ABORT LIST
      JMP IRQ       YES 
      CCB           CONVERT AND 
      ADB IBUFD       PACK
      CLE               STATEMENT 
      JSB I2AS,I             NUMBER 
      LDB IBUFD     ADD NUMBER TO POINTER 
      ADB .2
      RBL 
      STB IBUFP 
      LDA SPC       PUT SPACE IN BUFFER 
      JSB PUTC
      ISZ PRPTR 
      LDA PRPTR,I   * 
      ISZ PRPTR     * 
      ADA .M1       * 
      LDB A,I       *  GET PRAM TYPES 
      STB SVB       *  SAVE PRAM TYPES
      ADA .M1       * 
      LDB A,I       * 
      STB TMP+3     * 
      ADA .M1       * 
      LDA A,I       * AND STATEMENT 
      STA TMP+2     *  SAVE STATEMENT 
      ALF,ALF       * 
      JSB PUTX      *  PUT STATEMENT TYPE 
      LDA TMP+2     *          IN 
      JSB PUTX      *       BUFFER
      LDA TMP+3     *  AND SECOND CHATACTERS
      ALF,ALF 
      JSB PUTX      * 
      LDA TMP+3     * 
      JSB PUTX      * 
      JMP *+7       * 
PUTX  NOP 
      AND .177
      CPA SPC       IF IT'S A SPACE 
      JMP *+3         SKIP IT 
      JSB PUTC      PUT IT IN BUFFER
      JMP PUTX,I    TRY NEXT CHARACTER
      LDA SPC       ADD SPACE TO BUFFER 
      JSB PUTC
      SKP 
      LDA SVB       RETRIEVE PRMS TYPES 
      ALF,ALF       MOVE TO FIRST PARAMETER 
PLFP  LDB PRPTR,I   CHECK IF NO PARAMETER 
      SZB,RSS       ? 
      JMP PLFC      NO SO DON'T PROCESS IT
      AND .177
      CPA AA        IS IT ASCII?
      JMP PAA       YES 
      CPA AI        IS IT INTEGER?
      JMP PAI       YES 
      CPA AK        IS IT OCTAL?
      JMP PAK       YES 
      JMP PLFC      TYPE NOT FOUND SO SKIP IT 
* 
PAA   LDA PRPTR,I   GET CHARACTERS
      ALF,ALF 
      JSB PUTC      FIRST ONE TO BUFFER 
      LDA PRPTR,I 
      AND .177      SKIP IF SPACE 
      CPA SPC 
      RSS 
      JSB PUTC      SECOND ONE TO BUFFER
      JMP PLFC
* 
PAI   LDA PRPTR,I 
      CLB 
      SSA,RSS       IF POS
      CCB             MOVE BUFFER POINTER BACK ONE
      ADB IBUFP 
      STB IBUFP 
      CLE,ERB 
      JSB I2AS,I
* 
PAE   LDA IBUFP 
      ADA .6
      STA IBUFP 
      JMP PLFC
* 
PAK   LDA PRPTR,I 
      LDB IBUFP 
      CLE,ERB 
      JSB O2AS,I
      JMP PAE 
      SKP 
PLFC  ISZ PRPTR     MOVE TO NEXT PARAMETER
      LDA SPC       ADD SPACE TO BUFFER 
      JSB PUTC
      LDA SVB 
      SZA,RSS 
      JMP *+4 
      CLB 
      STB SVB 
      JMP PLFP
      LDA IBUFP     DETERMINE BUFFER COUNT
      LDB IBUFD     * 
      RBL            *
      CMB,INB         * 
      ADA B            *
      LDB IBUFD 
      JSB DVIC      OUTPUT BUFFER 
      JMP PLFL      DO NEXT INSTRUCTION 
      SKP 
*         DELETE A LINE 
* 
DLL   JSB FNDLN     FIND IT 
      JMP IRQ       NOT FOUND 
      ADB .4
PDLL  LDA .M4       SET COUNT FOR COMPARE 
      STA TMP 
PDLL0 LDA B,I       MOVE NEXT LINE UP 
      STA PRPTR,I 
      ISZ PRPTR 
      INB 
      ISZ TMP       TIME FOR A COMPARE
      JMP PDLL0     NO
      LDA B,I       YES CHECK FOR END OF LIST 
      SZA           ? 
      JMP PDLL      NO
      STA PRPTR,I    CLEAR LAST STATEMENT 
SVLA  LDA PRPTR     SAVE LAST STATEMENT ADDRESS 
      STA PRPLA 
      JMP IRQ 
* 
* 
*         CLEAR SOURCE FILE 
* 
PCF   CLA 
      STA SUPA,I
      LDA SUPA
      JMP SVLA+1
     SKP
*         PROCESS GO
* 
PGO   NOP           (MAY BE OVERLAYED BY A JSB) 
      LDA GSPTS     CLEAR GO SUB TABLE
      STA GSPTR 
      LDB SUPA      START AT BEGINNING
      STB PRPTR 
      LDA PRPTR,I 
      STA TMP 
PGOL1 ISZ PRPTR 
      LDA PRPTR,I 
      LDA A,I 
      STA TMP+1     POINTER TO ROUTINE
      ISZ PRPTR 
      LDA PRPTR,I 
      STA TMP+2     PARAM A 
      ISZ PRPTR 
      LDA PRPTR,I 
      STA TMP+3     PARAM B 
      ISZ PRPTR 
      LDA TMP 
      STA CULN      SAVE CURRENT LINE NUMBER
      SZA,RSS 
      JMP IRQ 
      LDA PRPTR,I 
      STA TMP       NEXT LINE NUMBER
      LDA TMP+2     GET PARAM A 
      LDB TMP+3     GET PARAM B 
      JSB TMP+1,I   GO TO ROUTINE 
      CLA           NO LINE CHANGE
      LDB SW9       CHECK FOR ABORT 
      JSB SWRT,I
      JMP IRQ 
      SZA,RSS       CHECK FOR LINE CHANGE 
      JMP PGOL1     NO
      STA TMP 
      JSB FNDLN 
      JMP OPLNE     LINE NUMBER NOT FOUND 
      JMP PGOL1     FOUND 
* 
* 
OPLNE JSB .FMT      OUTPUT NO LINE NO.
      DEF OPLMD 
OPLNN JSB .FMT      OUTPUT LINE # 
      DEF OPLND 
      LDB CULN      CURRENT LINE NUMBER 
OPLN. CLA,INA 
      JSB FMTR,I
      JMP IRQ       RETURN TO OPERATOR
OPLMD ASC 3,LINE?_
OPLND ASC 5, (LINE #)/
     SKP
*         DEFINE BUFFER 
* 
PDB   STB TMP       SAVE TYPE 
      LDA B 
      CPA AIK       INSERT? 
      JMP DBI       YES 
      CPA AIA 
      JMP DBI       YES 
      CPA ARK       REPLACE?
      JMP DBR       YES 
      CPA ARA 
      JMP DBR       YES 
      JMP DBBC      GIVE OPERATOR BUFFER COUNT
* 
* 
DBIN  NOP 
      JSB DBN       GET FIRST NUMBER
      STA TMP+1      SAVE IT
      JSB DBN       GET SECOND NUMBER 
      STA TMP+2     SAVE IT 
      SZA,RSS       IF IT'S NOT ZERO
      JMP DBIN,I
      CMA,INA       CHECK FRST < SEC
    ADA TMP+1 
      SSA,RSS 
      JMP INER
      JSB GETB      EMPTY BUFFER
      JMP DBIN,I
      JMP *-2 
* 
* 
DBN   NOP 
      JSB GETB      GET A BLOCK OF DATA 
      CLA,CCE       NO INPUT SO FAKE IT 
      SEZ,RSS       IF IT'S ASCII 
      JMP INER        THEN ERROR
      SSA           IF IT'S NEGATIVE
      JMP INER        THEN ERROR
      SZA,RSS       IF ZERO 
      JMP DBN,I       RETURN
      LDB LDBC      IS IT A LIST? 
      SZB,RSS       YES 
      LDB DBC       CHECK AGAINST BUFFER COUNT
      CMB 
      ADB A 
      SSB           IF LESS THAN COUNT
      JMP DBN,I     OK
      JMP INER      NO THEN ERROR 
      SKP 
*         CLEAR BUFFER
* 
PCB   JSB DBIN      GET ANY PARAMETERS
      LDA TMP+1     CHECK IF DELETE ALL 
      SZA           ? 
      JMP *+3 
      STA DBC       YES CLEAR COUNT 
      JMP DBBC
      JSB CLSE      NO CLOSE UP AREA
      JMP DBBC
* 
* 
*         REPLACE 
* 
DBR   JSB DBIN      GET ANY PARAMETERS
      LDA TMP+1     CHECK, IF 
      SZA,RSS       ZERO? 
      JMP INER      IF SO THEN ERROR
      JSB CLSE      CLOSE AREA THATS REPLACED 
      JMP DBI.      GOTO INSERT SECTION 
* 
* 
*         OUTPUT BUFFER COUNT 
* 
DBBC  JSB .FMT      OUTPUT BUFFER COUNT 
      DEF DBBCM 
      LDB DBC 
      JMP OPLN. 
DBBCM ASC 4,BF CT #/
      SKP 
*         CLOSE UP BUFFER 
* 
CLSE  NOP 
      ADA .M1       BACK UP ONE 
      STA TMP+1     FOR INSERT
      LDB TMP+2     CHECK FOR SECOND
      SZB             NUMBER
      JMP *+4       YES 
      LDB A         NO- THEN USE FIRST+1
      INB 
      STB TMP+2     SAVE IT 
      CMB,INB       * 
      ADB A         *  CORRECT BUFFER 
      ADB DBC       *    COUNT
      STB DBC       * 
      LDB TMP+2     SET ADDRESSES 
      ADB DBD 
      ADA DBD 
      STA TMP+3 
CLSE1 JSB DBENC     LAST ADDRESS? 
      JMP CLSE2     YES 
      LDA B,I       MOVE DATA 
      STA TMP+3,I 
      ISZ TMP+3 
      INB 
      LDA B 
      JMP CLSE1     NO MOVE NEXT WORD 
CLSE2 LDA TMP+3 
      JSB DBENC     LAST ADDRESS? 
      JMP CLSE,I
      CLA 
      STA TMP+3,I 
      ISZ TMP+3     MOVE TO NEXT ADDRESS
      JMP CLSE2 
* 
DBENC NOP 
      CMA           IS A < THAN 
      ADA DBD         END-OF-BUFFER 
      ADA DBCO
      SSA,RSS       ? 
      ISZ DBENC     YES 
      JMP DBENC,I 
      SKP 
DBI   JSB DBIN      GET ANY PARAMETERS
      LDA TMP+1     CHECK IF INSERT 
      SZA,RSS       AFTER END OF BUFFER 
      LDA DBC       YES 
      STA TMP+1 
DBI.  LDA TMP+1     IF NO LINE
      ADA DBD       ADD ADDRESS 
      STA TMP+1     SAVE IT 
      JSB DBENC     IS BUFFER FULL
      JMP DBBF      YES 
      JSB GIFO      CALL FOR INPUT
DBI0  LDA TMP+1 
      STA TMP+2 
      LDA TMP+1,I   SAVE CURRENT CONTENTS 
      STA TMP+3 
      JSB GTI       GET INPUT 
      LDB A 
      LDA DBC 
      ADA DBD 
      JSB DBENC     IS BUFFER FULL? 
      JMP DBBF
      STB TMP+1,I   STORE IT
      ISZ TMP+1     MOVE UP ADDRESSES 
DBI1  ISZ TMP+2 
      LDA TMP+2 
      JSB DBENC     LAST ADDRESS? 
      JMP DBI2      YES 
      LDB TMP+3     MOVE REST OF BUFFER 
      LDA TMP+2,I     DOWN
      STB TMP+2,I 
      STA TMP+3 
      JMP DBI1      NO MOVE MORE
DBI2  ISZ DBC       ADD ONE TO COUNT
      JMP DBI0      NO
DBBF  JSB .FMT     YES  TELL OPERATOR 
      DEF DBFLM 
      JMP DBBC      EXIT
DBFLM ASC 6,BUFFER FULL/
      SKP 
*         GET INPUT 
* 
GTI   NOP 
      LDA TMP       DOES HE WANT
      AND .177
      CPA AA        ASCII?
      JMP GTI0      YES 
      JSB GETB      GET A BLOCK 
      JMP DBDNE     ASK IF DONE 
      SEZ           IF IT'S ASCII DONT SWAP A&B 
      LDA B 
      JMP GTI,I 
GTI0  JSB GETC      GET A CHARACTER 
      JMP DBDNE     ASK IF DONE 
      JMP GTI,I 
DBDNE JSB .FMT      OUTPUT DONE?
      DEF DNEM
      JSB GIFO      CALL FOR INPUT
      JSB GETB      GET ANSWER
      JMP DBDNE     NO INPUT
      CPA AYE       YES 
      JMP DBBC
      CPA ANO       NO
      JMP *+2 
      JMP DBDNE     NO ASK AGAIN. 
      JSB GIFO      CALL FOR ANOTHER INPUT
      JMP GTI+1 
DNEM  ASC 3,DONE?_
ANO   ASC 1,NO
AYE   ASC 1,YE
      SKP 
PLO   LDA DBC       SET FOR OUTPUT BUFFER 
      STA LDBC
      LDA DBD 
      STA LDBD
      JMP PLB       GO OUTPUT IT
* 
PLI   LDA DBCI      SET FOR INPUT BUFFER
      STA LDBC
      LDA DBDI
      STA LDBD
* 
PLB   JSB PDVC      CHECK FOR FAST DEVICE LIST
     LDA LDBC      IS BUFFER EMPTY? 
      SZA,RSS       ? 
      JMP IRQ       YES 
      JSB DBIN      GET ANY PARAMETERS
      LDA TMP+1     IF FIRST = ZERO 
      SZA 
      JMP *+5 
      INA           DO ALL OF BUFFER
      STA TMP+1 
      LDA LDBC
      STA TMP+2 
      LDB TMP+2     IF SEC = ZERO 
      SZB,RSS 
      LDB A         USE INPUT COUNT 
      STB TMP+2 
      CLA           CLEAR LIST FLAG 
      STA LDBC
      SKP 
DBL0  LDA FDF 
      ERA 
      CLA 
      LDB DBLFM     GET FORMAT
      JSB FMTR,I
      CLA,INA 
      LDB TMP+1     OUTPUT PARAMETER
      JSB FMTR,I
      LDA .M4       SET MAX LINE NUM. CNT 
      STA TMP+3 
DBL1  LDA FDF       NO OUTPUT OCTAL LISTING 
      ERA 
      CLA 
      LDB DBLO
      JSB FMTR,I
      CCA 
      LDB TMP+1 
      ADB LDBD
      ADB .M1 
      LDB B,I 
      JSB FMTR,I
      LDB SW9       CHECK FOR ABORT 
      JSB SWRT,I
      JMP DBL2
      ISZ TMP+1 
      LDA TMP+1 
      CMA,INA 
      ADA TMP+2 
      SSA 
      JMP DBL2      OUTPUT COMPLETE 
      ISZ TMP+3 
      JMP DBL1
      CLA 
      JSB DVIC
      JMP DBL0
DBL2  CLA 
      JSB DVIC
      JMP IRQ       FINISHED
DBLFM DEF *+1 
      ASC 2,(#)_
DBLO  DEF *+1 
      ASC 2, #_ 
      SKP 
*         WAIT FOR OPERATOR 
* 
WAP   NOP 
      JSB .FMT     OUTPUT MESSAGE 
      DEF WAPM
      LDB CULN        WITH CURRENT LINE NUMBER
      CLA,INA 
      JSB FMTR,I
WAPL  JSB GIFO      CALL FOR INPUT
      LDA IBUFD,I   CHECK IF "CO" 
      CPA ACO       ? 
      JMP WAP,I       CONTINUE
      CPA AST       STOP
      JMP IRQ       YES 
      JSB .FMT      TELL OPERATOR OF ERROR
      DEF MSG2
      JMP WAPL         AND TRY AGAIN
* 
WAPM  ASC 7,WAIT (LINE #)/
* 
* 
* 
*         PROCESS GO TO STATEMENT 
* 
GTP   NOP 
      ISZ GTP       ADJUST RETURN FOR LINE CHANGE 
      JMP GTP,I 
      SKP 
*         PROCESS GOSUB 
* 
GSP   NOP 
      ISZ GSPTR     MOVE TO NEXT BLOCK
      STB SVB       SAVE REP COUNT
      LDB GSPTR     CHECK 
      CMB,INB         IF THERE IS 
      ADB GSPTE         ROOM
      SSB           ? 
      JMP GSPE      NO - SO ERROR 
      LDB PRPTR     SAVE PROGRAM POINTER
      STB GSPTR,I     LOCATION
      ISZ GSPTR 
      LDB SVB       GET REP COUNT 
      SZB,RSS 
      INB 
      SSB,RSS       IF NOT NEG. 
      CMB,INB         MAKE IT NEG 
      STB GSPTR,I 
      ISZ GSP       ADJUST RETURN FOR LINE CHANGE 
      JMP GSP,I 
GSPTR NOP 
GSPTS DEF GSPB
GSPTE DEF GSPB+30 
GSPB  BSS 32
* 
GSPE  JSB .FMT
      DEF GSPEM 
      JMP OPLNN 
GSPEM ASC 3,GS OV_
      SKP 
*         PROCESS RTN STATEMENT 
* 
RTP   NOP 
      LDA GSPTR     CHECK IF THERE HAS
      CPA GSPTS       BEEN A GOSUB
      JMP OPLNE     NO - THEN ERROR 
      ISZ GSPTR,I   FINISHED WITH LOOP
      JMP RTPN      NO
      LDA GSPTR     YES 
      ADA .M2         MOVE POINTER BACK TWO 
      STA GSPTR 
      INA           RESET LINE NUMBER 
      LDA A,I 
      STA PRPTR 
      LDA PRPTR,I 
      STA TMP 
      JMP RTP,I 
RTPN  CCA 
      ADA GSPTR 
      LDA A,I 
      ADA .M2 
      LDA A,I 
      ISZ RTP       ADJUST RETURN FOR LINE CHANGE 
      JMP RTP,I 
      SKP 
*         OUTPUT A MESSAGE
* 
MSP   NOP 
      STA MSPM+2
      CLA 
      SFC INTP      SAVE INTERRUPT STATUS 
      CCA 
      STA DTP 
      CLF INTP      TURN OFF INTERRUPTS 
      LDA .4
      LDB MSPM
      JSB SLOP,I
      LDA DTP 
      SZA           RESTORE INTERRUPT STATUS
      STF INTP
      JMP MSP,I 
MSPM  DEF *+1 
      ASC 2,* XX
* 
* 
*     PROCESS DELAY STATEMENT 
* 
DTP   NOP 
      SZA           IF IT'S ZERO FORGET IT
      JSB TMRR,I    GO WAIT 
      JMP DTP,I     NOW RETURN TO CALLER
* 
* 
*         TEST EXECUTION
* 
TEP   NOP 
      CMA           MAKE IT NEG.
      STA TEPA      SAVE IT 
      LDB TSTP      GET POINTER TO TEST LIST
TEP0  LDA B,I       GET ADDRESS 
      CPA .M1       IS IT THE TERMINATOR
      JMP TEP,I     YES - EXIT
      INB 
      ISZ TEPA      IS THIS THE TEST? 
      JMP TEP0      NO TRY NEXT ONE 
      CPA OPNO      IF IT'S OPDSN THEN FORGET IT
      JMP PSTOP+1 
      JSB A,I       YES - EXICUTE IT
      JMP TEP,I     RETURN TO CONTROL 
OPNO  DEF OPDSN 
TEPA  EQU * 
* 
* 
*         STOP EXECUTION
* 
PSTOP NOP 
      JSB .FMT      OUTPUT STOP MESSAGE 
      DEF STPM
      JMP OPLNN 
STPM  ASC 3,STOP_ 
      SKP 
MXNM  DEC 9999
* 
AA    OCT 101 
AI    OCT 111 
AK    OCT 113 
AP    ASC 1,P 
AIK   ASC 1,IK
AIA   ASC 1,IA
ARK   ASC 1,RK
ARA   ASC 1,RA
ACB   ASC 1,CB
ABY   ASC 1,BY
ALO   ASC 1,LO
ALI   ASC 1,LI
ALF   ASC 1,LF
ACF   ASC 1,CF
AGO   ASC 1,GO
ADB   ASC 1,DB
ACO   ASC 1,CO
AST   ASC 1,ST
* 
MINUS OCT 55
SPC   OCT 40
SVA   NOP 
SVB   NOP 
PRPTR NOP 
PRPLA NOP 
LDBC  NOP 
LDBD  NOP 
* 
IBUFP NOP 
IBUFD DEF IBUF
      NOP 
IBUF  BSS 37
* 
STTBD DEF STTBP 
* 
DVIC  NOP 
FDF   NOP 
      JMP DVIC,I
JSBSD JSB SLOP,I
      SKP 
STTBP EQU * 
* 
      ASC 2,WAIT
      ASC 1,
      DEF WAP 
* 
      ASC 2,GOTO
      ASC 1,I 
      DEF GTP 
* 
      ASC 2,GOSB
      ASC 1,II
      DEF GSP 
                                                                                                                                                                                                                                            