IF1, TITLE USER TELNET TN6 IF2, INFORM BEGIN PASS 2 A=1 B=2 C=3 D=4 E=5 T=6 TT=7 I=10 Q=11 J=12 R=13 W=14 H=15 U=16 P=17 ;CHANNELS LSOC==1 TYIC==2 TYOC==3 NTIC==4 NTOC==5 DKOC==6 TIPO==7 INFCH==10 INFICP==11 ;;;DEFINE SOCKET STATE CODES SS.CLS==0 ;CONNECTION CLOSED SS.LSN==1 ;LISTENING FOR RFC SS.RFC==2 ;RFC RECEIVED WHILE LISTENING SS.RCL==3 ;RFC RECEIVED BUT GOT CLOSED SS.RFS==4 ;RFC WAS SENT SS.OPN==5 ;CONNECTION OPEN SS.RFN==6 ;RFNM WAIT SS.CLL==7 ;CLS WAS SENT BUT NOT YET RECEIVED SS.CLI==10 ;CLS RECEIVED BUT INPUT STILL AVAIL SS.INP==11 ;CONNECTION OPEN AND INPUT AVAIL ;CLS REASONS CL.NTO==0 ;NEVER OPENED CL.USR==1 ;CLSED BY USER CL.FRN==2 ;CLSED BY FOREIGN HOST CL.RST==3 ;RST CL.DED==4 ;HOST DEAD CL.INC==5 ;INCOMPLETE TRANSMISSION CL.BYT==6 ;BYTE SIZE MISMATCH. .MLLIT==1 ;;; DEFINE BIT IN INFERIOR'S PIRQC SET FOR .BREAK BRKBIT==2000 ;BIT SET IN HIS PIRQC INFBIT==1,, ;BIT SET IN OUR IFPIR INFCOR=400000 ;INFERIOR'S CORE MAPPED IN ;;;DEFINE FIRST WORD MASK: REALT + ERRORS .MASK.==200000,,200400 ;REALT,,PDLOV+IOCER - REST ERRORS ARE CLASS 2 .MSK2.==INFBIT+1276 ;ALL I/O CHANNELS, JUST ABOUT ;;;DEFINE BIT IN LH OF OPTION WORD TO AVOID RELOADING A HACTRN ;;; IF WE CRAP OUT WHEN WE ARE :ATTACH'ED OPTDET==200000 ;;;DEFINE BIT IN LH OF OPTION WORD TO USE NEW INTERRUPT SYSTEM OPTINT==004000 ;4.3 .INSRT SYSENG;TTY DEFS ;;;MACRO TO PUT THINGS ON DIFFERENT PAGES 0LOC==. 1LOC==2000 CURPAG==0 DEFINE PAGE X IFN X#CURPAG, CONSTANTS IFE CURPAG, 0LOC==. IFN CURPAG, 1LOC==. CURPAG==X IFE X, LOC 0LOC .ELSE LOC 1LOC TERMIN DEFINE INFORM A,B,C,D,E,F,G,H,I,J PRINTX\ A!B!C!D!E!F!G!H!I!J \ TERMIN ;;; System-Call Macro. (BORROWED FROM CALRET) DEFINE .CALL PROC,IN,OUT,CTLB ;COUNT ARGUMENTS .CLST.==0 .CLCT. IN .CLCT. OUT .CLCT. CTLB 043000,,[SETZ .1STWD SIXBIT/PROC/ .CLAG. 4000,CTLB .CLAG. 0,IN .CLAG. 2000,OUT IFN .CLST.,ERR BAD FORMAT SYSTEM CALL ] TERMIN DEFINE .CLCT. ?A,B,C,D,E,F,G,H ;CROCK DUE TO IRP LOSS IFNB [A] .CLST.==.CLST.+1 IFNB [B] .CLST.==.CLST.+1 IFNB [C] .CLST.==.CLST.+1 IFNB [D] .CLST.==.CLST.+1 IFNB [E] .CLST.==.CLST.+1 IFNB [F] .CLST.==.CLST.+1 IFNB [G] .CLST.==.CLST.+1 IFNB [H] .CLST.==.CLST.+1 TERMIN ;;; ARGUMENT POINTER GENERATOR FOR ABOVE ;;; A # INDICATES AN IMMEDIATE ARGUMENT DEFINE .CLAG. BITS?A,B,C,D,E,F,G,H IFNB [A] .CLG1. BITS,A IFNB [B] .CLG1. BITS,B IFNB [C] .CLG1. BITS,C IFNB [D] .CLG1. BITS,D IFNB [E] .CLG1. BITS,E IFNB [F] .CLG1. BITS,F IFNB [G] .CLG1. BITS,G IFNB [H] .CLG1. BITS,H TERMIN DEFINE .CLG1. BITS?ARG .CLST.==.CLST.-1 ;COUNT ARGS .CLG2.==0 IRPNC 0,1,-1,CH,REST,[ARG] IFSE [CH]#,[ ,,REST .CLG2.==1 ] ;Immediate IFSN [CH] , .ISTOP ;STOP ON FIRST NON BLANK TERMIN IFE .CLG2., ,,ARG TERMIN PAGE 1 ;PUT PATCH IN SECONDARY PAGE PATCH:PAT: LOC 42 -INTBKL,,INTBK LOC PATCH BLOCK 20 ;ain't much space left PAGE 1 ;PUT INITIALIZATION IN SECONDARY PAGE GO: .SUSET [.ROPTION,,A] TLO A, OPTINT+OPTDET ;NEW INTR SYS .SUSET [.SOPTION,,A] .SUSET [.RJNAME,,JNAME] MOVE A, JNAME CAIE A, 44 ;This is a crock! Should test MULTICS in hostab. CAIN A, 6 JRST .+2 CAIN A, 54 .VALUE [ASCIZ \TN6J P\] CAIE A, 1 ;1LINER CODE CAMN A, [SIXBIT/1LINER/] SETOM 1LINER SETOM MORON ;NO TYPE IN YET .OPEN TYIC,[%TIINT+.UII,,(SIXBIT /TTY/)] ;%TIINT? YOU SURE? .VALUE .OPEN TYOC, [%TJDIS+.UAO,,(SIXBIT /TTY/)] ;TRY ASCII FOR A WHILE, INSTEAD IMAGE .VALUE .CALL TTYGET,#TYIC,[B,B,A] ;TTYSTS TO A .VALUE TLZ A, %TSMOR ;LET ITS DO **MORE** TLO A, %TSALT ;DON'T WORRY ABOUT ALTMODE .CALL TTYSET,[#TYIC,TTYST1,TTYST2,A] .VALUE MOVE P,PDL MOVE A,[SQUOZE 0,IMPUP] .EVAL A, .VALUE MOVEI B,C HRL B,A .GETLOC B, JUMPLE C,GOOK MOVEI A,[ASCIZ / Our NCP is down. /] PUSHJ P,TYPE JRST KLVLRT GOOK: PUSHJ P, TTYUP ;GET TYPE OF TTY .SUSET [.RUNAME,,A] CAMN A, [SIXBIT/CSR/] PUSHJ P, ATTACH ;CSR users don't need a Hactrn PUSHJ P, CPTYP "C ;clear screen MOVE A, [.FNAM1] SKIPE 1LINER MOVE A, [SIXBIT/1LINER/] PUSHJ P, SIXTYP .IOT TYOC, [40] MOVE A,[.FNAM2] PUSHJ P,SIXTYP SETZM JCLF SETZM JCLB MOVE A,[JCLB,,JCLB+1] BLT A,JCLB+4 .SUSET [.ROPTION,,A] ;SEE IF JCL TLNN A,40000 JRST NOJCL .BREAK 12,[5,,JCLB] SETOM JCLF MOVE A,[440700,,JCLB] MOVEM A,JCLP NOJCL: .SUSET [.SMASK,,[.MASK.]] ;REALT+ERRORS SETZM PRSIST ;ON MEANS RETRYING PERSISTENTLY GOGO: MOVE A, [440700,,LINBUF] MOVEM A, LINBFP SETZB B, MADEIT IDPB B, A MOVE A, [440700,,OLNBUF] MOVEM A, OLNBFP IDPB B, A MOVSI A,(SETZ) .REALT A, .RESET TYIC, MOVE T,[440700,,LINBUF] MOVEM T, LINBFP SETOM CH1ST SETOM CASE SETOM ECHO ;LOCAL ECHO SETOM QUOTE MOVEI A,3 MOVEM A,ICPDNE SKIPN PRSIST JRST GO3 ;INITIAL TRY MOVE B, NET5+3 ;PERSISTENTLY PESTERING THIS HOST .SUSET [.SMSK2,,[0]] ;IS THIS NEEDED?? MOVEI A, 300. .SLEEP A, ;GIVE A BRIEF RESPITE .LISTEN A, ;STOP IF GUY HITS A CHARACTER JUMPE A, GO4 ;OK, GO RECONNECT ;NOT OK, STOP GO3: .SUSET [.SMSK2,,[0]] MOVEI A,1 SKIPE T, 1LINER MOVEI A, 21 MOVEM A,FRNISC ;FOREIGN INITIAL SOCKET MOVEI B, 102 ;(sri-ai) JUMPN T, GO4 MOVEI B, 6 HLRZ A, JNAME SETOM MULFLG CAIN A, 'MUL ; :MULTICS COMMAND? JRST GO4 SETZM MULFLG SETOM CTRFLG MOVEI B,25 CAIN A,'CTR JRST GO4 SETZM CTRFLG MOVEI A,[ASCIZ / Host = /] PUSHJ P,TYPE SETZM TIP ; HOST NAME READER BORROWED FROM KLH GO3A: MOVEI B,0 ;B GETS HOST NUM (OCTAL) MOVEI C,0 ;(DECIMAL) SETZB H, PRSIST ;FIRST TIME AROUND, CLEAR FLAG MOVEI H,0 MOVEI TT,0 ;-1 => MNEMONIC MODE MOVEI Q,0 ;-1 => HAVE GOTTEN DEC PNT MOVE J,[360600,,HOSTTB(B)] MOVSI I,-HSTBL ;AOBJN INTO HOSTTB MOVE U,[440700,,RCPBUF] ;PTR TO SPEC STRING MOVE W,U ;PTR INTO COLLECTED STRING SETZM CHRCNT' ;COUNT OF CHARS IN STRING MOVE A,HOSTTB(I) HRLI A,440700 MOVE H,A ;PTR INTO CURRENT HOST STRING GO1: PUSHJ P,GETCHR ;GET INPUT CHAR HERE CAIN A,^X JRST KLVLRT ;DIE IMMEDIATELY ON ^X JUMPE A,GO1 ;IGNORE NULLS. CAIN A,177 JRST GO2 ;RUBOUT MEANS FLUSH, START OVER. CAIN A,", JRST GOCMA ;COMMA MEANS PREV. TYPEIN WAS SOCKET #. CAIN A, "; JRST GOSEMI CAIN A, "! JRST GOBANG CAIE A,12 CAIN A,15 JRST GOTRM ;E-O-L MEANS USER DONE WITH SPEC. CAIE A,"? CAIN A,33 ;? OR ALT MEANS LIST ALL POSSIBLE HOSTS, JRST GOTALT ;GIVEN TYPEIN THUS FAR. JUMPL TT,GOTC ;JUMP IF PARSING NAME CAIL A,"0 ;ELSE PARSING NUMBER? CAILE A,"9 JRST NOTN ;HMMM..ANOMALOUS. ONLY VALID CHAR IS "." LSH B,3 IORI B,-"0(A) ;STUFF NUMBER INTO OCTAL VALUE IMULI C,10. ADDI C,-"0(A) ;AND INTO DECIMAL VALUE. (PARSE 2 WAYS AT ONCE) GOECH: .IOT TYOC,A ;FINALLY ACCEPTED, ECHO JRST GO1 ;AND GET ANOTHER CHAR GO2: .IOT TYOC,["?] ;FOO, BAD SYNTAX JRST GO3 GOBANG: SETOM PRSIST ;PERSISTENTLY TRY TO CONNECT JRST GOECH GOSEMI: LSH B, 16. ;TIP PORT -> SOCK NO SETOM TIP ;flag for no ICP ADDI B, 2 MOVEM B, FRNISC ;good place to save sock no .IOT TYOC, A JRST GO3A GOCMA: MOVEM B,FRNISC ;COMMA MEANS PREVIOUS VALUE WAS SOCKET # .IOT TYOC,A TRNE B,1 ;MUST BE ODD JRST GO3A ;NOW GET THE HOST JRST GO2 ;FOO, CAN'T ICP TO AN EVEN SOCKET #. NOTN: JUMPE B,GOTC ;IF NO # ENTERED YET, CONSIDER THIS PART OF HOST SPEC. CAIE A,". ;HMM, # ENTERED. JRST BAD ;FOO, ONLY "." VALID AT THIS POINT JUMPL Q,BAD ;FOO IF ALREADY 'CONVERTED' # TO DECIMAL MOVNI Q,1 ;SET FLAG FOR ABOVE CHECK MOVE B,C ;'CONVERT' TO DECIMAL. (SUBSTITUTE) JRST GOECH ;CONTINUE BAD1: SUB P,[1,,1] BAD: MOVEI A,7 ;IF BAD CHAR GIVEN, DING BELL. JRST GOECH GETCHR: SKIPGE JCLF ;GET A CHAR FROM WHEREVER JRST GETJCL .IOT TYIC,A POPJ P, GETJCL: ILDB A,JCLP ;FURNISH JCL CHARS CAIN A,15 SETZM JCLF POPJ P, ;GOT A HOST-NAME CHAR. STORE IF IT PLUS STRING THUS FAR ;MATCHES A NAME, DON'T STORE IF NOT. GOTC: SETO TT, ;INDICATE USER GAVE AT LEAST ONE CHAR CAIL A,141 CAILE A,172 SKIPA SUBI A,40 ;CONVERT TO UPPERCASE MOVE R,W ;GET A TEMP. POINTER TO STORAGE STRING IDPB A,R ;DEPOSIT IN STRING USING TEMP. PTR AOS CHRCNT ;INCREMENT COUNT OF CHARS IN STR. MOVE E,H ;GET TEMP. POINTER TO NAME CURRENTLY IN FAVOR ILDB D,E ;GET NEXT CHAR FROM IT CAME A,D ;SAME AS CHAR TYPED IN? JRST GOTC1 ;NOPE, MUST LOOK FOR BETTER MATCH FARTHER DOWN GOTCW: IBP W ;AHA! NAME STILL OK! INCREMENT REAL PTRS IBP H ;TO FORMALLY DEPOSIT CHAR. JRST GOECH ;AND GO GET ANOTHER. GOTC1: PUSHJ P,HFIND ;LOOK FOR BETTER MATCH JRST GOTC2 ;UGH, NONE FOUND. MOVE I,D ;FOUND ONE! MAKE IT THE ONE CURRENTLY IN FAVOR MOVE H,E ;BY USING ITS RETURNED ARGS. IBP W ;AND FORMALLY DEPOSIT CHAR TYPED IN JRST GOECH ;AND GET ANOTHER. GOTC2: SOS CHRCNT ;BAH, NO MATCH AT ALL, TAKE IT BACK JRST BAD ;AND DING BELL WITHOUT ECHOING. ;GOT A E-O-L, SEE IF HAVE ENOUGH OF NAME TO RENDER IT ;UNIQUE. GOTRM: JUMPGE TT,GO4 ;JUST NUMERICAL VALUE? IF SO, WIN. SKIPG CHRCNT ;HMMM, ANYTHING IN STRING STORED? JRST BAD ;NO, DING... SETZM SWIT' ;YEP. CLEAR 'AMBIGUOUS' SWITCH HLRZ B,HOSTTB(I) ;GET FAVORED HOST # INTO B MOVE D,H ;GET TEMP PTR INTO FAVORED NAME ILDB D,D ;GET NEXT CHAR, AND JUMPE D,GO4 ;WIN IF IT'S NULL=END OF STRING. ;NOPE, ONLY PARTIAL MATCH. MUST CHECK PUSH P,I ;REST OF TABLE TO MAKE SURE 'TIS UNIQUE. GOTRM1: PUSHJ P,HFIND ;FIND A MATCH JRST GOTRM3 ;HMMM, NONE LEFT. MOVE I,D ;FOUND ONE. GET INDEX ILDB A,E ;AND CHECK TO SEE IF A FULL MATCH. JUMPN A,GOTRM9 ;NOPE, NEXT CHAR NOT NULL. HLRZ B,HOSTTB(D) ;AH, COMPLETE MATCH! SUB P,[1,,1] ;HAVE THE UNIQUE NAME, WIN. JRST GO4 GOTRM9: HLRZ A,HOSTTB(D) ;PARTIAL MATCH. GET ITS HOST # CAMN A,B JRST GOTRM1 ;AND IGNORE THIS ONE IF FOR SAME HOST. GOTRM4: SETOM SWIT ;HMMM, FOUND DIFFERENT-SITE PATIAL MATCH JRST GOTRM1 ;SET AMBIGUOUS SWITCH AND CONTINUE. ;(MAY FIND COMPLETE MATCH FARTHER ON) GOTRM3: POP P,I ;GONE THRU WHOLE TABLE WITHOUT COMPLETE MATCH. SKIPN SWIT ;WAS AMBIGUITY DETECTED? JRST GOTRM8 ;NO, JUST ONE PARTIAL MATCH, WIN! JRST BAD ;UGH, YES. FAIL AND DING. GOTRM2: .IOT TYOC,A ;WINNING PARTIAL MATCH..OUTPUT REST GOTRM8: ILDB A,H ;OF THE NAME MATCHED TO. JUMPN A,GOTRM2 JRST GO4 ;GOT ? OR ALT, LIST ALL NAMES POSSIBLE AT THIS STAGE. ;I.E. COMPLETE STRING (IF ANY) TYPED IN, FOR ALL ;POSSIBILITIES. GOTALT: SKIPL TT JUMPN B,GO1 PUSH P,J PUSHJ P,CRLF PUSH P,I SUB I,[1,,1] MOVSI B,-HSTBL GOTAL2: SKIPN CHRCNT JRST GOTAL6 PUSHJ P,HFIND JRST GOTAL5 MOVE I,D SKIPA A,HOSTTB(I) GOTAL6: MOVE A,HOSTTB(B) PUSHJ P,TYPE GOTAL1: PUSHJ P,CRLF AOBJN B,GOTAL2 GOTAL5: POP P,I POP P,J MOVEI A,[ASCIZ /Host=/] PUSHJ P,TYPE SKIPG E,CHRCNT JRST GO1 MOVE D,U GOTAL7: ILDB A,D .IOT TYOC,A SOJG E,GOTAL7 JRST GO1 ; TAKES I,H,U AS ARGUMENTS AND LOOKS FOR THE NEXT ;MATCH IN THE TABLE... SKIPS IF WINS. ;LOSES IF TABLE STRING COUNTS OUT BEFORE INPUT STRING, ;OR IF STRINGS AREN'T IDENTICAL UP TO COUNTOUT OF INPUT ;STRING. WINS IF IDENTICAL UP TO COUNTOUT OF INPUT STRING. ;WHEN WINS, RETURNS IN D AND E THE NEW I AND H. HFIND: SKIPN CHRCNT' POPJ P, PUSH P,I PUSH P,H PUSH P,W HFND1: AOBJP I,HFNDL MOVE H,HOSTTB(I) HRLI H,440700 MOVE W,U MOVE T,CHRCNT HFND2: ILDB D,H ILDB E,W JUMPE D,HFND1 CAME D,E JRST HFND1 SOJG T,HFND2 MOVE D,I MOVE E,H AOS -3(P) HFNDL: POP P,W POP P,H POP P,I POPJ P, RCPBUF: BLOCK 6 VARIABLES PAGE 1 ;PUT THIS INITIALIZATION ON SECONDARY PAGE TTYUP: PUSHJ P, UPVPOS SETZM SCML .CALL CNSGET,#TYOC,[NLINES,LINEL,A,B,B] ;TCTYP IN A, TTYOPT IN B .VALUE SETZM CDCFLG ;NOT CDC UNLESS PROVEN TO BE SETZM IMLAC CAIN A, 3 ;IMLAC - SET FLAG SETOM IMLAC SETZM BTBFG CAIN A,7 SETOM BTBFG TLC B, %TOMVU+%TOERS+%TOMVB ;DISPLAY? TLCE B, %TOMVU+%TOERS+%TOMVB SETOM NLINES ;NO - SET FLAG SETZM NOBS ;SEE IF CAN OVERPRINT TLNN B, %TOOVR SETOM NOBS ;CAN'T MOVE T, NLINES CAIE T, 16. ;16 LINE SCREEN IS CDC713 POPJ P, SETCDC: SETOM CDCFLG ;FLAG THAT TTY IS REALLY STY DAEMON MOVE T, [CDCTAB,,CTLTAB] ;DIFFERENT CONTROL BLT T, CTLTAB+37 ;CHARACTERS. POPJ P, PAGE 1 GO4: MOVEI C, 8. CAIE B,54 CAIN B, 6 ;MULTICS HAS DIFFERENT TABS MOVEI C, 10. MOVEM C, TABLEN JUMPE B,GO3 PUSHJ P, CRLF .IOT TYOC,["*] PUSHJ P,CRLF MOVEM B,NET1+3 MOVEM B,NET4+3 MOVEM B,NET5+3 GO5: .SUSET [.SMSK2,,[.MSK2.]] SKIPE TIP ;don't bother with timer if not doing ICP JRST GO5T1 MOVE J,[600000,,[60.*30.]] .REALT J, JFCL .OPEN LSOC,NET1 JRST ANAL1 SKIPE CH1ST .HANG GO5T1: MOVE J,LOCSOC ADDI J,2 ;RECEIVE MOVEM J,NET4+1 ADDI J,1 MOVEM J,NET5+1 MOVEI A, 40 ;non-TIP OPEN mode SKIPN TIP JRST GO5T2 MOVEI A, 50 ;TIP OPEN mode (gensoc) SETZM ICPDNE SKIPA J, FRNISC ;foreign receive socket stashed GO5T2: .IOT LSOC,J ;FOREIGN RECEIVE SOCKET MOVEM J,NET5+2 ADDI J,1 MOVEM J,NET4+2 HRLM A, NET4 ;select opening mode .OPEN NTIC,NET4 ;RECEIVE JRST ANAL4 MOVE A, [NTIC,,RCH] .RCHST A, AOS A, RCH+1 SKIPE TIP MOVEM A, NET5+1 .OPEN NTOC,NET5 ;SEND JRST ANAL5 SKIPN TIP .CLOSE LSOC, SETZM PRSIST ;made it, don't re-persist SETOM MADEIT JRST MP00 ANAL1: MOVEI J, LSOC JRST ANALY ANAL4: MOVEI J, NTIC JRST ANALY ANAL5: MOVEI J, NTOC ANALY: .CALL STATUS,J,A ;GET OPNL CODE SETZ A, HLRZS A ANDI A,77 CAIE A,20 JRST ANALY1 MOVE A, NET1+3 PUSHJ P, DEDSAY RETRYJ: JRST RETRY ANALY1: CAIE A,6 .VALUE MOVEI A,[ASCIZ / All Sockets in Use /] ANALY2: PUSHJ P,TYPE JRST RETRY PAGE 0 ;PUT INTERRUPT HANDLER ON PRIMARY PAGE ;;INTERRUPT CONTROL BLOCK INTBK: P 0 ? 2 ;CH1 0 ? -1 CH1 0 ? 4 ;CH2 0 ? 364 ;ALLOW INF INTR IN CASE BARFS CREATING CH2INT 0 ? 10 ;**MORE** INTR 0 ? ,,-1 ;INHIBIT TYI INTS MORINT 0 ? 20 ;CH4 0 ? 777767 ;allow only **more** ints CH4 0 ? 40 ;CH5 0 ? 777767 ;allow only **more** ints CH5 0 ? 200 ;CH7 0 ? 777767 ;allow only **more** ints CH7 0 ? INFBIT ;GRAPHICS INFERIOR 0 ? INFBIT INFINT 0 ? 1_INFICP ;ICP TO GRAPHICS INFERIOR 0 ? 1_INFICP INFICI 200000 ? 0 ;PDLOV 0 ? 0 [.VALUE ] ;doesn't happen anymore (I hope) 400 ? 0 ;IOCER 0 ? -1 IOCER 200000,,0 ? 0 ;REALT 0 ? -1 TSFW INTBKL==.-INTBK TSRET2: ;LEAVING CH2 BREAK, RESTORE REGS REPEAT P-1, POP P, P-1-.RPCNT TSRET: .CALL DISMISS,P ;DISMISS THE INTERRUPT .VALUE ;GAAAACK!! TSFW: MOVEI A,[ASCIZ /Timed Out /] PUSH P,RETRYJ ;type and jrst retry TYPE: HRLI A,440700 ;MUST NOT CLOBBER B PUSH P, A CAIA TYPE1: .IOT TYOC,A ILDB A,(P) CAIN A, ^P ;CAN'T INT IN MIDDLE OF ^P JRST [ ILDB A, (P) PUSH P, B PUSHJ P, CPTYPE POP P, B JRST TYPE1+1 ] JUMPN A, TYPE1 CPOPAJ: POP P, A POPJ P, ; TYPE CHAR IN A AFTER ^P, DON'T ALLOW INT CPTYPE: .SUSET [.RDF2,,B] .SUSET [.SDF2,,[777767]] ;don't allow interrupts .IOT TYOC, [^P] ;except **MORE** PUSH P,A ANDI A,777 .IOT TYOC, A POP P,A LSH A,-9. ;more? TRNE A,777 .IOT TYOC,A .SUSET [.SDF2,,B] POPJ P, CPTYP: PUSH P, A ;TYPE FOLLOWING WORD AFTER ^P MOVE A, @-1(P) AOS -1(P) PUSHJ P, CPTYPE JRST CPOPAJ PAGE 1 ;THIS CRUFT CAN GO ON SECONDARY PAGE I GUESS NTYPE: IDIVI A,10 HRLM B,(P) SKIPE A PUSHJ P,NTYPE HLRZ B,(P) .IOT TYOC,"0(B) POPJ P, SIXTYP: MOVE B,[440600,,A] SIXTY1: ILDB C,B JUMPE C,CPOPJ ADDI C,40 .IOT TYOC,C TLNE B,770000 JRST SIXTY1 POPJ P, NSEND: HRLI A,440700 PUSH P,A CAIA NSLP: .IOT NTOC,A ILDB A,(P) JUMPN A,NSLP .NETS NTOC, POP P,A POPJ P, PAGE 1 ;;;SERVICE ROUTINE FOR I.O.C. FAULTS IOCER: PUSH P,J .SUSET [.RBCHN,,J] ;GET FAULTING CHANNEL NUMBER CAIN J,7 ;TIP CHANNEL NON FATAL JRST ANAL7 PUSH P,A PUSH P,B MOVS A,J ;DO .RCHST HRRI A,RCH ;HOPEFULLY WASN'T USING THIS... .RCHST A, HRRZ A,RCH CAIE A,'NET ;NETWORK CHANNEL? JRST IOCER0 ;NO, RANDOM HRRE B,RCH+4 ;GET SOCKET STATE JUMPL B, OHSHIT ;NCP CRASHED JUMPE B, CH4CL ;CLOSED ;IOC ERR BUT NOT CLOSED?? ; RANDOM IOC ERROR, STATUS IN A IOCER0: .IOT TYOC,[^M] ;newline, clear ^P loss state MOVEI A,'ERR MOVEI B,1 ;get err msg for losing chnl .OPEN 17,A JRST IOCER1 ; I tried the best I could IOCER2: .IOT 17,A CAIG A,15 JRST IOCER1 .IOT TYOC,A JRST IOCER2 IOCER1: .CLOSE 17, POP P,B POP P,A POP P,J .VALUE [ASCIZ/: IOC BREAK î/] JRST TSRET ANAL7: POP P, J SETZM TIPSY ;DON'T USE TIP ANY MORE .CLOSE TIPO, PUSH P, A MOVEI A, [ASCIZ/ TIP DIED. /] PUSHJ P, TYPE POP P, A JRST TSRET ;HOPE FOR THE BEST PAGE 1 ;THIS CODE ONLY USED IN INITIALIZATION - SECONDARY PAGE CH1: PUSH P, A PUSH P, B SKIPL CH1ST JRST CH1B MOVE A,[LSOC,,RCH] .RCHST A, MOVE A,RCH+1 MOVEM A,LOCSOC HRRZ A,RCH+4 ;STATE CAIN A, SS.CLI JRST CH1A CAIE A, SS.INP ;INPUT AVAILALBE CAIN A, SS.OPN ;CONNECTION OPEN JRST CH1A CAIN A, -1 JRST OHSHIT JUMPN A,CH1V1 .CLOSE LSOC, MOVE A,RCH+5 CAIE A,2 ;CLSED BY FOREIGN HOST JRST CH1C MOVEI A,[ASCIZ / Logger Connection Refused /] PUSHJ P,TYPE RETRY: SETZM MADEIT ;give loser another chance RETRY0: MOVSI A,(SETZ) .REALT A, JFCL MOVE A,XRESET .SUSET A .CLOSE LSOC, .CLOSE NTIC, .CLOSE NTOC, MOVE P, PDL .CALL DISMIS,[#0,#GOGO1,#0,#0] .VALUE MULFLG: 0 CTRFLG: 0 GOGO1: SKIPN MULFLG ;:MULTICS, DON'T RETRY SKIPE 1LINER JRST KLVLRT ;1LINER, DON'T ATTEMPT TO RETRY. SKIPN MADEIT ;INCOMPLETE CONNECTION? JRST GOGO ;YES, TRY AGAIN SKIPE ICPDNE ;COMPLETE. REALLY? JRST GOGO ;NO, TRY AGAIN JRST KLVLRT ;FOREIGN HOST CLOSED AFTER FULL SESSION, DONE. CH1C: CH1CA: MOVE A,CLSTAB(A) PUSHJ P,TYPE LDB A, [001100,,RCH+3] ;GET HOST NUMBER PUSHJ P, DEDSY0 JRST RETRY0 CH1A: SETZM CH1ST JRST CH1X CH1V1: .VALUE OHSHIT: MOVEI A, NCPDWN ;May not be a DDT to .VALUE to PUSHJ P, TYPE JRST RETRY NCPDWN: ASCIZ \Local NCP has Crashed. \ CH1B: MOVE A,[LSOC,,RCH] .RCHST A, HRRZ A,RCH+4 CAIN A, -1 JRST OHSHIT JUMPN A,CH1X MOVE B,RCH+5 CAIE B,2 .VALUE .CLOSE LSOC, CH1X: POP P, B POP P, A JRST TSRET PAGE 1 ;;; Routine to say why the host is dead ; Host number in A DEDSY0: TDZA C, C ;C = FLAG FOR WHETHER TO SAY NET TROUBLE ; I.E. 0=HAD GOT A CONNECTION SO IS OK DEDSAY: MOVEI C,[ASCIZ / Destination Host Dead; Reason unknown /] .CALL NETHST,A,A ;HOST DEAD - GET REASON WHY SETZM A MOVE B, A ;SAVE TRZ A, 777760 ;RH <- DEAD CODE ONLY TLNN A, 2000 ;REALLY DEAD? SKIPN A, DEDRSN(A) ;YES, GET REASON ;NO, MUMBLE MOVE A, C ;NOT DEAD. SEE IF WE THOUGHT WAS DEAD JUMPE A, CPOPJ ;DON'T PRINT MESSAGE IF COULDN'T FIND ONE PUSHJ P, TYPE ;EXPLAIN WHY HOST DEAD LDB A, [041400,,B] ;GET UPTIME FIELD CAIE A, 0 ;CONTRARY TO PROTOCOL, COULD BE 0 CAIL A, 7776 ;SEE IF KNOWN POPJ P, ;NO MOVEI A, [ASCIZ/Allegedly coming back up at /] PUSHJ P, TYPE ;YES LDB A, [150300,,B] ;GET DAY OF WEEK LDB C, [100500,,B] ;GET GMT HOUR SUBI C, 5 ;MAKE EST JUMPGE C, .+4 ADDI C, 24. SOJGE A, .+2 ADDI A, 7 LDB B, [040400,,B] ;GET 5MIN IMULI B, 5 ;GET MINUTE - A=DAY, C=HOUR, B=MINUTE IDIVI C, 10. ;PRINT HOUR ADDI C, "0 .IOT TYOC, C ADDI D, "0 .IOT TYOC, C .IOT TYOC, [":] IDIVI B, 10. ;PRINT MINUTE ADDI B, "0 ADDI C, "0 .IOT TYOC, B .IOT TYOC, C .IOT TYOC, [" ] .IOT TYOC, ["E] ; .IOT TYOC, ["S] .IOT TYOC, ["D] ;CROCK CROCK .IOT TYOC, ["T] .IOT TYOC, [" ] MOVEI A, DOWTAB(A) ;PRINT DAY PUSHJ P, TYPE JRST CRLF PAGE 1 ;;; ROUTINES TO HANDLE THE GRAPHICS INFERIOR ;;; TVMULT COMMAND STARTS ONE UP. TVMULT: .STATUS INFCH, T TRNE T, 77 .UCLOSE INFCH, ;FLUSH PREVIOUS ONE, IF ANY JFCL ;PROBABLY DOESN'T SKIP, BUT... MOVEI A, [ASCIZ/CAN'T CREATE INFERIOR /] .OPEN INFCH, ['USR ? 0 ? 'TVMULT] JRST TYPE .CALL OPEN,[[.UII,,0],[SIXBIT/DSK/],[SIXBIT/TN6/],[SIXBIT/TVMULT/],[SIXBIT/COMMON/]] ;LOAD HIM UP JRST TYPE MOVEI A, [ASCIZ/LOSS WHILE INITIALIZING INFERIOR /] .CALL LOAD,[#INFCH,#0] JRST TYPE ;MAP HIS PAGE 0 IN ;SO I CAN HACK HIM ;(NEED WRITE ACCESS) .CALL CORBLK,[#300000,#-1,#,#INFCH,#0] JRST TYPE .IOT 0, A ;GET START ADDR HRRZS A ;AVOID SETTING INSTR INTR FLAG .USET INFCH, [.SUPC,,A] SETOM INFSCK ;SAY DON'T HAVE HIS SOCKET YET MOVE A, NET4+3 ;FOREIGN HOST MOVEM A, NET9+3 MOVE A, NET4+1 ;OUR SOCKET PAIR ADDI A, 3 ;GET NEXT WRITE SOCKET MOVEM A, NET9+1 ;AND LISTEN ON IT .OPEN INFICP, NET9 ;GET SET TO TELL MULTICS HIS SOCKET JRST TYPE SETZM INFRDY .ATTY INFCH, ;GIVE HIM THE TTY SO HE CAN GET HIS .VALUE ; VIDEO BUFFER (ITS BUG) .USET INFCH, [.SUSTP,,[0]] ;GET HIM RUNNING .CLOSE 0, SKIPN INFRDY ;WAIT FOR HIM TO GIVE BACK TTY .HANG POPJ P, ;;; AN INTERRUPT FROM THE INFERIOR COMES HERE INFINT: PUSH P, A PUSH P, B .USET INFCH, [.RPIRQC,,A] ;SEE HOW HE LOST TRNN A, BRKBIT JRST INFLOST ;BADLY .USET INFCH, [.SAPIRQC,,[BRKBIT]] ;JUST .BREAK - CLEAR BIT .USET INFCH, [.RSV40,,A] ;GET .BREAK INSTRUCTION LDB B, [270400,,A] ;GET ITS AC FIELD HRRZS A ;LEAVE EFF ADDR IN A CAIGE B, 13 JRST INFLOST JRST .+1-13(B) ;DISPATCH ON IT JRST INFSOC JRST INFGET JRST INFGIV JRST INFKIL ; .BREAK 17, A HANG UNTIL ICP THEN PUT HOST IN A, SOCKET IN A+1 MOVEM A, INFSCK ;FLAG THAT HE'S HANGING SETOM INFRDY ;HE'S NOW READY JRST INFXIT ;AND LEAVE HIM THAT WAY INFSOC: ;.BREAK 13, A RETURNS SOCKET NUMBER IN A FOR ICP MOVE A, INFCOR(A) ;PICK UP HIS SOCKET .IOT INFICP, A ;AND TELL OTHER HOST .CLOSE INFICP, INFCON: ;CONTINUE INFERIOR .USET INFCH, [.SUSTP,,[0]] INFXIT: POP P, B POP P, A JRST TSRET INFKIL: .CALL CORBLK,[#0,#-1,#INFCOR] ;DELETE MY PAGE OF HIM JFCL ;oh well .DTTY ;let go of my tty JFCL .UCLOSE INFCH, ;MAKE INFERIOR GO AWAY JFCL JRST INFXIT INFLOS: .DTTY ;I WANT MY TTY BACK JFCL SETOM INFRDY .DISOWN INFCH, ;HE LOST - LET DDT LOOK AT HIM JFCL MOVEI A, [ASCIZ/ % GRAPHICS INFERIOR LOST AND HAS BEEN DISOWNED - JNAME IS TVMULT /] PUSHJ P, TYPE JRST INFXIT ; INFERIOR WANTS THE TTY INFGET: .ATTY INFCH, ;GIVE IT TO HIM .VALUE JRST INFCON ;RESUME HIS EXECUTION INFGIV: .DTTY ;NOW HE GIVES IT BACK .VALUE JRST INFCON ;;; COME HERE WHEN SOMEBODY WANTS TO KNOW INFERIOR'S SOCKET NO INFICI: .NETACC INFICP, ;OPEN CONNECTION JRST TSRET ;OH WELL PUSH P, A MOVE A, INFSCK ;GET READY TO TELL INFERIOR JUMPL A, INFIC2 ;DON'T KNOW SOCKET YET PUSH P, T MOVE T, [INFICP,,INFRCH] .RCHST T, JFCL MOVE T, INFRCH+2 ;FOREIGN SOCKET ADDI T, 3 ;WRITER MOVEM T, INFCOR+1(A) LDB T, [001000,,INFRCH+3] ;HOST MOVEM T, INFCOR(A) .USET INFCH, [.SUSTP,,[0]] ;GET INFERIOR MOVING POP P, T SKIPA INFIC2: .CLOSE INFICP, ;AND VANISH POP P, A JRST TSRET PAGE 1 ;;;INTERRUPT FROM TIPO CHANNEL CH7: MOVE A, [TIPO,,RCH] .RCHST A, HRRZ A, RCH+4 ;SOCKET STATE CAIN A, -1 JRST TIPDED CAIE A, SS.RFN ;RFNM WAIT CAIN A, SS.OPN ;OPEN JRST CH7A ;TIP WINNING, TURN ON FLAG JUMPN A, TIPLOS .CLOSE TIPO, ;CLS SETZM TIPSY MOVE A, RCH+5 CAIE A, 2 JRST TIPLOS MOVEI A, [ASCIZ \ TIP Closed \] PUSHJ P, TYPE JRST TSRET TIPDED: TIPLOS: MOVEI A, [ASCIZ \ TIP Dead or Otherwise Losing \] PUSHJ P, TYPE SETZM TIPSY ;TIP LOSING, TURN OFF FLAG JRST TSRET CH7A: SETOM TIPSY ;TIP WINNING, TURN ON FLAG JRST TSRET PAGE 0 ;;; TTY INPUT ROUTINE. RUNS AT INTERRUPT LEVEL... ; LABELLED MP BECAUSE USED TO BE AT MP LEVEL..... SIGH ; NOW IS PUSHJED TO FROM INTERRUPT HANDLER MP: .IOT TYIC,A SKIPL QUOTE JRST CH2C CAIN A, 177 JRST CH2RBO ;RUBOUT CAIGE A,40 XCT CTLTAB(A) ;CONTROL CHARACTER, DO SPECIAL HACKS JRST CH2A ;IF RETURNS, WAS NORMAL CHAR ;;;REGULAR CONTROL CHARACTER TABLE CTLFLS=JFCL ;RANDOM CONTROL CHARACTERS GET ACCEPTED CTLTAB: POPJ P, ;^@ - IGNORE COMPLETELY JRST CTLA ;^A - ATTENTION CTLFLS ;^B - IGNORE CTLFLS ;^C - IGNORE CTLFLS ;^D - IGNORE CTLFLS ;^E - IGNORE CTLFLS ;^F - IGNORE JFCL ;BELL - PASS THROUGH JFCL ;BACKSPACE - PASS THROUGH JFCL ;TAB - PASS THROUGH JRST CH2LF ;LINE FEED - XMIT INPUT BUFFER JRST CTLK ;^K - FLUSH INPUT BUFFER JRST CTLP ;^L - ERASE SCREEN JRST CH2EOL ;CR - XMIT LINE CTLFLS ;^N - IGNORE MOVEI A, "_ ;^O - TRANSLATE TO UNDERSCORE JRST CTLP ;^P - ERASE SCREEN JRST CTLQ ;^Q - QUOTE NEXT CHARACTER CTLFLS ;^R - IGNORE JRST CTLS ;^S - FLUSH SOME OUTPUT CTLFLS ;^T - IGNORE CTLFLS ;^U - IGNORE JRST CTLV ;^V - REDISPLAY CURRENT LINE IN CASE DATAPOINT LOSSAGE JRST CTLW ;^W - WORD DELETE CTLFLS ;^X - IGNORE CTLFLS ;^Y - IGNORE CTLFLS ;^Z - IGNORE JFCL ;ALTMODE - PASS IT THROUGH CTLFLS ;^\ JRST CTLCR ;^] - DATAPOINT HACK JRST COMMAND ;^^ COMMAND PREFIX CTLFLS ;^_ IGNORE PAGE 1 ;;;CDC-713 CONTROL CHARACTER TABLE CDCTAB: POPJ P, ;^@ - IGNORE COMPLETELY. ; JRST CTLA ;^A ATTENTION CTLFLS ;TURN OFF ^A BECAUSE HIT ACCIDENTALLY JRST CH2LF ; - SEND TEXT CTLFLS ;^C IGNORE (ALSO ) CTLFLS ;^D IGNORE CTLFLS ;^E IGNORE CTLFLS ;^F IGNORE JFCL ;BELL GOES THROUGH MOVEI A, 010 ;LEFT ARROW = BACKSPACE MOVEI A, 011 ;^I ACCEPTED AS TAB JRST CTLV ;DOWN ARROW = REDISPLAY JRST CTLK ;^K ACCEPTED AS LINE CLEAR CTLFLS ;^L IGNORE JRST CH2EOL ; ENDS LINE. CTLFLS ;^N IGNORE MOVEI A, "_ ;^O -> UNDERSCORE JRST CTLP ;^P ACCEPTED. JRST CTLQ ;^Q QUOTE NEXT CHARACTER CTLFLS ;^R IGNORE JRST CTLS ;^S STOP TYPING CTLFLS ;^T IGNORE MOVEI A, 11 ;RIGHT ARROW = TAB JRST CTLK ; FLUSH INPUT JRST CTLW ;^W - WORD DELETE JRST CTLP ; ERASE SCREEN JRST CTLA ; = ATTENTION CTLFLS ;^Z IGNORE JFCL ; = ALTMODE JRST CTLS ; = STOP TYPING CTLFLS ; IGNORE JRST COMMAND ; ENTER COMMAND MODE CTLFLS ; IGNORE PAGE 0 ; TYI INTERRUPT HANDLER CH2INT: ;MUST SAVE REGISTERS BECAUSE COULD BE INTERRUPTING CH4 REPEAT P-1, PUSH P, .RPCNT+1 CH2: MOVEI A,TYIC .ITYIC A, JRST TSRET2 PUSHJ P,MP ;PROCESS THE CHAR JRST CH2 ; KLUDGEY KLUDGEY CTLCR: MOVEI A, 15 ;DATAPOINT - CHANGE CTRL/CR TO CR JRST CH2EOL CTLQ: SETZM QUOTE JRST CH2EC CTLS: JRST OFLUS ;FLS OUTPUT, POPJ BACK CTLP: SKIPG NLINES ;^P - random hack - erase screen JRST CH2A ;IS NORMAL CHAR IF PRINTING PUSHJ P, CPTYP "C ; JRST CTLV ;AND DO CASEUP, REDISPLAY INPUT BUFFER CTLV: ;^V - REDISPLAY CURRENT LINE CTLVUP: SKIPL NLINES ;check type of tty JRST CH2CTV PUSHJ P, .TYOT ;printing tty, echo ^V crlf PUSHJ P, CRLF JRST C2CTV1 CH2CTV: PUSHJ P, UPVPOS PUSHJ P, CPTYP ;display tty - erase line and redisplay 10_9+"H PUSHJ P, CPTYP "L C2CTV1: MOVE T, [440700,,OLNBUF] ;redisplay any output on this line CAMN T, OLNBFP JRST .+5 ;what does this do?? ILDB A, T JUMPE A, .+3 PUSHJ P, .TYOT JRST .-5 MOVE T, [440700,,LINBUF] ;redisplay any input on this line CAMN T, LINBFP CPOPJ: POPJ P, ILDB A, T JUMPE A, CPOPJ ;don't print forever PUSHJ P, .TYOT JRST .-5 CTLW: PUSHJ P, RUBOUT JUMPE D, RUBFIN JSP A, LETSKP ;WAS WORD-COMPONENT? JRST CTLW ;NO, KEEP DELETING CTLW1: JUMPE D, RUBFIN ;BUFFER EMPTY? LDB D, LINBFP ;SEE IF MORE TO RUB OUT JSP A, LETSKP JRST RUBFIN ;NO MORE PUSHJ P, RUBOUT JRST CTLW1 LETSKP: SKIPE DOTUND ; Shorter words, no . or _ JRST [CAIE D, "_ CAIN D, ". JRST 1(A) JRST .+1] CAIGE D, "0 JRST 0(A) CAIG D, "9 JRST 1(A) CAIGE D, "A JRST 0(A) CAIG D, "Z JRST 1(A) CAIG D, "z CAIGE D, "a JRST 0(A) JRST 1(A) CH2RBO: PUSHJ P, RUBOUT RUBFIN: SKIPG NLINES POPJ P, ;AT LAST, DONE WITH CHAR MOVE T, [440700,,OLNBUF] ;compute horizontal position MOVE TT, OLNBFP SETZB D, B HLRZ E, VPOS0 PUSHJ P, .HPOS. MOVE T, [440700,,LINBUF] MOVE TT, LINBFP PUSHJ P, .HPOS. ADDI D, 10(B) ADDI E, 10 .IOT TYOC, [^P] .IOT TYOC, ["H] .IOT TYOC, D .IOT TYOC, [^P] .IOT TYOC, ["V] .IOT TYOC, E .IOT TYOC, [^P] .IOT TYOC, ["L] POPJ P, ;rubout - doall good things RUBOUT: SETZ D, MOVE T, LINBFP CAMN T, [440700,,LINBUF] POPJ P, ;buffer empty, ignore rubout LDB A, T ;character to be erased MOVE D, A ;CHARACTER RUBBED OUT RETURNED HERE SETZ TT, ;SUBSTITUTE A ZERO DPB A, T ADD T, [070000,,] ;BACK UP BYTE PTR SKIPGE T ;IF CROSS WORD BOUNDARY SOSA T ;THIS IS CERTAINLY PUZZLING JRST .+4 HRLI T, 010700 CAMN T, [010700,,LINBUF-1] ;canonicalize ptr to beg of buf MOVE T, [440700,,LINBUF] MOVEM T, LINBFP SKIPL NLINES JRST DISRO ;rubout is fancy on display PUSHJ P, .TYOT ;losing tty rubout POPJ P, DISRO: POPJ P, ;will be done later, by RUBFIN CH2C: SETOM QUOTE CH2A: SKIPE ICPDNE POPJ P, ;CAN'T ACCEPT CHARS SETZM MORON ;GOT SOME INPUT, OBVIOUSLY DON'T NEED --MORE-- MOVEI B,MORMXC ;now allow output to come since he interacted MOVEM B,MCHCNT PUSHJ P, PUTCHO ;stick the character in the output buffer SKIPGE ECHO ;SKIP IF NOT LOCAL ECHO PUSHJ P, CH2EC POPJ P, CH2BFL: .IOT TYOC, [7] ;BUFFER OVERFLOW, DON'T IDPB, DON'T ECHO, SEND A DING SUB P, [1,,1] ;FEEBLE ATTEMPT TO AVOID PDL OVERFLOW (??) POPJ P, ;;;^K KILLS INPUT BUFFER CTLK: MOVE T, [440700,,LINBUF] MOVEM T, LINBFP SETZM LINBUF MOVE T, [LINBUF,,LINBUF+1] BLT T, LINBFE-1 SKIPGE NLINES PUSHJ P, CTLVUP JRST RUBFIN CH2LF: ;;;copy input buffer into output buffer since no NL. SETZ A, IDPB A, LINBFP ;end the string. MOVE T, [440700,,LINBUF] MOVEM T, LINBFP CH2LFA: ILDB A, LINBFP JUMPE A, CH2LFB ;all done - ship it out HRRZ T, OLNBFP CAIGE T, OLNBFE IDPB A, OLNBFP JRST CH2LFA CH2LFB: JRST CH2SND ;;;End of line - ship it out over Net CH2NNL: MOVE T, [440700,,OLNBUF] ;clear buffers for this line MOVEM T, OLNBFP SETZB A, OLNBUF MOVE T, [OLNBUF,,OLNBUF+1] BLT T, OLNBFE-1 IDPB A, LINBFP ;end string CH2SND: MOVE T, [440700,,LINBUF] MOVEM T, LINBFP CH2SN1: ILDB A, T JUMPE A, CH2SN0 SKIPE DKOSW .IOT DKOC, A SKIPE TIPSY .IOT TIPO, A .IOT NTOC, A JRST CH2SN1 CH2SN0: .NETS NTOC, MOVE T, [LINBUF,,LINBUF+1] ;CLEAR BUFFER SETZM LINBUF BLT T, LINBFE-1 JRST UPVPOS CH2EOL: ;CARRIAGE RETURN TYPED, DO CRLF AND SEND OUT THE LINE MOVEI A, 15 .IOT TYOC, A ;TYPE OUT CR PUSHJ P, PUTCHO MOVEI A, 12 ;AND LF C2EOL1: .IOT TYOC, A PUSHJ P, PUTCHO JRST CH2NNL ;AND SHIP OUT THE MESSAGE PUTCHO: HRRZ B, LINBFP ;DON'T RUN OFF END OF BUFFER CAIL B, LINBFE JRST CH2BFL IDPB A, LINBFP ;save up character for sending when NL is hit POPJ P, PAGE 0 EXIT: KLVLRT: .LOGOUT .VALUE [ASCIZ/:KILL /] ;;; **MORE** INTERRUPTS COME HERE. TYI AND TYO MASKED MORINT: PUSH P,A PUSH P,B SKIPN MORON ;NEED IT? JRST MORET0 ;NOPE MOVEI A,[ASCIZ/--MORE--/] PUSHJ P,TYPE .LISTEN A, ;WAIT FOR TYPE OUT JUMPN A,MORET ;DON'T SCREW TYPE AHEAD .IOT TYIC,A ;ALWAYS GOBBLE ONE CHAR CAIGE A, 40 ;CHECK FOR SCREEN CLEAR MOVE A,CTLTAB(A) CAME A,[JRST CTLP] JRST MORET PUSHJ P,CPTYP ;YES, DO IT "C MORET: PUSHJ P,CPTYP "T ;go to top of screen PUSHJ P,CPTYP "L ;and prepare the line there MORET0: SETOM MORON ;will need a *more* next time POP P,B POP P,A JRST TSRET PAGE 1 ;;;COMMAND-LINE INTERPRETER. CALLED AT INTERRUPT LEVEL WHEN ^^ SEEN COMMAND:PUSHJ P, CH2CTC JRST CTLVUP CH2CTC: MOVEI A, [ASCIZ \SZ]Command: \] ;PROMPT SKIPG NLINES MOVEI A, [ASCIZ \ {Command: \] CMDAA: PUSHJ P, TYPE SETZM D ;LOWER SETOM E ;UPPER MOVE Q, [440600,,D] ;B.P. FOR D MOVE R, [440600,,E] ;B.P. FOR E MOVEI J, CMDTBL ;LOWER PTR MOVEI H, CMDTBZ ;UPPER PTR CMD0: PUSHJ P, CGET ;READ A CHARACTER JRST CMD1 ;SPACE OR RETURN ENDS COMMAND IDPB A, Q ;STASH AWAY CHARACTER. IDPB A, R ;ADJUST BOUNDS OF MATCHING AREA OF TABLE. CMDA0: CAMG D, (J) JRST CMDA1 CAMGE J, H AOJA J, CMDA0 JRST AMBIG CMDA1: CAML E, (H) JRST CMDA2 CAMLE H, J SOJA H, CMDA1 JRST AMBIG CMDA2: TRNN D, 77 ;GOT 6 CHARS? JRST CMD0 ;NO, GET MORE. PUSHJ P, CGET ;BETTER NOT BE MORE LETTERS JRST CMD1 ;SPACE OR RETURN, GOOD AMBIG: ;COME HERE ON AMBIGUOUS OR TOO MANY LETTERS .IOT TYOC, [^G] .IOT TYOC, ["?] .LISTEN A, JUMPE A, .-1 ;DON'T ERASE UNTIL CHAR. TYPED RECMD: MOVEI A, [ASCIZ \î]Command: \] SKIPG NLINES MOVEI A, [ASCIZ \ {Command: \] JRST CMDAA CMD1: ;COME HERE, COMMAND HAS BEEN TERMINATED. JUMPE D, CPOPJ ;NULL COMMAND CAME J, H ;BETTER BE DISAMBIG. JRST AMBIG ;COMMAND COMPLETION MOVE R, A ;SAVE TERMINATING CHAR. MOVE A, (J) ;FULL COMMAND NAME TDZ A, D ;FLUSH LETTERS ALREADY TYPED JUMPE A, CMD1B ;.. TLNN A, 770000 ;.. JRST [ LSH A, 6 ;.. JRST .-1 ] ;.. PUSHJ P, SIXTYP ;;;EXECUTE ASSOCIATED SUBROUTINE CMD1B: .IOT TYOC, [40] SKIPL B, CMDDSP-CMDTBL(J) ;GET DISPATCH WORD JRST CMDGO ;GO NOW IF + SETZB D, E ;E:=0 FOR CGET. MOVE Q, [440600,,D] CMD4: PUSHJ P, CGET ;- READ ON/OFF ARG INTO D. JRST CMD5 IDPB A, Q TRNN D, 77 JRST CMD4 JRST AMBIG CMD5: .IOT TYOC, [40] CAMN D, [SIXBIT/ON/] JRST [ SETOM TT JRST CMD6 ] CAME D, [SIXBIT/OFF/] JRST AMBIG SETZM TT CMD6: MOVE R, A ;TERMINATING CHARACTER. MOVE B, CMDDSP-CMDTBL(J) CMDGO: CAIN R, 15 ;TERMINATING CHAR CR OR SPACE? JRST CMDGO1 ;CR, GO AHEAD SETZ E, PUSHJ P, CGET JRST CMDGO+1 JRST AMBIG CMDGO1: .LISTEN T, ;ECCH. SOME COMMANDS DO .RESET PUSHJ P, (B) MOVEI A, [ASCIZ \OK.R\] ;ACKNOWLEDGE + POP BACK UP CURSOR. SKIPG NLINES MOVEI A, [ASCIZ \ }\] JRST TYPE ;AND POPJ OUT OF CH2CTC CGET: .IOT TYIC, A ;GET A COMMAND CHARACTER CAIE A, ^K CAIN A, 026 ;CDC-713 JRST FLSCMD ;LINE CLEAR => FLUSH COMMAND MODE CAIE A, 15 CAIN A, 40 POPJ P, ;carriage return or space CAIGE A, 40 JRST CGET ;ignore random ctrl - e.g. ^^ CAIN A, "? JRST DESCRB ;DESCRIBE TN6 IF "?" TYPED. CAIN A, 177 JRST CGETRB ;RUBOUT, DO SPECIAL HACKS AOS (P) ;ORDINARY, SKIPS + ECHO + U.C. CAIL A, 141 CAILE A, 172 JRST .+2 SUBI A, 40 .IOT TYOC, A SUBI A, 40 ;SIXBIT POPJ P, CGETRB: SKIPN D JRST CGET ;DON'T RUB OUT NOTHING. SKIPG NLINES JRST CGTRBP PUSHJ P, CPTYP "X JRST CGTRBJ CGTRBP: LDB A, Q ;GET SIXBIT BEING ERASED ADDI A, 40 ;ECHO ON PRINTING TERMINAL .IOT TYOC, A CGTRBJ: SETZ A, DPB A, Q ;FLUSH CHAR. ADD Q, [060000,,] ;BACK UP B.P. SKIPN E JRST CGET ;READING ON/OFF, GO ON. SETOM A DPB A, R ;READING CMD NAME, FLUSH CHR ADD R, [060000,,] ;BACK UP B.P. ;HACK: NOW FIDDLE J, H AS IF CHAR NEVER READ. CGTRB1: CAIG J, CMDTBL JRST CGTRB2 CAMLE D, (J) SOJA J, CGTRB1 CGTRB2: CAIL H, CMDTBZ JRST CGET ;DONE WITH RUBOUT, READ AGAIN CAMGE E, (H) AOJA H, CGTRB2 JRST CGET ;.. FLSCMD: POP P, A MOVEI A, [ASCIZ \î]R\] SKIPG NLINES MOVEI A, [ASCIZ \--Cancelled }\] JRST TYPE ;AND POPJ OUT OF CH2CTC AIMAGE: MOVEM TT, BEAST POPJ P, BAKCMD: SETCAM TT, NOBS POPJ P, CLOSE=RETRY ;ALLOW CONN TO ANOTHER HOST PAGE 1 ;;;GENERATE THE COMMAND TABLE. ;PLAIN COMMAND DEFINE COM NAME,WHERE X NAME,0,WHERE TERMIN ;WITH ARGUMENT ON/OFF: TT=0 => OFF, TT=1 => ON DEFINE SCOM NAME,WHERE X NAME,-1,WHERE TERMIN DEFINE GENCOM TYPE IFSE TYPE,TBL,[ DEFINE X A,B,C SIXBIT/A/ TERMIN ] .ELSE [ DEFINE X A,B,C B,,C TERMIN ] CMD!TYPE: COM ATTACH,ATTACH COM ATTN,ATTN SCOM BACKSP,BAKCMD SCOM BOTTOM,C2SCML COM CLOSE,CLOSE COM DDT,GO2DDT SCOM DOTUND,CH2DU SCOM ECHO,ECHCMD COM EXIT,EXIT SCOM FFMORE,CH2CP SCOM FILE,CH2EB SCOM HNDESC,ESCCOM SCOM IMAGE,AIMAGE COM LOUD,CH2V SCOM MORE,MORECM COM NEWTTY,TTYUP COM PROCED,CH2PRO COM QUIT,ATTN COM REINIT,GO COM SILENT,CH2W COM SOFT,CH2W COM TAB10,CH2T10 COM TAB8,CH2T8 IFN 0, SCOM TIP,TIPCMD COM TVMULT,TVMULT EXPUNGE X IFSE TYPE,TBL, CMDTBZ=.-1 TERMIN ;END DEFN OF GENCOM MACRO GENCOM TBL GENCOM DSP PAGE 1 ;;;COMMAND TO TURN TIP ON OR OFF IFN 0,[ TIPCMD: JUMPN TT, TIPON SETZM TIPSY ;TURN TIP OFF .CLOSE TIPO, POPJ P, TIPON: MOVEI A, [ASCIZ \ TIP Number(octal): \] ;TURN TIP ON, GET HOST NUMBER PUSHJ P, TYPE SETZB B, C ;ACCUM HOST NUM IN C, PORT NUM IN B TIPON1: .IOT TYIC, A CAIN A, 177 ;RUBOUT - START OVER JRST TIPON CAIN A, 40 ;SPACE - TERMINATE JRST TIPON2 CAIG A, 40 JRST TIPONX ;CTRL CHAR - ESCAPE CAIL A, "0 CAIG A, "7 JRST TIPON ;NON-NUMBER, START OVER .IOT TYOC, A ;NUMBER, ECHO BACK SUBI A, "0 LSH C, 3 IOR C, A ;** NOTE NO PROVISION FOR DECIMAL ** JRST TIPON1 TIPON2: MOVEI A, [ASCIZ \ Port Number(octal): \] PUSHJ P, TYPE SETZ B, TIPON4: .IOT TYIC, A CAIN A, 13 JRST TIPONX .IOT TYOC, A SUBI A, "0 JUMPL A, TIPON5 ;TERMINATE ON FIRST NON DIGIT CAILE A, 7 JRST TIPON5 LSH B, 3 ADD B, A JRST TIPON4 TIPON5: .IOT TYOC, [40] ;HOST NUM IN C, PORT NUM IN B LSH B, 16. ;MAKE B INTO SOCKET NUMBER ADDI B, 2 MOVEM B, NET7+2 ;SET UP TO .OPEN THE TIP MOVEM C, NET7+3 .OPEN TIPO, NET7 TIPONL: JRST [ JSP A, TYPE ASCIZ \Can't Open TIP for One Reason or Another. \] ;;;WAIT FOR THE CONNECTION TO COMPLETE TIPONW: MOVE A, [TIPO,,RCH] .RCHST A, HRRZ A, RCH+4 ;SOCKET STATE CAIN A, SS.RFS JRST [ MOVEI A, 15. .SLEEP A, JRST TIPONW ] CAIE A, SS.OPN CAIN A, SS.RFN CAIA JRST TIPONL ;BAD STATE ;;;SEND A SUITABLE MESSAGE TO THE TIP .SUSET [.RUNAME,,TIPONU] MOVE B, [440600,,TIPONM] TIPON6: ILDB A, B CAIN A, '# JRST TIPON7 ADDI A, 40 .IOT TIPO, A JRST TIPON6 TIPONM: SIXBIT /THIS TERMINAL IN USE BY / TIPONU: SIXBIT /UNAME/ SIXBIT / AT MIT-#/ TIPON7: .OPEN 0, [SIXBIT/ COM.FILE.(DIR)/] ;GROSS KLUDGE .VALUE .IOT 0, A .IOT TIPO, A .IOT 0, A .IOT TIPO, A .CLOSE 0, .IOT TIPO, [15] .IOT TIPO, [12] SETOM TIPSY ;NOW START ECHOING NETWORK TRAFFIC ON TIPO POPJ P, ;OUGHT TO PRINT A MESSAGE ON THE TIP BUT IT IS HARD TIPONX: JSP A, TYPE ASCIZ/Cancelled. / ];IFN 0 PAGE 1 ;;;ATTACH COMMAND, MAKE MYSELF TOP LEVEL ATTACH: SETOM ATTCHD ;SET NO-VALRET FLAG .VALUE [ASCIZ /:ATTACH /] .SUSET [.ROPTION,,A] TLO A, OPTDET ;SET NO-RELOAD FLAG .SUSET [.SOPTION,,A] ATTWT: MOVEI A, 10. ;wait until we achieve superiority .SLEEP A, .SUSET [.RINTB,,A] JUMPGE A, ATTWT ;not yet top-level JSP A, TYPE ASCIZ /:ATTACHED / GO2DDT: .SUSET [.ROPTION,,A] TLZ A, OPTDET ;get a DDT by hook or by crook .SUSET [.SOPTION,,A] .VALUE [ASCIZ \:DDT \] POPJ P, C2SCML: SKIPG NLINES POPJ P, SKIPE T, TT MOVEI T, 1 ;T = 1 FOR ON, 0 FOR OFF MOVEM T, SCML ;REMEMBER IT. MOVE T, (T)[ 1 -1 ] ADDM T, NLINES .CALL SCML,[#TYIC,SCML] JFCL POPJ P, DESCRB: MOVEI A, RECMD ;SET EXIT FROM AROUND CGET MOVEM A, (P) MOVEI A, [ASCIZ \C\] ;EXPLAIN THESE FUNNY CHARACTERS SKIPLE NLINES PUSHJ P, TYPE ;LIST THE COMMANDS MOVEI A, [ASCIZ \ -TN6 COMMANDS- \] PUSHJ P, TYPE MOVEI J, CMDTBL MOVE H, [CMDTBL-CMDTBZ-1,,CMDDSP] ;AOBJN PTR MOVEI D, 3 DESC0: MOVE A, (J) PUSHJ P, SIXTYP .IOT TYOC, [11] MOVEI A, [ASCIZ \ON/OFF\] SKIPGE (H) PUSHJ P, TYPE SOJG D, [ .IOT TYOC, [11] JRST DESC1 ] PUSHJ P, CRLF MOVEI D, 3 DESC1: AOS J AOBJN H, DESC0 MOVEI A, [ASCIZ\ --MORE--\] PUSHJ P, TYPE .IOT TYIC, A MOVEI A, [ASCIZ\C\] SKIPG NLINES MOVEI A, [ASCIZ\ \] PUSHJ P, TYPE SKIPE CDCFLG JRST DESCDC ;DIFF CTRL CHARS ON CDC-713 JSP A, TYPE ;DATAPOINT CTRL CHARS. ASCIZ \ TN6 CONTROL CHARACTERS ^A ATTENTION ^K DISCARD INPUT ^L LOWER CASE ^O UNDERLINE ^P ERASE SCREEN ^Q QUOTE CHAR. ^S STOP TYPING ^U UPPER CASE ^V REDISPLAY INPUT ^W ERASE WORD ^^ COMMAND MODE RUBOUT ERASE CHAR. CR SEND LINE LF SEND INPUT WITH NO NEWLINE Z\ DESCDC: JSP A, TYPE ASCIZ \ TN6 CONTROL KEYS FOR CDC-713 CLEAR ERASE SCREEN BUT NOT YOUR INPUT LINE CLEAR ERASE YOUR INPUT LINE. RUBOUT ERASE PRECEDING CHARACTER OF INPUT ^W ERASE PRECEDING WORD OF INPUT RS ENTER COMMAND MODE FS STOP TYPING RESET SEND ATTENTION SIGNAL RETURN NEWLINE AND SEND INPUT STX SEND INPUT WITHOUT NEWLINE ^Q QUOTE NEXT CHARACTER LEFT ARROW BACKSPACE RIGHT ARROW TAB DOWN ARROW REDISPLAY CURRENT LINE Z\ PAGE 0 ATTN: CTLA: .RESET TYOC, ;FLUSH TYPEOUT SKIPE CDCFLG .IOT TYOC, [004] ;TELL DAEMON TO RESETWRITE .NETINT NTOC, ;INS - ATTRACT ATTENTION JFCL .IOT NTOC, [200] ;send data mark .NETS NTOC, POPJ P, OFLUS: ;FLUSH BUFFERED UP OUTPUT ON NET & TTY .RESET TYOC, SKIPE CDCFLG .IOT TYOC, [004] ;TELL DAEMON TO RESETWRITE SKIPE ICPDNE POPJ P, CH2K: MOVE A,[NTIC,,RCH] .RCHST A, HRRZ A,RCH+4 CAIN A, -1 JRST OHSHIT CAIN A, SS.OPN POPJ P, CAIE A, SS.CLI CAIN A, SS.INP JRST CH2J POPJ P, CH2J: .IOT NTIC,A JRST CH2K PAGE 1 CH2T10: SKIPA T, [10.] ;TEN COLUMN TABS CH2T8: MOVEI T, 8. ;EIGHT COLUMN TABS MOVEM T, TABLEN ; MOVEI A, 40 ; JRST CTLVUP ;- NOT NEED WITH NEW CMD THING POPJ P, CH2CP: MOVEM TT, FFMORE ;SET FLAG FOR ^L PAUSE POPJ P, MORECM: .CALL TTYGET,#TYIC,[B,C,A] .VALUE SKIPN TT ;SKIP IF MORE ON TLOA A, %TSMOR ;MORE OFF TLZ A, %TSMOR ;MORE ON .CALL TTYSET,[#TYIC,B,C,A] .VALUE POPJ P, CH2DU: MOVNM TT,DOTUND ; -1-> They are alpha POPJ P, ESCCOM: MOVNM TT,HNDESC ; -1 -> HNDESC ON POPJ P, ECHCMD: JUMPN TT, CH2I ;ECHO ON ;ECHO OFF FALLS THROUGH TO CH2U CH2U: SKIPE ICPDNE POPJ P, .IOT NTOC,[204] .NETS NTOC, SETZM ECHO POPJ P, CH2I: SKIPE ICPDNE POPJ P, .IOT NTOC,[203] .NETS NTOC, SETOM ECHO POPJ P, CH2EB: JUMPE TT, CH2EE ;FILE OFF ;FILE ON FALLS THROUGH TO CH2BB CH2BB: .OPEN DKOC,DKOP ;OPEN IN DEFAULT SNAME JRST [ .SUSET [.SSNAME,,[SIXBIT/COMMON/]] MOVEI A, CH2BBM PUSHJ P, TYPE JRST CH2BB] SETOM DKOSW POPJ P, CH2EE: .CLOSE DKOC, SETZM DKOSW POPJ P, CH2W: SETOM SILNCE .RESET TYOC, POPJ P, CH2V: SETZM SILNCE POPJ P, CH2PRO: .VALUE [ASCIZ /:PROCED /] POPJ P, PAGE 0 CH2EC2: .IOT TYOC,A MOVEI A, 12 CH2ECS: .IOT TYOC,A POPJ P, CH2TBE: .CALL RCPOS,#TYOC,A ;find out what column we are in .VALUE HRRZ B, A ;hpos IDIV B, TABLEN SUB C, TABLEN ;C := -number of spaces to print for tab SUBI A, -10(C) ;RH(A) := column to go to (^P format) LSH A, 9. ;column no = 2nd char IORI A, "H JRST CPTYPE PAGE 0 ; STATE CHANGE ON NETWORK INPUT CHANNEL CH4: PUSH P,A SKIPN ICPDNE JRST CH4IC1 MOVEI A,2 ANDCAB A,ICPDNE JUMPE A,CH4ICP CH4IC1: .CALL STATUS,#NTIC,A ;GET SOCKET STATE .VALUE LDB A,[140600,,A] ;.. JUMPE A,CH4CL ;CONNECTION CLOSED CAIN A, 77 JRST OHSHIT POP P,A JRST TSRET ;IT'S OK I GUESS ; MAIN PROGRAM READS FROM NET & TYPES OUT MP00: SKIPE ICPDNE ;wait for channel readiness .HANG SKIPN CTRFLG ; test for CTR connection thru RISOS JRST CH4MP ;Enter Main Program MOVEI A,[ASCIZ /L CTR PLASîCA CTRî/] PUSHJ P,NSEND CH4MP: MOVSI A,289. ;TIME OUT DELAY = INFINITE .CALL NETBLK,[#NTIC,#SS.OPN,A][A] ;WAIT FOR INPUT .VALUE CAIGE A, SS.CLI ;SS.CLI OR SS.INP? JRST CH4CL0 ;NO ! .IOT NTIC,A ;NOW CAN GET CHARACTER JUMPE A,CH4MP ;IGNORE NULLS TRZE A,200 JRST CH4C ;PROCESS TELNET CONTROLS CAIN A,33 ; An escape character from the net? JRST [SKIPN HNDESC JRST .+1 ; not handling specially SETOM ESCFLG ; remember that it came JRST CH4MP] ; and get the next character SKIPE ESCFLG ; Escape pending? JRST CH4ESC ; Do escape sequence handling PUSHJ P, CH4CHR ; Process printing char JRST CH4MP CH4CHR: SKIPE DKOSW .IOT DKOC,A ;COPY TO DISK SKIPE TIPSY .IOT TIPO, A ;COPY TO TIP SOSG MCHCNT ;Are we outputting a lot of cruft? SETOM MORON ;yes, be sure to --more-- SKIPL SILNCE PUSHJ P, .TYON ;COPY TO TTY POPJ P, CH4ESC: SETZM ESCFLG ; Clear the flag CAIN A,"J JRST CH4EJ PUSHJ P,CH4CHR JRST CH4MP CH4EJ: PUSHJ P,DPAGE ; Clear the screen JRST CH4MP CH4C: CAIE A,2 ;INCOMING TELNET CONTROL CAIN A,40 JRST CH4MP ;IGNORE DATA TYPE OR NOP JUMPE A,CH4F ;DATA MARK => RESETWRITE CAIE A,3 ;DON'T ECHO JRST CH4D SETZM ECHO JRST CH4MP CH4D: CAIE A,4 ;ECHO JRST CH4E SETOM ECHO JRST CH4MP CH4E: CAIE A,5 ;HIDE INPUT JRST CH4MP ;IGNORE IF NOT ANYTHING SETZM ECHO JRST CH4MP CH4F: .RESET TYOC, ;foreign host said to JRST CH4MP PAGE 1 ;ERROR HANDLER ON SECONDARY PAGE CH4CL0: MOVE A,[NTIC,,RCH] .RCHST A, CH4CL: MOVEI A,[ASCIZ / Connection Closed; /] PUSHJ P,TYPE MOVE A,RCH+5 JRST CH1CA CH4ICP: MOVSI A,(SETZ) .REALT A, JFCL JRST CH4IC1 PAGE 0 ;BACK TO PRIMARY PAGE FOR THIS OFTEN USED ROUTINE ;;;type out data that came in on net. .TYON: SKIPN BEAST CAIE A, 14 ;FF DO MORE HACK JRST .TYO1 ;OTHER CHARACTERS JUST TYPED OUT MOREFF: SKIPN FFMORE ;SHOULD FF MORE? JRST DPAGE ;NO GO CLR SCREEN MOVEI A, [ASCIZ/^LEZ/] ;YES DO IT PUSHJ P, TYPE SETOM MORON .SUSET [.SIIFPIR,,[1_TYOC]] ;cause --more-- TYOFF1: MOVE T, [440700,,OLNBUF] ;new line - clear buffer MOVEM T, OLNBFP PUSHJ P, UPVPOS PUSHJ P, CTLVUP MOVEI A, ^L POPJ P, ;clear screen without waiting ; this is also called as a subroutine when emulating ; VT52-type escape handling DPAGE: PUSHJ P,CPTYP "C JRST TYOFF1 .TYO1: ;;;TYPE OUT CHARACTER IN A SKIPN BEAST CAIE A, 12 JRST .TYOD ;STORE + TYPE OUT CHAR. ;;;SPECIAL HANDLING FOR TYPING OUT NEWLINES SETZM CRFLAG ;CR IS OK BEFORE LF MOVE T, [440700,,OLNBUF] ;new line - clear buffer MOVEM T, OLNBFP .IOT TYOC, [15] .IOT TYOC, A PUSHJ P, UPVPOS POPJ P, .TYOD: HRRZ T, OLNBFP CAIGE T, OLNBFE IDPB A, OLNBFP ;save output line for display tty rubout hack .TYOT: SKIPE CRFLAG ;WAS THERE A CR? PUSHJ P, CRHACK ;YES HACK IT SKIPE BEAST JRST .TYOR CAIN A, 12 ;IN CASE A LF SNUCK IN SOMEHOW JRST [ SETZM CRFLAG ;CR BEFORE LF IGNORED .IOT TYOC,[15] ;AND DO A NEWLINE JRST .TYOR ] ; CAIN A, 40 ;SPACE AS ^PF FOR OPTIMIZATION ; JRST [ PUSHJ P, CPTYP ;This had to be flushed because of ; "F ; problems with line-continuation ; POPJ P, ] CAIN A, 11 JRST CH2TBE ;special handling for tabs CAIN A, 15 JRST [ SETOM CRFLAG ;HACK DUE TO MULTICS LOSINGNESS POPJ P, ] CAIE A, 7 ;bell as bell rather than ^G CAIL A, 40 JRST .TYOR SKIPE BEAST JRST .TYOR CAIN A, 10 ;SPECIAL CASE BACKSPACES ON DATAPOINTS SKIPE NOBS ;OUGHT TO DO BETTER THAN JUST ^H THOUGH CAIA JRST .TYOR CAIN A,33 TRCA A,33#<"$-100> ;make ESC come out as DollarSign .IOT TYOC, ["^] ;output control char other than bell, tab, BS, CR, NL in ^ form ADDI A, 100 .TYOR: SKIPE BEAST ;skip if output normally .CALL IOT,[#TYOC,A],#%TJCTN+%TJSIO ;image - suppress ! at end of line .IOT TYOC, A ;output normally or lossage POPJ P, .TYOBB: .VALUE POPJ P, CRHACK: PUSH P, A ;SPECIAL HACKS FOR CR, NAMELY .CALL RCPOS,#TYOC,A ;TURN BACK INTO BACKSPACES .VALUE HRRZS A ;GET JUST HORIZONTAL SETZM CRFLAG SKIPE BTBFG JRST CRHAC1 JUMPE A, CPOPAJ .IOT TYOC,[^H] SOJG A,.-1 POPAJ: POP P,A POPJ P, CRHAC1: .IOT TYOC,[^P] .IOT TYOC,["H] .IOT TYOC,[10] JRST POPAJ CRLF: .IOT TYOC,[15] .IOT TYOC,[12] POPJ P, CH2EC= .TYOT ;ECHO BY TYPING OUT IS ALL ;WON'T **MORE** UNLESS TYPEAHEAD ;;;ROUTINE TO COMPUTE POSITION IN D (H) AND E (V). .HPOS.: CAMN T, TT POPJ P, ;this buffer finished ILDB A, T CAIGE A, 40 JRST .HPOS1 .HPOS0: AOS D CAMGE D, LINEL JRST .HPOS. SETZ D, CAML E, NLINES SETO E, ;page wrap AOJA E, .HPOS. .HPOS1: CAIN A, 33 JRST .HPOS0 CAIN A, 11 JRST .HPOST ;tab is strange CAIN A, 15 ;CR JRST [ SETZM D ;With SSV 30, Imlac needs no special checks JRST .HPOS. ] CAIN A, 7 JRST .HPOS. SKIPN NOBS CAIE A, 10 AOJA D, .HPOS0 ;character with ^ displayed in two characters ; SKIPE IMLAC ; appears to be fixed in SSV 30 ; ADDI B, 2 ;correction constant for Imlac bug SOJGE D, .HPOS. ;backspace - move to left AOJA D, .HPOS. ;don't BS off left margin. .HPOST: MOVEI A-1, 1(D) ;KLUDGEY KLUDGEY IDIV A-1, TABLEN JUMPE A, .HPOS0 AOJA D, .HPOST UPVPOS: .CALL RCPOS,#TYOC,VPOS0 ;REMEMBER WHERE INPUT BEGAN .VALUE POPJ P, CH5: SKIPN ICPDNE JRST CH5IC1 MOVEI A,1 ANDCAB A,ICPDNE JUMPE A,CH5ICP CH5IC1: MOVE B,[NTOC,,RCH] .RCHST B, HRRZ B, RCH+4 CAIE B, SS.OPN CAIN B, SS.RFN JRST TSRET CAIN B, -1 JRST OHSHIT SKIPE B .VALUE JUMPE A, CH4CL ;IF WAS OPENED, BUT GOT CLOSED JRST TSRET ;NEVER YET GOT OPENED CH5ICP: MOVSI A,(SETZ) .REALT A, JFCL JRST CH5IC1 PAGE 1 ;TABLE OF HOSTS IS ON SECONDARY PAGE DEFINE HOST NAME,NUMO,STATUS,SYSTEM,NICKNAMES IFSE STATUS,SERVER,[ IRP NIC,,[NAME,NICKNAMES] IFSN NIC,,[ NUMO,,[ASCIZ/NIC/] ] TERMIN ];IFSE TERMIN ;LIST OF ALL LEGAL HOST ID'S ;HOST NUMBER ,, ASCIZ IDENTIFIER. HOSTTB: .INSRT SYSENG;HSTINF > HSTBL==.-HOSTTB ;# OF HOST NAMES IN TABLE CONSTANTS ;REST OF TABLE IS HERE PAGE 1 ;RANDOM DATA NET1: 40054,,(SIXBIT /NET/) ;IMAGE IN, GENSOC, 32 BITS -1 FRNISC: 1 ;INITIAL FOREIGN SOCKET -1 NET4: 40,,(SIXBIT /NET/) ;RECEIVE 8 BIT ASCII -1 -1 -1 NET5: 41,,(SIXBIT /NET/) -1 -1 -1 NET7: 51,,(SIXBIT/NET/) ;SEND, GENSOC, ASCII -1 -1 ;GETS SOCKET NUM -1 ;GETS TIP NUM INFSCK: -1 NET9: 40065,,'NET ;MULTICS GRAPHICS ICP'S TO HERE -1 -1 -1 1LINER: 0 ;NONZERO 1LINER, ZERO TN6 - ENTRY FLAG ; SET UP TO ACTIVATE AND INTERRUPT ON ALL CHARS TTYST1: < .BYTE 6 ? %TGINT+%TGACT+%TGIMG ? %TGINT+%TGACT %TGINT+%TGACT ? %TGINT+%TGACT %TGINT+%TGACT ? %TGINT+%TGACT > TTYST2: < .BYTE 6 ? %TGINT+%TGACT+%TGIMG ? %TGINT+%TGACT %TGINT+%TGACT ? %TGINT+%TGACT %TGINT+%TGACT ? %TGINT+%TGACT > XRESET: -5,,.+1 .SPIRQ,,[0] .SIFPI,,[0] .SMSK2,,[0] .SMASK,,[.MASK.] .SDF2,,[0] DKOP: 1,,(SIXBIT /DSK/) SIXBIT /NETOUT/ SIXBIT />/ CH2BBM: ASCIZ/CREATING COM:NETOUT > / JCLF: 0 ;-1 => GET CMD FROM JCLB JCLB: BLOCK 5 JCLP: 0 ;BYTE POINTER TO JCLB JNAME: 0 ;J.NAME BEFORE ATTACH INFRCH: BLOCK 10 ;CLS REASONS CLSTAB: DEFINE .. STR [ASCIZ\STR \] TERMIN .. never opened .. , ;CLSED BY USER .. by foreign host .. host Reset .. host died .. incomplete transmission .. byte size mismatch ; HOST DEAD REASONS DEDRSN: .. Foreign Host or IMP down or something .. Destination Host Dead ;1 WOULDN'T SAY WHY .. Foreign Network Control Program not in Operation .. Destination Host or IMP does not exist 0 ;4 NOT USED .. Destination Host or IMP down for scheduled maintenance .. Destination Host or IMP down for scheduled hardware work .. Destination Host or IMP down for scheduled software work .. Destination Host or IMP is in emergency restart .. Destination Host or IMP down due to power failure .. Destination Host or IMP is stopped at a breakpoint .. Destination Host or IMP down due to hardware failure 0 ;12 NOT USED 0 ;13 NOT USED 0 ;14 NOT USED 0 ;15 NOT USED ; DAYS OF THE WEEK ACCORDING TO BBN DOWTAB: ASCIZ/Mon / ASCIZ/Tue / ASCIZ/Wed / ASCIZ/Thu / ASCIZ/Fri / ASCIZ/Sat / ASCIZ/Sun / ASCIZ/BBN-loses day / EXPUNGE .. PAGE 0 ;BACK TO PRIMARY PAGE FOR THESE VARIABLES/ARG LISTS NLINES: 0 ;NUMBER OF VERTICAL LINES ON SCREEN ;-1 => PRINTING TERMINAL LINEL: 0 VPOS0: 0 ;line number where input starts (left half) VPOS: 0 ;POS READ BY .CALL RCPOS TABLEN: 0 ;set to 8 or 10. according to which host QUOTE: -1 ;0 => NEXT CHAR IS QUOTED IQUOTE: -1 ;SAME AT INTERRUPT LEVEL CH1ST: -1 ;-1 => JUST OPENED LOCSOC: 0 SCML: 0 ;# COM LINES PARAM (0 OR 1) CASE: -1 ;-1 => UPPER CASE ECHO: -1 ;-1 => LOCAL ECHO CDCFLG: 0 ;-1 => CDC-713 DAEMON IS TTY FFMORE: -1 ;IF 0 ERASE SCREEN IMMED WHEN FF RCVED PRSIST: 0 ;IF NON ZERO KEEP TRYING IF HOST DEAD TIP: 0 ;-1 => don't bother with ICP MADEIT: 0 ;NON ZERO => GOT A GOOD CONNECTION, DON'T RE-ASK HOST= ICPDNE: 3 ;0 => ICP DONE DKOSW: 0 ;-1 => OUTPUT TO DISK TIPSY: 0 ;.NE. 0 => COPY EVERYTHING ONTO TIPO NOBS: 0 ;.NE. 0 => terminal cannot backspace. SILNCE: 0 ;-1 => SILENCE OUTPUT ATTCHD: 0 ;-1 => ATTACH COMMAND DONE IMLAC: 0 CRFLAG: 0 ;-1 => THERE IS A CR PENDING BTBFG: 0 ;-1 => SOFTWARE TTY, RCPOS BITS THE BAG MORON: 0 ;-1 => NEED MORE INT THIS TIME MCHCNT: MORMXC ;count of characters can output before --more-- reqd MORMXC==100. ;value to set to on each input BEAST: 0 ;-1 => strange terminal that eats control chars INFRDY: 0 ;NON ZERO => GRAPHICS INFERIOR DONE WITH TTY DOTUND: 0 ;-1=> They are to be alphabetic HNDESC: -1 ;-1 => Handle escape sequences from the host ; Currently: ; $J Should mean clear rest of screen, but is ; being interpretted as clear whole screen ; since we don't really support cursor ; positioning. ; $$ treated like $ ESCFLG: 0 ;-1 => Escape received from host, awaiting next char RCH: BLOCK 10 LPDL==70 ;BUMPED FROM 55 IN HOPES OF LESS PDL OVFS PDL: -LPDL,,APDL-1 APDL: BLOCK LPDL ;;;copy of input on current line LINBFP: 0 LINBUF: BLOCK 320./5 LINBFE: 0 ;;;copy of output on current line OLNBFP: 0 OLNBUF: BLOCK 320./5 OLNBFE: 0 TTYPAD==6 PAGE 0 ;PUT LITERALS ON PRIMARY PAGE PAGE 1 ;END ON SECONDARY PAGE + UPDATE VARIABLES IF1 IFG 0LOC-1777, INFORM *** PAGE 0 OVERFLOW BY ,\0LOC-1777, WORDS *** IF2 INFORM PAGE 0 HAS ,\0LOC, LOCATIONS. IF2 INFORM PAGE 1 HAS ,\1LOC-2000, LOCATIONS. IF2 EXPUNGE DONT END GO