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