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