ASMB,Q,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
      HED TLOG--INTERACTIVE DS/1000 LOG EDITOR/TRANSLATOR 
      NAM TLOG,19,90 91750-16177 REV 2013 800505
* 
* NAME:   TLOG
* 
* RELOC:  91750-16177 
* 
* SOURCE: 91750-16177 
* 
* PRGR:   C. JONAS
* 
* MOD BY: DOUG W. TSUI (SEPT. 1978) 
* 
      SUP 
* 
*  THIS PROGRAM ACCEPTS THE BINARY LOG OUTPUT FROM PLOG AND PERFORMS USER 
*  SPECIFIED SEARCHES AND TRANSLATIONS ON THE DATA. 
*  SCHEDULING SEQUENCE: 
*      *RU,TLOG[,INPUT NAMR[,LOG NAMR[,LIST LU]]] 
*  WHERE: 
*      INPUT NAMR = (INTERACTIVE) LU FOR COMMAND INPUT, OR
*                 = NAMR OF A FILE CONTAINING COMMANDS FOR INPUT. 
*                 DEFAULT IS THE SCHEDULING TERMINAL. 
*      LOG NAMR   = LU OF A DEVICE CONTAINING LOG INFORMATION, OR 
*                 = NAMR OF A FILE CONATINING LOG INFORMATION.
*                 DEFAULT IS DISC FILE 'PLOG:DS.
*      LIST LU    = LU OF THE LIST DEVICE.
*                 DEFAULT IS INPUT LU IF INTERACTIVE, ELSE 6. 
* 
*  TLOG INITIALIZES ITSELF USING THE VALUES IN RES, OR THE TWO WORDS
*  ON TAPE, OR FIRST RECORD IN LOG FILE.  PLOG'S #TYPE WORD IS KEPT 
*  IN TTYPE, WHERE BITS, IF SET, MEAN:
* 
*  !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !
*  !--15--14--13--12--11--10---9---8---7---6---5---4---3---2---1---0
*    ^               ^   ^       ^ !<----------LOG LU #----------->!
*    !               !   !       !
*  DISC              ! FULL    DATA 
*   LOG              ! BUFFER LOGGED
*                  WINDOW 
*                   SET 
* 
* 
      SPC 3 
      EXT #PLOG,CLOSE,CNUMD,CNUMO,CREAT 
      EXT IFTTY,EXEC,IFBRK
      EXT KCVT,OPEN,PURGE,READF 
      EXT RNRQ,TMVAL,WRITF
      EXT #PKUP 
      EXT .MBT,.LDY,.JPY,.CBT,.LBY
      EXT .DSY,.MVW,.LAY,.LBT,.CMW,.SBT 
#CLAS DEF #PLOG 
#PRN  DEF #PLOG+1 
#TYPE DEF #PLOG+2 
#RECS DEF #PLOG+3 
#SIZE DEF #PLOG+4 
#CRNT DEF #PLOG+5 
A     EQU 0 
B     EQU 1 
      SKP 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 791213      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  DINIT, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*         DSTIO, LUMAP, #CMGT, INCNV, OTCNV, RMTIO               *
*         RSM,   DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM        *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 8 WORDS (#STR THRU #LVL) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     ERROR CODES & LEVEL # ALWAYS BE IN THE SAME PLACE,  *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS ALSO MAKES      *
***!!!!!     STORE-AND-FORWARD CODE MUCH SIMPLER.                *
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
* 
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
      SKP 
TLOG  NOP 
* 
*  PICK UP SCHEDULING PARAMETERS
* 
      JSB #PKUP 
       DEF *+4
       DEF PMASK
       DEF INNAM
       DEF DEFLU
* 
*  SETUP INPUT NAMR PARAMETER 
* 
      LDA INLU      GET INLU
      SSA 
      JMP LUERR 
      SZA           DEFAULT LU? 
      JMP SETLO     .NO 
      LDA DEFLU     .YES, SET DEFAULT 
      STA INLU
      LDA D1        ALSO SET PARAMETER AS NUMERIC 
      STA INTYP 
* 
*  SETUP LOG NAMR PARAMETER 
* 
SETLO LDA LOTYP     GET LOG TYPE
      SZA,RSS 
      JMP DF/LO     NO PARAMETER, USE DEFAULT 
      CPA D1        LU AS PARAMETER?
      RSS 
      JMP CHKIN      NO, FILE TYPE
      LDA LOGLU      YES, LOAD LU 
      SSA 
      JMP LUERR 
      SZA,RSS       LU = 0? 
      JMP DF/LO     .YES, USE DEFAULT 
      IOR B100        SET BINARY BIT
      STA LOGBI 
      JMP CHKIN 
DF/LO LDA PLNAM 
      STA LONAM 
      DLD PLNAM+1 
      DST LONAM+1 
      LDA PLSEC 
      STA LOSEC 
      LDA PLCRN 
      STA LOCRN 
      LDA D3        SET PARAMETER AS ALPHA
      STA LOTYP 
* 
*  CHECK INPUT NAMR PARAMETER 
* 
CHKIN CLA 
      STA PRMT?     CLEAR PROMPT FLAG 
      LDA INLU      SET ECHO BIT
      IOR B400       IN LU WORD 
      STA INLU2 
      LDA INTYP     WAS LU # OR FILE NAME GIVEN?
      CPA D1
      JMP INTER       LU # --SEE IF DEVICE INTERACTIVE
      JSB OPEN        FILE NAME--OPEN FILE
       DEF *+1+6    RETURN ADDRESS
       DEF INDCB    DCB ADDRESS 
       DEF STAT     STATUS/ERROR WORD 
       DEF INNAM    ADDRESS OF FILE NAME ARRAY
       DEF D0       STANDARD OPEN 
       DEF INSEC    SECURITY CODE 
       DEF INCRN
      SSA,RSS       WAS AN ERROR CODE RETURNED? 
      JMP CHKLI       NO--CONTINUE
      LDB .INAM       YES--INFORM USER AND TERMINATE
      JMP FIERR 
* 
*  SEE IF DEVICE IS INTERACTIVE OR NOT, SET PROMPT FLAG ACCORDINGLY 
* 
INTER EQU * 
      JSB IFTTY 
       DEF *+2
       DEF INLU 
      SSA 
      ISZ PRMT?     SET PROMPT FLAG ON
* 
*  CHECK LIST PARAMETER 
* 
CHKLI LDA LSTLU 
      SSA 
      JMP LUERR 
      SZA 
      JMP CHKLO     IF LIST LU GIVEN, SKIP CHECK
      LDA D6        DEFAULT CHECK 
      LDB PRMT? 
      SZB 
      LDA INLU      IF INTERACTIVE, USE INLU
      STA LSTLU 
* 
*  CHECK LOG NAMR PARAMETER 
* 
CHKLO LDA LOTYP     WAS LU # OR 
      CPA D1         FILE NAME GIVEN? 
      RSS 
      JMP FILLO     FILE LOG
* 
*  DEVICE LOG 
* 
      LDA #PLOG 
      SZA,RSS 
      JMP DEVOK 
      LDA #TYPE,I 
      AND LOBYT 
      CPA LOGLU       MAKE SURE PLOG IS NOT ON THE SAME LU
      JMP PLERR       IT IS--ERROR
DEVOK JSB EXEC      O/W, READ 1ST TWO WORDS (= #TYPE & #RECS) 
       DEF *+1+4    RETURN ADDRESS
       DEF NA1      READ, NO ABORT
       DEF LOGBI    MT LU # 
       DEF TTYPE    BUFFER ADDRESS
       DEF D2       BUFFER LENGTH = 2 WORDS 
       JMP EXERR    ERROR RETURN
      LDA TTYPE     GET TYPE WORD,
      AND HIBYT       REMOVE OLD MT LU #
      IOR LOGLU       ADD NEW MT LU # 
      STA TTYPE 
      LDA TTYPE+1     AND SAVE RECORD SIZE
      STA RECSZ 
      JMP COMMD     GO START COMMAND PROCESSING 
* 
*  FILE LOG 
* 
FILLO DLD .LDCB     SET UP CURRENT DCB & NAME 
      DST .DCB       ARRAY TO POINT TO LOG FILE 
      JSB TOPEN     THEN OPEN FILE
      SSA,RSS       ANY ERRORS? 
      JMP *+3         NO--BRANCH AROUND 
      LDB .NAM        YES--INFORM USER AND TERMINATE
      JMP FIERR 
* 
      CLA,INA       SET CURRENT RECORD #
      STA CURNT       TO 1 & GET DCB ADDRESS AGAIN
      LDA .DCB
      JSB TREAD     READ FIRST RECORD IN FILE 
      SSA,RSS       ANY ERRORS? 
      JMP *+3         NO--BRANCH AROUND 
      LDB .NAM        YES--INFORM USER AND TERMINATE
      JMP FIERR 
* 
      LDA BUFFR     GET FIRST WORD
      SZA,RSS       IS IT EQUAL TO ZERO?
      JMP RES         YES--GET VALUES FROM RES
* 
      AND HIBYT       NO--THIS IS #TYPE WORD
      LDB LOGLU     REPLACE OLD LU WITH NEW LU
      CMB,INB 
      IOR B 
      STA TTYPE       AND SET INTO TTYPE
      LDA BUFFR+1   2ND WORD = CURRENT RECORD # 
      STA CURNT 
      LDA BUFFR+2   3RD WORD = FILE SIZE
      STA SIZE
      LDA BUFFR+3   4TH WORD = RECORD SIZE
      STA RECSZ 
      LDA SIZE      DETERMINE LAST RECORD NUMBER+1
      CLB             IN FILE 
      DIV RECSZ 
      INA 
      STA RECNM 
      JMP SETPT 
* 
*  HERE FOR VALUES FROM RES (PLOG IS ALSO LOGGING TO THE FILE)
* 
RES   EQU * 
      LDA #PLOG     IS PLOG THERE?
      SZA,RSS        (CLASS WORD = 0?)
      JMP LOERR     .NO, BAD LOG FILE 
      LDA #SIZE,I   ALL VALUES IN RES 
      STA SIZE        SAVE LOCALLY
      LDA #RECS,I 
      STA RECSZ 
* 
*  TAKE SNAP SHOT OF THE LOG FILE 
* 
      JSB CREAT     CREATE FILE 'TLOG 
       DEF *+1+7      IDENTICALLY TO LOG FILE 
       DEF TLDCB
       DEF IERR 
       DEF TLNAM
       DEF SIZE 
       DEF D2 
       DEF LOSEC
       DEF LOCRN
      SSA,RSS       ANY ERRORS? 
      JMP RES1        NO--JUST CONTINUE 
      CPA M2          YES--DUPLICATE FILE?
      JMP TLERR         YES--EXPLAIN TO USER
      LDB .TNAM       NO--GIVE USER ERROR CODE
      JMP FIERR 
* 
RES1  CLA,INA       SET UP RECORD #'S FOR COPYING 
      STA RECNM       LOG FILE TO 'TLOG 
RNLCK JSB RNRQ      LOCK PLOG'S RN, SUSPENDING
       DEF *+1+3      PLOG FOR DURATION OF COPY 
       DEF RN1
       DEF #PLOG+1
       DEF STAT 
       JMP EXERR
      LDA STAT      LOCK SUCCESSFUL?
      CPA D2
      RSS 
      JMP RNLCK       NO--TRY AGAIN 
* 
COPY  JSB READF     THESE READS & WRITES ENCODED
       DEF *+1+6      SEPARATELY FOR SPEED IN COPYING 
       DEF LODCB      THE RECORDS 
       DEF IERR 
       DEF BUFFR
       DEF RECSZ
       DEF TEMP 
       DEF RECNM
      CPA M12       END-OF-FILE ENCOUNTERED?
      JMP RES2        YES--COPY IS DONE 
      SSA             NO--ANY OTHER ERRORS
      JMP RNULK         YES--CAUSE TLOG TO TERMINATE
* 
      JSB WRITF         NO--CONTINUE WITH WRITE 
       DEF *+1+5
       DEF TLDCB
       DEF IERR 
       DEF BUFFR
       DEF RECSZ
       DEF RECNM
      SSA           ANY ERROS ON WRITE CAUSE
      JMP RNULK       TLOG TO TERMINATE 
      ISZ RECNM     BUMP RECORD # 
      JMP COPY        AND CONTINUE
* 
RES2  LDA #CRNT,I   COPY SUCCESSFUL 
      STA CURNT     GET CURRENT RECORD #
      LDA #TYPE,I    AND CURRENT TYPE WORD
      STA TTYPE 
RNULK JSB RNRQ      THEN UNLOCK PLOG'S RN 
       DEF *+1+3
       DEF RN4
       DEF #PLOG+1
       DEF STAT 
       JMP EXERR
      LDA STAT
      CPA D1        UNLOCK SUCCESSFUL?
      RSS 
      JMP RNULK       NO--TRY AGAIN 
* 
      LDA IERR      WAS COPY SUCCESSFUL 
      CPA M12 
      JMP RES3        YES--BRANCH AROUND PURGE
      DLD .TDCB       NO--GET DCB AND FILE NAME ARRAY ADDRESSES 
      JSB TPURG         AND PURGE 'TLOG 
      JMP COERR         THEN INFORM USER OF ERROR 
RES3  LDA .LDCB     EVERYTHING OKAY, CLOSE LOG FILE 
      JSB TCLOS 
      SSA,RSS       ANY ERRORS? 
      JMP RES4        NO--BRANCH AROUND 
      LDB .LNAM       YES--INFORM USER AND TERMINATE
      JMP FIERR 
* 
RES4  DLD .TDCB     SET UP CURRENT DCB & NAME 
      DST .DCB       ARRAY TO POINT TO 'TLOG FILE 
* 
*  SET UP POINTERS TO THE LOG FILE
* 
SETPT LDA TTYPE      WINDOW START & ENDING
      ALF,RAL         RECORD NUMBERS
      LDB CURNT     IF FULL BUFFER & CURRENT
      SSA,RSS         RECORD NE LAST+1, THEN
      LDB D2          FIRST RECORD & WINDOW 
      CPB RECNM       STARTING RECORD IS CURRENT
      LDB D2          RECORD #, ELSE
      STB START       RECORD # 2
      STB WSTRT     IF BUFFER FULL AND
      LDB CURNT       CURRENT RECORD IS 2, THEN 
      CPB D2          LAST RECORD+1 IS RECNM, 
      SSA,RSS         ELSE LAST RECORD+1
      RSS             IS CURNT
      LDB RECNM 
      ADB M1
      CPB D1        IF LAST RECORD+1 IS THEN = 1
      JMP NOLOG       WE HAVE AN EMPTY LOG FILE 
      STB LAST
      STB WLAST 
      LDB START     SET CURRENT RECORD  TO
      STB CURNT       STARTING RECORD 
      JMP COMMD 
* 
NOLOG CMB,INB       SET ALL STARTING RECORDS TO MINUS ONE 
      STB WSTRT 
      STB START 
      STB CURNT 
      JMP COMMD     START COMMAND PROCESSING
* 
      LDA NORFG     DEFAULT IS NORMAL 
      STA PRFLG      LISTING
      SPC 5 
* 
*  DATA AREA FOR INITIALIZATION PHASE 
* 
* 
*   THIS AREA IS USED BY #PKUP AND SHOULD ALWAYS BE IN THIS ORDER 
PMASK BYT 3,3       3 PARAMETERS, FIRST 2 IS IN NAMR FORM 
INNAM BSS 10        INPUT FILE NAME 
INLU  EQU INNAM     INPUT LU
INTYP EQU INNAM+3   INPUT PARAMETER TYPE
INSEC EQU INNAM+4   INPUT SEC 
INCRN EQU INNAM+5   INPUT CRN 
LONAM BSS 10        LOG FILE NAME 
LOGLU EQU LONAM 
LOTYP EQU LONAM+3 
LOSEC EQU LONAM+4 
LOCRN EQU LONAM+5 
LSTLU NOP           LIST LU 
DEFLU NOP           DEFAULT INPUT LU
* 
INDCB BSS 144       INPUT DCB 
.IDCB DEF INDCB     INPUT DCB ADDRESS 
.INAM DEF INNAM     INPUT NAME ARRAY ADDRESS--MUST FOLLOW .IDCB 
* 
LOGBI NOP           LOG LU FOR BINARY READ
LODCB BSS 144 
.LDCB DEF LODCB     MUST BE 
.LNAM DEF LONAM      TOGETHER 
* 
TLNAM ASC 3,'TLOG   FILE FOR SNAP SHOT
TLDCB BSS 144 
.TDCB DEF TLDCB     MUST BE 
.TNAM DEF TLNAM      TOGETHER 
* 
PLNAM ASC 3,'PLOG   DEFAULT LOG FILE
PLSEC ASC 1,DS      DEFAULT LOG SECURITY
PLCRN DEC 0         DEFAULT LOG CRN 
* 
.DCB  NOP           CURRENT LOG DCB 
.NAM  NOP            & NAME ADDRESS 
IERR  NOP 
* 
TEMP  NOP 
TEMP1 NOP 
D20   DEC 20
      SKP 
* 
*  COMMAND STRING PARSER
* 
COMMD LDA .CML2     PRINT A BLANK LINE
      LDB D1
      JSB LIST
       JMP EXERR
      LDA INTYP     LU # OR FILE NAME FOR COMMAND INPUT?
      CPA D1
      JMP CMDLU       LU--GET COMMAND FROM IT 
* 
*  HERE TO GET A COMMAND FROM A FILE
* 
      JSB READF     PERFORM READ
       DEF *+1+5    RETURN POINT
       DEF INDCB    DCB  ADDRESS
       DEF STAT     STATUS/ERROR WORD 
       DEF CMLIN    COMMAND LINE BUFFER 
       DEF D36      LONGEST LEGAL COMMAND LINE
       DEF CMLEN    ACTUAL COMMAND LINE LENGTH
      SSA,RSS       ERROR CODE RETURNED?
      JMP *+3         NO--BRANCH AROUND 
      LDB .INAM 
      JMP FIERR 
* 
      LDB CMLEN     EOF GIVEN?
      SSB 
      JMP EOCMD       YES--PROCESS
* 
      BLS           GET COMMAND LENGTH IN BYTES 
      STB CMLEN 
      JMP ECHO        THEN PRINT COMMAND AND PARSE IT 
* 
*  HERE TO GET DATA FROM AN LU
* 
CMDLU LDA PRMT?       LU--SHOULD PROMPT BE ISSUED?
      SZA,RSS 
      JMP GETCM       NO--FLAG = 0
* 
      JSB EXEC        YES--PROMPT = TLOG? 
       DEF *+1+4    RETURN ADDRESS
       DEF NA2
       DEF INLU 
       DEF PROMT    PROMPT ADDRESS
       DEF D4         AND LENGTH
       JMP EXERR    ERROR RETURN
* 
GETCM JSB EXEC      GET COMMAND FOR NON-INTERACTIVE DEVICE
       DEF *+1+4    RETURN ADDRESS
       DEF NA1      READ, NO ABORT
       DEF INLU2    LU # W/ ECHO BIT SET
       DEF CMLIN    COMMAND LINE BUFFER 
       DEF M72        AND LENGTH, IN BYTES
       JMP EXERR    ERROR RETURN
      SZB,RSS       ZERO INPUT? 
      JMP PRNXT      YES, JUST PRINT NEXT BUFFER
      STB CMLEN     ACTUAL LENGTH OF DATA TRANSFERED
      SPC 2 
* 
*  ECHO COMMAND, THEN PARSE IT
* 
ECHO  LDB CMLEN     PUSH FINAL BLANK ON LINE
      ADB .CMLN 
      LDA .BLNK 
      JSB .MBT
       DEF D1 
       NOP
      LDB CMLEN     PICK BACK UP COMMAND LENGTH 
      CMB,INB       NEGATE LENGTH 
      STB BCNT      SAVE NEG LENGTH FOR COMMAND PARSE COUNTER 
      LDA INLU      COMMAND INPUT LU AND
      CPA LSTLU       LIST LU THE SAME? 
      JMP PARSE       YES--NEED NOT ECHO COMMAND
* 
      LDA .CML2       NO--ECHO ON LIST DEVICE 
      CMB,CLE,INB 
      ERB 
      SEZ,INB       BUMP TO INCLUDE LENGTH OF PRECEEDING BLANKS 
      INB           IF ODD BYTE COUNT, ADD ONE
      JSB LIST
       JMP EXERR    ERROR RETURN
* 
PARSE LDA .CMLN     GET ADDRESS OF COMMAND LINE 
      JSB NBLNK     AND FIND FIRST NON-BLANK CHARACTER
       JMP PRNXT    ALL BLANK COMMAND--JUST PR NEXT BUFFER
       JMP CMERR    CHARACTER LT A BLANK--ERROR 
      STA CMSAV 
      JSB .LDY
       DEF D8        CHAR. GT A BLANK--OK, SET UP INDEX FOR 
      LDB .CLEN       COMM. TBL SEARCH & GET ADDRESS OF LENGTH
      STB TBLN        OF NEXT COMMAND TABLE AND SAVE. 
      LDB .CMTB     GET BYTE ADDRESS OF COMMAND TABLE 
      JSB SERCH       AND PERFORM SEARCH
       JMP CMERR    ERROR RETURN
      SPC 2 
* 
*  COMMAND WORD OK--NOW GET PARAMETERS
* 
      CLA           ZERO PARAMETER COUNT
      STA FICNT 
      LDA .PTAB     RESET PARAMETER 
      STA .NEXT      TABLE ADDRESS
      LDA CMSAV     GET ADDRESS OF COMMAND
GTPAR JSB IBLNK     FIND NEXT BLANK OR COMMA
       JMP RTAB1    NONE--JUMP TO COMMAND ROUTINE 
GTPR2 JSB NBLNK     FIND NEXT NON-DELIMITING CHARACTER
       JMP RTAB1    NONE--JUMP TO COMMAND ROUTINE 
       JMP PMERR    LT--ILLEGAL CHARACTER 
      STA .NEXT,I   GT--IT'S POSSIBLE SAVE PARAM ADDR.
      ISZ .NEXT       AND INCREMENT TABLE ADDRESS 
      ISZ FICNT     INCREMENT PARAMETER COUNT 
      LDB FICNT     MAKE SURE NO MORE THAN SIX
      CPB D7
      JMP PMERR       MORE--AN ERROR
      JMP GTPAR         OK--CONTINUE SEARCH 
      SPC 2 
* 
*  HERE ON END OF PARSE, ROUTINE TABLE
* 
RTAB1 JSB .JPY
       DEF RTAB2       YES--JUMP TO COMMAND ROUTINE 
RTAB2 NOP 
      JMP HECMD     ?? (HELP) COMMAND ROUTINE 
      JMP BACMD     BALANCE COMMAND ROUTINE 
      JMP EXCMD     EXIT COMMAND ROUTINE
      JMP FICMD     FIND COMMAND ROUTINE
      JMP FOCMD     FORMAT COMMAND ROUTINE
      JMP LICMD     LIST COMMAND ROUTINE
      JMP PRCMD     PRINT COMMAND ROUTINE 
      JMP TICMD     TIME COMMAND ROUTINE
      SPC 5 
* 
*  DATA AREA FOR COMMAND PARSING
* 
CMTB  ASC 18,TIMEPRINTLISTFORMATFINDEXITBALANCE?? 
.CMTB DBL CMTB
CMTBL NOP 
      DEC 2 
      DEC 7 
      DEC 4 
      DEC 4 
      DEC 6 
      DEC 4 
      DEC 5 
      DEC 4 
.CLEN DEF CMTBL 
CMSAV NOP 
RECNM NOP 
INLU2 NOP 
      ASC 1,
CMLIN BSS 36        COMMAND LINE BUFFER 
.CMLN DBL CMLIN 
.CML2 DEF CMLIN-1 
D7    DEC 7 
D36   DEC 36
M2    DEC -2
M4    DEC -4
M6    DEC -6
M12   DEC -12 
M72   DEC -72 
RN1   OCT 040001
RN4   OCT 040004
NA1   OCT 100001
HIBYT OCT 177400
LOBYT OCT 377 
CMLEN NOP           RETURNED COMMAND LINE LENGTH
      SKP 
* 
*  ROUTINE TO FIND NEXT BLANK, COMMA, OR EQUAL SIGN IN STRING 
*    ON ENTRY:
*       A->STRING 
*       BCNT = -(# CHARACTERS IN STRING)
*    ON EXIT: 
*       A->NEXT BLANK, COMMA, OR EQUAL SIGN (IF ANY) IN STRING
*       RETURN POINTS = 
*              IBLNK,I  IF NO BLANKS, COMMAS, OR EQUAL SIGNS
*              IBLNK,I+1  IF BLANK OR COMMA FOUND 
* 
IBLNK NOP 
IBL1  LDB .BLNK     GET ADDRESS OF CHAR. BLANK
      JSB .CBT
       DEF D1        COMPARE BYTE 
       NOP
      JMP IBL3      EQ--RETURN+1
      JMP IBL2      LT--CONTINUE SEARCH 
      LDB .COMA     GT--SEE IF COMMA
      JSB .CBT
       DEF D1 
       NOP
      JMP IBL3      EQ--RETURN+1
      JMP IBL2      LT--CONTINUE SEARCH 
      LDB .EQSN     GT--SEE IF AN EQUAL SIGN
      JSB .CBT
       DEF D1 
       NOP
      JMP IBL3      EQ--RETURN+1
      NOP           LT, OR GT,--CONTINUE SEARCH 
IBL2  INA           GET NEXT CHAR. IN STRING
      ISZ BCNT      DECREMENT LENGTH
      JMP IBL1
      JMP IBLNK,I   END-OF-STRING--RETURN 
IBL3  ADA M1
      ISZ IBLNK     INCREMENT RETURN
      JMP IBLNK,I     POINT AND RETURN
      SPC 2 
* 
*  ROUTINE TO FIND NEXT CHARACTER THAT IS NOT A BLANK, COMMA, OR
*  EQUAL SIGN 
*    ON ENTRY:
*       A->STRING 
*       BCNT = -(# CHARACTERS IN STRING)
*    ON EXIT: 
*       A->CHAR. OTHER THAN BLANK, COMMA, OR EQUAL SIGN (IF FOUND)
*       RETURN POINTS = 
*              NBLNK,I  IF ALL BLANK(S), COMMA(S), OR EQUAL SIGN(S) 
*              NBLNK,I+1  IF CHARACTER LT A BLANK 
*                          OR LT A COMMA AND GT A BLANK 
*              NBLNK,I+2  IF CHARACTER GT A COMMA 
* 
NBLNK NOP 
NBL1  LDB .BLNK     GET BLANK CHAR. ADDRESS 
      JSB .CBT
       DEF D1        DO COMPARISON
       NOP
      JMP NBL2      EQ--TRY NEXT
      JMP NBL4      LT--RETURN+1
      LDB .COMA     GT--SEE IF A COMMA
      JSB .CBT
       DEF D1 
       NOP
      JMP NBL2      EQ--TRY NEXT
      JMP NBL4      LT--RETURN+1
      LDB .EQSN     GT--SEE IF AN EQUAL SIGN
      JSB .CBT
       DEF D1 
       NOP
      JMP NBL2      EQ--TRY NEXT
      NOP 
      JMP NBL3      LT, OR GT,--RETURN+2
NBL2  ISZ BCNT      DECREMENT STRING LENGTH 
      JMP NBL1      AND CONTINUE SEARCH 
      JMP NBLNK,I   END OF STRING--RETURN 
NBL3  ISZ NBLNK     RETURN+2
NBL4  ISZ NBLNK     RETURN+1
      JMP NBLNK,I 
      SPC 2 
* 
*  ROUTINE TO SEARCH FOR COMMAND OR KEYWORD IN TABLE
*   ON ENTRY: 
*      A->WORD IN STRING FOR COMPARISON 
*      B->COMMAND OR KEYWORD TABLE
*      TBLN->COMMAND OR KEYWORD LENGTHS TABLE 
*      Y=# OF COMMANDS OR KEYWORDS IN TABLE 
*   ON EXIT:
*      A->LAST CHARACTER IN STRING COMPARED 
*      Y=INDEX FOR COMMAND, IF FOUND, ELSE 0
*      RETURN POINTS =
*             SERCH,I  IF WORD IN STRING DOES NOT MATCH A COMMAND 
*                          OR KEYWORD 
*             SERCH,I+1  IF MATCH FOUND 
* 
SERCH NOP 
SRCH1 STA VALUE 
      STB SESCR     SAVE COMMAND TABLE ADDRESS TEMPORARILY
      JSB .LBY
       DEF TBLN,I    GET LENGTH FOR COMPARISON
      STB CMPLN 
      LDB SESCR     PICK BACK UP THE TABLE ADDRESS
      JSB .CBT
       DEF CMPLN     DO COMPARISON
       NOP
      JMP SRCH2     SAME--RETURN+1
      NOP 
      STB SESCR     SAVE PLACE IN COMMAND TABLE TEMPORARILY 
      LDB .BLNK     GET BYTE ADDRESS OF CHAR. BLANK 
      JSB .CBT
       DEF D1        COMPARE BLANK AND BYTE IN COMMAND STRING 
       NOP
      JMP SRCH2       EQ--AN ABBREVIATION, RETURN+1 
      NOP 
      LDB .COMA       SEE IF CHAR. A COMMA
      JSB .CBT
       DEF D1 
       NOP
      JMP SRCH2         EQ--AN ABBREVIATION 
      NOP 
      LDB .EQSN         SEE IF CHAR. AN EQUAL SIGN
      JSB .CBT
       DEF D1 
       NOP
      JMP SRCH2           EQ--AN ABBREVIATION 
      NOP 
      JSB .DSY                 CHECK NEXT CMMD OR KEYWORD 
      RSS                    IN TABLE IF ANY LEFT 
      JMP SERCH,I   NO MORE, ERROR RETURN 
      LDA VALUE 
      LDB SESCR 
      JMP SRCH1     ELSE, TRY AGAIN 
SRCH2 ISZ SERCH 
      JMP SERCH,I 
      SPC 2 
CHARS ASC 2,  ,=
.BLNK DBL CHARS 
.COMA DBL CHARS+1 
.EQSN DBR CHARS+1 
VALUE NOP 
SESCR NOP 
      SKP 
* 
*  ?? (HELP) COMMAND ROUTINE
* 
HECMD NOP 
      JSB .LDY
       DEF D9        SET UP FOR INDEX THROUGH LIST
      LDA CMLST     SET UP REGISTERS FOR OUTPUT 
HEC1  JSB .LBY
       DEF LSTLN       THROUGH SUBROUTINE CONSL 
      JSB CONSL     LET CONSL DO OUTPUT 
       DEF EXERR
      JSB .DSY           ON LAST LINE?
      RSS 
      JMP COMMD       YES--RETURN TO PROMPT 
      ADA B           NO--GET NEXT LINE 
      JMP HEC1            AND BRANCH BACK UP
* 
CMLST DEF *+1 
      ASC 14, COMMAND        DESCRIPTION
      ASC 15,  ??         DISPLAY COMMANDS
      ASC 27,  BALANCE    BALANCE LOGGED REPLIES TO LOGGED REQUESTS 
      ASC 13,  EXIT       END TLOG RUN
      ASC 27,  FIND       FIND BUFFERS WITH SPECIFIED CONDITION(S)
      ASC 19,  FORMAT     SET OUTPUT LISTING FORMAT 
      ASC 14,  LIST       SET LISTING LU
      ASC 18,  PRINT      SELECT BUFFERS TO PRINT 
      ASC 15,  TIME       SET A TIME WINDOW 
LSTLN NOP 
      DEC 15
      DEC 18
      DEC 14
      DEC 19
      DEC 27
      DEC 13
      DEC 27
      DEC 15
      DEC 14
D9    DEC 9 
      SKP 
* 
*  EXIT COMMAND ROUTINE 
* 
EXCMD LDA .PTAB     PURGE PARAMETER GIVEN?
      CPA .NEXT 
      JMP EXIT1       NO--BRANCH OUT
      LDB .EXLN       YES--SEE IF KEYWORD CORRECT 
      STB TBLN
      JSB .LDY
       DEF D1 
      LDB .EXKY 
      LDA A,I 
      JSB SERCH 
       JMP PMERR    INCORRECT--INFORM USER
      LDA .PTAB     ONLY PARAMETER GIVEN? 
      INA 
      CPA .NEXT 
      RSS 
      JMP PMERR       NO--ERROR, INFORM USER
* 
      LDB TTYPE 
      SSB,RSS       DISC OR TAPE LOG? 
      JMP PMERR     ERR, CANNOT PURGE TAPE
* 
      LDA .DCB      MAKE SURE WE HAVE ADDRESS 
      LDB .NAM        OF CORRECT DCB & NAME 
      JSB TPURG       AND TRY PURGE OF LOG FILE 
      SSA,RSS       IF PURGE NOT SUCCESSFUL, TRY CLOSE
      JMP EXIT2 
* 
EXIT1 LDB TTYPE 
      SSB,RSS 
      JMP EXIT2     SKIP CLOSE IF TAPE
      LDA .DCB
      JSB TCLOS     JUST CLOSE FILE, IGNORE ERRORS
* 
EXIT2 LDA INTYP     COMMANDS FROM INPUT FILE? 
      CPA D1
      JMP EXIT3       NO--BRANCH AROUND CLOSE 
      JSB CLOSE       YES--CLOSE FILE 
       DEF *+1+2    RETURN ADDRESS
       DEF INDCB    FILE DCB
       DEF STAT     STATUS--ERROR WORD (ERRORS IGNORED) 
* 
EXIT3 LDA .DONE     PRINT "END TLOG" MESSAGE
      LDB D6
      JSB TELL
       NOP
* 
      JSB EXEC      THEN TERMINATE
       DEF *+1+3
       DEF D6       REQUEST CODE = TERMINATE
       DEF D0         THIS PROGRAM
       DEF D0         NORMALLY
      SPC 2 
EXKEY ASC 3,PURGE 
.EXKY DBL EXKEY 
.EXLN DEF * 
      DEC 5 
DONE  ASC 6, ** END TLOG
.DONE DEF DONE
      SKP 
* 
*  PRINT COMMAND ROUTINE
* 
PRCMD EQU * 
      LDA .PTAB     ANY PARAMETER GIVEN?
      CPA .NEXT 
      JMP PRNXT      DEFAULT TO NEXT
      LDB .PRLN     CHECK KEYWORD 
      STB TBLN
      JSB .LDY
       DEF D4 
      LDB .PRKY 
      LDA A,I 
      JSB SERCH 
       JMP PMERR
      LDA .PTAB     ONLY PARAMETER GIVEN? 
      INA 
      CPA .NEXT 
      RSS 
      JMP PMERR      NO, ERROR
      JSB .JPY
       DEF PRTAB
PRTAB NOP 
      JMP PRFIR 
      JMP PRNXT 
      JMP PRLAS 
      JMP PRALL 
* 
PRFIR CCA           SET FLAG TO 
      STA HALT       ADVANCE
      JSB FBUFR      TO THE FIRST BUFFER
PRBUF JSB FBUFR     GET BUFFER
       JMP COMMD
      JSB PBUF      PRINT BUFFER
      JMP COMMD 
* 
PRNXT JSB FBUFR     GET NEXT BUFFER 
       JMP PREOF    IF EOF, PRINT MESSAGE 
      JSB PBUF      PRINT BUFFER
      JMP COMMD 
PREOF LDA .LEOF 
      LDB D8
      JSB TELL
       JMP COMMD
      JMP COMMD 
* 
PRLAS CLA 
      STA HALT
      LDA TTYPE 
      SSA,RSS       DISC OR MT LOG? 
      JMP PLST1      JMP TO MT LOG
      LDA WLAST       DISC--SET CURNT TO WLAST
      STA CURNT 
      JMP PRBUF     JMP TO PRINT BUFFER 
PLST1 LDA LOGLU       MAG TAPE--JUMP TO END OF FILE 
      IOR B1300 
      STA TEMP1 
      JSB EXEC
       DEF *+1+2
       DEF NA3
       DEF TEMP1
       JMP EXERR
      LDA LOGLU           THEN BACKSPACE ONE RECORD 
      IOR B200
      STA TEMP1 
      JSB EXEC
       DEF *+1+2
       DEF NA3
       DEF TEMP1
       JMP EXERR
      JMP PRBUF 
* 
PRALL CCA           SET FLAG TO 
      STA HALT       ADVANCE
      JSB FBUFR      TO THE FIRST BUFFER
PALL1 JSB FBUFR     FILL BUFFER 
       JMP COMMD    NO MORE BUFFER--END OF COMMAND
      JSB PBUF      PRINT BUFFER
      JMP PALL1     GET NEXT BUFFER 
      SPC 2 
PRKEY ASC 8,ALLLASTNEXTFIRST
LEOF  ASC 8, EOF IN LOG FILE
.LEOF DEF LEOF
.PRKY DBL PRKEY 
.PRLN DEF * 
      DEC 5 
      DEC 4 
      DEC 4 
      DEC 3 
B200  OCT 200 
B1300 OCT 1300
      SKP 
* 
*  FORMAT COMMAND ROUTINE 
* 
FOCMD EQU * 
      LDA .PTAB 
      CPA .NEXT 
      JMP FONOR     DEFAULT IS NORMAL LISTING 
      LDB .FOLN 
      STB TBLN
      JSB .LDY
       DEF D5 
      LDB .FOKY 
      LDA A,I 
      JSB SERCH 
       JMP PMERR
      LDA .PTAB 
      INA 
      CPA .NEXT 
      RSS 
      JMP PMERR 
      JSB .JPY
       DEF FOTAB
FOTAB NOP 
      JMP FOOFF 
      JMP FONOR 
      JMP FOBUF 
      JMP FODAT 
      JMP FOBOT 
* 
FOOFF LDA OFFFG 
      STA PRFLG 
      JMP COMMD 
* 
FONOR LDA NORFG 
      STA PRFLG 
      JMP COMMD 
* 
FOBUF LDA BUFFG 
      STA PRFLG 
      JMP COMMD 
* 
FODAT LDA DATFG 
      STA PRFLG 
      JMP COMMD 
* 
FOBOT LDA BOTFG 
      STA PRFLG 
      JMP COMMD 
      SPC 2 
FOKEY ASC 12,BOTHDATABUFFERNORMALOFF
.FOKY DBL FOKEY 
.FOLN DEF * 
      DEC 3 
      DEC 6 
      DEC 6 
      DEC 4 
      DEC 4 
OFFFG DEC 1 
NORFG DEC 2 
BUFFG DEC 4 
DATFG DEC 8 
BOTFG DEC 16
PRFLG NOP           LISTING FLAG
      SKP 
* 
*  LIST COMMAND ROUTINE 
* 
LICMD EQU * 
      LDA .PTAB 
      CPA .NEXT 
      JMP PMERR     ERR,NO LU 
      LDA A,I 
      LDB D3        SEE IF 2 CHAR. LU 
      CMB,INB 
      STB BCNT
      JSB IBLNK 
       JMP PMERR    IF LONGER THAN 2 CHARS, ERR 
      CMA,INA 
      ADA .PTAB,I 
      STA CVLEN 
      LDB .PTAB,I   GET ADDRESSES OF LU 
      LDA .LIST      AND STORAGE PLACE
      JSB CNVOC 
       JMP PMERR    NOT A NUMBER, ERR 
      LDA .PTAB 
      INA 
      CPA .NEXT 
      RSS 
      JMP PMERR     MORE THAN ONE PARAMETER, ERR
      LDA .LIST,I 
      STA LSTLU 
      JMP COMMD 
      SPC 2 
.LIST DEF *+1 
      NOP 
      SKP 
* 
*  BALANCE COMMAND ROUTINE
* 
BACMD LDA .PTAB     ANY PARAMETERS GIVEN? 
      CPA .NEXT 
      RSS 
      JMP PMERR       YES--SHOULD NOT BE ANY
* 
      CLA 
      STA RQCNT     ZERO OUT COUNT
      CCA           SET FLAG
      STA HALT       TO ADVANCE 
      JSB FBUFR      TO FIRST BUFFER
BAC1  JSB FBUFR     GET LOG BUFFER FILLED 
      JMP BAC9      NO MORE--FINISH COMMAND 
      LDB .BFAD     GET ADDRESS OF NEXT BUFFER
      ADB D3
      LDA B,I 
      AND REPLY     IS IT A REPLY?
      SZA 
      JMP BAC4        YES--FIND CORRESPONDING REQUEST 
* 
      LDB FREE        NO--A REQUEST, ADD TO QUEUE 
      SZB,RSS       IF OUT OF SPACE, MORE THAN 10 REQUESTS UNMATCHED
      JMP BAERR     INFORM USER, THEN PRINT OUT REQUESTS. 
      LDA B,I         A SIMPLE POP FROM FREE
      STA FREE
      LDA USED          AND 
      STA B,I         A SIMPLE PUSH ONTO USED 
      STB USED
      INB           GET BODY OF QUEUE ELEMENT 
      LDA .BFAD 
      ADA D4          AND REQUEST BUFFER AGAIN
      JSB .MVW
       DEF D2        MOVE SEQ. # & SOURCE NODE # OF REQUEST 
       NOP
      ISZ RQCNT     INCREMENT REQUEST COUNT 
      JMP BAC1      GET NEXT LOG RECORD 
      SPC 2 
* 
*  HERE ON REPLY
* 
BAC4  CLA           ZERO OUT TEMPORARY ADDRESS
      STA TEMP1       STORAGE SPACE 
      INB 
      LDA B,I       GET SEQUENCE NUMBER 
      STA SEQ#      SAVE FOR COMPARISONS
      LDB USED      GET USED QUEUE
BAC5  SZB,RSS       ANY IN THERE? 
      JMP BAC1        NONE--GET NEXT LOG RECORD 
* 
      STB TEMP
      INB           GET NEXT SEQUENCE NUMBER
      LDA B,I 
      XOR SEQ#      DO COMPARISON ON SEQ. #'S 
      SZA,RSS 
      JMP BAC7        SAME--NOW CHECK NODE #'S
BAC6  LDB TEMP
      STB TEMP1 
      LDB TEMP,I     DIFFERENT--TRY NEXT ONE
      JMP BAC5
* 
BAC7  INB           GET ADDRESS OF SOURCE NODE #'S
      LDA .BFAD       IN QUEUED BUFFER
      ADA D5          AND IN BLOCK BUFFER 
      LDA A,I 
      CPA B,I       COMPARE NODE #'S
      JMP BAC8        SAME--REMOVE REQUEST
      JMP BAC6        DIFFERENT--TRY NEXT REQUEST 
* 
BAC8  LDA TEMP,I    GET FORWARD POINTER FROM THIS QUEUED SPACE
      LDB TEMP1     GET PREVIOUS SPACE'S ADDRESS
      SZB,RSS       IF ZERO,
      LDB .USED       GET USED'S ADDRESS
      STA B,I       REPLACE ITS FORWARD POINTER 
      LDB FREE      GET FIRST FREE SPACE'S ADDRESS
      STB TEMP,I    PUT IT IN NEW FIRST FREE SPACE'S POINTER
      LDA TEMP
      STA FREE        AND UPDATE HEAD POINTER 
      LDA RQCNT     DECREMENT BUFFER COUNT
      ADA M1
      STA RQCNT 
      JMP BAC1      AND GO GET NEXT LOG RECORD
      SPC 2 
* 
*  HERE ON END OF BLOCKS
* 
BAC9  JSB CNUMD     CONVERT BCNT TO ASCII & PUT INTO MESSAGE
       DEF *+1+2    RETURN ADDRESS
       DEF RQCNT    BUFFER COUNT
       DEF UNBAL+1  MESSAGE BUFFER
      LDA .UNBL     GET MESSAGE ADDRESS 
      LDB D18         AND ITS LENGTH
      JSB TELL      AND PRINT MESSAGE 
      JMP EXERR     ERROR RETURN
      LDA RQCNT     GET UNBALANCED COUNT AGAIN
      SZA,RSS 
      JMP COMMD     IF ZERO, WE ARE DONE
BAC10 JSB FBUFR     IF NOT, MUST WRITE
      JMP COMMD       OUT ALL UNBALANCED BUFFERS
BAC11 LDA .USED     GET ADDRESS OF NEXT ENTRY IN USED QUEUE 
      LDB .USED,I 
      SZB           IF NONE,
      JMP BAC12 
      CMA 
      STA HALT      SET HALT FLAG 
      JMP BAC10       AND LET FBLCK END COMMAND 
BAC12 STA TEMP1     SAVE OLD STORAGE LOCATION ADDRESS 
      LDA B         SWITCH REGISTERS
      LDB A,I         AND PICK UP FORWARD POINTER 
      SZB           IF POINTER ZERO, LAST ENTRY FOUND 
      JMP BAC12     IF NOT, TRY AGAIN 
      INA           GET SEQUENCE #
      LDB A,I         OF NEXT REQUEST IN USED QUEUE 
      STB SEQ#        AND SAVE FOR COMPARISON 
BAC13 LDA .BFAD 
      ADA D4          AND ADDRESS OF THAT IN NEXT BUFFER
      LDB A,I       COMPARE THE TWO 
      CPB SEQ#
      RSS 
      JMP BAC14       NOT SAME--TRY NEXT
      JSB PBUF        SAME--LIST IT 
      LDA TEMP1,I   REMOVE REQUEST FROM USED QUEUE
      CLB 
      STB TEMP1,I   ZERO OUT LAST FORWARD POINTER 
      LDB FREE          AND 
      STB A,I         A SIMPLE PUSH ONTO FREE 
      STA FREE
      JMP BAC11 
BAC14 JSB FBUFR     GET NEXT LOG BUFFER TO COMPARE TO 
       JMP COMMD      ONE IN QUEUE
      JMP BAC13 
      SPC 2 
FREE  DEF *+1 
      DEF *+3       REQUEST BUFFER RECORDING
      BSS 2           AREA FOR REQUEST BALANCING
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEF *+3 
      BSS 2 
      DEC 0 
      BSS 2 
USED   NOP          RECORDED BUFFERS LINKED LIST HEADER 
.USED DEF USED
SEQ#  NOP 
D4    DEC 4 
D5    DEC 5 
REPLY OCT 040000
UNBAL ASC 18,         REQUEST BUFFERS UNBALANCED
.UNBL DEF UNBAL 
D18   DEC 18
      SKP 
* 
*  SET COMMAND ROUTINE
* 
TICMD LDA TTYPE     REMOVE ANY OLD WINDOW 
      AND WINDO 
      SZA,RSS       WAS THERE ONE?
      JMP SEC1        NO--BRANCH AROUND 
      XOR TTYPE       YES--RESET TYPE WORD
      STA TTYPE 
      SSA,RSS       DISK LOG? 
      JMP SEC1        NO--BRANCH AROUND 
* 
      LDB START       YES--RESET RECORD 
      STB WSTRT         VALUES
      STB CURNT 
      LDB LAST
      STB WLAST 
* 
SEC1  LDB .PTAB     SEE IF ANY BOUNDS SPECIFIED BY USER 
      CPB .NEXT 
      JMP COMMD      NO--DONE 
      LDB B,I 
      LDA .LOBD     STORE TIME IN LOWER BOUND 
      JSB CNVTO     PARSE TIME PARAM & CONVERT TO OCTAL 
* 
      LDB .PTAB     UPPER BOUND GIVEN?
      INB 
      CPB .NEXT 
      RSS 
      JMP SEC3        YES--JUMP AROUND
      CCA             NO--SET INFINITE
      ALS,RAR          UPPER
      STA UPBND        BOUND
      JMP SEC5
* 
SEC3  LDB B,I       GET UPPER BOUND PARAM 
      LDA .UPBD     STORE TIME IN UPPER BOUND 
      JSB CNVTO     PARSE & CONVERT TO OCTAL
* 
      LDA .PTAB     LAST CHECK FOR LEGALITY OF COMMAND
      INA 
      INA 
      CPA .NEXT 
      RSS 
      JMP PMERR     STILL A PARAMETER LEFT--ERROR 
SEC5  LDA .PTAB     ELSE, RESET ADDRESS VALUE 
      STA .NEXT 
      CLA           CLEAR RECORD COUNT
      STA RQCNT 
      CCA           SET FLAG
      STA HALT       TO ADVANCE 
      JSB FBUFR      TO FIRST BUFFER
* 
SEC6  LDA CURNT     SET WINDOW STARTING RECORD TO 
      STA WSTRT       NEXT RECORD 
      JSB FBUFR     FILL BUFFER BLOCK 
      JMP SEC8      END OF BUFFERS--EMPTY WINDOW
      JSB BCHEK     CHECK BOUNDS
       JMP SEC6       TOO SMALL--READ NEXT RECORD 
       JMP SEC8       TOO LARGE--EMPTY WINDOW 
       ISZ RQCNT      JUST RIGHT--BUMP COUNT
* 
SEC7  LDA CURNT 
      STA TEMP      SET BACKWARD POINTER FOR SETTING WLAST
      JSB FBUFR     READ NEXT RECORD
       JMP SEC10    END OF DATA--WLAST ALREADY SET
      JSB BCHEK     CHECK BOUNDS
       JMP *+2        IGNORE, LOOSE WINDOW
       JMP SEC9       TOO LARGE--SET WLAST
       ISZ RQCNT      WITHIN BOUNDS--BUMP COUNT 
      JMP SEC7          AND TRY NEXT
* 
SEC8  CCA           EMPTY WINDOW, SET WSTRT 
      STA WSTRT       TO A MINUS ONE
      JMP SEC10 
* 
SEC9  LDA TEMP      SET WLAST 
      CPA D2        IF LAST RECORD READ = RECORD 2, THEN LAST RECORD
      JMP *+3         IN WINDOW IS LAST RECORD IN FILE, ELSE
      ADA M1          LAST RECORD READ - 1. 
      RSS 
      LDA RECNM 
      STA WLAST 
* 
SEC10 STA HALT      SET HALT FLAG AND LET FBUFR END COMMAND 
      JSB FBUFR 
       NOP
      JSB CNUMD     CONVERT BCNT TO ASCII & PUT INTO MESSAGE
       DEF *+1+2
       DEF RQCNT    BUFFER COUNT
       DEF CMMSG+1  MESSAGE BUFFER
      LDA .CMSG     GET ADDRESS OF MESSAGE
      LDB D20         AND ITS LENGTH
      JSB TELL        AND PRINT IT
      JMP EXERR     ERROR RETURN
      LDA TTYPE     SET WINDOW SET BIT IN TTYPE 
      IOR WINDO 
      STA TTYPE 
      JMP COMMD     DONE--GET NEXT COMMAND
      SPC 2 
START NOP 
WSTRT NOP 
WINDO OCT 004000
      SKP 
* 
*  FIND COMMAND ROUTINE 
* 
FICMD CLA           CLEAR THE SEARCH ITEM COUNT 
      STA FICNT 
      STA RQCNT     CLEAR BUFFER COUNT
      LDA .PTAB     KEYWORD GIVEN?
      STA FITAB 
      CPA .NEXT 
      JMP NOKEY     FIND ALL
* 
FIC0  LDA A,I         YES--SET UP FOR SEARCH OF 
      LDB .FKLN            KEYWORD TABLE
      STB TBLN
      JSB .LDY
       DEF D8 
      LDB .FKEY 
      JSB SERCH     PERFORM SEARCH
       JMP PMERR    ERROR RETURN--INFORM USER 
      ISZ FICNT     INCREMENT KEYWORD COUNT 
      LDA FICNT 
      ARS,ARS       MAKE SURE NO MORE THAN THREE KEYWORDS 
      SZA 
      JMP PMERR       TOO MANY--ERROR 
      LDA FITAB       OK--GET VALUE ADDRESS 
      INA 
      STA FITAB 
      JSB .JPY
       DEF FITAB      AND JUMP TO KEYWORD ROUTINE 
FITAB NOP 
      JMP THKEY     "3000" KEYWORD ROUTINE
      JMP BUKEY     "BUSY" KEYWORD ROUTINE
      JMP DEKEY     "DESTINATION" KEYWORD ROUTINE 
      JMP LIKEY     "LINERR" KEYWORD ROUTINE
      JMP REKEY     "REJECT" KEYWORD ROUTINE
      JMP SEKEY     "SEQUENCE" KEYWORD ROUTINE
      JMP SOKEY     "SOURCE" KEYWORD ROUTINE
* 
      LDB D0        "STREAM" KEYWORD, GET INDEX FOR 
      JMP FIC1        STREAM WORD ADDRESS 
* 
SOKEY LDB D2        GET INDEX FOR 
      JMP FIC1        SOURCE NODE ADDRESS 
* 
SEKEY LDB D1        GET INDEX FOR 
      JMP FIC1        SEQUENCE # ADDRESS
* 
DEKEY LDB D3        GET INDEX FOR DEST. NODE ADDRESS
* 
FIC1  STB .INDX,I   STORE INDEX FOR FIND
      CPA .NEXT     PARAMETER MUST BE SPECIFIED 
      JMP PMERR 
      LDA A,I       GET ADDRESS OF PARAMETER
      LDB M7        GET LONGEST POSSIBLE INTEGER LENGTH + 1 
      STB BCNT        IN NEGATIVE CHARACTERS
      JSB IBLNK       AND FIND NEXT BLANK OR COMMA
       JMP PMERR    MUST BE THERE 
      LDA BCNT      GET NEG. LENGTH OF PARAMETER
      CMA,INA         IN BYTES
      ADA M7
      STA CVLEN 
      LDB FITAB,I   SET UP FOR CONVERSION 
      LDA .ITEM     MUST BE INTEGER FOR ALL BUT "STREAM"
      JSB CNVOC     DO CONVERSION 
       JMP FIC3     NOT AN INTEGER
* 
FIC2  LDA .INDX,I   SEE IF INDEX=0, I.E. "STREAM" KEYWORD 
      CCB 
      SZA 
      JMP SETMK     .NO, JUST MASK
      LDB B77         YES--SET MASK FOR STREAM NUMBER 
      LDA .ITEM,I   GET ITEM
      AND 1         AND W/ MASK 
      CPA .ITEM,I   STILL EQUAL?
      RSS           .YES, O.K.
      JMP PMERR     .NO, ERROR
SETMK EQU * 
      STB .MASK,I 
      LDA FITAB     UPDATE PARAMETER ADDRESS
      INA 
      STA FITAB 
      JMP FIC5
* 
FIC3  LDA .INDX,I   SEE IF INDEX=0, I.E. "STREAM" KEYWORD 
      SZA 
      JMP PMERR       NO--NON-INTEGER PARAMETER IS AN ERROR 
      LDA FITAB,I     YES--SET UP FOR PARAMETER TABLE SEARCH
      LDB .NATL 
      STB TBLN
      JSB .LDY
       DEF D6 
      LDB .NATB 
      JSB SERCH       AND PERFORM SEARCH
       JMP PMERR    ERROR RETURN
      JSB .LAY
       DEF NUMTB     TRANSFORM INDEX INTO CORRECT NUMBER
      STA .ITEM,I     AND PUT IN ITEM TABLE 
      JMP FIC2       THEN BRANCH BACK UP TO FINISH
* 
NOKEY EQU * 
      CCA           SET FLAG
      STA HALT       TO ADVANCE 
      JSB FBUFR      TO FIRST BUFFER
FIALL JSB FBUFR     FILL BUFFER 
       JMP FIC10    NO MORE BUFFER
      JSB PBUF      PRINT BUFFER
      ISZ RQCNT     UP COUNT
      JMP FIALL     GET NEXT
* 
THKEY LDA D0        GET INDEX FOR 3000 BIT ADDRESS
      LDB FIRST       AND COMPARISON MASK 
      JMP FIC4
* 
BUKEY LDA D0        GET INDEX FOR REMOTE BUSY COUNT ADDRESS 
      LDB B7400        AND COMPARISON MASK
      JMP FIC4
* 
LIKEY LDA D0        GET INDEX FOR LINE ERROR COUNT ADDR.
      LDB B300        AND COMPARISON MASK 
      JMP FIC4
* 
REKEY LDA D0        GET INDEX FOR BUSY REJECT BIT ADDR. 
      LDB BUSY        AND COMPARISON MASK 
* 
FIC4  STA .INDX,I   SET INDEX 
      STB .MASK,I       MASK
      STB .ITEM,I       AND COMPARISON WORD 
* 
FIC5  ISZ .MASK     UPDATE MASK TABLE ADDRESS,
      ISZ .ITEM           ITEM TABLE ADDRESS, AND 
      ISZ .INDX           INDEX TABLE ADDRESS.
      LDA FITAB     GET PLACE IN PARAMETER TABLE
      CPA .NEXT     IF ANY KEYWORDS LEFT, 
      RSS 
      JMP FIC0        CONTINUE PARSE
* 
      LDA FICNT     ELSE, SET UP SEARCH COUNTER 
      CMA,INA 
      STA FICNT 
      STA SUB 
      ADA .MASK     RESET MASK
      STA .MASK 
      LDA SUB 
      ADA .INDX           INDEX 
      STA .INDX 
      LDA SUB 
      ADA .ITEM       AND ITEM TABLE ADDRESSES
      STA .ITEM 
      CCA           SET FLAG
      STA HALT       TO ADVANCE 
      JSB FBUFR      TO FIRST BUFFER
* 
FIC6  JSB FBUFR     FILL LOG BUFFER 
      JMP FIC10     END OF DATA--FINISH UP
* 
FIC7  LDB .BFAD     GET NEXT LOG ADDRESS
      ADB D3        INCREMENT TO GET BUFFER ADDRESS 
      ADB .INDX,I   ADD INDEX TO GET PROPER WORD
      LDA B,I       GET WORD
      AND .MASK,I   ISOLATE PROPER BITS 
      LDB B300      IS THIS A LINERR CHECK? 
      CPB .MASK,I 
      RSS 
      JMP FIC8        NO--BRANCH AROUND 
      SZA,RSS         YES--IS IT ZERO?
      JMP FIC9          YES--REQUEST/REPLY DOES NOT MATCH 
      IOR .ITEM,I       NO--SET UP TO GET A ZERO ON XOR 
* 
FIC8  XOR .ITEM,I   DO COMPARISON 
      SZA           IF ANY BITS LEFT ON,
      JMP FIC9        REQUEST/REPLY DOES NOT MATCH CONDITIONS 
* 
      ISZ .MASK     ELSE--CHECK ALL SEARCH ITEMS
      ISZ .ITEM     UPDATE ALL SEARCH ITEM
      ISZ .INDX       ADDRESSES 
      ISZ FICNT     INCREMENT ITEM COUNT
      JMP FIC7        AND LOOP
      JSB PBUF      IF NO MORE, BUFFER MATCHED ALL CONDITIONS 
      ISZ RQCNT       PRINT IT, AND INCREMENT COUNT 
* 
FIC9  LDA FICNT     END OF ONE BUFFER MATCH 
      CMA,INA       RETURN ALL SEARCH ADDRESSES TO
      ADA SUB         THEIR ORIGINAL VALUES 
      STA FICNT 
      ADA .MASK 
      STA .MASK 
      LDA FICNT 
      ADA .INDX 
      STA .INDX 
      LDA FICNT 
      ADA .ITEM 
      STA .ITEM 
      LDA SUB 
      STA FICNT     RESET ITEM COUNTER
      JMP FIC6      GET NEXT LOG RECORD 
      SPC 2 
* 
*  HERE ON END OF DATA
* 
FIC10 JSB CNUMD     CONVERT BCNT TO ASCII 
       DEF *+1+2    RETURN ADDRESS
       DEF RQCNT    BUFFER COUNT
       DEF CMMSG+1  MESSAGE BUFFER
      LDA .CMSG     SET UP TO PRINT MESSAGE 
      LDB D20 
      JSB TELL      PRINT MESSAGE 
       JMP EXERR    ERROR RETURN
      LDA .PTAB     RESTORE PARAMETER TABLE ADDRESS 
      STA .NEXT 
      JMP COMMD     AND GO GET NEXT COMMAND 
      SPC 2 
FKEY  ASC 26,STREAMSOURCESEQUENCEREJECTLINERRDESTINATIONBUSY3000
.FKEY DBL FKEY
FKYLN NOP 
      DEC 4 
      DEC 4 
      DEC 11
      DEC 6 
      DEC 6 
      DEC 8 
      DEC 6 
      DEC 6 
.FKLN DEF FKYLN 
NATAB ASC 12,RFAPTOPOREXECWEXECMDLIST 
.NATB DBL NATAB 
NATLN NOP 
      DEC 5 
      DEC 5 
      DEC 5 
      DEC 2 
      DEC 4 
      DEC 3 
.NATL DEF NATLN 
FICNT EQU NATLN 
NUMTB NOP 
      DEC 1 
      DEC 5 
      DEC 3 
      DEC 7 
      DEC 4 
      DEC 6 
MASK  BSS 3         MASK TABLE FOR FIND COMMAND 
.MASK DEF MASK
INDEX BSS 3         INDEX TABLE FOR FIND COMMAND
.INDX DEF INDEX 
ITEMS BSS 3         ITEM TABLE FOR FIND COMMAND 
.ITEM DEF ITEMS 
D0    DEC 0 
D6    DEC 6 
B77   OCT 000077
B300  OCT 000300
B7400 OCT 007400
M1    DEC -1
M7    DEC -7
BUSY  OCT 020000
FIRST OCT 100000
SUB   NOP 
TBLN  NOP 
      SKP 
* 
*  ROUTINE TO CONVERT TIME PARAMETER TO OCTAL 
*  ON ENTRY:
*     A->DESTINATION ADDRESS
*     B->TIME PARAMETER (ADDRESS IN BYTES)
*  ON EXIT: 
*     TIME IS A FOUR WORD ARRAY: HRS:MIN:SEC:TMS
* 
CNVTO NOP 
      STA COSCR     SET UP DESTINATION ADDRESS
      LDA M4        SET UP LOOP COUNTER 
      STA BCNT
CNVT1 LDA M2        SET UP NEG. BYTE COUNT FOR CNVOC
      STA CVLEN 
      LDA COSCR     POINT A BACK TO DEST. ADDRESS 
      JSB CNVOC       AND CALL CONVERT ROUTINE
       JMP PMERR    NOT A NUMBER--ERROR 
      ISZ BCNT      THROUGH WITH CONVERSION?
      RSS 
      JMP CNVT3      YES--FINAL PARAM. CHECK
* 
      LDA COSCR,I   GET NUMBERIC VALUE
      SSA           NEGATIVE? 
      JMP PMERR     .YES, ERROR 
      LDA COADD     GET TABLE ADDR
      ADA BCNT      ADD CURRENT INDEX 
      LDA 0,I       GET LIMIT 
      ADA COSCR,I   ADD TO VALUE
      SSA,RSS       OVER LIMIT? 
      JMP PMERR     .YES, ERROR 
      LDA .COLN       MAKE SURE NEXT CHAR A ":" 
      JSB .CBT
       DEF D1        ONE AND THE SAME?
       NOP
       JMP CNVT2      YES--CONTINUE 
       JMP PMERR      NO--
       JMP PMERR          ERROR 
CNVT2 ISZ COSCR     UPDATE DESTINATION ADDRESS
      JMP CNVT1 
CNVT3 LDA M2        SET UP VALUES TO CHECK
      STA BCNT        FOR TRAILING BLANK OR COMMA 
      LDA B           WHICH MUST BE THERE 
      JSB IBLNK 
      JMP PMERR     ISN'T--ERROR
      JMP CNVTO,I   IS--RETURN
      SPC 2 
D1    DEC 1 
COSCR NOP 
*  PARAMETER LIMIT TABLE
      DEC -24       LIMIT FOR HOUR
      DEC -60       LIMIT FOR MINUTE
      DEC -60       LIMIT FOR SECOND
COADD DEF * 
      SPC 2 
* 
*  ROUTINE TO CONVERT A VALUE FROM ASCII TO OCTAL 
*  ON ENTRY:
*     A->DESTINATION ADDRESS
*     B->ASCII VALUE (ADDRESS IN BYTES) 
*     CVLEN=NEG. LENGTH OF PARAMETER IN BYTES 
*  ON EXIT: 
*     RETURN POINTS:
*            CNVOC,I    IF ASCII STRING NOT A NUMBER
*            CNVOC,I+1    NORMAL RETURN 
* 
CNVOC NOP 
      STA CCSCR     SAVE DESTINATION ADDRESS
      CLA 
      STA CCSCR,I 
      STA NFLAG     CLEAR NEGATIVE FLAG 
      STA SFLAG       AND SIGN BIT FLAG 
CNVO1 JSB .LBT           GET FIRST BYTE 
      ADA M48       CONVERT TO OCTAL
      SSA,RSS       IS THIS A NUMBER
      JMP CNVO2       YES--CONVERT TO AN OCTAL DIGIT
      ADA D3          NO--A NEGATIVE SIGN?
      SZA 
      JMP CNVOC,I       NO--ERROR 
      CMA               YES--SET NEGATIVE FLAG
      STA NFLAG 
      ISZ CVLEN 
      JMP CNVO1 
CNVO2 ADA M10       IS THIS GREATER THAN AN ASCII NUMBER? 
      SSA,RSS 
      JMP CNVOC,I     YES--GT NINE ASCII CHAR 
      ADA D10         NO--GET NUMBER BACK 
      ADA CCSCR,I       AND ADD TO PREVIOUS VALUE 
      STA CCSCR,I 
      ISZ CVLEN     INCREMENT COUNT 
      RSS           DONE? 
      JMP CNVO3       YES--BRANCH OUT 
      STB CCSC1        NO--SAVE PLACE IN ASCII STRING 
      CLB           SET UP FOR MULTIPLY 
      MPY D10         AND CORRECT FOR POWER OF 10 
      CLB,CLE       SET E REG. TO BIT 15
      ELA,RAR       OF REG. A 
      STA CCSCR,I 
      ERB           THEN SET SFLAG FOR IOR AT END OF CONVERSION 
      STB SFLAG 
      LDB CCSC1     RESTORE REG. B
      JMP CNVO1       AND CONTINUE
CNVO3 IOR SFLAG     RESET BIT 15, IF NECESSARY
      STA CCSCR,I 
      ISZ NFLAG     WAS NEGATIVE FLAG SET?
      JMP CNVO4       NO--BRANCH AROUND 
      LDA CCSCR,I     YES--NEGATE CALCULATED NUMBER 
      CMA,INA 
      STA CCSCR,I 
CNVO4 ISZ CNVOC     BUMP ADDRESS
      JMP CNVOC,I     AND RETURN+1
      SPC 2 
D10   DEC 10
M10   DEC -10 
M48   DEC -48 
CVLEN NOP 
CCSCR NOP 
CCSC1 NOP 
NFLAG NOP 
SFLAG NOP 
      SPC 2 
* 
*  ROUTINE TO SEND OUTPUT TO LIST DEVICE
*   ON ENTRY: 
*      A->LINE TO BE PRINTED ON LIST DEVICE 
*      B=LENGTH OF LINE, IN WORDS, TO BE PRINTED
*   ON EXIT:
*      RETURN POINTS =
*             LIST,I    IF AN ERROR IN EXEC CALL
*             LIST,I+1    NORMAL RETURN 
* 
LIST  NOP 
      STA .LSLN     STORE OUTPUT LINE ADDRESS 
      STB LSLEN       AND ITS LENGTH IN CALL
      JSB EXEC
       DEF *+1+4    RETURN ADDRESS
       DEF NA2      WRITE, NO ABORT 
      DEF LSTLU     OUTPUT LU NUMBER
.LSLN NOP           OUTPUT LINE ADDRESS 
       DEF LSLEN     OUTPUT LINE LENGTH 
       JMP LIST,I   ERROR RETURN
      LDA .LSLN     RESET A & B REGS. 
      LDB LSLEN 
      ISZ LIST
      JMP LIST,I    NORMAL RETURN 
LSLEN NOP 
      SPC 2 
* 
*  ROUTINE TO PRINT MESSAGE ON INPUT DEVICE 
*   ON ENTRY: 
*      A->LINE TO BE PRINTED ON INPUT DEVICE
*      B=LENGTH OF LINE, IN WORDS, TO BE PRINTED
*   ON EXIT:
*      RETURN POINTS: 
*             CONSL,I    IF AN ERROR IN EXEC CALL 
*             CONSL,I+1    NORMAL RETURN
* 
CONSL NOP 
      STA .CSLN     STORE OUTPUT LINE ADDRESS 
      STB CSLEN       AND ITS LENGTH IN CALL
      LDA PRMT?     IS DEVICE INTERACTIVE?
      SZA,RSS 
      JMP CONS1       NO--JUST RETURN 
      JSB EXEC       YES--MAKE CALL 
       DEF *+1+4    RETURN ADDRESS
       DEF NA2      WRITE, NO ABORT 
      DEF INLU      INPUT LU
.CSLN  NOP          OUTPUT LINE ADDRESS 
       DEF CSLEN    OUTPUT LINE LENGTH
       JMP CONSL,I  ERROR RETURN
CONS1 LDA .CSLN     RESTORE A & B REGS. 
      LDB CSLEN 
      ISZ CONSL     BUMP RETURN ADDRESS 
      JMP CONSL,I   NORMAL RETURN 
CSLEN NOP 
      SPC 2 
* 
*  ROUTINE TO READ THE NEXT LOG RECORD INTO BUFFR 
*  ON EXIT: 
*     RETURN POINTS = 
*            FBUFR,I   AT THE END OF THE LOG DATA 
*            FBUFR,I+1   NORMAL RETURN
* 
FBUFR NOP 
FBUFA JSB IFBRK     SEE IF USER WANTS TO BREAK COMMAND
       DEF *+1
      SZA 
      JMP FBUF5       YES--RESET VALUES & BRANCH TO COMD
* 
      LDA HALT      SEE IF FBUFR CALLED TO END COMAND 
      SZA             OR AT LAST RECORD 
      JMP FBUF6       YES--BRANCH TO END
* 
      CCA           EMPTY WINDOW? 
      CPA WSTRT 
      JMP FBUFR,I     YES--RETURN END OF DATA 
* 
      LDA TTYPE     FILE OR TAPE LOG? 
      SSA 
      JMP FBUF3       FILE--BRANCH TO READF 
* 
      JSB EXEC        TAPE--CALL EXEC FOR READ
       DEF *+1+4    RETURN ADDRESS
       DEF NA1      READ, NO ABORT
       DEF LOGBI    LOG DEVICE LU # 
       DEF BUFFR    LOG BUFFER STORAGE
       DEF RECSZ    LOG RECORD SIZE 
       JMP EXERR     ERROR RETURN 
      AND B240      REG. A = STATUS 
      SZA           EOT OR EOF SENSED?
      JMP FBUF1       YES--RESET TAPE & RETURN
* 
      LDB TTYPE     SEE IF WINDOW SET 
      BLF 
      SSB,RSS 
      JMP FBUF0       NO--JUST CONTINUE 
* 
      JSB BCHEK       YES--SEE IF RECORD FALLS WITHIN BOUNDS
       JMP FBUFA    NOT WITHIN LOWER BOUND--RE-READ 
       JMP FBUF1    NOT WITHIN UPPER BOUND--RESET 
FBUF0 ISZ FBUFR     OKAY--RETURN+1
      JMP FBUFR,I 
* 
FBUF1 LDA LOGLU     SET CONTROL BITS WITH MAG TAPE LU 
      IOR B400        FOR REWIND
      STA FBSCR 
      JSB EXEC
       DEF *+1+2    RETURN ADDRESS
       DEF NA3      CONTROL, NO ABORT 
       DEF FBSCR      REWIND
       JMP EXERR    ERROR RETURN
      LDA LOGLU     SET CONTROL BITS FOR RECORD SKIP
      IOR B300
      STA FBSCR 
      JSB EXEC        AND SKIP FIRST RECORD (TWO WORDS) 
       DEF *+1+2    RETURN ADDRESS
       DEF NA3      CONTROL, NO ABORT 
       DEF FBSCR      FORWARD SPACE ONE RECORD
       JMP EXERR    ERROR RETURN
      JMP FBUFR,I   RETURN,END OF DATA
* 
FBUF3 LDA .DCB      GET CURRENT DCB ADDRESS 
      JSB TREAD       AND READ NEXT RECORD
      SSA,RSS       ANY ERRORS RETURNED?
      JMP FBUF4       NO--BRANCH AROUND 
      CPA M12       EOF?
      JMP *+3         YES--BRANCH AROUND
      LDB .NAM        NO--TERMINAL ERROR
      JMP FIERR 
      LDA D2        RESET CURRENT RECORD
      STA CURNT       TO 2
      JMP FBUF3      AND RETRY READ 
* 
FBUF4 LDA CURNT     WAS THIS LAST RECORD? 
      CPA WLAST 
      STA HALT        YES--SET HALT FLAG
      ISZ CURNT     BUMP CURRENT RECORD # 
      ISZ FBUFR       AND RETURN ADDRESS
      JMP FBUFR,I    AND RETURN NORMAL
* 
FBUF5 LDA .ADDR     ALTER RETURN ADDRESS TO THAT OF COMMD 
      STA FBUFR 
      LDA .PTAB     RESET PARAMETER TABLE ADDRESS 
      STA .NEXT 
FBUF6 CLA 
      STA HALT
      LDA TTYPE     FILE OR TAPE LOG? 
      SSA,RSS 
      JMP FBUF1       TAPE--BRANCH TO REWIND
      LDA WSTRT       FILE--RESET CURRENT RECORD #
      STA CURNT 
      JMP FBUFR,I     AND RETURN END OF DATA
      SPC 2 
FBSCR NOP 
.ADDR DEF COMMD 
      SPC 2 
* 
*  ROUTINE TO CHECK RECORD FOR VALIDITY WITHIN WINDOW BOUNDS
*  ON ENTRY:
*     BUFFR = RECORD TO BE CHECKED
*  ON EXIT: 
*     RETURN POINTS = 
*            BCHEK,I    IF NOT WITHIN LOWER BOUND 
*            BCHEK,I+1  IF NOT WITHIN UPPER BOUND 
*            BCHEK,I+2  IF VALID
* 
BCHEK NOP 
      LDA D4          TIME--4 WORD COMPARE
      STA CMPLN 
      JSB TMVAL     CONVERT FROM TMS TO TMS:SEC:MIN:HRS 
       DEF *+1+2
       DEF BUFFR+1
       DEF MS 
      LDA MS        CONVERT FROM
      STA CTIME+3    TMS:SEC:MIN:HRS
      LDA MS+1       TO 
      STA CTIME+2    HRS:MIN:SEC:TMS
      LDA MS+2
      STA CTIME+1 
      LDA MS+3
      STA CTIME 
      LDA .CTIM 
* 
      LDB .LOBD      GET ADDRESS OF LOWER BOUND VALUE 
      JSB .CMW
       DEF CMPLN     DO COMPARISON--SHOULD BE GE
       NOP
      JMP BCHK1       EQ--THIS RECORD OKAY
      JMP BCHEK,I     LT--INVALID,RETURN
      NOP             GT--THIS RECORD OKAY
* 
BCHK1 LDA .CTIM 
      LDB .UPBD 
      JSB .CMW
       DEF CMPLN       AND DO COMPARISON--SHOULD BE LE
       NOP
      JMP BCHK2       EQ--OKAY
      JMP BCHK2       LT--OKAY
      JMP BCHK3       GT--RETURN+1
BCHK2 ISZ BCHEK     RECORD OKAY, RETURN+2 
BCHK3 ISZ BCHEK 
      JMP BCHEK,I 
      SPC 2 
D3    DEC 3 
B240  OCT 000240
B400  OCT 000400
NA2   OCT 100002
NA3   OCT 100003
LOWBT OCT 000377
CTIME BSS 4 
.CTIM DEF CTIME 
LOBND BSS 4 
.LOBD DEF LOBND 
UPBND BSS 4 
.UPBD DEF UPBND 
CMPLN NOP 
      SPC 2 
* 
*  ROUTINE TO PRINT A LINE ON THE LIST DEVICE, AND IF NOT THE SAME DEVICE 
*    THE INPUT DEVICE.
* 
TELL  NOP 
      JSB LIST      PRINT MESSAGE ON LIST DEVICE
       JMP TELL,I   ERROR RETURN
      STA TESCR     IF LIST AND INPUT LUS 
      LDA INLU
      CPA LSTLU       NOT THE SAME, 
      JMP TELL2 
      LDA TESCR       ON INPUT DEVICE ALSO. 
      JSB CONSL 
       JMP TELL,I   ERROR RETURN
TELL2 ISZ TELL      NORMAL RETURN 
      JMP TELL,I
      SPC 2 
TESCR NOP 
      SPC 2 
* 
*  THE FOLLOWING ROUTINES CALL FMP ROUNTINES: 
*    OPEN, CLOSE, PURGE, AND READF
*  ON ENTRY:
*     A->DCB FOR FILE 
*     B->FILE NAME ARRAY
*  ON EXIT: 
*     A = STATUS
* 
TOPEN NOP 
      STA .DCBO     STORE DCB ADDRESS & FILE NAME ARRAY 
      STB .NAMO       ADDRESS IN OPEN CALL
      JSB OPEN      PERFORM OPEN CALL 
       DEF *+1+6
.DCBO  NOP
       DEF IERR 
.NAMO  NOP
       DEF D3       OPTIONS ALWAYS UPDATE, NON-EXCLUSIVE
      DEF LOSEC 
      DEF LOCRN 
      JMP TOPEN,I 
* 
TCLOS NOP 
      STA .DCBC     STORE DCB ADDRESS IN CLOSE CALL 
      JSB CLOSE     PERFORM CLOSE CALL
       DEF *+1+2
.DCBC  NOP
       DEF IERR 
      JMP TCLOS,I 
* 
TPURG NOP 
      STA .DCBP     SAVE DCB ADDRESS & FILE NAME ARRAY
      STB .NAMP       ADDRESS IN PURGE CALL 
      JSB PURGE     PERFORM PURGE CALL
       DEF *+1+5
.DCBP  NOP
       DEF IERR 
.NAMP  NOP
      DEF LOSEC 
      DEF LOCRN 
      JMP TPURG,I 
* 
TREAD NOP 
      STA .DCBR     SAVE DCB ADDRESS IN READF CALL
      JSB READF     PERFORM READ
       DEF *+1+6
.DCBR  NOP
       DEF IERR 
       DEF BUFFR    LOG INPUT BUFFER (1 RECORD) 
       DEF RECSZ    LOG RECORD SIZE 
       DEF LEN      UNUSED--PLACE HOLDER
       DEF CURNT    RECORD # TO BE READ 
      JMP TREAD,I 
* 
*  ROUTINE TO PRINT OUT REQUEST/REPLY BUFFERS AS SPECIFIED BY PRFLG 
*  ON ENTRY:
*     BUFFR = REQUEST/REPLY BUFFER TO BE LISTED 
* 
PBUF  NOP 
      LDA PRFLG     GET PRINT FLAG
      CPA OFFFG     IS "OFF" BIT SET? 
      JMP PBUF,I      YES--JUST RETURN
      LDA .CML2       NO--PRINT A BLANK LINE
      LDB D1
      JSB LIST
       JMP EXERR
* 
      CLA 
      LDB .BFAD     DO WE HAVE A REQUEST OR REPLY?
      ADB D3
      LDB B,I 
      RBL 
      SSB 
      LDA D2        REPLY--SET UP TO MOVE 2 BLANKS BEFORE EACH
      STA BLKCT       LINE, REQUESTS MOVE 0 BLANKS
      LDA .BLNK     SET UP OUTPUT LINE ADDRESS WITH 
      LDB .CMLN       PROPER INDENTATION
      JSB .MBT
       DEF BLKCT
       NOP
      STB .OUTL 
* 
*  THIS PORTION PRINTS OUT THE HEADER 
* 
      LDA .RQST 
      LDB BLKCT     IS THIS A REQUEST OR REPLY, AGAIN?
      SZB 
      ADA D14         REPLY--GET REPLY HEADER 
      LDB .OUTL       ELSE--ALREADY HAVE REQUEST HEADER 
      JSB .MBT
       DEF D14       PUT INTO OUTPUT LINE 
       NOP
* 
      LDA .TMHD     GET "TIME:" STRING
      JSB .MBT
       DEF D8          AND PUT INTO OUTPUT LINE 
       NOP
      STB .OUTL     SAVE PLACE IN OUTPUT LINE 
      JSB TMVAL     REFORMAT SYSTEM TIME INTO 
       DEF *+1+2      ITS COMPONENTS
       DEF BUFFR+1
       DEF MS 
      JSB .LDY
       DEF D4        SET UP COUNTER FOR CONVERSION
PBUF1 JSB .LAY
       DEF TIMAR     GET NEXT TIME VALUE COMPONENT
      CLE 
      JSB CVTOA       AND CONVERT TO ASCII DECIMAL
      LDB .OUTL     PUT VALUE INTO OUTPUT LINE
      JSB .MBT
       DEF BCNT 
       NOP
      JSB .DSY           END OF TIME VALUE? 
      RSS 
      JMP PBUF2       YES--BRANCH AROUND COLON MOVE 
      LDA .COLN       NO--GET BYTE ADDRESS OF ":" 
      JSB .MBT
       DEF D1            AND PUT IN OUTPUT LINE 
       NOP
      STB .OUTL     SAVE PLACE IN LINE AND REPEAT 
      JMP PBUF1       FOR ALL TIME COMPONENTS 
* 
PBUF2 JSB FBLNK     FILL REST OF LINE WITH BLANKS 
      LDA .CML2     GET OUTPUT LINE WORD ADDRESS
      LDB D37         AND ITS LENGTH
      JSB LIST      THEN PRINT IT 
       JMP EXERR      ERROR RETURN
      LDB .CMLN     RESTORE OUTPUT LINE ADDRESS 
      LDA .BLNK       MAKING SURE OF INDENTATION
      JSB .MBT
       DEF BLKCT
       NOP
      STB .OUTL 
* 
*  THIS PORTION PRINTS OUT THE FIRST 4 WORDS OF THE BUFFER
* 
      LDA BUFFR     LOAD # OF HEADER WORDS
      ADA M4
      SSA           LESS THAN 4?
      JMP PBF14     .YES, JUST DUMP OUT THE BUFFER
      LDA M4        SET UP THE COUNTER FOR THE FIRST
      STA PTEMP       FOR WORDS 
      LDA .TITL     SAVE PLACE IN TITLE LIST
      STA PTEM1 
      LDB .BFAD     SAVE PLACE IN BUFFR 
      ADB D3
      STB PTEM2 
      LDB .OUTL     PUT TITLE IN OUTPUT LINE
PBUF3 JSB .MBT
       DEF D14
       NOP
      STB .OUTL 
      STA PTEM1 
      LDA PTEM2,I   GET NEXT WORD IN BUFFR
      CLE 
      LDB M4        IF ON FIRST WORD, 
      CPB PTEMP 
      CME             CONVERT TO ASCII OCTAL
      JSB CVTOA       ELSE ITS ASCII DECIMAL
      LDB .OUTL     MOVE VALUE INTO OUTPUT LINE 
      JSB .MBT
       DEF BCNT 
       NOP
      LDA M4        IF ON FIRST WORD, 
      CPA PTEMP       GET STREAM TYPE AND ADD TO LINE 
      JMP PBUF5 
* 
PBUF4 JSB FBLNK     FILL REST OF LINE WITH BLANKS 
      LDA .CML2     GET WORD ADDRESS OF OUTPUT LINE 
      LDB D37         AND ITS LENGTH
      JSB LIST      THEN PRINT IT 
       JMP EXERR
      LDB .CMLN     RESTORE .OUTL 
      LDA .BLNK       MAKING SURE OF INDENTATION
      JSB .MBT
       DEF BLKCT
       NOP
      STB .OUTL 
      ISZ PTEM2     UPDATE WORD ADDRESS POINTER 
      LDA PTEM1     GET NEXT TITLE ADDRESS
      ISZ PTEMP     CHECK COUNTER 
      JMP PBUF3       NON-ZERO--MORE TO DO
      JMP PBF14       ZERO--BRANCH TO CHECK FOR ERROR CODE
* 
*  HERE TO ADD STREAM TYPE IN ASCII 
* 
PBUF5 LDA .BLNK     ADD TWO BLANKS TO LINE
      JSB .MBT
       DEF D2 
       NOP
      LDA .LPAR     ADD A LEFT PARENTHESIS
      JSB .MBT
       DEF D1 
       NOP
* 
      LDA PTEM2,I   ISOLATE STREAM TYPE IN STREAM WORD
      AND B77 
      STA PTEM3     SAVE FOR COMPARISONS
      JSB .LDY
       DEF D6        SET UP INDEX 
PBUF6 JSB .LAY
       DEF NUMTB     GET NUMBER FOR COMPARISON
      CPA PTEM3       AND COMPARE 
      JMP PBUF7       FOUND--BRANCH OUT OF LOOP 
      JSB .DSY             DIFFERENT--DECREMENT INDEX 
      JMP PBUF6 
      JMP PBUF8     IF NOT FOUND--IGNORE
* 
PBUF7 JSB .LAY
       DEF NATLN     GET BYTE LENGTH OF STREAM WORD 
      STA BCNT
      JSB .LAY
       DEF CVTAB       AND ITS BYTE ADDRESS 
      JSB .MBT
       DEF BCNT      THEN PUT INTO OUTPUT LINE
       NOP
PBUF8 LDA .RPAR     ADD RIGHT PARENTHESIS 
      JSB .MBT
       DEF D1 
       NOP
      JMP PBUF4       AND BRANCH BACK UP
* 
*  THIS PORTION PRINTS OUT THE REST OF THE BUFFER 
* 
PBF14 LDA PRFLG     CHECK BITS IN PRFLG 
      CPA NORFG     IS NORMAL SET?
      JMP PBF20       YES--BRANCH TO FINISH 
      CPA BUFFG     BUFFER BIT SET? 
      JMP *+4 
      CPA BOTFG     BOTH BIT SET? 
      JMP *+2 
      JMP PBF17         NOT SET--BRANCH TO DATA BIT CHECK 
* 
      LDA BUFFR     LOAD # OF HEADER WORDS
      CMA,INA         = NEG. # OF WORDS LEFT
      STA PTEM1 
      LDA .BFAD     GET NEXT WORD IN BUFFER 
      ADA D3
      STA PTEM2 
* 
      LDA .BTLE     PUT "HEADER:" STRING IN OUTPUT LINE 
      LDB .OUTL 
      JSB .MBT
       DEF D8 
       NOP
      STB .OUTL 
* 
PBF15 JSB PTWDS     PUT NEXT 6 WORDS IN LINE
      JSB FBLNK     FILL REST OF LINE WITH BLANKS 
      LDA .CML2       AND PRINT IT
      LDB D37 
      JSB LIST
       JMP EXERR
* 
      LDB .CMLN     RESET OUTPUT LINE ADDRESS 
      LDA .BLNK       MAKING SURE OF INDENTATION
      JSB .MBT
       DEF BLKCT
       NOP
      STB .OUTL 
      LDA PTEM1     ARE WE THROUGH? 
      SZA,RSS 
      JMP PBF17       YES--BRANCH TO DATA BIT CHECK 
      LDA M4          NO--PUT 8 BLANKS AT BEGINNING OF LINE 
      STA PTEM3 
PBF16 LDA .BLNK 
      JSB .MBT
       DEF D2 
       NOP
      ISZ PTEM3 
      JMP PBF16 
      STB .OUTL       THEN BRANCH BACK UP 
      JMP PBF15 
* 
*  THIS PORTION PRINTS OUT ANY DATA WITH THE BUFFER 
* 
PBF17 LDA PRFLG 
      CPA DATFG     DATA BIT SET? 
      JMP *+4 
      CPA BOTFG     BOTH BIT SET? 
      JMP *+2 
      JMP PBF20       NO--BRANCH TO FINISH
      LDA TTYPE       YES--WAS DATA LOGGED WITH REQUEST/
      ALF,ALF           REPLY BUFFERS?
      SLA,RSS 
      JMP PBUF,I        NO--JUST RETURN 
* 
      LDA .DAAD         YES--GET DATA LENGTH
      LDB A,I         FROM BUFFR AND NEGATE FOR COUNTER 
      LDB A,I 
      CMB,INB 
      STB PTEM1 
      INA           GET ADDRESS OF FIRST DATA WORD
      STA PTEM2 
* 
      LDA .DTLE     PUT "DATA:" STRING IN OUTPUT LINE 
      LDB .OUTL 
      JSB .MBT
       DEF D8 
       NOP
      STB .OUTL 
* 
PBF18 JSB PTWDS     PUT NEXT 6 WORDS IN LINE
      JSB FBLNK     FILL REST OF LINE WITH BLANKS 
      LDA .CML2       AND PRINT IT
      LDB D37 
      JSB LIST
       JMP EXERR
* 
      LDB .CMLN     RESET OUTPUT LINE ADDRESS 
      LDA .BLNK       MAKING SURE OF INDENTATION
      JSB .MBT
       DEF BLKCT
       NOP
      STB .OUTL 
      LDA PTEM1     ARE WE THROUGH? 
      SZA,RSS 
      JMP PBF20       YES--BRANCH TO FINISH 
* 
      LDA M4          NO--PUT 8 BLANKS AT BEGINNING 
      STA PTEM3         OF LINE 
PBF19 LDA .BLNK 
      JSB .MBT
       DEF D2 
       NOP
      ISZ PTEM3 
      JMP PBF19 
      STB .OUTL         THEN BRANCH BACK UP 
      JMP PBF18 
* 
PBF20 LDA .CML2     PRINT A BLANK LINE AT END 
      LDB D1
      JSB LIST
       JMP EXERR
      JMP PBUF,I      THEN RETURN 
      SPC 2 
* 
*  ROUTINE TO TAKE 6 WORDS FROM THE BUFFER OR DATA, TRANSLATE THEM TO 
*  ASCII OCTAL AND PUT THE WORDS IN THE OUTPUT LINE.
*  ON ENTRY:
*     PTEM1 = NEG. # OF WORDS IN BUFFER OR DATA TO BE MOVED 
*     PTEM2 = NEXT WORD IN BUFFER OR DATA 
*     .OUTL->NEXT WORD IN OUTPUT LINE 
* 
PTWDS NOP 
      LDA PTEM1     ANY WORDS TO MOVE?
      SZA,RSS 
      JMP PTWDS,I     NO--JUST RETURN 
      LDA M6          YES--SET COUNTER FOR 6 WORDS
      STA PTEM3 
* 
PTW1  LDA PTEM2,I   GET NEXT WORD 
      CCE 
      JSB CVTOA       AND CONVERT TO ASCII OCTAL
      LDB .OUTL     PUT WORD IN OUTPUT LINE 
      JSB .MBT
       DEF D6 
       NOP
      LDA .BLNK 
      JSB .MBT
       DEF D1          FOLLOW IT BY A BLANK 
       NOP
      STB .OUTL 
* 
      CLA 
      STA BCNT
      ISZ PTEM2 
      ISZ PTEM1     ARE WE OUT OF WORDS?
      RSS 
      JMP PTW2        YES--BRANCH TO ADD ASCII
      ISZ PTEM3     DONE WITH 6 WORDS?
      JMP PTW1        NO--CONTINUE
      JMP PTW5        YES--ADD ASCII
* 
PTW2  ISZ PTEM3     WAS THIS LAST OF 6 WORDS ALSO?
      RSS 
      JMP PTW5        YES--JUST ADD ASCII 
PTW3  LDA D3          NO--PUT BLANKS IN LINE FOR
      CMA,INA           EVERY WORD MISSING
      STA PTEM4 
      LDB .OUTL 
PTW4  LDA .BLNK 
      JSB .MBT
       DEF D2 
       NOP
      ISZ PTEM4 
      JMP PTW4
      LDA .BLNK       AND A BLANK FOLLOWING EVERY WORD
      JSB .MBT
       DEF D1 
       NOP
      STB .OUTL 
      ISZ BCNT      BUMP REPLACED WORD COUNT
      ISZ PTEM3       AND REMAINING WORDS OUT OF 6 COUNT
      JMP PTW3        IF MORE,  CONTINUE
* 
PTW5  LDA .ASTK     PUT AN ASTERISK IN LINE 
      LDB .OUTL 
      JSB .MBT
       DEF D1 
       NOP
      LDA .BLNK       THEN ANOTHER BLANK
      JSB .MBT
       DEF D1 
       NOP
      STB .OUTL 
* 
      LDA BCNT      DETERMINE # OF WORDS OF OCTAL TO MOVE 
      CMA,INA 
      ADA D6
      CMA,INA       MAKE # NEGATIVE & SAVE AS COUNTER 
      STA BCNT
      ADA PTEM2     GET ADDRESS OF FIRST WORD TO MOVE 
      STA PTEM3 
PTW6  CCA           SET FIRST BYTE COUNTER
      STA CNVNM 
      LDA PTEM3,I   GET NEXT WORD 
      AND HIBYT     GET FIRST BYTE
      ALF,ALF       PUT IT INTO FIRST WORD OF REG. A
PTW7  STA CNVAR     SAVE FOR LATER
      ADA BM140     SEE IF IT FALLS WITHIN RANGE OF 
      SSA,RSS         PRINTABLE CHARACTERS
      JMP *+4       TOO LARGE--GET A BLANK
      ADA B100
      SSA,RSS 
      JMP *+3 
      LDA CHARS     TOO SMALL--PICK UP A BLANK
      RSS 
      LDA CNVAR 
      JSB .SBT           PUT BYTE INTO OUTPUT LINE
      ISZ CNVNM     ON FIRST BYTE?
      JMP *+4         NO--BRANCH TO CHECK FOR NEXT WORD 
      LDA PTEM3,I     YES--GET 2ND BYTE IN WORD 
      AND LOWBT         AND DO SAME 
      JMP PTW7
      ISZ PTEM3     BUMP ADDRESS OF WORD IN BUFFER OR DATA
      ISZ BCNT      ANY LEFT? 
      JMP PTW6        YES--CONTINUE 
      STB .OUTL       NO--SET PLACE IN OUTPUT LINE
      JMP PTWDS,I       AND RETURN
      SPC 2 
HEADR ASC 7,REQUEST LOG 
      ASC 7,REPLY LOG 
.RQST DBL HEADR 
.OUTL DBL CMLIN 
TIMHD ASC 4,  TIME: 
.TMHD DBL TIMHD 
TIMAR EQU *-1 
MS    BSS 5 
CNVAR BSS 3 
CNVNM NOP 
.CNAR DBL CNVAR 
BLKCT NOP 
.TITL DBL *+1 
      ASC 7,STREAM WORD:
      ASC 7,SEQUENCE NO.: 
      ASC 7,SOURCE NODE:
      ASC 7,DEST. NODE: 
.BTLE DBL *+1 
      ASC 4,HEADER: 
.DTLE DBL *+1 
      ASC 4,DATA: 
PTEMP EQU MS
PTEM1 EQU MS+1
PTEM2 EQU MS+2
PTEM3 EQU MS+3
PTEM4 EQU MS+4
.LPAR DBL *+2 
.RPAR DBR *+1 
      ASC 1,()
CVTAB NOP 
      DBR NATAB+9 
      DBL NATAB+7 
      DBR NATAB+4 
      DBR NATAB+3 
      DBR NATAB+1 
      DBL NATAB 
D14   DEC 14
D37   DEC 37
B100  OCT 000100
BM140 DEC -96 
* 
      SPC 2 
*  ROUTINE TO FILL REMAINDER OF OUTPUT LINE WITH BLANKS 
*  ON ENTRY:
*     B->NEXT BYTE IN OUTPUT LINE 
*     .CMLN = BYTE ADDRESS OF OUTPUT LINE 
* 
FBLNK NOP 
      LDA .CMLN     GET ADDRESS OF END OF OUTPUT LINE 
      CMA,INA         PLUS 1 IN NEGATIVE BYTES
      ADA M72 
      ADA B         ADD TO CURRENT PLACE IN LINE
      STA FTEMP     = NEG. # OF BLANKS TO MOVE
      SZA,RSS       IF ZERO, WE ARE DONE
      JMP FBLNK,I 
FBLK1 LDA .BLNK     MOVE BLANK TO LINE
      JSB .MBT
       DEF D1 
       NOP
      ISZ FTEMP     DONE? 
      JMP FBLK1       NO--REPEAT
      JMP FBLNK,I     YES--RETURN 
      SPC 2 
FTEMP NOP 
      SPC 2 
* 
*  ROUTINE TO CONVERT AN OCTAL NUMBER TO ASCII DECIMAL OR OCTAL 
*  ON ENTRY:
*     A = VALUE TO CONVERT
*     E = 0, IF DECIMAL CONVERSION
*         1, IF OCTAL CONVERSION
*  ON EXIT: 
*     BCNT = BYTE LENGTH OF ASCII VALUE 
*     A->FIRST BYTE IN ASCII STRING 
* 
*  LEADING ZEROES ARE SUPPRESSED ON DECIMAL CONVERSION BUT NOT ON OCTAL 
*  CONVERSION.
* 
CVTOA NOP 
      STA CNVNM     SAVE VALUE IN CNUMD(O) CALL 
      SEZ           SEE WHICH TYPE OF CONVERSION WANTED 
      JMP CVTA2       OCTAL--BRANCH TO IT 
      SSA 
      CMA,INA       IF NEGATIVE, MAKE IT POSITIVE 
      STA POSIT 
      JSB CNUMD     CALL CNUMD
       DEF *+1+2    RETURN ADDRESS
       DEF POSIT    BINARY NUMBER 
       DEF CNVAR    RETURNED ASCII EQUIVALENT 
      LDA .CNAR     GET BYTE ADDRESS OF CONVERSION ARRAY
      LDB M6        GET BYTE LENGTH 
      STB BCNT        AND SAVE FOR NBLNK CALL 
      JSB NBLNK     FIND FIRST NON-BLANK CHARACTER
       JMP CVTA1      ALL BLANK--SUPPLY A ZERO
       NOP            (SHOULDN'T HAPPEN)
       LDB BCNT       CONVERT CHAR. COUNT TO POSITIVE 
      CMB,INB 
      STB BCNT        AND RETURN
      LDB CNVNM     CHECK NEGATIVE CNVNM
      SSB,RSS       POSITIVE? 
      JMP CVTOA,I   .YES, RETURN
      ADA M1        .NO, ADD MINUS SIGN 
      LDB 0 
      LDA DASH
      JSB .SBT
      LDA 1 
      ADA M1
      ISZ BCNT
      JMP CVTOA,I 
* 
CVTA1 LDB .CNAR     GET LAST BYTE IN CONVERSION ARRAY 
      ADB D5
      LDA .ZERO 
      JSB .MBT
       DEF D1        MAKE IT AN ASCII ZERO
       NOP
      LDA D1        SET BCNT TO 1 
      STA BCNT
      LDA B         GET ADDRESS OF ZERO BYTE
      ADA M1
      JMP CVTOA,I     AND RETURN
* 
CVTA2 JSB CNUMO     CALL CNUMO TO CONVERT TO ASCII OCTAL
       DEF *+1+2    RETURN ADDRESS
       DEF CNVNM    BINARY VALUE
       DEF CNVAR    RETURNED ASCII ARRAY
      LDA .CNAR     GET BYTE ADDRESS OF CONVERSION ARRAY
      LDB M6        SET LENGTH TO -6 BYTES
      STB BCNT
CVTA3 JSB IBLNK     FIND ALL PRECEEDING BLANKS
       JMP CVTA4
       LDB A        AND CHANGE TO ZEROES
      LDA .ZERO 
      JSB .MBT
       DEF D1 
       NOP
      LDA B 
      JMP CVTA3 
CVTA4 LDB D6        SET BCNT TO FULL 6 BYTE NUMBER
      STB BCNT
      LDA .CNAR     GET ARRAY ADDRESS IN BYTES
      JMP CVTOA,I     AND RETURN
      SPC 2 
DASH  ASC 1,--
POSIT NOP 
.ZERO DBL *+4 
.COLN DBR *+3 
.MNUS DBL *+3 
.ASTK DBR *+2 
      ASC 2,0:-*
      SPC 2 
* 
*  HERE ON AN ERROR 
* 
EOCMD LDA .EOF      GET EOF BEFORE EXIT COMMAND MESSAGE 
      LDB D24         AND ITS LENGTH
      JSB TELL      PRINT IT AND
      NOP 
      JMP EXIT1       EXIT W/ SAVE
PLERR LDA .PLER     GET PLOG STILL RUNNING MESSAGE
      LDB D27         AND ITS LENGTH
      JSB TELL      PRINT IT AND TERMINATE
      NOP 
      JMP EXIT2 
TLERR LDA .TLER     GET 'TLOG ALREADY EXISTS MESSAGE
      LDB D27         AND ITS LENGTH
      JSB TELL      PRINT IT AND TERMINATE
       NOP
      JMP EXIT1 
COERR LDA .COER     GET UNSUCCESSFUL COPY MESSAGE 
      LDB D27         AND ITS LENGTH
      JSB TELL      PRINT IT AND TERMINATE
       NOP
      JMP EXIT1 
LUERR EQU * 
      LDA =AIO      DUMMY UP A EXEC ERROR CODE
      LDB =A02
      DST EXER+13 
DEFPR JSB EXEC
       DEF *+5
       DEF NA2
       DEF DEFLU    PRINT ON DEFLU
       DEF EXER 
       DEF D25
       NOP
      JMP EXIT1 
EXERR DST EXER+13      STORE EXEC ERROR CODES 
      LDA .EXER     GET EXEC ERROR MESSAGE
      LDB D25         AND ITS LENGTH
      JSB TELL      PRINT THE CODES AND TERMINATE 
       JMP DEFPR    IF ERROR ON LIST LU, TRY DEFLU
      JMP EXIT1 
LOERR LDA .LOER 
      LDB D18 
      JSB TELL
       NOP
      JMP EXIT1 
* 
*  ROUTINE TO PRINT OUT FILE ERRORS 
*  ON ENTRY:
*     A = ERROR CODE
*     B -> FILE NAME
* 
FIERR CMA,INA       SET ERROR CODE POSITIVE 
      STA TEMP
      LDA B         PUT FILE NAME IN MESSAGE
      LDB .FIER 
      ADB D14 
      JSB .MVW
       DEF D3 
       NOP
      JSB KCVT     CONVERT ERROR CODE TO ASCII
       DEF *+1+1
       DEF TEMP 
      STA FIER+8    SET ERROR CODE IN MESSAGE 
      LDA .FIER     GET ADDRESS OF MESSAGE
      LDB D27         AND ITS LENGTH
      JSB TELL      PRINT IT AND TERMINATE
      NOP 
      JMP EXIT1 
CMERR LDA .PTAB     RESET PARAMETER TABLE ADDRESS 
      STA .NEXT 
      LDA .CMER     GET THE COMMAND ERROR MESSAGE 
      LDB D10         AND ITS LENGTH
      JSB TELL      PRINT IT AND GO GET NEXT COMMAND
      JMP EXERR 
      JMP COMMD 
PMERR LDA .PTAB     RESET PARAMETER TABLE ADDRESS 
      STA .NEXT 
      LDA .PMER     GET PARAMETER ERROR MESSAGE 
      LDB D16         AND ITS LENGTH
      JSB TELL      PRINT IT AND GO GET NEXT COMMAND
      JMP EXERR 
      JMP COMMD 
BAERR LDA .BAMS     GET TOO MANY UNBALANCED MESSAGE 
      LDB D16         AND ITS LENGTH
      JSB TELL      PRINT IT
      CCA 
      STA HALT      SET HALT FLAG 
      JMP BAC1        AND LET FBLCK END BALANCE COMMAND 
      SPC 2 
* 
*  ERROR MESSAGES 
* 
PLER  ASC 27, ** MT LOG AND PLOG STILL RUNNING -- TLOG TERMINATING
.PLER DEF PLER
LOER  ASC 18, ** BAD LOG FILE -- TLOG TERMINATING 
.LOER DEF LOER
EXER  ASC 25, ** EXEC OR DEXEC ERROR:       -- TLOG TERMINATING 
.EXER DEF EXER
FIER  ASC 27, ** FMP ERROR  -   ON FILE:        -- TLOG TERMINATING 
.FIER DEF FIER
CMER  ASC 10, ** ILLEGAL COMMAND
.CMER DEF CMER
TLER  ASC 27, ** TLOG CANNOT CREATE NEEDED FILE -- OLD 'TLOG EXISTS.
.TLER DEF TLER
COER  ASC 27, ** UNABLE TO COPY 'PLOG TO 'TLOG -- TLOG TERMINATING
.COER DEF COER
PMER  ASC 16, ** ILLEGAL OR MISSING PARAMETER 
.PMER DEF PMER
EOFMS ASC 24, ** EOF BEFORE EXIT COMMAND -- EXITING WITH SAVE.
.EOF  DEF EOFMS 
CMMSG ASC 20,         REQUEST/REPLY BUFFERS QUALIFIED 
.CMSG DEF CMMSG 
BAMSG ASC 16, ** OVER 10 UNBALANCED REQUESTS
.BAMS DEF BAMSG 
      SPC 2 
* 
*  TLOG WORK AREAS AND CONSTANTS
* 
D2    DEC 2         DECIMAL CONSTANTS 
D8    DEC 8 
D16   DEC 16
D24   DEC 24
D25   DEC 25
D27   DEC 27
PTAB  BSS 7 
.PTAB DEF PTAB
.NEXT DEF PTAB
PROMT ASC 4,TLOG?  _
PRMT? NOP           INTERACTIVE LU FLAG 
LEN   NOP 
TTYPE NOP           COPY OF #TYPE 
STAT  NOP           STATUS WORD FOR EXEC CALLS
BCNT  NOP           BUFFER COUNT
RQCNT NOP 
SIZE  NOP           BLOCK SIZE OF LOG FILE
RECSZ DEC 96        LOG RECORD SIZE, INITIALLY 96 WORDS 
CURNT NOP           CURRENT RECORD #
LAST  NOP           LAST RECORD # FOR WINDOWS 
WLAST NOP 
HALT  NOP 
.BFAD DEF BUFFR 
.DAAD DEF BUFFR+3+#MXR+#LSZ 
BUFFR BSS 128       LOG BUFFER STORAGE AREA 
      BSS 0 
      END TLOG
                                                                                                                                                                