mirror of
https://github.com/PDP-10/its.git
synced 2026-01-20 01:45:49 +00:00
444 lines
8.2 KiB
Plaintext
444 lines
8.2 KiB
Plaintext
;-*-MIDAS-*-
|
||
TITLE TTY OUTPUT SPY
|
||
|
||
.MLLIT==1
|
||
|
||
A=1
|
||
B=2
|
||
C=3
|
||
D=4
|
||
N=5
|
||
OBP=6
|
||
CH=7 ;HACKED ONLY AT INTERRUPT LEVEL
|
||
TTNPTR=10
|
||
P=17
|
||
|
||
TTYO=10
|
||
TTYI=11
|
||
DIRI=12
|
||
|
||
DEFINE UTYI AC
|
||
CAMN OBP,@TOOP
|
||
.HANG
|
||
CAMN OBP,@TOBEP
|
||
JRST [ MOVE OBP,@TOBBP
|
||
JRST .-3]
|
||
ILDB AC,OBP
|
||
ANDI AC,377
|
||
TERMIN
|
||
|
||
DEFINE SYSCAL A,B
|
||
.CALL [SETZ ? SIXBIT |A| ? B ((SETZ)) ]
|
||
TERMIN
|
||
|
||
DEFINE TTYVAR WHICH,TTY,REST
|
||
.CALL [SETZ ? 'TTYVAR ? TTY ? [SIXBIT |WHICH|] ? REST ((SETZ)) ]
|
||
TERMIN
|
||
|
||
CALL=PUSHJ P,
|
||
RET=POPJ P,
|
||
|
||
GO:
|
||
|
||
LOC 42
|
||
JSR TSINT
|
||
LOC GO
|
||
MOVEI P,PDL
|
||
.OPEN TTYO,[21,,'TTY]
|
||
.LOSE %LSFIL
|
||
.OPEN TTYI,[4,,'TTY]
|
||
.LOSE %LSFIL
|
||
SYSCAL STYGET,[ %CLIMM,,TTYI ? %CLOUT,,STYFLG]
|
||
.LOSE %LSSYS
|
||
SYSCAL TTYGET,[%CLIMM,,TTYO ? %CLOUT,,A ? %CLOUT,,B ? %CLOUT,,C]
|
||
.LOSE %LSFIL
|
||
TLO C,%TSMOR ;PLEASE, NO MORE PROCESSING
|
||
SYSCAL TTYSET,[%CLIMM,,TTYO ? %CLIN,,A ? %CLIN,,B ? %CLIN,,C]
|
||
.LOSE %LSFIL
|
||
SKIPE RUNFLG
|
||
JRST SETDON
|
||
SETOM RUNFLG
|
||
MOVE A,[-NSYMS,,SYMS]
|
||
SYMLP: MOVE B,(A)
|
||
.EVAL B,
|
||
.VALUE
|
||
MOVEM B,(A)
|
||
AOBJN A,SYMLP
|
||
MOVE A,SYSCN
|
||
MOVEI B,1
|
||
PUSHJ P,MAKPAG
|
||
MOVE A,TOIP ;MAKE SURE WE HAVE THE PAGES THE BUFFER POINTERS ARE IN
|
||
MOVE B,NCT
|
||
PUSHJ P,MAKPAG
|
||
MOVE A,TOOP
|
||
PUSHJ P,MAKPAG
|
||
MOVE A,TOBEP
|
||
PUSHJ P,MAKPAG
|
||
MOVE A,TOBBP
|
||
PUSHJ P,MAKPAG
|
||
SETDON: SYSCAL CNSGET,[ %CLIMM,,TTYO ? %CLOUT,,VSZ
|
||
%CLOUT,,HSZ ? %CLOUT,,LTCTYP]
|
||
.LOSE %LSFIL
|
||
GO1: .SUSET [.SMASK,,[%PIIOC+%PITYI]]
|
||
SETZM VPOS
|
||
SETZM JCL
|
||
MOVE A,[JCL,,JCL+1]
|
||
BLT A,JCL+20
|
||
.BREAK 12,[..RJCL,,JCL]
|
||
SKIPN JCL
|
||
JRST [ SKIPE DEBUG
|
||
.VALUE
|
||
.VALUE [ASCIZ \:Use JCLKILL \]]
|
||
CALL GETNUM ;LEAVES <TTY> IN N AS 400000+TTY#
|
||
TTYVAR TCTYP,N,[%CLOUT,,A]
|
||
.LOSE %LSFIL
|
||
TTYVAR TTYOPT,N,[%CLOUT,,B]
|
||
.LOSE %LSFIL
|
||
MOVEM A,FTCTYP
|
||
CAIN A,%TNTV
|
||
.VALUE [ASCIZ |:Doesn't work on TV's.KILL |]
|
||
|
||
; FIND OUT IF IT IS A SOFTWARE IMLAC
|
||
|
||
CAIE A,%TNSFW ; SOFTWARE?
|
||
JRST GO2 ; NO
|
||
TLNE B,%TOIML ; IMLAC (OLD WAY)?
|
||
JRST TST2 ; YES
|
||
TTYVAR SMARTS,N,[%CLOUT,,A]
|
||
JRST GO2
|
||
TLNN A,%TQIM1 ; IMLAC (NEW WAY)?
|
||
JRST GO2 ; NO
|
||
TST2: SKIPN STYFLG
|
||
SETOM SIMLAC
|
||
|
||
GO2: ANDI N,77 ;CLEAR OUT 400000 FOR <TTY>
|
||
ADDM N,TOIP ;SET UP INDEX FIELDS FOR INDIRECTION
|
||
ADDM N,TOOP
|
||
ADDM N,TOBEP
|
||
ADDM N,TOBBP
|
||
MOVE ,N ;WHAT THE HELL DOES THIS LOSSAGE DO?
|
||
LSH ,6
|
||
ADDI ,330012
|
||
LDB A,[030300,,N]
|
||
LSH A,6
|
||
ANDI N,7
|
||
IORI N,'T00(A)
|
||
MOVSS N
|
||
.SUSET [.SSNAM,,N]
|
||
SETZ N,
|
||
MOVE A,@TOBBP
|
||
MOVE B,@TOBEP
|
||
SUB B,A
|
||
PUSHJ P,MAKPAG ;MAKE SURE WE HAVE THE PAGE(S) THE BUFFER ITSELF IS IN
|
||
.IOT TTYO,[^P] ;BOY, IF WE'RE NOT A DISPLAY TERMINAL,
|
||
.IOT TTYO,["C] ; WILL WE LOSE!
|
||
MOVE A,TOIP
|
||
MOVE B,FTCTYP ;TV'S HAVE NO INFO IN TOOP, SO MUST USE TOIP.
|
||
CAIN B,%TNTV
|
||
MOVEM A,TOOP
|
||
MOVE OBP,@TOOP ;HAVE TO START SOMEWHERE
|
||
CAMN OBP,@TOBEP
|
||
MOVE OBP,@TOBBP
|
||
IBP OBP
|
||
LPE:
|
||
LP: UTYI A
|
||
TRZE A,200
|
||
JRST TYPD ;DISPLAY OR CURSOR POS, DISPATCH
|
||
SKIPN SIMLAC
|
||
JRST LP2
|
||
CAIN A,^A ;^A IS MAGIC
|
||
JRST IML.A
|
||
CAIL A,40
|
||
JRST LP2 ;HANDLE NON-CONTROL CHARS NORMALLY
|
||
CAIN A,^G
|
||
JRST LP2 ;HANDLE ^G NORMALLY
|
||
ADDI A,176 ;RECONSTRUCT DISPLAY CODE
|
||
TRZ A,200
|
||
JRST TYPD ;HANDLE DISPLAY CODE
|
||
|
||
IML.A: UTYI A
|
||
CAIE A,^Y
|
||
JRST LP
|
||
UTYI A
|
||
JRST LP
|
||
LP2: .IOT TTYO,A
|
||
JRST LP
|
||
|
||
TYPD: CAIL A,TYPDMX
|
||
JRST LPE
|
||
JRST @TYPDTB(A)
|
||
DTB::
|
||
TYPDTB: TYMOV ;MOVE CURSOR
|
||
TYMOV1 ;DUMMY FOR ABOVE
|
||
TYEEOF ;CLEAR EOF
|
||
TYEEOL ;CLEAR EOL
|
||
TYDELF ;DELETE FWD
|
||
LPE ;TERMINET MOTOR ON
|
||
LPE ; " " OFF
|
||
TYECRL ;CRLF TO DATAPOINTS & IMLACS
|
||
LPE ;"NOP FOR SUPERDUPER IMAGE MODE"
|
||
TYEBS ;BS
|
||
TYELF ;LF
|
||
TYECRL ;CARRET
|
||
LPE ;OUTPUT RESET
|
||
LPE ;QUOTE
|
||
TYEFS ;FWD SPACE
|
||
TYMOV1 ;MOVE CURSOR NEW STYLE
|
||
TYECLR ;CLEAR SCREEN
|
||
TYBEL ; %TDBEL=221 ring bell
|
||
TYINIT ; %TDINI=222 reinitialize terminal
|
||
TYILP ; %TDILP=223 insert lines at cursor
|
||
TYDLP ; %TDDLP=224 delete lines at cursor
|
||
TYICP ; %TDICP=225 insert characters at cursor
|
||
TYDCP ; %TDDCP=226 delete characters at cursor
|
||
TYBOW ; %TDBOW=227 [start reverse video]
|
||
TYRST ; %TDRST=230 [reset display modes]
|
||
TYPDMX==.-TYPDTB
|
||
|
||
TYBEL: .IOT TTYO,[^G]
|
||
JRST LPE
|
||
TYILP:
|
||
TYDLP:
|
||
TYICP:
|
||
TYDCP:
|
||
UTYI
|
||
JRST LPE
|
||
TYINIT:
|
||
TYBOW:
|
||
TYRST: JRST LPE
|
||
|
||
TYMOV: UTYI C ;OLD VPOS
|
||
UTYI B ;OLD HPOS OR 201
|
||
UTYI A ;NEW VPOS
|
||
UTYI B ;NEW HPOS
|
||
SKIPE FTCTYP
|
||
JRST TYMOV0
|
||
SUB A,C
|
||
ADD A,VPOS
|
||
EXCH A,B
|
||
IDIV B,VSZ
|
||
MOVE B,C
|
||
EXCH A,B
|
||
TYMOV0: MOVEM A,VPOS
|
||
MOVEI A,10(A)
|
||
MOVEI B,10(B)
|
||
.IOT TTYO,[^P]
|
||
.IOT TTYO,["V]
|
||
.IOT TTYO,A
|
||
.IOT TTYO,[^P]
|
||
.IOT TTYO,["H]
|
||
.IOT TTYO,B
|
||
JRST LPE
|
||
TYMOV1: UTYI A ;NEW VPOS
|
||
UTYI B ;NEW HPOS
|
||
SKIPE FTCTYP
|
||
JRST TYMOV0
|
||
EXCH A,B
|
||
IDIV B,VSZ
|
||
MOVE B,C
|
||
EXCH A,B
|
||
JRST TYMOV0
|
||
|
||
TYEFS: MOVEI A,"F
|
||
JRST PTYO
|
||
|
||
TYECLR: MOVEI A,"C
|
||
JRST PTYO
|
||
|
||
TYEEOF: MOVEI A,"E
|
||
PTYO: .IOT TTYO,[^P]
|
||
.IOT TTYO,A
|
||
JRST LPE
|
||
TYDELF: MOVEI A,"F
|
||
JRST PTYO
|
||
TYEEOL: MOVEI A,"L
|
||
JRST PTYO
|
||
TYECRL: .IOT TTYO,[^M]
|
||
JRST LPE
|
||
TYEBS: .IOT TTYO,[^H]
|
||
JRST LPE
|
||
TYELF: .IOT TTYO,[^J]
|
||
AOS VPOS
|
||
JRST LPE
|
||
|
||
|
||
GETNUM: MOVEI TTNPTR,TTNBUF
|
||
MOVE C,[440700,,JCL] ;TRY OCTAL FIRST
|
||
SETZ N,
|
||
GETNLP: ILDB A,C
|
||
caie a,^C
|
||
CAIN A,^M
|
||
jrst [iori n,400000 ? popj p,]
|
||
CAIG A,"7
|
||
CAIGE A,"0
|
||
JRST NAM ;MUST BE A UNAME
|
||
SUBI A,"0
|
||
LSH N,3
|
||
IORI N,(A)
|
||
JRST GETNLP
|
||
|
||
NAM: MOVNI D,6 ;SET UP FOR 6 CHARS, INCL SPACES IF NECESS
|
||
MOVE C,[440700,,JCL] ;INPUT POINTER
|
||
MOVE N,C ;OUTPUT POINTER
|
||
NAM1: ILDB A,C
|
||
CAIN A,^M
|
||
JRST NAM2
|
||
CAIN A,40
|
||
JRST NAM1
|
||
CAIL A,140
|
||
SUBI A,40
|
||
IDPB A,N
|
||
AOJL D,NAM1
|
||
JRST DIR1 ;SKIP SPACE FILL IF WE GOT 6 CHS
|
||
|
||
NAM2: MOVEI A,40
|
||
IDPB A,N
|
||
CAME N,[350700,,JCL+1]
|
||
JRST .-2 ;FALL THRU
|
||
|
||
;FALL IN
|
||
DIR1: MOVE D,JCL
|
||
CAMN D,[ASCII /SYS /]
|
||
JRST [ SKIPL N,@SYSCN
|
||
JRST [IORI N,400000 ? RET]
|
||
JRST .+1]
|
||
.OPEN DIRI,[0,,SIXBIT / TTY.FILE.(DIR)/]
|
||
.VALUE
|
||
CALL FLS2LIN
|
||
DIRLP2: MOVNI D,6 ;NO. CHARS IN UNAME
|
||
MOVE C,[440700,,JCL]
|
||
.IOT DIRI,A ;"T" AT START OF LINE
|
||
CAIN A,"D
|
||
JRST [CALL FLSLIN ? JRST DIRLP2]
|
||
CAIE A,"T
|
||
JRST DIREND
|
||
.IOT DIRI,TMN
|
||
.IOT DIRI,TMN+1
|
||
.IOT DIRI,A ;SPACE
|
||
DIRLP3: .IOT DIRI,A ;1ST CHAR OF UNAME
|
||
ILDB B,C
|
||
CAIE B,(A)
|
||
JRST [CALL FLSLIN ? JRST DIRLP2] ; NOT ON THIS LINE OF THE DIR
|
||
AOJL D,DIRLP3
|
||
MOVE N,TMN ;WE FOUND HIM, IN ONE INCARNATION
|
||
SUBI N,"0
|
||
LSH N,3
|
||
MOVE A,TMN+1
|
||
SUBI A,"0
|
||
ADDI N,400000(A) ;MAKE INTO A <TTY>
|
||
MOVEM N,(TTNPTR)
|
||
CALL FLSLIN
|
||
AOJA TTNPTR,DIRLP2
|
||
|
||
FLS2LIN: CALL FLSLIN ;CLEVERLY FALL THRU
|
||
FLSLIN: .IOT DIRI,A
|
||
CAIE A,^J
|
||
JRST FLSLIN
|
||
; JRST DIRLP2
|
||
RET
|
||
|
||
DIREND: .CLOSE DIRI,
|
||
CAIE TTNPTR,TTNBUF
|
||
SOJA TTNPTR,DIREN1
|
||
SKIPE DEBUG
|
||
.VALUE
|
||
.VALUE [ASCIZ |:Not logged in? KILL |]
|
||
DIREN1: MOVE N,(TTNPTR)
|
||
CAIN TTNPTR,TTNBUF ;SKIP OF WE FOUND MORE THAN ONE OF HIM
|
||
RET
|
||
DIREN2: SKIPN A,(TTNPTR)
|
||
RET ;AT THE END OF THE LIST
|
||
; SYSCAL TTYVAR,[ MOVEI A ? [SIXBIT |TCTYP|] ? MOVEM B]
|
||
TTYVAR TCTYP,A,[%CLOUT,,B]
|
||
; SETZ B,
|
||
.VALUE ;DEBUGGING?
|
||
CAIE B,%TNSFW ;WE WANT TO USE HIS SOFTWARE TERMINAL,
|
||
AOJA TTNPTR,DIREN2
|
||
MOVEI N,(A) ; IF HE HAS ONE.
|
||
AOJA TTNPTR,DIREN2
|
||
|
||
;GET THE SAME PAGE THE SYS JOB HAS IN ITS PAGE WHOSE ADDRESS IS IN A, # WORDS IN B
|
||
MAKPAG: ANDI A,-1
|
||
PUSH P,A
|
||
ASH A,-10.
|
||
MOVEM A,CBLK1 ;GET FIRST PAGE
|
||
.CALL CBLK
|
||
.VALUE
|
||
POP P,A
|
||
ADDI A,-1(B) ;ADDRESS OF LAST WORD
|
||
ASH A,-10.
|
||
CAMN A,CBLK1
|
||
POPJ P,
|
||
MOVEM A,CBLK1
|
||
.CALL CBLK ;CROSSES PAGE BOUNDARY, GET SECOND PAGE
|
||
.VALUE
|
||
POPJ P,
|
||
|
||
TSINT: 0
|
||
0
|
||
EXCH A,TSINT
|
||
TSIN1: TRZE A,%PIIOC ;TYPICALLY ILLEGAL CHAR AFTER ^P
|
||
JRST [ AOS TSINT+1 ;SO FORGET IT
|
||
JRST INTRET]
|
||
TRZE A,%PITYI
|
||
JRST [ MOVEI CH,TTYI
|
||
.ITYIC CH,
|
||
JRST INTRET
|
||
CAIE CH,^Z
|
||
JRST VALRT
|
||
JRST INTRET]
|
||
.VALUE [ASCIZ \:UNKNOWN INTERRUPT?<1B>\]
|
||
INTRET: JUMPN A,TSIN1
|
||
MOVE A,TSINT
|
||
.DISMIS TSINT+1
|
||
|
||
VALRT: CAIN CH,40
|
||
.IOT TTYI,CH ; EAT UP SPACE
|
||
CAIE CH,^L
|
||
JRST BYEBYE
|
||
VALL: .IOT TTYI,CH ; EAT UP ^L
|
||
.IOT TTYO,[^P]
|
||
.IOT TTYO,["C]
|
||
JRST INTRET
|
||
BYEBYE: .IOT TTYO,[^M]
|
||
.BREAK 16,160000
|
||
|
||
|
||
CBLK: SETZ
|
||
SIXBIT \CORBLK\
|
||
1000,,210000 ;READ ACCESS, FAIL IF CAN'T
|
||
[-1] ;PUT PAGE IN SELF
|
||
CBLK1
|
||
SETZI 400000 ;GET FROM SYS JOB
|
||
CBLK1: 0 ;GETS -#PAGES,,PAGE # TO START
|
||
|
||
JCL: BLOCK 20
|
||
TMN: 0 ? 0 ;HOLDS 2 DIGIT TTY NO. FOR DIRI
|
||
LTCTYP: 0 ;LOCAL TCTYP
|
||
FTCTYP: 0 ;FOREIGN TCTYP
|
||
VSZ: 0 ;LOCAL VERTICAL SCREEN SIZE
|
||
HSZ: 0 ; " HORIZONTAL " "
|
||
VPOS: 0 ;CURRENT (HOPEFULLY) LOCAL VERTICAL CURSOR POS
|
||
RUNFLG: 0 ;NONZERO IF SETUP DONE ALREADY
|
||
DEBUG: 0 ;-1 => INHIBIT :KILLS.
|
||
SIMLAC: 0 ;NONZERO => IMLAC RUNNING AS SOFTWARE TTY
|
||
STYFLG: 0 ;NONZERO => USER IS ON STY
|
||
SYMS:
|
||
IRPS X,,[NCT TOBEP TOBBP TOIP TOOP SYSCN]
|
||
X: SQUOZE 0,X
|
||
TERMIN
|
||
NSYMS==.-SYMS
|
||
TTNBUF: BLOCK 10 ;WILL LOSE IF THE LUSER HAS > 10 Tmn's
|
||
|
||
CONSTA ? VARIAB
|
||
LPDL==20
|
||
PDL: BLOCK 20
|
||
PATCH": BLOCK 100
|
||
|
||
END GO
|
||
|
||
;; Local Modes:
|
||
;; Mode:MIDAS
|
||
;; Comment Column:32
|
||
;; END:
|