mirror of
https://github.com/PDP-10/stacken.git
synced 2026-04-19 00:27:51 +00:00
750 lines
25 KiB
Plaintext
750 lines
25 KiB
Plaintext
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
|