diff --git a/README.md b/README.md index 87627fcd..37b92115 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ from scratch. - NAME, Shows logged in users and locations, aka FINGER - TALK/WHO/WHOJ/WHOM/USERS, list users. - MLDEV, MLSLV, Allows access to remote systems as devices (e.g. DB:) + - CHTN, CFTP, Chaosnet TELNET and FTP support 6. A brand new host table is built from the host table source and installed into SYSBIN; HOSTS3 > using H3MAKE. @@ -102,8 +103,11 @@ host table tools, and binary host table are installed. Currently, basic TCP network support is in the build, in addition to both a TELNET/SUPDUP server, and both TELNET and SUPDUP clients. -Additionally, both an FTP server and client are included. Other network -services will appear in a subsequent release. +Additionally, both an FTP server and client are included. Chaosnet TELNET +and FTP (CHTN and CFTP), but this requires support and configuration +in the emulator to actually use. + +Other network services will appear in subsequent releases. The KLH10 dskdmp.ini file has an IP address (192.168.1.100) and gateway IP address (192.168.0.45) configured for the ITS system. The IP address diff --git a/build/build.tcl b/build/build.tcl index e66bdad6..71d13065 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -120,7 +120,7 @@ respond "_" "reload " respond "ARE YOU SURE" "y" respond "\n" "links crdir sorry\r" respond "FILE=" "*;* *\r" -expect "E-O-T" +expect -timeout 200 "E-O-T" respond "_" "quit\r" expect ":KILL" @@ -404,6 +404,18 @@ expect ":KILL" respond "*" ":link device;tcp syn123,device;atsign mlslv\r" +respond "*" ":midas sys1;ts cftp_sysen2; cftp\r" +respond "KLp==" "0\r" +expect ":KILL" + +respond "*" ":link device;chaos telnet,sysbin;telser bin\r" +respond "*" ":link device;chaos supdup,sysbin;telser bin\r" + +respond "*" ":midas sysbin;chtn_sysnet;chtn\r" +expect ":KILL" + +respond "*" ":link sys2;ts chtn,sysbin;supdup bin\r" + respond "*" ":link kshack;good ram,.;ram ram\r" respond "*" ":link kshack;ddt bin,.;@ ddt\r" respond "*" $emulator_escape diff --git a/src/sysen2/cftp.475 b/src/sysen2/cftp.475 new file mode 100755 index 00000000..3bdce726 --- /dev/null +++ b/src/sysen2/cftp.475 @@ -0,0 +1,3490 @@ +;-*-Midas-*- + + Title :CFTP - Chaos File Transfer for ITS (ala MMcM) + + F=0 ;Flag word + A=1 ;General porpoise + B=2 + C=3 + D=4 + E=5 + T=6 ;Temporary +TT=7 +T3=10 + I=11 + J=12 + H=13 + U=14 + Q=15 +BC=16 + P=17 + + Call= +Return= + Save= + Rest= + Noop= + +.INSRT SYSTEM;CHSDEF + + PDLen==40 ;PDList + JCLen==20 ;JCL buffer +BufLen==2000 ;Binary buffer, words made from %CODAT packets + HostP==100 ;Page to maps HOSTS2 in +AscBLn==<%CPMXC*2+4>/5 + + TTYi==1 + TTYo==2 +CHAOSi==3 ;Control connection. +CHAOSo==4 + DSKi==5 ;For the sent/got file. + DSKo==6 + HOSTi==7 ;For mapping on HOSTS2 +cDATAi==10 ;Data connection. +cDATAo==11 + ERRi==12 + YOWi==13 ;You don't wanna know. + TTYoo==14 + TESTi==15 ;For testing whether a device/directory exists. + +PUOMin==23 ;Minimum UUO opcode. + + .CHNL==215 +%coSYN==201 +%coASY==202 +%coNOT==203 ;Notification packet + +;;; +;;; Right-half flags +;;; + + F%EOL==:1_0 ;EOL in input line? + F%TNX==:1_1 ;You are connected to a TENEX or TWENEX + F%CTL==:1_2 ;You have a control connection to a site. + F%NOD==:1_3 ;No Default transfer mode, since was explicitly set. + F%10==:1_4 ;You are connected to a PDP-10 +F%UNIX==:1_5 ;You are connected to a UNIX + F%LOG==:1_6 ;You are logged in to the connected site. + F%DAT==:1_7 ;A data connection is open. + F%OFI==:1_8. + F%IFI==:1_9. + ;free +F%TYPE==:1_11. +F%HEAD==:1_12. + F%SUB==:1_13. + F%VAX==:1_14. ;Connected to a VAXen + F%SPC==:1_16. + F%ITS==:1_17. + +;;; +;;; Left-half flags +;;; + +F%SEND==:1_18. ;This is a SEND, as opposed to a GET. + F%ODD==:1_19. ;Last packet didn't end on word boundry +F%LEFT==:1_20. +F%RIGH==:1_21. +F%NOEK==:1_22. ;Do not echo input. +F%QUOT==:1_23. ;Found a ^Q (quote) in LPARSE + F%FN1==:1_24. ;We have a FN1 in LPARSE + +;;; +;;; YOW database offsets +;;; + +LYOW==8. +NYOW==2000/LYOW + + Y$WHEN==0 + Y$FROM==1 + Y$TO==2 + Y$BITS==3 + Y$BAUD==4 +Y$UNAME==5 + Y$TAG==6 + Y$UN==7 + +IFNDEF KLp,[ +PRINTX /Assemble for a KL? Non-0 if so. KLp==/ +.TTYMAC FOO + KLp==FOO +TERMIN +];IFNDEF + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; Macros +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +Define SYSCAL op,args + .Call [Setz ? Sixbit /op/ ? args ((Setz))] + Termin + +Define CMD &string + [Asciz string],,.kark. + .kark.==.kark.+1 + Termin + +Define DEFUUO name,handle + name=.gack._<9.*3> + handle + .gack.==.gack.+1 + Termin + +Define TYPE &string + AType [Asciz string] + Termin + +Define ETYPE &string + %Type [Asciz string] + Termin + +Define BSTART &string + CBINIT [Asciz string] + Termin + +Define BTEXT &string + CBText [Asciz string] + Termin + +Define .SAVE list + IRPS FOOBAR,,[list] + Save FOOBAR + Termin + Termin + +Define .REST list + IRPS FOOBAR,,[list] + Rest FOOBAR + Termin + Termin + +Define EXHALE chnl=CHAOSo + Syscal PKTIOT,[%Climm,,chnl + %Climm,,Packet] + Termin + +Define INHALE chnl=CHAOSi + Syscal PKTIOT,[%Climm,,chnl + %Climm,,Packet] + Termin + +Define DBP ac + Add ac,[70000,,0] + Skipge ac + Sub ac,[430000,,1] + Termin + +Define SPACE + Movei T,40 + Idpb T,Q + Termin + +Define NL + Movei T,.CHNL + Idpb T,Q + Termin + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; Random storage +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +Loc 100 + +UUOH: 0 + Ldb U,[331100,,40] ;Get Opcode + Cail U,PUOMin + Caile U,PUOMax + .Break + Movem A,ACsave+A + Move A,[B,,ACsave+B] ;Save registers A-U + BLT A,ACsave+U + Hrrz A,40 ;E.A. in A + Call @UUOTAB-PUOMin(U) ;Dispatch + Move U,[ACsave+A,,A] + BLT U,U ;Restore regs, and then return. + Jrst 2,@UUOH + +UUOTab: +.gack.==PUOMin + DEFUUO AType,UATYP + DEFUUO FType,UFTYP + DEFUUO %Type,UETYP + DEFUUO 6Type,U6TYP + DEFUUO LType,ULTYP + DEFUUO CBInit,UBST + DEFUUO CBText,UBTEX + DEFUUO CBNum,UBNUM +PUOMax==.gack. + +TSint: +LOC 41 + Jsr UUOH + -TSintL,,TSint +LOC TSint + P + %PiIOC ? 0 ? 0 ? -1 ? IOCerr + 0 ? 1_TTYi ? 0 ? 1_TTYi ? TTYint + 0 ? 1_TTYoo ? 0 ? 1_TTYoo+1_TTYi ? More +TSintL==.-TSint + +PDList: -PDLen,,. + Block PDLen + +JCLbuf: Block JCLen + -1 + + 1.0^32. ;Random floating-point output cruft + 1.0^16. +FT8: 1.0^8 + 1.0^4 + 1.0^2 + 1.0^1 +FT: 1.0^0 + 1.0^-32. + 1.0^-16. + 1.0^-8 + 1.0^-4 + 1.0^-2 +FT01: 1.0^-1 +FT0==FT01+1 + +FCP: Camle A,FT0(C) + Camge A,FT(C) + 0, FT0(C) + +EXPSGN: "- ? "+ + + .AOP .RDATE +CDate: .BYTE 7 + <.LDB 220600,.AVAL1,>+40 ? <.LDB 140600,.AVAL1,>+40 ? "/ + <.LDB 060600,.AVAL1,>+40 ? <.LDB 000600,.AVAL1,>+40 ? "/ + <.LDB 360600,.AVAL1,>+40 ? <.LDB 300600,.AVAL1,>+40 ? 0 + .BYTE + +Verse: Ascii /1.6/ +Ralph: .FNAM2 ;FN2 of this program (Ed#) + +Debug: 0 ;Non-zero if debugging. +Alpha: 0 ;Flag for hacking ^W rubout correctly. +Lowerp: 0 ;Lowercasing wildcarding mumble mumble? +UsITS: 0 ;Out ITS-name: {AI|ML|DM|MC} +Mode: 0 ;.uao/.uio +gPromp: 0 ;BP to prompt you have PARSE +HostN: 0 ;subnet,,host# where you are connected. +Tem1: 0 ;Temporary stuff for floating-point output. +DatMod: 0 ;0=Ascii, -1=Binary full word, +1=Binary n-bit byte +RawMod: 0 ;Raw-mode ASCII transfer? +DatBSz: 0 ;Byte-size of binary transfer +BytSiz: 0 +oChan: 0 ;Channel we are outputting to. +NBytes: 0 ;Number of bytes transferred... +MTypea: 0 ;Address in HSOST2 are of connected machines type +MOpera: 0 ;Likewise, for the machine's OS +TabTop: 0 ;Used in PARSE - Top of command table. +STime: 0 ;Start time, in 60th, of transfer. +Time: 0 ;Total time of transfer, in 60ths. +NBits: 0 ;Number of bits sent/got in last file +LastW: 0 ;LastWidth, for doing columnation in PARSE ? +TranID: 0 ;Transaction ID, for FILE protocol niceity +Yow: 0 ;Are we having fun yet?? +Place: 0 ;How do you rate? +gLinBP: 0 ;BP to buffer where text is going, in GLINE +BinBP: 0 ;BP to BINBUF, for approriate size bytes. +BPW: 0 ;Bytes Per Word +ErrCod: 0 ;Error code, 5-char max ASCII string +ErrTyp: 0 ;Error type, one character ascii +RespBP: 0 ;Response BP \ +RespNB: 0 ;Response NB / +Base: 0 ;Base for typing, used by %D and %O +TempT: 0 ;Temporary crap +Uname: 0 +XUNAME: 0 +SNAME: 0 +OurNum: 0 +RFilBP: 0 ;BP to "real" filename returned by OPEN +TypeBP: 0 ;BP to type of file in the -*- xxx -*- line + +ACsave: Block 20 +IFH: Ascii /I/ +OFH: Ascii /O/ +Connam: Asciz /FILE/ + +Number: Block 2 +TimBuf: Block 10 +CmdBuf: Block 50 +String: Block 20 +TSite: Block 20 +Site: Block 20 +CProm: Block 20 +User: Block 20 +Pass: Block 20 +File: 0 +OFile: Block 20 +NFile: Block 20 +DFile: Block 20 +Dirfil: Block 20 +Dirnam: Block 20 +AscBuf: Block AscBLn + +ODevic: 0 +Device: 0 +Direct: 0 +FN1: 0 +FN2: 0 + +DDev: 0 +DDir: 0 +DFN1: 0 +DFN2: 0 + +TemDev: 0 +TemSna: 0 +TemFN1: Sixbit /_CFTP_/ +TemFN2: Sixbit /OUTPUT/ + +DirAut: Block 5 +DirBSz: 0 +DirCre: Block 5 +DirDel: 0 +DirNRp: 0 +DirBlk: Block 2 +DirByt: Block 2 +DirLnk: Block 10 +DirNBk: 0 +DirPVm: 0 +DirLst==.-1 + +.kark.==-1 + +HlpCmd: CMD "*" +TopCmd: CMD "ACCESS" + CMD "ASCII" + CMD "BINARY" + CMD "BYTE-SIZE" + CMD "CONNECT" + CMD "CWD" + CMD "DELETE" + CMD "DIRECTORY" + CMD "DISABLE" + CMD "DISCONNECT" + CMD "ENABLE" + CMD "EXIT" + CMD "EXPUNGE" + CMD "GET" + CMD "HELP" + CMD "INFORMATION" + CMD "LOGIN" + CMD "PDP-10" + CMD "PUT" + CMD "QUIT" + CMD "RAW-ASCII" + CMD "RENAME" + CMD "SEND" + CMD "SET" + CMD "SUBMIT" + CMD "TYPE" + CMD "WINNERS" +ncmd1==.-TopCmd + 0 + +CmdLoc: .ACESS + .ASKI + .BINAR + .BYTES + .CONNE + .CWD + .DELET + .DIREC + .DISAB + ClsAll + .ENABL + .EXIT + .EXPUN + .GET + .HELP + Status + .LOGIN + .PDP10 + .SEND + .EXIT + .RAW + .RENAM + .SEND + .SET + .SUBMI + .TTYPE + .WINNE +ncmd2==.-CmdLoc + +IFN ncmd2-ncmd1, .FATAL Command table mismatch + +SetCmd: [Asciz /DEBUGGING/],,.DEBUG + [Asciz /LOWER-CASING/],,.LOWER + [Asciz /TRANSFER-MODE/],,.TRANS + [Asciz /YOW-MODE/],,.YOWP + 0 + +TraCmd: [Asciz /ASCII/],,.ASKI + [Asciz /BINARY/],,.BINAR + [Asciz /BYTE-SIZE/],,.BYTES + [Asciz /PDP-10/],,.PDP10 + [Asciz /RAW-ASCII/],,.RAW + 0 + +YNCmd: [Asciz /FALSE/],,0 + [Asciz /NIL/],,0 + [Asciz /NO/],,0 + [Asciz /OFF/],,0 + [Asciz /ON/],,-1 + [Asciz /T/],,-1 + [Asciz /TRUE/],,-1 + [Asciz /YES/],,-1 + 0 + +DirTab: [Asciz /AUTHOR/],,DirAut + [Asciz /BYTE-SIZE/],,DirBSz + [Asciz /CREATION-DATE/],,DirCre + [Asciz /DELETED/],,DirDel + [Asciz /DONT-REAP/],,DirNRP + [Asciz /LENGTH-IN-BLOCKS/],,DirBlk + [Asciz /LENGTH-IN-BYTES/],,DirByt + [Asciz /LINK-TO/],,DirLnk + [Asciz /NOT-BACKED-UP/],,DirNBK + [Asciz /PHYSICAL-VOLUME/],,DirPVm + 0 + +TypTab: [Asciz "FAIL"],,[Asciz "FAI"] + [Asciz "Fundamental"],,[Asciz "TXT"] + [Asciz "MACRO"],,[Asciz "MAC"] + [Asciz "MIDAS"],,[Asciz "MID"] + [Asciz "SCHEME"],,[Asciz "SCM"] + [Asciz "TECO"],,[Asciz "EMACS"] + [Asciz "TEXT"],,[Asciz "TXT"] + 0 + +Lower: 0.0 ;delta + 5.0 ;5 + 10.0 ;5 + 25.0 ;15 + 50.0 ;25 + 100.0 ;50 + 150.0 ;50 + 225.0 ;75 + 350.0 ;125 +nCats==.-Lower + +Cats: [Asciz "?DEAD?"] + [Asciz "Crawl"] + [Asciz "Walk"] + [Asciz "Trot"] + [Asciz "Run"] + [Asciz "Fly"] + [Asciz "*Whoosh*"] + [Asciz "-Zoom->"] + [Asciz "--Warp-->"] + +ComBuf: Block %CPMXW +Packet: Block %CPMXW + + $$CHAOS==1 + $$HSTMAP==1 + $$HST3==1 + $$HOSTNM==1 +$$SYMLOOK==1 +$$ANALYZE==1 + $$ERRHAN==1 +$$CONNECT==1 + $$OWNHST==1 + $$HSTSIX==1 + +.INSRT SYSENG;NETWRK + +$$OUT==1 + +.INSRT SYSENG;DATIME + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; Actual body of the program. Gee... +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +Begin: Move P,PDList ;Book 1, Chapter 1, Verse I. + Setz F, + Syscal OPEN,[%Clbit,,.uao\%TjDIS + %Climm,,TTYo + [Sixbit /TTY/]] + .Lose %lsFile + Syscal OPEN,[%Clbit,,.uai + %Climm,,TTYi + [Sixbit /TTY/]] + .Lose %lsFile + Movei A,HostP ;Page# + Movei B,HOSTi + Call NETWRK"HSTMAP + Jrst [Type "Can't get HOSTS3 databse" + Jrst Die] + Move A,[NETWRK"NW%CHS] + Call NETWRK"OWNHST + .Lose + Movem A,OurNum + Syscal SSTATU,[Repeat 5,%Clout,,T + %Clout,,UsITS] + .Lose %lsSYS + .Suset [-6,,[.rUIND,,T ;For making I&O File-Handles + .sOPTION,,[OPTINT,,] ;New-style interrupts + .sMASK,,[%PiIOC] ;Catch IOC errors + .rUNAME,,Uname + .rXUNAME,,XUNAME + .rSNAME,,SNAME]] + Move A,DDir + Movem A,DFN1 + Move A,[350700,,IFH] ;File-Handle in form Ixxx and Oxxx, + Move B,[350700,,OFH] ;where xxx is your job# backwards. +MIandH: IDivi T,10. + Addi TT,"0 + Idpb TT,A + Idpb TT,B + Jumpn T,MIandH + + Move T,[030202,,020202] ;Interrupts still on, + Move TT,T ;but only echoes. + Syscal TTYSET,[%Climm,,TTYi ? T ? TT] + .Lose + + Move A,UsITS + Movei B,Verse + Move C,Ralph + Movei D,CDate + EType "MIT-%1' CFTP Version %2S Ralph %3' [%4S] +Type '?' for a list of commands, or 'HELP' for full help." + .Break 12,[..rJCL,,JCLbuf] + Skipn JCLbuf + Jrst Comand + Move J,[440700,,JCLbuf] + .Iot TTYo,[^M] + Jrst Coman1 + +Unwind: Trne F,F%IFI + Call ClsIFI + Trne F,F%OFI + Jrst [Trnn F,F%CTL + Jrst .+1 + Call DELEWO + Call ClsOFI + Jrst .+1] +Comand: Move P,PDList + Movei A,[Asciz /CFTP>/] + Trne F,F%CTL + Movei A,CProm + Movei I,CmdBuf + Call gLine ;Get a line of TTY input. + Jrst Comand ;Nothing specified. +Coman1: Movei H,TopCmd + Call Parse ;Is this a top-level command? + Jrst Lazy + Call @CmdLoc(B) + Jrst Comand + +Lazy: Movei A,String + Call NETWRK"HSTLOOK + Jrst [Movei T,[Asciz /?Unknown: /] + Skipe ErrTyp + Movei T,[Asciz /?Ambiguous: /] + AType (T) + AType String + Jrst Comand] + Call Con1 + Jrst Comand + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; All the rest is subroutines to do the commands... +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +.HELP: Movei H,HlpCmd + Call Parse + Jrst [Movei A,BadHlp + Skipe ErrTyp + Movei A,HlpAll + AType (A) + Return] + Cail B,777777 + Jrst .HELP0 + AType @HlpTxt(B) + Return + +BadHlp: Asciz "I dunno about that. Type '?' for a list of commands." + +HlpAll: Asciz "Type 'HELP *' for full help, or 'HELP command' for help +with a specific command. '?' lists all the commands known, +and then some." + +.HELP0: Type | +CFTP is the ITS user interface to a foreign Chaosnet FILE server +(FILE is the Lisp Machine file service protocol). + +CFTP can be invoked from DDT with a command line, e.g., + + :CFTP CONNECT OZ + +(or, using the "lazy connect" facility) + + :CFTP OZ + +Briefly, the CFTP commands are (where lowercase denotes metasyntax, +and foreign-filename is an uninterpreted string where every character is +significant except for leading white space): + +| + Setz A, +.HELP1: Skipn TopCmd(A) + Return + AType @HlpTxt(A) + .Iot TTYo,[^M] + .Iot TTYo,[^M] + Aoja A,.HELP1 + +HlpTxt: [Asciz | ACCESS tops-20-directory + Equivalent to doing a TOPS-20 ACCESS command on the remote system + (you must supply brackets in the directory name, e.g. )|] + + [Asciz | ASCII + Sets transfer mode to 7-bit ASCII, translated from the 8-bit + LispMachine character set. Same as SET TRANSFER-MODE ASCII.|] + + [Asciz | BINARY + Sets the transfer mode to binary, 16-bit data. Equivalent to + SET TRANSFER-MODE BINARY|] + + [Asciz | BYTE-SIZE n + Sets the transfer mode to binary, with n-bit bytes. Same as + SET TRANSFER-MODE BYTE-SIZE n|] + + [Asciz | CONNECT hostname + Requests FILE service from the foreign host named. + Sets the data tranfer mode to PDP-10 if foreign host is a PDP-10, + otherwise, sets the transfer mode to ASCII; + sets the lower-casing switch on iff the foreign host is a UNIX.|] + + [Asciz | CWD tops-20-directory + Equivalent to a TOPS-20 CONNECT command on the remote system + (you must supply brackets in the directory name, e.g., )|] + + [Asciz | DELETE foreign-filename + Delete the specified file|] + + [Asciz | DIRECTORY foreign-filename + Gives a directory listing of any files on the foreign system + which match the (potentially "wild-carded") foreign-filename; + the fields listed are: + + D if the file is deleted, a D appears at the left margin + V physical volume on which the file resides, if any + Name the full filename + Blocks number of system-dependent "blocks" the file occupies + Bytes length of the file in bytes + size the size of bytes in the file + N if !, means the file is not backed up yet + R if $, means the file is marked as "resisting archival" + Created the time and date the file was created or last written + Author the user who created or last wrote the file|] + + [Asciz | DISABLE + Disable your TWENEX capabilities.|] + + [Asciz | DISCONNECT + Shut down the current session|] + + [Asciz | ENABLE + Enable your TWENEX capabilities.|] + + [Asciz | EXIT + Does a disconnect and exits CFTP|] + + [Asciz | EXPUNGE tops-20-directory + Equivalent to the TOPS-20 command EXPUNGE tops-20-directory|] + + [Asciz | GET foreign-filename + Local file: local-filename + Retrieves the file named by foreign-filename in the prevailing + transfer mode (see SET TRANSFER-MODE) to the local file named + by local-filename; tries to be helpful by defaulting the local + filename|] + + [Asciz | HELP command or * + Prints this type of help text for the specified command (and + all it's subcommands), or on ALL commandsw if * is given.|] + + [Asciz | INFORMATION + Tells relevant information about the current session (to which + host you're currently connected, as whom you're logged in, + the current data transfer mode, whether lower-casing is in + effect, etc.)|] + + [Asciz | LOGIN foreign-username [password] + Attempts to log you in as the given foreign username; + it will prompt you for a password if it needs it|] + + [Asciz | PDP-10 + Sets the transfer mode to be PDP-10 words, 36-bit binary|] + + [Asciz | PUT local-filename + Foreign file: foreign-filespec + Is the same as SEND (see below)|] + + [Asciz | QUIT + Is a synonym of EXIT|] + + [Asciz | RAW-ASCII + Sets the transfer mode to ASCII, and does not translate the LispM + character set, or quote funny characters - Takes it raw. Same as + SET TRANSFER-MODE RAW-ASCII|] + + [Asciz | RENAME foreign-filename-1 + New file: foreign-filename-2 + Renames the first foreign file to the given second foreign file + name|] + + [Asciz | SEND local-filename + To foreign file: + Sends the specified local file (non-wildcarded) to the given + foreign file; or, if the local-filename is wildcarded, + Prefix string for each foreign file: + Sends each local file implied by the wildcarded local-filename + to a remote file of the same name and type (NAME.TYP), possibly + prefixed by the string prompted for; if the generation is + wildcarded in local-filename (e.g., FOO.BAR.*), then sends + each local file to a remote file of the same name, type, and + generation (NAME.TYP.i); SET LOWER-CASING controls whether + the resulting foreign filename is lower-cased or not (useful + for transfers to UNIX systems) + + Sorry, ffolks, but wildcard sending is not yet done.|] + + [Asciz | SET DEBUGGING ON, OFF, or similar booleans + Turns debugging (tracing) information on or off (default is ON) + + SET LOWER-CASING boolean + Turns lower-casing on or off (default is ON); see SEND and CONNECT + + SET TRANSFER-MODE ASCII + Sets the data transfer mode to ASCII + (top-level synonym: ASCII) + + SET TRANSFER-MODE BINARY + Sets the data transfer mode to binary, 16-bit data + (top-level synonym: BINARY) + + SET TRANSFER-MODE BYTE-SIZE n + Sets the data transfer mode to binary, n-bit data + (top-level synonym: BYTE-SIZE) + + SET TRANSFER-MODE PDP-10 + Sets the data transfer mode to be PDP-10 style: 36-bit, binary. + (top-level synonym: PDP-10)|] + + [Asciz | SUBMIT local-filename + Foreign file: foreign-filename + Is the same as the SEND command, except the sent file is also + submitted as a batch file (to be run NOW) on the foreign site.|] + + [Asciz | TYPE foreign-filename + Types the given file (GETs it in ASCII mode) on the terminal|] + + [Asciz | WINNERS + Show the list of current transfer winners|] + +ncmd3==.-HlpTxt + +IFN ncmd3-ncmd1, .FATAL You are missing help for some commands! + +Constants + +.WINNE: Syscal OPEN,[%Clbit,,.uii + %Climm,,YOWi + [Sixbit /DSK/] + [Sixbit /YOW/] + [Sixbit /BIN/] + [Sixbit /GREN/]] + Jrst [EType "Can't find database? %Eî" + Return] + Move T,[444400,,Yowloc] + Movei TT,2000 + Syscal SIOT,[%Climm,,YOWi ? T ? TT] + .Lose + .Close YOWi, + Movei T3,1 + Setz Q, + Type " +Rank Who Speed From To When +---- --- ------ ------ ------ -----------------î" +.WIN1: Skipn Yowloc(Q) + Return + EType " #%10D " + Move B,[440700,,Yowloc+Y$TAG(Q)] + Skipe Yowloc+Y$TAG(Q) + AType (B) +IFN KLp,FIXR C,Yowloc+Y$BAUD(Q) +.ELSE [ + MOVE C,Yowloc+Y$BAUD(Q) + MULI C,400 + TSC C,C + ASH D,-243(C) + MOVE C,D +];Not KL + EType " %3D " + Move A,Yowloc+Y$FROM(Q) + Call NETWRK"HSTSIX + Move A,[0] + EType "%1' " + Move A,Yowloc+Y$TO(Q) + Call NETWRK"HSTSIX + Move A,[0] + EType "%1' " + Move A,Yowloc+Y$WHEN(Q) + Move D,[440700,,TimBuf] + Call DATIME"TWDASC + Movei A,TimBuf + EType "%1Sî" + Addi Q,LYOW + Caig Q,LYOW*NYOW + Aoja T3,.WIN1 + Return + +.SET: Movei H,SetCmd + Call Parse + Jrst [Type "Invalid SET option" + Jrst Comand] + Jrst (B) + +.DEBUG: Movei H,YNCmd + Call Parse + Seto B, + Hrl B,B + Movem B,Debug + Return + +.LOWER: Movei H,YNCmd + Call Parse + Seto B, + Movem B,Lowerp + Return + +.YOWP: Movei H,YNCmd + Call Parse + Seto B, + Hrl B,B + Movem B,Yow + Return + +.TRANS: Movei H,TraCmd + Call Parse + Jrst [Type "Invalid TRANSFER-MODE" + Jrst Comand] + Jrst (B) + +.ASKI: Tro F,F%NOD +.ASKJ: Setzm DatMod + Setzm RawMod + Setzm DatBSz + Return + +.BINAR: Setom DatMod + Setzm RawMod + Setzm DatBSz + Tro F,F%NOD + Return + +.Raw: Setzm DatMod + Setom RawMod + Setzm DatBSz + Tro F,F%NOD + Return + +.BYTES: Call gNumber + Jrst [Type "Byte-size expected" + Jrst Comand] + Cail B,1 + Caile B,16. + Jrst [Type "Byte-size must be from 1 to 16 bits" + Jrst Comand] + Movem B,DatBSz + Setom DatMod + Setzm RawMod + Tro F,F%NOD + Return + +.PDP10: Tro F,F%NOD +.PDP11: Movei T,1 + Movem T,DatMod + Setzm RawMod + Movei T,12. + Movem T,DatBSz + Return + +.CONNE: Movei A,TSite + Call gString + Jrst [Type "You must specify a site to connect to" + Jrst Comand] + Movei A,TSite + Call NETWRK"HSTLOOK + Jrst [Type "Unknown site: " + AType TSite + Jrst Comand] +Con1: Movem A,HostN + Call ClsAll + Hlrz T,(B) + Add T,NETWRK"HSTADR ;Address of SITE entry in T + Hrrz TT,1(T) + Add TT,NETWRK"HSTADR ;Address of machine type in TT + Movem TT,MTypea + Move T3,(TT) + Trz F,F%10\F%UNIX\F%TNX\F%ITS\F%VAX + Came T3,[Ascii "DEC-10"] ;(Really only comparing 1st + Camn T3,[Ascii "PDP10"] ;5 characters...) + Tro F,F%10 + Came T3,[Ascii "DEC-KS10"] + Camn T3,[Ascii "DEC-20"] + Tro F,F%10 + Hlrz TT,1(T) + Add TT,NETWRK"HSTADR + Movem TT,MOpera + Move T3,(TT) + Camn T3,[Ascii /UNIX/] + Tro F,F%UNIX + Came T3,[Ascii "TOPS20"] + Camn T3,[Ascii /TOPS-/] + Tro F,F%TNX + Camn T3,[Ascii "TOPS10"] + Tro F,F%TNX + Camn T3,[Ascii /ITS/] + Tro F,F%ITS + Move B,HostN + Call NETWRK"HSTSRC + Movei A,[Asciz /HOST-WITH-NO-NAME/] ;This should not fail + Hrli A,440700 + Push P,A + Move B,[440700,,Site] + Move C,[440700,,CProm] +Con2: Ildb T,A + Jumpe T,Con3 + Idpb T,B + Jrst Con2 + +Con3: Pop P,A +Con4: Ildb T,A + Jumpe T,Con5 + Cain T,". + Jrst Con5 + Idpb T,C + Jrst Con4 + +Con5: Movei T,"> ;Finish off prompt, + Idpb T,C + Setz T, + Idpb T,B ;and tie them off. + Idpb T,C + Trnn F,F%NOD + Jrst [Call .PDP11 + Trnn F,F%10 ;If no particular mode specified, try + Call .ASKJ ;to do the right thing. + Jrst .+1] + Trne F,F%UNIX + Setzm Lowerp ;No lowercasing on Unix's. + Call OPNCTL ;Open a control connection. + +Status: Movei A,Site + Move B,MTypea + Move C,MOpera + Trne F,F%CTL + EType " Connected to %1S (a %2S running %3S)î" + Movei A,User + Trne F,F%LOG + EType " You are logged in as %1Sî" + Call ShoMod + Skipe Lowerp + Type " Lower-casing filenames in wildcard sendsî" + Skipe Yow + Jrst [Type " You're having fun!î" + Skipe A,Place + EType " In fact, you're currently ranked #%1D!î" + Jrst .+1] + Skipe Debug + Type " Debugging" + Return + +ShoMod: Movei A,[Asciz /ASCII/] + Skipe DatMod + Movei A,[Asciz /BINARY/] + Setz B, + Skiple DatMod + Movei B,[Asciz /PDP10 /] + Skipe RawMod + Movei B,[Asciz /Raw /] + EType " %2S%1S mode transfers" + Skipn A,DatBSz + Jrst Shom1 + Skiple DatMod + Movei A,36. + EType ", %1D-bit bytes" +Shom1: .Iot TTYo,[^M] + Return + + +.ACESS: Skipa H,[[Asciz / ACCESS/]] +.CWD: Movei H,[Asciz / CWD/] + Trnn F,F%CTL + Jrst NoConn + Call gDir + Jrst Comand + Call gPass1 +.CWD0: CBInit (H) + NL + Skipe Dirnam + Jrst [CBText Dirnam + NL + Skipn Pass + Jrst .+1 + CBText Pass + NL + Jrst .+1] + Call ComSnd + Call ComRs1 + Skipa + Jrst .CWD1 + Move A,ErrCod + Came A,[Ascii /IP?/] + Camn A,[Ascii /PI?/] + Skipa + Jrst PktErr + Call gPass2 + Return + Jrst .CWD0 + +.CWD1: Move A,RespBP + EType " Connected to %1S" + Return + +.DELET: Trnn F,F%CTL + Jrst NoConn + Call gOFile + Jrst Comand + Call oProbe + BStart " DELETE" + NL + CBText OFile + NL + Call ComSnd + Call ComRs1 + Jrst PktErr + Movei A,OFile + EType " %1S deleted" + Return + +DELEWO: CBInit OFH + BText " DELETE" + Call ComSnd +; Call SndSyn + Call ComRs1 + Jrst PktErr + Return + +.DIREC: Trnn F,F%CTL + Jrst NoConn + Setzm Dirfil + Movei A,Dirfil + Call gString + Jfcl + Call ChkDat +.DIR0: CBInit IFH + BText " DIRECTORY" + NL + CBtext Dirfil + NL + Call ComSnd + Call ComRsl + Jrst .DIR0 + Tro F,F%IFI + Trz F,F%HEAD +.DIR1: Setzm File + Setzm DirAut ;Zero status stuff and snag + Move T,[DirAut,,DirAut+1] ;a new file. + BLT T,DirLst + Move A,[440700,,File] + Call DatLin + Jrst ClsIFI ;No more? We're done... +.DIR2: Move C,[440700,,String] +.DIR3: Call DatByt ;Grab a directory option. + Return + Caie T,40 + Cain T,.CHNL + Jrst .DIR4 + Idpb T,C + Jrst .DIR3 +.DIR4: Camn C,[440700,,String] + Jrst DirPrt ;No more options - Print this line. + Movem T,TempT + Setz T, + Idpb T,C + Movei H,DirTab + Call Parse1 + Jrst DirFll + Move T,TempT + Cain T,.CHNL + Jrst [Move A,[Ascii /T/] + Movem A,(B) + Jrst .DIR2] + Move A,[440700,,(B)] + Call DatLin + Noop + Jrst .DIR2 + +DirFll: Call DatByt ;Skip over the data part of + Return ;this option and continue. + Caie T,.CHNL + Jrst DirFll + Jrst .DIR2 + +DirPrt: Skipn File + Jrst .DIR1 + Tron F,F%HEAD + Type " +DV Filename Blocks Bytes(size) NR Created Authorî" + Movei T,40 + Skipn A,DirDel + Move B,[Ascii /NIL/] + Came B,[Ascii /NIL/] + Movei T,"D" + .Iot TTYo,T + .Iot TTYo,[" ] + Skipe DirPVm + AType DirPVm + Movei T,5 + Call DirPos + AType File + Movei T,33. + Call DirPos + Skipe DirLnk + Jrst [Type "==> " + AType DirLnk + Jrst Dirp1] + Skipe DirBlk + Jrst [AType DirBlk + Movei T,38. + Call DirPos + AType DirByt + Jrst .+1] + Skipe DirBSz + Jrst [.Iot TTYo,["(] + AType DirBSz + .Iot TTYo,[")] + Jrst .+1] + Movei T,50. + Call DirPos + Movei T,40 + Skipn B,DirNBk + Move B,[Ascii /NIL/] + Came B,[Ascii /NIL/] + Movei T,"! + .Iot TTYo,T + Movei T,40 + Skipn B,DirNRp + Move B,[Ascii /NIL/] + Came B,[Ascii /NIL/] + Movei T,"$ + .Iot TTYo,T +Dirp1: Movei T,53. + Call DirPos + AType DirCre + .Iot TTYo,[" ] + AType DirAut + .Iot TTYo,[^M] + Jrst .DIR1 + +DirPos: Syscal RCPOS,[%Climm,,TTYo + %Clout,,A] + .Lose %lsSys + Hrrz A,A + Caml A,T + Jrst [.Iot TTYo,[^M] + Jrst Dirps1] + Sub T,A +Dirps1: Sojl T,CPopj + .Iot TTYo,[" ] + Jrst Dirps1 + + +.ENABL: Trnn F,F%CTL + Jrst NoConn + BStart " ENABLE-CAPABILITIES ALL" + NL + Call ComSnd + Call ComRs1 + Jrst PktErr + Type "Capabilities enabled." + Return + + +.DISAB: Trnn F,F%CTL + Jrst NoConn + BStart " DISABLE-CAPABILITIES ALL" + NL + Call ComSnd + Call ComRs1 + Jrst PktErr + Type "Capabilities disabled." + Return + + +.QUIT: +.EXIT: Call ClsAll + Jrst Die + + +.EXPUN: Trnn F,F%CTL + Jrst NoConn + Call gDir + Noop +.EXP1: BStart " EXPUNGE" + NL + Skipe Dirnam + Jrst [CBText Dirnam + NL + Jrst .+1] + Call ComSnd + Call ComRsl + Jrst .EXP1 + Move A,RespBP + Move B,RespNB + Move C,[440700,,Number] +.EXP2: Sojl B,.EXP3 + Ildb T,A + Cail T,"0 + Cail T,"9 + Jrst .EXP3 + Idpb T,C + Aoja D,.EXP2 + +.EXP3: Setzb T,Dirnam + Idpb T,C + Move C,[440700,,Dirnam] +.EXP4: Sojl B,.EXP5 + Ildb T,A + Caie T,40 + Cain T,.CHNL + Jrst .EXP5 + Idpb T,C + Jrst .EXP4 + +.EXP5: Setz T, + Idpb T,C + Movei A,Dirnam + Movei B,Number + EType " %1S expunged, %2S page(s) freed" + Return + +.TTYPE: Setzm DatMod + Setzm RawMod + Setzm DatBSz + Movei T,TTYoo + Movem T,oChan + .Suset [.sIMSK2,,[1_TTYoo]] + Tro F,F%TYPE + Jrst .GEY + +.GET: Movei T,DSKo + Movem T,oChan +.GEY: Trnn F,F%CTL + Jrst NoConn + Tlz F,(F%SEND) + Call ChkDat + Call gFFile + Return +.GET0: CBInit IFH + BText " OPEN READ" + Movei T,OFile + Movem T,File + Call ComOpn + Jrst .GET0 + Call gSize ;Get size of incoming file. + Move A,RFilBP ;BP to real filename + EType "Truename: %1Sî" + Call ITSify ;Make default local filespec + Syscal OPEN,[%Clbit,,.uii + %Climm,,TESTi + DDev + [Sixbit ".FILE."] + [Sixbit "(DIR)"] + DDir] + Jrst [Call Dunno0 ;Default device and sname + Jrst .+2] + .Close TESTi, + Tro F,F%IFI + Trne F,F%TYPE + Jrst [Movsi T,(Sixbit /TTY/) + Movem T,TemDev + Exch T,Device + Movem T,ODevice + Jrst .GET1] + Call gLFile + Jfcl + Call Merge ;Merge in defaults + Movei T,.UIO + Skipn RawMod + Skipn DatMod +.GET1: Movei T,.UAO + Movem T,Mode + Syscal OPEN,[%Clbtw,,Mode + oChan + TemDev + TemFN1 + TemFN2 + TemSna] + Jrst [Movei A,TemDev + EType "Can't open temporary file %1L -- %E" + Jrst Unwind] + Skipn B,DatBSz + Jrst [Movei B,7 + Skipe DatMod + Movei B,16. + Jrst .+1] + Movem B,BytSiz + Movei A,OFile + Movei B,Device + EType " %1S --> %2L ...î" + Setzm NBytes + .PDTime T, + Movem T,STime ;Start time + Call RedLup + .PDTime T, + Sub T,STime + Movem T,Time + Trne F,F%TYPE + Jrst .GET2 + Syscal RENMWO,[oChan ? FN1 ? FN2] + Jrst [EType "Can't rename to real names -- %E" + Jrst Unwind] +.GET2: Syscal CLOSE,[oChan] + .Lose %lsSys + Call ClsIFI + Trnn F,F%TYPE + Jrst pZoom + Move T,ODevice + Movem T,Device ;Restore the device default + Trz F,F%TYPE + Jrst pZoom + +.LOGIN: Trnn F,F%CTL + Jrst NoConn + Call gUser + Jrst Comand + Call gPass1 +.LOG1: BStart " LOGIN " + CBText User + SPACE + Skipe Pass + Jrst [CBText Pass + SPACE + Jrst .+1] +.LOG2: Call ComSnd + Call ComRs1 + Skipa + Jrst Logdin + Move A,ErrCod + Came A,[Ascii /IP?/] + Camn A,[Ascii /PI?/] + Skipa + Jrst PktErr + Call gPass2 + Return + Jrst .LOG1 + +Logdin: Tro F,F%LOG + Move A,RespBP + Move B,RespNB + Move C,[440700,,User] +Logdun: Sojl B,Logdpr + Ildb T,A + Cain T,40 + Jrst Logdpr + Idpb T,C + Jrst Logdun + +Logdpr: Setz T, + Idpb T,C +FndNam: Sojl B,CPopj + Ildb T,A + Caie T,.CHNL + Jrst FndNam + Movem A,NameBP' +FndCma: Sojl B,CPopj + Ildb T,A + Cain T,", + Jrst AhaCma + Caie T,.CHNL + Jrst FndCma + Move A,NameBP + Push P,A + Jrst Fnord + +AhaCma: Push P,A +AhaCm0: Sojl B,CPopj + Ildb T,A + Cain T,40 + Jrst [Movem A,(P) + Jrst AhaCm0] +Fnord: Ildb T,A + Caie T,40 + Cain T,.CHNL + Skipa + Jrst Fnord + Setz T, + Dpb T,A + Pop P,A +SayHi: EType "Hello, %1Sî" + Return + +.RENAM: Trnn F,F%CTL + Jrst NoConn + Call gOFile + Jrst Comand + Call gNFile + Jrst Comand + Call oProbe + BStart " RENAME" + NL + CBText OFile + NL + CBText NFile + NL + Call ComSnd + Call ComRs1 + Jrst PktErr + Call nProbe + Movei A,OFile + Movei B,NFile + EType " %1S renamed to %2S" + Return + + +.SUBMI: Troa F,F%SUB +.SEND: Trz F,F%SUB + Trnn F,F%CTL + Jrst NoConn ;No connection yet. + Tlo F,(F%SEND) + Call ChkDat ;Get a data connection if needed + Call gLFile ;Get the local filename. + Jrst Comand + Call Dunno ;Set up DDev/etc + Call Merge ;and set Device, etc from them. + Call Wildp + Jrst .SEND1 + Type "Wildcard sending not yet supported" + Return + +.SEND1: Skipn B,DatBSz + Jrst [Movei B,7 + Skipe DatMod + Movei B,16. + Jrst .+1] + Movem B,BytSiz + Movei T,.UAI + Skipe DatMod + Movei T,.UII + Syscal OPEN,[%Clbtw,,T + %Climm,,DSKi + Device ? FN1 ? FN2 ? Direct] + Jrst [Movei A,Device + EType "Can't open local file %1L -- %E" + Return] + Syscal RFNAME,[%Climm,,DSKi + %Clout,,Device ? %Clout,,FN1 + %Clout,,FN2 ? %Clout,,Direct] + Jfcl + Call SXLate ;Translate this filename for the default. + Movei A,Device + EType "Truename: %1Lî" + Syscal FILLEN,[%Climm,,DSKi + %Clout,,T ? %Clout,,TT] + Setz T, + IMul T,TT + Movem T,NBits + Call gFFile + Jrst [Skipn DFile + Jrst [Type "There's no foreign file default!" + .Close DSKi, + Jrst Comand] + Call FdFalt + Jrst .+1] +SndLu1: CBInit OFH + Movei A,[Asciz / OPEN WRITE/] + Trne F,F%SUB + Movei A,[Asciz / OPEN WRITE SUBMIT/] + CBText (A) + Movei T,OFile + Movem T,File + Call ComOpn + Jrst SndLu1 + Tro F,F%OFI + Movei A,OFile + Movei B,Device + EType " %2L --> %1S ...î" + Setzm NBytes + .PDTime T, + Movem T,STime + Call WrtLup + .PDTime T, + Sub T,STime + Movem T,Time + Call ClsOFI + Call GetTru + .Close DSKi, + Jrst pZoom + + +NoConn: Type "(Not connected to any host)" + Return + +Die: Skipe Debug + .Value + .Logout 1, + +Constants + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; The good stuff - Chaosnet frotzing +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +OpnCtl: Call ClsAll + Movei A,CHAOSi + Move B,HostN + Movei C,Connam + Movei D,5 + Call NETWRK"CHACON + Jrst [Type "î(Can't get control connection)î" + Jrst Unwind] + Skipe Debug + Type " Opened control connectionî" + Setzm TranID + Tro F,F%CTL + Return + +ClsAll: Trne F,F%DAT + Call ClsDat + Trne F,F%CTL + Call ClsCtl + Trz F,F%LOG + Return + +ClsCtl: Skipe Debug + Call SndEOF + .Close CHAOSi, + .Close CHAOSo, + Trz F,F%CTL + Movei A,Site + EType " Closing connection to %1Sî" + Return + +ClsDat: Movei A,OFH + Skipe Debug + EType " Closing data connection [%1S]î" + .Close cDATAi, + .Close cDATAo, + Trz F,F%DAT + Return + +ChkDat: Trne F,F%DAT + Return +OpnDat: BStart " DATA-CONNECTION " + CBText IFH + SPACE + CBText OFH + Call ComSnd + Movei A,cDATAi + Move B,HostN + Movei C,OFH + Movei D,5 + Call NETWRK"CHALSN + Jrst [Type "î(Can't get data connection)î" + Jrst Unwind] + Call ComRs1 + Jrst PktErr + Movei A,OFH + Skipe Debug + EType " Got data connection [%1S]î" + Tro F,F%DAT + Return + +ComSnd: Setz T, + Idpb T,Q ;Ascizize command buffer. + Move A,[440800,,Packet+%CPKDT] + Move B,[440800,,ComBuf] + Setz C, +ComSn1: Ildb T,B + Jumpe T,ComSn2 + Idpb T,A + Aoj C, + Caie C,%CPMXC + Jrst ComSn1 +ComSn2: Dpb C,[$CPKNB Packet] + Movei T,%coDAT + Dpb T,[$CPKOP Packet] + Skipn Debug + Jrst ComSn3 + Type " Sending: + " + Call PrtBuf +ComSn3: Exhale + Jrst BadCon + Return + + +SndEOF: Type " Sending EOF on control channelî" + Movei T,%coEOF + Dpb T,[$CPKOP Packet] + Exhale + Noop + Return + + +ComRsl: Call ComRs1 + Skipa + Jrst Popj1 + Move A,ErrCod + Came A,[Ascii /NLI/] + Jrst PktErr + EType "Error: %1Mî" + Call gUser1 + Jrst Unwind + Call .LOG1 + Return + + +ComRs1: Call CtlPkr +ComRse: Skipn Debug + Jrst ComRs0 + Type " Received: + " + Call PrtBuf +ComRs0: Move A,[440800,,Packet+%CPKDT] + Ldb B,[$CPKNB Packet] + Call gAtom ;TID + Call gAtom ;FH + Call gAtom + Came T,[Ascii /ERROR/] + Jrst [Aos (P) + Jrst ComRs2] + Call gAtom + Movem T,ErrCod + Call gAtom + Lsh T,-<4*7+1> + Movem T,ErrTyp +ComRs2: Movem A,RespBP + Movem B,RespNB + Return + + +CtlPkr: Setzm Packet + Move T,[Packet,,Packet+1] + BLT T,Packet+%CPMXW-1 ;Zero the packet + Inhale + Jrst BadCon + Ldb T,[$CPKOP Packet] + Cain T,%coDAT + Return + Cain T,%coASY + Jrst AsyErr + Move A,[440800,,Packet+%CPKDT] + Ldb B,[$CPKNB Packet] + Movem A,RespBP + Movem B,RespNB + Cain T,%coNOT ;Notification packet + Jrst CtlNot + Cain T,%coLOS + Jrst [Type "LOS! - Connection lostî" + Call ClsAll + Jrst Unwind] + Cain T,%coCLS + Jrst [Type "CLS! - Connection closedî" + Call ClsAll + Jrst Unwind] +UnKnop: EType "Received packet with unknown opcode - %6O??î" + Call ClsAll + Jrst Unwind + +CtlNot: EType "Notification from FILE server: +%M" + Jrst CtlPkr + +gAtom: Setz T, + Move TT,[440700,,T] + Movei C,5 +gAtom1: Sojl B,CPopj + Ildb D,A + Caie D,40 + Cain D,.CHNL + Return + Jumpe C,gAtom1 + Idpb D,TT + Soja C,gAtom1 + + +PrtBuf: Move A,[440800,,Packet+%CPKDT] + Ldb B,[$CPKNB Packet] +Prtb1: Sojl B,PrtEOP + Ildb T,A + Xct LMASCP(T) + Jrst Prtb1 +PrtEOP: Type "î" + Return + + +BadCon: Call ClsAll + Type "îConnection broken (foreign server probably died)" + Trz F%IFI\F%OFI + Jrst Unwind + + +PktErr: EType "Error: %M" + Jrst Unwind + + +AsyErr: Call ComRse + EType "(Error: %M)" + Jrst Unwind + + +ClsIFI: Trz F,F%IFI + CBInit IFH + BText " CLOSE" + Call ComSnd + Call ComRs1 + Jrst PktErr + Call SmrKin + Return + + +ClsOFI: Trz F,F%OFI + CBInit OFH + BText " CLOSE" + Call ComSnd +; Call SndSyn + Call ComRs1 + Jrst PktErr + Return + + +SndSyn: Skipe Debug + Type " Sending control synchronous markî" + Movei T,%coSYN + Dpb T,[$CPKOP Packet] + Exhale + Jrst BadCon + Return + + +Smrkin: Inhale cDATAi ;Wait for a synch mark. + Jrst BadCon + Ldb T,[$CPKOP Packet] + Cain T,%coSYN + Return + Cain T,%coASY + Jrst AsyErr + Cain T,%coNOT + Jrst MorNot + Cain T,%coEOF + Jrst Smrkin + Caie T,%coDAT + Cain T,%coDWD + Jrst Smrkin + Jrst Unknop + +MorNot: EType " +Notification from FILE server (while awaiting synch mark): +%M" + Jrst Smrkin + + +nProbe: Skipa T,[NFile] +oProbe: Movei T,OFile + Movem T,File +Probe1: BStart " OPEN PROBE" + Call ComOp1 + Jrst Probe1 + Return + + +ComOpn: Movei A,[Asciz / CHARACTER/] + Skipe DatMod + Movei A,[Asciz / BINARY/] + CBText (A) + Skipe RawMod + BText " RAW SUPER-IMAGE" +ComOp1: Skipn DatBSz + Jrst ComOp2 + BText " BYTE-SIZE " + CBNum DatBSz +ComOp2: NL + CBText @File + NL + Call ComSnd + Call ComRsl + Return + Aos (P) + Jrst GetTru + + +gSize: MOVE A,[440800,,Packet+%CPKDT] + MOVEI C,6 +GSIZE1: ILDB T,A + CAIE T,40 + JRST GSIZE1 + SOJN C,GSIZE1 + Setz C, +GSize2: Ildb T,A + Cail T,"0 + Caile T,"9 + Jrst gSize3 + IMuli C,10. + Addi C,-"0(T) + Jrst gSize2 +gSize3: SKIPN RAWMOD ;This stuff purloined, obviously. + SKIPN DATMOD + JRST [IDIVI C,5 ;Turn ASCII bytes into words. + JRST GSIZE4] + MOVEI T,^D36 + IDIV T,DATBSZ + IDIV C,T +GSIZE4: IMULI C,^D36 + MOVEM C,NBITS + Ildb T,A + Caie T,200\^M + Jrst .-2 + Movem A,RFilBP ;Save BP to real filename. + Ildb T,A + Caie T,200\^M + Jrst .-2 + Setz T, + Dpb T,A ;Make filename ASCIZ + Return + + +GetTru: Move A,RespBP + Move B,RespNB +Gett1: Sojl B,[Type "(Badly formatted response)" + Jrst Unwind] + Ildb T,A + Caie T,.CHNL + Jrst Gett1 + Move TT,File + Move C,[440700,,(TT)] +Gett2: Sojl B,Gett3 + Ildb T,A + Cain T,.CHNL + Jrst Gett3 + Idpb T,C + Jrst Gett2 +Gett3: Setz T, + Idpb T,C + Return + +;;; +;;; DATpkr/lin/byt are for grabbing text out of a packet +;;; received on the DATA-CONNECTION pair. All of them +;;; non-skip if there is no more data. +;;; + +DatPkr: Inhale cDATAi + Jrst BadCon + Ldb T,[$CPKOP Packet] + Cain T,%coEOF + Return + Cain T,%coASY + Jrst [Trz F,F%IFI + Jrst AsyErr] + Caie T,%coDAT + Cain T,%coDWD + Jrst Popj1 + Jrst Unknop + + +DatLin: Call DatByt + Return +DatLn1: Cain T,.CHNL + Jrst DatLnf + Idpb T,A + Call DatByt + Skipa + Jrst DatLn1 +DatLnf: Setz TT, + Idpb TT,A + Jrst Popj1 + + +DatByt: Sojge BC,[Ildb T,Q + Jrst Popj1] + Call DatPkr + Return + Move Q,[440800,,Packet+%CPKDT] + Ldb BC,[$CPKNB Packet] + Jrst DatByt + +;;; +;;; The goods for grabbing incoming packets and stuffing them +;;; down the oChan channel (which may actually be open on TTY or +;;; something) +;;; + +RedLup: .Suset [.sIMSK2,,[1_TTYi]] ;Turn on TTY interrupts + Skipe RawMod + Jrst RedRaw + Skipn DatMod + Jrst RedAsc + + Movei A,36. + Skipn C,DatBSz + Movei C,16. + IDiv A,C + Movem A,BPW ;Bytes per Word + + Lsh C,3*8. + Add C,[440000,,E] + Movem C,BinBP ;n-bit byte pointer into AC E. + Setz D, + +RedBin: Call DatPkr + Jrst [Call Binfls + Jrst TTYoff] + Move T,[442000,,Packet+%CPKDT] ;16-bit pointer into data portion... + Ldb TT,[$CPKNB Packet] ;Number of 8-bit bytes --> + Lsh TT,-1 ;Number of 16-bit bytes. + Addm TT,NBytes + + Tlne F,(F%ODD) ;Don't reset these pointers/BPs + Jrst Redb2 ;if we got smeared out over a +Redb1: Move A,BinBP ;couple of packets last time. + Move B,BPW + Setz E, + +Redb2: Sojl TT,Redb3 ;Grab BPW 16-bit bytes from packet + Ildb T3,T ;and build them in E, making a full + Idpb T3,A ;36-bit word. + Sojg B,Redb2 + Movem E,BinBuf(D) + Cail D,Buflen-1 ;We have filled a buffer... dump it + Call Binfla ;to disk and reset stuff. + Aoja D,Redb1 + +Redb3: Came B,BPW ;Did we end on a packet boundry? + Tloa F,(F%ODD) + Tlz F,(F%ODD) + Jrst RedBin + +Binfla: Aoj D, +Binfls: Move I,[444400,,BinBuf] + Syscal SIOT,[oChan ? I ? D] + .Lose %lsSys + Seto D, + Return + +RedRaw: Call DatPkr + Jrst TTYoff + Move T,[440800,,Packet+%CPKDT] + Ldb TT,[$CPKNB Packet] + Addm TT,NBytes + Syscal SIOT,[oChan ? T ? TT] + .Lose + Jrst RedRaw + +RedAsc: Setz BC, ;Force a get of a new packet + Movei A,AscBLn*5 + Move B,[440700,,AscBuf] +RedAs1: Call DatByt + Jrst [Call Redfls + Jrst TTYoff] + Xct LM2Asc(T) + Call Redout + Jrst RedAs1 + +Redout: Sosge A + Call Redfls-1 ;Output this buffer +Redou1: Idpb T,B + Return + + Setz A, +Redfls: Move T3,[440700,,AscBuf] + Movei TT,AscBLn*5 + Sub TT,A ;Number of fresh bytes... + Addm TT,NBytes + Syscal SIOT,[oChan ? T3 ? TT] + .Lose + Movei A,AscBLn*5-1 ;Reset counter/BP + Move B,[440700,,AscBuf] + Return + +Quote: Save T + Movei T,177 ;Quote with a RUBOUT + Call Redout + Rest T + Return + +;;; +;;; Grab input from the file open on DSKi, stuff it into packets, +;;; and cram down down the DATA-CONNECTION +;;; + +WrtLup: Skipe RawMod + Jrst WrtRaw + Skipn DatMod + Jrst WrtAsc + + Movei A,36. + Skipn C,DatBSz + Movei C,16. + IDiv A,C + Movem A,BPW ;Bytes per Word + + Lsh C,3*8. + Add C,[440000,,BinBuf] + Movem C,BinBP + Setz D, + +WrtBin: Move A,[442000,,Packet+%CPKDT] ;Pointer to start of data area. + Movei B,<%CPMXC/2> ;Number of 16-bit bytes. + +WrtBon: Sojl D,[Move T,[444400,,BinBuf] ;If we have run + Movei TT,Buflen ;of buffered + Syscal SIOT,[%Climm,,DSKi ? T ? TT] ;disk input, get + .Lose ;another slab. + Movei D,Buflen + Sub D,TT + Jumpe D,[Call Pktfls ;End of file. Flush the partially + Jrst WrtEOF] ;made packet and we're done. + Move C,BinBP + IMul D,BPW ;Number of words * bytes per word + Jrst .] ;is the number of 16-bit bytes. + Ildb T,C + Idpb T,A + Sosg B ;We just filled a packet. Send + Call Pktfls ;it off... + Jrst WrtBon + +Pktfls: Movei T3,%coDWD ;Binary data... + Dpb T3,[$CPKOP Packet] + Movei T3,<%CPMXC/2> + Sub T3,B + Addm T3,NBytes + Lsh T3,1 ;Turn number of 16-bit bytes into + Dpb T3,[$CPKNB Packet] ;number of 8-bit ones. + Exhale cDATAo + Jrst BadCon + Move A,[442000,,Packet+%CPKDT] + Movei B,<%CPMXC/2> + Return + + +WrtRaw: Move T,[440800,,Packet+%CPKDT] + Movei TT,%CPMXC + Syscal SIOT,[%Climm,,DSKi ? T ? TT] ;Such data directly into + .Lose %lsSys ;the packet... + Movei T,%CPMXC + Sub T,TT + Jumpe T,WrtEOF ;Eck, there was no data. + Addm T,NBytes + Dpb T,[$CPKNB Packet] + Movei TT,%coDAT ;Plain old data. + Dpb TT,[$CPKOP Packet] + Exhale cDATAo + Jrst BadCon + Jrst WrtRaw + +WrtAsc: Setz BC, + Movei A,%CPMXC + Move B,[440800,,Packet+%CPKDT] +WrtAs1: Call Ascin + Jrst AscEOF ;No more characters. + Skipn DatMod + Xct Asc2LM(T) ;If not RAW mode, do the + Idpb T,B ;translation stuff... + Sosg A + Call AscFls + Jrst WrtAs1 + +AscFls: Movei TT,%CPMXC + Sub TT,A + Dpb TT,[$CPKNB Packet] + Movei TT,%coDAT + Dpb TT,[$CPKOP Packet] + Exhale cDATAo + Jrst BadCon + Movei A,%CPMXC + Move B,[440800,,Packet+%CPKDT] + Return + +Ascin: Sojge BC,[Ildb T,C + Jrst Popj1] + Movei D,AscBLn*5 + Move E,[440700,,AscBuf] + Syscal SIOT,[%Climm,,DSKi ? E ? D] + .Lose %lsSys + Movei BC,AscBLn*5 + Sub BC,D + Jumpe BC,CPopj ;Out of data + Cail BC,AscBln*5 ;Is this the last bufferful? + Jrst Ascin2 ; Nope. + Ibp E ;Sort-of normalize us to pointing after +Ascin1: DBP E ;last byte, then start backing up... + Ldb T,E ;Get byte from end... + Cain T,^C ;Last-word ^C padding? + Soja BC,Ascin1 ;real stuff. +Ascin2: Addm BC,NBytes + Move C,[440700,,AscBuf] + Jrst Ascin + + +AscEOF: Call AscFls +WrtEOF: Call DatEOF + Skipe Debug + Type " Sending data synchronous markî" + Movei T,%coSYN + Dpb T,[$CPKOP Packet] + Exhale cDATAo + Jrst PktErr + Return + + +DatEOF: Skipe Debug + Type " Sending EOF on data channelî" + Movei T,%coEOF + Dpb T,[$CPKOP Packet] + Exhale cDATAo + Jrst PktErr + Syscal FINISH,[%Climm,,cDatao] ;Wait for the EOF to be ACK'd + Noop + Return + + +TTYoff: .Suset [.sMSK2,,[0]] ;Disable TTY interrupts. + Return + +LMASCP: Type "" + Repeat 210-1,.Iot TTYo,T + Type "" + Type "" + Type "" + Type "<213>" + Type "<214>" + Type "" + Repeat 377-216,.Iot TTYo,T + Type "<377>" + +LM2Asc: Repeat 10,Noop ;0 through 7, leave alone + Repeat 3,Call Quote + Noop ;^M stays as uparrow + Repeat 2,Call Quote + Repeat 177-16,Noop + Repeat 11,Call Quote + Repeat 3,Trz T,200 + Call Quote + Trz T,200 + Call [Movei T,^M + Call Redout + Movei T,^J + Return] + Repeat 377-216,Call Quote + SKIPA + +Asc2LM: Repeat 10,Noop + Repeat 3,Tro T,200 + Noop + Tro T,200 + Call [Call Ascin + Jrst AscEOF + Movei T,.CHNL + Return] + Repeat 177-16,Noop + Call [Call Ascin + Jrst AscEOF + Xct AscQ(T) + Return] + +AscQ: Repeat 10,Tro T,200 + Repeat 3,Noop + Tro T,200 + Repeat 2,Noop + Repeat 177-16,Tro B,200 + Noop + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; User interface +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +6Typer: Setz TT, + Rotc T,6 + Addi TT,40 + .Iot TTYo,TT + Jumpn T,6Typer + Return + +ATyper: Hrli A,440700 +AT1: Ildb T,A + Jumpe T,CPopj + .Iot TTYo,T + Jrst AT1 + +pZoom: Move A,NBytes + IMul A,BytSiz + Move B,Time +IFN KLp,FLTR B,B ;Float +.ELSE FSC B,233 + FDVR B,[60.0] ;Seconds in B + Move C,A +IFN KLp,FLTR C,C +.ELSE FSC C,233 + FDVR C,B + FDVR C,[1000.0] + EType "%1D bits in %2F seconds = %3F KBaud" +pZoom1: Skipn Yow + Return + Movsi T,-nCats + Caml C,Lower(T) + Aobjn T,.-1 + Move A,Cats-1(T) + EType " [%1S]î" + +pZoom2: Syscal OPEN,[%Clbit,,.uii + %Climm,,YOWi + [Sixbit /DSK/] + [Sixbit /YOW/] + [Sixbit /BIN/] + [Sixbit /GREN/]] + Jrst [EType "No YOW database? %Eî" + Return] + Movsi T,-1 + Syscal CORBLK,[%Climm,,%CBNDW\%CBNDR + %Climm,,%JSelf + %Climm,,YOWpage + %Climm,,YOWi + T] + Jrst [EType "Can't map in YOW databse? %Eî" + .Close YOWi, + Return] + Setz A, +pZoom3: Caml C,Yowloc+Y$BAUD(A) + Jrst pZoom4 + Addi A,LYOW + Caig A,NYOW*LYOW + Jrst pZoom3 + .Close YOWi, + Type "Sorry, but you don't place." + Return + +pZoom4: Move D,A + IDivi D,LYOW + Aoj D, ;This rating. + Caml D,Place + Movem D,Place ;Only update if this rating is better. + EType " +Congradulations!! You just placed #%4D in our all-time transfers!î" + Cail A,NYOW + Jrst pZoom5 ;Last place, nobody scrolls off. + Hrroi E,-NYOW(D) ;NYOW - (D) = #blocks to scroll, + Imuli E,-LYOW ;is number of words. + Hrli E,40000(E) ;400000+#words,,0 + Hrri E,LYOW*+YOWLoc-1 +; Foop + Pop E,LYOW(E) + Jumpl E,.-1 + +pZoom5: Move Q,A + Call DATIME"TIMGET + Movem A,Yowloc+Y$WHEN(Q) + Tlnn F,(F%SEND) + Jrst [Move T,HostN ;Getting: From them, to us. + Movem T,Yowloc+Y$FROM(Q) + Move T,OurNum + Movem T,Yowloc+Y$TO(Q) + Jrst pZoomm] + Move T,OurNum ;Sending: From us, to them. + Movem T,Yowloc+Y$FROM(Q) + Move T,HostN + Movem T,Yowloc+Y$TO(Q) +pZoomm: Move T,NBytes + IMul T,BytSiz + Movem T,Yowloc+Y$BITS(Q) + Movem C,Yowloc+Y$BAUD(Q) + Move T,Uname + Movem T,Yowloc+Y$UNAME(Q) + Setz B, + Caile D,10. + Jrst pZoom7 + Type " +----- +Please enter your initials: " + Move A,[440700,,B] + Movei TT,3 ;Get 3 characters. +pZoom6: .Iot TTYi,T + Cail T,"a + Trz T,40 ;lc -> UC + Cail T,"A + Caile T,"Z + Jrst pZoom6 ;Only letters, please. + Idpb T,A + .Iot TTYo,T ;Save and echo. + Sojn TT,pZoom6 + Type " +----- +" +pZoom7: Movem B,Yowloc+Y$TAG(Q) + .Close YOWi, + Type "You have been saved in the database.î" + Return + + +gOFile: Movei A,OFile + Call gITStr + Skipa + Jrst Popj1 + Movei A,[Asciz /Old filename: /] +gOF1: Movei I,OFile + Call gLine + Return + Tro F,F%EOL + Jrst Popj1 + +gFFile: Movei A,OFile + Call gITStr + Skipa + Jrst Popj1 + Tlne F,(F%SEND) + Jrst [Movei A,DFile + Skipe DFile + EType /[Default is "%1S"]/ + Jrst .+1] + Movei A,[Asciz /Foreign filename: /] + Movei I,OFile + Call gLine + Return + Tro F,F%EOL + Jrst Popj1 + +FdFalt: Skipa B,[440700,,OFile] +LdFalt: Move B,[440700,,NFile] + Move A,[440700,,DFile] +FdF1: Ildb T,A + Idpb T,B + Jumpn T,FdF1 + Return + +gNFile: Movei A,NFile + Call gITStr + Skipa + Jrst Popj1 + Movei A,[Asciz /New filename: /] +gNF1: Movei I,NFile + Call gLine + Return + Jrst Popj1 + +gLFile: Movei A,NFile + Call gStr0 + Skipa + Jrst gLF1 + Movei A,DDev + Tlnn F,(F%SEND) + EType /[Default is "%1L"]/ + Movei A,[Asciz /Local filename: /] + Movei I,NFile + Call gLine + Jrst [Tlnn F,(F%SEND) + Aos (P) + Return] + Tro F,F%EOL +gLF1: Movei A,NFile + Movei B,Device + Call LParse + Jrst Popj1 + +Merge: +IRP default,,[DDev,DDir,DFN1,DFN2]final,,[Device,Direct,FN1,FN2] + Move T,default + Skipn final + Movem T,final +TERMIN + Move T,Device + Movem T,TemDev + Move T,Direct + Movem T,TemSna + Return + + +gUser: Movei A,User + Call gString + Skipa + Jrst Popj1 +gUser1: Movei A,[Asciz /Username: /] + Movei I,User + Call gLine + Return + Tro F,F%EOL + Jrst Popj1 + + +gPass1: Setzm Pass + Movei A,Pass + Call gString + Noop + Return + + +gPass2: Movei A,[Asciz /Password: /] + Tlo F,(F%NOEK) + Movei I,Pass + Call gLine + Jrst .+3 + Tro F,F%EOL + Aos (P) + Tlz F,(F%NOEK) + Return + + +gDir: Setzm Dirnam + Movei A,Dirnam + Call gString + Skipa + Jrst Popj1 + Movei A,[Asciz /Directory: /] + Movei I,Dirnam + Call gLine + Return + Tro F,F%EOL + Jrst Popj1 + + +;;; +;;; GLINE: Grab a line from the TTY into CMDBUF. Handles , +;;; ^W (delete word), ^R (re-type line), and ^U (delete line). +;;; Skips if there was any input (which is Ascizized) +;;; + + +gLine: Hrli I,440700 + Movem I,gLinBP + Movem A,gPrompt + Setz B, + Trz F,F%EOL + +tProm: .Iot TTYo,[^P] + .Iot TTYo,["A] + LType gPrompt + +tText: Jumpe B,gChar + Tlne F,(F%NOEK) + Jrst gChar + Move A,gLinBP + Move TT,B +tT1: Ildb T,A + .Iot TTYo,T + Sojn TT,tT1 + +gChar: .Iot TTYi,T + Cain T,^M + Jrst gLined + Cain T,177 + Jrst [Jumpe B,Beep + Call R$U$B + Jrst gChar] + Cain T,^L + Jrst [.Iot TTYo,[^P] + .Iot TTYo,["C] + Jrst tProm] + Cain T,^W + Jrst Ctrl$W + Cain T,^R + Jrst [Call Cline + Jrst tProm] + Caie T,^D + Cain T,^U + Jrst [Call CLine + Setz B, + Move I,gLinBP + Jrst tProm] + Caie T,^V ;Quoting characters locally and on + Cain T,^Q ;TENEX/TWENEX + Jrst dChar + Caige T,40 + Jrst Beep ;Don't like random control chars +dChar: Idpb T,I ;the same TTYSTx group!! + Tlnn F,(F%NOEK) + .Iot TTYo,T + Aoja B,gChar + +gLined: .Iot TTYo,T ;Echo that CRLF + Setz T, + Idpb T,I + Move TT,gLinBP + Ildb T,TT + Caie T,"; ;Comment lines. + Cain T,"! + Jrst [Setz B, + Move I,gLinBP + Jrst tProm] + Move J,gLinBP + Skipe B + Aos (P) + Return + +Beep: .Iot TTYo,[^G] + Jrst gChar + +Ctrl$W: Jumpe B,Beep + Setzm Alpha +CW1: Jumpe B,gChar + Ldb T,I + Cail T,"a + Trz T,40 ;lc -> UC + Cail T,"A + Caile T,"Z + Jrst [Skipe Alpha + Jrst gChar + Jrst .+2] + Setom Alpha + Call R$U$B + Jrst CW1 + +R$U$B: Ldb T,I + Setz TT, + Dpb TT,I + DBP I + Soj B, + .Iot TTYo,[^P] + .Iot TTYo,["X] + Return + + +CLine: .Iot TTYo,[^P] ;Goes to leftmost column of the current line + .Iot TTYo,["H] ;and does a Clear-EOL. + .Iot TTYo,[8.] + .Iot TTYo,[^P] + .Iot TTYo,["L] + Return + +;;; +;;; SCHAFF: Wades through the input line skipping whitespaces +;;; until something interesting is found. Skip-returns +;;; if there is munchable input. +;;; + +sChaff: Ildb T,J + Caie T,40 + Cain T,^I + Jrst sChaff + Jumpe T,[Tro F,F%EOL + Return] + DBP J +Popj1: Aos (P) +CPopj: Return + +;;; +;;; GSTRING: Get a string of characters (terminated by or +;;; ) from the input line, store starting at the +;;; address given in A. Skip-returns if there is a non- +;;; null string. +;;; + +gITStr: Trne F,F%ITS +gStr0: Troa F,F%SPC +gStrin: Trz F,F%SPC + Trne F,F%EOL + Return ;Can't get a string if nothing there. + Call sChaff + Return + Hrli A,440700 + Setz B, + +gS1: Ildb T,J + Caie T,^M + Skipn T + Jrst [Tro F,F%EOL + Jrst gS2] + Cain T,", + Jrst gS2 + Cain T,40 + Trne F,F%SPC + Skipa + Jrst gS2 + Idpb T,A + Aoja B,gS1 + +gS2: Setz T, + Idpb T,A + Skipe B + Aos (P) + Return + +;;; +;;; GNUMBER: Get a decimal number from the input line. Skips if there +;;; were some digits ending in or +;;; + +gNumbe: Trne F,F%EOL + Return + Call sChaff + Return + Setzb B,C ;Accumulated number. + +gN1: Ildb T,J + Jumpe T,[Tro F,F%EOL + Jrst gN2] + Cain T,40 + Jrst gS2 + Cail T,"0 + Caile T,"9 + Jrst [Type "Non-digit in numeric field" + Return] + IMuli B,10. + Addi B,-"0(T) + Aoja C,gN1 + +gN2: Skipe C + Aos (P) + Return + +TBLUK: Move J,A + Trz F,F%EOL + Jrst Parse0 + +;;; +;;; PARSE: Parse for a command-name. Takes in H the location of +;;; the command-name table. Skip-returns if there was a +;;; unique match, with B having the RH of the table-word. +;;; C has the number of matches: C=0 means none, C>1 means +;;; the command was ambiguous. +;;; + +Parse: Trne F,F%EOL + Return +Parse0: Call sChaff + Return + Movei A,String + Call gString + Return +Parse1: Movem H,TabTop + Setz C, ;Number of matches. + +P1: Skipn (H) + Jrst Check + Hlrz A,(H) ;Address of command string... + Hrli A,440700 + Move D,[440700,,String] + Call UpCase ;Uppcase the token we're matching. + +P2: Ildb T,D + Jumpe T,PWin + Cain T,"? + Jrst ShoOpt + Ildb TT,A + Skipe TT + Came T,TT + Jrst P3 + Jrst P2 + +ShoOpt: Type "Keyword, one of:î" + Move B,TabTop +Shoo0: Movei D,4 + Movei E,8. +Shoo1: Skipn (B) + Jrst Comand + Hlrz A,(B) + Hrli A,440700 + Setz C, + .Iot TTYo,[^I] + Caige E,8. + .Iot TTYo,[^I] +Shoo2: Ildb T,A + Jumpe T,Shoo3 + .Iot TTYo,T + Aoja C,Shoo2 +Shoo3: Soje D,[.Iot TTYo,[^M] + Aoja B,Shoo0] + Move E,C + Aoja B,Shoo1 + +PWin: Aoj C, + Hrrz B,(H) +P3: Aoja H,P1 + +Check: Movem C,ErrTyp + Cain C,1 + Aos (P) + Return + + +;;; +;;; UPCASE: Uppercase string pointed to by D, in place. +;;; + +UPCASE: Push P,D +UpCas0: Ildb T,D + Jumpe T,UpCas1 + Cail T,"a + Trz T,40 + Dpb T,D + Jrst UpCas0 +UpCas1: Pop P,D + Return + +;; +;; SXLATE: Translate this filename into an approximation of the +;; others machines filespec, for defaulting purposes. +;; + +SXLATE: Setzm DFile + Trne F,F%ITS ;Other machine an ITS? + Jrst [Move A,[440700,,DFile] + Move T,Device + Call 6TCopy + Movei B,": + Idpb B,A + Move T,SName + Call 6TCopy + Movei B,"; + Idpb B,A + Move T,FN1 + Call 6TCopy + Movei B,40 + Idpb B,A + Move T,FN2 + Call 6TCopy + Setz B, + Idpb B,A + Return] + Move T,FN2 + Call Nump ;See if FN2 is a number + Jrst SX0 ; Nope. + Skipe DatMod + Jrst [Move T,[444400,,CmdBuf] + Movei A,80./5 + Jrst .+3] + Move T,[440700,,CmdBuf] ;Yes, so suck in first 80. characters + Movei A,80. ;of the file + Syscal SIOT,[%Climm,,DSKi ? T ? A] + Jrst UnkTyp + .Access DSKi,[0] ;Set pointer back to top. + Skipe DatMod + Jrst [Movei TT,80./5 + Sub TT,A + IMuli TT,5 + Jrst .+3] + Movei TT,80. + Sub TT,A ;#Bytes read from file. + Move T,[440700,,CmdBuf] ;and have a little look at it. + Movei TT,80. +FndTyp: Sojl TT,UnkTyp + Ildb A,T +FndTy0: Caie A,"- ;We're looking for "-*-" + Jrst FndTyp + Sojl TT,UnkTyp + Ildb A,T + Caie A,"* + Jrst FndTy0 + Sojl TT,UnkTyp + Ildb A,T + Caie A,"- + Jrst FndTy0 + Call SkpSpc + Jrst UnkTyp + Movem T,TypeBP ;Found it! Save BP to following text. +FTypEn: Sojl TT,UnkTyp ;This is cheating. Should really look + Ildb A,T ;for -*- again. + Cain A,": ;Oops, look for TAG:VALUE + Jrst ChkTag ;type construct. + Cain A,40 + Jrst FndEnd + Caie A,"; ;Multi-tag things have values ending in ";" + Cain A,"- ;else (ahem) assume this is the - in -*- + Jrst FndEnd + Jrst FTypEn + +ChkTag: Setz A, ;Found a tag, sigh. + Dpb A,T + Move A,TypeBP ;See if it's MODE:something + Move B,[440700,,[Asciz "Mode"]] + Call STCMP + Jrst NxtMod ;Nope, look for next tag. + Call SkpSpc + Jrst UnkTyp +Harumf: Movem T,TypeBP ;save BP to next start-of-type + Aoja TT,FTypEn ;and look again + +SkpSpc: Sojl TT,CPopj ;Yep! Skip past whitespace... + Ildb A,T + Caie A,^I + Cain A,40 + Jrst .-3 + DBP T + Jrst Popj1 + +NxtMod: Sojl TT,UnkTyp ;skip ahead to the next mode. + Ildb A,T + Cain A,"* + Jrst UnkTyp + Caie A,"; + Jrst NxtMod + Call SkpSpc + Jrst UnkTyp + Jrst Harumf + +FndEnd: Setz A, ;Write over the terminating byte. + Dpb A,T + Jrst LukTyp ;and look it up. +LukTyp: Move A,TypeBP + Movei H,TypTab + Call TBLUK + Skipa B,TypeBP + Hrli B,440700 + Movem B,TypeBP + Jrst SX0 + +UnkTyp: Move A,[440700,,[Asciz "TXT"]] + Movem A,TypeBP +SX0: Trne F,F%TNX ;TENEX/TWENEX? + Jrst TNXify +; Trne F,F%UNIX +; Jrst [ ... +; Call UNIXfy +; Return] + Return ;Something we don't know about. + +Nump: Setzm Number +Nump0: Setz TT, + Rotc T,6 + Cail TT,'0 + Caile TT,'9 + Return + Jumpn T,Nump0 + Setom Number + Jrst Popj1 + +STCMP: .Save [T,TT] +STCMP0: Ildb T,A + Cail T,"a + Trz T,40 + Ildb TT,B + Cail TT,"a + Trz TT,40 + Came T,TT + Jrst STCMP1 + Skipn T + Skipe TT + Jrst STCMP0 + Aos -2(P) +STCMP1: .Rest [TT,T] + Return + +;;; +;;; ITSIFY: Parse the foreign filespec (if twenex) and turn +;;; it into a ITS-style one, in DFILE. AC A has BP +;;; to file to be translated. +;;; + +ITSify: Setzm Device ;Always look here + Setzm Direct + Setzm FN1 + Setzm FN2 + Trnn F,F%ITS + Jrst TNXp + Movei B,DDev + Jrst LParse + +TNXp: Trnn F,F%TNX + Jrst Dunno + Tlz F,(F%RIGHT\F%LEFT) + Setz TT, + Move B,[440700,,DFile] + Movem B,StDev' + +TNX1: Ildb T,A + Caie T,"[ + Cain T,"< + Jrst [Tlo F,(F%LEFT) + JRST TNX1] + Caie T,"> + Cain T,"] + Jrst [Tlo F,(F%RIGHT) + Movei T,"; + Jrst TNX2] + Cain T,". + Jrst [Tlne F,(F%LEFT) + Tlne F,(F%RIGHT) + Skipa + Jrst [Move B,StDev + Jrst TNX1] + Jumpn TT,[Setz T, + Jrst TNX2] + Movei T,40 + Aoja TT,TNX2] +TNX2: Idpb T,B + Cain T,": + Movem B,StDev + Jumpn T,TNX1 + Movei A,DFile + Movei B,DDev + Jrst LParse + +IFN 0,[ +VAXp: Trnn F,F%VAX + Jrst UNIXp +; +; eventually +; + Return + +UNIXp: Trnn F,F%UNIX + Return +; +; more eventually +; + Return +];Vax, Unix, etc + +Dunno: Move T,XUNAME + Movem T,DFN1 + Movsi T,(Sixbit ">") + Movem T,DFN2 +Dunno0: Movsi T,(Sixbit "DSK") + Movem T,DDev + Move T,SNAME + Movem T,DDir + Return + +;;; +;;; TNXIFY: Turn an ITS-filespec into a TNX one. +;;; + +TNXify: Move A,[440700,,DFile] + Skipe T,Device + Jrst [Call 6TCopy + Movei B,": + Idpb B,A + Jrst .+1] + Skipe T,Direct + Jrst [Movei B,"[ + Idpb B,A + Call 6TCopy + Movei B,"] + Idpb B,A + Jrst .+1] + Skipe T,FN1 + Jrst [Call 6TCopy + Movei B,". + Idpb B,A + Jrst .+1] + Skipe T,FN2 + Jrst [Skipe Number + Call CpyTyp + Call 6TCopy + Jrst .+1] + Setz B, + Idpb B,A + Return + +CpyTyp: Move T,TypeBP + Ildb B,T + Jumpe B,[Movei B,". + Idpb B,A + Move T,FN2 + Return] + Idpb B,A + Jrst CpyTyp+1 + +6TCopy: Movei B,^V +7TCopy: Setz TT, + Rotc T,6 + Addi TT,40 + Caie TT,40 + Cain TT,": + Idpb B,A + Caie TT,". + Cain TT,"; + Idpb B,A + Idpb TT,A + Jumpn T,7TCopy + Return + +;;; +;;; WILDP: See if the ITS filespec has some wildcards. +;;; + +WILDP: Setz A, + Move C,[440600,,FN1] + Call Wild1 + Move C,[440600,,FN2] + Call Wild1 + Skipe A + Aos (P) + Return + +Wild1: Ildb T,C + Cain T,'* + Aoja A,CPopj + Tlne C,770000 + Jrst Wild1 + Return + +;;; +;;; LPARSE: Parse (A) and turn into DEVICE/DIRECT/FN1/FN2 (B) +;;; + +LParse: Tlz F,(F%FN1\F%QUOTE) + Setzm (B) + Setzm 1(B) + Setzm 2(B) + Setzm 3(B) + Tlnn A,-1 + Hrli A,440700 +LP0: Move C,[440600,,D] + Setz D, +LP1: Ildb T,A + Jumpe T,LP3 + Tlne F,(F%QUOTE) + Jrst [Tlz F,(F%QUOTE) + Jrst LP1a] + Cain T,^Q + Jrst [Tlo F,(F%QUOTE) + Jrst LP1] + Cain T,": + Jrst SavDev + Cain T,"; + Jrst [Jumpe D,LP1 + Movem D,1(B) + Jrst LP0] + Cain T,40 + Jrst LP2 +LP1a: Tlnn C,770000 + Jrst LP1 + Cail T,"a + Trz T,40 + Subi T,40 + Idpb T,C + Jrst LP1 + +SavDev: Jumpe D,LP1 + Trne F,F%TNX + Jrst [Camn D,[Sixbit "PS"] + Movsi D,(Sixbit "DSK") + Came D,[Sixbit "OZ"] + Camn D,[Sixbit "EE"] + Movsi D,(Sixbit "DSK") + Came D,[Sixbit "XX"] + Camn D,[Sixbit "SPEECH"] ;Is this right for Speech? + Movsi D,(Sixbit "DSK") + Jrst .+1] + Trne F,F%ITS + Jrst [Came D,[Sixbit "AI"] + Camn D,[Sixbit "MC"] + Movsi D,(Sixbit "DSK") + Jrst .+1] + Movem D,0(B) + Jrst LP0 + +LP2: Jumpe D,LP1 + Skipa +LP3: Jumpe D,CPopj + Movei TT,2(B) + Tlne F,(F%FN1) + Movei TT,3(B) + Movem D,(TT) + Tlo F,(F%FN1) + Skipe T + Jrst LP0 + Return + +PutChr: .Iot TTYo,T + Return + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; UUOs +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +ULTYP: Move A,(A) +UATYP: Hrli A,440700 +UA1: Ildb C,A + Jumpe C,CPopj + .Iot TTYo,C + Jrst UA1 + +UFTYP: Hrli A,440700 + Move B,A + Ldb C,[220400,,40] + Setz D, +UF1: Ildb E,B + Skipe E + Aoja D,UF1 + Sub C,D +UF2: Sojl C,UA1 + .Iot TTYo,[" ] + Jrst UF2 + +U6TYP: Move A,(A) +U61: Setz B, + Rotc A,6 + Addi B,40 + Caie B,40 + Cain B,"; + .Iot TTYo,[^Q] + Cain B,": + .Iot TTYo,[^Q] + .Iot TTYo,B + Jumpn A,U61 + Jrst CPopj + +UBST: Move Q,[440800,,ComBuf] + Movei B,"T + Idpb B,Q + Aos B,TranID + Call UBN0 + Movei B,40 + Idpb B,Q +UBTEX: Hrli A,440700 +UBST3: Ildb B,A + Jumpe B,CPopj + Idpb B,Q + Jrst UBST3 + + +UBNUM: Move B,(A) +UBN0: Setz D, +UBN1: IDivi B,10. + Save C + Aoj D, + Jumpn B,UBN1 +UBN2: Rest C + Addi C,"0 + Idpb C,Q + Sojn D,UBN2 + Return + +;;; +;;; GP typeout macro. Types a string on the terminal, with +;;; special functions turned on with "%": +;;; +;;; %nS Print the ASCIZ string at (ACn) +;;; %nD Print ACn as decimal +;;; %nO Print ACn as octal +;;; %nF Print ACn as a floating-point number +;;; %n' Print ANc as a sixbit word +;;; %nL Print ITS filespec starting at (ACn), Dev/Dir/FN1/FN2. +;;; Knows not to print extra stuff for TTY device. +;;; %M Print remainder of control packet (usually an error code) +;;; %E Print last ITS error message (.BCHNL) +;;; + +UETYP: Move U,A + Hrli U,440700 +UE1: Ildb B,U + Jumpe B,CPopj + Caie B,"% + Jrst [.Iot TTYo,B + Jrst UE1] + Setz B, +UEAN: Ildb A,U + Cail A,"0 + Caile A,"7 + Jrst [Move C,A + Cail C,"a + Trz C,40 + Jrst UE2] + Lsh B,3 + Addi B,-"0(A) + Jrst UEAN + +UE2: Caie C,"S ;String output. + Jrst UE3 + Move D,ACsave(B) + Jumpe D,UE1 + Tlnn D,-1 + Hrli D,440700 +UES1: Ildb B,D + Jumpe B,UE1 + .Iot TTYo,B + Jrst UES1 + +UE3: Caie C,"D ;Decimal output. + Jrst UE4 + Movei E,10. +UERAD: Movem E,Base + Move B,ACsave(B) + Setz D, +UED1: IDiv B,Base + Push P,C + Aoj D, + Jumpn B,UED1 +UED2: Rest B + Addi B,"0 + .Iot TTYo,B + Sojn D,UED2 + Jrst UE1 + +UE4: Caie C,"O + Jrst UE5 + Movei E,8. + Jrst UERAD + +UE5: Caie C,"F ;Floating-point output. + Jrst UE6 + Move A,ACsave(B) + Call UEF0 + Jrst UE1 + +UEF0: Jumpg A,UEF1 + Jumpe A,UEF2 + Movns A + .Iot TTYo,["-] + Tlze A,400000 + Jrst UEF2 + +UEF1: Setz B, + Tlnn A,400 + .Iot TTYo,["#] ;Not normalized. + Camge A,FT01 + Jrst UEF4 + Caml A,FT8 + Aoja B,UEF4 + +UEF2: Setzb C,Tem1 + Muli A,400 + Ashc B,-243(A) + Move A,B + Call UEF5 + .Iot TTYo,[".] + Movni A,10 + Add A,Tem1 + Move T,C +UEF3: Move D,T + Muli D,10. + Addi D,"0 + .Iot TTYo,D + Skipe T + Aojl A,UEF3 + Return + +UEF4: Movni C,6 + Setz T3, +UEF4A: Addi T3,1(T3) + Xct FCP(B) + Sosa T3 + Fmpr A,@FCP+1(B) + Aojn C,UEF4A + Save EXPSGN(B) + Call UEF2 + .Iot TTYo,["E] + Rest D + .Iot TTYo,D + Move A,T3 + +UEF5: Skipe A + Aos Tem1 + IDivi A,10. + Hrlm B,(P) + Jumpe A,UEF5A + Call UEF5 + +UEF5A: Hlrz D,(P) + Addi D,"0 + .Iot TTYo,D + Return + +UE6: Caie C,"M + Jrst UE7 + Move A,RespBP + Move B,RespNB +UE6A: Sojl B,CPopj + Ildb T,A + .Iot TTYo,T + Jrst UE6A + +UE7: Caie C,"E + Jrst UE8 + Syscal OPEN,[%Clbit,,.uai + %Climm,,ERRi + [Sixbit /ERR/] + %Climm,,1] + Return +UE7A: .Iot ERRi,T + Caige T,40 + Jrst [.Close ERRi, + .Iot TTYo,[^M] + Return] + .Iot TTYo,T + Jrst UE7A + +UE8: Caie C,"L + Jrst UE9 + Save A + Move D,ACSave(B) + Move A,0(D) + Call U61 + .Iot TTYo,[":] + Trne F,F%TYPE + Jrst UE8A + Move A,1(D) + Call U61 + .Iot TTYo,[";] + Move A,2(D) + Call U61 + .Iot TTYo,[" ] + Move A,3(D) + Call U61 +UE8A: Rest A + Jrst UE1 + +UE9: Caie C,"' + Jrst UE10 + Move A,ACSave(B) + Call U61 + Jrst UE1 + +UE10: .Iot TTYo,["%] + .Iot TTYo,C + Jrst UE1 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; Interrupt level routines +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +TTYint: Save T + Movei T,TTYi + .ITYIC T, + Jrst Disms1 + Cain T,^P + Jrst pStats + Caie T,^S + Cain T,^G + Skipa + Jrst Disms1 + Type "îAborting...î" + Call TTYoff + +Abort: Trnn F,F%SEND + Jrst Abort1 + .Close DSKi, ;Abort sending of local file. Close it, + Call DatEOF + Call DELEWO ;reset flags and go back to command... + Call ClsOFI + Jrst Dismis + +Abort1: Syscal DELEWO,[oChan] ;Abort reception of foreign + Noop ;file: Close and delete the +Abort2: Syscal CLOSE,[oChan] ;local copy... + .Lose %lsSys + Call ClsIFI +IFN 0,[ + Skipe Debug + Type " Waiting for synchronous markî" +Abort3: Inhale cDATAi + Jrst PktErr + Ldb T,[$CPKOP Packet] + Caie T,%coSYN + Jrst Abort3 +];IFN 0 + +Dismis: Rest T ;Clean stack... + Syscal TTYFLS,[%Clbit,,0 + %Climm,,TTYi] + Noop + Syscal DISMIS,[P ? %Climm,,Comand] + .Lose + + +pStats: .SAVE [A,B,C] ;^P while you are in a transfer + Move A,NBytes ;gives us the stats... + IMul A,BytSiz + Move B,A + IMuli B,100. + IDiv B,NBits + EType "[%1D bits = %2D%]î" + .REST [C,B,A] + Jrst Disms1 + +More: Type "--More--" + Save T + .Iot TTYi,T + Caie T,40 + Jrst [Type "Flushingî" + Jrst Abort2] + .Iot TTYo,[^M] +Disms1: Rest T + Syscal TTYFLS,[%Clbit,,0 + %Climm,,TTYi] + Noop + Syscal DISMIS,[P] + .Lose + +IOCerr: Type "îYow! Something is seriously wrong! IOC error!!... +Closing everything... turning off all flags... flushing world.îî" + Trz F,F%DAT\F%CTL\F%LOG\F%IFI\F%OFI + .Close cDATAi, + .Close cDATAo, ;reset EVERYTHING + .Close CHAOSi, + .Close CHAOSo, + .Close DSKi, ;Just in case, close + Syscal DELEWO,[oChan] ;anything that might + Skipa ;be open... + Syscal CLOSE,[oChan] + Noop + Syscal DISMIS,[P ? %Climm,,Unwind] + .Lose %lsSys + +BinBuf: Block Buflen + +Variables +Constants + +YOWpag==<._-12>+1 + LOC YOWpag*2000 +YOWloc: 0 + Block 1777 + +Expunge .kark.,.gack. + + + End Begin diff --git a/src/syseng/@chaos.17 b/src/syseng/@chaos.17 new file mode 100755 index 00000000..c3d143aa --- /dev/null +++ b/src/syseng/@chaos.17 @@ -0,0 +1,74 @@ +;;; Primitive ATSIGN CHAOS DLW 1/26/78 -*-Fundamental-*- + +TITLE ATSIGN CHAOS + +;;; This program is loaded by the system when an RFC is received and nobody +;;; else is listening. + + A=1 + B=2 + C=3 + D=4 + E=5 + + DSKI==1 ; Channel for loading server. + +.INSRT SYSTEM;CHSDEF > + +DEBUG: 0 ; -1 => Debug mode. +DEFNAM: SIXBIT /DFAULT/ ; FN2 of the default server (if CHAOS is not found). +PBUF: BLOCK %CPMXW ; Packet buffer. + +GO: .CALL [ SETZ ; Get a pending RFC. + SIXBIT /CHAOSQ/ + SETZI PBUF] + JSR LOGOUT + MOVE A,[440800,,PBUF+%CPKDT] ; First byte in packet. + MOVE B,[440600,,D] + MOVEI D,0 + LDB E,[$CPKNB+PBUF] ; The NBYTES field of the packet. + CAILE E,6 ; If > 6, usae 6 instead. + MOVEI E,6 +CHLOOP: ILDB C,A ; Convert 8-bit codes from packet into a sixbit word + CAIN C,40 ; in D. + JRST ENDLUP + CAIL C,"a + CAILE C,"z + SUBI C,40 + IDPB C,B + SOJG E,CHLOOP +ENDLUP: MOVE 0,D ;Contact name, sixbitified, is passed in in AC0 + .SUSET [.SSNAME,,D] ;Also pass it in the sname, for debugging + .CALL [ SETZ ; Open DEVICE;CHAOS + SIXBIT /OPEN/ + [.UII,,DSKI] + [SIXBIT /DSK/] + [SIXBIT /CHAOS/] + D + SETZ [SIXBIT /DEVICE/]] + JRST [ CAMN D,DEFNAM ; Were we trying the default server? + JSR LOGOUT ; Yes, lose big! + MOVE D,DEFNAM ; No, try loading the default server. + JRST .-1] + MOVE 17,[ACBLK,,1] ; Load it in and start it. + BLT 17,ACBLKL + JRST 1 + +ACBLK: .CORE 0 ;1 - vital to clear core!! + .LOSE ;2 + .CALL 7 ;3 + .LOGOUT 1, ;4 + .IOT DSKI,17 ;5 + JRST (17) ;6 + SETZ ;7 + SIXBIT /LOAD/ ;10 + MOVEI %JSELF ;11 + SETZI DSKI ;12 +ACBLKL=.-ACBLK + +LOGOUT: 0 + SKIPE DEBUG + .VALUE + .LOGOUT 1, + + END GO diff --git a/src/sysnet/chtn.15 b/src/sysnet/chtn.15 new file mode 100755 index 00000000..604a73b1 --- /dev/null +++ b/src/sysnet/chtn.15 @@ -0,0 +1,886 @@ + +;;; -*-MIDAS-*- + + TITLE CHTN -- Chaosnet user telnet + +;;; simple minded chaosnet user telnet, negotiates as little as possible + +F=0 +A=1 +B=2 +C=3 +D=4 +E=5 +S=7 +T=10 +TT=11 +N=12 +O=13 +BP=15 +CH=16 +P=17 + +TTYICH=0 +TTYOCH=1 +FILECH=7 +ICPCH=10 ;for arpanet icp +CHAICH=12 +CHAOCH=13 + +FRCNAM==1 ;have an explicit connection name +FRARPA==2 ;use the ARPA net instead + +ICPSKT==27 ;default arpanet socket number + +TRNBIN==0 ;transmit binary +ECHO==1 ;echo +SUPRGA==3 ;supress go-ahead +TIMMRK==6 ;timing mark +WILL==373 +WONT==374 +DO==375 +DONT==376 +IAC==377 + +;; flag bit definitions for vt52 escape code handling +ES%CAR==1 +ES%ABS==2 +ES%ASF==4 +ES%EPD==10 + +ESTATE: 0 ;flags for vt52 escape code handling +EXPOS: 0 ;saved xpos for vt52 hacking +EYPOS: 0 ;saved ypos for vt52 hacking +DEBUG: 0 ;non-zero this is the debugging version +MOREP: 0 ;do **More** processing +TTOMOD: 0 ;doing superimage output +TBINP: 0 ;non-zero if we are sending binary +ECHOP: 0 ;non-zero we are echoing locally +FRNHST: 0 ;36 bit host number +HSTSIX: 0 ;sixbit of host +OLDTLP: -1 ;non-zero until know we are talking new telnet ptcl +STATE: 0 ;deferred iac, deferred will, etc +ESCCHR: ^^ ;default escape character +JCLBUF: BLOCK 10 +CONNAM: ASCIZ /TELNET/ ;default connection name + BLOCK 10 + NPDL==77 +PDL: BLOCK NPDL + BUFSIZ==488. +NETBUF: BLOCK /4 +TTYBUF: BLOCK /5 + +LOC .\1777+1 +TSINT: LOC 42 + -TSINTL,,TSINT +LOC TSINT ;interrupt vector + 1007,,P ;save ac's 10 thru 16 + %PIIOC ? 0 ? -1 ? -1 ? IOCERR + 0 ? 1_TTYICH ? 0 ? 1_TTYICH ? TTYINT + 0 ? 1_CHAICH ? 0 ? 1_CHAICH ? CHAINT + 0 ? 1_TTYOCH ? 0 ? 1_TTYOCH\1_CHAICH\1_TTYICH ? MORINT +TSINTL==.-TSINT + +GO: MOVE P,[-NPDL,,PDL-1] + .CALL [ SETZ ;open up tty for output + SIXBIT /OPEN/ + MOVSI %TJDIS+.UAO + MOVEI TTYOCH + SETZ [SIXBIT /TTY/]] + .LOSE %LSSYS + .CALL [ SETZ ;open tty for input + SIXBIT /OPEN/ + MOVSI %TIINT+%TINWT+%TIFUL+.UAI + MOVEI TTYICH + SETZ [SIXBIT /TTY/]] + .LOSE %LSSYS + + pushj p,lsrchk ;see if they're a loser + pushj p,lsrwrn ;yep; warn them off + .iot ttyoch,[^P] ? .iot ttyoch,["A] ;get a fresh line. + + .SUSET [.ROPTION,,T] + TLO T,OPTINT ;new style interrupts + .SUSET [.SOPTION,,T] + .SUSET [.SDF1,,[-1]] ;defer all interrupts until things get going + .SUSET [.SDF2,,[-1]] + .SUSET [.SMASK,,[%PIIOC]] ;will want to wtch for ioc errors, + .SUSET [.SMSK2,,[1_TTYICH\1_CHAICH]] ;and tty and network input + MOVE BP,[440700,,JCLBUF] + TLNN T,OPTCMD ;was there jcl? + JRST NOJCL ;no, get it from user then + .BREAK 12,[..RJCL,,JCLBUF] ;yes, read it in +JCLOO1: MOVE A,BP ;save the byte pointer to start + ILDB CH,BP + CAIN CH,<" > ;<">ignore spaces + JRST JCLOO1 + +JCLOO2: ILDB CH,BP + CAILE CH,40 ;go until get a control char + JRST JCLOO2 + MOVEI TT,0 + DPB TT,BP ;make this part asciz + CAIE CH,33 ;specifying contact name as well? + JRST JCL2 ;no, use default then + TRO F,FRCNAM ;remember we had a connection name + MOVE T,[440700,,CONNAM] + +JCLOO3: ILDB CH,BP + CAIGE CH,40 + JRST JCL1 + IDPB CH,T + JRST JCLOO3 + +NOJCL: .SUSET [.RXJNAME,,TT] ;no jcl, try to use jname + SETZM JCLBUF + SETZM JCLBUF+1 +NOJCL1: SETZ T, + LSHC T,6 + ADDI T,40 + IDPB T,BP + JUMPN TT,NOJCL1 + JRST JCL2 + +JCL1: IDPB TT,T ;make this asciz as well +JCL2: MOVEI A,HSTPAG + MOVEI B,FILECH + PUSHJ P,NETWRK"HSTMAP ;load in the hosts2 data base + .VALUE + MOVEI A,JCLBUF + PUSHJ P,NETWRK"HSTLOOK ;get host number into a, network number into tt + JRST [ MOVEI T,[ASCIZ /Unrecognized host name/] + PUSHJ P,OUTSTR + JRST DIE] + MOVEM A,FRNHST ;stash host number + CAIN TT,NETWRK"NW%ARP + JRST ARPCON ;connection over the arpanet +; JRST GETCON ;have the host and contact name, go try to open things up + +GETCON: MOVEI A,CHAICH + MOVE B,FRNHST + MOVEI C,CONNAM + MOVEI D,5 + PUSHJ P,NETWRK"CHACON ;try to open the connection + JRST NOCONN + JRST GOTCON + +ARPCON: TRO F,FRARPA ;using the arpanet + TRNN F,FRCNAM ;specified the socket number? + JRST ARPCN2 ;no, use default then + MOVE BP,[440700,,CONNAM] + SETZ C, ;build number here +ARPCN1: ILDB CH,BP + JUMPE CH,ARPCN3 + CAIL CH,"0 + CAILE CH,"7 + JRST [ MOVEI T,[ASCIZ /Specify arpanet socket number in octal/] + PUSHJ P,OUTSTR + JRST DIE] + LSH C,3 + IORI C,-"0(CH) + JRST ARPCN1 + +ARPCN2: MOVEI C,ICPSKT ;default socket number +ARPCN3: MOVEI A,ICPCH ;first of 4 channels to icp with + MOVE B,FRNHST ;host to icp to + MOVE D,[08040+.UII,,08040+.UIO] ;8 bit image (no crlf hacking) + PUSHJ P,NETWRK"ARPICP ;do it all + JRST NOCONN+1 ;lost + +;connection now opened ok +GOTCON: MOVE A,FRNHST + PUSHJ P,NETWRK"HSTSIX ;get sixbit name of host + .VALUE + MOVEM A,HSTSIX ;save for command prompt + .CORE HSTPAG ;we don't need hosts2 any more + .LOSE %LSSYS + SETZM NETWRK"HSTADR + MOVEI T,[ASCIZ /C/] + PUSHJ P,OUTSTR + .SUSET [.SWHO1,,[1,,660000]] ;.who3 as 6 sixbit chars, no space + .SUSET [.SWHO3,,HSTSIX] + + .CALL [ SETZ ;get ttyopt variable + SIXBIT /CNSGET/ + MOVEI TTYOCH + MOVEM T + MOVEM T + MOVEM T + MOVEM T + SETZM T] + .LOSE %LSSYS + .CALL [ SETZ ;get ttysts variable + SIXBIT /TTYGET/ + MOVEI TTYOCH + MOVEM E + MOVEM E + SETZM E] + .LOSE %LSSYS + MOVEI TT,%TXTOP+"B ;escape char is [BREAK] for TVs + TLNN T,%TOFCI + TLOA E,%TSSII ;non-TVs need superimage mode for  to win + MOVEM TT,ESCCHR + .CALL [ SETZ ;set ttysts + SIXBIT /TTYSET/ + MOVEI TTYOCH + [030303030303] ;everything activates, but doesnt echo + [030303030303] + SETZ E] + .LOSE %LSSYS + TLNN T,%TOMOR ;want more processing? + JRST GOTCN1 ;no + SETOM MOREP ;initally more processing on + .SUSET [.SIMSK2,,[1_TTYOCH]] +GOTCN1: MOVEI T,%TJDIS ;normal output not in display mode + MOVEM T,TTOMOD + .SUSET [.SDF1,,[0]] ;allow interrupts to take effect now + .SUSET [.SDF2,,[0]] + +WAIT: JFCL ;complicated main program level + .HANG + +;connection failed +NOCONN: MOVEI A,CHAICH + PUSHJ P,NETWRK"ANALYZ + .VALUE + +DIE: SKIPE DEBUG + .VALUE + .LOGOUT 1, + JRST DIE + +;escape character typed +DOESC: MOVEI T,[ASCIZ /SZLCMND (/] + PUSHJ P,OUTSTR + .CALL [ SETZ + SIXBIT /SSTATU/ + MOVEM TT + MOVEM TT + MOVEM TT + MOVEM TT + MOVEM TT + SETZM TT] + .LOSE %LSSYS + PUSHJ P,OUTSIX + MOVEI T,[ASCIZ / to /] + PUSHJ P,OUTSTR + MOVE TT,HSTSIX + PUSHJ P,OUTSIX + MOVEI T,[ASCIZ /) ->/] + PUSHJ P,OUTSTR + + .CALL [ SETZ + SIXBIT /IOT/ + MOVSI %TINWT ;do wait for this char + MOVEI TTYICH + SETZM CH] + .LOSE %LSSYS + + PUSH P,CH ;save char + MOVEI T,[ASCIZ /ZL/] ;beggining of line, clear to end of line + PUSHJ P,OUTSTR + POP P,CH ;get command char back + + TRZ CH,%TXSFT ;flush shift bit + ANDI CH,177 ;only want ascii side of things + CAMN CH,ESCCHR ;quoting the escape character? + JRST TTYINC ;yes, send it + CAIE CH,"? ;don't uppercasify ? please + CAIGE CH,"a ;uppercasify character + SKIPA + TRZ CH,40 + MOVSI T,-NESCS +DOESCL: HLRZ TT,ESCTAB(T) ;look to match this command + CAIE TT,(CH) + AOBJN T,DOESCL + JUMPGE T,DOESCX + HRRZ TT,ESCTAB(T) + JRST (TT) ;go do command + +ESCTAB: "P,,PROCED + "D,,DDT + "L,,QUIT ;maybe should do IAC DO LOGOUT? + "Q,,QUIT + "M,,MORE + "E,,CHECHO + "?,,GHELP ;GIVE HELP (?) + "G,,SIOU + "V,,VTT ;TOGGLE VT52 SIMULATION + "S,,SHOMOD + ^Z,,DDT + 177,,DOESCR +NESCS==.-ESCTAB + +PROCED: .SUSET [.SAIFPIR,,[1_TTYICH]] ;clear interrupt from this char + .VALUE [ASCIZ /:PROCED 1J/] + JRST TTYINX ;dismiss interrupt + +DDT: .SUSET [.SAIFPIR,,[1_TTYICH]] + .SUSET [.SIPIRQC,,[%PIC.Z]] + JRST DOESCR + +QUIT: .CLOSE CHAOCH, + .CLOSE CHAICH, + JRST DIE + +MORE: SETCMM MOREP + PUSHJ P,SMMORE + JRST DOESCR + +CHECHO: SETCMM ECHOP + PUSHJ P,SMECHO + JRST DOESCR + +SIOU: MOVEI T,%TJSIO + XORM T,TTOMOD + PUSHJ P,SMSIO + JRST DOESCR + +VTT: MOVEI T,%TJDIS ;TOGGLE DISPLAY MODE OUTPUT + XORM T,TTOMOD + MOVEI T,ES%CAR ;TOGGLE TRANSLATIONS + XORM T,ESTATE + PUSHJ P,SMVTT ;show mode: vt52 + JRST DOESCR + +GHELP: MOVEI T,[ASCIZ /CPossible Commands are: +P => Proceed (Valrets :PROCEED) +D => Go up to DDT +E => Toggle local Echo +L => Quit and logout (doesn't log you out yet!) +Q => Quit (just close connection, don't do a logout) +M => Toggle Local More processing +G => Toggle Super Image output +V => Toggle VT52 Simulation +S => Show state of modes +^Z => Same as "D" (Go to DDT) +? => Type this cruft +/] + PUSHJ P,OUTSTR + JRST DOESCR + +SHOMOD: PUSHJ P,SMECHO + PUSHJ P,SMMORE + PUSHJ P,SMSIO + PUSHJ P,SMVTT + JRST DOESCR + +SMECHO: SKIPE ECHOP + SKIPA T,[[ASCIZ /Local echo on. /]] + MOVEI T,[ASCIZ /Local echo off. /] + JRST OUTSTR + +SMMORE: SKIPE MOREP + SKIPA T,[[ASCIZ /More processing on. /]] + MOVEI T,[ASCIZ /More processing off. /] + JRST OUTSTR + +SMSIO: MOVE T,TTOMOD + TRNE T,%TJSIO + SKIPA T,[[ASCIZ /Super image output on. /]] + MOVEI T,[ASCIZ /Super image output off. /] + JRST OUTSTR + +SMVTT: MOVE T,ESTATE + TRNE T,ES%CAR + SKIPA T,[[ASCIZ /VT52 mode on. /]] + MOVEI T,[ASCIZ /VT52 mode off. /] + JRST OUTSTR + + +DOESCX: .IOT TTYOCH,[^G] ;feep if not a known command +DOESCR: MOVEI T,[ASCIZ /R/] ;restore cursor position + PUSHJ P,OUTSTR +; JRST TTYINL + +;interrupt handlers +TTYINT: .CALL [ SETZ ;acknowledge interrupt + SIXBIT /WHYINT/ + SETZI TTYICH] + JFCL +TTYINL: .IOT TTYICH,CH + JUMPL CH,TTYINX ;no more, dismiss the interrupt + TRZ CH,%TXSFT ;ignore shift + CAMN CH,ESCCHR ;this the escape character? + JRST DOESC ;yes, go handle it +TTYINC: TRZE CH,%TXCTL ;canonicalize the character + ANDI CH,37 + ANDI CH,177 ;only send ascii + SKIPE ECHOP ;local echoing? + .IOT TTYOCH,CH ;yes, must do it then + .IOT CHAOCH,CH + CAIN CH,^M + SKIPE TBINP + SKIPA + .IOT CHAOCH,[^J] ;if ^M and not transmitting binary + JRST TTYINL + +TTYINX: .NETS CHAOCH, +INTX: .CALL [ SETZ + SIXBIT /DISMIS/ + MOVSI 1007 + SETZ P] + .LOSE %LSSYS + +IOCERR: .SUSET [.RBCHN,,T] + CAIE T,CHAICH + CAIN T,CHAOCH + JRST NOCONN ;ioc error for chaosnet, go analyze and die + .VALUE [ASCIZ /:IOC ERROR FOR NON CHAOSNET CHANNELKILL /] + +MORINT: .CALL [ SETZ + SIXBIT /WHYINT/ + SETZI TTYOCH] + .LOSE %LSSYS + SKIPN MOREP + JRST INTX + MOVEI T,[ASCIZ /**More**/] + PUSHJ P,OUTSTR + .CALL [ SETZ + SIXBIT /IOT/ + MOVSI %TINWT+%TIPEK ;peek it and wait for it + MOVEI TTYICH + SETZM CH] + .LOSE %LSSYS + TRZ CH,%TXSFT + CAIN CH," ;if it is a space, + .IOT TTYICH,CH ;flush it + MOVEI T,[ASCIZ / +/] + PUSHJ P,OUTSTR + JRST INTX + +CHAINT: .CALL [ SETZ + SIXBIT /WHYINT/ + MOVEI CHAICH + MOVEM T + MOVEM S + SETZM TT] + .LOSE %LSSYS + CAIE T,%WYCHA ;chaosnet? + JRST WHYARP ;no, see what arpanet up to + TRNE F,FRARPA ;just in case + .VALUE + HLRES TT ;get number of packets + JUMPLE TT,INTX ;go away if no input there + CAIN S,%CSOPN ;still open? + JRST CHAIN1 ;yes, go see if input there + CAIE S,%CSCLS ;if closed, + CAIN S,%CSLOS ;or los + SOJG TT,CHAIN1 ;if there are data packets as well, handle them + JRST NOCONN ;else tell user what happened and die + +WHYARP: CAIN T,%WYNET + TRNN F,FRARPA + .VALUE + HRRZS S ;get state + CAIN S,%NSOPN ;spurious? + JRST INTX + CAIE S,%NSCLI + CAIN S,%NSINP ;some input waiting? + TLZA TT,-1 ;get number of bytes waiting + JRST NOCONN ;no, bad state, figure out why + JUMPE TT,INTX + SETZ E, ;nothing in from network + SKIPA N,TT ;must count number left though +CHAIN1: SETZB E,N ;no chars in from network yet + MOVEI O,BUFSIZ ;or to be output to tty + MOVE BP,[440700,,TTYBUF] +CHAINL: PUSHJ P,NETI ;get character from network + JRST CHAINX ;none waiting, return + CAIN CH,IAC ;command of some sort? + JRST DOIAC ;yes, handle it + SKIPN TT,STATE ;saw iac or something last time? + JRST CHAINO ;no, ordinary character to be output + JUMPL TT,@WILTAB-WILL(TT) ;saw iac will before, handle this option + CAIL CH,WILL ;character after an iac, start of option? + CAILE CH,DONT + JRST CHAINF ;of range, flush it + HRROM CH,STATE ;yes, remember what was deferred + JRST CHAINL ;and go handle next character + +;CHAINO: TRNN CH,200 ;ignore random old telnet characters +; PUSHJ P,TTYO ;type out ordinary character +; JRST CHAINL + +CHAINO: TRNE CH,200 ;IGNORE RANDOM OLD TELNET CHARACTERS + JRST CHAINL + MOVE TT,ESTATE + TRNN TT,ES%CAR ;DO WE EVEN CARE ABOUT TRANSLATING ESCAPES + JRST [PUSHJ P,TTYO ;NOPE, JUST OUTPUT STUFF + JRST CHAINL] + TRNN TT,ES%EPD ;ESCAPE PENDING? + JRST [CAIE CH,33 ;DO WE HAVE AN ESCAPE CHARACTER + JRST ENORM ;HANDLE AS NORMAL CHARACTER + MOVE TT,ESTATE + TRO TT,ES%EPD + MOVEM TT,ESTATE + JRST CHAINL] ;ALL DONE FOR NOW + TRNN TT,ES%ABS ;ASB CURSOR POSITIONING IN PROGRESS? + JRST HESC ;NOPE PROCESS OTHER POSSIBLE ESCAPES + TRNN TT,ES%ASF ;ABS POS, RECEIVED YPOS? + JRST [TRO TT,ES%ASF + MOVEM TT,ESTATE ;NOPE, THIS IS IT, SO SET FLAG + SUBI CH,30 ;VT52 HAS 40 ADDED TO POSITION + MOVEM CH,EYPOS ;SAVE IT AWAY + JRST CHAINL] ;AND DONE FOR NOW + SUBI CH,30 ;THIS IS XPOS, SUBTRACE THE 40 ADDED FOR VT52 + MOVEM CH,EXPOS ;SAVE IT AWAY + MOVEI TT,ES%CAR ;CLEAR PENDING FLAGS (IE ONLY CARE FLAG REMAINS) + MOVEM TT,ESTATE + MOVEI CH,20 ;DO ^P CODE 20 = ^P + PUSHJ P,TTYO ;OUTPUT IT + MOVEI CH,"H ;HORIZONTAL FIRST + PUSHJ P,TTYO + MOVE CH,EXPOS ;GET REMEMBERED XPOS + PUSHJ P,TTYO ;OUTPUT IT + MOVEI CH,20 ;SECOND ^P CODE FOR VERTICAL POSITION + PUSHJ P,TTYO + MOVEI CH,"V + PUSHJ P,TTYO + MOVE CH,EYPOS ;GET SAVED YPOS + PUSHJ P,TTYO + JRST CHAINL + +ENORM: CAIN CH,177 ;IGNORE RUBOUTS (THEY ARE PADS) + JRST CHAINL + CAIN CH,000 ;NULLS ARE ALSO PADS + JRST CHAINL + CAIE CH,40 ;OUTPUTING A SPACE + JRST [ CAIN CH,^P ;IS IT ^P? + PUSHJ P,[ + PUSHJ P,TTYO ;OUTPUT THE ^P + MOVEI CH,"P ;"AND ALSO OUTPUT A P TO SEND A ^P + POPJ P,] + PUSHJ P,TTYO + JRST CHAINL] + MOVEI CH,20 ;YEP, CLEAR CHAR POSITION BEFORE ADVANCING CURSOR + PUSHJ P,TTYO + MOVEI CH,"K + PUSHJ P,TTYO + MOVEI CH,40 + PUSHJ P,TTYO + JRST CHAINL + +HESC: CAIN CH,"Y ;ABSOLUTE CURSOR POS + JRST [MOVE TT,ESTATE + TRO TT,ES%ABS + MOVEM TT,ESTATE + JRST CHAINL] + PUSHJ P,FCHAR ;TRANSLATE TO ^P CODE CHAR + JRST CHAINL ;IGNORE UNKOWN CODES FOR NOW + JRST DHESC ;OUTPUT ^P CODE AND BACK TO MAIN LOOP + +;; FCHAR: TRANSLATE TELERAY 1061 ESCAPE CODE TO ^P CODE +;; ACCEPTS INPUT IN CH, PUTS RESULT IN CH OR -1 IF NOT FOUND +;; SKIP RETURN INDICATES SUCCESS ALSO + +FCHAR: MOVSI T,-NCTAB +FCHARL: HLRZ TT,CTAB(T) + CAIE TT,(CH) + AOBJN T,FCHARL + JUMPGE T,[SETO CH, + POPJ P,] + HRRZ CH,CTAB(T) + AOS (P) + POPJ P, + +CTAB: "A,,"U + "B,,"D + "C,,"F + "H,,"T + "J,,"E + "K,,"L + "L,,"[ + "P,,"^ + "Q,,"_ + "M,,"\ + +NCTAB==.-CTAB + +;; BRANCH HERE WITH ^P CODE LETTER IN CH, HERE WE OUTPUT ^P CODE AND CONTINUE +;; BACK TO MAIN LOOP +;; ALSO CLEARS THE ESCAPE PENDING FLAG + +DHESC: MOVE TT,ESTATE + TRZ TT,ES%EPD + MOVEM TT,ESTATE + PUSH P,CH + MOVEI CH,20 ;CONTROL P + PUSHJ P,TTYO + POP P,CH + PUSHJ P,TTYO + JRST CHAINL + +CHAINF: SETZM STATE ;flush this char, but reset state + JRST CHAINL + +CHAINX: PUSHJ P,TTYS ;send any buffered tty output + JRST INTX + +DOIAC: SKIPE STATE ;iac in middle of command + JRST CHAINF ;probably quoted, just flush it since doesnt print + MOVEM CH,STATE ;state now deferred iac + AOSE OLDTLP ;this the first we have heard of new telnet? + JRST CHAINL ;no, go get more + MOVE T,[440800,,[.BYTE 8 ? IAC ? DO ? ECHO ? IAC ? DO ? SUPRGA]] + MOVEI TT,6 +SNDOPT: .CALL [ SETZ + SIXBIT /SIOT/ + MOVEI CHAOCH + T + SETZ TT] + .LOSE %LSSYS + .NETS CHAOCH, ;request ordinary state + JRST CHAINL + +WILTAB: DOWILL + DOWONT + DODO + DODONT + +DOWILL: CAIN CH,ECHO ;will echo + JRST WILECO ;yes, fine + CAIN CH,SUPRGA ;will supress go-ahead + JRST CHAINF ;we requested it, so ok + CAIN CH,TRNBIN ;losing tenex? +SNDDO: TROA CH,DO_8 ;yes, just respond do always +SNDDNT: IORI CH,DONT_8 +DOOPT: LSH CH,4+8 + IOR CH,[.BYTE 8 ? IAC ? 0 ? 0] + MOVE T,[440800,,CH] + MOVEI TT,3 + SETZM STATE + JRST SNDOPT + +DODO: CAIN CH,ECHO ;do echo + JRST DOECO ;oh well, guess we have to + CAIN CH,TRNBIN + JRST [ SETOM TBINP + JRST SNDWIL] + CAIN CH,TIMMRK + JRST SNDWIL + +SNDWIL: TROA CH,WILL_8 ;yes, always say will +SNDWNT: IORI CH,WONT_8 + JRST DOOPT + +DOWONT: CAIN CH,ECHO ;wont echo? + JRST DOECO ;ok, we will + CAIN CH,TRNBIN ;wont transmit binary + JRST SNDDNT + JRST CHAINF ;flush everything else + +DODONT: CAIN CH,ECHO + JRST WILECO + CAIN CH,TRNBIN + JRST [ SETZM TBINP + JRST SNDWNT] + JRST CHAINF + +WILECO: SKIPN ECHOP ;is he echoing now? + JRST CHAINF ;yes, not a change of state, ignore it + SETZM ECHOP + JRST SNDDO ;else ok for him to echo now + +DOECO: SKIPE ECHOP ;are we echoing now? + JRST CHAINF ;yes, not a change of state, ignore + SETOM ECHOP + JRST SNDWIL ;else we will have to do it + +NETI0: TRNE F,FRARPA + JRST NTIARP + JUMPN N,CPOPJ ;didnt get a full bufferful last time, no more input waiting + MOVE T,[440800,,NETBUF] + MOVEI N,BUFSIZ ;try to get whole buffer full + .CALL [ SETZ + SIXBIT /SIOT/ + MOVSI 10 ;no hang mode + MOVEI CHAICH + T + SETZ N] + .LOSE %LSSYS + MOVEI E,BUFSIZ + SUBI E,(N) ;get number of bytes we really got + JUMPE E,CPOPJ ;didnt get any + MOVE D,[440800,,NETBUF] +NETI: SOJL E,NETI0 + ILDB CH,D + JRST POPJ1 + +NTIARP: JUMPLE N,CPOPJ ;got it all last time + CAIG N,BUFSIZ ;get as much as possible + SKIPA E,N ;can get all in one bufferful + MOVEI E,BUFSIZ + SUBI N,(E) + MOVE T,[440800,,NETBUF] + MOVEI TT,(E) ;number of bytes to get + .CALL [ SETZ + SIXBIT /SIOT/ + MOVEI CHAICH + T + SETZ TT] + .LOSE %LSSYS + MOVE D,[440800,,NETBUF] + JRST NETI + +TTYO: IDPB CH,BP ;store away this character + SOJG O,CPOPJ ;still room for more + PUSHJ P,TTYS ;else send it out to tty + MOVEI O,BUFSIZ + MOVE BP,[440700,,TTYBUF] + POPJ P, + +TTYS: MOVEI TT,BUFSIZ + SUBI TT,(O) ;get number of character put in buffer + JUMPE TT,CPOPJ ;none put in + MOVE T,[440700,,TTYBUF] + .CALL [ SETZ + SIXBIT /SIOT/ + MOVS TTOMOD + MOVEI TTYOCH + T + SETZ TT] + .LOSE %LSSYS + POPJ P, + + subttl LSRCHK and LSRWRN -- see if user is loser + +;;; This checks to see if the loser is an AI or LCS member or on a +;;; winners list. If not, a warning net-hopping message is printed +;;; and the program offers to kill itself off. + +;;; The winner-p check has been extracted so that if at some point in +;;; the future this program is modified to check if it's running from +;;; a CRTSTY, those people may not be warned. + +;;; skips unless the luser should be warned. +lsrchk: pushj p,winchk ;are they a winner? + skipa ;nope + jrst popj1 ;yea; so skip + ;; check to see if they're in loser table + move t,[-loslen,,lostab] + ;; winchk left xuname in tt +lsloop: camn tt,(t) + popj p, ;loser -> don't skip + aobjn t,lsloop + ;; check inquir entry + movei a,filech + move b,[-lsrpgs,,hstpag];map lsr where host table will be + pushj p,lsrtns"lsrmap + jrst lsrlos ;something wrong; print loser message + .suset [.rxuname,,b] ;xuname into b + pushj p,lsrtns"lsrunm ;find our entry in database + jrst lsrlos ;no inquir entry; must be loser + .close filech, ;close lsr file + movei a,lsrtns"i$grp ;we want to check group + pushj p,lsrtns"lsritm + popj p, ;none means guest + ildb a,a ;get field + caie a,"A ;"A" means AI lab + cain a,"L ;"L" means LCS + jrst dvwiaa + caie a,"V + cain a,"Z + jrst dvwiaa + caie a,"C + popj p, ;they're not a lab member +dvwiaa: movei a,lsrtns"i$rel ;get relation + pushj p,lsrtns"lsritm + popj p, ;none means loser + ildb a,a ;get field + caie a,"X ;some losers put AX when they mean XA + ;; These names are for NETWRK +popj1: aos (p) ;otherwise skip +cpopj: popj p, ;when returning + +lsrlos: .close filech, ;close lsr file + popj p, ;don't skip + +;;; Skip means these people know what they're doing; don't hassle them +winchk: .suset [.rxuname,,tt] + move t,[-winlen,,wintab] +wnloop: camn tt,(t) + jrst popj1 ;winner; skip + aobjn t,wnloop + popj p, + +;;; these people aren't hassled +wintab: irp x,,[gumby,alan,cstacy,cent,dph,oaf,jnc,jtw,sra] + sixbit/x/ +termin +winlen==.-wintab + +;;; These people are always hassled +lostab: irp x,,[tk,hewitt,rms] + sixbit/x/ +termin +loslen==.-lostab + +;;; warn loser that net-hopping is a waste of the machine +lsrwrn: movei t,[asciz/ +Using this machine to access another will needlessly +drain resources, slowing the system both for you and other users. +You'll probably get better response by connecting directly. + +You should not do this unless you have a good reason to do so. If +you have any questions, typing :LUSER to DDT will request a system +programmer to assist you. + +Are you sure you want to net-hop?/] + pushj p,outstr + .call [ setz ? sixbit /iot/ + movsi %tinwt ;do wait for this char + movei ttyich ? setzm a] + .lose %lssys + caie a,"y + cain a,"Y + popj p, ;it was a Y + caie a,40 ;maybe it was a space? + .logout 1, + popj p, + +OUTSTR: HRLI T,440700 ;type asciz string out of T +OUTST1: ILDB CH,T + JUMPE CH,CPOPJ + .IOT TTYOCH,CH + JRST OUTST1 + +OUTSIX: SETZ T, ;type sixbit out of TT + LSHC T,6 + ADDI T,40 + .IOT TTYOCH,T + JUMPE TT,CPOPJ + JRST OUTSIX + +PUTCHR: .IOT TTYOCH,T + POPJ P, + +$$ARPA==1 ;support both arpa and chaos nets +$$CHAOS==1 +$$HOSTNM==1 +$$SYMLOOK==1 +$$ICP==1 +$$HSTSIX==1 +$$ANALYZE==1 +$$HST3==1 + +.INSRT SYSTEM;CHSDEF > +.INSRT SYSENG;NETWRK > + +;;; Inquir database hackery +;;; don't assemble useless gubbage +$$ulnm==0 ;don't care about last name +$$ulnp==0 ;even if abbreviated +$$unam==0 ;no never! +lsrpgs==20 ;number of pages for lsrtab + +.insrt syseng;lsrtns > + +PAT": PATCH": BLOCK 50 + +VARIAB ? CONSTA + +HSTPAG==<.+1777>/2000 ;place to map in the hosts2 file + +END GO