TITLE UTLNT .MLLIT==1 A=1 B=A+1 ;2 C=B+1 ;3 D=C+1 ;4 $T=6 I=7 T=I+1 ;10 TT=T+1 ;11 T3=TT+1 ;12 S1=13 S2=14 Q=15 CH=16 P=17 SPECC==1 ;SPECIAL CHNL TYOC==2 TYIC==3 PDLSIZ==100 STGLNG==7*7*2 IOBLNG==8 VALU=1000,, ;.VALUE, JRST .-1 OPNLUZ=2000,, ;.-1 OPEN LOSE 6TYPE=3100,, ;TYPE AS SIXBIT TO & INCLUDE FIRST SPACE 6TYP=3200,, 6TYPB=3300,, 7TYPE=4100,, ;ASCIZ 7TYP=4200,, 7TYPB=4300,, 6XTYPE=5100,, ;TYPE FULL WORD AS SIXBIT 6XTYP=5200,, 6XTYPB=5300,, OTYPE=6100,, ;OCTAL FULL WORD PRINT; AT LEASE 3 DIGITS OTYP=6200,, OTYPB=6300,, DTYPE=7100,, ;DECIMAL PRINT DTYP=7200,, DTYPB=7300,, MAXUUO==7 TTYTYP==1 NETTYP==2 PTYTYP==3 FILTYP==4 %TISTP==10000 ;BIT IN LH OF IOCHNM WORD, SET IFF CHNL HUNG IN MORE. %TGIMG==10 ;OUTPUT IN IMAGE MODE BIT IN TTYST1, TTYST2. %TSSII==2 ;SUPERIMAGE INPUT MODE BIT IN TTYSTS LH. DEFINE VAL X\ VALU [ASCIZ \:$!X!?$\] TERMIN DEFINE .. A,B Z==. SIXBIT /A/ LOC Z+2 B TERMIN .XCREF P,Z,CH,I,..,T,TT ;THINGS TO DO ;FANCY PORT NAMES ;STATUS PROTOCOL OPTION ;RECONNECT PROTOCOL OPTION ;DECIMAL NUMERIC INPUT ;PURIFY IT ;TURN OFF CLOCK INTS IF NOTHING HAPPENING GO: LOC 41 JSR UUOH JSR TSINT LOC GO .SUSET [-SUSB1L,,SUSB1] MOVEM A,USNAME MOVEM A,RUNAME MOVEM A,ZIFIL7 .OPEN TYOC,LCSOFL ;OPEN TYPE-OUT VAL CAN'T OPEN TTY OUT MOVE P,[(-PDLSIZ)PDL] 7TYPE [ASCIZ / UT./] 6TYPE [.FNAM2] MOVE A,[SQUOZE 0,IMPUP] .EVAL A, VAL IMPUP UNDEFINED MOVEI B,C HRL B,A .GETLOC B, JUMPLE C,GOKO .VALUE [ASCIZ /:$OUR NCP IS DOWN!$î:KILL /] JRST GOKO SAVEID: 0 SAVID2: 0 SAVID3: 0 LSTMNF: 7,,(SIXBIT /DSK/) ;LAST MON FILE NAME SIXBIT /UT.OUT>/ USNAME: 0 ;AND SYS NAME LSTXFF: 6,,(SIXBIT /DSK/) SIXBIT /UTCMND>/ IOCECT: 0 ;COUNT OF IOC ERRS RLTCT: 0 ;COUNT OF REAL TIME INTS CLKPC: 0 ;PC LAST RLT INT STUCKC: 0 ;CNT CONSECUTIVE = RLT PCS INSTIG: 0 ;INSTIGATOR OF CURRENT FOOFERAW INITBP: 440700,,.+1 ASCIZ/C / ;STRING TO BE EXECUTED AT STARTUP. NEWOLD: 0 ;0->NEW TELNET PROTOCOL ;-1->OLD TELNET PROTOCOL RCH: BLOCK 8 ;RCHST BLOCK RCHI: BLOCK 8 ;INTERRUPT LEVEL RCHST BLOCK NET1: 40054,,(SIXBIT /NET/) ;IMAGE IN, GENSOC, 32 BITS -1 FRNSOC: 1 FRNHST: -1 TSINT: 0 0 PUSH P,A PUSH P,T PUSH P,TT PUSH P,I IIDXI==-1 ;IDX OF PDL SLOT FOR I PUSH P,CH SKIPL T,TSINT JRST TSOINT TLZ T,400000 TLNE T,-1 .VALUE TSINT2: JFFO T,TSINT4 ;JUMP IF ANY CHNL INTS NOT HANDLED YET TSINTX: POP P,CH POP P,I POP P,TT POP P,T POP P,A .DISMISS TSINT+1 TSINT4: MOVSI I,400000 MOVNS TT LSH I,(TT) TDZ T,I ;CLEAR BIT ADDI TT,35. ;GET CHNL NUMBER CAIGE TT,2 JRST TSINT5 SETOM WFLAG PUSHJ P,GET.I ;COMPUTE LCS INDEX TRNN TT,1 JRST TSINT6 ;EVEN # CHNL? XCT LCIISB(I) JRST TSINT2 TSINT5: SKIPN TT .VALUE ;CHNL 0 ? SETOM WSFLAG ;SPECC JRST TSINT2 WSFLAG: 0 ;WORLD START TSINT6: MOVE CH,LCSOTY(I) ;OUTPUT CH INTERRUPTED CAIE CH,NETTYP JRST TSINT7 PUSHJ P,NTRCHS JRST TSINT2 TSINT7: JRST TSINT2 ;FIRST WORD INTERRUPT TSOINT: TRZE T,400 PUSHJ P,TSIOCE TLZE T,200000 PUSHJ P,TSRLT SKIPE T .VALUE JRST TSINTX ;IOC INTERRUPT TSIOCE: .SUSET [.RBCHN,,TT] ;GET BAD CH NUM CAIGE TT,2 SKIPA I,IIDXI-1(P) ;IF SPECC PUSHJ P,GET.I ;COMPUTE LCS INDEX DPB TT,[270400,,.+1] .STATUS .,RCHI HLRS CH,RCHI ANDI CH,77 HRROM CH,DEAD(I) AOS IOCECT ;COUNT OF IOC ERRS SETOM LCSCKS(I) POPJ P, ;REAL TIME INTERRUPT TSRLT: HRRZ TT,TSINT+1 CAIN TT,$WAIT SETOM CLKPC ;MAKE DIFFERENT CAMN TT,CLKPC AOSA CH,STUCKC SETZB CH,STUCKC MOVEM TT,CLKPC PATLOC: CAILE CH,5 JRST TSTUCK ;STUCK TSRLTX: AOS RLTCT MOVSI I,-7 TSRLT2: SKIPN LCS(I) JRST TSRLT4 ;LC NOT IN USE SKIPN OBLKD(I) JRST TSRLT3 PUSHJ P,OBLKTS ;UNBLOCK? TSRLT4: ADD I,[1,,LCSLNG] JUMPL I,TSRLT2 POPJ P, TSRLT3: SKIPL LCSGA(I) SKIPG TT,LCSTLO(I) JRST TSRLT4 ;G-A SUPPRESSED OR NOT NEEDED SUB TT,RLTCT CAML TT,[-3] JRST TSRLT4 SETOM LCSTLO(I) SETOM OUTGA(I) SETOM WFLAG JRST TSRLT4 TSTUCK: CAIE TT,$STCON JRST TSTCK2 CAIG CH,12. JRST TSRLTX ;LONGER WAIT AOS TSINT+1 ;UNSTICK WITH PUSHJ P,TSIOCE ;PSEUDO-IOC JRST TSRLTX ;THE INPUT AND OUTPUT BLOCKAGE MECHANISM IS DISABLED .SEE OBLKTS ;FOR REASON. TSTCK2: JRST TSRLTX MOVE A,(TT) TSTCK4: TLC A,(.IOT) TLNE A,777000 JRST TSTCK3 ;NOT AN .IOT LDB TT,[270400,,A] TRNN TT,1 ;SHOULD BE EVEN CAIGE TT,2 .VALUE ;? PUSHJ P,GET.I SETOM OBLKD(I) PUSHJ P,BLKNEW AOS TSINT+1 JRST TSRLTX TSTCK3: TLC A,(.IOT#XCT) TLNE A,777000 .VALUE ;NOT .IOT OR XCT MOVE A,@A ;HOPEFULLY ONLY INDEX OF I JRST TSTCK4 ;THE INPUT AND OUTPUT BLOCKAGE MECHNISM IS DISABLED NOW ;BECAUSE WHEN A PORT BECOMES OUTPUT-BLOCKED ALL THE CHARS ;TRYING TO BE OUTPUT TO IT GET THROWN AWAY. ;THE DISABLING IS DONE BY THE JRST TSRLTX AT TSTCK2. ;IT ISN'T CLEAR HOW MUCH THE BLOCKAGE MECHANISM HAS TO KNOW ;ABOUT **MORE**'S ON TTYS. IT CERTAINLY HAS TO BE ABLE ;TO AVOID LOSING CHARS DUE TO **MORE**'S. ;AN ATTEMPT TO MAKE **MORE**'S WORK USING THE BLOCKAGE MECHANISM ;FAILED. ONE REASON WAS THAT COMMAND TYPEOUTS (LISTHOSTS, ETC) ;DO NOT CHECK OBLKD EXPLICITLY, AND IF THE .IOT'S SUCCEED, ;THEY JUST CONTINUE TYPING OUT, DESPITE OBLKD. ;TEST IF STILL OUTPUT BLOCKED OBLKTS: PUSH P,T PUSHJ P,GET.T DPB T,[270400,,.+1] .STATUS .,RCHI ;SEE IF IT HAS BUFFER SPACE AVAIL. LDB A,[120100,,RCHI] TRC A,1 MOVNM A,OBLKD(I) SKIPN OBLKD(I) PUSHJ P,BLKNEW ;IF PORT HAS BECOME UNBLOCKED, RECOMPUTE BLOCKEDNESS VARS. POPTJ: POP P,T POPJ P, ;RESET ALL IBLKD'S FROM OBLKD'S BLKNEW: PUSH P,A PUSH P,I SETOM WFLAG ;SET WFLAG TO TRY AGAIN IN CASE A TRANSFER IS NOW UNBLOCKED MOVSI I,-7 BLKNW2: SETZM IBLKD(I) PUSHJ P,MNBKNW ;ALWAYS BLOCK INPUT OF PORT IF OUT BLOCKED JRST BLKNW4 ;DUE TO PROTOCOL REPLIES BKNWST: SETOM IBLKD(I) BLKNW3: ADD I,[1,,LCSLNG] JUMPL I,BLKNW2 POP P,I POP P,A POPJ P, BLKNW4: PUSH P,I SKIPN I,LCILST(I) JRST BKNWSU BLKNW5: MOVSS I MOVE I,(I) PUSHJ P,MNBKNW JRST BLKNW6 POP P,I JRST BKNWST BLKNW6: TLNE I,-1 JRST BLKNW5 BKNWSU: POP P,I JRST BLKNW3 ;LOWER TEST LOOP (LIKE MNGKLA) MNBKNW: SKIPE OBLKD(I) JRST POPJ1 SKIPN A,LCOLST(I) POPJ P, EXCH A,I MNBKNX: MOVSS I MOVE I,(I) SKIPE OBLKD(I) JRST MNBKNY TLNE I,-1 JRST MNBKNX EXCH A,I POPJ P, MNBKNY: EXCH A,I JRST POPJ1 GOKO: MOVEI T,STGSTG HRLM T,FRESTG ADD T,[-STGLNG+1,,1] HRLM T,-1(T) ;INITIALIZE FREE STORAGE AOBJN T,.-1 MOVS T,[.IOT TYOC,CH] MOVS TT,[.NETS TYOC,] MOVSI I,-7 GOKO1: MOVSM T,OUTIOT(I) ;SET UP OUTIOT MOVSM TT,OUTNTS(I) ; & OUTNTS ADDI T,2_5 ADDI TT,2_5 ADD I,[1,,LCSLNG] JUMPL I,GOKO1 MOVEI I,0 MOVEI T,TYIC PUSHJ P,GOKO2 ;OPEN TYPE-IN .VALUE .SUSET [-SUSB2L,,SUSB2] PUSHJ P,GET.T PUSHJ P,TTYHAK TYGTBK 200004,,%TGIMG_14 ;OUTPUT CR IN IMAGE MODE. 0 MOVE T,[600000,,RLTB1] .REALT T, JFCL MOVEI I,0 MOVE T,[JRST FTMHK] ;ARRANGE FOR FIRST THING DONE TO BE "IFILE" COMMAND MOVEM T,LCISBR ;WHICH WILL TRY TO READ INIT FILE. MOVE T,[440700,,[ASCIZ /IFILE/]] MOVE TT,LCICBP(I) GOKO7: ILDB CH,T JUMPE CH,GOKO3 IDPB CH,TT JRST GOKO7 GOKO3: MOVEM TT,LCICBP MOVEI CH,40 ;MAIN LOOP GOOKML: SETZB I,Q SETZM WFLAG MOVE TT,[-7,,3] ;LH=COUNT, RH=INPUT CHANNEL GOOKL: MOVEM I,INSTIG ;INSTIGATOR SKIPE IBLKD(I) JRST GOOKL1 ;INPUT BLOCKED AOSLE LCIAVL(I) ;SKIP IF STUFF AVAILABLE JRST GOOKLE AOS Q ;SOMETHING AVAILABLE, GO THRU LOOP AGAIN XCT LCISBR(I) ;READ STUFF JRST GOOKLE SKIPE T,LCINUM(I) JRST GOOKLN ;IN CHAR AS DIGITS MODE GOOKL0: SKIPE T,LCIMON(I) JRST (T) ;COMMAND BEING ACCUMULATED AOSN LCIQOT(I) JRST GOOKLA HLRZ T,MN2TTT(CH) TDNE T,LCIMNS(I) JRST MON ;PAY ATTENTION TRNE T,400000 JRST GOOKLE ;IGNORE TRNE T,200000 JRST KOOGLC ;CHANGE CASE KOOGLD: SKIPGE LCSDMC(I) JRST GOOKLE ;MORE INT'S THAN DM'S RECEIVED GOOKLA: SKIPGE LCSECO(I) ;SKIP IF NO ECHO PUSHJ P,MNGKLA ;ECHO & TO MONITORS GOOKLK: PUSHJ P,MGKGKN ;TO IN-CONNECTED AND MONITORS GOOKLE: AOSN LCSCKS(I) JRST LCHCK GOOKL1: ADDI I,LCSLNG ADD TT,[1,,2] JUMPL TT,GOOKL JUMPN Q,GOOKML ;IF SOMETHING HAPPENED LAST TIME, TRY AGAIN ;THINGS ARE IDLE MOVEI CH,400+TC.GA ;GO AHEAD MOVSI I,-7 GOOKLF: MOVEM I,INSTIG AOSN NTSFLG(I) ;CHECK FOR .NETS'S TO DO XCT OUTNTS(I) AOSN OUTGA(I) XCT LCOSBR(I) AOSN LCSRST(I) 7TYP [ASCIZ /RESET ^^/] ADD I,[1,,LCSLNG] JUMPL I,GOOKLF SETOM INSTIG SKIPN NPORTS ;IF THE TTY IS THE ONLY PORT SKIPE LCIMON ;AND A ^^ HASN'T BEEN DONE ALREADY, CAIA JRST [ SETZM INSTIG ;FAKE A ^^ OMING DOWN THE TTY INPUT. SETOM LCIAVL SETZB I,Q MOVE TT,[-7,,3] MOVEI CH,^^ JRST MON] SKIPN WFLAG $WAIT: .HANG ;WAIT FOR INTERRUPT JRST GOOKML ;OUTPUT TO IN-CONNECTED OF (I) AND THEIR MONITORS MGKGKN: PUSH P,I SKIPN I,LCILST(I) ;SKIP IF ANYTHING TO SEND TO JRST GOOKLD ;NOTHING TO SEND TO GOOKLB: MOVSS I MOVE I,(I) ;CDR LIST PUSHJ P,MNGKLA TLNE I,-1 ;TEST FOR END ON INPUT-TO LIST JRST GOOKLB GOOKLD: POP P,I POPJ P, ;OUTPUT TO (I) AND ITS MONITOR LIST MNGKLA: SKIPE OBLKD(I) PUSHJ P,OBLKTS ;OUTPUT BLOCKED? MNGKLC: XCT LCOSBR(I) ;INPUT-TO OUTPUT SKIPN C,LCOLST(I) ;CHECK OUTPUT MONITOR LIST POPJ P, ;NONE EXCH C,I GOOKLC: MOVSS I MOVE I,(I) ;CDR LIST XCT LCOSBR(I) TLNE I,-1 ;TEST FOR END OF LIST JRST GOOKLC EXCH C,I POPJ P, KOOGLC: XOR CH,CASEC(I) JUMPGE CH,KOOGLD MOVE T,[400000,,40] XORM T,CASEC(I) JRST KOOGLD LCHCK: SKIPE OBLKD(I) JRST LCHCKF ;NO OUTPUT ALLOWED SKIPE B,DEAD(I) ;CHECK FOR DEATHS PUSHJ P,DEADB MOVE T,[-NPFLG,,PRFLGS] LCHCLP: MOVE B,@(T) ;CHECK FOR PROTOCOL HACKS TSC B,@(T) JUMPE B,LCHCLE MOVE CH,PRFONC-PRFLGS(T) SKIPGE @(T) ;SKIP IF NEED TO TURN OFF MOVE CH,PRFOFF-PRFLGS(T) PUSHJ P,MNGKLA MOVE CH,PRFOPC-PRFLGS(T) PUSHJ P,MNGKLA HRLS @(T) LCHCLE: AOBJN T,LCHCLP JRST GOOKL1 LCHCKF: SETOM LCSCKS(I) JRST GOOKL1 PRFLGS: LCSECO(I) LCSREC(I) LCSGA(I) LCSRGA(I) NPFLG==.-PRFLGS PRFONC: 400+TC.WIL 400+TC.DO 400+TC.WILL 400+TC.DO PRFOFF: 400+TC.WNT 400+TC.DNT 400+TC.WNT 400+TC.DNT PRFOPC: OP.EC OP.EC OP.SGA OP.SGA ;LOGICAL CHANNEL HAS DIED DEADB: CAIN B,2 JRST DEADC CAIE B,4 CAIN B,5 JRST DEADC CAME B,[-1,,0] .VALUE DEADC: 7TYPE @DEADMS(B) 6TYPE LCSNAM(I) 7TYPE [ASCIZ /" /] PUSHJ P,CLSLCS SETZM LCSNAM(I) SETZM DEAD(I) POPJ P, DEADMS: [ASCIZ / TIME OUT? PORT "/] [ASCIZ / I ERR1./] [ASCIZ / CLOSED BY FOREIGN HOST. PORT "/] [ASCIZ / I ERR3./] [ASCIZ / HOST DIED. PORT "/] [ASCIZ / INCOMPLETE TRANSMISSION. PORT "/] WFLAG: 0 ;WAKE UP FLAG ;SET BY INT. ROUTINES SUSB1: .SPICL,,[0] .SMASK,,[0] .SMSK2,,[0] .RSNAM,,A SUSB1L==.-SUSB1 RUNAME: 0 SUSB2: .SPICL,,[-1] .SMASK,,[200000,,400] ;REALT, IOCERR .SMSK2,,[0,,#1_TYOC] ;DON7T ENABLE **MORE** INTERRUPTS. SUSB2L==.-SUSB2 RLTB1: 6*9 0 GOOKLN: CAIL CH,"0 CAILE CH,"9 JRST GOKLN2 LSH T,3 ADDI T,-"0(CH) MOVEM T,LCINUM(I) TRZN T,70000 JRST MONECH XCT LCOSBR(I) MOVE CH,T MOVEI T,10 MOVEM T,LCINUM(I) JRST GOOKL0 GOKLN2: CAIN T,10 JRST GOKLN3 CAIG T,111 JRST GOKLN4 CAILE T,1121 .VALUE ;? TRZA T,1000 GOKLN4: TRZ T,100 MOVE CH,T GOKLN5: SETZM LCINUM(I) JRST GOOKL0 GOKLN3: CAIE CH,177 JRST GOKLN5 SETZM LCINUM(I) JRST GOOKLE UJPC: 0 UUOH: 0 .SUSET [.RJPC,,UJPC] PUSH P,A PUSH P,B PUSH P,C PUSH P,D PUSH P,Q PUSH P,CH PUSHJ P,ICHECK PUSH P,I UIDXII==-4 PUSH P,40 UIDX40==-3 ;IDX OF PDL SLOT FOR UUO PUSH P,UUOH UIDXUU==-2 ;IDX OF PDL SLOT FOR RETURN PC PUSH P,UJPC UIDXPC==-1 MOVE I,INSTIG PUSHJ P,ICHECK PUSH P,LCONUM(I) SETZM LCONUM(I) LDB A,[331100,,UIDX40(P)] ;OP CODE HRRZ B,UIDX40(P) ;EFF ADR LDB Q,[270400,,UIDX40(P)] ;AC CAILE A,MAXUUO JRST BADUUO XCT .+1(A) JRST BADUUO ;0 JRST UVALU ;1 JRST UOPNLZ ;2 JRST U6TYP ;3 JRST U7TYP ;4 JRST U6XTP ;5 JRST UOTYP ;6 JRST UDTYP ;7 BADUUO: 7TYPE [ASCIZ / BAD UUO /] OTYPE UIDX40(P) 7TYPE [ASCIZ / @ /] OTYPE UIDXUU(P) 7TYPE [ASCIZ / JPC=/] OTYPE UIDXPC(P) 7TYPE [ASCIZ / /] .VALUE JRST XUUOX U7TYP: HRLI B,440700 U7TYP2: ILDB CH,B JUMPE CH,XUUOX PUSHJ P,UUOUT JRST U7TYP2 U6TYP: MOVE C,(B) MOVE B,[440600,,C] MOVEI D,0 U6TYP2: ILDB CH,B ADDI CH,40 PUSHJ P,UUOUT CAIE CH,40 JRST U6TYP2 XUUOX: POP P,LCONUM(I) POP P,UJPC POP P,UUOH POP P,40 POP P,I POP P,CH POP P,Q POP P,D POP P,C POP P,B POP P,A JRST @UUOH U6XTP: MOVSI A,440600+B U6XTP2: ILDB CH,A ADDI CH,40 PUSHJ P,UUOUT TLNE A,770000 JRST U6XTP2 JRST XUUOX UOTYP: MOVE B,(B) MOVEI D,0 PUSHJ P,FTOC JRST XUUOX FTOC: LSHC B,-43 ;FULL WORD OCTAL TYPE OUT LSH C,-1 ;PRINTS A MINIMUM OF THREE DIGITS TO WIN FOR CHARS AS NUMS, ETC. DIVI B,8 HRLM C,(P) AOS D SKIPE B PUSHJ P,FTOC FTOC4: CAIL D,3 JRST FTOC2 MOVEI CH,"0 PUSHJ P,UUOUT AOJA D,FTOC4 FTOC2: HLRZ CH,(P) ADDI CH,"0 UUOUT: TRNN Q,6 .VALUE TRNE Q,2 JRST UUOUT2 UUOUT4: TRNN Q,4 POPJ P, XCT LCOSBR(I) SKIPN LCOLST(I) POPJ P, PUSH P,I MOVE I,LCOLST(I) UUOUT6: MOVSS I MOVE I,(I) SKIPE I JRST .+3 TRNE Q,2 SKIPA XCT LCOSBR(I) TLNE I,-1 JRST UUOUT6 POPIJ: POP P,I POPJ P, UUOUT2: .IOT TYOC,CH JUMPN I,UUOUT4 POPJ P, UVALU: SOS UUOH .LOGOUT ;GO AWAY IF TOP LEVEL .VALUE (B) JRST XUUOX UDTYP: MOVE B,(B) PUSHJ P,DECPNT JRST XUUOX DECPNT: IDIVI B,10. ;DECIMAL PRINT HRLM C,(P) SKIPE B PUSHJ P,DECPNT HLRZ CH,(P) ADDI CH,"0 JRST UUOUT UOPNLZ: MOVE A,UIDXUU(P) HRRM B,UIDXUU(P) LDB Q,[270400,,-2(A)] MOVE A,-2(A) TLNE A,17 ADD A,UIDXII(P) HRRZ C,(A) CAIE C,(SIXBIT /NET/) JRST UPNLZ1 DPB Q,[270400,,.+1] .STATUS .,C HLRZS C ANDI C,77 CAIN C,20 JRST UPNLZA CAIN C,6 JRST UPNLZB UPNLZ1: MOVEM Q,ERRFLC .OPEN SPECC,ERRFIL .VALUE MOVEI Q,4 UPNLZ3: .IOT SPECC,CH CAIE CH,^L CAIN CH,^C JRST UPNLZ5 PUSHJ P,UUOUT JRST UPNLZ3 UPNLZ5: .CLOSE SPECC, JRST XUUOX ERRFIL: (SIXBIT /ERR/) 2 ERRFLC: . UPNLZA: 7TYP [ASCIZ / DESTINATION HOST DEAD /] UPNLZX: HRRM B,UIDXUU(P) JRST XUUOX UPNLZB: 7TYP [ASCIZ / ALL SOCKETS IN USE /] JRST UPNLZX ;TELETYPE INPUT INTERRUPT TTYII: MOVE CH,TT .ITYIC CH, POPJ P, ;POOF AOSN LCIIQT(I) JRST TTYII2 CAIN CH,^Q JRST TTYIIQ CAIN CH,^^ JRST TTYIIU TTYII2: SETOM LCIAVL(I) POPJ P, TTYIIQ: LDB CH,[MONQPT,,LCIMNS(I)] MOVNM CH,LCIIQT(I) JRST TTYII2 TTYIIU: LDB CH,[MONUPT,,LCIMNS(I)] JUMPE CH,TTYII2 SKIPL IBLKD(I) JRST TTYII2 SETOM LCSRST(I) ;UNCLOG COMMAND INPUT SETZM IBLKD(I) DPB TT,[270400,,.+1] .RESET ., MOVEI CH,MON2 MOVEM CH,LCIMON(I) ;MAKE ^^ HAVE EFFECT SKIPL OBLKD(I) JRST TTYII2 SETZM OBLKD(I) SOS TT DPB TT,[270400,,.+1] .RESET ., AOS TT JRST TTYII2 ;NETWORK INPUT INTERRUPT NETII: PUSHJ P,NTRCHS HRRZ CH,RCHI+6 JUMPE CH,CPOPJ LSH CH,-3 MOVNM CH,LCIAVL(I) CAIA ;PSEUDO TTY INPUT INTERRUPT PTYII: SETOM LCIAVL(I) MOVEI CH,1 LSH CH,(TT) .SUSET [.SIDF2,,CH] ;DEFER FURTHER INTS CPOPJ: POPJ P, ;FILE INPUT INTERRUPT FILII: .VALUE ;INT LEVEL PROCESS NET CH STATUS NTRCHS: MOVEI CH,RCHI HRL CH,TT .RCHST CH, SKIPL RCHI+3 JRST NTRDHS SOS LCSDMC(I) DPB TT,[270400,,.+1] ;SUPPOSEDLY YOU SHOULD ALSO ABORT OUTPUT IN-CONNECTED TO THIS PRT .RESET ., ;RESET .NETINT RECEIPT NTRDHS: HRRZ CH,RCHI+4 CAIN CH,10 POPJ P, CAIE CH,11 ;INPUT AVAILABLE CAIN CH,5 ;CONNECTION OPEN POPJ P, JUMPE CH,NTRCHT .VALUE NTRCHT: HRRZ CH,RCHI+5 MOVEM CH,DEAD(I) ;WFLAG HAS BEEN SET SETOM LCSCKS(I) POPJ P, ;TELETYPE INPUT TTYI: AOSN LCICRF(I) ;GENERATE A LF AFTER A CR. JRST [ MOVEI CH,^J ? JRST PTYI2] LDB CH,INITBP ;IF THE INITIAL "^^CONNECT " IS BEING READ, JUMPN CH,[IBP INITBP ;JUST RETURN THE NEXT CHAR OF THAT STRING. JRST PTYI2] DPB TT,[270400,,.+1] .STATUS .,T TRNE T,2000 ;BUF EMPTY BIT POPJ P, DPB TT,[270400,,.+1] .IOT .,CH CAIN CH,^M SETOM LCICRF(I) PTYI2: SETOM LCIAVL(I) AOS (P) POPJ P, ;PSEUDO TTY INPUT PTYI: DPB TT,[270400,,.+1] .IOT .,CH SKIPL CH ;SKIP IF NOTHING MORE AVAILABLE JRST PTYI2 NETI2: MOVEI T,1 LSH T,(TT) .SUSET [.SADF2,,T] ;UNDEFER INTS POPJ P, ;NETWORK INPUT NETI: DPB TT,[270400,,.+1] .IOT .,CH AOSN LCICRF(I) ;PREV. CHAR WAS CR? THIS IS EITHER LF OR NULL. JUMPE CH,CPOPJ ;IGNORE NULL; LF IS SIGNIFICANT. CAIN CH,^M SETOM LCICRF(I) AOS (P) SKIPL LCIAVL(I) JRST NETI2 POPJ P, ;FILE INPUT FILI: MOVE T,LCIBFP(I) CAMN T,[010700,,LCIBUF+IOBLNG-1(I)] JRST FILI2 FILI1: ILDB CH,LCIBFP(I) JRST PTYI2 FILI2: MOVE CH,[-IOBLNG,,LCIBUF] ADDI CH,(I) DPB TT,[270400,,.+1] .IOT .,CH MOVE T,[010700,,LCIBUF-1(I)] MOVEM T,LCIBFP(I) SUBI CH,(I) SKIPGE CH CAME CH,[-IOBLNG,,LCIBUF] JRST FILI1 PUSHJ P,CLSLCS SETZM LCSNAM(I) POPJ P, ;OUTPUT ROUTINES ;CALLED WITH CHAR IN CH, LCS INDEX IN I POPCHJ: POP P,CH POPJ P, TTYO1: SETZM LCONUM(I) OTYP CH MOVEI CH,40 JRST TTYO4 ;NETWORK OUTPUT NETO: SETOM CLKPC SETOM NTSFLG(I) AOSN LCOCRF(I) ;IF PREV. CHAR OUTPUT WAS CR, AND THIS CHAR ISN'T LF, PUSHJ P,[CAIN CH,^J ;AND THIS CHAR ISN'T LF, POPJ P, PUSH P,CH ;BY CONVENTION WE MUST PUT A NULL IN BETWEEN. SETZ CH, XCT OUTIOT(I) JRST POPCHJ] CAIN CH,^M SETOM LCOCRF(I) TRNN CH,400 JRST TTYO4 PUSH P,CH MOVEI CH,377 XCT OUTIOT(I) POP P,CH TTYO4: XCT OUTIOT(I) TTYO4X: MOVE $T,RLTCT MOVEM $T,LCSTLO(I) ;TIMING INFO FOR GA POPJ P, PTYO: TTYO: SETOM CLKPC SKIPE LCONUM(I) JRST TTYO1 TTYO6: TRNN CH,200 JRST TTYO4 CAIN CH,OTCECH JRST TTYECH CAIE CH,OTCHYI CAIN CH,OTCNOE JRST TTYNOE TTYO6A: SKIPN PRINT(I) JRST TTYO4X CAIN CH,400+TC.GA PUSH P,[TTYIDL] ;TRAP RETURN PUSH P,CH MOVEI CH,^^ PUSHJ P,TTYO MOVE CH,(P) TRZN CH,400 JRST TTYO7 SKIPGE PRINT(I) JRST TTYO9 TTYO9A: CAIL CH,TC.WIL CAILE CH,TC.DNT SKIPA SETOM LCONUM(I) MOVEI CH,"^ TTYO8: PUSHJ P,TTYO4 POP P,CH TRZ CH,400 OTYP CH MOVEI CH,40 SKIPE LCONUM(I) POPJ P, JRST TTYO4 TTYO7: MOVEI CH,"_ JRST TTYO8 TTYIDL: SETOM LCSTLO(I) POPJ P, TTYECH: SETOM LCSECO(I) POPJ P, TTYNOE: SETZM LCSECO(I) POPJ P, TTYO9: SUB P,[1,,1] CAIGE CH,TC.SE JRST TTYO9A 6TYP TCTAB-TC.SE(CH) CAIL CH,TC.WIL CAILE CH,TC.DNT SKIPA SETOM LCONUM(I) POPJ P, ;FILE OUTPUT FILO: SETOM CLKPC TRNN CH,600 JRST RFILO PUSH P,CH MOVEI CH,^^ PUSHJ P,RFILO MOVEI CH,"^ TRNN CH,400 MOVEI CH,"_ PUSHJ P,RFILO MOVE CH,(P) TRZ CH,600 OTYP CH JRST POPCHJ RFILO: EXCH CH,LCOBFP(I) CAMN CH,[010700,,LCOBUF+IOBLNG-1(I)] JRST FILO2 FILO1: EXCH CH,LCOBFP(I) IDPB CH,LCOBFP(I) POPJ P, FILO2: MOVE CH,[-IOBLNG,,LCOBUF] ADDI CH,(I) XCT OUTIOT(I) MOVE CH,[010700,,LCOBUF-1(I)] JRST FILO1 PATCH: PAT: BLOCK 100 PDL: BLOCK PDLSIZ NPORTS: 0 ;# PORTS IN EXISTENCE (IE LCSNAM NOT 0), NOT COUNTING TTY LCS: LCSNAM: SIXBIT /TTY/ LCSOTY: TTYTYP LCSOFL: 1,,(SIXBIT /TTY/) BLOCK 3 LCOLST: 0 LCOSBR: PUSHJ P,TTYO OUTIOT: .IOT TYOC,CH OUTNTS: .NETS TYOC, LCOBUF: BLOCK IOBLNG LCOBFP: 440700,,LCOBUF(I) LCSITY: TTYTYP LCSIFL: 4,,(SIXBIT /TTY/) BLOCK 3 LCILST: 0 LCISBR: PUSHJ P,TTYI LCIISB: PUSHJ P,TTYII LCSFST==. ;LCS FLAG START CASEC: 0 ;# XORED FOR CASE CHANGE CHS (0 OR 40) LCINUM: 0 ;ACCUMULATOR FOR CH IN AS NUMBER LCIAVL: -1 ;INPUT AVAILABLE LCICRF: 0 ;-1 => LAST CHAR INPUT WAS CR. LCOCRF: 0 ;-1 => LAST CHAR OUTPUT WAS CR. IBLKD: 0 ;-1 => INPUT BLOCKED BY OUTPUT BLOCK(S) LCSDMC: 0 ;+1 FOR NTC.DM ;-1 FOR .NETINT RECEIVED NTSFLG: 0 ;PROBABLY NEEDS AN .NETS LCONUM: 0 ;DE-ACCUMULATOR FOR CH OUT AS NUMBER DEAD: 0 ;NONZERO => PORT HAS DIED LCIMON: 0 ;PC IF INTERPRETING AS COMMAND LCIIQT: 0 ;INT. LEVEL ABSQT FLAG LCIQOT: 0 ;ABSQUOTE FLAG LCSTLO: 0 ;TIME OF LAST OUTPUT (FOR GA, ETC) OUTGA: 0 ;-1=>SEND GA OBLKD: 0 ;-1 => OUTPUT BLOCKED PRINT: 0 ;1=>DON'T TTY OUT PROTOCOL STUFF ;-1=> PRETTY OUT LCSRST: 0 ;-1=> CHANNEL WAS RESET LCSCKS: 0 ;CHECK FOR PROTOCOL MSGS TO SEND LCSECO: -1,,-1 ;LOCAL ACTUAL ECHO,,DESIRED LOCAL ECHO LCSREC: 0,,0 ;KNOWN REMOTE ECHO,,DESIRED REM ECH LCSGA: -1,,-1 ;LOC SUP GA,,DSRD L SGA LCSRGA: -1,,-1 ;RMT SUP GA,,DSRD R SGA LCSFND==.-1 ;LCS FLAG END LCIBUF: BLOCK IOBLNG LCIBFP: 010700,,LCIBUF+IOBLNG-1(I) LCIMNS: 17 ;SEE COMMENT AT MON: LCICBL==20. LCICBF: BLOCK LCICBL ;COMMAND CHARACTER BUFFER LCICBP: 900,,LCICBF-1(I) LCSLNG==.-LCS BLOCK 6*LCSLNG L==LCSLNG FRESTG: 0 STGSTG: BLOCK STGLNG .VALUE COSBRT: JFCL PUSHJ P,TTYO PUSHJ P,NETO PUSHJ P,PTYO PUSHJ P,FILO CISBRT: .VALUE PUSHJ P,TTYI PUSHJ P,NETI PUSHJ P,PTYI PUSHJ P,FILI CIISBT: .VALUE PUSHJ P,TTYII PUSHJ P,NETII PUSHJ P,PTYII PUSHJ P,FILII .VALUE CIMNTY: 0 ;? 757 ;TTY 405 ;NET 777 ;PTY 752 ;FIL 0 ;? ;OPEN LOGICAL CHANNEL SLOT OPNLCS: PUSHJ P,ICHECK AOS NPORTS ;(COUNTERACT SOS DONE BY CLSLCS) PUSHJ P,CLSLCS ;CLOSE, SETS UP T DPB T,[270400,,OPNLC8] MOVE TT,LCSOTY(I) HLLOS LCSREC(I) ;REQ RMT ECHO HLLOS LCSRGA(I) ;REQ SUPPRESS RMT GA HLLOS LCSGA(I) ;SUPPRESS LOCAL GA SETOM LCSCKS(I) OPNLC2: MOVE TT,COSBRT(TT) MOVEM TT,LCOSBR(I) SKIPN TT,LCSOTY(I) JRST OPNLC7 SETZM LCOCRF(I) MOVEI T3,1 ;WE WANT OUTPUT INTERRUPTS ENABLED IFF LSH T3,(T) ;THE PORT IS A NTWORK PORT. HRLI T3,.SIMSK CAIE TT,NETTYP HRLI T3,.SAMSK .SUSET T3 OPNLC8: .OPEN .,LCSOFL(I) ;OPEN OUTPUT OPNLUZ CPOPJ OPNLC7: AOS T GOKO2: DPB T,[270400,,OPNLC9] MOVE TT,LCSITY(I) MOVE T3,CIISBT(TT) MOVEM T3,LCIISB(I) MOVE T3,CIMNTY(TT) MOVEM T3,LCIMNS(I) MOVE T3,CISBRT(TT) MOVEM T3,LCISBR(I) SKIPN LCSITY(I) JRST POPJ1 OPNLC9: .OPEN .,LCSIFL(I) ;OPEN INPUT OPNLUZ CPOPJ SETZM LCICRF(I) CAIN TT,FILTYP SETOM LCIAVL(I) ;START FILE JRST POPJ1 ;COMPUTE CHNL (IN T) FROM IDX (IN I) GET.T: PUSH P,TT HRRZ T,I IDIVI T,LCSLNG LSH T,1 CAIL T,0 CAILE T,14. .VALUE ;THAT WAS AN LCS INDEX? ADDI T,2 POPTTJ: POP P,TT POPJ P, ;COMPUTE IDX (IN I) FROM CHNL (IN TT) GET.I: MOVEI I,-2(TT) CAIL I,0 CAILE I,14. .VALUE ;THAT WAS A CHANNEL NUMBER? LSH I,-1 IMULI I,LCSLNG POPJ P, ;CLOSE LOGICAL CHANNEL SLOT ;DOES NOT CLEAR OUT LCSNAM CLSLCS: PUSHJ P,ZDSCHK ;UPDATE NPORTS. PUSHJ P,GET.T DPB T,[270400,,CLSLCO] SKIPE TT,LCOBFP(I) CAMN TT,[440700,,LCOBUF(I)] JRST CLSLCO ;JUMP IF NOT BLOCK MODE PUSH P,CH MOVEI CH,^C CLSLO2: TLNN TT,760000 ;FILL OUT BLOCK JRST CLSLO4 IDPB CH,TT JRST CLSLO2 CLSLO4: SUB TT,[010700,,LCOBUF(I)] HRLI TT,-1(TT) HRRI TT,LCOBUF(I) DPB T,[270400,,.+1] .IOT .,TT ;OUTPUT LAST BLOCK POP P,CH CLSLCO: .CLOSE ., ;CLOSE OUTPUT IOCHANNEL MOVE TT,[010700,,LCOBUF-1(I)] MOVEM TT,LCOBFP(I) HRRI TT,LCIBUF+IOBLNG-1 MOVEM TT,LCIBFP(I) AOS T DPB T,[270400,,CLSLCI] SOS T CLSLCI: .CLOSE ., ;CLOSE INPUT IOCHANNEL MOVEI TT,LCSFST(I) SETZM (TT) HRLI TT,1(TT) MOVSS TT BLT TT,LCSFND(I) ;CLEAR OUT "FLAGS" MOVE TT,[900,,LCICBF-1(I)] ;THEN UNLINK THINGS MOVEM TT,LCICBP(I) MOVE TT,LCILST(I) SETZM LCILST(I) PUSHJ P,UNLINK MOVE TT,LCOLST(I) SETZM LCOLST(I) PUSHJ P,UNLINK PUSH P,T PUSH P,D MOVSI D,-7 CLSLC7: MOVEI TT,LCILST(D) SKIPE (TT) PUSHJ P,UNINKL MOVEI TT,LCOLST(D) SKIPE (TT) PUSHJ P,UNINKL ADD D,[1,,LCSLNG] JUMPL D,CLSLC7 POP P,D POP P,T POPJ P, ;CHECK I ICHECK: PUSH P,I HRRES I SKIPL I CAILE I,6*LCSLNG .VALUE SKIPN LCSNAM(I) .VALUE JRST POPIJ ;PUT LCS(D) ON LCILST(I) CHAIN IDLINK: PUSHJ P,ICHECK MOVSI T,LCILST(I) IDLNK2: HLRZ TT,T MOVE T,(TT) TLNN T,-1 JRST IDLNK4 HRRZ TT,T CAME TT,D JRST IDLNK2 7TYPB [ASCIZ / ATTEMPTED DOUBLE LINK FROM "/] 6XTYPB LCSNAM(I) 7TYPB [ASCIZ /" TO "/] 6XTYPB LCSNAM(D) DCRLFB: 7TYPB [ASCIZ /" /] POPJ P, IDLNK4: SKIPN T,FRESTG .VALUE HLLM T,(TT) MOVSS T MOVE T,(T) MOVEM T,FRESTG HLRZ T,(TT) HRRZM D,(T) JRST BLKNEW ;PUT LCS(D) ON LCOLST(I) CHAIN MIDLNK: PUSHJ P,ICHECK MOVSI T,LCOLST(I) JRST IDLNK2 ;UNLINK LIST & RETURN TO FREE STORAGE UNLINK: JUMPE TT,CPOPJ HLRZ Q,TT ;GET POINTER TO NEXT CELL CAIL Q,STGSTG CAIL Q,STGSTG+STGLNG .VALUE ;BAD LIST STRUCTURE HLLZS TT EXCH TT,FRESTG EXCH TT,(Q) TLNN TT,-1 JRST BLKNEW JRST UNLINK ;PATCH OUT & FREE POINTERS TO (I) IN LIST (TT) UNINKL: MOVS T,(TT) UNINK2: TRNN T,-1 POPJ P, MOVE T3,(T) CAIN I,(T3) JRST UNINK4 MOVE TT,T MOVS T,T3 JRST UNINK2 UNINK4: HLLM T3,(TT) MOVE T3,FRESTG HLLZM T3,(T) HRLZM T,FRESTG PUSHJ P,BLKNEW JRST UNINKL ;MONITOR FOR COMMANDS ROUTINE ;CALLED WITH CHARACTER IN CH & LCS INDEX IN I ;LCIMNS INDICATES THINGS TO LOOK FOR ;1.1=>IAC ;1.2=>^^ ;1.3=>OLD TELNET CHARS ;1.4=>^Q ;1.5=\ MONNPT==00100 ;BYTE PNT NEW PROTOCOL MONUPT==10100 ;BYTE POINTER ^^ MONOPT==20100 ;BYTE PNT OLD PROTOCOL MONQPT==30100 ;BYTE POINTER ^Q MONSPT==40100 ;BYTE POINTER \ MON: CAIGE CH,200 JRST MONLT2 HRRZ T,MN2TTT(CH) JRST (T) MONLT2: CAIN CH,^^ JRST MON036 CAIN CH,^Q JRST MON021 CAIN CH,"\ JRST MONSKB .VALUE MON377: MOVEI A,MONIAC MOVEM A,LCIMON(I) JRST GOOKLE MON036: MOVEI A,MON2 MOVEM A,LCIMON(I) JRST MONECH MON021: SETOM LCIQOT JRST MONECH MONSKB: MOVE A,[400000,,40] ;CHANGE CASE FOR ONE CHARACTER XORM A,CASEC(I) JRST MONECH MON2: CAIL CH,200 JRST MNGKQM JUMPL CH,MNGKQM AOSN LCIQOT(I) JRST MON3 HRRZ B,MN2TTT(CH) CAIN B,MON3 JRST (B) CAIE B,MNGKQM PUSHJ P,MNGKLA JRST (B) MNGKQM: MOVEI CH,"? MNGKEY: PUSHJ P,MNGKLA MNGKEC: SETZM LCIMON(I) JRST GOOKLE MON2QM: XCT LCOSBR(I) 7TYP [ASCIZ / ^A SEND ARE YOU THERE ^B SEND SYNCH (BREAK) ^C SEND INTERRUPT PROCESS ^G SEND GO AHEAD ^H SEND ERASE CHARACTER ^N NO LOCAL ECHO ^S SEND & DO ERASE OUTPUT ^X SEND ERASE LINE ^Y YES LOCAL ECHO ^^ SEND ^^ ? LIST SINGLE CHARACTER COMMANDS @ SEND BREAK CHARACTER HELP LIST MULTI-CHARACTER COMMANDS \ COMPLEMENT CASE ^ CHARS AS DIGITS PRECEDED BY IAC _ CHARS AS DIGITS /] JRST MNGKEC ;DISPATCH TABLE ON CH FOR ^^ ;-1IGNORE ON INPUT ;4.8=>CASE SHIFTABLE ;4.7=>TERMINATE LINE (IN AT A TIME MODE);NOT IMPLEMENTED ;3.9=>ALWAYS ZERO ;3.5=>\ ;3.4=>^Q ;3.3=>OLD TELNET CNTRL CH ;3.2=>^^ ;3.1=>IAC MN2TTT: MNGKQM MN2AYT MON2I MN2IP REPEAT 3,MNGKQM MON2GA MN2EC REPEAT 5,MNGKQM MON2N REPEAT 2,MNGKQM 10,,MNGKQM MNGKQM MN2AO REPEAT 4,MNGKQM MN2EL MON2Y REPEAT 4,MNGKQM 2,,MGOKLK ;^^ MNGKQM MONECH ;SP REPEAT 30.,MNGKQM MON2QM MN2BRK REPEAT 26.,200000,,MON3 MNGKQM 20,,MN2CCS ;\ MNGKQM MONNUM ;^ MONNUM ;_ MNGKQM ;140 REPEAT 26.,200000,,MON3 MNGKQM 20,MN2CCS MNGKQM MNGKQM MNRB2 IFN .-MN2TTT-128.,.ERR MN2TTT TABLE FIRST LOSE 4,,MN.DM 4,,GOOKLK ;BRK 4,,GOOKLE ;NOP 4,,GOOKLK ;NOE 4,,GOOKLK ;ECH 4,,GOOKLK ;HYI? REPEAT 121.,MNGKQM 1,,MON377 IFN .-MN2TTT-256.,.ERR MN2TTT TABLE SECOND LOSE MONNUM: MOVEI B,10 MOVEM B,LCINUM(I) SETZM LCIMON(I) CAIE CH,"^ JRST GOOKLE MOVEI CH,377 JRST GOOKL0 MON3: MOVEI A,MON4 MOVEM A,LCIMON(I) MON4: MOVE B,LCICBP(I) CAIN CH,^Q JRST MONQ AOSN LCIQOT(I) JRST MON5 CAIN CH,177 JRST MONRUB CAIN CH,^M JRST MONECH CAIN CH,12 JRST MONCR CAIN CH,33 JRST [ PUSHJ P,MNGKLA ;ECHO THE ALTMODE JRST MNCRAS] ;AND TERMINATE THE COMMAND. MON5: CAME B,[900,,LCICBF+LCICBL-1(I)] IDPB CH,LCICBP(I) MONECH: PUSHJ P,MNGKLA JRST GOOKLE MONRUB: CAMN B,[900,,LCICBF-1(I)] JRST MNRB2 LDB CH,B XCT LCOSBR(I) ADD B,[90000,,] TLNE B,400000 SUB B,[440000,,1] MOVEM B,LCICBP(I) JRST GOOKLE MNRB2: MOVEI CH,^^ JRST MNGKEY MONQ: SETOM LCIQOT(I) JRST MONECH IRP X,,[AYT,IP,EC,AO,EL,GA] MN2!X: MOVEI CH,TC.!X\400 JRST MGOKLK TERMIN MON2GA=MN2GA MN2BRK: MOVEI CH,TC.BRK\400 SKIPE NEWOLD MOVEI CH,OTCBRK MGOKLK: SETZM LCIMON(I) JRST GOOKLK MON2Y: PUSHJ P,TTYECH JRST MNGKEC MON2N: PUSHJ P,TTYNOE JRST MNGKEC MON2P: .VALUE [ASCIZ /:PROCED /] JRST MNGKEC MON2Q: .LOGOUT .VALUE [ASCIZ /:KILL /] JRST MNGKEC MN2CCS: MOVEI T,40 XORM T,CASEC(I) JRST MNGKEC ;OLD TELNET PROTOCOL CODES OTCDM==200 OTCBRK==201 OTCNOP==202 OTCNOE==203 OTCECH==204 OTCHYI==205 MONIAC: CAIGE CH,240. JRST IACBAD ;BAD IAC SEQUENCE MOVE A,IACDSP-240.(CH) HLRZM A,LCIMON(I) JRST (A) IACBAD: 7TYPB [ASCIZ / BAD IAC /] OTYPB CH 7TYPB [ASCIZ / SEQUENCE. PORT="/] 6TYPB LCSNAM(I) 7TYPB [ASCIZ /" /] JRST MNPRET IACDSP: MN.SE,,MN.SE ;SE ;240. 0,,GOOKLE ;NOP 0,,MN.DM ;DM 0,,MN.TRN ;BRK 0,,MN.TRN ;IP 0,,MN.TRN ;AO ;245. 0,,MN.TRN ;AYT 0,,MN.TRN ;EC 0,,MN.TRN ;EL 0,,GOOKLE ;GA MN.SB,,MN.GOK ;SB ;250. MNWNDN,,MN.GOK ;WIL MNWNDN,,MN.GOK ;WNT MNWNDN,,MN.GOK ;DO MNWNDN,,MN.GOK ;DNT 0,,MN.TRN ;IAC ;255. ;NEW TELNET PROTOCOL CODES TC.SE==240. ;360 TC.NOP==241. TC.DM==242. ;362 TC.BRK==243. TC.IP==244. ;364 TC.AO==245. TC.AYT==246. ;366 TC.EC==247. TC.EL==248. ;370 TC.GA==249. TC.SB==250. ;372 TC.WIL==251. TC.WNT==252. ;374 TC.DO==253. TC.DNT==254. ;376 TC.IAC==255. TCTAB: IRP X,,[SE,NOP,DM,BRK,IP,AO,AYT,EC,EL,GA,SB,WIL,WNT,DO,DNT,IAC] SIXBIT /X/ TERMIN ;"TRANSPARENT" MN.TRN: TRO CH,400 JRST GOOKLK ;STORE FIRST CHAR OF IAC SEQUENCE MN.GOK: IDPB CH,LCICBP(I) JRST GOOKLE ;DATA MARK MN.DM: AOS LCSDMC(I) JRST GOOKLE ;NEW TELNET PROTOCOL OPTION CODES OP.TB==0 ;TRANSMIT BINARY OP.EC==1 ;ECHO OP.RCP==2 ;RECONNECT OP.SGA==3 ;SUPPRESS-GO-AHEAD OP.NMS==4 ;MESSAGE SIZE OP.STA==5 ;STATUS OP.TM==6 ;TIMING MARK OP.EXO==255. ;EXTENDED OPTIONS MNWNDN: LDB B,LCICBP(I) ;GET WIL/WNT/DO/DNT CAIN CH,OP.EC JRST MNWEC ;ECHO ; CAIN CH,OP.RCP ; JRST ;RECONNECTION CAIN CH,OP.SGA JRST MNWSGA ;SUPPRESS GO AHEAD ; CAIN CH,OP.STA ; JRST ;STATUS CAIE B,TC.DNT CAIN B,TC.WNT TRC CH,TC.WNT#TC.DNT ;??? RECEIVED DNT OR WNT FOR UNKNOWN CODE??? ;JUST REFUSE WIL OR DO FOR UNKNOWN CODE CAIN B,TC.WIL MOVEI B,TC.DNT CAIN B,TC.DO MOVEI B,TC.WNT EXCH CH,B TRO CH,400 PUSHJ P,MNGKLA MOVE CH,B PUSHJ P,MNGKLA MNPRET: SETZM LCIMON(I) MOVE T,[900,,LCICBF-1(I)] MOVEM T,LCICBP(I) JRST GOOKLE MN.SE: .VALUE ;END SUBNEGOTIATE WITHOUT BEGIN?? JRST MNPRET MN.SB: CAIN CH,TC.SE ;SUBNEGOTIATE JRST MN.SB2 MOVE B,[900,,LCICBF+LCICBL-1(I)] CAMN B,LCICBP(I) JRST MN.SB4 IDPB CH,LCICBP(I) JRST GOOKLE MN.SB4: .VALUE ;SUBNEGOTIATE TOO LONG JRST MNPRET MN.SB2: .VALUE MNWEC: PUSHJ P,MNTMBS PUSH P,I ;TRANSMIT CHANGE TO IN-CONNECTED PORTS SKIPN I,LCILST(I) JRST MNWEC2 MOVE B,MNWOP-TC.WIL(B) MNWEC4: MOVSS I MOVE I,(I) PUSHJ P,MNTMBS ;REQ. LOC TO OPP. OF RMT CHNG TLNE I,-1 JRST MNWEC4 MNWEC2: POP P,I JRST MNPRET ;TEST & MAYBE SET MNTMBS: LDB T,ECTAB-TC.WIL(B) ;GET CUR STATE CAMN T,ECVAL-TC.WIL(B) ;COMPARE REQ POPJ P, ;EQUAL ;NO-OP MOVE T,ECVAL-TC.WIL(B) DPB T,EDTAB-TC.WIL(B) ;SET OTHER HALF TO REQ SETOM LCSCKS(I) POPJ P, MNWOP: TC.DNT TC.DO TC.WNT TC.WIL ECTAB: 222200,,LCSREC(I) 222200,,LCSREC(I) 222200,,LCSECO(I) 222200,,LCSECO(I) ECVAL: ,-1 0 ,-1 0 EDTAB: 2200,,LCSREC(I) 2200,,LCSREC(I) 2200,,LCSECO(I) 2200,,LCSECO(I) MNWSGA: LDB T,SGATAB-TC.WILL(B) CAMN T,ECVAL-TC.WIL(B) JRST MNPRET MOVE T,ECVAL-TC.WIL(B) DPB T,SGBTAB-TC.WIL(B) SETOM LCSCKS(I) JRST MNPRET SGATAB: 222200,,LCSRGA(I) 222200,,LCSRGA(I) 222200,,LCSGA(I) 222200,,LCSGA(I) SGBTAB: 2200,,LCSRGA(I) 2200,,LCSRGA(I) 2200,,LCSGA(I) 2200,,LCSGA(I) FTMHK: MOVE T,[PUSHJ P,TTYI] MOVEM T,LCISBR(I) MONCR: PUSHJ P,CRLF MNCRAS: PUSH P,Q PUSH P,TT MOVE Q,[900,,LCICBF-1(I)] PUSHJ P,GETSYL JRST MONCRX ;NOTHING MOVE T,[-CMTBLN,,COMTBL] PUSHJ P,LOOKUP JRST MONRC PUSHJ P,(TT) JRST MONCRX MONRC: PUSHJ P,PRTERR 7TYPB [ASCIZ /" UNRECOGNIZED COMMAND. PORT="/] MONCRX: POP P,TT POP P,Q SETZM LCIMON(I) MOVE T,[900,,LCICBF-1(I)] MOVEM T,LCICBP(I) JRST GOOKLE PRTERR: 7TYPB [ASCIZ / "/] 6XTYPB S1 6TYPB S2 XCT @(P) 6TYPB LCSNAM(I) 7TYPB [ASCIZ /" /] JRST POPJ1 ;GET SYLLABLE GETSYL: PUSH P,C SETZB S1,S2 SETZB A,C MOVE B,[440600,,S1] GTSYL2: CAMN Q,LCICBP(I) JRST GTSYL0 ILDB CH,Q AOSN C JRST GTSYL3 CAIN CH,^Q JRST GTSYL1 CAIE CH,": CAIN CH,"; JRST GTSYL4 CAIE CH,"< CAIN CH,"> JRST GTSYL4 CAIG CH,40 JRST GTSYL4 GTSYL3: SUBI CH,40 CAIL CH,100 SUBI CH,40 CAME B,[000600,,S2] IDPB CH,B JRST GTSYL2 GTSYL0: MOVEI CH,40 ;END OF WORLD, SIMULATE SPACE POP P,C SKIPE S1 POPJ1: AOS (P) POPJ P, GTSYL1: SETOM C JRST GTSYL2 GTSYL4: JUMPE S1,GTSYL2 POPCJ1: POP P,C AOS (P) POPJ P, ;TABLE OF MULTI-LETTER COMMANDS COMTBL: .. ?,[[ASCIZ /LIST SINGLE CHARACTER COMMANDS/],,MON2QM] ;LEAVE IN LIST FOR HELP PRINT OUT .. AS-IF-FROM,[[ASCIZ /FAKE COMMAND AT SPECIFIED PORT/],,ZASIF] .. CONNECT,[[ASCIZ /NETWORK CONNECT/],,ZCON] .. DESENSITIZE,[[ASCIZ \FOLLOW BY CHARS (^^ ^Q / N=NEW O=OLD); DON'T TREAT THEM AS COMMANDS\],,ZDESEN] .. DISCONNECT,[200000+[ASCIZ /NETWORK DISCONNECT/],,ZDISCO] .. HELP,[[ASCIZ /LIST MULTI-CHARACTER COMMANDS/],,ZQM] .. HOSTS,SETZ ZLISTH .. IAC,[[ASCIZ /SEND PROTOCOL MESSAGE/],,ZIAC] .. IBREAK,[[ASCIZ /INPUT-TO UNPATCH/],,ZIBRK] .. IFILE,SETZ ZIFILE .. IGNORE,[[ASCIZ /FOLLOW BY CHARS; IGNORE THOSE CHARS/],,ZIGNOR] .. IMAKE,[[ASCIZ /INPUT-TO PATCH/],,ZIMAK] .. INTERRUPT,[200000+[ASCIZ /SEND INTERRUPT/],,ZINT] .. LISTCOMMANDS,SETZ ZQM .. LISTHOSTS,[[ASCIZ /LIST HOSTS/],,ZLISTH] .. LISTPORTS,[200000+[ASCIZ /LIST PORTS ETC./],,ZLISTP] .. MONITOR,[[ASCIZ /MONITOR PORT/],,ZMON] .. MORE,[[ASCIZ /DO **MORE** AT SCREEN BOTTON/],,ZMOR] .. NEW,[[ASCIZ /USE NEW PROTOCOL/],,ZNEW] .. NOMORE,[[ASCIZ /DON'T **MORE** AT SCREEN BOTTOM/],,ZNMOR] .. OBREAK,[[ASCIZ /OUTPUT-MONITOR UNPATCH/],,ZOBRK] .. OLD,[[ASCIZ /USE OLD PROTOCOL/],,ZOLD] .. OMAKE,[[ASCIZ /OUTPUT-MONITOR PATCH/],,ZOMAK] .. OPAQUE,[[ASCIZ /GIVE ^Z & ^_ TO SYSTEM/],,ZOPAQ] .. PATIENCE,[[ASCIZ /IN SECONDS/],,ZPAT] .. PORTS,TRN ZLISTP .. PRINT,[[ASCIZ /CONTROL PROTOCOL TYPE OUT/],,ZPRINT] .. PROCEED,[[ASCIZ /GIVING TTY TO DDT/],,MON2P] .. QUIT,[[ASCIZ /SELF DESTRUCT/],,MON2Q] .. SENSITIZE,[[ASCIZ /FOLLOW BY CHARS; ACCEPT THEM AS COMMANDS/],,ZSEN] .. SHIFT,[[ASCIZ /FOLLOW BY CHARS; REGARD THEM AS CASE SHIFTABLE/],,ZSHIFT] .. TEST,SETZ TEST .. TRANSPARENT,[200000+[ASCIZ /DON'T GIVE ^Z & ^_ TO SYSTEM/],,ZTRANS] .. UNIGNORE,[[ASCIZ /FOLLOW BY CHARS; DON'T IGNORE THEM/],,UNIGNR] .. UNSHIFT,[[ASCIZ /FOLLOW BY CHARS; CONSIDER THEM NOT SHIFTABLE/],,UNSHFT] .. XFILE,[[ASCIZ /EXECUTE FILE/],,ZXFILE] CMTBLN==.-COMTBL ;LIST COMMANDS ZQM: 7TYP [ASCIZ / COMMANDS: /] MOVE D,[-CMTBLN,,COMTBL] JRST ZZLIST ZNEW: SETZM NEWOLD POPJ P, ZOLD: SETOM NEWOLD POPJ P, ;LIST HOSTS ZLISTH: 7TYP [ASCIZ / CLOSE FRIENDS: /] MOVE D,[-HSTB1L,,HSTB1] PUSHJ P,ZZLIST ;LIST SHORT NAMES OF COMMONLY USED HOSTS. 7TYP [ASCIZ / FULL NAMES: /] MOVE D,[-HSTABL,,HSTAB] ZZLIST: SKIPGE A,2(D) JRST ZZLST2 6XTYP (D) 6XTYP 1(D) HRRZ T,A OTYP T TLZE A,200000 7TYP [ASCIZ / */] ;DOMINATES HLRZS A SKIPN A JRST ZZLST1 7TYP [ASCIZ / /] 7TYP (A) ZZLST1: 7TYP [ASCIZ / /] ZZLST2: ADD D,[3,,3] JUMPL D,ZZLIST POPJ P, ;SET/PRINT PATIENCE ZPAT: PUSHJ P,GTNPLN JRST ZPATB PUSHJ P,MAKNUM HRRM TT,PATLOC ZPATB: HRRZ D,PATLOC DTYP D 7TYP [ASCIZ / SECONDS /] POPJ P, ;SEND SYMBOLICALLY EXPRESSED PROTOCOL MESSAGE ZIAC: PUSHJ P,GETPRT SKIPN C JRST ZIAC2 PUSHJ P,FNDPRT JRST ZASIFE JRST ZASIFF SKIPA ZIAC2: MOVNI D,1 PUSH P,I SKIPL D MOVE I,D MOVEI CH,TC.IAC ZIAC4: SKIPL D PUSHJ P,MNGKLA SKIPGE D PUSHJ P,MGKGKN ZIAC5: PUSHJ P,GTNPLN JRST POPIJ MOVE T,[-PRTABL,,PRTAB] PUSHJ P,LOOKUP JRST ZIACNM ZIAC6: LDB CH,[1000,,TT] JRST ZIAC4 ZIACNM: PUSHJ P,MAKNUM JRST ZIAC6 EXCH I,(P) PUSHJ P,PRTERR 7TYPB [ASCIZ /" UNRECOGNIZED PROTOCOL ITEM. PORT="/] EXCH I,(P) JRST ZIAC5 PRTAB: .. AO,365 .. AYT,366 .. BRK,363 .. DNT,376 .. DM,362 .. DO,375 .. EC,367 .. ECHO,1 .. EL,370 .. GA,371 .. IAC,377 .. IP,364 .. NOP,361 .. SB,372 .. SE,360 .. SGA,3 .. WIL,373 .. WNT,374 PRTABL==.-PRTAB ;COMMAND AS IF FROM SPECIFIED PORT ZASIF: PUSHJ P,GETFPT ;GET FIRST PORT SKIPN C JRST ZASIFE PUSHJ P,FNDPRT JRST ZASIFE JRST ZASIFF SKIPE LCIMON(D) JRST ZASIFZ PUSHJ P,STAP MOVE T,LCICBP(D) TLZ T,17 TLO T,D ZASIFL: ILDB CH,Q IDPB CH,T ;MOVE COMMAND STRING CAMN Q,LCICBP(I) JRST ZASIFX JRST ZASIFL ZASIFF: SETZM LCSNAM(D) ZASIFE: JRST ZDSCE1 ZASIFZ: 7TYP [ASCIZ /BUSY /] POPJ P, ZASIFX: TLZ T,17 TLO T,I MOVEM LCICBP(D) ;FAKE THINGS OUT MOVSI T,400000 SKIPL LCIAVL(D) MOVEM T,LCIAVL(D) MOVE T,[PUSHJ P,ZASHAK] MOVEM T,LCISBR(D) SETZM IBLKD(D) POPJ P, ;FAKE THINGS BACK ZASHAK: MOVE CH,[400000,,000001] CAMN CH,LCIAVL(I) SETZM LCIAVL(I) MOVE CH,LCSITY(I) MOVE CH,CISBRT(CH) MOVEM CH,LCISBR(I) PUSHJ P,BLKNEW JRST MNCRAS GETFPT: PUSH P,Q SETZM C PUSHJ P,GETSYL JRST POPQJ PUSHJ P,GTPRTT JRST GETFPT MOVE C,S1 POPQJ: POP P,Q POPJ P, ;SKIP TO AFTER PORT STAP: CAMN Q,LCICBP(I) .VALUE ;HIT END OF COMMANDS ILDB CH,Q CAIE CH,"> CAIN CH,"< POPJ P, JRST STAP ;SET PROTOCOL MESSAGES TO TTY PRINT MODE ZPRINT: PUSHJ P,GTNPLN JRST ZPRNT2 MOVE T,[-FTABL,,FTAB] PUSHJ P,LOOKUP JRST ZPRNT4 HRRES TT MOVEM TT,PRINT(I) POPJ P, ZPRNT2: SKIPGE PRINT (I) 7TYP [ASCIZ /FANCY /] SKIPN PRINT(I) 7TYP [ASCIZ /OFF /] SKIPLE PRINT(I) 7TYP [ASCIZ /ON/] POPJ P, ZPRNT4: PUSHJ P,PRTERR 7TYPB [ASCIZ /" UNRECOGNIZED FLAG VALUE. PORT="/] POPJ P, FTAB: .. -1,[,,-1] .. 0,0 .. 1,1 .. FANCY,[,,-1] .. OFF,0 .. ON,1 FTABL==.-FTAB ;TEST GETSYL, ETC. TEST: PUSHJ P,GETPRT PUSHJ P,TESTP SIXBIT /PORT/ PUSHJ P,GETDEV PUSHJ P,TESTP SIXBIT /DEVICE/ PUSHJ P,GETSNM PUSHJ P,TESTP SIXBIT /SNAME/ TEST2: PUSHJ P,GTNPLN POPJ P, MOVE C,S1 MOVE D,S2 PUSHJ P,TESTP SIXBIT /PLAIN/ JRST TEST2 TESTP: 6XTYP @(P) AOS (P) JUMPE C,CRLF 7TYP [ASCIZ / = /] 6XTYP C SKIPE D 6XTYP D JRST CRLF ;ROUTINE FOR HACKING VARIOUS TTY BITS. CALL BY ;PUSHJ P,TTYHAK WITH CHNL IN T AND TYGTBK IN NXT WRD. ;FOLLOWING WORDS HAVE BITS IN R.H., INDEX INTO CALL IN 3.1-3.9, ;AND 4.9=1=> MODIFY LEFT HALF, 4.9=0=> R.H. ; 4.8=1=> SET, 2.8=0=> CLEAR. TTYHAK: MOVE A,@(P) HRRM T,2(A) HRRM T,2+HAKDLT(A) .CALL (A) JRST HAKERR TYHKLP: AOS (P) LDB T,[221100,,@(P)] JUMPE T,TYHKXT LDB TT,[331100,,@(P)] HRLZ D,@(P) TRNN TT,400 MOVSS D ADD A,T IORM D,@(A) TRNN TT,200 ANDCAM D,@(A) SUB A,T JRST TYHKLP TYHKXT: .CALL HAKDLT(A) JRST HAKERR JRST POPJ1 HAKERR: .VALUE JRST POPJ1 ;TURN ON **MORE** ZMOR: PUSHJ P,GET.T PUSHJ P,TTYHAK ;CLEAR 3.8 TTYSTS TYGTBK 400005,,200 0 POPJ P, ;TURN OFF **MORE** ZNMOR: PUSHJ P,GET.T PUSHJ P,TTYHAK ;SET 3.8 TTYSTS TYGTBK 600005,,200 0 POPJ P, TYGTBK: SETZ SIXBIT /TTYGET/ 1000,,. 2000,,TTYST1 2000,,TTYST2 402000,,TTYSTS CVSS: . CHSS: . HAKDLT==.-TYGTBK TYSTBK: SETZ SIXBIT /TTYSET/ 1000,,. TTYST1 TTYST2 400000,,TTYSTS TTYST1: . TTYST2: . CNGTBK: SETZ SIXBIT /CNSGET/ 1000,,. 2000,,CVSS 2000,,CHSS 2000,,TCTYP 2000,,TTYCOM 2000,,TTYOPT 402000,,CNSTYP TTYOPT: . TTYSTS: . TTYCOM: . CNSTYP:: . TCTYP: . ;SET SYSTEM TRANSPARENT TO ^Z & ^_ ZTRANS: PUSHJ P,GET.T PUSHJ P,TTYHAK ;SET 3.2 IN TTYSTS TYGTBK 600005,,%TSSII 0 POPJ P, ;SET SYSTEM OPAQUE TO ^Z & ^_ ZOPAQ: PUSHJ P,GET.T PUSHJ P,TTYHAK ;CLEAR 3.2 IN TTYSTS TYGTBK 400005,,%TSSII 0 POPJ P, ;COMMANDS TO SET OR UNSET CHS TO BE IGNORED OR SHIFTABLE ZIGNOR: SKIPA A,[SETZ] ZSHIFT: MOVSI A,200000 TDZA C,C IGSHNT: MOVNI C,1 IGSH2: CAMN Q,LCICBP(I) JRST CRLF ILDB CH,Q ANDI CH,377 IORM A,MN2TTT(CH) SKIPE C ANDCAM A,MN2TTT(CH) JRST IGSH2 UNIGNR: SKIPA A,[SETZ] UNSHFT: MOVSI A,200000 JRST IGSHNT ;SENSITIZE & DESENSITIZE PORT TO COMMAND CHARACTERS ZDESEN: TDZA A,A ZSEN: MOVEI A,1 SENSEN: CAMN Q,LCICBP(I) JRST CRLF ILDB CH,Q CAIN CH,^^ DPB A,[MONUPT,,LCIMNS(I)] CAIN CH,^Q DPB A,[MONQPT,,LCIMNS(I)] CAIN CH,\ DPB A,[MONSPT,,LCIMNS(I)] CAIN CH,TC.IAC DPB A,[MONNPT,,LCIMNS(I)] CAIE CH,"n CAIN CH,"N DPB A,[MONNPT,,LCIMNS(I)] CAIE CH,"o CAIN CH,"O DPB A,[MONOPT,,LCIMNS(I)] JRST SENSEN ;^^ MON (FILE) ;MONITOR TTY TO FILE ;^^ MON FOO> (FILE) ;MONITOR FOO TO FILE ;^^ MON FOO> BAR> (FILE) ;MONITOR BAR TO FILE OPENED ON FOO ZMON: PUSHJ P,GETPRT SKIPN C JRST ZMON2 ;NO PORTS SPECIFIED PUSHJ P,FNDPRT JRST ZCONE1 ;ALL IN USE & NOT FOUND JRST ZASIFF ZMON3: MOVEM D,SAVEID ;SAV IDX OF PRT TO MON SKIPN C,GTGTVV PUSHJ P,GENSYM ;NO 2ND PRT PUSHJ P,FNDPRT JRST ZDSCE1 ;ALL IN USE & NOT FOUND JFCL MOVEM I,SAVID2 ;SAV IDX OF COMMAND SOURCE PORT MOVEM D,SAVID3 ;SAV IDX OF PRT FOR MON FILE PUSHJ P,GETSNM SKIPN C MOVE C,USNAME MOVEM C,USNAME .SUSET [.SSNAM,,USNAME] PUSHJ P,GETDEV SKIPN C HRR C,LSTMNF HRRM C,LSTMNF HRLI C,7 MOVE D,SAVID3 MOVEM C,LCSOFL(D) PUSHJ P,GTNPLN ;SKIPS IF FOUND MOVE S1,LSTMNF+1 MOVEM S1,LSTMNF+1 MOVE D,SAVID3 MOVEM S1,LCSOFL+1(D) PUSHJ P,GTNPLN MOVE S1,LSTMNF+2 MOVEM S1,LSTMNF+2 MOVE D,SAVID3 MOVEM S1,LCSOFL+2(D) MOVE I,D SETZM LCSITY(I) MOVEI A,FILTYP MOVEM A,LCSOTY(I) PUSHJ P,OPNLCS JRST ZMONE2 MOVE D,SAVEID EXCH I,D PUSHJ P,MIDLNK ZMON4: MOVE I,SAVID2 POPJ P, ZMONE2: PUSHJ P,CLSLCS SETZM LCSNAM(I) JRST ZMON4 ZMON2: HRRZ D,I JRST ZMON3 ;^^ XFILE (FILE) ;EXECUTE FILE ;^^ XFILE FOO> (FILE) ;EXECUTE FILE ON FOO ZXFILE: PUSHJ P,GGFPRT JRST ZCONE1 TDZA C,C ;NEWLY CREATED PORT. HRRO C,LCIMNS(I) ;EXISTING PORT; DON'T CHAGE LCIMNS, BUT OPNLCS CLOBBERS IT. PUSH P,C MOVEM I,SAVID2 MOVEM D,SAVID3 PUSHJ P,GETSNM SKIPN C MOVE C,USNAME MOVEM C,USNAME .SUSET [.SSNAME,,USNAME] PUSHJ P,GETDEV SKIPN C HRR C,LSTXFF HRRM C,LSTXFF HRLI C,6 MOVE D,SAVID3 MOVEM C,LCSIFL(D) PUSHJ P,GTNPLN MOVE S1,LSTXFF+1 MOVEM S1,LSTXFF+1 MOVE D,SAVID3 MOVEM S1,LCSIFL+1(D) PUSHJ P,GTNPLN MOVE S1,LSTXFF+2 MOVEM S1,LSTXFF+2 MOVE D,SAVID3 MOVEM S1,LCSIFL+2(D) PUSHJ P,ZIFIL2 ;OPEN & INIT THE PORT, POP P,C SKIPE C ;IF PORT ISN'T JUST CREATED, HRRZM C,LCIMNS(I) ;DON'T CHANGE OLD LCIMNS SETTING. POPJ P, ZIFIL2: MOVE I,D SETZM LCSOTY(I) MOVEI A,FILTYP MOVEM A,LCSITY(I) PUSHJ P,OPNLCS JRST ZMONE2 JRST ZMON4 ;TRY TO EXECUTE INIT FILE. ZIFILE: .SUSET [.RSNAM,,USNAME] ;MAKE SURE THIS COMMAND DOESN'T CHANGE SNAME PERMANENTLY. MOVEI C,ZIFIL8 ;TRY DSK:.UT. (INIT) .OPEN SPECC,(C) SKIPA C,[ZIFIL9] ;LOST; TRY (INIT); .UT. JRST ZIFIL1 ;WON WITH .UT. (INIT). .SUSET [.SSNAM,,[SIXBIT/(INIT)/]] .OPEN SPECC,(C) JRST ZIFIL3 ;NO INIT FILE. ZIFIL1: .CLOSE SPECC, ;THERE'S AN INIT FILE; ITS SNAME IS OURS, AND C -> FILE BLOCK. MOVEM C,INITFP ;REMEMBER -> FILENAMES OF INIT FILE. PUSHJ P,GGFPRT JRST ZCONE1 JFCL ;ACT LIKE XFILE. MOVEM I,SAVID2 MOVEM D,SAVID3 MOVEI C,LCSIFL(D) HRL C,INITFP ;COPY INIT FILE NAMES INTO NEWLY CREATED PORT. BLT C,LCSIFL+2(D) PUSHJ P,ZIFIL2 ;OPEN THE PORT, ETC. .SUSET [.SSNAM,,USNAME] ;RESTORE ORIGINAL SNAME. ZIFIL3: SETOM LCIAVL(I) ;PROVIDE THE INITIAL "^^CONNECT " ON TTY MOVE C,[350700,,INITBP+1] MOVEM C,INITBP POPJ P, INITFP: . ZIFIL8: SIXBIT/ "DSK.UT. (INIT)/ ZIFIL9: SIXBIT/ "DSK/ ZIFIL7: . ;INITIAL SNAME PUT HERE AT STARTUP. SIXBIT/.UT./ ;LIST PORTS LP: PUSH P,I ;VERSION TO CALL FROM DDT FOR DEBUGGING PUSH P,INSTIG SETZB I,INSTIG PUSH P,UUOH PUSH P,40 PUSH P,UJPC PUSH P,A PUSH P,D PUSHJ P,ZLISTP POP P,D POP P,A POP P,UJPC POP P,40 POP P,UUOH POP P,INSTIG POP P,I POPJ P, ;LIST PORTS ETC. ZLISTP: MOVSI D,-7 ZLSTP1: SKIPN LCSNAM(D) JRST ZLSTP4 7TYP [ASCIZ / PORT: /] 6XTYP LCSNAM(D) 7TYP [ASCIZ / INPUT: /] MOVE A,LCSITY(D) 6XTYP TYPSTR(A) SKIPE IBLKD(D) 7TYP [ASCIZ /<>/] JUMPE A,ZLSTP3 6XTYP LCSIFL(D) 6XTYP LCSIFL+1(D) 6XTYP LCSIFL+2(D) SKIPE LCSIFL+3(D) OTYP LCSIFL+3(D) ZLSTP3: SKIPN A,LCILST(D) JRST ZLSTP2 7TYP [ASCIZ / TO: /] PUSHJ P,ZLSTPB ZLSTP2: 7TYP [ASCIZ / OUTPUT: /] MOVE A,LCSOTY(D) 6XTYP TYPSTR(A) SKIPE OBLKD(D) 7TYP [ASCIZ /<>/] JUMPE A,ZLSTP5 6XTYP LCSOFL(D) 6XTYP LCSOFL+1(D) 6XTYP LCSOFL+2(D) SKIPE LCSOFL+3(D) OTYP LCSOFL+3(D) ZLSTP5: SKIPN A,LCOLST(D) JRST ZLSTP4 7TYP [ASCIZ / MONITORS: /] PUSHJ P,ZLSTPB ZLSTP4: ADD D,[1,,LCSLNG] JUMPL D,ZLSTP1 CRLF: 7TYP [ASCIZ / /] POPJ P, ZLSTPB: MOVSS A MOVE A,(A) 6TYP LCSNAM(A) TLNN A,-1 POPJ P, 7TYP [ASCIZ /, /] JRST ZLSTPB TYPSTR: SIXBIT /NONE/ SIXBIT /TTY/ SIXBIT /NET/ SIXBIT /PTY/ SIXBIT /FILE/ SIXBIT /ERROR/ ;GET PORT GETPRT: PUSHJ P,GETGET PUSHJ P,GTPRTT POPJ P, GTPRTT: CAIE CH,"> CAIN CH,"< AOS (P) POPJ P, ;GET DEVICE GETDEV: PUSHJ P,GETGET CAIE CH,": HLRZS C POPJ P, ;GET SYS NAME GETSNM: PUSHJ P,GETGET CAIE CH,"; POPJ P, GETGET: PUSH P,Q SETZB C,D ;IN CASE FAIL OUT GETGT2: PUSHJ P,GETSYL JRST GETGT4 XCT @-1(P) JRST GETGT2 MOVEM C,GTGTVV MOVEM D,GTGTVV+1 MOVE C,S1 MOVE D,S2 JRST GETGT2 GETGT4: MOVE S1,C ;FOR PRTERR MAYBE POPQJ1: POP P,Q AOS (P) POPJ P, GTGTVV: BLOCK 2 ;GET NEXT PLAIN GTNPLN: PUSHJ P,GETSYL POPJ P, CAIE CH,40 CAIN CH,15 JRST POPJ1 JRST GTNPLN MAKNUM: MOVE A,[440600,,S1] MOVEI TT,0 MAKNM2: ILDB T,A SKIPE T CAMN A,[000600,,S2] POPJ P, CAIL T,'0 CAILE T,'9 JRST POPJ1 LSH TT,3 ADDI TT,-'0(T) JRST MAKNM2 ;CONNECT OVER NETWORK ZCON: PUSHJ P,GGFPRT JRST ZCONE1 ;LOSS JFCL MOVE A,[40,,(SIXBIT /NET/)] MOVEM A,LCSIFL(D) TLO A,1 MOVEM A,LCSOFL(D) MOVEI A,NETTYP MOVEM A,LCSITY(D) MOVEM A,LCSOTY(D) PUSHJ P,GTNPLN PUSHJ P,GLSTFH MOVE T,[-HSTB1L,,HSTB1] PUSHJ P,LOOKUP ;SEARCH NICNAME TABLE. SKIPA T,[-HSTABL,,HSTAB] JRST ZCONE3 PUSHJ P,LOOKUP ;SEARCH FULLNAME TABLE. JRST ZCONE2 ZCONE3: PUSHJ P,STLSTH HRRZM TT,FRNHST HRRZM TT,LCSOFL+3(D) HRRZM TT,LCSIFL+3(D) MOVEI TT,1 PUSHJ P,GTNPLN JRST ZCON5 PUSHJ P,MAKNUM SKIPA MOVEI TT,1 ZCON5: MOVEM TT,FRNSOC EXCH I,D .OPEN SPECC,NET1 OPNLUZ ZCONE6 MOVE T,[SPECC,,RCH] .RCHST T, MOVE TT,RCH+1 ;LOCAL SOC ADDI TT,2 MOVEM TT,LCSIFL+1(I) ADDI TT,1 MOVEM TT,LCSOFL+1(I) SETOM CLKPC SKIPE DEAD(I) .VALUE $STCON: .CALL [ SETZ ? 'NETBLK ? MOVEI SPECC ? SETZI %NSRFS ] .LOSE 1000 .IOT SPECC,TT ;FOREIGN SOC SKIPE B,DEAD(I) ;MAY HAVE BEEN SET BY IOC JRST ZCONE5 MOVEM TT,LCSOFL+2(I) ADDI TT,1 MOVEM TT,LCSIFL+2(I) PUSHJ P,OPNLCS JRST ZCONE6 .CLOSE SPECC, PUSHJ P,IDLINK EXCH I,D JUMPN I,IDLINK ;IF TTY IS COMMANDING TO CONNECT TO AI OR ML, MOVE TT,FRNHST CAIE TT,206 CAIN TT,306 PUSHJ P,TTYNOE ;TURN OFF LOCAL ECHOING. JRST IDLINK ZCONE5: PUSHJ P,DEADB JRST POPXID ZCONE6: PUSHJ P,CLSLCS .CLOSE SPECC, SETZM LCSNAM(I) POPXID: EXCH I,D POPJ P, ZCONE1: 7TYPB [ASCIZ / ALL PORTS IN USE!/] JRST ZLISTP ZCONE2: PUSHJ P,MAKNUM JRST ZCONE3 EXCH I,D PUSHJ P,ZCONE6 PUSHJ P,PRTERR 7TYPB [ASCIZ /" UNRECOGNIZED HOST NAME. PORT="/] POPJ P, GLSTFH: MOVE S1,LSTFRH MOVE S2,LSTFRH+1 POPJ P, STLSTH: MOVEM S1,LSTFRH MOVEM S2,LSTFRH+1 POPJ P, LSTFRH: SIXBIT /ML/ ;LAST FOREIGN HOST 0 ;GENERATE 3 CHAR SYMBOL GENSYM: AOS SYMGEN MOVE T,[220600,,SYMGEN] GNSM2: ILDB TT,T CAIL TT,'A CAILE TT,'Z MOVEI TT,'A DPB TT,T TLNE T,770000 JRST GNSM2 HRLZ C,SYMGEN POPJ P, SYMGEN: 0 GGFPRT: PUSHJ P,GETPRT ;(GET OR GENERATE) & FIND PORT SKIPN C PUSHJ P,GENSYM ;FALL THROUGH ;FIND PORT, CALL WITH NAME IN C ;RETURNS WITH LCS INDEX IN D UNLESS +0 ;+0 IF ALL IN USE & NOT FOUND ;+1 IF NEW ONE SEIZED FOR NAME ;+2 IF NAME FOUND FNDPRT: MOVSI D,-7 FNDPT2: CAMN C,LCSNAM(D) JRST FNDPTZ ;FOUND NAME ADD D,[1,,LCSLNG] JUMPL D,FNDPT2 CAMN C,[SIXBIT /SELF/] JRST FNDPTS MOVSI D,-7 FNDPT4: SKIPN LCSNAM(D) JRST FNDPTY ;FOUND IDLE SLOT ADD D,[1,,LCSLNG] JUMPL D,FNDPT4 POPJ P, ;ALL IN USE FNDPTS: MOVE D,INSTIG MOVE C,LCSNAM(D) FNDPTZ: AOS (P) JRST POPJ1 FNDPTY: HRRZS D MOVEM C,LCSNAM(D) AOS NPORTS AOS (P) POPJ P, ;TABLE LOOK UP ;CALL WITH SYM IN S1 & S2, TABLE IN T ;RETURN WITH VALUE IN TT, SKIPPING IF FOUND ;TYPES OUT COMPLETED UNAMBIGUOUS PARTIAL SYMS ;TABLE FORMAT HAS TWO WORDS OF SIXBIT FOLLOWED BY A WORD WITH ;VALUE IN 1.1-2.9 ;LIST INHIBIT BIT IN 4.9 ;DOMINATE BIT FOR AMBIGUOUS LOOK-UPS IN 4.8 ;ASCIZ COMMENT POINTER IN 3.1-4.7 LOOKUP: PUSH P,CH PUSH P,Q PUSH P,D NLKP==3 ;# OF ITEMS PUSHED SETZB Q,CH MOVSI TT,770000 ;SET UP MASKS LOKUP5: TDNE S1,TT TDO CH,TT ;SET UP MASK FOR S1 IN CH ROT TT,-6 TLNN TT,770000 JRST LOKUP5 LOKUP6: TDNE S2,TT TDO Q,TT ;SET UP MASK FOR S2 IN Q LSH TT,-6 SKIPE TT JRST LOKUP6 LOKUP4: CAMN S1,(T) JRST LOKUP2 ;FIRST PART EQ MOVE TT,(T) AND TT,CH CAMN S1,TT JRST LOKUP1 ;FIRST PART OK MASKED LOKUP3: ADD T,[3,,3] ;TRY NEXT ENTRY JUMPL T,LOKUP4 PPDQCH: POP P,D ;LOSE, RETURN POP P,Q POP P,CH POPJ P, LOKUP2: CAME S2,1(T) ;MUST WIN FOR EXACT MATCH EVEN IF AMBIG. JRST LOKUP1 LOKUP7: MOVE TT,2(T) ;WIN, RETURN SKIPPING AOS -NLKP(P) JRST PPDQCH LOKUP1: MOVE TT,1(T) AND TT,Q CAME S2,TT JRST LOKUP3 ;2ND PART LOSES, GO BACK PUSHJ P,LOKTNE JRST LOKUPW ;UNAMBIGUOUS MOVE D,T ;KNOWN AMBIG, TRY TO WIN WITH DOMINANCE ADD T,[3,,3] JUMPGE T,LOKUPW ;END OF TABLE CONFUSION? LKUPA4: LDB TT,[420100,,2(D)] JUMPN TT,LKUPA6 ;1ST DOMINANT LDB TT,[420100,,2(T)] SKIPE TT ;SKIP IF 2ND NOT DOMINANT MOVE D,T ;2ND DOMINANTES LKUPA2: PUSHJ P,LOKTNE JRST LKUPA9 ;NEQUAL, END OF AMBIG BLOCK ADD T,[3,,3] JUMPGE T,LKUPA9 ;JUMP IF END OF TABLE JRST LKUPA4 ;EQUAL MASKED, TEST DOMINANCE LOKTNE: MOVE TT,3(T) ;TEST NEXT ENTRY AND TT,CH ;SKIP IF EQUAL MASKED CAME S1,TT POPJ P, MOVE TT,4(T) AND TT,Q CAMN S2,TT AOS (P) POPJ P, LKUPA9: MOVE T,D LDB TT,[420100,,2(D)] SKIPE TT JRST LOKUPW ;WIN BY DOMINANCE LKUPAB: 6XTYP S1 ;LOSE, NONE OR MORE THAN ONE DOMINANT 6TYP S2 7TYP [ASCIZ / AMBIGUOUS?/] JRST PPDQCH LKUPA6: LDB TT,[420100,,2(T)] SKIPN TT JRST LKUPA2 ;1ST DOMINANT JRST LKUPAB ;BOTH DOMINANT LOKUPW: 6XTYP (T) ;COMPLETE & WIN 6TYP 1(T) JRST LOKUP7 ;DISCONNECT PORT ZDISCO: PUSHJ P,GETPRT JUMPE C,ZDSC2 PUSHJ P,FNDPRT JRST ZDSCE1 JRST ZDSCE0 ZDSC4: EXCH I,D PUSHJ P,CLSLCS SETZM LCSNAM(I) EXCH I,D POPJ P, ZDSCE0: PUSHJ P,ZDSCHK ;UPDATE NPORTS SETZM LCSNAM(I) ZDSCE1: PUSHJ P,PRTERR 7TYPB [ASCIZ /" NON-EX PORT. COMMAND FROM "/] POPJ P, ;NO PORT SPECIFIED ;DISCONNECT ALL PORTS THAT COMMAND SOURCE PORT IS IN-CONNECTED TO ZDSC2: SKIPN TT,LCILST(I) POPJ P, MOVSS TT HRRZ D,(TT) PUSHJ P,ZDSC4 ;LCILST CHANGED BY CLSCLS JRST ZDSC2 ZDSCHK: SKIPE LCSNAM(I) ;IF PORT EXISTS NOW, AND IS GOING AWAY, SOS NPORTS ;# OF PORTS THAT EXIST IS GOING DOWN. POPJ P, ;SEND INTERRUPT OUT PORT ZINT: PUSHJ P,GETPRT JUMPE C,ZINT2 PUSHJ P,FNDPRT JRST ZDSCE1 JRST ZDSCE0 ZINT4: EXCH I,D PUSHJ P,GET.T DPB T,[270400,,.+1] .NETINT ., MOVEI CH,TC.DM XCT LCOSBR(I) EXCH I,D POPJ P, MON2I: PUSHJ P,ZINT2 JRST MNGKEC ;ALL PORTS IN-CONNECTED TO ZINT2: PUSH P,I SKIPN TT,LCILST(I) JRST POPIJ ZINT5: MOVSS TT PUSH P,(TT) HRRZ D,(TT) PUSHJ P,ZINT4 POP P,TT TLNN TT,-1 JRST POPIJ JRST ZINT5 ;MAKE INPUT-TO CONNECTION ZIMAK: PUSHJ P,GTPT22 PUSHJ P,IDLINK SVIPJ: MOVE I,SAVEID POPJ P, ;MAKE OUTPUT-MONITOR CONNECTION ZOMAK: PUSHJ P,GTPT22 PUSHJ P,MIDLNK JRST SVIPJ ;BREAK INPUT-TO CONNECTION ZIBRK: PUSHJ P,GTPT22 JRST ZIBRK2 JRST SVIPJ ZIBRK2: EXCH I,D MOVEI TT,LCILST(D) ZOBRK4: PUSHJ P,UNINKL EXCH I,D JRST SVIPJ ;BREAK OUTPUT-MONITOR CONNECTION ZOBRK: PUSHJ P,GTPT22 JRST ZOBRK2 JRST SVIPJ ZOBRK2: EXCH I,D MOVEI TT,LCOLST(D) JRST ZOBRK4 ;GET TWO PORTS GTPT22: AOS (P) MOVEM I,SAVEID PUSHJ P,GETPRT JUMPE C,GTPT24 PUSHJ P,FNDPRT JRST ZDSCE1 JRST ZASIFF SKIPN C,GTGTVV JRST GTPT42 MOVE TT,D SETZM S2,D MOVE S1,C ;FOR PRTERR MAYBE PUSHJ P,FNDPRT JRST ZDSCE1 JRST ZASIFF MOVE I,D MOVE D,TT GTPT42: SOS (P) POPJ P, GTPT24: 7TYP [ASCIZ /PORTS? /] POPJ P, ;HOST TABLE ;HAS TWO WORDS OF SIXBIT FOLLOWED BY A WORD WITH THE HOST NUMBER IN 1.1-2.9 HSTAB: DEFINE HOST A,B,C,D IFSE D,SERVER,[.. A,[,,C]] TERMIN .INSRT SYSENG;HOSTS INSERT HSTABL==.-HSTAB ;TABLE OF OUR ON NICKNAMES FOR HOSTS HSTB1: .. AI,206 .. BBN,305 .. DMCG,MOVE 106 ;ONE OF THESE TWO MUST DOMINATE, OR ELSE JUST "D" .. DMS,106 ;FOR DMCG OR DMS WON'T BE ACCEPTED, EVEN THO DMCG=DMS! .. ML,306 .. MULTICS,54 .. SAIL,13 HSTB1L==.-HSTB1 END GO