.TITLE RSTTRC - TRACE ROUTINE FOR RST TASK .IDENT /X01.01/ ;* ;* LAST EDIT: WOLERY 30 APR 80 ;+ ; COPYRIGHT (C) 1979, 1980 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; MODULE DESCRIPTION - ; ; RST TRACE ROUTINES ; ; THESE ROUTINES WRITE INTO A FILE MESSAGES TRANSMITTED ; AND RECEIVED BY THE RST TASK. TO ENABLE TRACING, ; THE TRACE LUN MUST BE ASSIGNED TO A DEVICE IN THE ; TASKBUILD FILE; IF ASSIGNED TO A TERMINAL, MESSAGE ; LINES WILL BE WRITTEN TO THE TERMINAL. ; ; THE TRANSMITTED CONFIGURATION MESSAGE IS CANNED, AND ; SO IS NOT RECORDED, BUT ALL MESSAGES AFTER THAT ARE. ; A NEW VERSION LEVEL OF THE TRACE FILE WILL BE CREATED ; EACH TIME THE PROGRAM IS RUN. ;+ .SBTTL MACRO CALLS AND LOCAL DATA .MCALL FDBDF$,FDAT$A,FDRC$A,FDBK$A,FDOP$A,FDBF$A .MCALL NMBLK$,FSRSZ$,FINIT$ .MCALL OFNB$,CLOSE$,PUT$ .MCALL FDOF$L,NBOF$L FDOF$L ;DEFINE FDB OFFSETS NBOF$L ;DEFINE NAMEBLOCK OFFSETS .PSECT $$TRC ; ; $TRLUN MUST BE GLOBALLY DEFINED IN TASKBUILD FILE ; AND MAY BE ASSIGNED TO A DEVICE ; ; "GBLDEF=$TRLUN:6" ; "ASG=TI:6" OR "ASG=DB0:6" ; ; ALSO, THE LOGICAL DEVICE "TR" MUST BE ASSIGNED TO ; SOME PHYSICAL DEVICE VIA MCR, EG: ; ; ASN DB0:=TR:/GBL ; FSRSZ$ 1 ; INITIALIZE FILE STORAGE REGION ; (TRACE FILE IS ONLY ONE USED) ; TRCFDB::FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A ,TRCBUF FDOP$A ,,,FO.WRT ; ; THE NAME BLOCK TO BE USED ; TRCNAM::NMBLK$ RSTTRACE,DMP,,TR ; TRCBUF::.BLKB 132. ;DATA FOR OUTPUT ; ; DEFINE THE AMOUNT OF MESSAGE DATA TO BE TRACED ; TRBYTE==16. ;MAX MSG OUTPUT - LINE LENGTH IN BYTES TRLINE==5. ;MAX MSG OUTPUT - NUMBER OF LINES ; ; DEFINE COUNTERS FOR MESSAGE DATA TRACED ; TRCLEN::.WORD 0 ;NO. BYTES OF MSG LEFT TO OUTPUT TRCLIN::.WORD 0 ;NO. LINES OF MSG LEFT TO OUTPUT .SBTTL TEXT TO BE STORED FOR OUTPUT ;+ ; STRING TO INDICATE A RECEIVED MESSAGE ;- ; RCVSTR: .ASCIZ /<----- / ;+ ; STRING TO INDICATE A TRANSMITTED MESSAGE ;- ; XMTSTR: .ASCIZ /-----> / ;+ ; MESSAGE TYPE TABLE ;- ; .EVEN MSGTAB::.WORD MSGERR ; NO SUCH MSG .WORD CONFIG ; CONFIGURATION MESSAGE .WORD CONTRL ; CONTROL MESSAGE .WORD UNSSUP ; UNSUPPORTED MESSAGE .WORD CONTIN ; CONTINUE MESSAGE .WORD DATA ; DATA MESSAGE .WORD MSGERR ; NO SUCH MSG .WORD MSGERR ; NO SUCH MSG ;+ ; TYPE STRINGS ;- ; CONFIG: .ASCIZ /CNF/ ; CONFIGURATION MESSAGE CONTRL: .ASCIZ /CTL/ ; CONTROL MESSAGE UNSSUP: .ASCIZ /UNS/ ; UNSUPPORTED MESSAGE CONTIN: .ASCIZ /CONT/ ; CONTINUE MESSAGE DATA: .ASCIZ /DATA/ ; DATA MESSAGE MSGERR: .ASCIZ /???/ ; NO SUCH MESSAGE TYPE .EVEN .SBTTL TRCINI - OPEN TRACE OUTPUT ;+ ; ; ; IF THE TRACE OUTPUT IS NOT ALREADY OPEN, OPEN THE TRACE OUTPUT ; AND IGNORE ANY OPEN ERRORS. ;- ; OUTPUTS: ; 'C' CLEAR - THIS ROUTINE ALWAYS RETURNS A SUCCESS STATUS ; TRCINI:: CALL $SAVAL ; SAVE ALL REGISTERS ON ENTRY FINIT$ ; INITIALIZE FILE STORAGE REGION MOV #TRCFDB,R0 ; POINT TO THE FDB TO USE TST F.FNB+N.FID(R0) ; IS THIS FILE ALREADY OPEN? BNE 20$ ; IF NE, YES MOVB #$TRLUN,F.LUN(R0) ; SET UP LUN TO USE MOV #TRCNAM,R1 ; POINT TO THE NAME BLOCK CALL .GTDID ; FILL IN DEFAULT DIRECTORY ID MOV #TRCFDB+F.FNB,R2; POINT TO DESTINATION IN FDB MOV #S.FNBW,R3 ; SIZE (IN WORDS) 10$: MOV (R1)+,(R2)+ ; COPY FNB INTO FDB DEC R3 ; ... BNE 10$ ; ... OFNB$ ; OPEN THE FILE 20$: CLC ; ALWAYS RETURN SUCCESS RETURN .SBTTL TRCCLS - CLOSE TRACE OUTPUT ;+ ; ; ; CLOSE THE TRACE OUTPUT. ;- ; TRCCLS:: CALL $SAVAL ; SAVE ALL REGISTERS ON ENTRY CLOSE$ #TRCFDB ; CLOSE THE FILE 100$: RETURN .SBTTL TRCRCV - TRACE RECEIVED MESSAGE ;+ ; ; ; IF THE TRACE OUTPUT IS OPEN, TRACE THE MESSAGE JUST RECEIVED. ;- ; INPUTS: ; R0 = POINTER TO MESSAGE ; TRCRCV:: CALL $SAVAL ; SAVE ALL REGISTERS ON ENTRY TST TRCFDB+F.FNB+N.FID BEQ 100$ ; IF EQ, FILE NOT OPEN MOV #TRCBUF,R4 ; POINT TO THE TRACE BUFFER MOV #RCVSTR,R2 ; POINT TO RECEIVED MESSAGE INDICATOR 10$: MOVB (R2)+,(R4)+ ; STORE MESSAGE ARROW BNE 10$ ; IF EQ, END OF STRING DEC R4 ; BACK UP POINTER OVER ZERO CALL PRTYPE ; OUTPUT MESSAGE TYPE AND LENGTH MOV #TRLINE,TRCLIN ; INITIALIZE COUNT OF LINES TO OUTPUT 50$: CALL PRMSG ; OUTPUT TEXT OF MESSAGE MOV R0,R5 ; SAVE CURRENT MESSAGE BUFFER POINTER MOV R4,R1 ; COPY OUTPUT BUFFER POINTER SUB #TRCBUF,R1 ; FIND LENGTH OF RECORD PUT$ #TRCFDB,,R1 ; OUTPUT THE RECORD TST TRCLEN ; ANY MESSAGE BYTES LEFT TO PRINT? BEQ 100$ ; IF EQ, ALL WERE PRINTED DEC TRCLIN ; DECREMENT COUNT OF LINES PRINTED BEQ 100$ ; IF EQ, ENOUGH OUTPUT ALREADY MOV #TRCBUF,R4 ; POINT TO START OF TRACE BUFFER MOVB #11,(R4)+ ; TAB BEFORE START OF DATA MOVB #11,(R4)+ ; AGAIN MOV R5,R0 ; RESTORE POINTER TO REST OF MESSAGE BR 50$ ; GO SET UP REST OF MESSAGE FOR PRINTING 100$: RETURN .SBTTL TRCXMT - TRACE TRANSMITTED MESSAGE ;+ ; ; ; IF THE TRACE OUTPUT IS OPEN, TRACE THE MESSAGE WE ARE JUST ; ABOUT TO TRANSMIT. ;- ; INPUTS: ; R0 - POINTER TO MESSAGE BUFFER ; TRCXMT:: CALL $SAVAL ; SAVE ALL REGISTERS ON ENTRY TST TRCFDB+F.FNB+N.FID BEQ 100$ ; IF EQ, FILE NOT OPEN MOV #TRCBUF,R4 ; POINT TO THE TRACE BUFFER MOV #XMTSTR,R3 ; POINT TO TRANSMITTED MESSAGE HEADER 10$: MOVB (R3)+,(R4)+ ; COPY MESSAGE HEADER BNE 10$ ; ASCIZ STRING TSTB -(R4) ; BACK UP POINTER CALL PRTYPE ; OUTPUT THE MESSAGE TYPE AND LENGTH MOV #TRLINE,TRCLIN ; INITIALIZE COUNT OF LINES TO OUTPUT 50$: CALL PRMSG ; DUMP FIRST BYTES OF MESSAGE MOV R0,R5 ; SAVE CURRENT MESSAGE BUFFER POINTER MOV R4,R1 ; COPY OUTPUT BUFFER POINTER SUB #TRCBUF,R1 ; FIND LENGTH OF RECORD PUT$ #TRCFDB,,R1 ; OUTPUT THE RECORD TST TRCLEN ; ANY MESSAGE BYTES LEFT TO PRINT? BEQ 100$ ; IF EQ, ALL WERE PRINTED DEC TRCLIN ; DECREMENT COUNT OF LINES PRINTED BEQ 100$ ; IF EQ, ENOUGH OUTPUT ALREADY MOV #TRCBUF,R4 ; POINT TO START OF TRACE BUFFER MOVB #11,(R4)+ ; TAB BEFORE START OF DATA MOVB #11,(R4)+ ; AGAIN MOV R5,R0 ; RESTORE POINTER TO REST OF MESSAGE BR 50$ ; GO SET UP REST OF MESSAGE FOR PRINTING 100$: RETURN .SBTTL PRTYPE - PLANT MESSAGE TYPE AND LENGTH IN TRACE BUFFER ;+ ; **-PRTYPE-PLANT MESSAGE TYPE AND LENGTH IN TRACE BUFFER ; ; PLANT A CHARACTER STRING DESCRIBING THE MESSAGE TYPE INTO THE ; TRACE BUFFER, AND CONVERT THE LENGTH TO OCTAL AND PLANT THAT. ;- ; INPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN TRACE BUFFER ; R0 - POINTER TO MESSAGE TYPE BYTE IN MESSAGE ; ; OUTPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN TRACE BUFFER ; R0 - MOVED PAST MESSAGE TYPE AND LENGTH FIELDS ; R1, R3 - CORRUPTED ; TRCLEN = NO. BYTES IN MESSAGE AFTER HEADER ; PRTYPE:: MOVB (R0)+,R3 ; GET THE MESSAGE TYPE BIC #177770,R3 ; ELIMINATE ILLEGAL TYPES ASL R3 ; FORM WORD OFFSET MOV MSGTAB(R3),R3 ; GET POINTER TO TYPE STRING 10$: MOVB (R3)+,(R4)+ ; COPY MESSAGE BNE 10$ ; ASCIZ STRING MOVB #' ,-1(R4) ; TERMINATE WITH SPACE MOVB (R0)+,R2 ; GET LOW-ORDER BYTE OF MESSAGE LENGTH BIC #177400,R2 ; CLEAR TO ELIMINATE SIGN PROPAGATION SWAB R2 ; SWAP TO HIGH-ORDER BYTE BISB (R0)+,R2 ; OR IN THE HIGH-ORDER BYTE OF MESSAGE LENGTH SWAB R2 ; NOW R2 HAS CORRECT LENGTH MOV R2,R5 ; COPY MESSAGE LENGTH MOV R2,TRCLEN ; SAVE MESSAGE LENGTH SUB #3,TRCLEN ; LESS TYPE AND LENGTH FIELDS BIC #177400,R2 ; CLEAR OTHER HALF OF LENGTH WORD CALL PROCT ; OUTPUT LOW-ORDER BYTE OF MESSAGE LENGTH MOV R5,R2 ; RESTORE FULL MESSAGE LENGTH SWAB R2 ; GET HIGH-ORDER BYTE BIC #177400,R2 ; CLEAR OTHER HALF OF LENGTH WORD CALL PROCT ; OUTPUT HIGH-ORDER BYTE OF MESSAGE LENGTH RETURN .SBTTL PROCT - OUTPUT BYTE IN BINARY ;+ ; ; ; OUTPUT THE CONTENTS OF A BYTE IN BINARY TO THE TRACE BUFFER. ;- ; INPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN TRACE BUFFER ; R2 - BYTE TO BE CONVERTED ; ; OUTPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN TRACE BUFFER ; R2 - CORRUPTED ; PROCT:: MOV R1,-(SP) ; SAVE WORK REGISTER MOV R0,-(SP) ; SAVE REG MOV R2,R1 ; COPY VALUE TO CONVERT MOV R4,R0 ; COPY POINTER TO TRACE BUFFER CLR R2 ; PERFORM ZERO SUPPRESSION CALL $CBTMG ; CONVERT BYTE TO BINARY MAGNITUDE MOV R0,R4 ; RESTORE POINTER TO TRACE BUFFER MOVB #' ,(R4)+ ; TERMINATE WITH SPACE MOV (SP)+,R0 ; RESTORE REG MOV (SP)+,R1 ; RESTORE REG RETURN ; .SBTTL PRMSG - OUTPUT FIRST BYTES OF MESSAGE ;+ ; ; ; OUTPUT THE FIRST N (OR LESS) BYTES OF THE MESSAGE TO THE TRACE ; BUFFER. ;- ; INPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN THE TRACE BUFFER ; R0 - POINTER TO NEXT BYTE OF MESSAGE ; TRCLEN - # OF BYTES IN THE MESSAGE ; ; OUTPUTS: ; R4 - POINTER TO NEXT FREE BYTE IN THE TRACE BUFFER ; R0 - POINTER TO NEXT BYTE OF MESSAGE ; TRCLEN - NUMBER OF BYTES LEFT TO PRINT ;- PRMSG:: MOV TRCLEN,R1 ; GET MESSAGE LENGTH CLR TRCLEN ; ASSUME WE'LL PRINT IT ALL CLR R3 ; INITIALIZE BYTE COUNT LEFT TO PRINT CMP R1,#TRBYTE ; IS MESSAGE LONGER THAN MAX TRACE LENGTH? BLOS 10$ ; IF LOS, NO MOV R1,R3 ; SAVE TOTAL BYTE COUNT MOV #TRBYTE,R1 ; PRINT ONLY MAX TRACE LENGTH SUB R1,R3 ; COUNT BYTES THAT WILL BE LEFT AFTERWARD MOV R3,TRCLEN ; SAVE COUNT FOR NEXT ROUND 10$: TST R1 ; ANY DATA BYTES AT ALL? BEQ 30$ ; IF EQ, NO 20$: MOVB (R0)+,R2 ; GET NEXT DATA BYTE CALL PROCT ; OUTPUT IN OCTAL DEC R1 ; REDUCE BYTE COUNT BNE 20$ ; AND LOOP 30$: RETURN .END