From a2988216e863db17e9e01dd40c6831ca059ed1f4 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Wed, 7 Dec 2016 22:15:47 -0800 Subject: [PATCH] Added OS: realtime TTY spy. --- README.md | 1 + build/build.tcl | 4 + src/sysen2/os.93 | 443 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 448 insertions(+) create mode 100644 src/sysen2/os.93 diff --git a/README.md b/README.md index 1aeceb35..52db601b 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ There's a [DDT cheat sheet](doc/DDT.md) for Unix users. - MTBOOT, make bootable tapes. - NAME, Shows logged in users and locations, aka FINGER. - NETIME, network time dragon. + - OS, realtime TTY spy - PANDA, user account management program. - PDSET, set time and date. - PEEK, system monitoring. diff --git a/build/build.tcl b/build/build.tcl index 0fd897f6..b3279958 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -723,6 +723,10 @@ expect ":KILL" respond "*" ":midas sys3;ts scandl_sysen1;scandl\r" expect ":KILL" +# os +respond "*" ":midas sys1;ts os_sysen2;os\r" +expect ":KILL" + # ndskdmp tape respond "*" ":link kshack;good ram,.;ram ram\r" respond "*" ":link kshack;ddt bin,.;@ ddt\r" diff --git a/src/sysen2/os.93 b/src/sysen2/os.93 new file mode 100644 index 00000000..b2d8c31f --- /dev/null +++ b/src/sysen2/os.93 @@ -0,0 +1,443 @@ +;-*-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 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 + 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 + 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?î\] +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: