Trailing-Edge
-
PDP-10 Archives
-
bb-k345a-sb
-
snoopy.mac
There are 6 other files named snoopy.mac in the archive. Click here to see a list.
TITLE SNOOPY - GATHERS TIMING STATISTICS V2(24)
SUBTTL J LEONARD/C.D. OTOOLE
SEARCH SNUP ;GET MACROS FROM SNOOP. PACKAGE
.REQUIRE SNUP ;AND LOAD THE REL FILE
VWHO==0
VSNOOP==2
VMINOR==0
VEDIT==24
;COPYRIGHT (C) 1972,1973,1974,1975,1976,1977,1978,1979,1980 DIGITAL EQUIPMENT CORP. MAYNARD, MASS.
LOC 137
.JBVER: BYTE (3)VWHO(9)VSNOOP(6)VMINOR(18)VEDIT
RELOC 0
;REGISTERS
W==0
B==1 ;BASE REGISTER TO MAKE INTERRUPT CODE SELF-RELOCATING
PC==2 ;USUALLY CONTAINS INTERRUPT PC OR .JBFF
T1==3 ;MUST BE SAVED, BECAUSE OF DIVIDES OF PC
T2==4 ;ANOTHER TEMP
CH==5 ;A CHARACTER,NEG IF BREAK
N==7 ;NAME/NUMBER TEMP
N1==10 ;AUXILLIARY
P==17 ;STACK POINTER
SALL ;CLEAN UP LISTING SOME
;EDIT 20 6.03 KEEPS MOVING .UPJOB, USE GETTABS TO FIND IT
;EDIT 21 EPT ADDRESS MOVED, USE GETTABS TO FIND IT
;EDIT 22 UPMP MAPPING MOVED, MORE GETTABS
;EDIT 23 SUPPORT MULTIPLE CPUS & ASK FOR SEPARATE DK10 DEVICE CODES
;EDIT 24 USE THE SNUP PACKAGE TO INSERT BREAKPOINTS IN KL/KS MONITORS
; THIS REMOVES THE REQUIREMENT FOR A DK10
COMMENT !
XXXX
X XX
X *** X XXXXX
X ***** X XXX XX
XXXXX ******* XXX XXXX XX
XX X ****** XXXXXXXXX XX XXX
XX X **** X X** X
X XX XX X X***X
X //XXXX X XXXX
X // X XX
X // X XXXXXXXXXXXXXXXXXXX/
X XXX/ X X
X X X X X
X X X X X
X X X X X XX
X X X X X XXX XX
X XXX X X X X X X
X X X XX X XXXX
X X XXXXXXXX\ XX XX X
XX XX X X XXXXX
XX XXXX XXXXXX/ X XXXX
XXX XX*** X X
XXXXXXXXXXXXX * * X X
*---* X XX X
*-* * XXX X X
*- * XXX X
*- *X XXXX
*- *X X XXX
*- *X X XX
*- *XX X X
* *X* X X X
* * X** X XXXX X
* : X** XX X X
* ** X** X XX X
* ** X* XXX X X
* ** XX XXXX XXX
* * * XXXX X X
* * * X X X
=======******* * * X X XXXXXXXX\
* * * /XXXXX XXXXXXXX\ )
=====********** * X ) \ )
====* * X \ \ )XXXXX
==========********** XXXXXXXXXXXXXXXXXXXXXX
CURSE YOU , PAGE MAPS
!
;VARIOUS CODES
INTCOD==1 ;INTERRUPT SERVICE WATCH
MONCOD==2 ;MONITOR WATCH
CSPCOD==3 ;CUSP WATCH
JOBCOD==4 ;JOB # WATCH
OPCCOD==10 ;OPCODE STATISTICS COLLECTED WITH ANY OF ABOVE
UUOCOD==20 ;UUO STATISTICS ON ANY BUT INT WATCH
DSK==1 ;OUTPUT CHANNEL FOR HISTOGRAM DATA
CNFTBL==11 ;CONFIGURATION INFO
STATES==17 ;STATES WORD IN CNFTBL
NUMTAB==23 ;GETTAB IMMEDIATE
JBTSTS==0 ;JOB STATUS BITS
JBTADR==1 ;JOB/SEGMENT PHYSICAL ADDRESS TABLE
JBTPRG==3 ;JOB/SEGMENT NAME TABLE
JBTPRV==6 ;JOB PRIVILEGES
JP.RTT==1B13
JP.LCK==1B14
JP.TRP==1B15
JBTSGN==14 ;JOB TO HI-SEG NO TRANSLATION TABLE
CP0CDB==56 ;CPU0 CDB VARIABLES
CP0JOB==41 ;THE CURRENT RUNNING JOB
HB.RTL==1B13 ;HIBER WAKE ON LINE READY
HB.RWJ==1B15 ;HIBER WAKE BY THIS JOB ONLY
EXEC==1B5 ;0 IN PC WORD IMPLIES EXEC MODE
CLKCLR==30 ;CONO CLEAR
CLKRST==1000 ;CONO RESET
CLKST==40 ;CONO START
CLKDON==30 ;CONI DONE
OPDEF SPCFLG [004000,,0] ;USED TO SET PC FLAG FOR EXECUTIVE XCT
%CCTYP==6,,55 ;GETTAB FOR CPU TYPE
%VMUPJ==23,,113 ;GETTAB FOR .UPJOB ( NEED TO ADD .UPBAS )
%CCTOS==3,,55 ;GETTAB FOR EPT ADDRESS
%VMUPT==26,,113 ;PER PROCESS ADDRESS OF UPMP
%CNCPU==134,,11 ;7.00 GETTAB FOR NUMBER OF CPU'S IN CONFIGURATION
.STCPU==14 ;SETUUO FUNCTION
CLK==0 ;REAL DEVICE CODE FILLED IN, DEFINE =0 SO "IORM" WILL WORK
OPDEF SNOOP. [CALLI 176]
.SODBP==0 ;DEFINE BREAKPOINTS
.SOIBP==1 ;INSERT BREAKPOINTS
.SORBP==2 ;REMOVE BREAKPOINTS
.SOUBP==3 ;UN-DEFINE (GIVE UP OWNERSHIP OF SNOOP. FACILITY)
DEFINE ASK (Q) <
OUTSTR [ASCIZ \Q \]
>
DEFINE INCH <
PUSHJ P,INCHR ;GET NEXT CHAR, SET NEG IF BREAK
>
DEFINE INSIX <
PUSHJ P,SIXBN
>
DEFINE INDEC <
PUSHJ P,DECN
>
DEFINE INOCT <
PUSHJ P,OCTN
>
DEFINE IGNORE <
PUSHJ P,INCHR
XLIST
JUMPGE CH,.-1 ;LOOP TO FIND BREAK CHAR
LIST
SALL
>
DEFINE ONECH (DFLT)<
PUSHJ P,INCHR ;GET DISPATCH CHAR
XLIST
JUMPL CH,DFLT ;SPECIAL IF BREAK CHAR FIRST
PUSH P,CH
PUSHJ P,INCHR ;IGNORE THE REST
JUMPGE CH,.-1 ;UNTIL A BREAK FOUND
POP P,CH
LIST
SALL
>
DEFINE IFEGO (C,A)<
CAIN CH,"C"
XLIST
JRST A
LIST
SALL
>
DEFINE UNKCH (ERR)<
OUTCHR ["?"]
XLIST
OUTCHR CH
OUTSTR [ASCIZ / UNKNOWN
/]
JRST ERR
LIST
SALL
>
DEFINE BOMB (Q)<
JRST [OUTSTR [ASCIZ \?Q
\]
EXIT]
>
DEFINE SIZER (STRNG,NAM,%A,%B,%C,%D) <
%D: ASK <STRNG' SIZE IN K?>
XLIST
PUSHJ P,DECN ;COLLECT DECIMAL NUMBER
PUSHJ P,EOL ;CHECK FOR END OF LINE
JRST %D ;TRY AGAIN, FELLA
LSH N,^D10 ;MAKE WORDS
CAMLE N,[1,,0] ;TEST FOR REDICULOUS
JRST %D ;RETRY IF SO
MOVEM N,NAM'MAX ;SAVE MAX SIZE
MOVE T1,N ;HOLD FOR DIVISION BELOW
JUMPE N,%A ;ZERO IS SPECIAL CASE
%B: ASK <STRNG' RESOLUTION? 2**>
PUSHJ P,DECN ;GET RESOLUTION
PUSHJ P,EOL ;CHECK FOR END OF LINE
JRST %B
JUMPL N,%B ;DONT ALLOW NEG
CAILE N,^D10 ;KEEP UNDER A K
JRST %B
MOVEI N1,1 ;2**0
LSH N1,(N) ;RESOLUTION
MOVEM N1,RES'NAM ;SAVE FOR ANALYZER
MOVNS N ;GET SHIFT COUNTER
HRRM N,NAM'RES ;SAVE IN LSH INSTR
LSH T1,(N) ;GET TABLE SIZE
AOJA T1,%C ;ALLOW ONE FOR OUT-OF-RANGE
%A: MOVE T1,[JRST NAM'TAB(B)] ;SKIP IF NO BREAKDOWN WANTED
MOVEM T1,NAM'RES ;JUST COUNT ANY AS OTHER
MOVSI T1,(AOS) ;NO INDEXING NEEDED
HLLM T1,NAM'TAB
MOVEI T1,1
%C: HRRM T1,NAM'LIM ;STORE TABLE-SIZE LIMIT
HRRM T1,NAM'LIM+1 ;AND OUT-OF-RANGE INDEX
MOVEM T1,LIM'NAM ;SAVE FOR ANALYZER
HRRM PC,NAM'TAB ;SET ADDRESS OF TABLE
ADDI PC,(T1) ;START + LENGTH GIVES
MOVEM PC,NXTFRE ;NEW AVAILABLE CORE LOC
LIST
SALL
>
DEFINE RELOCT (LOC) <
IRP LOC,<
HRRZ W,LOC
ADDI W,(T1)
HRRM W,LOC
>>
DEFINE ENTDEF (TYP) <
MOVEI T1,TRP'TYP ;NAME OF ENTRY POINT
XLIST
HRRM T1,RTBLK ;SAVE IN REAL TIME BLOCK
HRRM T1,IXIT ;SAVE FOR RETURN
ADDI T1,3 ;ENTRY POINT IF APR CLOCK USED
HRRM T1,CHNJ
MOVEI T1,TYP'COD ;CODE TO PASS TO ANALYZER
MOVEM T1,USERF ;SAVE AS FLAG
LIST
SALL
>
DEFINE TRAP <
0
XLIST
CONO CLK,CLKCLR ;MUST INCLUDE PI, TOO
MOVEM PC,SVPC(B) ;SAVE A REGISTER
MOVEM T1,SVT1(B) ;AND ANOTHER
LIST
SALL
>
SUBTTL START THE RUN
READY: ASK <TYPE COMMENTS<CR> TO GO:>
MOVE N1,[XWD 440700,COMENT]
MOVEI T1,^D50 ;COUNTER FOR 10*5 CHARS
COMLUP: INCH
JUMPL CH,WSTART ;START WHEN EOL FOUND
IDPB CH,N1 ;BUT TILL THEN, STORE CHARS
SOJG T1,COMLUP ;WHILE THE BUFFER HOLDS OUT
IGNORE
WSTART: SETZM BUGS ;CLEAR COUNTERS
MOVE T1,[XWD BUGS,BUGS+1]
BLT T1,@NXTFRE ;CLEAR ALL TABLES
MSTIME T1, ;GET STARTING TIME
MOVEM T1,NOW ;SAVE FOR ANALYSIS
SKIPN CLKFLG ;ARE WE USING DK10?
JRST STDK10 ;YES, START IT
SKIPLE CLKFLG ;USING SNOOP.
JRST [MOVSI T1,.SOIBP ;YES, INSERT BREAKPOINTS
SNOOP. T1, ;DO IT
BOMB <CANT INSERT BREAKPOINTS>
JRST WSTOP] ;WE'RE RUNNING
HRRZ T1,CHNRST ;APR CHANNEL INT LOC
PEEK T1, ;SET UP BEFORE STARTING TO AVOID CRASH
HRRM T1,CHNST ;FOR STORING PC WORD TO SIMULATE JSR
MOVEM T1,CHNSV ;SAVE THE OLD JSR
AOJ T1, ;GIVES ADDR OF FIRST INSTR
HRRM T1,CHNXJ ;TO JUMP TO
HLRZS T1 ;OPCODE IN RIGHT HALF FOR COMPARE
CAIE T1,(JSR) ;MAKE SURE ITS A JSR
BOMB <TRAP LOC NOT A JSR>
HRLZ T1,CHNRST ;PICK UP TRAP ADDR
TLZ T1,777700 ;MUST BE RANGE OF 40-57 (ON CORRECT CPU ALREADY)
HRRI T1,TRPJSR ;AND JSR INST FOR IT
TRPSET T1, ;INSTALL OUR JSR
BOMB <CANT DO TRPSET>
CAME T1,CHNSV ;HOPEFULLY ALWAYS SKIP
BOMB <TRAP LOC CHANGED!!>
SETZ T1,
TRPSET T1, ;RESTART TIME-SHARING
BOMB <CANT RESTART TIMESHARING>
JRST WSTOP ;WE'RE RUNNING
STDK10: CONSZ CLK,CLKST ;IS THE CLOCK RUNNING?
BOMB <DK10 ALREADY IN USE>
DKX.1: CONO CLK,CLKRST ;RESET THE CLOCK
DKX.2: DATAO CLK,INTRVL ;SETUP RATE
DKX.3: CONO CLK,CLKST(T2) ;START ON CORRECT CHANNEL
DKX.4: CONSO CLK,CLKST ;DID IT START?
BOMB <CANT START DK10> ;NO, DIE
SUBTTL STOP THE RUN
WSTOP: OUTSTR [ASCIZ /TYPE <CR> TO STOP:
/]
SKIPE T2,CYCLE ;ARE WE REPEATING?
JRST WSLEEP ;YES, SLEEP IT OFF
IGNORE
SKIPN CLKFLG ;IF USING DK10
DKX.5: CONO CLK,CLKRST ;STOP IT
MOVSI T1,(SKIPA) ;ELSE MAKE INT ROUTINE SHUT DOWN
MOVEM T1,CHNXJ-1 ;BY RESTORING TRAP LOC
SKIPLE CLKFLG ;USING SNOOP.
PUSHJ P,[MOVSI T1,.SORBP ;YES, REMOVE BREAKPOINTS
SNOOP. T1, ;DO IT
BOMB <CANT REMOVE BREAKPOINTS>
POPJ P,] ;RETURN IN-LINE
WRHIST: INIT DSK,17 ;WRITE TO DISK IN DUMP MODE
SIXBIT /DSK/
0
BOMB <CANT INIT DISK>
HLLZS HIST+1
SETZM HIST+2
SETZM HIST+3
ENTER DSK,HIST
JRST E.EHST ;DESCRIBE FAILURE
OUTPUT DSK,HISTP
CLOSE DSK,
RELEAS DSK,
OUTSTR [ASCIZ /
HISTOGRAM FILE /]
MOVE N,HIST
PUSHJ P,SIXBP ;PRINT FILE NAME
OUTCHR ["."]
HLLZ N,HIST+1
PUSHJ P,SIXBP ;PRINT EXT
OUTSTR [ASCIZ / WRITTEN
WITH /]
MOVEI T1,HISTOG ;START OF TABLES
SUB T1,TABEND ;MINUS END
HRLZI T1,(T1) ;GIVES NEG LENGTH OF TABLES
SETZ N, ;INITIALIZE COUNTER
ADD N,HISTOG(T1) ;ADD EM UP
AOBJN T1,.-1
PUSHJ P,DECPR ;PRINT THE COUNT
OUTCHR ["/"]
MOVE N,TOTAL ;TOTAL OF ALL TICKS
PUSHJ P,DECPR
OUTSTR [ASCIZ / SAMPLES.
/]
SKIPN T2,CYCLE ;IF NOT CYCLING,
JRST QUIT ;THAT'S ALL THERE IS TO IT
MOVE T1,[XWD -3,[ POINT 6,HIST+1,17
POINT 6,HIST+1,11
POINT 6,HIST+1,5 ]]
UPDECL: LDB N,0(T1) ;PICK UP LOW ORDER SIXBIT CHAR
CAIL N,'0' ;CHECK THAT IT'S NUMERIC
CAILE N,'9'
MOVEI N,'0'-1 ;IF NOT, MAKE IT SO
AOJ N, ;THEN INCREMENT
DPB N,0(T1) ;AND STORE BACK
CAIG N,'9' ;BUT IF THAT CAUSED A CARRY,
JRST CLRTAB ;NO, IT DIDN'T
MOVEI N,'0' ;IF A CARRY, RESTORE ZERO, AND
DPB N,0(T1) ;PUT IT IN, THEN
AOBJN T1,UPDECL ;GO TO NEXT HIGHER DIGIT AND CARRY
JRST E.STOP ;UNLESS, OF COURSE, IT WAS 999
CLRTAB: SETZM BUGS ;CLEAR THE TABLES
MOVE T1,[XWD BUGS,BUGS+1]
BLT T1,@NXTFRE
MSTIME T1,
MOVEM T1,NOW ;RESET TIME OF DAY
SKIPE CLKFLG ;IF RUNNING DK10
JRST WSLEEP
MOVE T1,WCHAN ;RETART IT WITH SAME CONDITIONS
DKX.6: DATAO CLK,INTRVL
DKX.7: CONO CLK,CLKST(T1) ;SAME TIME, SAME CHANNEL
WSLEEP: MOVE T1,[HB.RWJ+HB.RTL+^D60000]
MOVEI W,^D60 ;SECS TO SLEEP IF HIBER FAILS
HIBER T1, ;TRY HIBERNATION
SLEEP W,
SKPINL ;WAS CR TYPED?
SOJG T2,WSLEEP ;COUNT OUT MINUTES TO COMPLETE CYCLE
JUMPE T2,NOSTOP ;IS THIS STOP OR END OF MINUTE?
SETZM CYCLE ;TIME TO STOP
MOVSI T1,(SKIPA)
MOVEM T1,CHNXJ-1 ;MAKE TRAP ROUTINE DISABLE ITSELF
SKIPLE CLKFLG ;USING SNOOP.
PUSHJ P,[MOVSI T1,.SORBP ;YES, REMOVE BREAKPOINTS
SNOOP. T1, ;DO IT
BOMB <CANT REMOVE BREAKPOINTS>
POPJ P,] ;RETURN IN-LINE
IGNORE
NOSTOP: SKIPN CLKFLG ;IF USING DK10,
DKX.8: CONO CLK,CLKRST ;RESET IT
JRST WRHIST ;AND WRITE THE TABLES
E.EHST: OUTSTR [ASCIZ /? ENTER FAILURE ON /]
MOVE N,HIST ;PRINT NAME
PUSHJ P,SIXBP
OUTCHR ["."]
HLLZ N,HIST+1 ;AND EXT
PUSHJ P,SIXBP
OUTSTR [ASCIZ /
/]
E.STOP: MOVSI T1,(SKIPA)
MOVEM T1,CHNXJ-1 ;SHUT DOWN TRAP ROUTINE
QUIT: RESET ;STOP EVERYTHING
EXIT ;AND GO HOME
HIST: SIXBIT /HIST/
SIXBIT /HST/
0
0
0
HISTP: IOWD 1,DATA ;LENGTH SET UP
0
RTBLK: 0 ;GETS CHANNEL AND TRAP ADDR
XWD 1,APRTRP ;EXEC MODE TRAP, AND ERROR ADDR
DKX.9: CONSO CLK,CLKDON ;HOW TO TELL ITS US
0
OKCHAN: -6 ;-(HIGHEST USABLE CHANNEL)
BASPNT: POINT 4,(T2),17 ;TO GET INDEX REG
TRPJSR: JSR CHN ;INSTR STORED IN 40+2N BY TRPSET
CHNSV: 0 ;OLD CONTENTS OF 40+2N
CLKFLG: 0 ;0=DK10, -1=APR CLOCK, +1=SNOOP. BREAKPOINTS
PHYADR: 0 ;PHYSICAL CORE ADDRESS FROM LOCK
TABEND: 0 ;END OF TABLES TO BE SUMMED
NXTFRE: HISTOG ;CORE ALLOCATED SO FAR
MYPRIV: 0 ;THIS JOB'S PRIV BITS
APRTRP: 0 ;COME HERE ON APR TRAP IN TRAP CODE
AOS BUGS ;BUMP COUNTER
JRSTF @APRTRP
INTBLK: XWD 3,ERRTRP ;DEFINE CONTROL C INTERCEPT
XWD 0,-1 ;HERE ON ANY TRAP
0
0
ERRTRP: SKIPN CLKFLG ;RUNNING DK10?
DKX.10: CONO CLK,CLKRST ;YES, STOP IT
MOVSI T1,(SKIPA)
MOVEM T1,CHNXJ-1 ;SHUT OFF APR CLOCK TOO
SKIPLE CLKFLG ;USING SNOOP.
PUSHJ P,[MOVSI T1,.SORBP ;YES, REMOVE BREAKPOINTS
SNOOP. T1, ;DO IT
BOMB <CANT REMOVE BREAKPOINTS>
POPJ P,] ;RETURN IN-LINE
OUTSTR [ASCIZ /SHUT DOWN/]
RESET
EXIT
;HERE IS THE TABLE BUILT BY SNUP MACROS
BRKPNT TM0INT,0,1 ;BREAK AT TM0INT+1 (CHANGED TO PER CPU LOCATION)
;AND BREAKPOINT INSTRUCTION (JSR TRPxxx)
SUBTTL SUBROUTINES
SIXBN: MOVE N1,[POINT 6,N] ;BYTE POINTER FOR SIXBIT
SETZ N, ;CLEAR RESULT
SIXB1: INCH ;GET A CHARACTER
CAIL CH,"0" ;CHECK FOR ALPHA-NUMERIC
CAILE CH,"Z"
POPJ P,
CAILE CH,"9"
CAIL CH,"A"
JRST .+2
POPJ P,
SUBI CH,40 ;CONVERT TO SIXBIT
TLNE N1,(77B5) ;GOTTEN SIX CHARS?
IDPB CH,N1 ;NO, STORE THIS ONE
JRST SIXB1 ;AND LOOP
DECN: SETZ N, ;CLEAR RESULT
DEC1: INCH
CAIL CH,"0" ;MAKE SURE ITS IN RANGE
CAILE CH,"9"
POPJ P,
IMULI N,^D10
ADDI N,-"0"(CH)
JRST DEC1 ;GO FOR NEXT
OCTN: SETZ N,
OCT1: INCH
CAIL CH,"0"
CAILE CH,"7"
POPJ P,
LSH N,3
ADDI N,-"0"(CH)
JRST OCT1
INCHR: INCHWL CH ;GET CHAR IN CH
CAIN CH,15 ;IF CR,
JRST INCHR ;LINE FEED COMES NEXT
CAIL CH,140 ;IF LOWER CASE,
TRZ CH,40 ;MAKE UPPER
CAIL CH,12 ;IF BREAK
CAILE CH,15
CAIN CH,33 ;INCLUDING ALTMODE
SETO CH, ;MAKE NEGATIVE
POPJ P, ;AND RETURN
EOLC: INCH
EOL: JUMPL CH,CPOPJ1 ;IF BREAK,ALL OK
IGNORE
POPJ P, ;OTHERWISE, TAKE ERROR EXIT
CPOPJ1: AOS 0(P)
POPJ P,
SIXBP: MOVE N1,[POINT 6,N]
SIXBP1: ILDB CH,N1 ;GET SIXBIT CHAR
JUMPE CH,CPOPJ ;QUIT ON ZERO
ADDI CH,40 ;MAKE ASCII
OUTCHR CH ;PRINT IT
TLNE N1,(77B5) ;TEST FOR ALL SIX DONE
JRST SIXBP1 ;LOOP TILL THEN
CPOPJ: POPJ P,
DECPR: IDIVI N,^D10 ;RIGHT OUT OF THE BOOK
HRLM N1,(P)
JUMPE N,.+2 ;BETTER THAN THE BOOK
PUSHJ P,DECPR
HLRZ CH,(P)
ADDI CH,"0"
OUTCHR CH
POPJ P,
NOREST: OUTSTR [ASCIZ /?SORRY, CANNOT RESTART
/]
EXIT
SUBTTL REAL-TIME INTERRUPT CODE
;NOTE: REFERENCES TO REGISTER B ARE FOR FLAG PURPOSES ONLY.
; ALL ARE DELETED BY RELOOP, AND THE ASSOCIATED ADDRESSES RELOCATED.
TRPBEG: ;BEGINNING OF RELOCATED CODE
CHN: 0 ;COME HERE ON CHANNEL N INTERRUPT
MOVEM PC,SVPC(B) ;SAVE REGISTER
CONSZ APR,1B26 ;IS IT APR CLOCK?
CHNJ: JRST .-.(B) ;YES, ENTER AT SAVE T1
CHNX: MOVE PC,CHN(B) ;PICK UP INTERRUPT PC
CHNST: MOVEM PC,.-. ;STORE TO SIMULATE JSR
MOVE PC,SVPC(B) ;RESTORE-- BECOMES SKIPA TO STOP
CHNXJ: JRST .-. ;SIMULATE JSR
MOVE PC,CHNSV(B) ;COME HERE TO STOP
CHNRST: MOVEM PC,.-. ;RESTORE TRAP LOC
MOVE PC,SVPC(B) ;RESTORE REG
JRST CHNXJ(B) ;NOW EXIT
TRPJOB: TRAP
HRRZ T1,@CURJOB(B) ;PICK UP CURRENT JOB NO
GOWN1: SKIPA ;CHANGED TO "CAME" IF KI-10 6.01/6.02
JRST NOTJOB(B) ;OWNER OF PAGE MAP IN NOT CURRENT JOB
JOBNO: CAIN T1,.-. ;DESIRED NO INSERTED
JRST GOTHIM(B) ;THAT'S THE ONE
LDB PC,JOBSTS(B) ;PICK UP WAIT STATE CODE
WSTAB: AOS .-.(PC) ;COUNT FOR THAT STATE
JRST NOTJOB(B) ;GO COUNT TOTAL
JOBSTS: POINT 5,.-.,14 ;FOR JOB WAIT STATE CODE
TRPCSP: TRAP
HRRZ T1,@CURJOB(B) ;CURRENT JOB NUMBER
GOWN2: SKIPA ;CHANGED TO "CAME" IF KI-10 6.01/6.02
JRST NOTJOB(B) ;OWNER OF PAGE MAP IN NOT CURRENT JOB
PRGNM1: MOVE PC,.-.(T1) ;PROG NAME FROM JBTPRG
CAME PC,LOSNAM(B) ;DESIRED PROGRAM IN LOW SEG?
JRST NOTJOB(B) ;NO, IGNORE IT
SEGNO1: SKIPG PC,.-.(T1) ;GET HIGH SEG NO, SKIP IF ANY
JRST GOTHIM(B) ;ISNT ONE, CANT BE WRONG ONE
PRGNM2: MOVE PC,.-.(PC) ;GET HIGH SEG NAME
CAME PC,HISNAM(B) ;RIGHT ONE?
JRST NOTJOB(B) ;NOPE
GOTHIM: MOVE PC,@.-. ;PICK UP SAVED PC WORD
TLNN PC,(EXEC) ;WAS INTERUPT FROM EXEC?
JRST EMODE(B) ;YES, COUNT EXEC TIME
ANDI PC,-1 ;DROP FLAGS
TRZE PC,400000 ;IS IT HIGH SEGMENT?
GOTHIS: JRST SEGNO2(B) ;YES, GO COUNT THERE
LOSADR: HRRZ T1,.-.(T1) ;GET LO SEG ADDR
HRLI T1,(POINT 9,(PC),8)
LDB T1,T1 ;PICK UP OPCODE
OPCTBL: AOS .-.(T1) ;COUNT ITS USE
LOSRES: LSH PC,.-. ;BREAKDOWN
LOSLIM: CAIL PC,.-. ;IN RANGE?
HRRZI PC,.-. ;NO, FORCE OUT-OF-RANGE
LOSTAB: AOS .-.(PC) ;COUNT THE TABLE
JRST RSTOR(B)
SEGNO2: HRRZ T1,.-.(T1) ;GET HIGH SEGMENT NO
HISADR: HRRZ T1,.-.(T1) ;GET HIGH SEGMENT ADDR
HRLI T1,(POINT 9,(PC),8)
LDB T1,T1 ;PICK UP OPCODE
OPCTBH: AOS .-.(T1) ;COUNT IT
HISRES: LSH PC,.-. ;BREAKDOWN
HISLIM: CAIL PC,.-. ;TEST RANGE
HRRZI PC,.-. ;FORCE
HISTAB: AOS .-.(PC) ;COUNT TABLE
JRST RSTOR(B)
KIUOPH: JRST 2,@.+1(B) ;ALLOW EXECUTIVE XCT TO WORK
SPCFLG .+1(B) ;LITE THE BIT
MOVEI T1,400000(PC) ;RE-LIGHT HIGH SEG ADDRESS
KLJSR1: JSR KIMAP(B) ;CHECK ADDRESSABILITY
JRST HISRES(B) ;NO GOOD, SKIP OPCODE STUFF
MOVEI T1,400000(PC) ;RE-LIGHT HIGH SEG ADDRESS
KLXCT1: XCT 3,KIOPLB(B) ;LOAD BYTE FROM USER CORE
LSH T1,-^D27 ;POSITION IT
JRST OPCTBH(B) ;ACCUMULATE THEM
KIUOPL: CAIG PC,17 ;SKIP A GUY RUNNING IN HIS AC'S
JRST LOSRES(B) ;FORGET IT
JRST 2,@.+1(B) ;ALLOW EXECUTIVE XCT TO WORK
SPCFLG .+1(B) ;LITE THE BIT
MOVEI T1,(PC) ;GET USER PC IN T1
KLJSR2: JSR KIMAP(B) ;CHECK ADDRESSABILITY
JRST LOSRES(B) ;NO GOOD, SKIP OPCODE STUFF
MOVEI T1,(PC) ;GET USER PC IN T1
KLXCT2: XCT 3,KIOPLB(B) ;LOAD THE BYTE
LSH T1,-^D27 ;WANT ONLY THE OPCODE
JRST OPCTBL(B) ;ACCUMULATE IN TABLE
KIOPLB: MOVE T1,0(T1) ;GET WORD FROM USER ADDRESSING
KIOPMP: MAP T1,0(T1) ;FETCH USER PAGE MAP ENTRY
;HERE TO CHECK IF ADDRESS IN "T1" CAN BE TOUCHED ( AVOID "IME" )
; THESE ROUTINES WERE STOLEN FROM "FLTST" IN "VMSER"
KIMAP: 0 ;JSR TO HERE
XCT 3,KIOPMP(B) ;DO THE MAP
TRNE T1,400000
TRNN T1,20000
AOS KIMAP(B) ;OK TO TOUCH
JRSTF @KIMAP(B) ;RETURN EITHER WAY
;GET HERE IF WE'RE ON A KL10
KLMAP: 0 ;JSR HERE TOO
XCT 4,KIOPMP(B) ;GET MAP ENTRY
TLNN T1,(1B8)
JRST KLMAP1(B)
TLNN T1,(1B1)
TLNN T1,(1B2)
JRSTF @KLMAP(B) ;NO CAN TOUCH
KLMAP1: DATAI APR,T1 ;OK SO FAR, WORRY ABOUT ADDRESS BREAK
TLNN T1,000700 ;ADDR BREAK ON ?
AOS KLMAP(B) ;NO, OK TO GET OPCODE
JRSTF @KLMAP(B) ;RETURN ANYWAY
EMODE: CONI PI,T1 ;CHECK PI IN PROGRESS
PIMSK2: TRNE T1,77400 ;TEST FOR OTHER INTERRUPTS IN PROGRESS
JRST NOTJOB(B) ;THIS IS STATISTICALLY IRRELEVANT
GETUU1: LDB T1,UUOPNT(B) ;PICK UP UUO CODE
TRNE T1,37 ;WATCHERS BITS LIT ?
JRST NOTJOB(B) ;YES, IGNORE THIS UUO
LSH T1,-^D9 ;ISOLATE UUO NUMBER (MOD 40)
CAIE T1,7 ;IS IT CALLI?
JRST UUOTBJ(B) ;NO
GTCAL1: HRRZ T1,40 ;GET CALLI NUMBER
TRNE T1,400000 ;NEGATIVE
JRST NOTJOB(B) ;YES, REALLY OUGHT TO CATCH THOSE
ANDI T1,777 ;ISOLATE CALLI NUMBER
CAILE T1,237 ;RANGE CHECK
MOVEI T1,237 ;SAY 'TOOBIG' IN TATTLE
ADDI T1,40 ;SKIP OVER UUO PART
UUOTBJ: AOS .-.(T1)
GETUPC: HRRZ PC,@41 ;GET JOB'S PC
TRZE PC,400000 ;HIGH SEG?
JRST HISRES(B) ;YES
JRST LOSRES(B) ;NO
TRPINT: TRAP ;HERE TO WATCH INTERRUPT SERVICE
CONI PI,PC ;GET PI IN PROGRESS
PIMSK3: ANDI PC,77400 ;STRIP OUR LEVEL AND OTHER BITS
JFFO PC,CNTPI(B) ;IF ANY INT IN PROGRESS, COUNT THEM
JRST NOTJOB(B) ;OTHERWISE, IGNORE
CNTPI: AOS PITAB-^D21(T1) ;BIT MUST HAVE BEEN BETWEEN 21 AND 27
CAIE T1,.-. ;CHECK FOR WATCHED LEVEL (MAY BE JRST)
JRST NOTJOB(B)
GETIPC: HRRZ PC,@.-. ;PICK UP SAVED PC
JRST MONADR(B) ;GO DIVIDE IT
TRPMON: TRAP ;ENTER HERE TO WATCH MONITOR
CONI PI,PC ;GET INTERRUPTS IN PROGRESS
PIMSK1: ANDI PC,77400 ;CLEAR UNWANTED BITS, INCLUDING OURS
JFFO PC,CNTPI(B) ;IF ANY OTHER PI IN PROGRESS, COUNT THAT
GETMPC: MOVE PC,@.-. ;RELOCATED FOR RIGHT PI
TLNE PC,(EXEC) ;WAS IT IN MONITOR?
JRST NOTJOB(B) ;NO, IGNORE IT
GETUU2: LDB T1,UUOPNT(B) ;GET UUO
TRNE T1,37 ;WATCHERS BITS SET ?
JRST MONADR(B) ;YES, A FINISHED UUO
LSH T1,-^D9 ;ISOLATE UUO CODE (MOD 40)
CAIE T1,7 ;IS IT CALLI?
JRST UUOTBM(B) ;NO
GTCAL2: HRRZ T1,40 ;GET CALLI NUMBER
TRNE T1,400000 ;NEGATIVE
JRST MONADR(B) ;YES, REALLY OUGHT TO CATCH THOSE
ANDI T1,777 ;ISOLATE CALLI NUMBER
CAILE T1,237 ;RANGE CHECK
MOVEI T1,237 ;SAY 'TOOBIG' IN TATTLE
ADDI T1,40 ;SKIP OVER UUO PART
UUOTBM: AOS .-.(T1) ;COUNT UUO
MONADR: LDB T1,MOPCP(B) ;PICK UP OPCODE
OPCTBM: AOS .-.(T1) ;COUNT USE
EMODE1: ANDI PC,-1 ;CLEAR FLAGS
MONRES: LSH PC,.-. ;BREAKDOWN
MONLIM: CAIL PC,.-. ;CHECK RANGE
HRRZI PC,.-. ;BRING IN RANGE
MONTAB: AOS .-.(PC) ;COUNT
RSTOR: ;HERE WHEN ANY COUNT TAKEN
NOTJOB: AOS TOTAL(B) ;RECORD ALL TICKS
MOVE T1,SVT1(B) ;RESTORE T1
IRET: MOVE PC,SVPC(B) ;RESTORE PC
IXIT: JRSTF @.-.(B) ;DISMIS INTERRUPT
TRPEND: ;END OF RELOCATED CODE
SVPC: BLOCK 1 ;KEEPS AC'S WHILE WE WORK
SVT1: BLOCK 1 ;WHICH KEEPS MONITOR HAPPY
CURJOB: EXP 20 ;FILLED IN LOC FOR CURRENT JOB
CURMAP: EXP 0 ;FILLED IN LOC OF PAGE MAP OWNER
MOPCP: POINT 9,(PC),8 ;FOR GETTING OPCODES FROM
; UNRELOCATED ADDRESSES
UUOPNT: POINT 14,40,17 ;TO GET UUO CODE (MOD 40) AND WATCHERS BITS
UPTADR: BLOCK 1 ;ADDRESS OF UPMP IN EXEC ADDRESSING
PDL: XWD -20,.+1 ;STACK POINTER
BLOCK 20 ;STACK SPACE
XLIST ;LIT
LIT
LIST
SALL
DATA: EXP HEADLN ;LENGHT OF DATA HEADER
CONFIG: BLOCK 7
TODAY: BLOCK 1
NOW: BLOCK 1
USERF: BLOCK 1 ;TELLS WHICH BREAKDOWN WE DID
INTRVL: BLOCK 1 ;CLOCK INTERVAL
INTLVL: BLOCK 1 ;PI LEVEL WE ARE WATCHING
RESMON: BLOCK 1 ;MONITOR RESOLUTION
LIMMON: BLOCK 1 ;MONITOR TABLE SIZE
MONMAX: BLOCK 1 ;SIZE OF MONITOR EXAMINED
RESLOS: BLOCK 1 ;LOW SEG RESOLUTION
LIMLOS: BLOCK 1 ;LOW SEG TABLE SIZE
LOSMAX: BLOCK 1 ;SIZE OF LOW SEG EXAMINED
RESHIS: BLOCK 1 ;HIGH SEG RESOLUTION
LIMHIS: BLOCK 1 ;HIGH SEG TABLE SIZE
HISMAX: BLOCK 1 ;SIZE OF HIGH SEGMENT EXAMINED
LOSNAM: BLOCK 1 ;LOW SEGMENT NAME TO MATCH
HISNAM: BLOCK 1 ;HIGH SEGMENT NAME
JOBNUM: BLOCK 1 ;JOB NUMBER WATCHED
WCHAN: BLOCK 1 ;PI CHANNEL ON WHICH WE'RE RUNNING
COMENT: BLOCK ^D10 ;OPERATOR COMMENTS
CYCLE: BLOCK 1 ;WILL BE ZERO ON LAST HISTOGRAM
CPUN: BLOCK 1 ;THE CPU WE ARE WATCHING
BUGS: BLOCK 1 ;COUNT OF APR TRAPS
TOTAL: BLOCK 1 ;TOTAL NUMBER OF INTERRUPTS TAKEN
PITAB: BLOCK 7 ;TIME IN PI SERVICE
HISTOG: ;BEGINNING OF HISTOGRAM TABLES
HEADLN==.-DATA
SUBTTL SETUP -- ALL WIPED WHEN RUN BEGINS
WATCH: JFCL
RESET
MOVE P,PDL ;SETUP STACK
MOVEI PC,HISTOG ;SETUP FREE-CORE POINTER
MOVNI T1,6
MOVEM T1,OKCHAN ;RESET TO ALLOW RESTART
SETZM CONFIG ;CLEAR HEADER BLOCK
MOVE T1,[XWD CONFIG,CONFIG+1]
BLT T1,BUGS ;TABLES WILL BE CLEARED LATER
MOVE T1,[%CCTYP] ;FIND OUT WHAT TYPE OF PROCESSOR
GETTAB T1, ;GET IT
BOMB <CANT FIND OUT WHAT KIND OF CPU THIS IS>
CAILE T1,1 ;DON'T UNDERSTAND PDP-6'S
CAILE T1,5 ;UNDERSTAND KA/KI/KL/KS
BOMB <UNKNOWN CPU TYPE>
SETOM KA10-2(T1) ;FLAG WHAT KIND WE ARE
HRROI T1,JBTPRV ;GETTAB FOR THIS JOB
GETTAB T1, ;GET PRIVILEGE BITS
SETO T1, ;ASSUME WE'VE GOT THEM
MOVEM T1,MYPRIV ;SAVE
MOVSI T2,(JP.RTT+JP.LCK)
SKIPE KS10 ;THIS A KS10
MOVSI T2,(JP.TRP+JP.LCK) ;YES, NEED TRPSET AND LOCK
AND T1,T2 ;NEED BOTH BITS
CAME T1,T2 ;COME OUT RIGHT
BOMB <SORRY, NEED PRIVILEGES>
SETOM CPUN ;ASSUME PRE-7.00
MOVE T1,[%CNCPU] ;NUMBER OF CPU'S IN CONFIG
GETTAB T1, ;DO 7.00 GETTAB
JRST ASKCP1 ;6.03 OR BEFORE
MOVEM T1,CPUN ;STORE FOR RANGE CHECK
SOSN CPUN ;UNLESS SINGLE PROCESSOR 7.00
JRST ASKCP1 ;IT IS, AVOID QUESTION
ASKCPU: ASK <WHICH CPU? >
INDEC
PUSHJ P,EOL
JRST ASKCPU
CAMLE N,CPUN ;RANGE CHECK ANSWER
JRST ASKCPU ;ASK AGAIN
MOVEM N,CPUN ;REMEMBER IT
MOVE N,[ ;CHANGE BREAKPOINT LOCATION TO CPU SPECIFIC
RADIX50 0,TM0INT ;FOR CPU0
RADIX50 0,TM1INT ;FOR CPU1
RADIX50 0,TM2INT ;FOR CPU2
RADIX50 0,TM3INT ;FOR CPU3
](N) ;4 IS ALL MONGEN WILL ALLOW
MOVEM N,BRKLST ;FOR "SNUP" TO FIND
MOVEI T1,1B35 ;BIT FOR ONLY CPU0
LSH T1,@CPUN ;POSITION FOR CPUN
HRLI T1,.STCPU ;SET CPU SPECIFICATION
SETUUO T1, ;SO RTTRP WILL WORK ON RIGHT CPU
BOMB <CANT SET TO RUN ONLY ON THAT CPU>
ASKCP1: SKIPGE N,CPUN ;GET CPU REQUESTED
SETZ N, ;PRE-7.00, USE CPU 0
LSH N,^D19 ;TO LH, *2
MOVE T1,[CP0CDB,,NUMTAB] ;FIND CPU0 CDB VARIABLES
ADD T1,N ;TO CORRECT CPU
GETTAB T1, ;GET TABLE BASE
BOMB <CANT FIND CPU SPECIFIC GETTABS>
ADDI T1,CP0JOB ;LOCATION OF CURRENT JOB
HRRM T1,CURJOB ;SO PEOPLE CAN FIND IT
MOVE T1,[%VMUPT] ;PER PROCESS ADDRESS OF UPMP
GETTAB T1, ;GET BASE
MOVEI T1,340000 ;PRE 7.01 (OR IGNORE ON KA-10)
MOVEM T1,UPTADR ;STORE FOR LATER
WATCH2: ASK <SNOOP ON?(INTERRUPTS, MONITOR, JOB#, CUSP)>
ONECH WMON ;GET FIRST CHAR, IGNORE REST
IFEGO I,WINT ;INTERRUPTS
IFEGO M,WMON ;MONITOR
IFEGO J,WJOB ;JOB#
IFEGO C,WCUSP ;CUSP
UNKCH WATCH2 ;CANT IDENTIFY THE RESPONSE
WCUSP: ENTDEF (CSP) ;SETUP FOR APPROPRIATE RTTRP
MOVE T1,[XWD JBTPRG,NUMTAB]
GETTAB T1, ;PICK UP ADDR OF PROG NAME TABLE
BOMB <CANT GET JBTPRG>
HRRM T1,PRGNM1
HRRM T1,PRGNM2 ;SAVE FOR LOW AND HIGH SEG NAME COMPARE
MOVE T1,[XWD JBTSGN,NUMTAB]
GETTAB T1,
BOMB <CANT GET JBTSGN>
HRRM T1,SEGNO1
ASK <LOW SEG NAME?(* IF ANY)>
INSIX ;GET NAME IN SIXBIT
JUMPGE CH,NOTLNM ;NOT VALID AS A NAME: * MAYBE?
JUMPE N,WCUSP ;GOTTA HAVE SOMETHING
MOVEM N,LOSNAM ;SAVE IT
MOVEM N,HIST ;SAVE DEFAULT HIST FILE NAME
NHNAM: ASK <HIGH SEG NAME?(CR IF SAME)>
INSIX ;GET HIGH SEG NAME IN SIXBIT
JUMPE N,NOTHNM ;IF NO NAME SPECIFIED
PUSHJ P,EOL ;ENSURE END OF LINE
JRST NHNAM ;TRY AGAIN
MOVEM N,HISNAM
JRST WSIZE ;GET SEGMENT SIZES
NOTHNM: JUMPL CH,SAMNAM ;USE SAME NAME AS LOW SEG
MOVE N1,CH ;SAVE A SEC
PUSHJ P,EOLC ;EAT IT AND CHECK EOL
JRST NHNAM ;TRY AGAIN
CAIE N1,"*" ;WAS IT STAR?
JRST NHNAM ;NO, GIVE ANOTHER CHANCE
MOVE T1,[JRST GOTHIM(B)]
MOVEM T1,SEGNO1 ;IGNORE HIGH SEG COMPARES
SETOM HISNAM ;AND NOTE "ANY"
JRST WSIZE
SAMNAM: PUSHJ P,EOL ;ENSURE END OF LINE
JRST NHNAM
MOVE T1,LOSNAM
MOVEM T1,HISNAM ;COPY LOW INTO HIGH
JRST WSIZE
NOTLNM: MOVE N1,CH ;SAVE IT A SEC
PUSHJ P,EOLC ;EAT * AND CHECK FOR EOL
JRST WCUSP ;START OVER
JUMPN N,WCUSP ;DISALLOW BOTH NAME AND *
CAIE N1,"*"
JRST WCUSP ;TRY AGAIN
SETOM LOSNAM ;FLAG ANY
MOVE T1,[JRST SEGNO1(B)]
MOVEM T1,PRGNM1 ;DISABLE LOW SEG NAME CHECK
MOVE T1,[JRST NOTJOB(B)]
MOVEM T1,SEGNO1+1 ;BUT REQUIRE HIGH SEGMENT
NLHNAM: ASK <HIGH SEG NAME?>
INSIX
PUSHJ P,EOL ;ENSURE PROPER EOL
JRST NLHNAM
JUMPE N,NLHNAM ;GOTTA HAVE THIS
MOVEM N,HISNAM ;SAVE
MOVEM N,HIST ;SAVE DEFAULT FILE NAME
JRST WSIZE
WJOB: ENTDEF (JOB) ;SET FOR JOB HANDLER
ASK <JOB #?>
INDEC ;COLLECT JOB NO
PUSHJ P,EOL ;CHECK FOR PROPER LINE TERMINATION
JRST WJOB
HRRM N,JOBNO ;SAVE IN CAI INSTR
HRRZM N,JOBNUM ;SAVE FOR ANALYSIS
JNAME: ASK <NAME OF CUSP?>
INSIX ;CUSP NAME IN SIXBIT
PUSHJ P,EOL
JRST JNAME
JUMPE N,JNAME ;TRY AGAIN IF NONE GIVEN
MOVEM N,LOSNAM ;PASS BACK TO ANALYZER
MOVEM N,HISNAM
MOVEM N,HIST ;SAVE DEFAULT HIST FILE NAME
MOVE T1,[XWD JBTSTS,NUMTAB]
GETTAB T1,
JRST WSIZE ;CANT GET STATUS POINTER
ADD T1,JOBNUM ;SAVE INDEXING TIME
HRRM T1,JOBSTS ;STORE IN BYTE POINTER
WSIZE: MOVEI T1,NOREST ;DISALLOW RESTARTS
HRRM T1,.JBSA##
MOVE T1,[XWD JBTSGN,NUMTAB]
GETTAB T1,
BOMB <CANT GET JBTSGN>
HRRM T1,SEGNO2 ;SAVE FOR OPCODE ACCESS
SETCM T1,LOSNAM ;IF WILDCARD SEGMENT NAME,
JUMPE T1,NOLOS ;DONT ASK THE QUESTIONS
SIZER (<LOW SEG>,LOS,NOLOS) ;GET SIZE AND RESOLUTION FOR LOW SEG
MOVE T1,LOSMAX ;GET LOW SEG MAXIMUM
CAIG T1,400000 ;FULL ADDRESSING REQUESTED
JRST REGLOW ;NO, REGULAR LOW SEGMENT
MOVSI T1,(SKIPA) ;GET AN INSTRUCTION
MOVEM T1,GOTHIS-1 ;REMOVE FUNKY HIGH/LOW SEGMENT TESTS
MOVEM T1,GETUPC+1 ;AND ASSUME FULL VM TYPE PROGRAM
JRST NOHIS ;THERE IS NO HIGH SEGMENT
REGLOW: SETCM T1,HISNAM ;IF ANY HIGH SEG ACCEPTED,
JUMPE T1,NOHIS ;DONT ASK
SIZER (<HIGH SEG>,HIS,NOHIS)
WJUUO: ASK <FULL MONITOR BRKDWN, OR BY UUO?(U,M)>
ONECH WJUUO1 ;GET FIRST CHAR, IGNORE OTHERS
IFEGO M,WJUUO2 ;M--WATCH FULL MONITOR
IFEGO U,WJUUO1 ;U--WATCH UUO TIMES
UNKCH WJUUO
WJUUO1: MOVEI T1,UUOCOD
IORM T1,USERF
MOVEM PC,TABEND ;SET END OF HISTOGRAMS
HRRM PC,UUOTBJ ;SETUP UUO TABLE POINTER
ADDI PC,300 ;LEN OF UUO TABLE
MOVEM PC,NXTFRE ;SAVE UPDATED AVAILABLE CORE
JRST ACLK ;DO NOT ASK MONITOR QUESTIONS
WJUUO2: MOVE T1,[JRST EMODE1(B)]
MOVEM T1,GETUU1 ;ENABLE MONITOR TIMING FOR JOB
JRST WMON2
JRST WMON2 ;GO SETUP FOR MONITOR WATCH
WINT: ENTDEF (INT)
MOVE T1,[SIXBIT /INTRPT/]
MOVEM T1,HIST ;SAVE DEFAULT HIST FILE NAME
ASK <PI LEVEL TO WATCH?(2-7 OR *)>
INDEC ;DESIRED LEVEL
JUMPE N,WALLIN ;* MEANS WATCH ALL INTS
PUSHJ P,EOL ;DID LINE TERMINATE OK?
JRST WINT ;NO, TRY AGIAN
CAILE N,1 ;CANT BE LEVEL 1, CAUSE WE MUST BE HIGHER
CAILE N,7 ;MUST BE LESS OR EQUAL 7 BY DEFINITION
JRST WINT
MOVEM N,INTLVL ;SAVE LEVEL FOR ANALYSIS
MOVSI T1,(CAIE T1,) ;FOR TESTING OUR LEVEL
HRRI T1,^D20(N) ;INCLUDE JFFO OFFSET
MOVEM T1,CNTPI+1 ;SAVE AS APPROPRIATE
MOVNI N,(N) ;GET NEGATIVE LEVEL
AOJ N, ;-(LEVEL-1) FOR RTTRP REQUESTS
MOVEM N,OKCHAN ;SAVE FOR HIGHEST CHANNEL LOWER THAN
; THE ONE WE WANT TO WATCH
JRST WMON1
WALLIN: MOVE N1,CH ;HOLD CHAR A SEC
PUSHJ P,EOLC ;WHILE WE CHECK FOR EOL NEXT
JRST WINT ;NOPE, RETRY
CAIE N1,"*" ;IS IT "ALL"?
JRST WINT ;NOPE, SOMETHING WRONG
SETOM INTLVL ;YES, FLAG ALL WATCHED
MOVE T1,[JRST GETIPC(B)]
MOVEM T1,CNTPI+1 ;SET TO MONITOR ALL INT LEVELS
JRST WMON1 ;GO GET MONITOR SIZE, ETC.
WMON: ENTDEF (MON)
MOVE T1,[SIXBIT /MONITR/]
MOVEM T1,HIST ;SAVE DEFAULT FILE NAME
ASK <INCLUDE PI TIME?(N,Y)>
ONECH WMNOPI ;DEFAULT NO
IFEGO Y,WMPI ;YES, WATCH PI TOO
IFEGO N,WMNOPI ;NO
UNKCH WMON
WMPI: MOVE T1,[JRST GETIPC(B)]
MOVEM T1,CNTPI+1 ;WHERE TO GO WHEN PI ENCOUNTERED
SETOM INTLVL ;NOTE WHAT WE'RE DOING
JRST WMON1
WMNOPI: MOVE T1,[JRST RSTOR(B)]
MOVEM T1,CNTPI+1 ;IGNORE WHEN PI COUNTED
SETZM INTLVL ;FLAG NO PI TIME INCLUDED
WMON1: MOVEI T1,NOREST ;CANT RESTART
HRRM T1,.JBSA ;BECAUSE OF RELOCATION TECHNIQUES
WMON2: SIZER (<MONITOR>,MON)
MOVEM PC,TABEND ;SAVE TO COUNT TABLES
MOVE T1,USERF
ANDI T1,7 ;GET JUST BASIC SNOOP CODE
CAIE T1,MONCOD ;MONITOR WATCH?
JRST WMUUO3 ;NO, DISABLE UUO TIMING
WMUUO: ASK <WATCH UUO TIMES?(N,Y)>
ONECH WMUUO3
IFEGO Y,WMUUO2 ;YES, SETUP TABLES
IFEGO N,WMUUO3 ;NO, DISABLE
UNKCH WMUUO
WMUUO2: MOVEI T1,UUOCOD
IORM T1,USERF ;INDICATE WHAT WE DID
HRRM PC,UUOTBM ;SETUP UUO TABLE POINTER
ADDI PC,300 ;LEN OF UUO TABLE
MOVEM PC,NXTFRE
JRST ACLK
WMUUO3: MOVE T1,[JRST MONADR(B)]
MOVEM T1,GETUU2 ;JUMP AROUND UUO CODE
ACLK: SKIPE KS10 ;IS THIS A KS10
JRST APRCLK ;YES, MUST USE THE APR CLOCK
SKIPL CPUN ;PRE-7.00?
JRST CLKAGN ;NO, MAKE DK10 AN OPTION
MOVSI T1,(JP.TRP) ;CHECK FOR TRPSET PRIVILEGES
TDZN T1,MYPRIV ;CAN WE DO IT?
JRST TELDKX ;MUST TRY FOR THE DK10
SKIPE KL10 ;THIS A KL10
JRST TELDKX ;YES, THERE IS NO APR CLOCK ON A KL
CLKAGN: ASK <USE DK10?(N,Y)>
ONECH APRCLK ;GET FIRST CHAR, DEFAULT TO NO
IFEGO Y,WDEVCD ;YES, GET DEVICE CODE TO USE
IFEGO N,APRCLK ;NO, USE APR CLOCK
UNKCH CLKAGN ;TRY AGAIN
APRCLK: MOVSI T1,(JP.TRP) ;CHECK FOR TRPSET PRIVS
TDZN T1,MYPRIV ;CAN WE DO IT
BOMB <SORRY, NEED PRIVILEGES>
MOVE T1,[XWD STATES,CNFTBL]
GETTAB T1, ;PICK UP STATES WORD TO GET FREQ
SETZ T1, ;UNLIKELY
MOVEI N,^D1667 ;60 HZ IN 10'S OF USECS
TLNE T1,(1B6) ;IS IT 50 HZ?
MOVEI N,^D2000 ;YES, SET 50 HZ RATE
MOVEM N,INTRVL ;SAVE FOR ANALYSIS
SKIPE KL10 ;THIS A KL10
JRST USSNUP ;YES, NO APR CLOCK, USE BREAKPOINTS FOR INTERVAL TIMER
SETOM CLKFLG ;INDICATE APR CLOCK
MOVE T1,[JRST CHNX(B)]
MOVEM T1,IRET ;SETUP ALTERNATE RETURN
SKIPN KS10 ;USING KS10
JRST WOPC ;READY FOR NEXT QUESTION
MOVEI T1,1B30 ;INTERVAL TIMER INTERRUPT FLAG
HRRM T1,CHNJ-1 ; BIT IN CONI APR,
JRST WOPC ;READY FOR NEXT QUESTION
USSNUP: PUSH P,PC ;SAVE CURRENT CORE REQUIREMENTS
PUSHJ P,GETINF## ;EXTRACT MONITOR SYMBOLS, FILL IN ARGUMENT BLOCK
POP P,PC ;GET IT BACK
MOVSI T1,(JSR) ;BREAK POINT INSTRUCTION IS A JSR
HRR T1,RTBLK ;TO CORRECT TRAP ROUTINE
MOVEM T1,BRKLST+1 ;STORE A BREAKPOINT INSTRUCTION
MOVSI T2,(JFCL) ;FIRST LOCATION OF TRAP ROUTINE IS "CONO CLK,"
MOVEM T2,1(T1) ; GET RID OF IT
MOVEI T1,1 ;INDICATE USING SNOOP.
MOVEM T1,CLKFLG ;...
JRST WOPC ;ASK MORE QUESTIONS
TELDKX: OUTSTR [ASCIZ/MUST USE THE DK-10
/]
WDEVCD: ASK <DK-10 DEVICE CODE (070 OR 074)? >
INOCT
PUSHJ P,EOL ;ELIMINATE THE GARBAGE
JRST WDEVCD ;WHOOPS!!
CAIE N,070 ;FIRST DK-10
CAIN N,074 ;OR SECOND DK-10
SKIPA
JRST WDEVCD ;SORRY, THOSE ARE THE ONLY CHOICES
LSH N,^D24 ;POSITION AS A DEVICE CODE
IORM N,STDK10 ;FILL IN ALL THE INSTRUCTIONS
IORM N,TRPJOB+1 ;...
IORM N,TRPCSP+1 ;...
IORM N,TRPINT+1 ;...
IORM N,TRPMON+1 ;...
IORM N,DKX.1 ;...
IORM N,DKX.2 ;...
IORM N,DKX.3 ;...
IORM N,DKX.4 ;...
IORM N,DKX.5 ;...
IORM N,DKX.6 ;...
IORM N,DKX.7 ;...
IORM N,DKX.8 ;...
IORM N,DKX.9 ;...
IORM N,DKX.10 ;...
WINTRV: ASK <INTERVAL IN USEC'S?(200-1000000)>
INDEC
PUSHJ P,EOL ;CHECK FOR PROPER LINE TERMINATION
JRST WINTRV ;OOPS
IDIVI N,^D10 ;IN CLOCK'S FORMAT
CAIL N,^D20 ;CHECK RANGE
CAILE N,^D100000
JRST WINTRV ;BAD, TRY AGAIN
MOVEM N,INTRVL
SETZM CLKFLG ;INDICATE DK10 CLOCK
WOPC: SKIPE KA10 ;THIS A KA10
JRST ONAKAX ;YES, JUST GET NEXT QUESTION
SKIPE KI10 ;THIS A KI10
JRST ONAKIX ;YES, SKIP MAPPING DIFFERENCES
;HERE ON A KL OR KS
ONAKLX: MOVE T1,[XCT 4,KIOPLB(B)] ;DIFFERENT EXEC EXECUTE
MOVEM T1,KLXCT1 ;OVER-RIDE KI-10 STYLE
MOVEM T1,KLXCT2 ;GET THEM BOTH
MOVE T1,[JSR KLMAP(B)] ;PAG MAPS LOOK DIFFERENT
MOVEM T1,KLJSR1 ;OVER-RIDE CALLS TO KI STYLE
MOVEM T1,KLJSR2 ;...
MOVE T1,[CAIA] ;NO ADDRESS BREAK TO WORRY ABOUT ON THE KS
SKIPE KS10 ;THIS A KS10
MOVEM T1,KLMAP1 ;YES, SO SKIP THE TEST FOR ADDRESS BREAK
ONAKIX: MOVEI T1,424 ;WHERE UUO IS STORED ON KI-10
ADD T1,UPTADR ;STORED IN UPT
HRRM T1,GTCAL1 ;STORE
HRRM T1,GTCAL2 ;AND THERE
HRRM T1,UUOPNT ;AND THERE
MOVE T1,[HRRZ PC,425] ;HOW TO GET USERS PC
ADD T1,UPTADR ;IT'S IN THE UPMP
MOVEM T1,GETUPC ;OVERRIDE KA-10 STYLE @41
MOVE T1,[JRST KIUOPH(B)] ;HOW TO GET OPCODES ON A KI-10
MOVEM T1,GOTHIS ;STORE THAT
MOVE T1,[JRST KIUOPL(B)] ;HOW TO GET LOW SEG OPCODES
MOVEM T1,LOSADR+1 ;STORE THAT
MOVE T1,[%VMUPJ] ;FIND .UPJOB IN PAGE MAP
GETTAB T1, ;ASK JIM
JRST ONAKAX ;WHAT, NO VM
ADD T1,UPTADR ;ADD IN PAGE MAP OFFSET
HRRZM T1,CURMAP ;STORE FOR COMPARES
MOVE T1,[CAME T1,@CURMAP(B)] ;HOW TO CHECK PAGE MAP OWNER
MOVEM T1,GOWN1 ;OVERRIDE KA OR PRE 6.01 SKIPA
MOVEM T1,GOWN2 ;GET BOTH PLACES
ONAKAX: ASK <WATCH OPCODE USAGE?(N,Y)>
INCH ;GET HIS DESIRE
JUMPL CH,WOPCN ;DEFAULT NO
PUSH P,CH
IGNORE
POP P,CH
IFEGO Y,WOPCY ;YES
IFEGO N,WOPCN ;NO
UNKCH ONAKAX ;RE-ASK
WOPCY: MOVEI T1,OPCCOD ;FLAG THAT OPCODES MONITORED
IORM T1,USERF
HRRM PC,OPCTBL
HRRM PC,OPCTBH
HRRM PC,OPCTBM
ADDI PC,1000 ;TABLE LENGHT
MOVEM PC,NXTFRE
MOVE T1,[XWD JBTADR,NUMTAB]
GETTAB T1,
BOMB <CANT GET JBTADR>
HRRM T1,LOSADR
HRRM T1,HISADR ;SAVE FOR GETTING SEGMENT ADDRESSES
JRST WFILE ;CONTINUE
WOPCN: MOVE T1,[JRST LOSRES(B)]
MOVEM T1,LOSADR ;DISABLE UNWANTED CODE
MOVE T1,[JRST HISRES(B)]
MOVEM T1,GOTHIS
MOVE T1,[JRST EMODE1(B)]
MOVEM T1,MONADR
WFILE: ASK <OUTPUT FILE NAME? DSK:>
INSIX ;COLLECT FILENAME
JUMPE N,.+2 ;USE DEFAULT
MOVEM N,HIST ;SAVE FOR ENTER
CAIE CH,"." ;IS EXT COMMING?
JRST NOEXT ;NO, DON'T STORE NEW ONE
INSIX ;GET EXTENSION
TRZ N,-1 ;THREE CHARS ONLY
MOVEM N,HIST+1 ;SAVE EXTENSION
NOEXT: JUMPL CH,WCYCLE ;IF EOL, LINE WAS CORRECT
INCH ;OTHERWISE, WE'VE GOT A PROB
JUMPGE CH,.-1
OUTSTR [ASCIZ /?WHAT?
/]
JRST WFILE ;GO TRY AGAIN
WCYCLE: ASK <CYCLE TIME?(MINUTES)>
INDEC
PUSHJ P,EOL ;CHECK TERMINATOR
JRST WCYCLE
MOVEM N,CYCLE ;ZERO = DO NOT CYCLE
MOVNI T2,6 ;WORDS OF CONFIG INFO TO GET
CNFLUP: MOVEI T1,CNFTBL ;GETTAB TABLE CODE
HRLI T1,6(T2)
GETTAB T1, ;PICK UP NEXT CONFIG WORD
SETZ T1,
MOVEM T1,CONFIG+6(T2) ;SAVE IT FOR ANALYZER
AOJLE T2,CNFLUP ;GET ALL 7
DATE T1, ;TODAY'S DATE
MOVEM T1,TODAY ;TIME WILL BE STORED WHEN WE START
MOVE T1,USERF ;GET OPERATION CODE
ANDI T1,7 ;ONLY BASIC CODE
CAIE T1,JOBCOD ;IS IT A JOB NUMBER WATCH?
JRST GDATLN ;NO, DONT NEED MORE CORE
HRRM PC,WSTAB ;SET POINTER TO WAIT-STATE TABLE
ADDI PC,^D32 ;ADD LENGTH OF TABLE
MOVEM PC,NXTFRE ;SAVE NEW FREE ADDRESS
GDATLN: MOVEI T1,DATA ;ADDR OF DATA BLOCK
SUBI T1,(PC) ;NEG LENGHT OF DATA
HRLM T1,HISTP ;SET FOR OUTPUT
OUTSTR [ASCIZ /DATA SIZE IS /]
MOVN N,T1 ;GET POS OWRD COUNT
PUSHJ P,DECPR ;PRINT IN DECIMAL
OUTSTR [ASCIZ / WORDS.
/]
GCORE: CAIGE PC,ENDSNP ;DONT REMOVE ANY CODE WITH CORE UUOS
MOVEI PC,ENDSNP ;...
MOVEM PC,.JBFF##
CORE PC, ;GET SOME CORE (OR GET RID OF SNUP PACKAGE)
BOMB <CANT GET CORE>
LOCKUS: MOVEI T1,1 ;LOCK LOW SEG ONLY
LOCK T1, ;GET READY FOR THE THING
BOMB <CANT LOCK>
LSH T1,^D9 ;THIS IS OUR PHYSICAL ADDRESS
MOVEM T1,PHYADR ;SAVE IN CASE WE NEED IT
RELOCT <MONTAB,LOSTAB,HISTAB,CNTPI,WSTAB>
RELOCT <OPCTBL,OPCTBH,OPCTBM,UUOTBJ,UUOTBM>
RELOCT <BRKLST+1>
MOVE T2,[XWD TRPBEG-TRPEND,TRPBEG] ;AOBJN WORD FOR INT CODE
RELOOP: LDB W,BASPNT ;DOES THIS INSTR HAVE INDEX?
CAIE W,B ;AND IS IT REGISTER B?
JRST RELNXT ;IF NOT, LOOK AT NEXT
SETZ W, ;IF SO, CLEAR INDEX SPEC
DPB W,BASPNT ;BY STORING ZERO
RELOCT <0(T2)> ;AND MODIFY ADDR APPROPRIATELY
RELNXT: AOBJN T2,RELOOP ;LOOP FOR ALL INTERRUPT CODE
SKIPN CLKFLG ;USING APR CLOCK OR SNOOP. ?
JRST RTCLK ;NO, SETUP RTTRP
SKIPG CLKFLG ;USING SNOOP.
JRST GETIOT ;NO, JUST GO GET USRIOT
MOVE T1,[.SODBP,,BRKBEG] ;ARGS
SNOOP. T1, ;DEFINE THE BREAKPOINTS AFTER RELOCATION
BOMB <CANT DEFINE SNOOP BREAKPOINTS>
GETIOT: SETZ T1, ;CLEAR
TRPSET T1, ;GET USRIOT
BOMB <CANT GET USER IO MODE>
CONI APR,T2 ;GET CLOCK PI ASSIGNMENT (SAME FOR ALL CPUS)
ANDI T2,7 ;DISCARD OTHER BITS
MOVM T1,OKCHAN
CAIGE T1,(T2) ;IS THIS ENOUGH FOR DESIRED WATCH?
BOMB <APR PRIORITY TOO LOW>
JUMPN T2,RTCHAN ;OK IF ASSIGNED
BOMB <APR CLOCK UNASSIGNED>
RTCLK: MOVEI T2,1
HRLM T2,RTBLK+1 ;SET FOR SUPER-FAST EXEC-MODE TRAPS
HRL T2,OKCHAN ;NO OF CHANNELS USABLE TO US
RTLOOP: MOVE T1,CPUN ;GET CPU NUMBER
LSH T1,^D9 ;POSITION IT
ADDI T1,400000(T2) ;INSERT FLAG AND CHANNEL NUMBER
SKIPGE CPUN ;WAIT, IS THE PRE-7.00
MOVEI T1,(T2) ;YES, JUST WANT CHANNEL NUMBER
HRLM T1,RTBLK ;SET DESIRED CHANNEL
MOVEI T1,RTBLK
RTTRP T1, ;CAN WE GET IT?
AOBJN T2,RTLOOP ;NO, TRY NEXT IF ANY LEFT
TLZN T2,-1 ;DID WE GET ONE?
BOMB <CANT GET A CHANNEL>
MOVEI T1,CLKCLR(T2) ;SETUP FOR CONO
HRRM T1,TRPJOB+1 ;STORE IN PROPER CONO
HRRM T1,TRPCSP+1
HRRM T1,TRPINT+1
HRRM T1,TRPMON+1 ;THAT SHOULD TAKE CARE OF THEM ALL
RTCHAN: MOVEM T2,WCHAN ;SAVE OUR CHANNEL NUMBER
MOVEI T1,20(T2)
LSH T1,1 ;POINT TO ADDR OF SAVED PC FOR THIS CHAN
SKIPGE T2,CPUN ;GET THE CPU NUMBER
SETZ T2, ;PRE-7.00, GET CPU 0
LSH T2,1 ;*2 FOR GETTAB
ADD T2,[%CCTOS] ;ADDRESS OF EPT
GETTAB T2, ;TO OFFSET 40+2*N
SETZ T2, ;WHAT
CAIL T2,1000 ;ON KA10?
ADD T1,T2 ;OFFSET FOR .EPT MOVE
SKIPLE CLKFLG ;USING SNOOP.
JRST [MOVSI T1,(Z @0) ;GET INDIRECT BIT
ANDCAM T1,GOTHIM ;REMOVE FROM INSTRUCTIONS THAT FETCH PC
ANDCAM T1,GETMPC
ANDCAM T1,GETIPC
MOVE T1,BRKLST ;YES, INTERVAL TIMER VECTORS
SOJA T1,.+1] ;PC IS AT BREAKPOINT LOCATION - 1
HRRM T1,GOTHIM ;SAVE TO FETCH PC
HRRM T1,GETMPC ;DEPENDING ON FUNCTION
HRRM T1,GETIPC
HRRM T1,CHNRST ;AND TO RESTORE CLOCK CHANNEL
MOVE T2,WCHAN ;RESTORE T2 FOR "READY"
MOVNI T1,(T2) ;GET NEGATIVE CHANNEL NO
MOVEI W,1B20 ;POSITION BIT FOR "CH 0"
LSH W,(T1) ;SHIFT INTO POSITION FOR THIS CHANNEL
ANDCAM W,PIMSK1 ;CLEAR BIT FOR THIS CHANNEL
ANDCAM W,PIMSK2 ;IN THE AND'S
ANDCAM W,PIMSK3
MOVEI T1,INTBLK ;ADDR OF CONTROL-C INTERCEPT ROUTINE
MOVEM T1,.JBINT## ;ENABLE IT
JRST READY ;GO
XLIST ;LITS
LIT
LIST
KA10: 0 ;-1 IF ON A KA10
KI10: 0 ;DITTO FOR A KI10
KL10: 0 ;DITTO
KS10: 0 ;DOUBLE DITTO
ENDSNP:
END WATCH