1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-05 02:34:56 +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

480 lines
16 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 SPY STRREF counter program.
SUBTTL /Tarl/DPM/WSM
SEARCH UUOSYM,MACTEN,SNUP
.REQUI REL:SNUP
SALL
SPYWHO=0
SPYMIN=1
SPYVER=1
SPYEDT=36
COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
ALL RIGHTS RESERVED.
\
;
;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 PROVED OR OTHERWISE MADE AVILABLE TO ANY OTHER PERSON. NO
;TITLE 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 RESPOSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
;; ****WARNING**** ****WARNING**** ****WARNING**** ****WARNING****
;If you happen to have snarfed a copy of this program, make sure
;that you keep it updated for every load of the monitor. Symbols
;and/or usage of ACs may change without warning. Needless to say
;you can cause EUE/UIL/IME/OUCH stopcodes easily this way.
;Also, note that running this is going to increase monitor overhead
;substantially, anywhere from +5% on an unloaded system, to unity
;on a loaded one (Particularly if lotsa 9600 baud terminals). Also,
;cache hit ratio goes down by about 8%.
;; ****WARNING**** ****WARNING**** ****WARNING**** ****WARNING****
;Later note - Code has been sped up by calling CCTYO directly, so above
;figures are much too high. The restrictions which have been introduced
;with this code are: If line lengths (TT WIDTH) are different, you are
;likely to get extra CRLFs in your output. Cure: TT NO CRLF. Also, FORM
;TAB and any other filler generators will cause unknown results. Cure:
;TT FORM TAB. TTY NO PAGE has the interesting side effect of ^S causing
;output to stop at the generating terminal, rather than be lost on the
;receiving terminal.
;Current options:
;
; ^E^X: Exit to monitor level after doing a RESET
; ^E^O: Make characters you type go to victim's output buffer
; ^E^I: Your type-in goes to his input buffer
; ^E^N: Throw away input characters (Default)
; ^E^P: Go back to parser (Select tty to spy on)
; .REENTE (If program stops somehow) Will reset and exit
;Note - Size of program is such that only two pages actually get locked
;in core (Pages 0 and 1), so any future modifications should attempt to not
;cause more pages to lock.
;Later note: Code has been shrunk, at last notice code occupies only one
;page.
;Suggested enhancements:
;Provide some kind of escape sequence conversion so that video editing
; works across terminal types.
;Allow multiple terminals by providing a table of terminals being spyed
; upon, which would inform as to which terminal the info was going to.
;Trap input characters from spying terminal directly at RECINT instead
; of opening the terminal in PIM mode an TRMOP.ing them.
;Special case dumping characters into input buffers on network lines to
; also dump them into output buffers under some special conditions.
;Add an option to the parser to pass you on to a PTY, so you can use
; an ordinary looking terminal to run WHO or SYSTAT.
;Add a command option ^E^R which will exit and run a program. This used
; to avoid being caught in the act of spying on someone.
;Write some code to get rid of any funny pages we may own - this will
; reduce the amount of core required to nail down.
;
;Edit history
;32 Check who is running the program. Update for changes to SCNSER.
; Note that some obscure code has been added to check who you are.
;33 Update for more monitor changes
;34 Add copyright statement
;Version 1(A) as of here
;35 Upgrade to 703.
;36 7.03 changed.
;User ACs
T4=1+<T3=1+<T2=1+<T1=1>>>
P4=1+<P3=1+<P2=1+<P1=T4+1>>>
TTY==17 ;Channel to use for TTY
IFN <V.SNUP-6>,<PRINTX ?SNUP version skew. Please use correct version of
PRINTX SNUP, or else you are likely to cause crashes.
>
LOC <.JBREN=124>
EXP BYEBYE ;In case bomb out
LOC <.JBVER=137>
EXP <VRSN. (SPY)>
RELOC
ADVANC 6,6 ;Max 6 references, max 6 breakpoints
;Define which breakpoints we want to use, and what to do with them.
; OFFSet is LABEL+OFFSet, when no label exists where you want it.
DEFINE PNTS,<
PNT XMTCN8,0,ECHOUT ;Gets everything to go to TTY
PNT ECHTST,7,ECHIN ;MIC non-echo
PNT ECHTS2,3,ECHIN ;Network non-echo, since FEs echo
; PNT ECHTS1,5,ECHIN ;Proper non-echo
>
DEFINE PNT(SYMB,OFFS,ROUT),<
EXP OFFS
PUSHJ %P,ROUT
>
;Argument list for the SNOOP uuo.
ARGLST: ARGLEN
Z ;Put checksum here
PNTS ;Generate snoop table
ARGLEN=.-ARGLST-1 ;Number of arguments after size
DEFINE PNT(SYMB,OFFS,ROUT),<RADIX50 0,SYMB>
REFS: PNTS
BRKNUM=.-REFS ;Number of breakpoints
;Put any references to symbols you need here.
ICCTYO: RADIX50 0,CCTYO ;Command level typeout routine
MSHNNS: 55207
REFSIZ=.-REFS ;Real size of symbols to look for
ESCFLG: Z
TOFUNC: Z ;Default to throw away input
PDL: IOWD 50,STACK
STACK: BLOCK 50
UDX: Z
;This code (And associated variables like the buffer)
; must be nailed down at interrupt level. Initializing
; code (At LOKTOP+) will dissapear before the LOCK uuo.
;Later note - Buffer no longer exists.
LOCKED: MOVEI T1,LOKTOP ;End of space which must be locked
CORE T1, ;Wipe everything else away
JRST BYEBY0 ;Ooops
MOVE T1,ICCTYO ;Get addr of CCTYO routine
HRRM T1,CCT ;Save for interrupt level pushj
MOVEI T2,LK.LNP!LK.LLS!LK.LLC ;Lock into EVM with cache on.
LOCK T2, ;Nail us down!
JRST BYEBY1 ;Ooops
LSH T2,^D9 ;Convert page number to address.
SETZ T3, ;Start offsets at 0
NXTPNT: CAILE T3,BRKNUM ;Transfer BRKNUM breakpoints
JRST CHKHIM ;Go do the snoop
MOVE T4,T3 ;Get normal index
ADD T4,T3 ; twice, so we end up with t3*2
MOVE T1,REFS(T3) ;Get a monitor address
ADDM T1,ARGLST+2(T4) ;Put in block for snoop, adding offset
ADDM T2,ARGLST+3(T4) ;Make the pushjs EVM relative
AOJA T3,NXTPNT ;Go transfer another point
CHKHIM: MOVEI T2,LITS ;get pointer to our literals
HRROI T1,2 ;all ones, 2
GETTAB T1, ;Get the value
JRST DIE4 ;Sigh.
SUBI T2,20 ;Make a real value out of this
LDB T1,[POINT 17,T1,16] ;Get interesting value
SOJN T1,DOSNUP ;If not, skip this
MOVE T1,MSHNNS ;Get value supplied by monitor
HRLI T1,'6 @' ;Flag info
SETAM T1,4(T2) ;Set things up
MOVEI T1,<RADIX50 0,2BJ1> ;Get symbol we want to use
EXCH T1,5(T2) ;and put this down there.
DOSNUP: MOVE T1,[.SODBP,,ARGLST] ;Args for SNOOP
SNOOP. T1, ;Define breakpoints
JRST BYEBY2 ;Argh.
GETNUM: PUSHJ P,PARSER ;Parse a command
MOVX T3,-1 ;-1 for us
TRMNO. T3, ;Get out UDX
JRST BYEBY8 ;Lose
CAMN T1,T3 ;Is it us?
JRST BYEBY7 ;Yes
TXZ T1,-1-UX.UNT ;Keep just the line number
MOVE T2,[%CNLNP] ;Get addr of LINTAB
GETTAB T2, ;So we can compare LDB addresses
JRST DIE4 ;Trash!
ADDI T1,(T2) ;Lintab+TTYnumber=Pointer to LDB
PEEK T1, ;Get addr of object tty ldb
HRRM T1,UP2 ;Put where we need the positive quantity
HRRM T1,UP3 ; Ditto.
TRC T1,-1 ;Complement addr
HRRM T1,UN1 ;Put where we need the complement.
TXZ T3,-1-UX.UNT ;Keep just our line number
ADDI T3,(T2) ;Plus LINTAB
HRRM T3,MYLDB ;Save for interrupt level code.
OUTSTR [ASCIZ /[Spying on TTY/]
HRRZ T1,UDX ;Get victim terminal's UDX
ANDI T1,777 ;Parse out TTY number
PUSHJ P,TOCT ;And type it.
OUTSTR [ASCIZ /]
/] ;Eol, what the heck.
SETSTS TTY,.IOPIM ;Set our tty to PIM mode.
HRLZI T1,.SOIBP ;Insert breakpoints
SX: SNOOP. T1, ;To activate our code.
JRST BYEBY3 ;Fugh.
LOOP: MOVSI T1,(HB.RTC) ;wait for a char
HIBER T1, ;zzzz
JFCL
INCHRS P1 ;Get a character if available
JRST LOOP ;None, loop back and sleep
SKIPN ESCFLG ;Was the previous character an escape char?
CAIN P1,"E"-100 ;Or is this character an escape character?
JRST CHANGE ;Escape, do something about it.
DRP: SKIPN TOFUNC ;Are we supposed to do something with type-in?
JRST IGNTYP ;Nope - beep at him, and ignore character
LSH P1,35 ;Left justify the character
HRLI T1,3 ;3 Words for TRMOP
HRRI T1,T2 ;Arg block in T2
MOVE T2,TOFUNC ;Get trmop. function
MOVE T3,UDX ;Get UDX of terminal
MOVEI T4,P1 ;Address of string
TRMOP. T1, ;Do the trmop.
JRST BYEBY5
JRST LOOP ;See if more characters
CHANGE: CAIE P1,"E"-100 ;^E?
JRST CHNG1 ;Nope, process
EXCH P1,ESCFLG ;Put P1 in flag location (Flag will be ^E or 0)
JUMPE P1,LOOP ;No previous flag, mark we are in ESC sequence
SETZM ESCFLG ;Set Flag back to no escape sequence.
JRST DRP ;Double ^E, drop it in his buffer.
CHNG1: SETZM ESCFLG ;Got the escape sequence, wipe flag
CAIN P1,"X"-100 ;^E^X ?
JRST BYEBYE ;Yep - he wants out.
CAIN P1,"I"-100 ;Change where his type-in goes ?
JRST CHNG2 ;Yep, This means dump it in Input buffer
CAIN P1,"O"-100 ;Change where type-in goes ?
JRST CHNG3 ;Yep - put it in his output buffer
CAIN P1,"P"-100 ;Change terminal we are watching ?
JRST CHNG4 ;Yup - go do it
CAIN P1,"N"-100 ;Does he want to make it illegal to type in?
JRST CHNG5 ;Yup - go do it
IGNTYP: MOVEI T1,7 ;<BEL>
OUTCHR T1 ;Beep, tell him he isn't being kosher
JRST LOOP ;And proceed with pending business
CHNG2: MOVEI T1,.TOTYP ;Trmop function to dump in input buffer
MOVEM T1,TOFUNC ;Make subsequent trmops dump in his input
OUTSTR [ASCIZ /[Entering ADVISE mode]
/]
JRST LOOP ;Proceed
CHNG3: MOVEI T1,.TOOUS ;Function to dump in output buffer
MOVEM T1,TOFUNC ;Make all proceeding go to output buffer
OUTSTR [ASCIZ /[Entering TALK mode]
/]
JRST LOOP ;Proceed
CHNG4: HRLZI T1,.SORBP ;De-activate intercepting code
SNOOP. T1, ;So we have a rest period
JRST BYEBY6 ;Ooops - big trouble!
JRST GETNUM ;Go back and get a terminal number
CHNG5: SETZM TOFUNC ;No function for totype
JRST LOOP
TOCT: IDIVI T1,10 ;Parse off last octal digit
HRLM T2,(P) ;Save on a safe spot in the stack
SKIPE T1 ;Parsed it all ?
PUSHJ P,TOCT ;Nope - get next digit
HLRZ T1,(P) ;get back a digit
ADDI T1,"0" ;Convert it to an ascii character
OUTCHR T1 ;Output it
POPJ P, ;And return
DIE4: OUTSTR [ASCIZ /GETTAB failed./]
DIE: JRST BYEBYE ;Do the reset anyway.
; PARSE USER COMMANDS OF THE FORM:
; XXX LINE XXX
; TTYXXX LINE XXX
; OPRXXX OPR XXX
; CTY CTY
; NNN_LLL NODE NNN LINE LLL
; JXXX JOB XXX
;
PARSER: SETSTS TTY,.IOASC ;Set our terminal to normal ascii mode.
OUTSTR [ASCIZ /SPY>/]
PUSHJ P,SIXINP ;Read a sixbit word
CAIN P3,"_" ;Node delimiter ?
JRST PRSNOD ;Yes
LDB T1,[POINT 6,P4,5] ;Get first character
CAIN T1,'J' ;Job ?
JRST PRSJOB ;YES
PRSRND: MOVE T1,P4 ;Copy stuff
IONDX. T1, ;Get UDX if possible
SKIPA ;CAN'T
JRST PRSR.1 ;Onward
MOVS T1,P4 ;Get stuff in RH
HRLI T1,'TTY' ;Add TTY - maybe only specified nnn
IONDX. T1, ;Try again
HALT .
PRSR.1: MOVEM T1,UDX ;Store udx
JRST PRSEND ;Done
PRSNOD: MOVE P1,P4 ;Save node name
PUSHJ P,SIXINP ;Get line or TTYnnn
MOVE P2,P4 ;Save it
HLRZ T1,P2 ;Get LH of line
CAIE T1,'TTY' ;Was it TTYnnn ?
jRST PRSN.1 ;No
HRLZ P2,P2 ;Yes - make it a line number only
CAIN P3,":" ;Terminate in a colon ?
PUSHJ P,FLUSH ;Yes - eat junk following it
JFCL ;Always skips
PRSN.1: MOVE P4,P2 ;Get line number
PUSHJ P,CNVOCT ;Convert to octal
HALT .
MOVE T1,[.NDRNN,,T2] ;Set up AC
MOVEI T2,2 ;2 word argument block
MOVE T3,P1 ;Get node name
NODE. T1, ;Convert node name to number
HALT .
HRL P4,T1 ;Set up uuo with P4:= node #,,line #
MOVE T2,P4 ;Save incase..
GTXTN. P4, ;Return sixbit tty name
TRNA ;Try a connect first
JRST PRSRND ;Go exit parser
MOVE P4,[.NDTCN,,T1] ;Code for executing a connect
MOVEI T1,2 ;2 words
NODE. P4, ;Try a connect
HALT .
OUTSTR [ASCIZ |Connecting|]
JRST PRSRND ;Convert SIXBIT/TTYNNN/
PRSJOB: LSH P4,6 ;Shift out 'J'
PUSHJ P,CNVDEC ;Convert SIXBIT to decimal number in 'P4'
HALT .
TRMNO. P4, ;Get UDX
HALT .
MOVEM P4,UDX ;Store it
PRSEND: SKIPGE P3 ;End of line ?
HALT .
MOVE T1,UDX ;Be nice
POPJ P, ;Return
TYI: INCHWL P3 ;Get a character
CAIN P3,.CHCRT ;Is it a carriage return ?
JRST TYI ;Yes - ignore it
PUSH P,T1 ;Save t1
MOVEI T1,1 ;A bit
LSH T1,(P3) ;See if a break character
CAIE P3,.CHDEL ;<rubout> ?
TDNE T1,[001455016210] ;Break character ?
MOVEI P3, ;Yes
POP P,T1 ;Restore t1
CAIG P3,"Z"+40 ;Lower case ?
CAIGE P3,"A"+40 ;...
SKIPA ;NOPE
TXZ P3," " ;Yes - convert to upper case
CAIN P3,.CHTAB ;<tab> ?
MOVEI P3," " ;Yes - make it a space
POPJ P, ;Return
FLUSH: PUSHJ P,TYI ;Get a character
CAIN P3," " ;Is is a space ?
JRST FLUSH ;Yes - eat it
CPOPJ1: AOS (P) ;No - always give skip return
CPOPJ: POPJ P, ;Return
SIXINP: MOVE T1,[POINT 6,P4] ;Byte pointer to destination
SETZB T2,P4 ;Zero counter and destination
PUSHJ P,FLUSH ;Eat leading spaces and tabs
SIXI.1: PUSHJ P,TYI ;Get a character
CAIL P3,"0" ;Is it a
CAILE P3,"9" ; number ?
CAIL P3,"A" ;Is it a
CAILE P3,"Z" ; Letter ?
POPJ P, ;No to something - return
TLNN T1,770000 ;Have six characters yet ?
JRST SIXI.1 ;Yes - ignore extra characters
SUBI P3," " ;Convert ascii to sixbit
IDPB P3,T1 ;Stash character
AOJA T2,SIXI.1 ;Loop for next one
CNVOCT: SKIPA T3,[^D8] ;Radix 8
CNVDEC: MOVEI T3,^D10 ;Radix 10
MOVE T2,P4 ;Get number to convert
MOVEI P4,0 ;Clear result
CNVNUM: LSHC T1,6 ;Shift in a character
ANDI T1,77 ;Strip off junk
CAIG T1,'0'-1(T3) ;Is it a
CAIGE T1,'0' ; legal digit ?
POPJ P, ;No - just return
IMULI P4,(T3) ;Multiply result by radix
ADDI P4,-'0'(T1) ;Add on this digit
JUMPN T2,CNVNUM ;Loop if more more characters to convert
JRST CPOPJ1 ;Skip return
BYEBY0: OUTSTR [ASCIZ /Couldn't reduce core/]
TRNA
BYEBY1: OUTSTR [ASCIZ /Couldn't lock/]
TRNA
BYEBY2: OUTSTR [ASCIZ /First SNOOP failed/]
TRNA
BYEBY3: OUTSTR [ASCIZ /Second SNOOP failed/]
TRNA
BYEBY5: OUTSTR [ASCIZ /TRMOP. failed/]
TRNA
BYEBY6: OUTSTR [ASCIZ /De-activating SNOOP failed!/]
TRNA
BYEBY7: OUTSTR [ASCIZ /Fool!!!/]
TRNA
BYEBY8: OUTSTR [ASCIZ /TRMNO. of ourselves failed!/]
BYEBYE: RESET
OUTSTR [ASCIZ /
Exiting SPY/]
EXIT 1,
JRST .
;Here when we have a character in T3
ECHIN:
ECHOUT:
UN1: TRNE %U,0 ;Test against complement of bits we know
POPJ %P, ;One of the bits we know isnt on, is on.
UP2: TRC %U,0 ;Complement the bits we want to know about
UP3: TRCE %U,0 ;Test for the bits we want to be on.
POPJ %P, ;Not this terminal, return quick
PUSH %P,%T1 ;Save
PUSH %P,%T2 ; An
PUSH %P,%T3 ;
PUSH %P,%T4 ; AC
PUSH %P,%U ;We will change this
MYLDB: MOVE %U,0 ;Our LDB
CCT: PUSHJ %P,0 ;Dump this character in our buffer.
POP %P,%U ;Restore LDB addr
POP %P,%T4 ; restore
POP %P,%T3 ;
POP %P,%T2 ; an
POP %P,%T1 ;AC
POPJ %P, ;Done
LITS: LIT
;;;;ALL CORE AFTER THIS WILL DISSAPEAR AT LOCK TIME
LOKTOP:
START: RESET
MOVE P,PDL ;Set up stack
SETZM .JBSA ;And avoid a .start
OPEN TTY,[EXP 0,<SIXBIT /TTY/>,0]
JRST BYEBY9 ;Give us a channel for SETSTS.
HRLI T1,REFSIZ ;We need REFSIZ addresses
HRRI T1,REFS ;They are in this table
PUSHJ P,GETADR## ;Convert symbols to addresses
MOVE T1,CHKSUM ;Get monitor checksum
MOVEM T1,ARGLST+1 ;Monitor checksum, so snoop can verify
MOVSI T1,'DDT' ;now for program name
SETNAM T1, ;Change our name, to screw people over.
OUTSTR [ASCIZ /[Type ^E^X to exit]
/]
JRST LOCKED ;Go to the code which has to be nailed down.
BYEBY9: OUTSTR [ASCIZ /Open of TTY failed/]
JRST BYEBYE
LIT
;This is the end of the code which doesnt
; Have to be locked in.
END START