Trailing-Edge
-
PDP-10 Archives
-
BB-FP64A-SB_1986
-
10,7/rp20/rnxtrc.mac
There are 4 other files named rnxtrc.mac in the archive. Click here to see a list.
TITLE RNXTRC - TRACE RP20 OPERATIONS
SUBTTL G.M. UHLER/GMU
;THIS PROGRAM INSERTS SNOOP. BREAKPOINTS INTO THE RP20 DISK DRIVER
;(RNXKON) AT SELECTED POINTS TO GATHER DATA ON THE PERFORMANCE
;OF THE RP20. IT IS ALSO VERY USEFUL IN DEBUGGING INTERMITANT BUGS
;SINCE IT GIVES A RECORD OF WHAT HAPPENED. RNXTRC HAS TWO MODES,
;CONTINUOUS LOGGING, AND TERMINATION LOGGING. CONTINUOUS LOGGING
;LOGS ALL OPERATIONS FROM THE TIME THE BREAKPOINTS ARE INSERTED UNTIL
;THE PROGRAM IS TERMINATED. TERMINATION LOGGING ONLY LOGS THE LAST
;N EVENTS THAT OCCURRED PRIOR TO PROGRAM TERMINATION. IT SHOULD BE
;NOTED THAT CONTINUOUS LOGGING CAUSES MASSIVE AMOUNTS OF DATA TO BE
;WRITTEN TO THE LOGGING DEVICE SO CARE SHOULD BE TAKEN. IN EITHER
;MODE, THE RAW BINARY OUTPUT DATA IS WRITTEN TO RNXTRC:RNXTRC.BIN[-].
;A POSTPROCESSOR, RNXPRT, MUST THEN BE RUN TO FORMAT THE DATA INTO
;A FORM READABLE BY HUMANS.
;
;TO RUN RNXTRC, SIMPLY ASSIGN LOGICAL DEVICE RNXTRC AS YOUR FAVORITE
;PHYSICAL DEVICE, RUN THE PROGRAM AND FOLLOW THE DIRECTIONS.
SEARCH JOBDAT,MACTEN,UUOSYM,SNUP
.REQUIRE SNUP
SALL
;COPYRIGHT (C) 1980,1981,1982,1983 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND 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. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
RNTVER==1 ;MAJOR VERSION
RNTMIN==0 ;MINOR VERSION
RNTEDT==5 ;EDIT
RNTWHO==0 ;WHO LAST EDITED
LOC .JBVER
VRSN. (RNT)
RELOC
SUBTTL BREAKPOINT ENTRY FORMATS
ENTLEN==0 ;INITIALIZE MAXIMUM ENTRY SIZE
BPNUM==0 ;AND BREAKPOINT COUNT
;EACH ENTRY IN THE BUFFER CONTAINS THREE COMMON WORDS FOLLOWED BY
;N WORDS SPECIFIC TO EACH BREAKPOINT. ALL ENTRIES ARE THE LENGTH
;OF THE LONGEST ENTRY AND SHORTER ENTRIES SIMPLY IGNORE THE UNUSED
;WORDS. THE COMMON WORDS ARE AS FOLLOWS:
; !=======================================================!
; ! ENTRY TYPE ! SEQUENCE NUMBER !
; !-------------------------------------------------------!
; ! RDTIME VALUE IN MICROSECONDS !
; !-------------------------------------------------------!
; ! CPU NUMBER ! KONTROLLER NUMBER !
; !-------------------------------------------------------!
PHASE 0
BPNTYP:! BLOCK 1 ;TYPE OF ENTRY,,SEQUENCE NUMBER
BPNTIM:! BLOCK 1 ;RDTIME VALUE IN MICROSECONDS
BPNCKU:! BLOCK 1 ;CPU NUMBER,,KONTROLLER NUMBER
BPNHLN:! ;LENGTH OF THE HEADER
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 1 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! DATAO TO CONTROL REGISTER OR STCR !
; !-------------------------------------------------------!
; ! BLOCK ON UNIT !
; !-------------------------------------------------------!
; ! PHYSICAL UNIT NUMBER !
; !=======================================================!
PHASE BPNHLN
BP1DTO:! BLOCK 1 ;DATAO TO THE CONTROL REGISTER OR STCR
BP1BLK:! BLOCK 1 ;BLOCK ON UNIT
BP1UNI:! BLOCK 1 ;PHYSICAL UNIT NUMBER
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 2 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! ASYNCHRONOUS STATUS REGISTER !
; !-------------------------------------------------------!
; ! ENDING STATUS REGISTER ! ERROR REGISTER !
; !-------------------------------------------------------!
; ! CHANNEL STATUS ! CONI !
; !-------------------------------------------------------!
; ! RNXKON FLAGS WORD (P1) !
; !=======================================================!
PHASE BPNHLN
BP2ASY:! BLOCK 1 ;ASYNCHRONOUS STATUS REGISTER
BP2ERG:! BLOCK 1 ;ENDING STATUS,,ERROR REGISTERS
BP2CNI:! BLOCK 1 ;CHANNEL STATUS,,CONI
BP2FLG:! BLOCK 1 ;RNXKON FLAGS WORD (P1)
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 3 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! RNXKON/FILIO COMMUNICATIONS WORD !
; !-------------------------------------------------------!
; ! RNXKON FLAGS WORD (P1) !
; !-------------------------------------------------------!
; ! ENDING STATUS REGISTER ! ERROR REGISTER !
; !-------------------------------------------------------!
; ! CHANNEL STATUS ! CONI !
; !=======================================================!
PHASE BPNHLN
BP3COM:! BLOCK 1 ;RNXKON/FILIO COMMUNICATION WORD (T1)
BP3FLG:! BLOCK 1 ;RNXKON FLAGS WORD (P1)
BP3ERG:! BLOCK 1 ;ENDING STATUS,,ERROR REGISTERS
BP3CNI:! BLOCK 1 ;CHANNEL STATUS,,CONI
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 4 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! FUCTION FOR CURRENT OPERATION !
; !-------------------------------------------------------!
; ! RNXKON FLAGS WORD FOR OPERATION IN PROGRESS !
; !-------------------------------------------------------!
; ! PHYSICAL UNIT NUMBER FOR OPERATION TO BE STARTED !
; !=======================================================!
PHASE BPNHLN
BP4COP:! BLOCK 1 ;FUNCTION FOR CURRENT OPERATION
BP4PFL:! BLOCK 1 ;RNXKON FLAGS WORD FOR OPERATION IN PROGRESS
BP4UNI:! BLOCK 1 ;PHYSICAL UNIT NUMBER
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 5 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! ERROR BITS (KOP???) !
; !-------------------------------------------------------!
; ! CONI !
; !-------------------------------------------------------!
; ! ENDING STATUS REGISTER ! ERROR REGISTER !
; !-------------------------------------------------------!
; ! PHYSICAL UNIT NUMBER !
; !=======================================================!
PHASE BPNHLN
BP5ERB:! BLOCK 1 ;ERROR BITS (KOP???)
BP5CNI:! BLOCK 1 ;CONI
BP5ERG:! BLOCK 1 ;ENDING STATUS REGISTER,,ERROR REGISTER
BP5UNI:! BLOCK 1 ;PHYSICAL UNIT NUMBER
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
;ENTRY OFFSETS SPECIFIC TO BREAKPOINT 6 ARE AS FOLLOWS:
; !-------------------------------------------------------!
; ! CONI !
; !=======================================================!
PHASE BPNHLN
BP6CNI:! BLOCK 1 ;CONI
IFG .-ENTLEN,<ENTLEN==.> ;FIND LARGEST ENTRY
BPNUM==BPNUM+1 ;AND COUNT BREAKPOINTS
DEPHASE
RELOC 0 ;DON'T WASTE THE PHASED SPACE
SUBTTL PARAMETER DEFINITIONS
OPDEF RDTIME[DATAI 020,]
D==1 ;DISK OUTPUT CHANNEL
PDLLEN==20 ;LENGTH OF PDL
BUFLEN==1500*ENTLEN ;LENGTH OF BUFFER
;TABLE GIVING DESCRIPTIONS OF EACH BREAKPOINT
EVDSCP: [ASCIZ/operation initiation at RNXGO/]
[ASCIZ/asynchronous status detected by CHKATN/]
[ASCIZ/interrupt exit in CALFIO/]
[ASCIZ/CONECT calls to CMDWAT/]
[ASCIZ/operation initiation errors at RNXDWN/]
[ASCIZ/hung transfer timeouts at RNXSTP/]
IFN <.-EVDSCP-BPNUM>,<PRINTX ?EVDSCP table length wrong>
;DEFINE REFERENCED SYMBOLS AND BREAKPOINTS
MONREF UNYPUN ;BYTE POINTER TO PHYSICAL UNIT
MONREF UNIBLK ;OFFSET OF BLOCK NUMBER IN UDB
MONREF .CPCPN ;CPU NUMBER ON WHICH WE'RE RUNNING
MONREF KOYKNM ;KONTROLLER NUMBER OF THIS KONTROLLER
;********** DO NOT CHANGE THE ORDER OF THE FOLLOWING LINES **********
DEFINE DEFNBP(N),<
BRKPNT RNXBP'N,BP'N
>
.ZZ==1
REPEAT BPNUM,<
DEFNBP (\.ZZ)
.ZZ==.ZZ+1
>
BRKPNT RNXBPX,BPX
;********** END OF ORDER DEPENDENT CODE **********
SUBTTL MACRO DEFINITIONS
;MACRO TO DO ALL THE SETUP NECESSARY WHEN A SNOOP LEVEL BREAKPOINT
;IS ENTERED. NOTE THAT BREAKPOINT NUMBER ^D99 IS THE SPECIAL SNOOP.
;LEVEL EXIT REQUEST BREAKPOINT.
;INVOCATION: ENTRBP (BREAKPOINT-NUMBER)
;LEAVES %T2 AT -1(%P) AND %T3 AT 0(%P) AND SETS UP %T2 TO POINT TO
;THE BASE OF THE BUFFER ENTRY TO USE.
DEFINE ENTRBP(NUMBER),<
PUSH %P,%T2 ;;SAVE T2
XLIST
PUSH %P,%T3 ;; AND T3
MOVSI %T2,NUMBER ;;TYPE IS INPUT ARGUMENT
IFN NUMBER-^D99,<
SKIPE EVFLAG+NUMBER-1(%R) ;;WANT TO LOG THIS EVENT?
>
PUSHJ %P,SETUP(%R) ;;DO INITIALIZATION
JRST BPRET(%R) ;;DON'T LOG THIS EVENT
LIST
>
;MACRO TO EXIT A SNOOP LEVEL BREAKPOINT.
;INVOCATION: EXITBP
DEFINE EXITBP,<
JRST BPEXIT(%R)
>
SUBTTL PROGRAM SETUP
RNXTRC: JFCL ;NO CCL ENTRY
RESET ;RESET EVERYTHING
MOVE P,[IOWD PDLLEN,PDL] ;SETUP A PDL
OPEN D,[EXP .IOIMG,'RNXTRC',<OBUF,,0>] ;OPEN CHANNEL
JRST NOOPEN ;FAILED
ENTER D,[EXP 'RNXTRC','BIN ',0,0] ;ENTER OUTPUT FILE
JRST NOENTR ;FAILED
OUTBUF D,4 ;SETUP 4 OUTPUT BUFFERS
MTREW. D, ;REWIND POSSIBLE TAPE
MTWAT. D, ;WAIT FOR IT TO FINISH
PUSHJ P,STRTUP ;ASK STARTUP QUESTIONS
MOVEI T1,0 ;GET ARG FOR TRPSET
TRPSET T1, ;GET USRIOT
JRST NOTRPS ;FAILED
MOVEI T1,1 ;SET FOR HPQ 1
HPQ T1, ;MAKE SURE WE RUN
JFCL ;SHOULDN'T HAPPEN
PUSHJ P,GETINF## ;DEFINE THE BREAKPOINTS
SETZM CNT ;ZERO THE SEQUENCE NUMBER
MOVEI T1,BUFLEN ;SETUP INITIAL BUFFER POINTER SO SNOOP
MOVEM T1,BUFPTR ; ROUTINES START AT THE START
CLRBFI ;DON'T ALLOW TYPEAHEAD TO ABORT US
OUTSTR [ASCIZ/
[Type an altmode to exit]
/]
RDTIME STIME ;READ BASE TIME
PUSHJ P,XWRSNP## ;INSERT THE BREAKPOINTS
MOVEI P1,0 ;INITIALIZE BACKGROUND ENTRY COUNT
MOVEI P2,BUFLEN ; AND BUFFER POINTER
SKIPN WINDOW ;WANT CONTINUOUS LOGGING?
JRST WATCH ;NO
;; JRST FOLLOW ;YES, FALL INTO FOLLOW
SUBTTL BACKGROUND TASK -- CONTINUOUS LOGGING
;HERE TO FOLLOW THE SNOOP LEVEL ROUTINE AROUND THE BUFFER, WRITING
;THE DATA TO THE OUTPUT FILE CONTINUOUSLY.
FOLLOW: INCHSL T1 ;GET CHARACTER FROM TTY, SKIP IF GOT ONE
JRST FOLLO1 ;NONE, CHECK BUFFER
CAIE T1,.CHESC ;ESCAPE?
JRST FOLLOW ;NO, TRY AGAIN
CLOSE D, ;CLOSE OUTPUT FILE
REMBRK ;REMOVE BREAKPOINTS
UNDBRK ;UNDEFINE THEM
EXIT ;EXIT
;HERE TO CHECK THE BUFFER TO SEE IF WE SHOULD WRITE ANYTHING TO THE
;OUTPUT FILE.
FOLLO1: CAMGE P1,CNT ;DID WE CATCH UP TO THE MONITOR?
JRST FOLLO2 ;NO, WRITE SOME DATA
MOVEI T1,1 ;HIBER FOR
HIBER T1, ; A TICK
JFCL ;SHOULDN'T HAPPEN
JRST FOLLOW ;AND CHECK CHARACTERS
;HERE WHEN THE MONITOR IS AHEAD OF US TO TRY TO CATCH UP BY WRITING
;DATA TO THE OUTPUT FILE.
FOLLO2: MOVEI T2,ENTLEN ;GET LENGTH OF ENTRY
FOLLO3: PUSHJ P,NXTWRD ;GET NEXT WORD FROM BUFFER
PUSHJ P,WRTWRD ;WRITE IT TO FILE
SOJG T2,FOLLO3 ;LOOP FOR ALL
AOJA P1,FOLLO1 ;INCREMENT COUNT AND GO FOR NEXT
SUBTTL BACKGROUND TASK -- TERMINATION LOGGING
;HERE TO LOG ONLY ON EXIT. THIS MEANS THAT THE MONITOR CONTINUOUSLY
;FILLS THE BUFFER BUT WE DO NOTHING UNTIL THE USER TYPES A CRLF OR
;THE SNOOP. LEVEL EXIT REQUEST BREAKPOINT IS EXECUTED. AT THAT POINT,
;WE WRITE THE CURRENT BUFFER TO THE OUTPUT FILE.
WATCH: SKIPE XITREQ ;HAVE SNOOP. LEVEL EXIT ENABLED?
JRST WATCH2 ;YES, DO IT DIFFERENTLY
WATCH1: INCHWL T1 ;WAIT FOR CHARACTER
CAIE T1,.CHESC ;ESCAPE?
JRST WATCH1 ;NO, WAIT FOR IT
JRST WATCH4 ;GO DO THE EXIT
WATCH2: MOVEI T1,100 ;SLEEP FOR
HIBER T1, ; 100 TICKS
JFCL ;DON'T CARE IF IT FAILED
INCHSL T1 ;CHARACTER AVAILABLE?
SKIPL T1,XITREQ ;NO, DID SNOOP. LEVEL REQUEST EXIT?
CAIN T1,.CHESC ;WAS CHARACTER AN ESCAPE?
CAIA ;YES, TO ONE
JRST WATCH2 ;NO, TRY AGAIN
MOVE T1,XITCNT ;GET ADDITIONAL ENTRIES TO BE SAVED
MOVEM T1,MAXCNT ;STORE FOR SNOOP. LEVEL
WATCH3: SKIPG MAXCNT ;DONE THEM ALL YET?
JRST WATCH4 ;YES
MOVEI T1,5 ;SLEEP FOR 5
HIBER T1, ; TICKS TO LET SNOOP. LEVEL FILL THEM
JFCL ;DON'T CARE
JRST WATCH3 ;CONTINUE WATCHING
WATCH4: REMBRK ;REMOVE BREAKPOINTS
UNDBRK ;UNDEFINE THEM
MOVE P1,CNT ;GET COUNT OF ENTRIES STORED IN BUFFER
JUMPE P1,WATCH6 ;QUIT NOW IF NONE
IMULI P1,ENTLEN ;CONVERT TO WORD COUNT
CAIL P1,BUFLEN ;MORE THAN 1 BUFFER FULL?
MOVEI P1,BUFLEN ;YES, MAKE IT JUST 1 BUFFER
MOVE P2,BUFPTR ;GET MONITOR BUFFER POINTER
SUBI P2,1-ENTLEN(P1) ;BACKUP BY NUMBER OF WORDS WRITTEN
SKIPGE P2 ;OFF THE BEGINNING OF THE BUFFER?
ADDI P2,BUFLEN ;YES, WRAP AROUND TO THE END
WATCH5: PUSHJ P,NXTWRD ;GET NEXT WORD
PUSHJ P,WRTWRD ;WRITE IT TO OUTPUT FILE
SOJG P1,WATCH5 ;DO THEM ALL
WATCH6: CLOSE D, ;CLOSE FILE
EXIT ;AND EXIT
SUBTTL INITIALIZATION ERROR PROCESSING CODE
NOOPEN: OUTSTR [ASCIZ/
?Can't OPEN output channel. Have you assigned logical device RNXTRC?
/]
EXIT
NOENTR: OUTSTR [ASCIZ/
?Can't ENTER output file RNXTRC.BIN[-]
/]
EXIT
NOTRPS: OUTSTR [ASCIZ/
?TRPSET failed. Are you privileged?
/]
EXIT
OUTERR: OUTSTR [ASCIZ/
?Output error writing file
/]
EXIT
SUBTTL SUPPORT SUBROUTINES
;ROUTINE TO UPDATE THE BUFFER TAKER POINTER TO THE NEXT WORD IN THE
;BUFFER AND RETURN THAT WORD TO THE CALLER.
;CALL: P2/CURRENT BUFFER POINTER
; PUSHJ P,NXTWRD
;RETURN+1 ALWAYS WITH:
; P2/UPDATED BUFFER POINTER
; T1/CONTENTS OF BUFFER WORD
NXTWRD: AOS P2 ;INCREMENT BUFFER POINTER
CAIL P2,BUFLEN ;OFF THE END?
MOVEI P2,0 ;YES, RESET IT
MOVE T1,BUFFER(P2) ;GET CONTENTS OF THAT WORD
CPOPJ: POPJ P, ;RETURN
;ROUTINE TO WRITE ONE WORD TO THE OUTPUT FILE.
;CALL: T1/WORD TO WRITE
; PUSHJ P,WRTWRD
;RETURN+1 ALWAYS
WRTWRD: SOSGE OBUF+.BFCTR ;ROOM IN THE BUFFER?
JRST WRTWR1 ;NO, FLUSH IT
IDPB T1,OBUF+.BFPTR ;STORE THE WORD IN THE BUFFER
POPJ P, ;RETURN
WRTWR1: OUT D, ;FLUSH THE BUFFER
JRST WRTWRD ;SUCCESSFUL, WRITE THE WORD
CLOSE D, ;CLOSE THE FILE
JRST OUTERR ;TELL OF ERROR
SUBTTL STARTUP OPTION SELECTION
;ROUTINE TO ASK THE USER FOR THE STARTUP OPTIONS FOR THE PROGRAM AND
;INITIALIZE THE VARIABLES USED BY THE SNOOP LEVEL ROUTINES.
;CALL: PUSHJ P,STRTUP
;RETURN+1 ALWAYS
STRTUP: SETOM BGNONE ;INITIALIZE FIRST VARIABLE
MOVE T1,[BGNONE,,BGNONE+1] ;SETUP FOR BLT
BLT T1,ENDONE ;DEFAULT THEM ALL
OUTSTR [ASCIZ/
RP20 trace program
/]
STRTU1: OUTSTR [ASCIZ/
Select output mode (Termination,Continuous): /]
MOVE T1,[IOWD 2,[EXP 'TERMIN','CONTIN']] ;SETUP LEGAL VALUES
PUSHJ P,GETSIX ;GET HIS ANSWER
JRST STRTU1 ;IT WAS ILLEGAL
MOVEM T1,WINDOW ;STORE
STRTU2: OUTSTR [ASCIZ/Use defaults (Yes,No)? /]
MOVE T1,[IOWD 2,[EXP 'YES ','NO ']] ;SETUP LEGAL VALUES
PUSHJ P,GETSIX ;GET HIS ANSWER
JRST STRTU2 ;IT WAS ILLEGAL
JUMPE T1,STRTU6 ;GO IF HE WANTS TO USE THE DEFAULTS
STRTU3: OUTSTR [ASCIZ/CPU number: /]
PUSHJ P,GETNUM ;GET AN OCTAL NUMBER
JRST STRTU3 ;IT WAS ILLEGAL
MOVEM T1,CPUNUM ;STORE IT
STRTU4: OUTSTR [ASCIZ/Kontroller number: /]
PUSHJ P,GETNUM ;GET AN OCTAL NUMBER
JRST STRTU4 ;IT WAS ILLEGAL
MOVEM T1,KONNUM ;STORE IT
PUSH P,P1 ;SAVE P1
MOVSI P1,-BPNUM ;MAKE AOBJN POINTER TO BREAKPOINT TABLES
STRTU5: OUTSTR [ASCIZ/Log /] ;START OF QUESTION
OUTSTR @EVDSCP(P1) ;TELL WHAT THIS BREAKPOINT IS
OUTSTR [ASCIZ/ (Yes,No)? /] ;WELL?
MOVE T1,[IOWD 2,[EXP 'YES ','NO ']] ;SETUP LEGAL VALUES
PUSHJ P,GETSIX ;GET THE ANSWER
JRST STRTU5 ;GO IF ILLEGAL
SKIPE T1 ;NO TO THIS ONE?
SETZM EVFLAG(P1) ;YES, DISALLOW LOGGING
AOBJN P1,STRTU5 ;LOOP FOR ALL
POP P,P1 ;RESTORE P1
STRTU6: SKIPE WINDOW ;TERMINATION LOGIGNG?
JRST CPOPJ ;NO, DON'T DO RNXBPX BREAKPOINT STUFF
STRTU7: OUTSTR [ASCIZ/Insert SNOOP. level exit breakpoint (No,Yes)? /]
MOVE T1,[IOWD 2,[EXP 'NO ','YES ']] ;SETUP LEGAL VALUES
PUSHJ P,GETSIX ;GET THE ANSWER
JRST STRTU7 ;ILLEGAL
SKIPN T1 ;IF NO,
SOS BRKBEG ; DON'T INSERT RNXBPX BREAKPOINT
JUMPE T1,CPOPJ ;IF YES,
AOS XITREQ ;SET XITREQ TO 1 AS A FLAG
STRTU8: OUTSTR [ASCIZ/Number of additionl entries to record after SNOOP.
level exit request has been detected: /]
PUSHJ P,GETNUM ;GET THE VALUE
JRST STRTU8 ;ILLEGAL
MOVEM T1,XITCNT ;STORE FOR LATER
POPJ P, ;RETURN
;ROUTINE TO READ A SIXBIT ATOM FROM THE COMMAND STRING.
;CALL: T1/IOWD N,ADDR OF VALID SIXBIT ARGS
; PUSHJ P,GETSIX
;RETURN+1 IF ERROR
;RETURN+2 IF VALID ARG TYPED WITH:
; T1/OFFSET IN TABLE OF ANSWER
GETSIX: PUSH P,T1 ;SAVE IOWD TO LEGAL ANSWERS
SETZB T1,T2 ;CLEAR RESULT AND FLAGS
MOVE T4,[POINT 6,T2] ;SETUP BYTE POINTER TO RESULT
GETSI1: PUSHJ P,GETCHR ;GET CHARACTER
JRST GETSI2 ;SAW END OF LINE
CAIL T3," " ;MUST BE A LEGAL
CAILE T3,"_" ; SIXBIT CHARACTER
PJRST GETSI5 ;FLUSH TYPEAHEAD AND RETURN
SUBI T3,"A"-'A' ;CONVERT TO SIXBIT
TLNE T4,(77B5) ;ROOM IN WORD?
IDPB T3,T4 ;YES, STORE IT
SKIPN T1 ;SEEN ANY CHARACTERS YET?
TLOA T1,(77B5) ;NO, SETUP INITIAL MASK WORD
ASH T1,-6 ;SHIFT MASK OVER 6
JRST GETSI1 ;AND LOOP
GETSI2: JUMPE T1,GETSI4 ;GO IF JUST END OF LINE SEEN
MOVE T4,0(P) ;PUT IOWD TO TABLE IN T4
GETSI3: MOVE T3,1(T4) ;GET NEXT LEGAL ARGUMENT
AND T3,T1 ;MASK ONLY THOSE CHARACTERS TYPED
CAME T3,T2 ;MATCH?
AOBJN T4,GETSI3 ;NO, LOOP
JUMPGE T4,GETSI5 ;GO IF NO MATCH FOUND
SUB T4,0(P) ;COMPUTE OFFSET IN TABLE OF MATCH
MOVEI T1,(T4) ;RETURN RESULT IN T1
GETSI4: AOSA -1(P) ;GIVE SKIP RETURN
GETSI5: PUSHJ P,FLSLIN ;CLEAR TYPE AHEAD
POP P,(P) ;FLUSH STACK
POPJ P, ;RETURN
;ROUTINE TO READ AN OCTAL NUMBER FROM THE TERMINAL.
;CALL: PUSHJ P,GETNUM
;RETURN+1 IF ERROR
;RETURN+2 WITH NUMBER WITH:
; T1/NUMBER
GETNUM: SETZB T1,T2 ;T1=RESULT, T2=FLAG
GETNU1: PUSHJ P,GETCHR ;GET NEXT CHARACTER
JRST GETNU2 ;SAW END OF LINE
CAIL T3,"0" ;INSURE THAT IT
CAILE T3,"7" ; IS OCTAL
PJRST FLSLIN ;NOT, CLEAR TYPEAHEAD AND RETURN ERROR
SETOM T2 ;FLAG A CHARACTER SEEN
LSH T1,3 ;MAKE ROOM FOR DIGIT
IORI T1,-"0"(T3) ;INSERT THE NEW DIGIT
JRST GETNU1 ;LOOP FOR MORE
GETNU2: SKIPN T2 ;SEE ANY NUMBERS AT ALL?
SETOM T1 ;NO, SET TO DEFAULT OF -1
CPOPJ1: AOS (P) ;GIVE SKIP RETURN
POPJ P, ;RETURN
;ROUTINE TO CLEAR TYPEAHEAD WHEN AN ERROR IS DETECTED.
;CALL: PUSHJ P,FLSLIN
;RETURN+1 ALWAYS
FLSLIN: CLRBFI ;CLEAR TYPEAHEAD
POPJ P, ;RETURN
;ROUTINE TO READ ONE CHARACTER FROM THE COMMAND STRING. IGNORES
;SPACES, TABS, NULLS, AND CARRIAGE RETURNS. CONVERTS LOWER TO UPPER
;CASE.
;CALL: PUSHJ P,GETCHR
;RETURN+1 IF END OF LINE CHARACTER SEEN
;RETURN+2 WITH CHARACTER WITH:
; T3/CHARACTER
GETCHR: INCHWL T3 ;GET CHARACTER
JUMPE T3,GETCHR ;IGNORE NULLS,
CAIE T3,.CHCRT ; CARRIAGE RETURNS,
CAIN T3," " ; SPACES
JRST GETCHR
CAIN T3,.CHTAB ; AND TABS
JRST GETCHR
CAIL T3,"a" ;LOWER CASE
CAILE T3,"z" ; LETTER?
CAIA ;NO
SUBI T3,"a"-"A" ;YES, CONVERT TO UPPER
PUSH P,T3 ;SAVE THE CHARACTER
MOVEI T3,1 ;GET A BIT TO SHIFT
LSH T3,@0(P) ;SHIFT BY VALUE OF CHARACTER
TDNN T3,BRKMSK ;IS IT A BREAK CHARACTER?
AOS -1(P) ;YES, SET FOR SKIP RETURN
POP P,T3 ;RETORE CHARACTER TO T3
POPJ P, ;RETURN
BRKMSK: 1_.CHBEL!1_.CHLFD!1_.CHVTB!1_.CHFFD!1_.CHESC
SUBTTL SNOOP LEVEL ROUTINES
;HERE JUST BEFORE DOING THE DATAO TO START THINGS UP AT RNXGO.
BP1: ENTRBP (1) ;DO BREAKPOINT SETUP
MOVEM %T1,BUFFER+BP1DTO(%T2) ;STORE DATAO WORD IN BUFFER
HRRZ %T3,%U ;GET UDB ADDRESS
ADD %T3,UNIBLK(%R) ;ADD OFFSET TO UNIBLK
MOVE %T3,(%T3) ;GET BLOCK NUMBER
MOVEM %T3,BUFFER+BP1BLK(%T2) ;STORE IN BUFFER
LDB %T3,@UNYPUN(%R) ;GET PHYSICAL UNIT NUMBER FROM UDB
MOVEM %T3,BUFFER+BP1UNI(%T2) ;STORE IN BUFFER
EXITBP ;EXIT THE BREAKPOINT
;HERE WHEN AN ASYNCHRONOUS EVENT WAS DETECTED IN CHKATN.
BP2: ENTRBP (2) ;DO BREAKPOINT SETUP
MOVE %T3,-1(%P) ;GET ASYNCHRONOUS STATUS REGISTER
MOVEM %T3,BUFFER+BP2ASY(%T2) ;STORE IN BUFFER
MOVSM %P2,BUFFER+BP2ERG(%T2) ;STORE ES,,ER IN BUFFER
MOVEM %P3,BUFFER+BP2CNI(%T2) ;STORE CS,,CI IN BUFFER
MOVEM %P1,BUFFER+BP2FLG(%T2) ;STORE FLAGS WORD IN BUFFER
EXITBP ;EXIT THE BREAKPOINT
;HERE AT INTERRUPT EXIT JUST BEFORE DISPATCHING TO FILIO
BP3: ENTRBP (3) ;DO BREAKPOINT SETUP
MOVEM %T1,BUFFER+BP3COM(%T2) ;STORE COMMUNICATION WORD
MOVEM %P1,BUFFER+BP3FLG(%T2) ;PLUS FLAGS WORD
MOVSM %P2,BUFFER+BP3ERG(%T2) ;PLUS ERROR REGISTERS
MOVEM %P3,BUFFER+BP3CNI(%T2) ;PLUS CONI
EXITBP ;EXIT THE BREAKPOINT
;HERE FROM CONECT WHEN AN OPERATION IS IN PROGRESS TO PROCESS IT
;BEFORE STARTING THE NEW ONE.
BP4: ENTRBP (4) ;DO BREAKPOINT SETUP
MOVEM %T1,BUFFER+BP4COP(%T2) ;STORE FUNCTION CODE IN BUFFER
MOVEM %T4,BUFFER+BP4PFL(%T2) ;STORE FLAGS FOR PREVIOUS OPERATION
LDB %T3,@UNYPUN(%R) ;GET UNIT NUMBER OF DRIVE
MOVEM %T3,BUFFER+BP4UNI(%T2) ;STORE IN BUFFER
EXITBP ;EXIT THE BREAKPOINT
;HERE WHEN CONECT DECLARES THE UNIT DOWN FOR ONE REASON OR ANOTHER.
BP5: ENTRBP (5) ;DO BREAKPOINT SETUP
MOVEM %T1,BUFFER+BP5ERB(%T2) ;STORE ERROR BITS IN BUFFER
MOVE %T3,-1(%P) ;GET CONI FROM STACK
MOVEM %T3,BUFFER+BP5CNI(%T2) ;STORE IN BUFFER
MOVE %T3,0(%P) ;GET ENDING STATUS,,ERROR REGISTER FROM STACK
MOVEM %T3,BUFFER+BP5ERG(%T2) ;STORE IN BUFFER
LDB %T3,@UNYPUN(%R) ;GET PHYSICAL UNIT NUMBER
MOVEM %T3,BUFFER+BP5UNI(%T2) ;STORE IN BUFFER
EXITBP ;EXIT THE BREAKPOINT
;HERE WHEN FILIO TIMES OUT A TRANSFER TO CAUSE AN INTERRUPT TO
;FORCE THE RH20 TO STOP.
BP6: ENTRBP (6) ;DO BREAKPOINT SETUP
MOVE %T3,-1(%P) ;GET CONI FROM STACK
MOVEM %T3,BUFFER+BP6CNI(%T2) ;STORE IN BUFFER
EXITBP ;EXIT THE BREAKPOINT
;HERE FROM THE SPECIAL SNOOP. LEVEL EXIT REQUEST BREAKPOINT. SET
;THE VARIABLE XITREQ TO -1 SO THAT THE BACKGROUND TASK WILL REMOVE
;THE BREAKPOINTS AND LOG THIS EVENT. NO DATA IS DEFINED FOR THIS
;EVENT (BUT MAY BE INSERTED), SO JUST ZERO THE REST OF THE BUFFER.
DEFINE ZROBUF(N),<
SETZM BUFFER+N(%T2)
>
BPX: SETOM XITREQ(%R) ;FLAG THE EXIT REQUEST
ENTRBP (^D99) ;DO BREAKPOINT SETUP FOR SPECIAL BREAKPOINT
.ZZ==BPNHLN
REPEAT <ENTLEN-BPNHLN>,<
ZROBUF (\.ZZ)
.ZZ=.ZZ+1
>
EXITBP ;EXIT THE BREAKPOINT
;HERE TO EXIT FROM ALL BREAKPOINTS (CALLED BY THE EXITBP MACRO)
BPEXIT: AOS %T3,CNT(%R) ;INCREMENT COUNT OF ENTRIES
HRRM %T3,BUFFER+BPNTYP(%T2) ;STORE IN RH OF 1ST WORD
BPRET: POP %P,%T3 ;RESTORE T3
POP %P,%T2 ;RESTORE T2
POPJ %P, ;RETURN
;ROUTINE TO PERFORM INITIALIZATION COMMON TO ALL BREAKPOINTS.
;CALL: %T2/TYPE,,0
; PUSHJ %P,SETUP(%R)
;RETURN+1 IF THIS EVENT SHOULD NOT BE LOGGED
;RETURN+2 TO LOG THIS EVENT WITH:
; %T2/RELOCATED BASE ADDRESS OF BUFFER ENTRY
SETUP: SOSL %T3,MAXCNT(%R) ;WANT TO CONTINUE LOGGING?
SKIPL %T3,CPUNUM(%R) ;USER SPECIFY A PARTICULAR CPU?
CAMN %T3,@.CPCPN(%R) ;YES, DOES IT MATCH THIS ONE?
CAIA ;YES, CONTINUE
POPJ %P, ;NO, GIVE NON-SKIP RETURN
LDB %T3,@KOYKNM(%R) ;GET KONTROLLER NUMBER FROM KDB
SKIPL KONNUM(%R) ;USER SPECIFY A PARTICULAR KONTROLLER?
CAMN %T3,KONNUM(%R) ;YES, DOES IT MATCH THIS ONE?
CAIA ;YES, CONTINUE
POPJ %P, ;NO, GIVE NON-SKIP RETURN
PUSH %P,%T2 ;SAVE TYPE,,LENGTH
RDTIME %T2 ;READ CURRENT TIMEBASE
DSUB %T2,STIME(%R) ;SUBTRACT BASE TIME
ASHC %T2,-^D12 ;RIGHT JUSTIFY
MOVEI %T2,ENTLEN ;GET LENGTH OF ENTRY
ADDB %T2,BUFPTR(%R) ;UPDATE BUFFER POINTER
CAIL %T2,BUFLEN ;OFF THE END?
SETZB %T2,BUFPTR(%R) ;YES, RESET TO THE BEGINNING
ADDI %T2,(%R) ;RELOCATE THE OFFSET
POP %P,BUFFER+BPNTYP(%T2) ;STORE TYPE IN BUFFER
MOVEM %T3,BUFFER+BPNTIM(%T2) ;ALONG WITH TIME
LDB %T3,@KOYKNM(%R) ;GET KONTROLLER NUMBER
HRL %T3,@.CPCPN(%R) ;PUT CPU NUMBER IN LH
MOVEM %T3,BUFFER+BPNCKU(%T2) ;STORE IN BUFFER
AOS 0(%P) ;GIVE SKIP RETURN
POPJ %P, ;RETURN
SUBTTL DATA LOCATIONS
XLIST ;LITERALS UNDER XLIST
LIT
LIST
BGNONE: ;FIRST WORD TO SET TO -1 FOR DEFAULT
; STARTUP OPTIONS
CPUNUM: BLOCK 1 ;CPU NUMBER OF CPU FOR WHICH DATA IS
; DESIRED. -1 IF NO PARTICULAR CPU
KONNUM: BLOCK 1 ;KONTROLLER NUMBER OF KONTROLLER FOR
; WHICH DATA IS DESIRED. -1 IF NO
; PARTICULAR KONTROLLER
EVFLAG: BLOCK BPNUM ;BLOCK OF FLAGS INDICATING WHETHER OR
; NOT TO LOG EACH BREAKPOINT. -1 TO LOG
; IT, 0 TO IGNORE IT.
ENDONE==.-1 ;LAST WORD TO SET TO -1 FOR DEFAULT
; STARTUP OPTIONS
WINDOW: EXP 0 ;SET TO ZERO TO NOT WRITE ANYTHING TO
;THE OUTPUT FILE UNTIL THE CRLF IS
;TYPED. THEN WRITE JUST THE CURRENT
;BUFFER
MAXCNT: XWD 377777,777777 ;NUMBER OF ENTRIES TO RECORD IN BUFFER
XITREQ: EXP 0 ;0 IF RNXBPX BREAKPOINT NOT INSERTED
;1 IF INSERTED BUT NOT YET REACHED
;-1 IF INSERTED AND REACHED
XITCNT: EXP -1 ;NUMBER OF ADDITIONALY ENTRIES TO LOG
;AFTER RNXBPX EXIT REQUEST
PDL: BLOCK PDLLEN ;PUSH DOWN LIST
OBUF: BLOCK 3 ;OUTPUT FILE BUFFER HEADER
STIME: BLOCK 2 ;BASE FOR RDTIME
CNT: BLOCK 1 ;SEQUENCE NUMBER/COUNT OF BUFFER ENTRIES
BUFPTR: BLOCK 1 ;POINTER TO CURRENT BUFFER LOCATION
BLOCK 20 ;ABJECT PARANOIA
BUFFER: BLOCK BUFLEN ;THE BUFFER
BLOCK 20 ;MORE PARANOIA
END RNXTRC