ASMB,R,L,C
      HED <TRC65> DS/1K 'TRACE' PRGM FOR DVA65 * (C) HEWLETT-PACKARD CO. 1979 
      NAM TRC65,22,45 25999-16225 REV.1902 790122 DVA65 'TRACE' PRGM
* 
******************************************************************
*  * (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:   TRC65
*    SOURCE: 24999-18225
*    RELOC:  24999-16225
*    PGMR:   LYLE WEIMAN SEP 1978 
* 
*     'TRACE' INFORMATION PRINTOUT PROGRAM FOR DVA65
*     --REQUIRES VERSION OF DVA65 SUPPORTING 'TRACE'
* 
* 
*     *ON,TRC65,[LUTTY[,LUPRIN[,MODE]]] 
* 
*     LUTTY = LU OF OPERATOR CONSOLE(MUST BE CAPABLE OF INPUT & OUTPUT) 
*             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. 
* 
*        3) THE "TRACE RECORD NUMBER" PRINTED IS SHOWN
*           IN INVERSE VIDEO IF NOT CONSECUTIVE.
* 
*     LUPRIN= LU FOR PRINTING TRACE TABLE IF NOT THE SAME AS <LUTTY>
*               USEFUL WHEN HARDCOPY LOG IS DESIRED.
*               DEFAULT IS LUTTY. 
* 
*               NOTE: IF LUPRIN = 2, THEN ALL TRACE RECORDS WILL BE 
*               RECORDED IN THEIR "RAW" FORM ON A DISC FILE, WHOSE
*               NAME & SIZE ARE THEN ASKED FOR BY THE PROGRAM.
*               TRACE INFORMATION IS NORMALLY MAINTAINED IN A CIRCULAR
*               FASHION: OLD INFORMATION IS OVERWRITTEN BY NEW, THE 
*               NUMBER OF "FRESH" TRACE RECORDS BEING DETERMINED BY 
*               THE SIZE OF THE FILE. 
* 
*               SYNTAX IS:   FILNAM : SC : CR : :# RECORDS FOR FILE 
* 
*               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 IN RESPONSE TO THE QUESTION, "LINE LU?"
* 
*               NOTE: TO ENABLE FMGR & REMAT TO HANDLE "TRACE" FILES, 
*               THE NUMBER OF "TRACE" ENTRIES PER RECORD WILL BE
*               REDUCED TO 30 (RECORD SIZE OF 128 WORDS) WHEN LOGGING 
*               TO A FILE OR READING FROM ONE.
* 
*     <MODE> : BIT MASK 
*      BIT 0 = 0  CAUSES PROGRAM TO WAIT UNTIL WHOLE RECORD IS
*              FILLED BEFORE PRINTING.
*            = 1 THEN PROGRAM WILL PRINT CONTENTS OF TRACE RECORD,
*                CONTINUOUSLY,  WITHOUT WAITING FOR SYNCHRONIZATION 
*                FROM THE DRIVER. 
* 
*      BIT 1 = 0 CAUSES PROGRAM TO PRINT DRIVER STATE LEGEND. 
*            = 1 INHIBITS PRINTOUT OF DRIVER STATE LEGEND.
* 
*      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
*             "/TRC65: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.
* 
*      BIT 3:  USED TO IGNORE 'TRACE' RECORDS WHICH DO NOT CONTAIN ABNORMAL 
*             PROTOCOL WORDS. 
*          = 0: PRINT/LOG ALL RECORDS 
*          = 1: IGNORE ALL RECORDS CONTAINING NO ABNORMAL PROTOCOL WORDS. 
      SKP 
*       YOU WILL BE ASKED TO SPECIFY THE COMMUNICATION LINK LU TO 
*       BE TRACED.  IF YOU WANT ALL LINKS TRACED, ENTER THE NEGATIVE OF 
*       ANY LINK LU.  TO TERMINATE COMPLETELY, RELEASE ALL RESOURCES
*       AND DISABLE TRACE MODE, ENTER A ZERO. 
* 
*       TO CHANGE THE PRINT LUS OR TRACE MODE, SET THE 'BREAK' FLAG 
*       FOR THIS PROGRAM, AND RE-SCHEDULE IT. 
* 
* 
*       THIS PROGRAM SEMI-PERMANENTLY ALLOCATES A BLOCK OF SYSTEM AVAILABLE 
*       MEMORY TO BE USED AS THE TRACE BUFFER.  THIS IS A POTENTIAL HAZARD
*       IF YOU LEAVE IT ALLOCATED FOR LONG PERIODS OF TIME (I.E., HOURS OR
*       DAYS) BECAUSE IT MAY BE LOCATED IN 'SAM' SUCH THAT IT PREVENTS LARGE
*       BUFFERS FROM EVER BEING ALLOCATED, THUS ALLOWING FOR THE POSSIBILITY
*       OF A "DEADLY EMBRACE".  SINCE RTE DOES NOT
*       REALIZE THAT THIS BUFFER IS SEMI-PERMANENTLY ALLOCATED, IT
*       CANNOT DETECT THE "DEADLY EMBRACE" CONDITION WHICH EXISTS WHENEVER
*       A PROGRAM ATTEMPTS TO ALLOCATE A BUFFER WHICH IS SMALLER THAN THE 
*       TOTAL AMOUNT OF FREE "SAM", BUT LARGER THAN THE FRAGMENTS LEFT- 
*       OVER AFTER THIS PROGRAM IS RUN.   IF YOU INTEND TO ALLOW THE
*       PROGRAM TO RUN FOR LONG PERIODS OF TIME, YOU SHOULD ATTEMPT TO
*       MINIMIZE THIS PROBLEM BY RUNNING IT IMMEDIATELY 
*       AFTER 'LSTEN' IS RUN.  THIS CAUSES THE "SAM" BLOCK ALLOCATED TO BE
*       LOCATED RIGHT AFTER THE "SAM" WHICH 'LSTEN' ALLOCATES.
*       NOTE THAT THIS REDUCES BUT DOES NOT ELIMINATE THE PROBLEM.
* 
* 
*     THE CLASS NUMBER AND RESOURCE NUMBER ALLOCATED ARE STORED IN 'RES', 
*     THUS ELIMINATING THE DANGER THAT RESOURCES MAY BE LOST IF THIS
*     PROGRAM IS ABORTED.  HOWEVER, IF IT IS ABORTED, YOU SHOULD
*     RUN IT AGAIN, SPECIFYING ZERO FOR THE LINE LU, TO ALLOW 
*     IT TO CLEAN UP AFTER ITSELF.
      SKP 
*       THE PRINT FORMAT SHOWN BELOW IS ACTUALLY REPEATED TWICE PER LINE: 
* 
*     <ARROW> <D> <^> <P> <OOOOOO> <STATE>  <EQT NUMBER> <TBG TICK NUMBER>
* 
*               WHERE<D>= 'X' IF WORD WAS TRANSMITTED 
*                    <D>= 'R' IF WORD WAS RECEIVED. 
*                    <^>= AN UP-ARROW WILL BE PRINTED IMMEDIATELY FOLLOWING 
*                         IF A TIME-OUT INDICATION OCCURRED.
*               <ARROW>=  A RIGHT-ARROW (->) IS PRINTED TO THE LEFT OF
*                         THE OLDEST ENTRY
* 
*                  <P> =  MNEMONIC FOR PROTOCOL WORD
*                         RC, TNW, RLM, RLW, STOP, OR BLANKS IF PROTOCOL
*                         WORD IS NONE OF ABOVE.
*                         NOTE: THE "LENGTH" WORDS WILL NOT NORMALLY MATCH
*                         ANY OF THE ABOVE. 
* 
*                  <OOOOOO> = PROTOCOL WORD IN OCTAL. 
* 
*                  <STATE> = DRIVER STATE NUMBER.  A LEGEND IS PRINTED WHEN 
*                            THIS PROGRAM FIRST BEGINS. 
* 
*                  <EQT>  = EQT NUMBER (USEFUL IN SEPARATING ACTIVITY 
*                           AMONG VARIOUS LINES), PRINTED IN DECIMAL
*           <TBG TICK NUMBER> = LOW 16 BITS OF $TIME WORD WHEN ENTRY WAS
*                               MADE, CONVERTED TO DECIMAL.  THIS PROVIDES
*                               AN INDICATION OF THE AMOUNT OF TIME ELAPSED 
*                               BETWEEN THIS ENTRY AND THE PREVIOUS ONE.
*                               EACH TICK REPRESENTS TEN MILLISECONDS.
* 
* 
*     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 MULTIPLE OF 4, PLUS THREE EXTRA WORDS. 
* 
* 
*     THE "TRACE" BUFFER FORMAT IS DESCRIBED IN THE COMMENTS
*     IN THE SOURCE OF DVA65.  THE DISC FILE FORMAT IS THE SAME 
*     EXCEPT THAT THREE WORDS HAVE BEEN ADDED IN FRONT:  2 TIME 
*     WORDS AND THE LOCAL NODE NUMBER.  THE RECORD SIZE IS
*     REDUCED TO 128 WORDS AND THE TRACE BUFFER SIZE IS REDUCED 
*     TO 30 ENTRIES IN THIS CASE. 
      EXT CREAT,OPEN,CLOSE,READF,WRITF,RWNDF
      EXT EXEC,KCVT,POSNT 
        EXT #TRCL,#TRCN,NAMR
        EXT RNRQ,IFBRK
        EXT CNUMO,CNUMD 
        EXT RMPAR,TMVAL,$TIME 
        EXT #NODE 
        SUP 
TRC65 EQU * 
      JSB RMPAR 
      DEF *+2 
      DEF PRAMS 
      CLB           CLEAR FLAGS 
      STB INFIL 
      STB RWFLG 
      STB WRFIL 
      STB NDFLG 
      STB NRC       CLEAR # RCS COUNTER 
      STB TSTOP     CLEAR TOTAL # STOPS 
      STB TRLW      CLEAR TOTAL # RLWS
      STB TRLM      CLEAR TOTAL # RLMS
      STB DCB       SHOW WE DON'T HAVE ANY FILES OPEN.
      STB SKPFL    AVOID THE 2-SEC DELAY BEFORE PRNTG 1ST BLOCK 
      STB RECN     CLEAR RECORD NUMBER COUNTER
* 
      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 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 
* 
      LDA MODE      PRINT 'STATE' 
      RAR,SLA         LEGEND? 
      JMP TRCC2        NO.
* 
*     PRINT <STATE> LEGEND
* 
      LDA @STAT 
      STA PNTR
P.LUP EQU * 
      JSB PRINT 
PNTR  NOP 
      DEF @@HED 
      LDA PNTR
      ADA @@HED 
      STA PNTR
      CPA @@END     FINISHED? 
      RSS           YES, GO ON. 
      JMP P.LUP     NO, CONTINUE
* 
TRCC1 EQU * 
      JSB PRINT     PRINT HEADER
      DEF HED1
      DEF HED1L 
* 
TRCC2 EQU * 
      JSB EXEC      "LINK LU, -LU TO TRACE ALL, OR <NAMR>?" 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF MSG1
      DEF MSG1L 
      JSB EXEC      ASK FOR LU OR FILE NAME TO TRACE
      DEF *+5 
      DEF D1
      DEF LUTTY 
      DEF BUFFR 
      DEF M20 
      STB NCHAR 
      CLA,INA 
      STA NCNTR 
      JSB NAMR        PARSE RESPONSE
      DEF *+5 
      DEF PBUFR 
      DEF BUFFR 
      DEF NCHAR 
      DEF NCNTR 
      CLB           CLEAR 
      STB BUFFR       PASS NUMBER COUNTER.
      SSA           ANY INPUT?
      JMP EXIT      NONE.  TERMINATE. 
      LDA PBUFR+3   GET TYPE CODE FOR RESPONSE. 
      AND D3
      CPA D3        ASCII?
      JMP MFILE     YES 
      CPA D1        NUMERIC?
      RSS 
      JMP BAD1      NO, BAD INPUT.
* 
      JSB CNUMD     CONVERT LINE LU TO ASCII
      DEF *+3 
      DEF PBUFR 
@.LU. DEF .LU.
      CLB,INB       ASSUME TRACE IS JUST FOR THIS LINK. 
      LDA PBUFR     GET LU
      SZA,RSS       ZERO? 
      JMP EXIT      YES, USER WANTS TO TERMINATE & RELEASE
*                                             RESOURCES 
      SSA,RSS       ALL LINKS TO BE TRACED? 
      JMP TRC.0     NO, JUST THIS ONE.
      LDA @ALL      MOVE "(ALL)" INTO "TRACE LU" BUFFER 
      LDB @.LU. 
      MVW D3
      LDA PBUFR     GET LU AGAIN
      CMA,INA       MAKE POSITIVE 
      CLB 
TRC.0 EQU * 
      STB TROPT     STORE TRACE OPTION
      STA LINK      STORE LINK LU 
* 
*     FIND LINK TYPE
      JSB DVTYP 
      DEF LINK
      NOP 
      CPA =B65      DEVICE TYPE = 65? 
      RSS           YES, GOOD THING!
      JMP BAD1      NO, SO IT'S NOT A VALID LINK LU.
* 
*     ALLOCATE A SYNCHRONIZATION RESOURCE NUMBER
* 
*     IT IS ALLOCATED AND LOCKED GLOBALLY FOR TWO REASONS:
*     1) SO ANOTHER PROGRAM CAN BE WRITTEN BY THE USER
*        TO BRING THIS PROGRAM OUT OF 'RN SUSPEND', WHICH 
*        IT CAN GET INTO IF ASKED TO TRACE AN INACTIVE
*        LINE.
*     2) SO IF THIS PROGRAM IS ABORTED FOR ANY REASON, THEN 
*        RE-RUN IN ANOTHER ID SEGMENT, THE RESOURCE NUMBER IT 
*        ALLOCATES WILL STILL BE USABLE BY IT.
* 
      LDA #TRCN     HAS ONE ALREADY 
      SZA             BEEN ALLOCATED? 
      JMP TR..1     YES, SKIP ALLOCATION
      JSB RNRQ      ALLOCATE ONE
      DEF *+4 
      DEF B22       ALLOCATE & LOCK IT GLOBALLY 
      DEF #TRCN     STORE RESOURCE NUMBER IN "RES" MODULE 
      DEF STAT      STORE STATUS HERE.
* 
TR..1 EQU * 
      LDA #TRCL     HAS A CLASS NUMBER
      SZA,RSS         ALREADY BEEN ALLOCATED? 
      JMP TRC.2     YES, SKIP CLEAN-UP
      LDA LINK      TEMPORARILY 
      IOR =B700        DISABLE
      STA ICNWD          TRACE
      JSB EXEC              MODE. 
      DEF *+3 
      DEF D3
      DEF ICNWD 
      LDA #TRCL     CLEAR ALL MODE BITS 
      AND =B17777 
      IOR =B120000  SET "DO NOT DE-ALLOCATE CLASS"
      STA #TRCL       AND "NO-WAIT" BITS
* 
*                   CLEAR OUT CLASS BUFFERS 
* 
T...1 JSB GET       RELEASE THIS BUFFER 
      SSA,RSS       ANY DATA? 
      JMP T...1     YES, CONTINUE 
* 
TRC.2 EQU * 
      SKP 
* 
* 
* 
* 
*     ISSUE CLASS WRITE-READ TO ALLOCATE SOME SYSTEM AVAILABLE MEMORY.
* 
* 
      LDA LINK
      IOR =B700     SET SUBFUNCTION BITS FOR
      STA ICNWD       'ENABLE TRACE MODE' 
      JSB EXEC      HANG DUMMY CLASS 'WRITE' ON LINK EQT
      DEF *+8 
      DEF D20 
      DEF ICNWD 
      DEF BUFFR 
      DEF TRACZ     TRACE BUFFER SIZE 
      DEF TROPT     TRACE OPTION
      DEF #TRCN     RESOURCE NUMBER 
      DEF #TRCL     'TRACE' BUFFER CLASS-I/O NUMBER 
      SPC 2 
      LDA #TRCL     CLEAR SPECIAL BITS
      AND =B17777 
      IOR =B60000   SET "SAVE BUFFER & CLASS #" BITS
      STA #TRCL 
      AND =B377     CLEAR ALL SYSTEM BITS FROM CLASS #
      STA ICNWD          FOR CONVERSION TO ASCII
      JSB PBLNK     PRINT BLANK LINE
      JSB CNUMO     CONVERT CLASS NUMBER
      DEF *+3 
      DEF ICNWD 
      DEF .CLA.     TO ASCII
      LDA #TRCN     LOAD RESOURCE NUMBER
      AND =B377     MASK RN PART
      STA ICNWD     SAVE FOR CONVERSION TO ASCII
      JSB CNUMD     CONVERT RESOURCE NUMBER 
      DEF *+3 
      DEF ICNWD 
      DEF .RN.
      JSB PRINT 
      DEF MSG2
      DEF MSG2L 
* 
*     LOCK MYSELF IN MY PARTITION SO I CAN BE DISPATCHED QUICKLY. 
* 
      JSB EXEC
      DEF *+3 
      DEF D22 
      DEF D1
* 
      SPC 2 
TRC.3 EQU * 
      LDA WRFIL     ARE WE LOGGING DATA 
      SZA             IN A FILE?
      JMP TRC.4        YES, DON'T PRINT THE HEADER
      JSB PRINT     PRINT REST OF HEADER
      DEF HED2
      DEF HED2L 
      JSB PRINT 
      DEF HED5
      DEF HED5L 
      JSB PRINT     PRINT DASHES
      DEF HED3
      DEF HED3L 
* 
      SPC 2 
      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 
* 
*     READ NEXT "TRACE" RECORD
* 
REDTA EQU * 
      ISZ RECN     INCREMENT RECORD NUMBER COUNTER
      NOP          (IT MIGHT ROLL OVER) 
      JSB IFBRK     CHECK 'BREAK' FLAG
      DEF *+1 
      SSA           SET?
      JMP EXIT      YES, WE MUST QUIT.
* 
      CLB 
      STB NRLM
      STB NRLW
      STB NSTOP 
      STB NPRNT     CLEAR # HALF-PRINT LINES CNTR 
      LDA TRACZ     COMPUTE # ENTRIES TO PRINT
      DIV NTENT       BY DIVIDING BUFFER SIZE BY # WORDS PER ENTRY
      STA NOBSV     SAVE # OBSERVATIONS 
      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 
      DEF BTIME 
      DEF FWSIZ 
      DEF LEN 
* 
      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.
* 
RED.1 EQU * 
      LDA DVFLG     IS THIS DEVICE
      SSA,RSS          A TERMINAL?
      JMP TRC.7     NO, GO FORMAT DATA
      LDA SKPFL    DID WE SKIP PRINTOUT OF LAST 
      SZA,RSS      RECORD (HAD NO ABNORMAL PROTOCOL WORDS)? 
      JMP TRC.7    YES, 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 * 
      JSB CNUMD    CONVERT RECORD NUMBER
      DEF *+3        TO ASCII 
      DEF RECN
      DEF .REC. 
      LDA MODE      SHOULD WE WAIT
      SLA              FOR DRIVER TO FILL TRACE BUFFER? 
      JMP TRAC3     NO, JUST PRINT IT.
*                   LOCK RN SO WE WILL BE RE-SCHEDULED IMMEDIATELY
*                   DRIVER RELEASES IT (I.E., AS SOON AS
*                   THE BUFFER IS AVAILABLE). 
      LDA D2
      STA ICODE 
      JSB RNRQ
      DEF *+4 
      DEF ICODE 
      DEF #TRCN 
      DEF STAT
      SPC 2 
*     OBTAIN A COPY OF THE TRACE BUFFER BY ISSUING A "GET"
*     CALL (SAM BUFFER IS RETAINED).
* 
TRAC3 EQU * 
      JSB GET       DO "GET"
      DLD $TIME     STORE TIME AT WHICH SAVE WAS MADE 
      DST BTIME       LOCALLY.
      LDA #NODE     SAVE LOCAL NODE # 
      STA NODE# 
      SKP 
TRC.7 EQU * 
      JSB CKDTA     COUNT # ABNORMAL PROTOCOL WORDS & RCS 
      LDA TRLM      UPDATE TOTAL # RLMS OBSERVED
      ADA NRLM
      STA TRLM
      LDA TRLW      UPDATE TOTAL # RLWS OBSERVED
      ADA NRLW
      STA TRLW
      LDA TSTOP     UPDATE TOTAL # STOPS
      ADA NSTOP 
      STA TSTOP 
      LDA MODE      ARE WE TO IGNORE
      RAR,RAR         BUFFERS CONTAINING
      RAR             NO RLMS, RLWS,
      SLA,RSS             OR STOPS? 
      JMP TAKDT           NO, TAKE IT ANYWAY. 
      LDA NRLM      WERE THERE ANY RLMS 
      ADA NRLW        OR RLWS 
      ADA NSTOP       OR STOPS
      STA SKPFL 
      SZA,RSS           ??
      JMP REDTA     NO, SKIP THIS ONE.
* 
TAKDT EQU *         HERE TO TAKE THE DATA BUFFER. 
      CCA          SET "DIDN'T SKIP LAST RECORD" FLAG 
      STA SKPFL 
      LDA WRFIL     ARE WE LOGGING
      SZA             TO A DISC FILE? 
      JMP WRDTA     YES.
      JSB PBLNK     PRINT BLANK LINE
      JSB CNUMD     CONVERT SUB-TOTAL OF # RCS
      DEF *+3 
      DEF NRC 
      DEF .RC.
      JSB CNUMD     CONVERT SUB-TOTAL OF # RLWS 
      DEF *+3 
      DEF NRLW
      DEF .RLW. 
      JSB CNUMD     CONVERT SUB-TOTAL OF # RLMS 
      DEF *+3 
      DEF NRLM
      DEF .RLM. 
      JSB CNUMD     CONVERT SUB-TOTAL OF # STOPS
      DEF *+3 
      DEF NSTOP 
      DEF .STP. 
      JSB PRINT     PRINT SUB-TOTALS
      DEF SUBM1 
      DEF SUB1L 
* 
* 
*     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 BY SUBROUTINE 'TMVAL' 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.
* 
      JSB TMVAL     CONVERT SAMPLING TIME TO 5 INTEGERS 
      DEF *+3 
      DEF BTIME 
@PTRT DEF PBUFR     STORE 5 INTEGERS IN PARSE BUFFER
*     SET UP CONVERSION LOOP
      LDA M4         CONVERT 4 ITEMS
      STA CNTR
      LDA @PTRT      SET UP TIME-OF-DAY POINTER TO
      ADA D3            "HOURS" WORD
      STA TRLP. 
      LDA @HD4.      SET UP ASCII 
      STA STAT          BUFFER POINTER
* 
TRLUP EQU * 
      JSB KCVT      CONVERT INTEGER TO ASCII
      DEF *+2 
TRLP. NOP           DEF TO TIME-OF-DAY STORED HERE
      STA STAT,I    STORE TWO-CHAR ASCII HERE 
      CCA           ADVANCE TIME-OF-DAY POINTER TO
      ADA TRLP.       NEXT MOST SIGNIFICANT 
      STA TRLP.          ITEM.
      ISZ STAT      BUMP POINTER TO ASCII STORAGE AREA
      LDA COLON     STORE A COLON TO SEPARATE DATA ITEMS
      STA STAT,I
      ISZ STAT
      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 STAT
      LDB ASC0
      STB A,I 
* 
      LDA TRACN     COMPUTE ADDRESS OF OLDEST 
      ADA @TRAC       TRACE ENTRY 
      STA TRACN 
      LDA NDFLG     HAS THE "LOGGED AT NODE#" BEEN
      SSA              PRINTED YET? 
      JMP TRC6      YES, SKIP PRINTING
      CCA           NO, CLEAR THE FLAG
      STA NDFLG 
      JSB CNUMD     CONVERT NUMBER
      DEF *+3          OF THE NODE
      DEF NODE#         DOING THE LOGGING 
      DEF .NOD.           TO ASCII
      JSB PRINT 
      DEF HED6
      DEF HED6L 
* 
TRC6  EQU * 
      JSB CNUMD     CONVERT PASS NUMBER 
      DEF *+3 
      DEF NPASS 
      DEF .PAS. 
      LDA @BLNK     LOAD ADDRESS OF BLANKS
      LDB DVFLG     IS PRINT
      SSB,RSS         DEVICE A TERMINAL?
      JMP TRC.8     NO. 
      LDB LSTPS     LOAD LAST PASS NUMBER 
      LDA @IVDO     LOAD ADDRESS OF "INVERSE VIDEO" SET-UP
      CPB NPASS     ARE WE ON THE SAME PASS AS BEFORE?
      LDA @BVDO     YES, LOAD BLACK VIDEO SET-UP ADDRESS
      INB           ARE WE ON THE VERY NEXT PASS? 
      CPB NPASS     ??
      LDA @BVDO     YES, LOAD BLACK VIDEO SET-UP
TRC.8 EQU * 
      LDB @DPEN     LOAD DESTINATION ADDRESS
      MVW D2        MOVE SET-UP TO BUFFER 
      JSB PRINT 
@DPEN DEF HED4
      DEF HED4L 
      LDA NPASS     LOAD PASS NUMBER
      STA LSTPS     STORE FOR CHECK NEXT TIME.
* 
TRC.9 EQU * 
      LDA @TRAC     LOAD ADDRESS OF TRACE BUFFER
      STA PNTR
      LDA TRACZ     LOAD TRACE SIZE 
      LDA NOBSV     LOAD # 'TRACE' ENTRIES
      CMA,INA       FORM COUNTER
      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
      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 @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
* 
*     STORE EITHER BLANKS IN FIRST CHARS, OR
*     A RIGHT ARROW (->) IF THIS IS THE OLDEST ENTRY. 
* 
      LDB BLANK     LOAD BLANKS 
      STB PBUF+4
      LDA PNTR
      CPA TRACN     OLDEST? 
      LDB RAROW     YES, LOAD RIGHT ARROW (->)
      STB PBUF      STORE IN PRINT BUFFER 
      ISZ PNTR      BUMP TO 2ND WORD OF ENTRY 
      LDB =AX       LOAD 'TRANSMIT' IDENTIFYING CODE
      LDA PNTR,I    GET 2ND DATA ITEM (EVENT) 
      STA WORD      SAVE IT FOR LATER.
      SSA           RECEIVE?
      LDB =AR       YES, LOAD 'RECEIVE' IDENTIFIER
      SLA           TIME-OUT OCCUR? 
      ADB =B76      YES, MAKE 2ND CHAR UP-ARROW (^) 
      STB PBUF+1    STORE IDENTIFIER IN BUFFER
      RAL,CLE,ERA   REMOVE SIGN BIT 
      ARS           AND ISOLATE EVENT/STATE FIELD 
      STA STAT      SAVE FOR A FEW LINES... 
      ISZ PNTR      MOVE POINTER TO THIRD WORD OF ENTRY 
      LDA EQTA      CONVERT 
      CMA,INA         EQT 
      ADA PNTR,I       ADDRESS
      CLB               TO
      DIV NWEQT          AN 
      INA                 EQT 
      STA TEMP             NUMBER 
      JSB CNUMD     CONVERT EQT NUMBER TO DECIMAL 
      DEF *+3 
      DEF TEMP
      DEF PBUF+9    CONVERSION STORAGE
* 
*     NOW OVERLAY PART OF THE EQT NUMBER (IT'S MOSTLY LEADING 
*     BLANKS ANYWAY) WITH THE -STATE- NUMBER
* 
      JSB KCVT
      DEF *+2 
      DEF STAT      STATE 
      LDB BLANK       STORE IN BUFFER 
      RRR 8             WITH BLANKS ON
      DST PBUF+8            EACH SIDE.
      ISZ PNTR      BUMP POINTER TO 4RTH WORD OF ENTRY
      JSB CNUMD     CONVERT TIME-OF-DAY AT WHICH ENTRY
      DEF *+3         WAS MADE
      DEF PNTR,I
      DEF PBUF+13 
* 
*     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. 
      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     REST PRINT-LINE BUFFER
      STA BFPTR        POINTER
      JMP RESET,I 
      SKP 
*     HERE WHEN 'BREAK' FLAG IS SET 
* 
* 
*     WE CLEAR TRACE MODE & RELEASE RESOURCES.
* 
EXIT  EQU * 
      LDA LINK
      IOR =B700 
      STA ICNWD 
      JSB EXEC      ISSUE "DISABLE TRACE MODE" CALL TO DRIVER 
      DEF *+3 
      DEF D3
      DEF ICNWD 
* 
      LDA #TRCL     DO WE HAVE A CLASS
      SZA,RSS          NUMBER ALLOCATED?
      JMP EXIT3     NO, SKIP DE-ALLOCATION. 
      AND =B17777     CLEAR "DO NOT DE-ALLOCATE BUFFER" 
      IOR =B100000    & SET "NO WAIT" BIT 
      STA #TRCL 
      JSB GET       RELEASE CLASS BUFFER. 
      JSB GET       RELEASE CLASS NUMBER. 
      CLA           CLEAR STORAGE IN 'RES'
      STA #TRCL 
EXIT3 EQU * 
      JSB CLOSE 
      DEF *+2 
      DEF DCB 
      LDA #TRCN     DO WE HAVE A RESOURCE 
      SZA,RSS          NUMBER ALLOCATED?
      JMP EXIT4     NO, SKIP DE-ALLOCATION
      JSB RNRQ
      DEF *+4 
      DEF UNLKI 
      DEF #TRCN 
      DEF STAT
      NOP 
      CLA 
      STA #TRCN 
EXIT4 EQU * 
      JSB CNUMD     CONVERT # PASSES
      DEF *+3 
      DEF NPASS 
      DEF ENCNT 
      JSB CNUMD     CONVERT TOTAL # RCS 
      DEF *+3 
      DEF NRC 
      DEF .RC.
      JSB CNUMD     CONVERT TOTAL NUMBER OF RLWS
      DEF *+3 
      DEF TRLW
      DEF .RLW. 
      JSB CNUMD     CONVERT TOTAL NUMBER OF RLMS
      DEF *+3 
      DEF TRLM
      DEF .RLM. 
      JSB CNUMD     CONVERT TOTAL NUMBER OF STOPS 
      DEF *+3 
      DEF TSTOP 
      DEF .STP. 
      JSB PRINT     PRINT TERMINATION MESSAGE 
      DEF ENMSG 
      DEF ENMSL 
      JSB EXEC      TERMINATE 
      DEF *+2 
      DEF D6
      SPC 2 
*     SUBROUTINE TO PRINT SUB-TOTALS FOR
*     NUMBER OF ABNORMAL PROTOCOL ERRORS OBSERVED 
* 
SUBTL NOP 
      JSB CNUMD     CONVERT # OF PASSES 
      DEF *+3 
      DEF BUFFR        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 PRINT     PRINT SUBTOTALS 
      DEF SUBMS 
      DEF SUBML 
      JMP SUBTL,I   RETURN
      SKP 
*     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!
      DLD FNAME     MOVE FILE NAME TO "TRACE INPUT=...."
      DST .LU.
      LDA FNAME+2 
      STA .LU.+2
      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
      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 TO USE FOR 
*     OUTPUTTING RAW TRACE BUFFERS. 
* 
GFILE EQU * 
      LDA LUTTY     SET PRINT LU = TTY
      STA LUPRN 
      STA WRFIL     SET "WRITE TRACE DATA TO FILE" FLAG 
      JSB EXEC      ASK FOR FILE <NAMR> 
      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 FSIZE     LOAD # RECORDS SPECIFIED. 
      SZA,RSS       DID HE FORGET TO SPECIFY? 
      LDA D20       DEFAULT TO 20 RECORDS 
      STA FSIZE 
      CMA,INA         SPECIFIED # RECORDS 
      SSA,RSS           > 0?
      JMP BAD1      NO. 
* 
*                   NOW CREATE THE FILE 
* 
      JSB CREAT 
      DEF *+8 
      DEF DCB 
      DEF ERR 
      DEF FNAME 
      DEF FSIZE 
      DEF D1        FILE TYPE IS 1
      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 * 
      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 & SHARED
      DEF SCODE 
      DEF CRTG
      SSA           ERROR?
      JMP FIERR     YES, PRINT ERROR & QUIT.
      JMP TRCC1     NO, WE'RE IN BUSINESS!
      SPC 2 
*     HERE TO LOG DATA TO A DISC FILE 
* 
WRDTA EQU * 
WRDT1 JSB WRITF 
      DEF *+5 
      DEF DCB 
      DEF ERR 
      DEF BTIME 
      DEF FWSIZ 
      SSA,RSS       ERROR?
      JMP REDTA     NO, GO GET NEXT RECORD
      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 "/TRC65: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 WRDT1       WRITE THE DATA
      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. 
      SPC 2 
* 
*     SUBROUTINE TO ISSUE A "GET" UPON ASSIGNED I/O CLASS NUMBER. 
* 
GET   NOP 
      JSB EXEC
      DEF *+6 
      DEF D21N
      DEF #TRCL 
      DEF BUFFR 
      DEF TRACZ 
      DEF TEMP
      NOP           IGNORE ERRORS 
      JMP GET,I 
      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 EXEC      PRINT LINE
      DEF *+5 
      DEF D2
      DEF LUPRN 
@@    NOP           ADDRESS OF BUFFER STORED HERE 
      NOP           ADDRESS OF LENGTH STORED HERE 
      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 EXEC      GET DEVICE STATUS 
      DEF *+6 
      DEF D13 
      DEF DLU 
      DEF EQT5
      DEF EQT4      DUMMY PARAMETER 
      DEF LUTYP     LU & SUBCHANNEL STORED HERE 
      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
      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 @TRAC 
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 
      SPC 2 
*     DATA BUFFERS AND CONSTANTS
* 
M20   DEC -20 
M12   DEC -12 
M4    DEC -4
M2    DEC -2
D0    DEC 0 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
B22   OCT 22
UNLKI OCT 40044     UNLOCK RN & RELEASE IT, NO-ABORT
D12   DEC 12
D13   DEC 13
D20   DEC 20
D22   DEC 22
D122  DEC 122 
D128  DEC 128 
B200  EQU D128
D21N  OCT 100025    CLASS 'GET', NO ABORT 
      SKP 
HED1  ASC 16,DVA65 TRACE PROGRAM REV 1-22-79
HED1L ABS *-HED1
HED2  ASC 7,TRACE INPUT=
.LU.  BSS 3         TRACE LU OR FILE NAME STORED HERE 
HED2L ABS *-HED2
HED3  ASC 20,---------------------------------------- 
      ASC 15,------------------------------ 
HED3L ABS *-HED3
HED4  EQU * 
      ASC 2,       STORE DISPLAY ENHANCEMENT HERE 
      ASC 2,REC#
.REC. ASC 3,       STORE CONVERTED ASCII RECORD # HERE
      ASC 3,,PASS#
.PAS. BSS 3 
      ASC 3,,TIME:
HED4$ ASC 9,
HED4L ABS *-HED4
@HD4. DEF HED4$ 
HED5  ASC 16,NXRX MNEM DATA STATE EQT#  TICK# 
      ASC 1,
      ASC 16,NXRX MNEM DATA STATE EQT#  TICK# 
HED5L ABS *-HED5
HED6  ASC 8,LOGGED AT NODE #
.NOD. BSS 3         ASCII STORAGE FOR NODE # WHERE LOGGED 
HED6L ABS *-HED6
* 
BADMS ASC  8,ILLEGAL RESPONSE 
BADML ABS *-BADMS 
* 
ENMSG ASC 5,TRC65:END 
SUBMS EQU * 
ENCNT ASC 3,        STORAGE # OF PASSES LOGGED HERE 
      ASC 7, RECS LOGGED, 
SUBM1 EQU * 
.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
ENMSL ABS *-ENMSG 
SUBML ABS *-SUBMS-1 
SUB1L ABS *-SUBM1-2 
* 
MESG2 ASC 6,FILE <NAMR>?
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,/TRC65:REWINDING FILE
MSG5L ABS *-MESG5 
MSG1  ASC  19,LINK LU, -LU TO TRACE ALL, OR <NAMR>?_
MSG1L ABS *-MSG1
MSG2  ASC 7,CLASS NUMBER =
.CLA. BSS 3 
      ASC 3, RN #=
.RN.  BSS 3 
      ASC 2,(8) 
MSG2L ABS *-MSG2
@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 
* 
*     STATE DESCRIPTIONS
* 
@STAT DEF *+1 
      ASC 24,  DRIVER <STATE> LEGEND: 
      ASC 24,---------------------------------------------- 
      ASC 24,STATE  0:INITIATING READ, SENDING TNW
      ASC 24,STATE  1:WRITING, SENDING RC 
      ASC 24,STATE  2:WRITING, SENT RC, EXPECT TNW
      ASC 24,STATE  3:WRITING, SENDING DATA LENGTH
      ASC 24,STATE  4:WRITING, SENT DATA LNTH, EXPECT ECHO
      ASC 24,STATE  5:WRITING, SENDING REQUEST LENGTH 
      ASC 24,STATE  6:WRITING, SENT REQ. LNTH, EXPECT ECHO
      ASC 24,STATE  7:WRITE RETRY 
      ASC 24,STATE  8:WRITE PREAMBLE FAILURE--RETRY 
      ASC 24,STATE  9:YIELD FOR SIMULTANEOUS REQUEST
      ASC 24,STATE 10:WRITING, SENDING TNW, EXPECT TNW
      ASC 24,STATE 11:PERFORMING WRITE RETRY
      ASC 24,STATE 12:FIRST INTERRUPT IN LSTEN MODE, EXP.RC 
      ASC 24,STATE 13:GOT 'RC', SEND 'TNW', EXP. DATA LEN 
      ASC 24,STATE 14:RECEIVING, EXPECTING DATA LENGTH
      ASC 24,STATE 15:ECHOING DATA LENGTH, EXPECT REQ. LNTH 
      ASC 24,STATE 16:RECEIVING, EXPECTING REQ. LNTH
      ASC 24,STATE 17:QUEUE BUSY, SENDING 'STOP'
      ASC 24,STATE 18:REQUEST TO SEND 'STOP'
      ASC 24,STATE 19:READ RQST, ECHOING RQST LNTH
      ASC 24,STATE 20:READ RQST, CHECKING RESPONSE
      ASC 24,STATE 21:BLOCK HAS BEEN READ, WAITING FOR TNW
      ASC 24,STATE 22:BLOCK READ BUT LAST CTRL UNREC
      ASC 24,STATE 23:CHECKING RESPONSE TO RLW
      ASC 24,STATE 24:'STOP' RECEIVED DURING XMIT--ABORT
      ASC 24,STATE 25:PARITY ERROR(READ OR WRITE) 
      ASC 24,STATE 26:PROTOCOL FAILURE
      ASC 24,STATE 27:TIME-OUT OCCURRED-END OF RQST 
      ASC 24,STATE 28:SIMULTANEOUS REQUEST RETRY
      ASC 24,STATE 29:SEND 'STOP' AS 'LISTEN MODE' REJECT 
      ASC 24,STATE 30:POWER FAILED! 
BLANK ASC 24, 
      ASC 24, -> SHOWS OLDEST ENTRY.  ^  INDICATES TIME-OUT 
      ASC 24, R  INDICATES RECEIVE,   X  INDICATES TRANSMIT 
@@END DEF *         SIGNIFIES END OF LEGEND.
@@HED DEC 24        # WORDS IN EACH <STATE> EXPLANATION 
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" 
NDFLG NOP           FLAG: 0 UNTIL SOURCE NODE # FOR TRACE IS PRINTED
SKPFL NOP          FLAG:0 IF WE SKIPPED THE LAST RECORD 
WRFIL NOP           FLAG FOR "STORE DATA IN FILE" 
LEN   NOP           FILE LENGTH 
NOBSV NOP 
NCNTR NOP 
FREC  NOP           FIRST RECORD NUMBER 
LREC  NOP           LAST RECORD NUMBER
LSTPS NOP           STORAGE FOR LAST PASS NUMBER
ICNWD NOP 
NPNTR NOP 
NSTOP NOP           COUNTER OF NUMBER OF 'STOPS' SEEN THIS PASS 
NRLW  NOP             "     "    "    "   'RLW'S "      "    "
NRLM  NOP             "     "    "    "   'RLM'S "      "    "
NRC   NOP             "     "    "    "   'RC'S  "      "    "
TRLW  NOP           COUNTER OF TOTAL NUMBER OF RLWS SEEN
TRLM  NOP              "    "    "     "    "  RLMS  "
TSTOP NOP              "    "    "     "    "  STOPS "
NTENT EQU D4        # WORDS PER TRACE TABLE ENTRY 
NWEQT DEC 15        NUMBER OF WORDS PER EQT 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'
ALL   ASC 3,(ALL) 
@ALL  DEF ALL 
ASC0  ASC 1,0 
COLON ASC 1,:       ASCII COLON (:) 
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 * 
TEMP  NOP 
PBUFR BSS 10
FNAME EQU PBUFR 
SCODE EQU PBUFR+4 
CRTG  EQU PBUFR+5 
FSIZE EQU PBUFR+7 
ICODE NOP 
TROPT NOP 
EQT5  NOP 
EQT4  NOP 
LUTYP NOP 
WORD  NOP 
@PBUF DEF PBUF
@PBF0 DEF PBUF0 
TRMLN ABS PBUFX-PBUF0 
PBUFL ABS PBUFX-PBUF
IVDEO ASC 2,&dB         INVERSE VIDEO SETUP. 
BVDEO ASC 2,&d@           BLACK-VIDEO SETUP. 
@BVDO DEF BVDEO 
@IVDO DEF IVDEO 
@BLNK DEF BLANK 
DVFLG NOP           FLAG:-1 IF PRINTER IS TERMINAL, ELSE 0
DCB   BSS 144 
BUFF  BSS 48
PRAMS BSS 5 
LUTTY EQU PRAMS 
LUPRN EQU PRAMS+1 
MODE  EQU PRAMS+2 
STAT  NOP 
NPRNT NOP 
RAROW ASC 1,->      RIGHT ARROW 
CNTR  NOP 
RECN  NOP          RECORD NUMBER COUNTER
NCHAR NOP 
LINK  NOP 
@TRAC DEF BUFFR+2   ADDRESS OF TRACE TABLE
.SIZE EQU 170       SIZE OF TRACE BUFFER
TRACZ ABS .SIZE     STORAGE FOR SIZE OF TRACE BUFFER
BTIME BSS 2         DOUBLE-WORD TIME-OF-DAY STORAGE 
NODE# BSS 1         STORE NODE NUMBER HERE WHEN WRITING/READING 
BUFFR BSS .SIZE     TRACE BUFFER
FWSIZ ABS *-BTIME 
NPASS EQU BUFFR     PASS COUNTER
TRACN EQU BUFFR+1 
* 
* 
A     EQU 0 
B     EQU 1 
EQTA  EQU 1650B 
      SPC 2 
ERR   NOP 
..... EQU *         SEE HOW BIG IT IS 
      END TRC65 
                                                                                                                                                                              