ASMB,R,L,C
      NAM PSMON,3,2 24999-16224 REV. 1902 11-10-78
* 
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.       *
******************************************************************
* 
      SPC 1 
* 
*    NAME:   PSMON
*    SOURCE: 24999-18224
*    RELOC:  24999-16224
*    PGMR:   LYLE WEIMAN NOV 1978 
* 
*     PURPOSE:  PROVIDES "PASSIVE MONITOR" CAPABILITY FOR DS/1000 
*     HARDWIRE LINKS. 
* 
*     REQUIREMENTS: 
* 
*     1) SEPARATE COMPUTER
* 
*     2) TWO HP 12665 INTERFACE CARDS (IN ADDITION TO 
*        THOSE USED TO CONNECT THE COMPUTER TO A DS/1000
*        NETWORK, IF ANY) 
* 
*     3) CONNECTING CABLES MODIFIED FOR PASSIVE MONITORING. 
* 
*     4) AN RTE OPERATING SYSTEM (MAY BE RTE-M) 
*        WITH DS/1000 SOFTWARE GENERATED IN.
* 
* 
* 
*     TO USE: 
* 
*     1) INSTALL TWO INTERFACE CARDS IN THE COMPUTER AND HOOK THEM UP TO
*        THE LINE TO BE TRACED WITH A CABLE MODIFIED TO PROVIDE PASSIVE 
*        MONITORING.
* 
*     2) EDIT THE SOURCE, SPECIFYING THE SELECT CODES FOR THE TWO 
*        INTERFACE CARDS AS THE DEFINITIONS FOR "XMTIF" AND "RCVIF".
*        ALL DATA TAKEN FROM THE INTERFACE IN THE "XMTIF" SELECT CODE 
*        WILL BE CONSIDERED AS "TRANSMIT" DATA.  ALL DATA FROM THE
*        "RCVIF" SELECT CODE WILL BE CONSIDERED AS "RECEIVE" DATA.
*        BE SURE TO WRITE DOWN WHICH IS WHICH SO YOU CAN DETERMINE
*        DATA DIRECTION FROM THE PRINTOUT.
* 
*     3) RE-ASSEMBLE THE SOURCE AND LOAD THE PROGRAM IN THE COMPUTER
*        TO BE USED FOR MONITORING. 
* 
*     4) SCHEDULE THE PROGRAM:
* 
*     *ON,PSMON,[LUTTY[,LUPRIN[,NODE#[,MODE[,#POINTS]]]]] 
* 
*     LUTTY = LU OF OPERATOR CONSOLE(MUST BE CAPABLE OF INPUT & OUTPUT) 
*             AT LOCAL NODE.
*             USED FOR DIALOG AND ERROR MESSAGES. 
*             DEFAULT IS YOUR TERMINAL (MTM ENVIRONMENT), ELSE 1
* 
*       NOTE: SPECIAL FEATURES ARE INVOKED IF THE TERMINAL IS DRIVEN
*       USING DVR05 OR DVR07: 
* 
*        1) EACH LINE WHICH IS 'RECEIVED' (AS OPPOSED TO 'TRANSMITTED') IS
*           DISPLAYED IN INVERSE VIDEO. 
* 
*        2) ABNORMAL PROTOCOL INDICATIONS ('RLM', 'RLW', 'STOP') ARE
*           HIGHLIGHTED: 'RLM' & 'RLW' ARE UNDERLINED, 'STOP' IS SHOWN
*           BLINKING.  REQUIRES OPTIONAL MODULES SUPPORTING THESE 
*           FUNCTIONS BE INSTALLED IN THE 264X TERMINAL USED. 
* 
* 
*     LUPRIN= LU FOR PRINTING TRACE TABLE IF NOT THE SAME AS <LUTTY>
*             AT REMOTE OR LOCAL NODE.
*               USEFUL WHEN HARDCOPY LOG IS DESIRED.
*               DEFAULT IS LUTTY. 
* 
*               NOTE: IF LUPRIN = 2, THEN ALL TRACE RECORDS WILL BE 
*               RECORDED IN THEIR "RAW" FORM, EITHER ON A DISC FILE 
*               OR A REMOTE DEVICE, SUCH AS A TAPE.  THE PROGRAM WILL 
*               ASK FOR THE FILE <NAMR> PARAMETERS;  ENTER THE NAME 
*               OF THE FILE, SECURITY CODE, ETC., OR THE LU OF THE
*               REMOTE DEVICE.  WHEN OUTPUTTING RAW DATA TO A DISC FILE,
*               THE FILE IS NORMALLY ASSUMED TO BE CIRCULAR:
*               OLD INFORMATION IS OVERWRITTEN BY NEW, THE
*               NUMBER OF "FRESH" TRACE RECORDS BEING DETERMINED BY 
*               THE SIZE OF THE FILE. 
*               WHEN OUTPUTTING TO A REMOTE DEVICE, SUCH AS A MAG 
*               TAPE, ALL DATA IS RECORDED. 
* 
* 
*               SYNTAX IS:   FILNAM : SC : CR : :# RECORDS FOR FILE 
*                            OR 
*                           <LOGICAL UNIT NUMBER> 
* 
*               TO OBTAIN A FORMATTED PRINTOUT OF THIS INFORMATION, 
*               SIMPLY SET THE 'BREAK' FLAG SO THE PROGRAM WILL 
*               CLOSE THE FILE, THEN RE-RUN IT, SPECIFYING THE FILE 
*               NAME OR DEVICE LU IN RESPONSE TO THE QUESTION,
*               "FILE <NAMR> OR DEVICE TO GET 'TRACE' DATA?"
* 
*                   NOTE: IF DISC FILES ARE NOT GOING TO BE USED, YOU 
*                   DO NOT NEED TO LOAD THE PROGRAM WITH THE FMP ROUTINES 
*                   (CREAT, OPEN, CLOSE, READF, ETC.), AND MAY
*                   IGNORE THESE UNDEFINED SYMBOLS AT LOAD TIME.
* 
* 
* 
*     <NODE#> = REMOTE NODE NUMBER FOR PRINTOUT (ALLOWS YOU TO USE
*               A COMPUTER WITHOUT AN OUTPUT DEVICE OF ITS OWN).
*               DEFAULT IS LOCAL NODE.
*               IF LUPRIN = 2 THEN DATA LOGGING IS DONE LOCALLY, AND
*               THIS PARAMETER HAS NO EFFECT. 
* 
*     <MODE> : BIT MASK 
*      BITS 0 :  NOT USED 
*           1=0:(DEFAULT) CAUSES PRINTOUT OR LOGGING OF ALL DATA
*                GATHERED.
* 
*            =1: CAUSES PROGRAM TO IGNORE ALL DATA BUFFERS WHICH
*                CONTAIN NO ABNORMAL PROTOCOL WORDS.
*                ('STOP', 'RLM', 'RLW') 
* 
* 
*     BIT 2:  USED ONLY WHEN 'TRACE' DATA IS BEING LOGGED TO A DISC FILE. 
*         = 0 CAUSES PROGRAM TO REWIND FILE AUTOMATICALLY WHEN LAST RECORD
*             HAS BEEN WRITTEN.  NEW DATA OVERLAYS OLD.  THE MESSAGE
*             "/PSMON:REWINDING FILE"  IS PRINTED AFTER THE FIRST TIME
*             TO INFORM YOU THAT THE DATA IN THE FILE IS NOW VALID. 
* 
*         = 1 CAUSES PROGRAM TO TERMINATE AS SOON AS THE LAST RECORD HAS
*             BEEN WRITTEN (ACTUALLY, WHEN THE ATTEMPT IS MADE TO WRITE 
*             THE NEXT ONE AFTER THAT).  THE FILE IS CLOSED AND THE 
*             TERMINATION MESSAGE IS PRINTED. 
* 
*     <#POINTS> = NUMBER OF DATA POINTS TO LOG.  MAXIMUM ALLOWABLE VALUE, 
*                 AND ALSO THE DEFAULT, IS 2048 POINTS. 
* 
* 
*     5) THE PROGRAM WILL WAIT FOR ACTIVITY ON THE COMMUNICATION LINK 
*        WITH THE INTERRUPT SYSTEM OFF.  USE 'REMAT' TO CREATE SUCH 
*        ACTIVITY.  IT IS ADVISABLE TO USE A TRANSFER FILE CONTAINING 
*        A LARGE NUMBER OF "TI" COMMANDS FOR THE SIMPLE REASON THAT 
*        THE DATA WILL BE FAR TOO VOLUMINOUS OTHERWISE. 
* 
*     AT ANY TIME, YOU MAY BRING IT OUT OF ITS "WAITING FOR DATA" LOOP
*     BY SETTING THE SIGN BIT IN THE SWITCH REGISTER.  FOR YOUR OWN 
*     INFORMATION, THE PROGRAM DISPLAYS ITS INTERNAL "PSEUDO-CLOCK" 
*     IN BITS 14 THRU 0 OF THE SWITCH REGISTER WHILE IT IS WAITING. 
* 
      SKP 
**************************************************************************
*       CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS    *
*       CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS  CAVEATS    *
*                                                                        *
*     WHEN GATHERING "LIVE" DATA (I.E., NOT TAKING DATA FROM A DISC      *
*     FILE), THIS PROGRAM TURNS NORMAL RTE INTERRUPT PROCESSING OFF!!    *
*                                                                        *
*     THIS MEANS THAT THE SYSTEM TIME-KEEPING AND OTHER REAL-TIME        *
*     ACTIVITIES CEASE DURING THIS PERIOD.  YOU **MUST** BE SURE THAT    *
*     NO OTHER CRITICAL ACTIVITIES EXIST BEFORE USING THIS PROGRAM,      *
*     AND YOU MAY WISH TO RE-SET THE SYSTEM TIME-OF-DAY AFTERWARDS       *
*     (BE SURE TO RE-SCHEDULE ALL PROGRAMS IN THE TIME LIST WHOSE        *
*     "TIME OF NEXT SCHEDULE" HAS BEEN PASSED OVER.  YOU CAN             *
*     FIND OUT WHICH ONES THESE ARE FROM A 'WHZAT' PRINTOUT).            *
*                                                                        *
*     DURING THE PRINTOUT PHASE, NORMAL RTE INTERRUPT PROCESSING IS      *
*     RESTORED AND THE SYSTEM BECOMES AN RTE AGAIN.                      *
*                                                                        *
**************************************************************************
      SKP 
*       YOU WILL BE ASKED TO SPECIFY THE DATA SOURCE.  ACCEPTABLE 
*       RESPONSES ARE:
* 
*     1) FILE <NAMR> ---THE NAME OF A DATA FILE IN WHICH DATA WAS LOGGED
*        DURING SOME PREVIOUS RUN.  THE CARTRIDGE REFERENCE NUMBER
*        AND SECURITY CODE MAY BE SPECIFIED IN THE USUAL WAY. 
* 
*     2) THE LOGICAL UNIT OF SOME DEVICE, TYPICALLY A 
*        MAG TAPE OR MINI-CARTRIDGE, ON WHICH DATA WAS LOGGED 
*        DURING SOME PREVIOUS RUN.  THE PROGRAM WILL CONTINUE 
*        TO READ UNTIL AN EOF OR EOT CONDITION OR SOME
*        OTHER MAG TAPE-RELATED ERROR CONDITION IS SET. 
* 
*     3) BLANKS--THE PROGRAM WILL TAKE DATA "LIVE", I.E., DIRECTLY
*        FROM THE PASSIVE-MONITOR INTERFACE CARDS.
* 
* 
*       TO TERMINATE THIS PROGRAM WHILE IT IS PRINTING, SET THE "BREAK" 
*       FLAG.  TO TERMINATE IT WHILE IT IS GATHERING DATA (NON-PRIVILEGED 
*       INTERRUPTS ARE OFF), SET THE SIGN BIT IN THE SWITCH REGISTER. 
* 
* 
* 
*       THE PRINT FORMAT SHOWN BELOW IS ACTUALLY REPEATED TWICE PER LINE: 
* 
*     <D> <P> <OOOOOO> <PSEUDO-"CLOCK" NUMBER>
* 
*               WHERE<D>= 'X' IF WORD WAS TRANSMITTED 
*                    <D>= 'R' IF WORD WAS RECEIVED. 
* 
*                  <P> =  MNEMONIC IF DATA WORD MATCHES ONE OF THE
*                         PROTOCOL WORDS.  NOTE: SINCE DATA IS
*                         TRANSMITTED TRANSPARENTLY OVER THESE LINKS, 
*                         OCCASIONAL "MATCHES" TO PROTOCOL WORDS MAY
*                         APPEAR.  YOU WILL HAVE TO STUDY THE 
*                         ACTIVITY SURROUNDING THE "MATCH" TO DETERMINE 
*                         IF IT IS, INDEED, VALID.
*                         MNEMONICS:
*                            RC   TNW  RLM  RLW  STOP 
*                         IF NOT A MATCH TO ABOVE, THEN BLANKS ARE USED.
* 
*                  <OOOOOO> = PROTOCOL WORD IN OCTAL. 
* 
*           <PSEUDO-"CLOCK" NUMBER> = A PSEUDO-"CLOCK" NUMBER WHICH IS
*                            INCREMENTED AFTER CHECKING THE TWO INTERFACE 
*                            CARDS FOR DATA.
*                               THIS PROVIDES SOME INDICATION OF ELAPSED
*                               TIME. 
*                               EACH TICK REPRESENTS ABOUT TWENTY 
*                               MICROSECONDS OR SO, DEPENDING ON WHETHER
*                               DATA WAS AVAILABLE IN THIS "PASS" FOR 
*                               THE "RECEIVE" OR "TRANSMIT" PATH OR BOTH. 
* 
* 
*     NOTE: TO ANALYZE ANY PARTICULAR SEQUENCE, ONE MUST BE FAMILIAR WITH 
*     THE LINE PROTOCOL (SEE NETWORK MANAGER'S MANUAL FOR DETAILS). 
* 
*       TO CHANGE THE SIZE OF THE TRACE BUFFER, CHANGE '.SIZE'. 
*       IT MUST BE A POWER OF TWO.
      SKP 
* 
* 
*     THE "TRACE" BUFFER FORMAT IS: 
* 
*        BUFFER:  1ST DATA WORD OBSERVED
*        BUFFER+1:  <X/R><CLOCK>
*        BUFFER+2:2ND DATA WORD OBSERVED
*          "    3:  <X/R><CLOCK>
*         .            .
*             ETC.
* 
*     <X/R> = "TRANSMIT" LINE OR "RECEIVE" LINE FLAG, 
*             CODED 0/1, AND STORED IN BIT 15.
*     <CLOCK> = 15-BIT UNSIGNED INTEGER PSEUDO-"CLOCK" VALUE
*              REPRESENTING THE TIME AT WHICH THE DATA WAS AVAILABLE. 
* 
RCVIF EQU 16B       "RECEIVE" LINE INTERFACE SELECT CODE
XMTIF EQU 17B       "TRANSMIT" LINE INTERFACE SELECT CODE 
* 
      EXT $LIBR,$LIBX,EXEC,CNUMD,CNUMO
      EXT CREAT,OPEN,CLOSE,READF,WRITF,RWNDF
      EXT EXEC,POSNT,KCVT 
        EXT NAMR
        EXT IFBRK 
        EXT RMPAR,DEXEC 
        SUP 
      SKP 
PSMON EQU *         PRIMARY ENTRY POINT 
      JSB RMPAR 
      DEF *+2 
      DEF PRAMS 
      CLB           CLEAR FLAGS AND COUNTERS
      STB NPASS       PASS COUNTER
      STB INFIL       DATA TO BE OBTAINED "LIVE"
      STB RWFLG       HAVEN'T PRINTED "REWIND" MESSAGE
      STB WRFIL       NOT LOGGING DATA INTO A FILE
      STB INLUF       WE'RE NOT INPUTTING FROM AN LU
      STB DCB       WE HAVE NO FILES OPEN.
* 
      JSB RESET     SET UP ALL BUFFER POINTERS
      LDA LUTTY     IS A CONSOLE
      SZA,RSS         LU SPECIFIED? 
      CLA,INA       NO, DEFAULT TO 1
      IOR =B400     SET "ECHO" BIT FOR INPUT
      STA LUTTY 
      LDA NODE#     LOAD NODE NUMBER
      SZA,RSS       ZERO? 
      CCA           YES, DEFAULT TO LOCAL 
      STA NODE# 
      LDA NPTS      LOAD # POINTS 
      AND =B77776   MUST BE EVEN NUMBER!
      CMA,INA 
      SSA,RSS       POSITIVE NUMBER GIVEN?
      LDA MDFLT     NO, LOAD MAXIMUM
      CMA,INA       MAKE POSITIVE AGAIN 
      STA TRACZ     SAVE 'TRACE' BUFFER SIZE
      ADA MDFLT     MAKE SURE IT'S
      CMA,INA 
      SSA,RSS          <= MAXIMUM 
      JMP PSM1
      LDA MDFLT     SET MAXIMUM.
      CMA,INA 
      STA TRACZ 
PSM1  EQU * 
      LDA TRACZ     WHEN DATA IS LOGGED, A 5-WORD TIME-OF 
      ADA D5          DAY IS INCLUDED.
      STA FWSIZ 
      LDA LUPRN     IS A PRINTOUT LU
      SZA,RSS         SPECIFIED?
      LDA LUTTY     NO, DEFAULT TO LUTTY
      CPA D2        FILE? 
      JMP GFILE     GET FILE NAME 
      IOR B200      SET "HONESTY MODE" BIT
      STA LUPRN 
      SPC 2 
* 
      JSB PRINT     PRINT HEADER
      DEF HED1
      DEF HED1L 
* 
TRCC2 EQU * 
      JSB EXEC      "DATA SOURCE: <NAMR>, LU OR BLANKS
      DEF *+5         TO TAKE 'LIVE' DATA?" 
      DEF D2
      DEF LUTTY 
      DEF MSG1
      DEF MSG1L 
      JSB EXEC      ASK FOR RESPONSE
      DEF *+5 
      DEF D1
      DEF LUTTY 
@BUFR DEF BUFFR 
      DEF M20 
      STB NCHAR 
      CLA,INA 
      STA NCNTR 
      JSB NAMR        PARSE RESPONSE
      DEF *+5 
      DEF PBUFR 
      DEF BUFFR 
      DEF NCHAR 
      DEF NCNTR 
      SSA           ANY INPUT?
      JMP EXIT      NONE.  TERMINATE. 
      LDA PBUFR+3   GET TYPE CODE FOR RESPONSE. 
      AND D3
      SZA,RSS       DEFAULT?
      JMP TRC.3     YES 
      CPA D1        NUMERIC?
      JMP MTAPE     YES, GO SET UP TO INPUT FROM A DEVICE.
      CPA D3        ASCII?
      JMP MFILE     YES.
      JMP BAD1      INVALID INPUT 
* 
TRC.3 EQU * 
      SKP 
TRC.4 EQU * 
*                   SET A FLAG DEPENDING UPON PRINTOUT LU TYPE
* 
      JSB DVTYP     DETERMINE TYPE OF PRINT DEVICE
      DEF LUPRN 
      CLA,RSS       RETURN HERE: IT'S NOT DV.05 OR DV.07
      CCA           RETURN HERE: IT'S DV.05 OR DV.07
      STA DVFLG     SAVE THE FLAG 
      SPC 2 
REDTA EQU * 
      JSB IFBRK     CHECK OUR "BREAK" FLAG
      DEF *+1 
      SSA           SET?
      JMP EXIT      YES, EXIT 
      CLB           CLEAR ABNORMAL PROTOCOL 
      STB NRLM       WORD COUNTERS FOR THIS 
      STB NRLW       PASS.
      STB NSTOP 
      STB NRC 
      STB NPRNT     CLEAR # HALF-PRINT LINES CNTR 
* 
      JSB DEXEC     OBTAIN REMOTE-SYSTEM TIME-OF-DAY
      DEF *+4 
      DEF NODE# 
      DEF TMCOD 
      DEF TOD 
      NOP 
* 
*                   READ NEXT "TRACE" RECORD
* 
      LDA INLUF     ARE WE TO GET DATA FROM A TAPE? 
      SZA 
      JMP REDLU     YES 
* 
      LDA INFIL     ARE WE GETTING DATA 
      SSA,RSS         FROM A FILE?
      JMP TRC.6     NO, GET IT "LIVE" 
* 
*     READ DATA FROM THE DISC FILE
* 
      LDA FREC      GET RECORD NUMBER 
      CMA,INA 
      ADA LREC
      SSA           ALREADY GOTTEN ALL DESIRED RECORDS? 
      JMP EXIT      YES 
      ISZ FREC      BUMP RECORD COUNTER 
      NOP 
      JSB READF     READ "TRACE" BUFFER 
      DEF *+6 
      DEF DCB 
      DEF ERR 
@TOD  DEF TOD       TIME-OF-DAY IMMEDIATELY PRECEDES DATA 
      DEF FWSIZ        BUFFER 
      DEF LEN 
* 
      LDA LEN       SET # OBSERVATIONS COUNTER
      ADA M5        SUBTRACT 5 FOR TIME-OF-DAY
      STA NOBSV 
      LDA ERR       CHECK FOR ERRORS
      SSA,RSS         ERROR?
      JMP RED.1     NO, GO ON 
      CPA M12       EOF?
      JMP EXIT      YES, WE'RE DONE.
      JMP FIERR     NO, PRINT THE ERROR & TERMINATE.
* 
*     HERE TO READ DATA FROM TAPE 
* 
REDLU EQU * 
      LDA M5        INITIALIZE # OBSERVATIONS COUNTER 
      STA NOBSV       (LESS 5 WORDS FOR TIME-OF-DAY)
      LDA FWSIZ     INITIALIZE # WORDS TO MOVE
      STA TEMP
      LDA @TOD      INITIALIZE DATA POINTER 
      STA ..RD
      LDA D512
      STA LENGH 
* 
RDLUP EQU * 
      JSB DEXEC 
      DEF *+6 
      DEF NODE# 
      DEF RDCOD 
      DEF INLUF     REMOTE LU 
..RD  NOP           BUFFER POINTER
      DEF LENGH 
      NOP           --IGNORE ERRORS --
      ADB NOBSV     UPDATE # DATA WORDS CNTR
      STB NOBSV 
      AND =B273     MASK EOF/EOT/ERROR BITS 
      SZA           EOF OR EOT OR ERROR?
      JMP EXIT      YES, MUST QUIT NOW. 
      LDA ..RD      UPDATE BUFFER POINTER 
      ADA D512
      STA ..RD
      LDA TEMP
      CMA,INA 
      ADA D512
      SSA,RSS       ALL DATA READ?
      JMP RED.1     YES, RESUME MAIN FLOW 
      LDB D512      COMPUTE MINIMUM OF NEW REMAINDER &
      ADB A           512 
      CMA,INA       MAKE NEW REMAINDER POSITIVE 
      STA TEMP
      SSB,RSS       IS THERE LESS THAN 512 WORDS LEFT TO GO?
      STB LENGH     YES.
      JMP RDLUP     STAY IN LOOP TILL ALL DATA READ 
* 
RED.1 EQU * 
      LDA DVFLG     IS THIS PRINT DEVICE
      SSA,RSS          A TERMINAL?
      JMP TRC.7     NO, DON'T DELAY 
* 
*     GIVE USER A CHANCE TO READ THE PREVIOUS SCREEN FULL 
*     OF OUTPUT BY DELAYING FOR TWO SECONDS.
* 
      JSB EXEC
      DEF *+6 
      DEF D12 
      DEF D0
      DEF D2          SUSPEND FOR 
      DEF D0
      DEF M2           TWO SECONDS
      JMP TRC.7     NOW GO FORMAT DATA
* 
*     READ DATA DIRECTLY FROM THE "TRACE" BUFFER
*      (I.E., GET IT "LIVE")
* 
TRC.6 EQU * 
      LDA @BUFR     INITIALIZE POINTERS 
      STA PNTR
      ADA TRACZ     COMPUTE ADDRESS OF END OF BUFFER
      STA LAST
      CLB           CLEAR 
      STB CLOCK     THE PSEUDO-CLOCK
      OTB 1         CLEAR SWITCH REGISTER 
* 
      JSB $LIBR     SHUT OFF NORMAL INTERRUPTS PROCESSING 
      NOP             AND MEMORY-PROTECT
      LIA XMTIF     CLEAR CARD BY READING IT
      LIA RCVIF       " 
      CLC RCVIF,C   CLEAR INTERFACE CARDS BEFORE
      CLC XMTIF,C     BEGINNING 
* 
LOOPX EQU *         MAIN DATA LOOP
      SFS RCVIF     DOES "RECEIVE" INTERFACE HAVE DATA? 
      JMP XM1       NO, SEE IF "TRANSMIT" INTERFACE DOES. 
      LIA RCVIF     YES, LOAD DATA
      STA PNTR,I    STORE IN BUFFER 
      ISZ PNTR     BUMP POINTER 
      LDA CLOCK     LOAD THE "CLOCK" WORD 
      IOR =B100000  SET "RECEIVE" INDICATOR 
      STA PNTR,I    STORE IN BUFFER 
      ISZ PNTR     BUMP POINTER 
* 
XM1   EQU * 
      SFS XMTIF     DOES "TRANSMIT" INTERFACE HAVE DATA?
      JMP CNTR1     NO
      LIA XMTIF     LOAD DATA 
      STA PNTR,I    STORE POINTER 
      ISZ PNTR     BUMP POINTER 
      LDA CLOCK     LOAD PSEUDO-CLOCK 
      STA PNTR,I   STORE
      ISZ PNTR     BUMP POINTER 
* 
CNTR1 EQU * 
      LDA LAST      BUFFER
      CMA,INA 
      ADA PNTR
      SSA,RSS         FILLED? 
      JMP FORM1     YES-- 
*     BUFFERS NOT FILLED. 
*     UPDATE PSEUDO "CLOCK" 
* 
      CLA           THIS LOOP USED TO SLOW DOWN THE "CLOCK".
      INA           ADJUST THE REPETITION COUNTER FOR PARTICULAR
      CPA SCALE     LINK SPEED USED (LARGER NUMBERS FOR SLOWER LINKS) 
      RSS 
      JMP *-3 
      LDA CLOCK 
      INA 
      SSA           SIGN BIT SET? 
      CLA           YES, RESET CLOCK
      STA CLOCK 
      LIB 1         LOAD SWITCH REGISTER
      OTA 1         UPDATE SWITCH REGISTER
      SSB,RSS       SIGN BIT SET? 
      JMP LOOPX 
      SKP 
*     HERE TO PRINT INFORMATION "TRACED" SO FAR 
* 
FORM1 EQU * 
      LIA XMTIF     CLEAR CARDS 
      LIA RCVIF 
      CLC XMTIF,C   CLEAR BOTH INTERFACE CARDS
      CLC RCVIF,C 
      JSB $LIBX     RESTORE NORMAL RTE PROCESSING 
      DEF *+1 
      DEF *+1 
      SSB           WAS SIGN BIT SET IN SWITCH REGISTER?
      JMP EXIT      YES--MUST STOP NOW
      SPC 2 
      LDA @BUFR     CALCULATE 
      CMA,INA         NUMBER
      ADA PNTR         OF 
      STA NOBSV          POINTS LOGGED
* 
*     HERE WHEN "TRACE" DATA BUFFER IS AVAILABLE. 
* 
TRC.7 EQU * 
      ISZ NPASS     BUMP PASS NUMBER
      NOP 
      LDA NOBSV     NOW CONVERT THIS TO ACTUAL
      CLB            NUMBER OF DATA WORDS OBSERVED
      DIV NTENT 
      STA NOBSV 
      JSB CKDTA     CHECK DATA FOR ABNORMAL PROTOCOL WORDS
      JSB SUBTL     PRINT THE # RCS, STOPS, ETC.
      LDA MODE      ARE WE TO IGNORE
      RAR             BUFFERS CONTAINING NO ABNORMAL
      SLA,RSS         DATA WORDS? 
      JMP TRC.8     NO, DO IT ANYWAY. 
      LDA NRLM      WERE THERE ANY RLM'S? 
      ADA NRLW        OR RLW'S
      ADA NSTOP       OR STOP'S 
      SZA,RSS         ??? 
      JMP REDTA     NO, SKIP THIS ONE.
* 
TRC.8 EQU * 
      LDA WRFIL     ARE WE LOGGING DATA?
      SZA 
      JMP TRC.9     YES, SKIP TITLES & STUFF
      JSB PBLNK     PRINT A BLANK LINE
* 
      JSB CNUMD     CONVERT # LOGGED DATA WORDS 
      DEF *+3 
      DEF NOBSV 
      DEF .NRC. 
      JSB DEXEC 
      DEF *+6 
      DEF NODE# 
      DEF WRCOD     "WRITE" CODE, NO ABORT
      DEF LUPRN 
      DEF TITL1 
      DEF TTL1L 
      NOP 
      JSB DEXEC 
      DEF *+6 
      DEF NODE# 
      DEF WRCOD 
      DEF LUPRN 
      DEF TITL2 
      DEF TTL2L 
      NOP 
      JSB DEXEC 
      DEF *+6 
      DEF NODE# 
      DEF WRCOD 
      DEF LUPRN 
      DEF TITL3 
      DEF TTL3L 
      NOP 
* 
* 
* 
      JSB PBLNK     PRINT BLANK LINE
      JSB CNUMD     CONVERT PASS NUMBER 
      DEF *+3 
      DEF NPASS 
      DEF HED4. 
      SPC 2 
*     WE WILL CONVERT SAMPLING TIME TO ASCII & SO IT CAN BE PRINTED 
*     WITH THE PASS NUMBER.  SINCE THE 'TRACE' INFORMATION MAY HAVE COME
*     FROM A DISC FILE, CONVERT ONLY THE TIME INFORMATION WHICH IS
*     SIGNIFICANT: HOUR,MINUTES, SECONDS.  NOTE ALSO THAT THE 
*     TIME-OF-DAY RETURNED  COMES BACK
*     IN INCREASING ORDER OF SIGNIFICANCE, BUT TIME-OF-DAY IS 
*     USUALLY PRINTED IN DESCENDING ORDER OF SIGNIFICANCE.  THEREFORE,
*     THE POINTER TO THE TIME-OF-DAY INTEGERS IS DECREMENTED EACH 
*     PASS THROUGH THE LOOP.
* 
*     SET UP CONVERSION LOOP
      LDA M4         CONVERT 4 ITEMS
      STA CNTR
      LDA @TOD       SET UP TIME-OF-DAY POINTER TO
      ADA D3            "HOURS" WORD
      STA TRLP. 
      LDA @HD4.      SET UP ASCII 
      STA TEMP          BUFFER POINTER
* 
TRLUP EQU * 
      JSB KCVT      CONVERT INTEGER TO ASCII
      DEF *+2 
TRLP. NOP           DEF TO TIME-OF-DAY STORED HERE
      STA TEMP,I    STORE TWO-CHAR ASCII HERE 
      CCA           ADVANCE TIME-OF-DAY POINTER TO
      ADA TRLP.       NEXT MOST SIGNIFICANT 
      STA TRLP.          ITEM.
      ISZ TEMP      BUMP POINTER TO ASCII STORAGE AREA
      LDA COLON     STORE A COLON TO SEPARATE DATA ITEMS
      STA TEMP,I
      ISZ TEMP
      ISZ CNTR      FINISHED LOOP?
      JMP TRLUP     NOT YET.
*     AT END OF LOOP, SUFFIX THE CENTOSECONDS WITH A "0"
*     SO IT APPEARS TO BE MILLISECONDS. 
      CCA 
      ADA TEMP
      LDB ASC0
      STB A,I 
* 
      JSB PRINT 
      DEF HED4
      DEF HED4L 
* 
      LDA @BUFR     LOAD ADDRESS OF TRACE BUFFER
      STA PNTR
      LDA NOBSV     INITIALIZE LOOP 
      CMA,INA          COUNTER
      SZA,RSS 
      JMP REDTA 
      STA CNTR
LOOP  EQU * 
      JSB IFBRK     CHECK "BREAK" FLAG AGAIN
      DEF *+1 
      SSA           SHALL WE QUIT?
      JMP EXIT      YES.
* 
*     NOTE: WE WILL WANT TO SET UP THE VIDEO ENHANCEMENTS ACCORDING 
*     TO THE TYPE OF PROTOCOL WORD.  IT WILL BE INVERSE VIDEO IF RECEIVED,
*     OTHERWISE BLACK VIDEO.  IT WILL BE FLASHING IF AN ABNORMAL PROTOCOL 
*     WORD (RLM,RLW,STOP).
*     THESE MUST BE SET UP IN COMBINATION.
* 
      LDA @BVDO     LOAD ADDRESS OF "BLACK VIDEO" 
      LDB @PBF0     LOAD DESTINATION ADDRESS
      MVW D2        MOVE SET-UP WORDS 
* 
      LDB PNTR,I    GET DATA WORD FROM TRACE ENTRY
      LDA B 
      JSB CASCI     CHECK FOR VALID ASCII 
      STA PBUF+9
      CPB STOP      IS IT 'STOP'? 
      JMP .STOP     YES, LOAD ADDRESS FOR "STOP"
      CPB RC        IS IT 'REQUEST COMING'? 
      JMP .RC       YES, LOAD ADDRESS OF "RC" 
      CPB TNW       IS IT 'TRANSMIT NEXT WORD'? 
      JMP .TNW      YES, LOAD ADDRESS OF "TNW"
      CPB RLW       IS IT 'RE-TRANSMIT LAST WORD'?
      JMP .RLW      YES, LOAD ADDRESS OF "RLW"
      CPB RLM       IS IT 'RE-TRANSMIT LAST MESSAGE'? 
      JMP .RLM      YES, LOAD ADDRESS OF "RLM"
      LDA @UNKN     OTHERWISE, IT'S UNKNOWN...
      JMP SET..     LOAD BLANKS--IT'S NOT RECOGNIZED
      SPC 2 
.RC   LDA @RC 
      RSS 
.TNW  LDA @TNW
      JMP SET.. 
.STOP LDA @STOP 
      RSS           LOAD ADDRESS OF "FLASHING"
.RLM  LDA @RLM      LOAD ADDRESS OF 'RLM' 
      JMP .FLSH     GO LOAD ADDRESS OF "FLASHING" 
.RLW  LDA @RLW
.FLSH ISZ PBUF0+1   MODIFY VIDEO SET-UP TO INCLUDE "BLINKING" 
SET.. EQU * 
      LDB WRFIL     LOGGING DATA TO 
      SZB              A FILE?
      JMP PR..4     YES, SKIP THE FORMATTING JUNK...
      LDB @PBUF     LOAD DESTINATION ADDRESS
      ADB D2        SKIP OVER FIRST 4 CHARACTERS (FILLED LATER) 
      MVW D2        MOVE TO PRINT BUFFER
      JSB CNUMO     CONVERT DATA TO OCTAL 
      DEF *+3 
      DEF PNTR,I
      DEF PBUF+5
* 
      LDB BLANK     LOAD BLANKS 
      STB PBUF+4
      STB PBUF+8
      STB PBUF+10 
      ISZ PNTR      BUMP TO 2ND WORD OF ENTRY 
      LDB =AX       LOAD 'TRANSMIT' IDENTIFYING CODE
      LDA PNTR,I    GET 2ND DATA ITEM (CLOCK) 
      STA WORD      SAVE IT FOR LATER.
      SSA           RECEIVE?
      LDB =AR       YES, LOAD 'RECEIVE' IDENTIFIER
      STB PBUF+1    STORE IDENTIFIER IN BUFFER
      RAL,CLE,ERA   REMOVE SIGN BIT 
      STA TEMP
      JSB CNUMD     CONVERT CLOCK VALUE 
      DEF *+3 
      DEF TEMP
      DEF PBUF+11 
* 
*     SET UP PRINT BUFFER POINTER AND LENGTH. 
*     IF DEVICE IS A TERMINAL, THEN MOVE POINTER BACK 
*     TO INCLUDE VIDEO ENHANCEMENT SET-UP AND 
*     ADJUST LENGTH.  IF WORD WAS RECEIVED, THEN
*     ENHANCEMENT WILL BE "INVERSE VIDEO", ELSE 
*     BLACK VIDEO IS USED.
*     IF PROTOCOL WORD IS ABNORMAL, THEN INCLUDE THE
*     "BLINKING" OPTION.
* 
      LDA @PBUF 
      STA BUFPT 
      LDA PBUFL 
      STA BUFPL 
      LDA DVFLG     IS PRINT DEVICE 
      SSA,RSS          A TERMINAL?
      JMP PR..1     NO.  DON'T ENHANCE DISPLAY
      LDA @PBF0     MOVE POINTER TO INVERSE-VIDEO PART OF 
      STA BUFPT       BUFFER
      LDA TRMLN 
      STA BUFPL 
      LDA PBUF0+1   LOAD VIDEO SET-UP WORD
      LDB WORD      LOAD EVENT/STATE
      SSB           WAS PROTOCOL WORD RECEIVED? 
      IOR D2        YES, INCLUDE "INVERSE VIDEO" BIT IN SET-UP
      STA PBUF0+1   RESTORE SET-UP WORD 
* 
*     WE WILL MOVE THIS PRINT BUFFER INTO THE PRINT LINE, WHICH 
*     WILL CONTAIN TWO PRINT BUFFERS WHEN IT IS PRINTED.
*     THAT IS, THE VIEWER WILL SEE SIDE-BY-SIDE WHAT WAS TRANSMITTED
*     AND WHAT WAS RECEIVED.
* 
*     WHEN THE SECOND ONE HAS BEEN MOVED IN, WE WILL PRINT THE WHOLE
*     PRINT LINE AND RESET ALL THE POINTERS & COUNTERS. 
* 
PR..1 EQU * 
      LDA BUFPT     MOVE THIS 
      LDB BFPTR       BUFFER TO 
      MVW BUFPL       PRINT LINE
      STB BFPTR     SAVE POINTER FOR NEXT MOVE. 
      LDA BUFFL     UPDATE THE COUNT
      ADA BUFPL 
      STA BUFFL 
      ISZ NBUFR     HAVE WE GOT TWO BUFFERS NOW?
      JMP PR..4     NO, GO ON.
* 
*                   WE HAVE TWO BUFFERS.  PRINT BOTH & RESET. 
* 
      JSB PRINT 
@BUFF DEF BUFF      POINTER TO PRINT-LINE BUFFER
      DEF BUFFL 
      JSB RESET     RESET ALL CNTRS & POINTERS
* 
PR..4 EQU * 
      ISZ PNTR      BUMP POINTER TO NEXT ENTRY
      ISZ CNTR      BUMP COUNTER--DONE? 
      JMP LOOP        NO. 
TRC.9 EQU * 
      LDA WRFIL     ARE WE
      SZA             LOGGING DATA TO A FILE? 
      JSB WRDTA     YES, GO DO IT 
      JMP REDTA     NO, GO LOOK FOR MORE DATA.
* 
*     SUBROUTINE TO RESET ALL PRINT BUFFERS & POINTERS
* 
RESET NOP 
      CLA 
      STA BUFFL     CLEAR COUNT OF # WORDS IN PRINT LINE
      LDA M2        RESET 2-BUFFER COUNTER
      STA NBUFR 
      LDA @BUFF     RESET PRINT-LINE BUFFER 
      STA BFPTR        POINTER
      JMP RESET,I 
      SKP 
*     HERE TO SET UP FLAGS, ETC. TO READ DATA "RAW" FROM
*     TAPE DEVICE 
* 
MTAPE EQU * 
      LDA PBUFR     LOAD TAPE LU
      STA INLUF     SET "INPUT FROM TAPE" FLAG
      JMP TRC.4     CONTINUE MAIN FLOW
      SPC 4 
*     HERE WHEN USER SPECIFIES FILE NAME FOR INPUT OF 
*     TRACE INFORMATION 
      SPC 2 
MFILE EQU * 
      LDA DCB       DO WE ALREADY HAVE
      SZA             HAVE A FILE OPEN? 
      JMP BAD1      YES--ILLEGAL RESPONSE!
      CCA 
      STA INFIL     SET "GET DATA FROM FILE" FLAG 
      JSB OPEN      TRY TO OPEN FILE
      DEF *+7 
      DEF DCB 
      DEF ERR 
      DEF FNAME 
      DEF D1        OPEN IN "SHARED" MODE 
      DEF SCODE 
      DEF CRTG
      SSA           ERROR?
      JMP FIERR     YES, PRINT ERROR MSG & TERMINATE
* 
      JSB NAMX      CALL NAMR FOR ME
      SSA           SHALL WE DEFAULT? 
      CLB,INB       YES, AT LEAST ONE 
      CMB,INB       MAKE NEGATIVE TO CHECK
      SSB,RSS         AT LEAST 1? 
      CCB           NO, SUBSTITUTE -1 
      CMB,INB       POSITIVE AGAIN
      STB FREC      STORE FIRST RECORD
      JSB NAMX      CALL NAMR AGAIN 
      SSA           USE DEFAULT AGAIN?
      LDB =D32767   YES 
      LDA FREC      MAKE SURE IT'S AT LEAST 
      CMA,INA         AS LARGE AS 
      ADA B              THE
      SSA                    FIRST RECORD # 
      LDB FREC      NO, USE FIRST ONE.
      STB LREC
*                   NOW POSITION TO FIRST RECORD
      JSB POSNT 
      DEF *+5 
      DEF DCB 
      DEF ERR 
      DEF FREC
      DEF D1        ABSOLUTE POSITIONING
      CCA           SET NPASS = RECORD # - 1
      ADA FREC       (IT WILL BE INCREMENTED AT 
      STA NPASS       TRC.7)
      JMP TRC.3     NOW BEGIN PRINTING DATA IN FILE 
      SPC 2 
*     SUBROUTINE TO CALL NAMR FOR US
* 
NAMX  NOP 
      JSB NAMR
      DEF *+5 
      DEF PBUF
      DEF BUFFR     I WANT THE PARSE BUFFER IN A 'SCRATCH' AREA 
      DEF NCHAR 
      DEF NCNTR 
      LDB PBUF      LOAD THE RESULT 
      JMP NAMX,I    RETURN
      SKP 
      SPC 2 
*     SUBROUTINE TO GET NAME OF FILE INTO WHICH RAW 'TRACE' 
*     BUFFERS ARE TO BE LOGGED. 
* 
GFILE EQU * 
      CCA           SET "LOGGING TO DISC FILE" FLAG 
      STA WRFIL 
      LDA LUTTY     SET PRINT LU = TTY
      STA LUPRN 
      JSB EXEC      ASK FOR FILE <NAMR> OR LU 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF MESG2 
      DEF MS2LL 
      JSB EXEC      INPUT FILE SPECIFIER
      DEF *+5 
      DEF D1
      DEF LUTTY 
      DEF BUFFR 
      DEF M20 
      STB NCHAR     SAVE TRANSMISSION LNTH
      CLA,INA 
      STA NPNTR 
      JSB NAMR      PARSE IT
      DEF *+5 
      DEF PBUFR 
      DEF BUFFR 
      DEF NCHAR 
      DEF NPNTR 
      SSA           GOOD INPUT? 
      JMP BAD1      NO. 
      LDA PBUFR+3   CHECK TYPE OF RESPONSE
      AND D3
      CPA D1          NUMERIC?
      JMP GTAPE       YES.
      LDA FSIZE     GET # RECORDS DESIRED 
      SZA,RSS       ZERO? 
      CLA,INA       YES, DEFAULT TO 1 
      STA FSIZE 
      CLB,CLE       COMPUTE DISC FILE SIZE
      LDA FWSIZ 
      STA FSIZE+1   SAVE RECORD SIZE
      MPY FSIZE     FILE SIZE IN BLOCKS = (TRACE BUFFER SIZE+5) 
      ADA D127        + 127 TO ROUND UP 
      SEZ           WAS THERE A CARRY?
      INB           YES 
      DIV D128      COMPUTE # BLOCKS REQUIRED 
      STA FSIZE     STORE FILE SIZE IN BLOCKS 
* 
*                   NOW CREATE THE FILE 
* 
      JSB CREAT 
      DEF *+8 
      DEF DCB 
      DEF ERR 
      DEF FNAME 
      DEF FSIZE 
      DEF D2        FILE TYPE IS 2
      DEF SCODE 
      DEF CRTG
      SSA,RSS       ERROR?
      JMP OVWR1     NO.  WE'RE IN BUSINESS! OPEN FILE SHARED&UPDATE 
      CPA M2        DUPLICATE FILE NAME?
      JMP OVWRT     YES, ASK IF WE CAN OVERWRITE
* 
FIERR EQU *         COME HERE FOR ALL FILE ERRORS.
      CMA,INA       MAKE CODE NEGATIVE
      STA ERR 
      JSB CNUMD     CONVERT ERROR CODE
      DEF *+3 
      DEF ERR 
      DEF MSG3. 
      JSB EXEC      PRINT ERROR MESSAGE 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF MESG3 
      DEF MSG3L 
      JMP EXIT      TERMINATE 
* 
*     COME HERE IF FILE ALREADY EXISTS. ASK IF WE CAN OVERWRITE.
* 
OVWRT EQU *         ASK IF WE CAN OVER-WRITE THE FILE?
      JSB EXEC
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF MESG4 
      DEF MSG4L 
      JSB EXEC      READ RESPONSE 
      DEF *+5 
      DEF D1
      DEF LUTTY 
      DEF BUFFR 
      DEF D1
      LDA BUFFR 
      CPA =AYE      YES?
      RSS           NO, SO TERMINATE. 
      JMP EXIT
OVWR1 EQU *         HERE TO OPEN THE FILE IN "SHARED" MODE
      JSB OPEN      NOW OPEN FILE 
      DEF *+7 
      DEF DCB 
      DEF ERR 
      DEF FNAME 
      DEF D3        OPEN FOR UPDATE, IN "SHARED" MODE 
      DEF SCODE 
      DEF CRTG
      SSA           ERROR?
      JMP FIERR     YES, PRINT ERROR & QUIT.
      JMP REDTA     NO, WE'RE IN BUSINESS!
      SPC 2 
*     HERE TO SET UP FLAGS, ETC., FOR OUTPUT OF RAW DATA
*     TO TAPE DEVICE. 
* 
GTAPE EQU * 
      LDA PBUFR     SET "OUTPUT RAW DATA TO FILE" FLAG
      STA WRFIL      (FLAG CONTAINS + LU NUMBER)
      JMP REDTA     RESUME MAIN FLOW
      SPC 2 
*     SUBROUTINE TO LOG DATA IN "RAW" FORMAT
* 
WRDTA NOP 
      LDA WRFIL     GET OUTPUT FLAG 
      SSA,RSS       OUTPUT TO TAPE DEVICE?
      JMP WRTAP     YES 
* 
WRDT2 EQU * 
      JSB WRITF 
      DEF *+5 
      DEF DCB 
      DEF ERR 
      DEF TOD 
      DEF FWSIZ 
      SSA,RSS       ERROR?
      JMP WRDTA,I   NO, RETURN
      CPA M12       WRITING PAST EOF? 
      RSS           YES 
      JMP FIERR     NO, PRINT CATASTROPHIC ERROR & TERMINATE
      LDA MODE      SHALL WE
      RAR,RAR          STOP 
      SLA                 NOW?
      JMP EXIT      YES.
      LDA RWFLG     HAVE WE PRINTED "REWINDING" MESSAGE 
      SSA                ALREADY? 
      JMP GFIL3     YES, DON'T BOTHER AGAIN 
      CCA           SET "PRINTED REWIND MSG" FLAG 
      STA RWFLG 
      JSB EXEC      PRINT "/PSMON:REWINDING FILE" 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF MESG5 
      DEF MSG5L 
GFIL3 EQU * 
      JSB RWNDF     REWIND THE FILE AND 
      DEF *+2 
      DEF DCB 
      JMP WRDT2       WRITE THE DATA
      SPC 2 
*     HERE TO OUTPUT DATA TO TAPE 
* 
WRTAP EQU * 
      LDA FWSIZ     INITIALIZE # WORDS TO MOVE COUNTER
      STA TEMP
      LDA @TOD      INITIALIZE BUFFER POINTER 
      STA ..WR
      LDA D512
      STA LENGH 
* 
WRLUP EQU * 
      JSB DEXEC     SEND DATA REMOTELY
      DEF *+6 
      DEF NODE# 
      DEF WRCOD 
      DEF WRFIL     REMOTE LU # 
..WR  NOP           BUFFER POINTER
      DEF LENGH    LENGTH 
      NOP           IGNORE ERRORS 
      LDA ..WR      UPDATE POINTER
      ADA D512
      STA ..WR
      LDA TEMP
      CMA,INA 
      ADA D512
      SSA,RSS       DATA ALL WRITTEN? 
      JMP WRDTA,I   YES, RETURN 
*                   COMPUTE MINIMUM OF (512, # WORDS REMAINING TO SEND) 
      LDB D512
      ADB A 
      CMA,INA       NO, UPDATE NEW REMAINDER
      STA TEMP
      SSB,RSS       REMAINDER < 512?
      STA LENGH     YES.
      JMP WRLUP     CONTINUE OUTPUTTING 
      SPC 2 
*     HERE IF LINE LU GIVEN IS NON-NUMERIC OR NOT CONNECTED 
*     TO DVA65 OR FORMAT OF RESPONSE IS OTHERWISE ILLEGAL.
* 
BAD1  EQU * 
      JSB EXEC
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF BADMS 
      DEF BADML 
      JMP TRCC2     GO REPEAT QUESTION. 
      SKP 
*     PRINT ROUTINE 
* 
*     CALLING SEQUENCE: 
*     JSB PRINT 
*     DEF BUFR
*     DEF BUFFER LENGTH 
* 
PRINT NOP 
      DLD PRINT,I   GET ADDRESS OF BUFFER & LENGTH
      DST @@
      ISZ PRINT 
      ISZ PRINT 
      JSB DEXEC     PRINT LINE
      DEF *+6 
      DEF NODE# 
      DEF WRCOD 
      DEF LUPRN 
@@    NOP           ADDRESS OF BUFFER STORED HERE 
      NOP           ADDRESS OF LENGTH STORED HERE 
      NOP 
      JMP PRINT,I    EXIT . 
      SPC 2 
* 
*     SUBROUTINE TO CHECK DEVICE TYPE 
* 
*     CALLING SEQUENCE: 
*     JSB DVTYP 
*     DEF LU TO BE CHECKED
*     <RETURN IF NOT 5 OR 7>
*     <RETURN IF DEVICE IS TYPE 5 OR 7> 
* 
DVTYP NOP 
      LDA DVTYP,I   GET LU TO CHECK 
      LDA A,I 
      STA DLU 
      ISZ DVTYP     BUMP RETURN ADDRESS TO P+2
      JSB DEXEC     GET DEVICE STATUS 
      DEF *+7 
      DEF NODE# 
      DEF STCOD     I O STATUS CODE, NO ABORT 
      DEF DLU 
      DEF EQT5
      DEF EQT4      DUMMY PARAMETER 
      DEF LUTYP     LU & SUBCHANNEL STORED HERE 
      NOP 
      LDA LUTYP     ISOLATE UNIT NUMBER 
      AND =B377 
      STA B 
      LDA EQT5      LOAD DEVICE TYPE CODE 
      ALF,ALF       ROTATE DEVICE TYPE TO LOW 8 BITS
      AND =B77      ISOLATE EQUIPMENT TYPE CODE 
      CPA D5        IF DEVICE TYPE IS 5,
      SZB               AND SUBCHANNEL IS 0,
      RSS                  THEN WE WILL 
      ISZ DVTYP          RETURN TO P+3
      CPA D7        ELSE IF DEVICE TYPE IS 7, WE WILL 
      ISZ DVTYP      RETURN TO P+3
      JMP DVTYP,I     ELSE RETURN TO P+2
DLU   NOP 
      SPC 2 
*     SUBROUTINE TO PRINT A BLANK LINE
* 
PBLNK NOP 
      JSB PRINT     PRINT THE BLANK LINE
      DEF BLANK 
      DEF D1
      JMP PBLNK,I   RETURN TO CALLER
* 
*     ROUTINE TO CHECK IF (A) REGISTER CONTAINS TWO PRINTING
*     ASCII CHARACTERS.  IF EITHER CHARACTER IS NON-PRINTING, 
*     IT IS REPLACED BY A BLANK.
* 
*     CALLING SEQUENCE: 
*     LDA <WORD>
*     JSB CASCI 
*     <RETURN WITH TWO VALID PRINTING CHARACTERS IN (A)>
* 
CASCI NOP 
      STA TEMP
      JSB CCK1      CHECK 1ST CHAR
      STA CHAR      STORE CHARACTER 
      LDA TEMP
      ALF,ALF       NOW DO 2ND CHAR 
      JSB CCK1      CHECK 2ND CHAR
      ALF,ALF       ROTATE TO HIGH HALF 
      IOR CHAR      MERGE OTHER CHAR
      JMP CASCI,I   RETURN TO CALLER
*                   DEFINE TEMPORARY STORAGE FOR 'CASCI'
CHAR  NOP 
TEMP  NOP 
      SPC 2 
CCK1  NOP 
      AND =B377     MASK CHARACTER
      STA CCK2
      LDA =B137     LOAD LEFT ARROW 
      CMA,INA 
      ADA CCK2      SUBTRACT LEFT ARROW FROM CHARACTER
      SSA,RSS 
      JMP LBLNK     NO, LOAD A BLANK
      LDA =B40      SUBTRACT
      CMA,INA 
      ADA CCK2         A BLANK
      SSA           LESS THAN A BLANK?
      JMP LBLNK     YES, LOAD A BLANK 
      LDA CCK2      RECOVER CHARACTER 
      RSS 
LBLNK LDA =B40
      JMP CCK1,I    RETURN
CCK2  NOP           TEMPORARY STORAGE FOR CCK1
      SPC 2 
*     SUBROUTINE TO CHECK DATA FOR ABNORMAL PROTOCOL WORDS
* 
CKDTA NOP 
      LDA NOBSV     INITIALIZE LOOP 
      CMA,INA 
      SZA,RSS       ZERO? 
      JMP CKDTA,I   RETURN
      STA CNTR
      LDB @BUFR 
CKLUP EQU * 
      LDA B,I       LOAD DATA WORD
      CPA STOP      STOP? 
      ISZ NSTOP 
      NOP 
      CPA RLW       RLW?
      ISZ NRLW
      NOP 
      CPA RLM       RLM?
      ISZ NRLM
      NOP 
      CPA RC        RC? 
      ISZ NRC 
      NOP 
      ADB NTENT     ADVANCE POINTER 
      ISZ CNTR      BUMP LOOP COUNTER 
      JMP CKLUP     CONTINUE LOOP 
      JMP CKDTA,I   EXIT LOOP, EXIT ROUTINE 
      SKP 
*     HERE TO EXIT
* 
* 
* 
* 
EXIT  EQU * 
      JSB SUBTL     PRINT SUB-TOTALS
      LDA WRFIL     ARE WE
      SZA,RSS         LOGGING DATA? 
      JMP EXIT1     NO
      SSA           YES, GOING TO A DEVICE? 
      JMP EXIT2     NO, TO A BONA FIDE DISC FILE. 
*     WRITE AN EOF ON REMOTE DEVICE 
      LDA WRFIL 
      IOR EOFCD 
      STA TEMP
      JSB DEXEC     WRITE AN EOF ON DEVICE
      DEF *+4 
      DEF NODE# 
      DEF CNTCD     CONTROL CODE, WITH NO ABORT 
      DEF TEMP
      NOP 
      JMP EXIT3 
* 
EXIT1 EQU *         HERE TO SEE IF WE SHOULD CLOSE DISC FILE
      LDA INFIL     ARE WE READING DATA FROM A FILE?
      SSA,RSS 
      JMP EXIT3     NO. 
EXIT2 EQU * 
      JSB CLOSE 
      DEF *+2 
      DEF DCB 
* 
EXIT3 EQU * 
      JSB EXEC      PRINT TERMINATION MESSAGE 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF ENMSG 
      DEF ENMSL 
      JSB EXEC      TERMINATE 
      DEF *+2 
      DEF D6
      SPC 2 
*     SUBROUTINE TO PRINT SUB-TOTAL INFORMATION 
* 
SUBTL NOP 
      JSB CNUMD     CONVERT # OF PASSES 
      DEF *+3 
      DEF NPASS        PASS NUMBER. 
      DEF ENCNT 
      JSB CNUMD     CONVERT # 'RC'S SEEN
      DEF *+3 
      DEF NRC 
      DEF .RC.
      JSB CNUMD     CONVERT # RLMS
      DEF *+3 
      DEF NRLM
      DEF .RLM. 
      JSB CNUMD     CONVERT # RLW 
      DEF *+3 
      DEF NRLW
      DEF .RLW. 
      JSB CNUMD     CONVERT # STOPS 
      DEF *+3 
      DEF NSTOP 
      DEF .STP. 
      JSB EXEC      PRINT SUB-TOTALS
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF SUBMS 
      DEF SUBML 
      JMP SUBTL,I   RETURN
      SKP 
*     DATA BUFFERS AND CONSTANTS
* 
M20   DEC -20 
M12   DEC -12 
M5    DEC -5
M2    DEC -2
M4    DEC -4
D0    DEC 0 
D1    DEC 1 
D2    DEC 2 
WRCOD OCT 100002    "WRITE" CODE W/NO-ABORT BIT SET 
RDCOD OCT 100001    "READ" CODE W/ NO-ABORT BIT SET 
CNTCD OCT 100003    "CONTROL" CODE W/ NO-ABORT BIT SET
TMCOD OCT 100013    TIME-OF-DAY CODE W/ NO-ABORT BIT SET
EOFCD OCT 100       "EOF" CONTROL SUBFUNCTION CODE. 
D3    DEC 3 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D12   DEC 12
STCOD OCT 100015    I/O STATUS,NO ABORT 
D127  DEC 127 
D128  DEC 128 
B200  EQU D128
D512  DEC 512 
      SPC 4 
ASC0  ASC 1,0 
COLON ASC 1,: 
BLANK ASC 2,
HED1  ASC 22,PASSIVE MONITOR 'TRACE'PROGRAM,REV 11-10-78
HED1L ABS *-HED1
HED4  ASC 4,RECORD #
HED4. BSS 3 
      ASC 3,,TIME:
HED4$ ASC 9,
HED4L ABS *-HED4-1
@HD4. DEF HED4$ 
* 
BADMS ASC  8,ILLEGAL RESPONSE 
BADML ABS *-BADMS 
ENMSG ASC 5,PSMON:END 
ENMSL ABS *-ENMSG 
SUBMS ASC 3,PSMON:    SUB-TOTALS MESSAGE
ENCNT ASC 3,        STORAGE # OF PASSES LOGGED HERE 
      ASC 7, RECS LOGGED, 
.RC.  ASC 3,        STORE # RCS 
      ASC 3, RCS, 
.RLM. ASC 3,        STORE # RLM 
      ASC 3, RLMS,
.RLW. ASC 3,        STORE # RLWS
      ASC 3, RLWS 
.STP. ASC 3,        # STOPS 
      ASC 3, STOPS
SUBML ABS *-SUBMS 
* 
MESG2 ASC 9,FILE <NAMR> OR LU?
MS2LL ABS *-MESG2 
MESG3 ASC 6,FMP ERROR - 
MSG3. BSS 3         STORAGE FOR FMP ERROR CODE (IN ASCII) 
MSG3L ABS *-MESG3 
MESG4 ASC 18,DUPL. FILE. OVERWRITE(YES OR NO)?
MSG4L ABS *-MESG4 
MESG5 ASC 11,/PSMON:REWINDING FILE
MSG5L ABS *-MESG5 
MSG1  ASC  28,DATA SOURCE:<NAMR>,LU, OR BLANKS TO TAKE 'LIVE' DATA?_
MSG1L ABS *-MSG1
@UNKN DEF *+1 
      ASC 2,
@STOP DEF *+1 
      ASC 2,STOP
@RC   DEF *+1 
      ASC 2,RC
@TNW  DEF *+1 
      ASC 2,TNW 
@RLW  DEF *+1 
      ASC 2,RLW 
@RLM  DEF *+1 
      ASC 2,RLM 
* 
* 
LENGH NOP 
RWFLG NOP           FLAG: 0 UNTIL "REWINDING FILE" MSG HAS BEEN PRINTED 
NBUFR NOP 
BFPTR NOP 
BUFFL NOP 
BUFPL NOP 
INFIL NOP           FLAG FOR "GET DATA FROM FILE" 
INLUF NOP           FLAG FOR "GET DATA FROM TAPE" 
WRFIL NOP           FLAG FOR "STORE DATA IN FILE" 
LEN   NOP           FILE LENGTH 
NCNTR NOP 
FREC  NOP           FIRST RECORD NUMBER 
LREC  NOP           LAST RECORD NUMBER
NPNTR NOP 
NSTOP NOP           COUNTER OF NUMBER OF 'STOPS' SEEN 
NRLW  NOP             "     "    "    "   'RLW'S "
NRLM  NOP             "     "    "    "   'RLM'S "
NRC   NOP             "     "    "    "   'RC'S  "
NTENT EQU D2        # WORDS PER TRACE TABLE ENTRY 
STOP  OCT 7760      'STOP' WORD 
RC    OCT 170017    'REQUEST COMING' WORD 
TNW   OCT 170360    'TRANSMIT NEXT WORD'
RLW   OCT 7417      'RE-TRANSMIT LAST WORD' 
RLM   OCT 170377    'RE-TRANSMIT LAST MESSAGE'
BUFPT NOP           WILL CONTAIN ADDRESS OF PRINT BUFFER
* 
*     NOTE: DO NOT DISTURB ORDER OF LOCATIONS PBUF0 THROUGH PBUFL.
*     WHEN OUTPUT IS TO A TERMINAL (DV.05 OR DV.07) AND THE PROTOCOL WORD FROM
*     THE TRACE BUFFER WAS RECEIVED,THE PRINT BUFFER CONSISTS OF LOCATIONS
*     PBUF THROUGH PBUFL-3.  OTHERWISE, IT CONSISTS OF LOCATIONS PBUF THROUGH 
*     PBUFL-3.  THE TWO LOCATIONS ON EITHER SIDE OF THESE TWO POINTS
*     ARE USED, RESPECTIVELY, TO SET UP AND CLEAR INVERSE VIDEO.
* 
PBUF0 ASC 3,        STORAGE HERE FOR VIDEO SET-UP 
PBUF  ASC 17, 
PBUFX EQU * 
PBUFR BSS 10
FNAME EQU PBUFR 
SCODE EQU PBUFR+4 
CRTG  EQU PBUFR+5 
FSIZE EQU PBUFR+7 
EQT5  NOP 
EQT4  NOP 
LUTYP NOP 
WORD  NOP 
@PBUF DEF PBUF
@PBF0 DEF PBUF0 
TRMLN ABS PBUFX-PBUF0 
PBUFL ABS PBUFX-PBUF
BVDEO ASC 2,&d@           BLACK-VIDEO SETUP. 
@BVDO DEF BVDEO 
DVFLG NOP           FLAG:-1 IF PRINTER IS TERMINAL, ELSE 0
DCB   NOP 
      BSS 143 
BUFF  BSS 48
PRAMS BSS 5 
LUTTY EQU PRAMS 
LUPRN EQU PRAMS+1 
NODE# EQU PRAMS+2 
MODE  EQU PRAMS+3 
NPTS  EQU PRAMS+4 
NPRNT NOP 
NCHAR NOP 
CNTR  NOP           # POINTS/LOOP COUNTER 
LAST  NOP           "END+1" POINTER TO TRACE BUFFER 
NOBSV  NOP           # POINTS OBSERVED
NPASS NOP           PASS NUMBER 
PNTR  NOP           BUFFER POINTER
CLOCK NOP           PSEUDO "CLOCK"
.SIZE EQU 4096      SIZE OF TRACE BUFFER
TRACZ ABS .SIZE     STORAGE FOR SIZE OF TRACE BUFFER
MDFLT ABS -.SIZE
FWSIZ NOP TRACZ     SIZE OF LOGGED-DATA RECORDS 
A     EQU 0 
B     EQU 1 
SCALE DEC 6 
ERR   NOP 
TITL1 ASC 4,#LOGGED=
.NRC. ASC 3,        STORE # LOGGED DATA WORDS 
TTL1L ABS *-TITL1 
TITL2 ASC 15,RX MNEM   DATA   ASCII  CLOCK
      ASC 3,
      ASC 15,RX MNEM   DATA   ASCII  CLOCK
TTL2L ABS *-TITL2 
TITL3 ASC 20,---------------------------------------- 
      ASC 15,------------------------------ 
TTL3L ABS *-TITL3 
* 
* 
TOD   BSS 5         TIME-OF-DAY BUFFER
BUFFR BSS .SIZE     DATA BUFFER 
      END PSMON 
                                                                                                                                                                                                                                                  