      LDB IBUFD     * 
      RBL           * 
      STB IBUFP     *  ADD CR TO
      ADB A         * 
      LDA .15       *    END OF BUFFER
      JSB A2BUF     * 
      JMP GIFO,I    RETURN TO CALLER
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
      SKP 
*          GET A CHARACTER FROM INPUT BUFFER
* 
GETC  NOP 
      LDB IBUFP 
      JSB BUF2A 
      CPA .15       IF CR RETURN P+1
      JMP GETC,I    YES 
      ISZ IBUFP     MOVE POINTER TO NEXT CHARACTER
      ISZ GETC      ADJUS GOOD RETURN P+2 
      JMP GETC,I    RETURN
* 
* 
BUF2A NOP 
      CLE,ERB       E _ UPPER LOWER FLAG
      LDA B,I       2CHR TO AREG
      SEZ,RSS       UPPER OR LOWER? 
      ALF,ALF       UPPER 
      AND .177      MASK UNWANTED CHARACTER 
      JMP BUF2A,I   RETURN. 
* 
* 
A2BUF NOP 
      STA GETC      SAVE CHARACTER
      SLB,INB         OPPSITE 
      ADB .M2           CHARACTER 
      JSB BUF2A 
      ALF,ALF 
      IOR GETC      ADD NEW CHARACTER 
      SEZ           SHOULD IT BE SWAPPED? 
      ALF,ALF       YES 
      STA B,I       STORE IT
      JMP A2BUF,I 
* 
* 
PUTC  NOP 
      AND .177      MASK UPPER BITS 
      SZA,RSS       IF IT'S ZERO
      JMP PUTC,I    DON'T PUT IN BUFFER 
      LDB IBUFP     GET ADDRESS 
      JSB A2BUF     PUT CHATACTER IN BUFFER 
      ISZ IBUFP     MOVE TO NEXT CHARACTER
      JMP PUTC,I    RETURN TO CALLER
* 
* 
* 
* 
* 
      SKP 
*          GET INPUT BLOCK FROM INPUT BUFFER
* 
GETB  NOP 
      CLA           CLEAR PARAMETERS
      STA AIN 
      STB BIN 
      JSB GETC      GET A CHARACTER 
      JMP GETB,I    NO DATA 
      CPA SPC       CHECK IF IT'S A SPACE 
      JMP GETB,I    YES SKIP IT 
      ISZ GETB      ADJUST RETURN 
      CPA MINUS     IF IT'S NEG SIGN
      JMP NUMIN+1     THEN PROCESS AS A NUMBER
      JSB DGCK      IF IT'S A NUMBER
      JMP NUMIN       THEN PROCESS AS A NUMBER
      CLB 
      STB SVA 
      JSB GETA      CONVERT 2 CHARACTERS
      STA AIN       SAVE IT 
      LDA SVA       CHECK IF SPACE HAS BEEN 
      SZA,RSS       ? 
      JSB GETC      NO GET NEXT CHARACTER 
      LDA SPC       NO DATA USE SPACE 
      CPA SPC       IS IT A SPACE?
      STA SVA       YES SET FLAG
      JSB GETA      CONVERT NEXT 2 CHARACTERS 
      STA BIN       SAVE IT 
      LDA SVA       CHECK FOR SAPC
      SZA           ? 
      JMP *+6 
      JSB GETC      MOVE TO NEXT SPACE
      LDA SPC       NO DATA USE SPACE 
      CPA SPC       SPACE?
      RSS           YES 
      JMP *-4       NO GET NEXT CHARACTER 
      CLE           INDICATE ASCII
      LDA AIN       RETRIEVE CHR
      LDB BIN 
      JMP GETB,I    RETURN
* 
* 
GETA  NOP 
      STA BIN 
      LDA SVA 
      SZA,RSS 
      JSB GETC
      LDA SPC 
      CPA SPC 
      STA SVA 
      ALF,ALF 
      IOR BIN 
      ALF,ALF 
      JMP GETA,I
      SKP 
NUMIN CCB,RSS       INDICATE POSITIVE 
      CLB           INDICATE NEGATIVE 
      STB NFLG      SAVE FLAG 
      ADB IBUFP     MOVE POINTER BACK IF NECESSARY
      CLE,ERB       SET UPPER LOWER FLAG
      CLA           CALL FOR INTEGER
      JSB AS2N,I    CONVERT IT
      STA AIN       SAVE IT 
      LDB NFLG
      ADB IBUFP 
      CLE,ERB 
      CCA           CALL FOR OCTAL
      JSB AS2N,I    CONVERT IT
      STA BIN       SAVE IT 
      LDA AIN       RETRIEVE
      LDB BIN           NUMBERS 
      ISZ NFLG      WAS A NEG ENTERED?
      RSS 
      JMP *+3       NO
      CMA,INA       YES 
      CMB,INB 
      STA AIN       SAVE NUMBER 
      STB BIN 
      JSB GETC      GET NEXT CHARACTER
      LDA SPC       NO DATA USE SPACE 
      CPA SPC       READ TO NEXT SPACE
      RSS 
      JMP *-4       NO MOVE TO NEXT ONE 
      CCE           INDICATE IT'S A NUMBER
      LDA AIN       RETRIEVE PRAMETERS
      LDB BIN 
      JMP GETB,I    RETURN
AIN   NOP 
BIN   NOP 
NFLG  NOP 
* 
*          CHECK IF AREG = DIGIT
* 
DGCK  NOP 
      STA BUF2A     SAVE CHARACTER
      ADA .M60      ADD -60 OCTAL 
      SSA           SHOULD STILL BE POS.? 
      ISZ DGCK      NO - NOT A DIGIT
      ADA .M10      ADD -10 
      SSA,RSS       SHOULD GO NEG?
      ISZ DGCK      NO - ADJUST RETURN
      LDA BUF2A     RETRIEVE CHARACTER
      JMP DGCK,I    RETURN
      SKP 
*                   SELECT FAST OR SLOW OUTPUT DEVICE 
* 
PDVC  NOP 
      LDA JSBSD 
      CPB AP        CHECK IF LINE PRINTER?
      INA           YES 
      LDB 113B      CHECK IF THERE IS A FAST DEVICE 
      SZB,RSS       ? 
      LDA JSBSD     NO
      STA FDF 
      JMP PDVC,I    RETURN
* 
* 
* 
*         OUTPUT TO FORMATTER 
* 
.FMT  NOP 
      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 ALB       LIST BUFFER?
      JMP PLB       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,@_     *THIS  "*" PREVENTS LF SUPPRESSION 
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 
      CLA           ALTER JSB INST
      STA CRJSB     IN CHECK FOR READY
      JSB CFR       GO WAIT UNTIL READY 
      LDA JSBFF     RESTORE INSTR TO
      STA CRJSB     DO FORM FEED WHEN READY 
      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?_    *THIS "*" PREVENTS LF SUPPRESSION 
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 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> 
      ADA DBE       END OF BUFFER 
      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
                                                                                                                                                                                                              