1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-20 01:45:49 +00:00
2016-12-08 08:36:05 +01:00

444 lines
8.2 KiB
Plaintext
Raw 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.

;-*-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: