From d1c5d8b44c5945625849f500b3994337ad4b3b87 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Wed, 18 Dec 2024 08:56:00 +0100 Subject: [PATCH] UT - old user telnet. --- build/basics.tcl | 4 + build/timestamps.txt | 1 + doc/programs.md | 1 + src/syseng/ut.76 | 2873 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2879 insertions(+) create mode 100755 src/syseng/ut.76 diff --git a/build/basics.tcl b/build/basics.tcl index 4521b493..94a84f64 100644 --- a/build/basics.tcl +++ b/build/basics.tcl @@ -230,6 +230,10 @@ respond "*" ":link sys;ts ttn,sys;ts telnet\r" respond "*" ":link sys;ts ncptn,sys;ts telnet\r" respond "*" ":link sys;ts oth,sys;ts telnet\r" +# old user telnet +respond "*" ":midas sys1;ts ut_syseng;ut\r" +expect ":KILL" + # supdup port (95) uses telser respond "*" ":link device;tcp syn137,sysbin;telser bin\r" diff --git a/build/timestamps.txt b/build/timestamps.txt index 155b678a..77c2223f 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -2883,6 +2883,7 @@ syseng/timoon.25 198005170825.05 syseng/tipinf.37 198212111718.08 syseng/tmpkil.12 197803051252.12 syseng/ufind.41 198611162232.39 +syseng/ut.76 197609271914.01 syseng/what.204 198805161813.03 syseng/wsent.1 198012030321.24 syshst/h3make.56 198908031543.10 diff --git a/doc/programs.md b/doc/programs.md index 90fbe94b..5671d822 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -392,6 +392,7 @@ - UPTINI, program to create new UPTIME DATA. - URUG, GT40 debugger. - USQ/TYPESQ, unsqueeze/uncram or type a file. +- UT, old User TELNET (client). - UTNAM, set DECtape name. - VERSA/SPOOLR, Versatec/Gould printer spooler. - VDIR, view directory. diff --git a/src/syseng/ut.76 b/src/syseng/ut.76 new file mode 100755 index 00000000..8f90dc38 --- /dev/null +++ b/src/syseng/ut.76 @@ -0,0 +1,2873 @@ + +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 +  \ No newline at end of file