1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-06 11:03:21 +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

1573 lines
48 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 SNOOPY - GATHERS TIMING STATISTICS V2(26)
SUBTTL J LEONARD/C.D. OTOOLE
SNPORG==200000 ;ORIGIN OF SNOOPY HIGH SEGMENT
SEARCH SNUP,UUOSYM ;GET MACROS FROM SNOOP. PACKAGE
.REQUIR REL:SNUP ;AND LOAD THE REL FILE
TWOSEG SNPORG
SNPSEG: ;START OF SNOOPY HIGH SEG DATA SEGMENT
VWHO==0
VSNOOP==2
VMINOR==0
VEDIT==26
;COPYRIGHT (C) 1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982
; 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
T3=5 ;ANOTHER TEMP
T4=6 ;ANOTHER TEMP
CH=7 ;A CHARACTER,NEG IF BREAK
N=10 ;NAME/NUMBER TEMP
N1=11 ;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
;EDIT 25 SUPPORT KL PAGING. ALLOW XPCW INSTEAD OF JSR, AND CHANGE SOME
; EFFECTIVE ADDRESS LOCATIONS
;EDIT 26 MAKE WORK ON KS10 USING XPCW INSTEAD OF JSR.
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
IOWLEN==2000 ;BASIC AMOUNT OF I/O TO DO PER OUTPUT UUO
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
OPDEF XJRST [JRST 15,] ;EXTENDED JRST
CLK==0 ;REAL DEVICE CODE FILLED IN, DEFINE =0 SO "IORM" WILL WORK
SECTAB==540 ;OFFSET IN EPT/UPT OF SECTION MAPS
MS.SNP==36,,0 ;SECTION FOR SNOOPING ON EXTENDED MONITOR
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) <
IFDIF <NAM><MON>,<
%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
>; END IFDIF
%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
MOVEM T1,CHNSV ;SAVE THE OLD XPCW
HRRM T1,CHNST ;FOR STORING FLAGS WORD TO SIMULATE XPCW
AOJ T1, ;GIVES ADDR OF PC
HRRM T1,CHNST1 ;FOR STORING PC WORD TO SIMULATE XPCW
ADDI T1,3 ;GIVE ADDRESS OF FIRST INSTRUCTION
HRRM T1,CHNXJ ;TO JUMP TO
HLRZS T1 ;OPCODE IN RIGHT HALF FOR COMPARE
CAIE T1,(JSR) ;MAKE SURE ITS A JSR
CAIN T1,(XPCW) ;OR AN XPCW
SKIPA
BOMB <TRAP LOC NOT A JSR OR XPCW>
CAIE T1,(JSR) ;IS IT AN JSR?
JRST WSTAR1 ;NO, CONTINUE
MOVE T1,[JSR CHN+3] ;CHANGE TRAP LOCATION INSTRUCTION
MOVEM T1,TRPXPC ;...
MOVE T1,[SKIPA] ;REMOVE STORE OF DOUBLE WORD PC
MOVEM T1,CHNX1 ;...
HRRZ T1,CHNST ;GET ADDRESS WHERE PC STORED
SUBI T1,3 ;WHERE PC OF JSR IS STORED
HRRM T1,CHNST ;...
WSTAR1: HRLZ T1,CHNRST ;PICK UP TRAP ADDR
TLZ T1,777700 ;MUST BE RANGE OF 40-57 (ON CORRECT CPU ALREADY)
HRRI T1,TRPXPC ;AND XPCW INST FOR IT
TRPSET T1, ;INSTALL OUR XPCW/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>
PUSHJ P,CLRSSU ;CLEAR SNOOP SECTION MAP IN MONITOR
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
SKIPN EXTKLM ;NORMAL HISTOGRAM?
OUTPUT DSK,HISTP
SKIPE EXTKLM ;EXTENDED SECTION HISTOGRAM?
PUSHJ P,DOOUT ;YES, MORE COMPLICATED
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
SKIPE EXTKLM ;EXTENDED WATCH?
ADDI T1,IOWLEN ;YES, SUBTRACT I/O BUFFER FROM THIS COUNT
HRLZI T1,(T1) ;GIVES NEG LENGTH OF TABLES
SETZ N, ;INITIALIZE COUNTER
ADD N,HISTOG(T1) ;ADD EM UP
AOBJN T1,.-1
MOVN T1,ARSIZE ;SIZE OF HISTOGRAM ARRAY
HRLZS T1 ;MAKE AN AOBJN WORD
ADD N,SNPSEG(T1) ;ADD EM UP
AOBJN T1,.-1
WRHST1: 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
SKIPN EXTKLM ;HAVE AN EXTENDED TABLE?
JRST CLRTB1 ;NO
MOVE T1,[SNPSEG,,SNPSEG+1] ;SET UP TO CLEAR HIGH SEGMENT TABLE
SETZM SNPSEG ;CLEAR FIRST WORD
PUSH P,T2 ;SAVE T2
MOVE T2,ARSIZE ;ARRAY SIZE
ADDI T2,SNPSEG ;END+1
BLT T1,-1(T2) ;CLEAR IT
POP P,T2 ;RESTORE T2
CLRTB1: 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>
PUSHJ P,CLRSSU ;CLEAR SNOOP SECTION MAP IN MONITOR
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
CLRSSU: SKIPN T1,POKARG+2 ;HAVE WE CLEANED UP YET?
POPJ P, ;YES
MOVEM T1,POKARG+1 ;NO, STORE CURRENT CONTENTS
SETZM POKARG+2 ;ZAP POINTER
MOVE T1,[3,,POKARG] ;POINT AT IT
POKE. T1, ;DO IT
JFCL ;WE TRIED
POPJ P, ;RETURN
DOOUT: MOVEI T1,IOWLEN-<HISTOG-DATA> ;# WORDS IN FIRST BLOCK
MOVEI T2,SNPSEG ;SOURCE ADDRESS
MOVEI T3,HISTOG ;DESTINATION ADDRESS
MOVE T4,ARSIZE ;GET ARRAY SIZE
SUB T4,T1 ;SUBTRACT THIS PORTION
PUSH P,T1 ;SAVE WORD COUNT
EXTEND T1,[XBLT] ;COPY THE DATA
POP P,T1 ;RESTORE WORD COUNT
MOVNS T1 ;MAKE AN IOWD
HRLI T1,DATA-1 ;TO THIS BUFFER
JRST DOOUT2 ;JOIN COMMON CODE
DOOUT1: MOVEI T1,IOWLEN ;ASSUME A FULL BLOCK
CAIGE T4,IOWLEN ;AT LEAST THAT MUCH LEFT?
MOVE T1,T4 ;NO, USE THE LESSER
SUB T4,T1 ;SUBTRACT THIS PORTION
MOVEI T3,HISTOG ;DESTINATION ADDRESS
PUSH P,T1 ;SAVE WORD COUNT
EXTEND T1,[XBLT] ;COPY THE DATA
POP P,T1 ;RESTORE WORD COUNT
MOVNS T1 ;MAKE AN IOWD
HRLI T1,HISTOG-1 ;TO THIS BUFFER
DOOUT2: MOVSM T1,HISTP ;SAVE IOWD
OUTPUT DSK,HISTP ;WRITE A CHUNK
JUMPG T4,DOOUT1 ;LOOP IF MORE TO DO
POPJ P, ;RETURN
HIST: SIXBIT /HIST/
SIXBIT /HST/
0
0
0
HISTP: IOWD 1,DATA ;LENGTH SET UP
0
ARSIZE: 0 ;SIZE OF EXTENDED HISTOGRAM ARRAY
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
TRPXPC: XPCW 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
POKARG: BLOCK 3 ;FOR POKE. UUO
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>
PUSHJ P,CLRSSU ;CLEAR SNOOP SECTION MAP IN MONITOR
POPJ P,] ;RETURN IN-LINE
OUTSTR [ASCIZ /SHUT DOWN/]
RESET
EXIT
;HERE IS THE TABLE BUILT BY SNUP MACROS
BRKPNT TM0IN1,0 ;BREAK AT TM0IN1 (CHANGED TO PER CPU LOCATION)
;AND BREAKPOINT INSTRUCTION (XPCW TRPxxx)
BRKPNT BP$001,CLRSSE ;BREAK WHEN BREAKPOINTS BEING REMOVED
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
0 ;...
0 ;...
.+1(B) ;...
MOVEM PC,SVPC(B) ;SAVE REGISTER
MOVE PC,CHN(B) ;PICK UP INTERRUPT FLAGS
CHNST: MOVEM PC,.-. ;STORE TO SIMULATE XPCW
CHNX1: MOVE PC,CHN+1(B) ;PICK UP INTERRUPT PC
CHNST1: MOVEM PC,.-. ;STORE TO SIMULATE XPCW
CONSZ APR,1B26 ;IS IT APR CLOCK?
CHNJ: JRST .-.(B) ;YES, ENTER AT SAVE T1
CHNX: MOVE PC,SVPC(B) ;RESTORE-- BECOMES SKIPA TO STOP
CHNXJ: JRST .-. ;SIMULATE XPCW
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
HLL PC,.-. ;FLAGS
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
HLL PC,.-. ;FLAGS
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/SECTION NUMBER
EMODE2: HLRZ T1,.-. ;GET PC SECTION
SECFOO: HRRZ T1,.-.(T1) ;PICK UP SECTION MAP PAGE NUMBER
LSH T1,11 ;CONVERT TO ADDRESS
HRRM T1,MAPPTR(B) ;STORE FOR HLRZ
LDB T1,MAPPT1(B) ;GET PAGE NUMBER WITHIN SECTION
DPB T1,MAPPT2(B) ;SET TO FETCH THAT MAP ENTRY
MAPPTR: MOVE T1,.-. ;GET MAP ENTRY
TLNE T1,(6B2) ;DIRECT POINTER?
TDZA T1,T1 ;NO, CLEAR T1 AND SKIP
EMODE3: HLRZ T1,.-. ;YES, PICK UP SECTION NUMBER FROM PC
LSH T1,-1 ;MAKE S0/S1 INTO 0, S2 INTO 1
HRLM T1,PC ;OFFSET PC BY SECTION CODE*RESOLUTION
MONRES: LSH PC,.-. ;BREAKDOWN
MONLIM: CAIL PC,.-. ;CHECK RANGE
HRRZI PC,.-. ;BRING IN RANGE
XJRENT: JRST MONTAB(B) ;SKIP XJRST
XJRST .+1(B) ;ENTER SECTION 1
XJPC1: Z .+1(B) ;SECTION NUMBER FILLED IN LATER
HRLI PC,(MS.SNP) ;SET SECTION NUMBER
MONTAB: AOS .-.(PC) ;COUNT
JRST @.+1(B) ;LEAVE SECTION 1 IF THERE
Z RSTOR(B) ;GETS RELOCATED
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
CLRSSE: SKIPE %T1,EPTS36(B) ;SOMETHING TO ZERO?
SETZM (%T1) ;YES, DO SO
POPJ %P, ;RETURN
MAPPT1: POINT 9,PC,26 ;PAGE NUMBER FROM PC
MAPPT2: POINT 9,MAPPTR(B),35 ;STORE INTO PAGE MAP ADDRESS
EPTS36: 0 ;ZERO OR ADDRESS OF EPT MAP SLOT TO ZAP
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
COMENT: BLOCK ^D10 ;OPERATOR COMMENTS
MONSTR: BLOCK 1 ;MONITOR BOOTSTRAP STRUCTURE
MONFIL: BLOCK 1 ;MONITOR BOOTSTRAP FILE NAME
MONEXT: BLOCK 1 ;MONITOR BOOTSTRAP EXTENSION
MONDIR: BLOCK 1 ;MONITOR BOOTSTRAP DIRECTORY
MONSFD: BLOCK 5 ;MONITOR BOOTSTRAP SFD LIST
RESMON: BLOCK 1 ;MONITOR RESOLUTION
LIMMON: BLOCK 1 ;MONITOR TABLE SIZE
MONMAX: BLOCK 1 ;SIZE OF MONITOR EXAMINED
LOSSTR: BLOCK 1 ;LOW SEG STRUCTURE
LOSNAM: BLOCK 1 ;LOW SEG FILE NAME
LOSEXT: BLOCK 1 ;LOW SEG EXTENSION
LOSDIR: BLOCK 1 ;LOW SEG DIRECTORY
LOSSFD: BLOCK 5 ;LOW SEG SFD LIST
RESLOS: BLOCK 1 ;LOW SEG RESOLUTION
LIMLOS: BLOCK 1 ;LOW SEG TABLE SIZE
LOSMAX: BLOCK 1 ;SIZE OF LOW SEG EXAMINED
HISSTR: BLOCK 1 ;HIGH SEG STRUCTURE
HISNAM: BLOCK 1 ;HIGH SEG FILE NAME
HISEXT: BLOCK 1 ;HIGH SEG EXTENSION
HISDIR: BLOCK 1 ;HIGH SEG DIRECTORY
HISSFD: BLOCK 5 ;HIGH SEG SFD LIST
RESHIS: BLOCK 1 ;HIGH SEG RESOLUTION
LIMHIS: BLOCK 1 ;HIGH SEG TABLE SIZE
HISMAX: BLOCK 1 ;SIZE OF HIGH SEGMENT EXAMINED
JOBNUM: BLOCK 1 ;JOB NUMBER WATCHED
WCHAN: BLOCK 1 ;PI CHANNEL ON WHICH WE'RE RUNNING
CYCLE: BLOCK 1 ;WILL BE ZERO ON LAST HISTOGRAM
CPUN: BLOCK 1 ;THE CPU WE ARE WATCHING
EXTKLM: BLOCK 1 ;-1 IF EXTENDED KL MONITOR WATCH
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,.GTPRV ;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,TM0IN1 ;FOR CPU0
RADIX50 0,TM1IN1 ;FOR CPU1
RADIX50 0,TM2IN1 ;FOR CPU2
RADIX50 0,TM3IN1 ;FOR CPU3
RADIX50 0,TM4IN1 ;FOR CPU4
RADIX50 0,TM5IN1 ;FOR CPU5
](N) ;4 IS ALL MONGEN WILL ALLOW, HOWEVER ...
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,[.GTC0V,,.GTSLF] ;FIND CPU0 CDB VARIABLES
ADD T1,N ;TO CORRECT CPU
GETTAB T1, ;GET TABLE BASE
BOMB <CANT FIND CPU SPECIFIC GETTABS>
ADDI T1,%CVJOB&777777 ;LOCATION OF CURRENT JOB
HRRM T1,CURJOB ;SO PEOPLE CAN FIND IT
MOVE T1,[%VMUPM] ;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 .GTPRG,.GTSLF]
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 .GTSGN,.GTSLF]
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 .GTSTS,.GTSLF]
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 .GTSGN,.GTSLF]
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
MOVSI T1,1 ;ASSUME 256K
SKIPE KL10 ;KL10?
LSH T1,1 ;YES, EXTENDED MACHINE NEEDS 512K
MOVEM T1,MONMAX ;STORE MAXIMUM
SKIPN KL10 ;KL10?
JRST WMON2 ;NO
SETOM EXTKLM ;NOTE THIS FOR LATER
WMON2: SIZER (<MONITOR>,MON)
SKIPE EXTKLM ;EXTENDED KL MONITOR WATCH?
SUBI PC,-IOWLEN(T1) ;YES, HISTOGRAM TABLE IS ELSEWHERE
; (BUT I/O BUFFER FOLLOWS IT)
MOVEM PC,NXTFRE ;THIS MAY HAVE CHANGED
MOVEM PC,TABEND ;SAVE TO COUNT TABLES
MOVE T1,MONMAX ;GET MAXIMUM SIZE
IDIV T1,RESMON ;WORDS NEEDED FOR ARRAY
SKIPE EXTKLM ;EXTENDED KL MONITOR WATCH?
MOVEM T1,ARSIZE ;YES, SAVE
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,[%CNSTS]
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,UUOPNT ;TELL BYTE POINTER WHICH WORD OPCODE IS IN
MOVE T2,[%CNST2] ;GET BITS INDICATING FEATURE TESTS
GETTAB T2, ;SO WE CAN TELL WHAT KIND OF uCODE
BOMB <CANT GET FEATURE TEST BITS!> ;SHOULD HAVE DONE AN APRID
TLNN T2,(ST%KLP) ;IS THIS RUNNING WITH KL PAGING?
JRST ONAKIY ;NOPE - THIS REALLY LOOKS LIKE A KI
HRRI T2,(POINT 14,,35);UNDER KL PAGING, OPCODE GOES IN RH.
HRLM T2,UUOPNT ;CHANGES ONLY BYTE WITHIN WORD (LH TO RH)
ADDI T1,2 ;GET EFFECTIVE ADDRESS FROM WORD 426 OF UPMP
ONAKIY: HRRM T1,GTCAL1 ;STORE
HRRM T1,GTCAL2 ;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 .GTADR,.GTSLF]
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,.GTCNF ;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
MOVSI T1,-MONGTL ;LENGTH OF TABLES DRIVING MONITOR GETTAB STUFF
BTSLUP: MOVE T2,MONGTB(T1) ;GET A GETTAB POINTER
GETTAB T2, ;ASK
SETZ T2, ;OLD MONITOR?
MOVEM T2,MONSTR(T1) ;STORE IT
AOBJN T1,BTSLUP ;LOOP FOR REMAINDER
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
SKIPN N,ARSIZE ;EXTENDED ARRAY?
JRST NOTEXT ;NOPE
OUTCHR ["("] ;YES, INCLUDE THAT TOO
PUSHJ P,DECPR ;PRINT SIZE IN DECIMAL
OUTCHR [")"] ;CLOSE
NOTEXT: 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>
SKIPN EXTKLM ;KL MONITOR WATCH?
JRST LOCKUS ;NO, PROCEED
MOVE T1,ARSIZE ;GET ARRAY SIZE
CAILE T1,<1,,0>-SNPSEG ;ROOM FOR EVERYTHING?
BOMB <RESOLUTION TOO SMALL>
ADDI T1,SNPSEG ;GET NEW HIGH-SEG END
MOVSS T1 ;MOVE TO LH
CORE T1, ;EXPAND OUR HIGH SEG IF NEEDED
BOMB <CANT GET HIGH SEG CORE>
MOVEI T1,0 ;CLEAR WRITE-PROTECT FOR HIGH SEG
SETUWP T1, ;DO IT
BOMB <CAN'T CLEAR HIGH SEG WRITE PROTECT>
MOVE T1,[SNPSEG,,SNPSEG+1] ;CLEAR DATA AREA (SHAREABLE HIGH SEG!)
SETZM SNPSEG ;...
MOVEI T2,SNPSEG ;CALCULATE END ADDRESS OF AREA
ADD T2,ARSIZE ;...
BLT T1,(T2) ;ZERO HIGH SEGMENT
LOCKUS: MOVEI T1,LK.LLS ;ASSUME JUST NEED TO LOCK LOW SEG
SKIPE EXTKLM ;EXTENDED HISTOGRAM ARRAY?
HRLI T1,(LK.HLS+LK.HNE) ;YES, LOCK HIGH SEG (NON-CONTIGUOUS)
LOCK T1, ;GET READY FOR THE THING
JRST [OUTSTR [ASCIZ \?CANT LOCK. ERROR CODE \]
MOVE N,T1 ;ERROR CODE TO N FOR PRINTING
PUSHJ P,DECPR ;REPORT IT
EXIT] ;AND NOW GO AWAY
ANDI T1,-1 ;KEEP JUST LOWSEG PHYSICAL ADDRESS
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,BRKLST+3>
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
HRRM T1,CHNRST ;TO RESTORE CLOCK CHANNEL
ADDI T2,SECTAB ;OFFSET INTO SECTION MAP TABLE
HRRM T2,SECFOO ;STORE FOR MAP STUFF
PEEK T1, ;GET THE INTERRUPT INSTRUCTION
HLRZ T2,T1 ;OPCODE
CAIE T2,(XPCW) ;XPCW?
CAIN T2,(JSR) ;NO, JSR?
CAIA ;ONE OR THE OTHER
BOMB <UNKNOWN INSTRUCTION IN INTERRUPT CHANNEL>
CAIE T2,(XPCW) ;WAS THE INSTRUCTION AN XPCW?
SKIPA T2,T1 ;NO, 36 BIT PC'S
HRRI T2,1(T1) ;YES, 72 BIT PC'S AND THE PC IS IN THE 2ND WORD
HRRM T2,GOTHIM ;SAVE TO FETCH PC
HRRM T1,GOTHIM+1 ;TO GET PC FLAGS
HRRM T2,GETMPC ;DEPENDING ON FUNCTION
HRRM T2,EMODE2 ;FOR 72-BIT PC'S
HRRM T2,EMODE3
HRRM T1,GETMPC+1
HRRM T2,GETIPC
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
SKIPN ARSIZE ;EXTENDED ARRAY WATCH?
JRST READY ;NO, GO
MOVE T1,UPTADR ;GET UPT ADDRESS
ADDI T1,SECTAB ;OFFSET TO SECTION 0 MAP
PEEK T1, ;GET IT
SKIPN T1 ;MAKE SURE IT'S REASONABLE
BOMB <CAN'T DETERMINE JOB'S SECTION 0 MAP>
MOVEM T1,POKARG+2 ;NEW CONTENTS
SKIPGE T1,CPUN ;GET CPU NUMBER
SETZ T1, ;ASSUME ZERO
LSH T1,1 ;FOR CDB GETTAB
ADD T1,[%CCTOS] ;EPT ADDRESS
GETTAB T1, ;ASK
MOVEI T1,1000 ;OLD MACHINE?
ADDI T1,SECTAB+<(MS.SNP)> ;OFFSET TO SECTION MAP TABLE S36 ENTRY
MOVEM T1,POKARG+0 ;SAVE ADDRESS
MOVEM T1,EPTS36 ;SAVE HERE FOR LATER RESTORE
PEEK T1, ;GET CURRENT CONTENTS
SKIPE T1 ;REALLY SHOULD BE ZERO
BOMB <MONITOR S36 MAP ENTRY NON-ZERO>
MOVE T1,[3,,POKARG] ;POINT AT ARGUMENTS
POKE. T1, ;MAKE MY S36 MAP AVAILABLE IN EXEC MODE
BOMB <CAN'T PATCH MONITOR S36 MAP ENTRY>
MOVEI T1,SNPSEG ;OFFSET INTO HIGH SEG
HRRM T1,MONTAB ;MAKE INTO AN AOS OF MY HIGH SEG IN MON S36
MOVSI T1,1 ;SECTION NUMBER FOR XJRST
HLLM T1,XJPC1 ;MAKE THIS A SECTION 1 PC
MOVSI T1,(JFCL) ;MAKE XJRST HAPPEN
MOVEM T1,XJRENT ;...
JRST READY ;GO
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
XLIST ;LITS
LIT
LIST
KA10: 0 ;-1 IF ON A KA10
KI10: 0 ;DITTO FOR A KI10
KL10: 0 ;DITTO
KS10: 0 ;DOUBLE DITTO
MONGTB: EXP %CNMBS ;STRUCTURE
EXP %CNMBF ;FILE NAME
EXP %CNMBX ;EXTENSION
EXP %CNMBD ;DIRECTORY
EXP %CNSF1 ;FIVE SFD'S
EXP %CNSF2
EXP %CNSF3
EXP %CNSF4
EXP %CNSF5
MONGTL==.-MONGTB ;LENGTH OF TABLE
ENDSNP:
END WATCH