1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-04-19 00:27:51 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

750 lines
25 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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