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