;-*-MIDAS-*- TITLE TALK - IEC COMM AND WHO PROGRAM F=0 A=1 B=2 C=3 D=4 E=5 T=6 TT=7 CHR=10 ;USUALLY HAS LAST CHAR READ FROM NETICH, BUFFERED BACK. PT=11 CT=12 I=13 P=17 ICPSOC: 245. ;ICP SOCKET FOR IEC ICPCH==0 ;ICP PIN NETICH==2 ;INPUT PIN NETOCH==3 ;OUTPUT PIN LNKICH==4 ;LINK INPUT PIN LNKOCH==5 ;LINK OUTPUT PIN TYOCH==10 ;TTY OUTPUT CH TYICH==11 ;TTY INPUT CH NETI=<.IOT NETICH,> ;DEFINE I/O INSTRUCTIONS NETO=<.IOT NETOCH,> LNKI=<.IOT LNKICH,> LNKO=<.IOT LNKOCH,> TYI=<.IOT TYICH,> TYO=<.IOT TYOCH,> ; INTERRUPT BITS %IFLNK==1_LNKICH ;LNKI CHANNEL INTERRUPT ; PROGRAM OPTIONS ; Some flags for LH of F %TALK==1 ; TALK (or anything else) %USERS==2 ; USERS (or U) %WHO==4 ; WHO (or W or WHOJ,WHOD,WHOM) %WHOJ==10 ; WHOJ (%WHO set also) %WHOM==20 ; WHOM (%WHO set also) %ANITS==100 ; Set if connected to another ITS DISPF: 0 ;0 PRINTING TERMINAL OR DISK, -1 DISPLAY KLUDGF: 0 .SEE LNKIN2 DISKF: 0 ;-1 WHO OUTPUT TO DSK, 0 OUTPUT TO TTY CHRPLN: 0 ;CHARS PER LINE (WHO) TTYWID: 0 ;WIDTH OF THE TERMINAL (U OR USERS) TIME: 20.*60. ;REAL TIME TIMER INTERVAL DEBUG: 0 ;NON ZERO => WATCH ALL TRANSACTIONS ON TTY ; DATA AREAS JCLBUF: REPEAT 7,0 JCLP: 440700,,JCLBUF WHERE: ASCII/ AT MIT-/ SYSID: 0 ECHO: 0 ;NON ZERO IF REMOTE ECHOING RCHST: BLOCK 10 LPDL==100 PDL: BLOCK LPDL+10 USER: BLOCK 7 ;ASCIZ NAME OF USER RHNDL: BLOCK 7 ;ASCIZ HANDLE OF READ SOCKET WHNDL: BLOCK 7 ;ASCIZ HANDLE OF WRITE SOCKET HOSTNM: BLOCK 6 ;HOST NAME PUT HERE FOR HSTLOOK HOSTN: 0 ;HOST NUMBER SOC1: 0 SOC2: 0 HAN1: 0 HAN2: 0 FROBF: 0 ;FROB-TYPED FLAG FOR 'WHO' ;Print single-line error message and commit suicide. DEFINE BARF MSG/ 001000,,[ASCIZ/MSG /] TERMIN ;Print error message and commit suicide. Use [-] around error message. DEFINE BARFML MSG 001000,,[ASCIZ /MSG /] TERMIN ZZ==. ;SET UP UUO, INTERRUPT HANDLERS LOC 40 0 JSR UUOH JSR TSINT LOC ZZ TSINT: 0 ;BITS 0 ;PC EXCH I, TSINT ;GET BITS JUMPL I,TSIN20 ; Jump to handle 2nd word int. TLNN I,200000 .VALUE ;Unknown 1st-wd interrupt BARF TIME-OUT TSIN20: TRNN I,%IFLNK ;DATA TO TYPE OUT? .VALUE ;NO MOVE I,TSINT ; LNKICH INTERRUPT PUSH P,T PUSH P,TT .CALL [ SETZ ? 'WHYINT ? 1000,,LNKICH 2000,,TT ? 2000,,TT ;TT GETS SOCKET STATE OF LNKICH. 402000,,T] ;T GETS NUMBER OF AVAILABLE BYTES. .LOSE %LSFIL CAIE TT,%NSCLS CAIN TT,-1 JRST LOSSAG CAIE TT,%NSINP ;DATA AVAILABLE? CAIN TT,%NSCLI ;..? JRST LNKINT ;YES TSRET: POP P,TT ;RETURN FROM INT POP P,T .DISMISS TSINT+1 LOSSAG: MOVEI A,LNKICH PUSHJ P,NETWRK"ANALYZE JFCL .BREAK 16,160000 LNKINT: JUMPE T, TSRET ;NCP LIED ABOUT DATA AVAIL LNKIN1: LNKI TT AOSN KLUDGF JRST LNKIN6 LNKIN7: CAIN TT,"^ JRST LNKIN2 CAIN TT,177 LNKIN4: PUSHJ P,RUBO LNKIN3: TYO TT SOJG T,LNKIN1 ;READ ALL THE DATA JRST TSRET LNKIN2: SOJE T,LNKIN5 ;I HATE LIKE HELL TO DO THIS KLUDGE, BUT... LNKI TT CAIN TT,"? JRST LNKIN4 TYO ["^] JRST LNKIN3 LNKIN5: SETOM KLUDGF JRST LNKIN3 LNKIN6: CAIN TT,"? SKIPN DISPF JRST LNKIN7 PUSHJ P,RUBO ;Rubout both the ^ and the char rubbed out. JRST LNKIN4 GO: MOVE P,[-LPDL,,PDL-1] SETZ F, .SUSET [.RXJNAME,,T] CAMN T,[SIXBIT /USERS/] TLO F,%USERS CAMN T,[SIXBIT /WW/] ;For RMS, WW <==> WHOJ MOVE T,[SIXBIT /WHOJ/] HLRZ TT,T CAIN TT,(SIXBIT /U/) TLO F,%USERS CAIE TT,(SIXBIT/W/) CAIN TT,'WHO JRST [ TLO F,%WHO ; Some flavor of WHO HRRZS T CAIN T,(SIXBIT/J/) TLO F,%WHOJ CAIN T,(SIXBIT/M/) TLO F,%WHOM CAIN T,(SIXBIT/D/) SETOM DISKF MOVE T, [200000,,TIME] ;START TIMER .REALT T, JFCL JRST .+1 ] TLNN F,%USERS+%WHO ; If neither of these, TLO F,%TALK ; assume TALK. .SUSET [.SMASK,,[%PIPDL+%PIRLT]] ;ENABLE ERR INTS SKIPN DISKF JRST [ .OPEN TYICH, [.UAI,,'TTY] ;WITH SYSTEM ECHOING .LOSE %LSFIL MOVE T,[%TJMOR+.UAO,,'TTY] ; Disable **MORE** TLNE F,%WHO ; except for WHO. TLZ T,%TJMOR .OPEN TYOCH,T .LOSE %LSFIL JRST .+1] SETZM DISPF ;Assume not display SKIPN DISKF JRST [ .CALL [ SETZ ;Check terminal type 'TTYVAR MOVEI TYOCH ['TTYOPT] SETZM TT ] JRST .+1 TLNN TT,%TOERS TLNN TT,%TOOVR SETOM DISPF ;it's a display .CALL [ SETZ ;CHECK LINELENGTH FOR %USERS 'TTYVAR MOVEI TYOCH [SIXBIT /WIDTH/] SETZM TT ] JRST .+1 ADDI TT,1 ;INCLUDE CONTINUATION COLUMN IDIVI TT,8. ;8 CHARS PER USER MOVEM TT,TTYWID ;NUMBER OF USERS PER LINE. JRST .+1 ] SKIPE DISKF JRST [ .OPEN TYOCH, [.UAO,,'DSK ? SIXBIT/WALL/ ? SIXBIT/>/] .LOSE %LSFIL JRST .+1 ] SKIPE DISPF .CALL [SETZ ;On displays, echo rubout winningly 'TTYSET MOVEI TYICH [222222,,222222] SETZ [222222,,222222]] JFCL .SUSET [.ROPTION,,TT] ;GET JCL TLNE TT, 40000 JRST RJCL NULJCL: TLNN F,%TALK ; TALK always needs JCL, skip into LOSER. JRST LCLWHO ; Do WHO or USERS for local host. LOSER: BARF You must specify User@Host. BADHST: BARF Host name not recognized. RJCL: .BREAK 12,[5,,JCLBUF] MOVEI CT, 5*7-1 MOVE PT,[440700,,USER] PUSHJ P, PARSE ;PARSE USERNAME SPEC, PUT INTO USER. JRST NULJCL RJCL4: CAIE CHR, "% CAIN CHR,"@ JRST RJCL1 ; Host spec exists. CAIE CHR,40 JRST [ SETZM USER ; This was no username, it was a host spec! TLNE F,%TALK JRST LOSER MOVE T,[440700,,JCLBUF] MOVEM T,JCLP ; reset pointer JRST RJCL1] ILDB CHR,JCLP JRST RJCL4 RJCL1: MOVE C,[440700,,HOSTNM] ;HERE TO PARSE A HOST NAME. RJCL2: ILDB B,JCLP ;COPY REST OF JCL (UNTIL A CTL CHAR) INTO STRING IN HOSTNM CAIGE B,40 JRST RJCL3 CAIE B,40 ;IGNORING SPACES AND @'S. CAIN B,"@ JRST RJCL2 CAIE B,"% ; and %'s. IDPB B,C JRST RJCL2 RJCL3: MOVEI A,HSTPAG MOVEI B, PUSHJ P,NETWRK"HSTMAP ;MAP IN THE HOST NAMES DATA BASE. .VALUE SETZ B, ;MAKE STRING IN HOSTNM ASCIZ. IDPB B,C MOVEI A,HOSTNM PUSHJ P,NETWRK"HSTLOOK ;PARSE HOST NAME JRST BADHST MOVEM A,HOSTN MOVE B,A PUSHJ P,NETWRK"HSTSRC ;SEE IF THIS IS AN ITS JRST ICPIFY HLRZ A,NETWRK"STLSYS(D) ADD A,NETWRK"HSTADR MOVE A,(A) CAME A,[ASCIZ /ITS/] JRST ICPIFY TLO F,%ANITS MOVEI A,NETWRK"NW%ARP PUSHJ P,NETWRK"OWNHST ;GET OUR OWN HOST NUMBER. .LOSE ;SHOULDN'T FAIL. CAME A,HOSTN ;DON'T ALLOW :TALK DIRECTED AT LOCAL HOST! JRST ICPIFY TLNN F,%TALK JRST [ SKIPN USER ;LCLWHO DOES NOT HANDLE SPECIFIC USER, JRST LCLWHO JRST ICPIFY] ;SO MUST DO IT THE HARD WAY. BARFML [:TALK is for talking to a user on another machine. To talk to a user on the same machine you are on, use C (see .INFO.;ITSTTY >).] ; HAVING DISCOVERED WHAT'S COMING OFF, CONNECT TO IEC ICPIFY: MOVEI A,ICPCH MOVE B,HOSTN MOVE C,ICPSOC ;ESTABLISH 7-BIT ASCII CONNECTION (8 BIT MOVE D,[.UAI,,.UAO] ; NETWORK BYTES) PUSHJ P,NETWRK"ARPICP JRST DIEDIEDIE JSP TT, NTYS ;GET HIM READY ASCIZ/ERSTR / .NETS NETOCH, PUSHJ P,WAITGA ; WAIT FOR IEC TO SAY GA TLNE F,%TALK TLNE F,%ANITS JRST NOAUX ; don't need aux conns if ITS or not :TALK. JSP TT, NTYS ;GET SOME AUX CONNECTIONS FOR COM LINK ASCIZ/AUXS S 8 AUXS R 8 / SETZM CHR ;NO BUFFERED-BACK PUSHJ P,RESPONSE ;GET RESPONSE ; READ SOCKET NUMBER & HANDLE MOVEI A,NETICH PUSHJ P,RDOCTL MOVEM B,SOC1 MOVEI PT,RHNDL PUSHJ P,RDHNDL PUSHJ P,RESPONSE PUSHJ P,WAITGA ;THEN REPEAT FOR OTHER AUXS PUSHJ P,RESPONSE MOVEI A,NETICH PUSHJ P,RDOCTL MOVEM B,SOC2 MOVEI PT,WHNDL PUSHJ P,RDHNDL PUSHJ P,RESPONSE PUSHJ P,WAITGA ;THEN CONN FOR OUR READ SOCKET. JSP TT,NTYS ASCIZ/CONN / MOVEI A,NETOCH MOVEI PT,RHNDL ;TYPE HIS SEND HANDLE. PUSHJ P,WRASCZ MOVEI B,LNKICH ;GET LNKI PIN ADD B,NETWRK"SKTBAS ;CONVERT TO SOCKET NUM PUSHJ P,WROCTL ;TYPE THE READ SOCKET # ON NETICH IN OCTAL. JSP TT,NTYS ASCIZ/ / MOVEI A,LNKICH MOVE B,HOSTN MOVE C,SOC1 MOVEI D,.UAI PUSHJ P,NETWRK"ARPCON ;CONNECT THE READ SOCKET. JRST DIEDIEDIE PUSHJ P,RESPONSE PUSHJ P,WAITGA ;AND DO SAME FOR OTHER DIRECTION JSP TT,NTYS ASCIZ/CONN / MOVEI A,NETOCH MOVEI PT,WHNDL ;TYPE THE WHNDL STRING OUT ON NETOCH. PUSHJ P,WRASCZ MOVEI B,LNKOCH ;GET LNKO PIN ADD B,NETWRK"SKTBAS ;CONVERT TO SOCKET NUM PUSHJ P,WROCTL ;WRITE SOCKET # IN OCTAL TO NETOCH. JSP TT, NTYS ASCIZ/ / MOVEI A,LNKOCH MOVE B,HOSTN MOVE C,SOC2 MOVEI D,.UAO PUSHJ P,NETWRK"ARPCON ;CONNECT THE WRITE SOCKET. JRST DIEDIEDIE PUSHJ P,RESPONSE PUSHJ P,WAITGA JRST NOAUX ;DECIDE WHAT COMMAND TO SEND THE GUY NOAUX: TLNN F,%TALK JRST NETWHO ; Must be WHO or U. TLNN F,%ANITS JRST LNK JSP TT,NTYS ;USE LINKI FOR ITS ASCIZ/LINKI / MOVEI A,NETOCH MOVEI PT,USER ;AN PUT IN SPEC'D USER'S NAME. PUSHJ P,WRASCZ JSP TT,NTYS ASCIZ/ / PUSHJ P,RESPONSE PUSHJ P,WAITGA .IOPUSH NETICH, ;SHUFFLE SOCKETS TO LOOK LIKE USING AUX CONNS .IOPOP LNKICH, .IOPUSH NETOCH, .IOPOP LNKOCH, JRST LNKUP LNK: ;THEN LINK

JSP TT, NTYS ASCIZ/LINK / MOVEI A,NETOCH MOVEI PT,RHNDL ;TYPE ON NETOCH THE TWO HANDLES PUSHJ P,WRASCZ MOVEI PT,WHNDL ;AND THE USER NAME. NOTE THAT EACH ASCIZ STRING PUSHJ P,WRASCZ ;HAS A SPACE AT THE END. MOVEI PT,USER PUSHJ P,WRASCZ JSP TT, NTYS ASCIZ/ / SETZM CHR LNKO [177] ;ungum the works PUSHJ P,RESPONSE PUSHJ P,WAITGA JRST LNKUP ; TELL USER WHO WE ARE LNKUP: LNKO [133] ;[ .SUSET [.RUNAME,,CT] ;GIVE RIGHT NAME MOVE PT,[440600,,CT] LNKUP1: TLNN PT,770000 JRST LNKUP2 ILDB T,PT JUMPE T,LNKUP2 ADDI T,40 LNKO T JRST LNKUP1 LNKUP2: .CALL [SETZ ? 'SSTATU ? REPEAT 5,[2000,,PT ? ] 402000,,CT] .LOSE %LSSYS ;GET MACHINE NAME IN CT. SETZ PT, LSHC PT,6 ;SIXBIT TO ASCII LSH CT,-1 LSHC PT,-7 TLC CT,(ASCII/ /) ;make it upper case IOR CT,[ASCII/@@] /] MOVEM CT,SYSID ;STORE INTO THE STRING AT "WHERE" MOVEI A,LNKOCH MOVEI PT,WHERE ;AND THEN TYPE THE STRING. PUSHJ P,WRASCZ .NETS LNKOCH, MOVEI A,TYOCH MOVEI PT,[ASCIZ /Go ahead: /] PUSHJ P,WRASCZ ; CONNECTIONS SHOULD NOW BE OPEN ; MAKE INTERRUPT LEVEL DO THE RECEIVING ; AND DO THE SENDING AT M.P. LEVEL .SUSET [.SMSK2,,[%IFLNK]] ;ALLOW INTERRUPTS .SUSET [.SIIFPIR,,[%IFLNK]] ;CAUSE A FREE INTERRUPT SEND: TYI CHR CAIN CHR,^E ;^E COMPLEMENTS LOCAL ECHO. JRST [ SETCMB TT,ECHO HRRI TT,'TTY TLNN TT,-1 TLOA TT,.UAI ;GOING INTO LOCAL ECHO MODE HRLI TT,.UII ;GOING INTO REMOTE ECHO MODE .OPEN TYICH,TT ;RE-OPEN TTY .LOSE %LSSYS JRST SEND] LNKO CHR ;SEND IT OUT CAIN CHR,15 LNKO [12] ;TELNET PROTOCOL SAYS CR-LF INSTEAD OF CR CAIN CHR,177 ;RUBOUT MAY REQUIRE SPECIAL HANDLING PUSHJ P,RUBE .NETS LNKOCH, ;SEND DATA NOW CAIE CHR,^C JRST SEND LNKDWN: .SUSET [.SMSK2,,[0]] ;OK SHUT DOWN WORLD TLNE F,%ANITS\%WHO ;If it's a WHO or a TALK-to-ITS, don't send BREAK JRST DIEDIEDIE JSP TT, NTYS ASCIZ/BREAK QUIT / JRST DIEDIEDIE ;Rubout on input RUBE: SKIPN DISPF ;On display, it's echoed by system RUB1: TYO ["\] ;Can't echo char rubbed out, we don't remember POPJ P, ;Rubout on output RUBO: AOS (P) ;Skip over TYO on return SKIPN DISPF JRST RUB1 MOVE TT,[440700,,[.BYTE 7 ? ^P ? "X]] MOVEI T,2 .CALL [ SETZ SIXBIT/SIOT/ 5000,,%TJDIS MOVEI TYOCH TT SETZ T ] .LOSE 1000 POPJ P, ;WHO ROUTINES ;WE OPEN NETICH AS A UNIT INPUT OF DIRECTORY FROB LCLWHO: SETOM HOSTN ;SIGNAL LOCAL WHO TLO F,%ANITS .OPEN NETICH,[.UAI,,'TTY ? '.FILE. ? SIXBIT/(DIR)/] .LOSE 1000 JRST WHO1 NETWHO: SKIPE USER ; If no user name, hacking all. JRST [ JSP TT,NTYS ASCIZ /USINF / ; User name spec'd, hack only that. MOVEI A,NETOCH MOVEI PT,USER PUSHJ P,WRASCZ JRST NETWH2] JSP TT,NTYS ASCIZ/SSINF/ NETWH2: JSP TT,NTYS ASCIZ / / PUSHJ P,RESPONSE WHO1: SETZM NUSRDN' MOVE T, [400000,,] ;TURN OFF TIMER .REALT T, JFCL WHOFL: NETI CHR ;SUPPRESS FIRST (ACKNOWLEDGE) LINE CAIE CHR,12 JRST WHOFL MOVEI TT,100000 ;SET UP # CHARS PER LINE SKIPN USER ; Never abbrev if user spec'd TLNN F,%ANITS ; or if not talking to ITS JRST WHO7 TLNE F,%WHOM ; or if want whole thing. JRST WHO7 MOVEI TT,10. ; Tnn USER - default for WHO and USERS. TLNE F,%WHOJ MOVEI TT,17. ;TNN USER JOB WHO7: MOVEM TT,CHRPLN SKIPE USER JRST WHO2 ; Don't skip 2nd line if USINF. TLNE F,%USERS JRST WHOFL1 ; Always skip 2nd line if doing USERS for all. TLNE F,%WHOM ; Also skip if not asking for whole thing. JRST WHO2 WHOFL1: NETI CHR CAIE CHR,12 ; SUPPRESS SECOND (HEADER) LINE JRST WHOFL1 WHO2: MOVEI D,4 ; Skip this many chars at start of line TLNE F,%ANITS TLNN F,%USERS SETZ D, ; Dont skip if not ITS or not USERS. SKIPE USER SETZ D, ; also dont skip chars if USINF. MOVE TT,CHRPLN SETZM FROBF WHO22: NETI CHR ;GET FIRST CHAR OF LINE SKIPL HOSTN JRST WHO2A JUMPL CHR,DIEDIEDIE JRST WHO3 WHO2A: CAIE CHR,"@ CAIN CHR,"+ JRST LNKDWN ;DONE... WHO3: TLNN F,%ANITS JRST WHO4 CAIE CHR,"F ;IN ITS SUPPRESS COR^F LINE CAIN CHR,"D ; AND DEVICE-TTY LINES SETO TT, WHO4: SKIPL CHR ;TTY^F DOESN'T END WITH CR CAIN CHR,15 JRST WHO6 JUMPE CHR,WHO5 ; GOD-DAMNED, BAG-BITING TENEX CAIN CHR,3 JRST WHO5 ; GOD-DAMNED, BAG-BITING ITS CAIN CHR,14 JRST WHO5 ; GOD-DAMNED, BAG-BITING ITS JUMPLE TT,WHO5 SOJGE D,WHO5 TYO CHR SETOM FROBF WHO5: NETI CHR SOJA TT,WHO4 WHO6: SKIPE FROBF JRST [ TLNE F,%ANITS TLNN F,%USERS JRST [TYO [15] ? JRST .+1] AOS D,NUSRDN CAMGE D,TTYWID JRST [TYO [^I] ? JRST .+1] SETZM NUSRDN TYO [15] JRST .+1] NETI CHR ;GOBBLE LF JRST WHO2 ; ROUTINE TO TYPE OUT A CONSTANT STRING TO NET. CALL BY JSP TT, NTYS: HRLI TT, 440700 NTYS1: ILDB T, TT JUMPE T, 1(TT) NETO T SKIPE DEBUG TYO T JRST NTYS1 ; ROUTINE TO GET RESPONSE, CRAP OUT IF NEG ACKNOWLEDGE ;CHR SHOULD HOLD THE BUFFERED-BACK INPUT CHARACTER, OR 0 IF THERE IS NONE. RESPONSE: .NETS NETOCH, ;MAKE RESPONSE COME FASTER LOOP: CAIN CHR, "- JRST NEGACK CAIE CHR, "+ JRST [ ;LOOP UNTIL SOME KIND OF REPONSE NETI CHR ;READ RESPONSE SKIPE DEBUG TYO CHR JRST LOOP ] SETZ CHR, ;DON'T LEAVE THE RESPONSE BUFFERED BACK. POPJ P, ; ROUTINE TO WAIT FOR GO-AHEAD CHARACTER (@) WAITGA: NETI CHR SKIPE DEBUG ;PRINT THESE OUT FOR DEBUGGING TYO CHR CAIE CHR,"@ JRST WAITGA SETZM CHR POPJ P, NEGACK: NETI CHR ;GIVE USER THE ERROR LINE TYO CHR CAIE CHR,15 JRST NEGACK DIEDIEDIE: ; SHOULD PERHAPS EXPLICITLY CLOSE? .BREAK 16,160000 ;THEN DIE ; PARSE A USER NAME. ; PICKS UP CHARS FROM JCLP ; DEPOSITS A WORD OF UP TO CT CHARS THROUGH PT ; RETURNS DELIMITING CHAR IN CHR ; SKIP RETURN UNLESS NOTHING WAS READ PARSE: ILDB CHR, JCLP CAIGE CHR, 40 POPJ P, ;NOTHING THERE CAIG CHR,40 ;SKIP LEADING SPACES JRST PARSE AOS (P) ;SKIP RETURN PARSE1: ;PROCESS NON-SPECIAL CHARS SOJL CT, PARSEL ;JUMP IF LOSE IDPB CHR, PT ;ELSE STASH AWAY ILDB CHR, JCLP ;GET NEXT CHR CAIE CHR,". ;ALLOW DOT AND DASH AND CAIN CHR,"- JRST PARSE1 CAIN CHR,"_ ;UNDERSCORE AND JRST PARSE1 CAIL CHR, "0 ;LETTERS & NUMBERS CAILE CHR, "z JRST PARSE2 CAILE CHR, "9 ;(INCLUSION AND EXCLUSION) CAIL CHR, "a JRST PARSE1 CAIL CHR, "A CAILE CHR, "Z JRST PARSE2 JRST PARSE1 PARSE2: HLLZ TT, PT ;NOW ZERO REST OF WORD LSH TT, -6 ;0->P, P->S TLC TT, 7#PT ;INDEX BY PT MOVEI T, 0 DPB T, TT ;AND STORE THE ZERO POPJ P, ;AND WE'RE DONE PARSEL: BARF WORD IS TOO LONG ;;; READ A CHARACTER INTO CHR FROM THE CHANNEL IN A. READCH: .CALL [SETZ ? SIXBIT/IOT/ ? A ? SETZM CHR] .LOSE %LSFIL SKIPE DEBUG TYO CHR POPJ P, ;;; ROUTINE TO READ OCTAL NUMBER ;READ FROM CHANNEL IN A, AND RETURN IN B. ;CHR CONTAINS THE BUFFERED-BACK CHARACTER, OR 0 IF NONE. RDOCTL: SETZ B, SKIPN CHR RDOCT1: PUSHJ P,READCH ;IF NO CHAR YET, READ ONE. CAIN CHR,40 ;SKIP SPACES. JRST RDOCT1 RDOCT2: CAIL CHR,"0 CAILE CHR,"9 POPJ P, LSH B,3 ADDI B,-"0(CHR) PUSHJ P,READCH JRST RDOCT2 ; ROUTINE TO WRITE OCTAL NUMBER, FOLLOWED BY A SPACE ;A HOLDS THE CHANNEL TO WRITE ON, AND B HOLDS THE NUMBER. CLOBBERS C AND T. WROCTL: PUSHJ P, WROCT MOVEI T,40 JRST WRITCH WROCT: IDIVI B, 8. HRLM C, (P) SKIPE B PUSHJ P, WROCT HLRZ C, (P) MOVEI T, "0(C) JRST WRITCH ; ROUTINE TO READ A RSEXEC HANDLE FROM NET ;A HAS CHANNEL TO READ FROM. PT POINTS TO BLOCK TO STORE HANDLE IN. ;CHR HOLDS BUFFERED-BACK CHARACTER OR 0 IF NONE. CLOBBERS CT. RDHNDL: HRLI PT,440700 MOVEI CT,7*5-2 ;WILL END WITH SPACE AND NULL SKIPN CHR ;USE BUFFERED CHAR, RDHND0: PUSHJ P,READCH ;OR READ A NEW ONE. RDHND1: CAIN CHR,40 ;SKIP SPACES. JRST RDHND0 RDHND2: CAIN CHR,"+ ;"+" MARKS END OF HANDLE. JRST RDHND3 SOSGE CT ;UNTIL THE "+", STASH CHARACTERS AWAY. .VALUE ;HANDLE TOO LONG, CRY IDPB CHR,PT PUSHJ P,READCH JRST RDHND2 RDHND3: MOVEI T,40 ;PUT A SPACE AFTER THE HANDLE IDPB T,PT MOVEI T,0 ;TERMINATE THE ASCIZ STRING IDPB T,PT POPJ P, ; ROUTINE TO WRITE AN ASCIZ STRING ONTO NET ;CHANNEL IN A, ADDRESS OF 1ST WORD OF STRING IN PT. WRASCZ: HRLI PT,440700 WRASC1: ILDB T,PT ;SEND UNTIL NULL JUMPE T,CPOPJ PUSHJ P,WRITCH JRST WRASC1 ;WRITE THE CHARACTER IN T TO THE CHANNEL IN A. WRITCH: .CALL [ SETZ ? SIXBIT /IOT/ ? A ? 400000,,T] .LOSE %LSFIL SKIPE DEBUG TYO T POPJ P, ;UUO HANDLER. TYPE ASCIZ STRING THEN KILL UUOH: 0 SKIPE DEBUG .VALUE HRRZ A,40 TLOA A,440700 UUOH1: .IOT TYOCH,B ILDB B,A JUMPN B,UUOH1 .LOGOUT 1, ;GO AWAY ;GET NETWORK SUBROUTINES $$HOSTNM==1 $$SYMLOOK==1 $$ICP==1 $$CONNECT==1 $$ERRHAN==1 $$OWNHST==1 $$ARPA==1 .INSRT SYSENG;NETWRK > POPJ1: AOS (P) CPOPJ: POPJ P, PUTCHR: TYO T ;OUTPUT CHARACTER RTN FOR ANALYZE (NETWRK'S ERROR HANDLER). POPJ P, CONSTANTS VARIABLES PAT: PATCH": BLOCK 40 PATCHE: -1 HSTPAG==<.+1777>/2000 ;PAGE FOR NETWRK TO MAP HOSTS1 FILE INTO. END GO