;-*-Midas-*- Title SENDER - Greneral Porpoise Message SENDER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; WARNING: This program is the result of years of totally ;;; spurious growth. Whose fault this is I have no ;;; doubt, but I'm not pointing claws. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Added direct SMTP feature and fixed host parser -- Feb 85, CSTACY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .SYMTAB 2300.,3500. ;Give us this day our extra symbols. ;;; ;;; ACs ;;; FLAGS=0 ;One-bit flag repository. A=1 ;General porpoise (needed by libs, also) B=2 C=3 D=4 E=5 F=6 G=7 H=10 TL=11 ;Text Length \ Your HL=12 ;Header Length / Msg TBP=13 ;Byte Pointer into text buffer. T=14 ;Temporaries... ephemeral. TT=15 T3=16 P=17 ;Bourgeoisie PDL pointer ;;; ;;; Mnemnonics ;;; Call= CallRet== Return= ;;; ;;; I/O channels and other Half-Kills ;;; TTYi==1 TTYo==2 TTYop==3 ;VTS SENDi==4 ;.TEMP.; sends file MSGi==5 MSGo==6 MAILo==7 ;.MAIL.;MAIL > file ABRi==10 ;Fast abbreviations file HOSTi==11 ;Used to map in HOSTS3 database DUMPo==12 ;For M-Dump-to-file INSi==13 ;For M-Insert-from-file TEMPc==14 PIXi==15 ;For RWK's (and personal) picture library PDLen==40 KILen==16.*24. ;Kill buffer size HeadL==20 ;# words for header gTBlen==40 ;gTTY Buffer length HostIn==100 ;Where to map in the HOSTS3 stuff Hosts3=HostIn*2000 OWNNAM: 0 ;Ptr to own host name. TCPP: 0 ;-1 if TCP is available ;;; ;;; True/False flags residing in FLAGS ;;; %Winner==1 ;Thou art God! %Fast==2 ;Short header. %Send==4 ;A Send, not a Reply. %Shit==10 ;An OhShit %Chaos==20 ;Site is on Chaosnet. %Arpa==40 ;Site is on Arpanet. %Multi==100 ;Polygramme mode. %Quiet==200 ;No Header atoll. %Echo==400 ;Echoing input? %Meta==1000 ;This is a REAL Meta-char. %Quote==2000 ;Next input char is to be quoted. %Alpha==4000 ;Flag for hacking ^W properly. %Via==10000 ;Include a really-from in header. %Mail==20000 ;Mail this message (not QSEND). %Comment==40000 ;Include a comment with this mail. %Knowho==100000 ;We've seen who this is for. %TTYiok==200000 ;%PIATY got-back-TTY interrupt enabled. %Key==400000 ;We want a keyword! %Pict==1,,0 ;This keyword for a PICT, not an SA/RA type. %CanEOL==2,,0 ;This TTY can do Erase-EOL. %SFopen==4,,0 ;Is your Sends File open? %HostMap==10,,0 ;Is the HOSTS3 database mapped in? %BP==20,,0 ;Use D as BP in SixGet, not a channel. %SubDDT==40,,0 ;Are we under DDT? %xSflag==100,,0 ;:SEND no JCL: Already tried to "To:"? %WUonly==200,,0 ;Last chars typed were ^W's/^U's? %gotName==400,,0 ;Set by BPNAME: Found a . %gotSite==1000,,0 ;Likewise for a . %Sixed==2000,,0 ;We already have the SIXBIT uname. %Loser==4000,,0 ;You are a barbarian and will pay dearly. %CLI==10000,,0 ;For Chaosnet, send how? %ITS==40000,,0 ;The current site is an ITS? %Force==100000,,0 ;Force the network to be Chaos, if dualistic. %Flush==200000,,0 ;Allow ^S to flush output. %NoMore==400000,,0 ;EOtext reached in BParse. SMTP==31 ;SMTP service's TCP port number. ;;; ;;; Macros ;;; Define SYSCAL op,args .Call [Setz ? Sixbit /op/ ? args ((Setz))] Termin Define SKIPTRUE bit ;Skip if bit True IFN <-1,,0>&bit,[Tlnn FLAGS,bit_-18.] .ELSE [Trnn FLAGS,bit] Termin Define SKIPFALSE bit IFN <-1,,0>&bit,[Tlne FLAGS,bit_-18.] .ELSE [Trne FLAGS,bit] Termin Define TRUE bits ;Set bit(s) to True IFN <-1,,0>&,[ IFN <0,,-1>&,[Tdo FLAGS,[bits]] .ELSE [Tlo FLAGS,_-18.] ] .ELSE [Tro FLAGS,] Termin Define FALSE bits IFN <-1,,0>&,[ IFN <0,,-1>&,[Tdz FLAGS,[bits]] .ELSE [Tlz FLAGS,_-18.] ] .ELSE [Trz FLAGS,] Termin Define TOGGLE bit IFN <-1,,0>&bit,[Tlc FLAGS,bit_-18.] .ELSE [Trc FLAGS,bit] Termin Define TYPE chnl=TTYo,&string Movei T,<.Length string> Move TT,[440700,,[Ascii string]] Syscal SIOT,[%Climm,,chnl ? TT ? T] .Lose %LsSys Termin Define HText &string Addi HL,<.Length string> Movei TT,[Asciz string] Call HTextr Termin Define DBP ac ;Decrement Byte Pointer (7bit) Add ac,[70000,,] Skipge ac Sub ac,[430000,,1] Termin Define UPCASE ac ;Uppercase the char in ac Cail ac,"a Caile ac,"z Skipa Trz ac,40 Termin Define 6TYPE chnl=TTYo,loc Movei A,chnl Move T,loc Call 6TYPER Termin Define TYPUNM chnl=TTYo Movei A,chnl Call TUNAME Termin Define ASK &string Movei T,[Ascii string] Movei TT,<.Length string> Call gTTY Termin ;;; ;;; Library respiration. ;;; $$ALLNET==1 $$HST3==1 $$CHAOS==1 $$ARPA==1 $$TCP==1 $$HSTMAP==1 $$HOSTNUM==1 $$HSTSIX==1 $$SYMLOOK==1 $$CONNECT==1 $$ERRHAN==1 .INSRT SYSENG;NETWRK > .INSRT SYSTEM;CHSDEF > ;;; ;;; Random storage ;;; TSint: Loc 42 ;Set up for Got-Back-TTY and ^S-flush -TSintL,,TSint ;interrupts. Loc TSint P %PiATY ? 0 ? %PiATY ? 0 ? GotBak 0 ? 1_TTYi ? 0 ? 0 ? Flush TSintL==.-TSint Patch: Block 20 -1 Debug: 0 Versio: .FNAM2 ;Sixbit version# of this source Ends: Ascii /th/ ;One's digit of 0, Ascii /st/ ;1 Ascii /nd/ ;2 Ascii /rd/ ;3 Ascii /th/ ;4 thru 9. FNames: Asciz /WinnerFastSendOhShit!ChaosArpaMultiQuietEchoMetaQuoteAlphaViaMailCommentKnowhoTTYi-okKeyPictCan-EOLSF-openHostMapBPSub-DDTxsFlagWU-onlygotNamegotSiteSixedLoserCLICOMSATITSForceFlushNo-More/ OKFolk: Sixbit /GREN/ Sixbit /GRENNY/ Sixbit /GRUPP/ Sixbit /MLY/ Sixbit /BANDY/ Sixbit /CSTACY/ Block 5 ;Space for patching in more. 0 ;0 marks end-of-list. InPage: Death ;Current page writing text into. Buffer: BUFbot ;Start of buffer. BufLen: 0 ;Capacity (in chars) of buffer. LKBuf: 0 ;# chars of killed text peKBuf: 440700,,Funnys ;Next byte after END of kbuf psKBuf: 0 ;Will point to start of killed text KilBuf: Block KILen TCPBPT: 440700,,TCPBUF ;TCP/SMTP reply buffer. TCPBUF: BLOCK 1000 Funnys: ^C,,SayEnd ;Special characters at main input loop. ^D,,Quit ^G,,Quit ^J,,Input ^L,,ReType ^P,,MSend0 ^Q,,Quote ^R,,Ctrl$R ^T,,Ctrl$T ^U,,Ctrl$U ;* ^W,,Ctrl$W ;* ^Y,,Yank ^[,,Meta 177,,Delete ;* nFunny==.-Funnys Metas: ^C,,Meta$S ;Meta-commands. ^M,,Metae ^L,,Metal "0,,pFlags ;Print flag word "A,,Meta$A "B,,Meta$B "C,,Meta$C "D,,Meta$D "F,,Meta$F "H,,Meta$H "I,,Meta$I "J,,Meta$J "K,,Meta$K "M,,Meta$M "N,,Meta$N "P,,MSend "Q,,Meta$Q "R,,Meta$R "S,,Meta$S "T,,Meta$T "V,,Meta$V "W,,Meta$W "Z,,Meta$Z "?,,Meta$H nMetas==.-Metas PDList: -PDLen,,. Block PDLen pText: 440700,,BUFbot pHead: 440700,,Head Head: Block HeadL Uname: 0 ;Your... Jname: 0 XJname: 0 Xuname: 0 Hsname: 0 Msname: 0 Site: 0 ;AI|DM|ML|MC|MD|MX (from SSTATU) Site6: 0 ;AI|DM|ML|MC|MD|MX|KS|KL (from HSTSIX, more or less) ITSnam: 0 ;Ascii of Site State1: Block 20 State2: Block 20 NamLen: 0 ;Length of . NamEnd: 0 ;Character that ended a spec. Connam: Ascii /SEND / ;For Chaosnet sending (CONnect NAMe) HName: Block 10 ;His Name (who this message is for). pHname: 440700,,HName ;Previous two MUST BE IN THAT ORDER!! pOHNam: 440700,,OHName OHName: Block 10 pH6Nam: 440600,,H6Name H6Name: 0 ;6bit version of His Name (for ITS) OHSNum: 0 ;Old one of below... HSNum: 0 ;Host # (network,,site) HShort: 0 ;Unique SIXBIT hostname. pHSite: 440700,,HSite HSite: Block 10 ;The site of the Sender pHTSit: 440700,,HTSite ;Temporary (until the site is verified). HTSite: Block 10 nChars: 0 ;Number of chars you typed to gTTY pTTYb: 440700,,TTYbuf TTYbuf: Block gTBlen 0 pTTYp: 0 ;Pointer to prompt. TTYpl: 0 ;Length of prompt. pMSbuf: 440700,,MSBuff MSBuff: Block gTBlen ;Multi-Send Buffer (Essentially a To:-list) 0 lFName: 0 pFName: 440700,,FName FName: Block gTBlen 0 Device: 0 ;Returned by gFile Sname: 0 FN1: 0 FN2: 0 Key: 0 ;Keyword for Abbreviated stuff. nSFPs: 0 ;Number of successful Sends-File parses. MSenBP: 0 ;BP to string given to a multi-send. nthMSN: 0 ;Which name in said string we just parsed. TEcho: 0 ;Instruction to either echo what's in T, or not. (XCT'd) EndChr: 0 ;eoJCL as gotten by BParse. BPlen: 0 ;#chars in name&site read by BParse. DupOK: 0 ;OK to have duplicate matches in SFparse? BigHed: 0 ;Message has a 1-line header (apparantly) EOF: -1,,^C ;Marks End-Of-File. CLI: 0 ;Will be SIXBIT device name. OCLI: 0 ;Old above FukDev: Sixbit /DSK/ ;For misend, foreign device or DSK FukNam: 0 ;Same sort of thing, um. SENDIR: SIXBIT /.TEMP./ ;Dir where sends file is kept. DMSDIR: SIXBIT /COMMON/ ;Same, but on DM. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; The program begins, finally. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Begin: Move P,PDList ;Standard Incantations; Syscal OPEN,[%Clbit,,.uai\%TIFUL ;Chapter I, %Climm,,TTYi [Sixbit /TTY/]] .Lose %LsFil Call EchoOn Syscal OPEN,[%Clbit,,.uao ;Verses I %Climm,,TTYo [Sixbit /TTY/]] .Lose %LsFil Syscal OPEN,[%Clbit,,.uao\%TJDIS ;and II. %Climm,,TTYop [Sixbit /TTY/]] .Lose %LsFil Syscal TTYVAR,[%Climm,,TTYo ['TTYOPT] %Clout,,T] .Lose %LsSys Tlne T,%TOERS True %CanEOL Began: Setz TL, ;Initialize some pivotal stuff. Move TBP,pText .Suset [.rOPTION,,A] Tlo A,OptInt ;New-style interrupt handling Tlne A,OptDDT True %SubDDT .Suset [-8,,[.sOPTION,,A .sMASK,,[%PiATY] .sMSK2,,[1_TTYi] .rUNAME,,Uname .rXUNAME,,XUname .rHSNAME,,HSname .rSNAME,,MSname .rXJNAME,,XJname]] Setz A, WeOkP: Skipn B,OKFolk(A) Jrst Create Came B,XUname Aoja A,WeOKp True %Winner Create: Call AddPage ;Make 1st buffer page. Syscal SSTATU,[Repeat 5,%Clout,,A %Clout,,T] ;Our site. .Lose %LsSys ; Camn T,[Sixbit /DM/] ;DM keeps it's sends files ; Jrst [Move TT,DMSdir ;in a funny place... ; Movem TT,SenDir ; Movsi A,(Ascii /DM/) ; Jrst Tasp] Camn T,[Sixbit /MC/] Movsi A,(Ascii /MC/) Camn T,[Sixbit /AI/] Movsi A,(Ascii /AI/) Camn T,[Sixbit /ML/] Movsi A,(Ascii /ML/) Camn T,[Sixbit /MD/] Movsi A,(Ascii /MD/) Camn T,[Sixbit /MX/] Movsi A,(Ascii /MX/) Tasp: Movem A,ITSnam Movem T,Site .Break 12,[..rJCL,,BufBot] ;Inhale JCL. JPass1: Move A,XJname Came A,[Sixbit /S/] ;Vanilla send. Camn A,[Sixbit /SEND/] Jrst [True %Send Jrst xSend] Camn A,[Sixbit /SNED/] ;Common typo for SEND Jrst [True %Send Jrst xSend] Came A,['CHSEND] Camn A,['LMSEND] ;LispMachine send (actually Jrst [True %Send+%Force ;generic Chaosnet). Jrst xSend] Camn A,[Sixbit /SA/] ;Send Abbreviated. Jrst [True %Send+%Fast+%Key Jrst xSend] Came A,[Sixbit /FSEND/] ;Fast send (short header). Camn A,[Sixbit /FS/] Jrst [True %Send+%Fast Jrst xSend] Came A,[Sixbit /SSEND/] ;Silent send (potentially fascist). Camn A,[Sixbit /SS/] Jrst [SkipTrue %Winner Jrst Refuse True %Quiet Jrst xSend] Camn A,[Sixbit /PIX/] ;Send a "picture". Jrst [SkipTrue %Winner Jrst Refuse True %Quiet+%Key+%Pict Jrst xSend] Came A,[Sixbit /SHIT/] Camn A,[Sixbit /OHSHIT/] Jrst [True %Shit+%Fast Jrst OhShit] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; All other jnames (REPLY, FREPLY, RA, etc) are Replying ;;; to someone, so parse the sends file for the @ ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Deter: Call SFPars Jrst [Call gTo ;Confused!, so get name@site manually. Jrst Done ;^G or ^D Jrst Done ;They just hit , so quit. SkipTrue %gotSite Call NoSite True %Send+%Knowho Jrst .+1] JPass2: Move A,XJname Came A,[Sixbit /REPLY/] ;The vanilla reply. Camn A,[Sixbit /RP/] Jrst JCLp Camn A,[Sixbit /R/] Jrst JCLp True %Fast ;Everything else gets short header. Came A,['FREPLY] ;Fast reply. Camn A,[Sixbit /FR/] Jrst JCLp Came A,[Sixbit /RA/] Jrst Abbrev ; (Jname not recognized, so take it as key.) Move D,pText ;Reply Abbreviated. Skipe @Buffer Jrst doRA gKey: Ask "Keyword: " Jrst Done Jrst Done ;They don't wanna play. Move A,pTTYb doRA: True %BP Call SixGet ;Inhale keyword. Jrst gKey ; Illiterate scum! Try again... Movem B,Key SkipTrue %Pict Jrst Abbrev gPict: Syscal OPEN,[%Clbit,,.uai %Climm,,PIXi [Sixbit /DSK/] Key [Sixbit /PICT/] HSName] Skipa Jrst rPict Move T,HSname Camn T,MSname Jrst RWKpix Syscal OPEN,[%Clbit,,.uai %Climm,,PIXi [Sixbit /DSK/] Key [Sixbit /PICT/] MSName] Skipa Jrst rPict RWKpix: Move T,Site Came T,[Sixbit /MC/] Jrst NoPict Syscal OPEN,[%Clbit,,.uai %Climm,,PIXi [Sixbit /AR9/] Key [Sixbit /PICT/] [Sixbit /RWK/]] Skipa Jrst rPict NoPict: Type TTYop,"A(Faded?)" Jrst gKey rPict: Move TBP,pText Syscal FILLEN,[%Climm,,PIXi %Clout,,TL] .Lose %LsSys .Iot PIXi,T Caie T,177 Idpb T,TBP Cain T,177 Soj TL, Move TT,TL Syscal SIOT,[%Climm,,PIXi ? TBP ? TT] .Lose %LsSys Jrst DoIt ABBREV: Syscal OPEN,[%Clbit,,.uai %Climm,,ABRi [Sixbit /DSK/] XUname ['_ABBR_] HSname] Jrst Lit ;No abbreviations file, so take the keyword Movei A,ABRi ;as text. False %BP GETABR: Call SixGet Jrst Lit ;No match anywhere, so take jname as text. Camn B,Key Jrst JaAbr SAText: .Iot ABRi,T ;This keyword didn't match, so skip text Camn T,EOF Jrst Lit Caie T,^_ Jrst SAText .Iot ABRi,T ;Skip CR/LF .Iot ABRi,T Jrst GETABR JaAbr: .Iot ABRi,T ;We found a match - Move accompanying text into buffer. Caie T,^_ Camn T,EOF Jrst DoIt Idpb T,TBP Aoja TL,JaAbr Lit: Move A,XJname Skipe Key Move A,Key Setz B, Rotc A,6 Addi B,40 Idpb B,TBP ;1st character is uppercase, Lit2: Setz B, Rotc A,6 Aoj TL, Addi B,40 ;Rest are lowercase Cail B,"A Caile B,"Z Skipa Addi B,"a-"A Idpb B,TBP Jumpn A,Lit2 Aoja TL,DoIt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Now we start to take on the actual text of the message. From ;;; JCL, if it's there. If no JCL or JCL ends in , then we'll ;;; also take input from the terminal. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; JCLp: Skipn @Buffer Jrst [SkipTrue %Knowho ;No JCL. Jrst RTnc Type TTYop,"AMsg:A" True %TTYiok Jrst Input] ToEnd: Ildb A,TBP Caie A,^_ Cain A,^C Jrst DoIt ;JCL ends in ^C, so no TTY input Aoj TL, Cain A,^M Jrst addLF ;Does end with ^M, so add the matching ^J and go... MOVE B,A Jrst ToEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; :OHSHIT - try and make up for a mis-send ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OhShit: Call SFpars Jrst Done Skipn A,H6Name ;Local user? Jrst [Type ,"(Can't get at " TypUnm Type ,"'s sends file)" Jrst Done] ; No, so sends not saved. Movem A,FukNam Movei A,State1 Call Saves ;Save state Shit0: Call SMsg ;Skip that message Call SFpars Jrst Done Skipe A,H6Name Came A,State1+S$H6NAME Skipa Jrst Shit0 Movei A,State2 Call Saves ;Save state again .Close SENDi, ;Don't need your old one any more. Move B,State1+S$HSHORT Came B,Site6 Movem B,FukDev Syscal OPEN,[%Clbit,,.UAI %CLIMM,,SENDi FukDev ? FukNam ? [Sixbit /SENDS/] ? SENDIR] Jrst [Type ,"(Can't open " 6Type ,FukNam Type ,"'s sends file)" Jrst Done] Setom DupOK ;OK to have duplicates Skipa NextAk: Call SMsg FindAk: Call SFpars ;This is on other person's file now! Jrst [Type ,"(Can't find your message in " 6Type ,FukNam Type ,"'s sends file)" Jrst Done] Skipe A,H6Name Came A,Uname Jrst NextAk Move A,HShort Came A,Site6 Jrst NextAk SkpHed: Setz TL, ;Reset body pointer Move TBP,pText Skipn BigHed Jrst [.Iot SENDi,A ;Skip the space Jrst CpyMsg] SkpHe0: .Iot SENDi,A Cain A,^J Jrst CpyMsg Caie A,^_ Camn A,EOF Jrst [Type ,"(EOS before EOH in other sends file!)" Jrst Done] Jrst SkpHe0 CpyMsg: .Iot SENDi,A Caie A,^_ Camn A,EOF Jrst Yahoo Idpb A,TBP Aoja TL,CpyMsg YaHoo: Ldb A,TBP Cain A,"] Subi TL,1 Movei A,State2 Call Gets ;Get state Type ,"[To " TypUnm True %Knowho Call Forin ;Try to send it off... Jrst Cant Movei A,State1 Call Gets Setz TL, Move TBP,pText Move A,[440700,,[Asciz "Uff da, misend!"]] Call MsgBod True %Knowho Call Forin Jfcl Type ," instead of " 6Type ,H6Name .Iot TTYo,["]] Jrst Done ;Won! MsgBod: Ildb T,A Jumpe T,CPopj Idpb T,TBP Aoja TL,MsgBod ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; :xSEND ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; xSend: True %Knowho Move G,pText Call BParse Jrst xSask ;Bad name@site specified SkipTrue %gotName Jrst xSask ;No name specified, so ask. SkipTrue %gotSite Call NoSite ;Default the site to this one. SkipFalse %Key Jrst [Move A,G ;Next thing in JCL should be a key. Jrst doRA] Move B,EndChr Caie B,^_ Cain B,^C Jrst SayEnd ;Hmf - name@site^C. Oh well, just send it. Cain B,^M Jrst iInput ;name@site. Go get TTY input... savJCL: Ildb A,G Caie A,^C ;else, copy rest of JCL into message buffer. Cain A,^_ Jrst SayEnd Idpb A,TBP Aoj TL, Caie A,^M Jrst savJCL Jrst addLF xSask: Call gTo Jrst Done ;^G or ^D Jrst [SkipFalse %xSflag Jrst Done ;Just hit . 2nd time? Yeh, so quit. True %xSflag Call SFPars ;No, only 1st time. Make like REPLY now... Jrst xSask ;Ug, barfed. Go back and ask again. Typunm False %Send Jrst xSmsg] SkipTrue %gotSite Call NoSite xSmsg: SkipFalse %Key Jrst gKey Type TTYop,"AMsg:A" Jrst iInput ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Here we are at the actual TTY input stuff... what fun ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; addLF: Movei A,^J ;Make sure the CR ending JCL turns into CRLF Idpb A,TBP Aoj TL, iInput: True %TTYiok ;During input, Got-Back-TTY interrupt is enabled. Jrst Input ReIn: Type TTYop,"A-------A" Skipe TL Call ReLine INPUT: .IOT TTYi,A ;Input a char from TTY Caie A,%TXTOP\"H ;[HELP]? Jrst NoHelp True %Flush TYPE ," Welcome to the wonderful world of SENDER (Version " 6TYPE ,Versio Type ,") Control codes accepted here at Main Input Level are: ^C - End input and send message. ^D, ^G - Flush program. ^L - Clear screen then re-type entire text. ^Q - Quote next character. ^P - Polygramme send (variant of ^C). ^R - Re-type line. ^T - Transpose last two characters. ^U - Kill line. ^W - Delete back word. ^Y - Yank back last text killed by sequential ^W's and ^U's. - Enter sub-command level. - Delete back character. Everything else is self-inserting. [HELP] and ^L work at all input levels. You can enter Escape commands using the Meta key if you like: Meta-W is the same as the sequence W. Note that Meta-S is an alternate way to end input and send the message. See :INFO SENDER for complete documentation." False %Flush Jrst ReIn NoHelp: Andi A,%TXASC+%TXCTL+%TXMTA ;Only ASCII/Control/Meta bits matter. Trne A,%TXCTL Jrst [Trz A,%TXCTL ;If Control, turn off that bit... Cain A,^[ Jrst SayEnd ;Silly AI hackers like C-Alt to end input. UpCase A ;C-c => C-C Cail A,40 Trz A,100 ;...and make into ASCII-type control. Jrst .+1] Trne A,%TXMTA Jrst [Trz A,%TXMTA ;If Meta-x, interpret as x True %Meta Jrst Meta2] SkipFalse %Quote Jrst SaveIn Movsi B,-nFunny ;# specially handled characters DoFuny: Hlrz T,Funnys(B) Hrrz TT,Funnys(B) Camn A,T Jrst (TT) Aobjn B,DoFuny SaveIn: False %WUonly+%Quote Cail A,40 Cain A,177 .Iot TTYo,A ;Echo special non-echoed characters manually. Save2: Caml TL,BufLen ;Room to save this character? Call AddPage ; No, increase message buffer. Aoj TL, Idpb A,TBP Caie A,^M ;Make CR into CRLF Jrst INPUT Movei A,^J Jrst Save2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Now that we have the text, see about actually sending it! ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SayEnd: Type ," " DoIt: Call FORIN ;Send it off... Skipa ; Failed Jrst Win ; Won! Cant: TYPE ," (Can't)" SkipTrue %Multi Jrst oMeta MLoss: .Iot TTYop,[^P] .Iot TTYop,["A] Skipn T,nthMSN Jrst MLoss1 .Iot TTYo,[" ] .Iot TTYo,["(] Call 10Type Move T,nthMSN Call Ending .Iot TTYo,[")] MLoss1: Type ," To: " Typunm Jrst oMeta Win: SkipTrue %Multi Jrst Done NMSend: Aos nthMSN Move G,MSenBP Call BParse Jrst [Skipn BPlen Jrst Done Movem G,MSenBP Type TTYop,"ABad:" Jrst MLoss] Movem G,MSenBP Jrst DoIt FORIN: False %TTYiok Move D,pHead Setz HL, SkipTrue %ITS ;CLIing? Jrst MakeH ;No, so net send, hack up header now. MOVE C,[SIXBIT /CLI/] ;For ITS, use CLI, or xxCLI MOVE A,HShort ;depending on which site. CAMN A,Site6 JRST For2 LSH C,-2*6 Ior C,A For2: Movem C,CLI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Well, now we go about making the header to the message. We ;;; then open CLI, siot out the header, siot the message, and close ;;; up, as quickly as possible. Don't want to leave some poor chap ;;; hanging there.... ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MakeH: SkipFalse %Quiet Jrst SendIt SkipTrue %CLI Jrst ChaosH SkipFalse %Fast Jrst FastH HEADER: SkipFalse %Multi Jrst [HText "ÛPolygramme" Jrst H1] SkipFalse %Send Jrst [HText "ÛMessage" Jrst H1] HText "ÛReply" H1: HText " from " Move T,Uname Call H6Type HTEXT " at " MOVE TT,OWNNAM CALL HTEXTS Jrst ViaH ChaosH: Move T,Uname Call H6Type Movei T,"@ Idpb T,D Aoj HL, Move T,Site Call H6Type ViaH: SkipFalse %Via Jrst [HText " (really from " Add HL,lFname Move T,lFName Move TT,pFName Call HTextr HText ") " Jrst Time] HText " " TIME: MOVEI E,"a ;(As in "a.m.") .RLPDTM A, Idivi A,<60.*60.*24.> Idivi B,60. Idivi B,60. CAIL B,12. ;Is it before 12 o'clock? MOVEI E,"p ; No, so it's pm, not am. Skipn B ;Is it 0 o'clock? MOVEI B,12. ; Yes, make it 12 (midnight) Caile B,12. ;Do we need to change to human time? (g 12 o'c?) Subi B,12. Move T,B IDivi T,10. Jumpn T,[Addi T,"0 Idpb T,D Aoja HL,.+1] Addi TT,"0 Idpb TT,D Movei T,": Idpb T,D Move T,C Idivi T,10. Addi T,"0 Idpb T,D ;M Addi TT,"0 Idpb TT,D ;M Idpb E,D ;a/p Movei T,"m Idpb T,D SkipFalse %CLI Jrst [Movei T,"] Idpb T,D Aoja HL,.+1] Addi HL,6. ; H : M M x m Jrst SendIt Fasth: Movei T,177 Idpb T,D Movei T,"[ Idpb T,D Addi HL,2 Move T,UNAME Call H6Type MOVE T,Site6 CAME T,HShort JRST [Movei T,"@ Idpb T,D Move T,Site Call H6Type Aoja HL,.+1] SkipFalse %Via Jrst [HText " (" Add HL,lFName Move T,lFName Move TT,pFName Call HTextr Movei T,") Idpb T,D Aoja HL,.+1] HText ": " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header all constructed. Open up CLI (or whatever you do) ;;; then out she goes.... ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SendIt: SkipFalse %ARPA ;Sending via ARPAnet? JRST TCPIT SkipFalse %CLI ;Or CLI device? Jrst Make6Name LMSend: Movei A,MSGi ;No, must be via Chaosnet. Move B,HSNum Movei C,Conname Movei D,5 Call NETWRK"CHACON Return Jrst OutHdr Make6N: SkipTrue %Sixed ;Turn the ASCII name into a SIXBIT Call 7to6 ;one, for ITS CLI-style sending. SYSCAL OPEN,[%CLBIT,,.UAO %CLIMM,,MSGo CLI ? H6Name ['HACTRN]] Return OutHdr: SkipFalse %Quiet Jrst [.Iot MSGo,[177] Jrst OUText] Move T,pHead Move TT,HL Syscal SIOT,[%Climm,,MSGo ? T ? TT] Return OUText: Jumpe TL,Finish SkipTrue %CLI Jrst Chaost SkipFalse %Fast Jrst Out2 .Iot MSGo,[^M] .Iot MSGo,[^J] Out2: Move T,pText Move TT,TL Syscal SIOT,[%Climm,,MSGo ? T ? TT] Return SkipFalse %Fast .Iot MSGo,["]] Jrst Finish Chaost: Move A,pText .Iot MSGo,[200\^M] Ch1: Ildb T,A Cain T,^M Jrst [.Iot MSGo,[215] Ildb T,A ;Skip the ^J Soja TL,Ch2] .Iot MSGo,T Ch2: Sojn TL,Ch1 .Nets MSGo, Movsi T,(.Byte 8 ? %CoEOF ? 0) ;Send an EOF packet. Movem T,NETWRK"PKTBUF Syscal PKTIOT,[%Climm,,MSGo %Climm,,NETWRK"PKTBUF] .Lose %LsSys Syscal FINISH,[%Climm,,MSGo] Jfcl FINISH: .CLOSE MSGo, ;The sooner this is closed, the better SkipFalse %Knowho Jrst Popj1 .Iot TTYo,[" ] .Iot TTYo,["[] TYPUNM .Iot TTYo,["]] Jrst Popj1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; We are going to send directly via TCP/SMTP without going ;;; through the mailer. If problems are encountered before we give ;;; the recipient name to the foreign host, we send using COMSAT. ;;; If the fellow is not online, we just fail. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TCPIT: SKIPN TCPP ;If TCP unavailable ; JRST [ FALSE %MAIL ? JRST COMSAT ] JRST [ TYPE TTYOP,"AUnable to reach the Internet!" RETURN ] PUSH P,FLAGS MOVE B,HSNUM ;Host to send to. MOVEI A,MSGI ;MSGO is output channel. MOVEI C,SMTP ;Connecting to SMTP server. CALL NETWRK"TCPCON JRST TCPLUZ CALL TCPRES ;Let him say hello. JRST TCPLUZ TYPE MSGO,"HELO " ;Let's say hello back. HRLZI A,440700 ;ASCIZ bp to own host name. HRR A,OWNNAM TCPIT1: ILDB T,A JUMPE T,TCPIT2 .IOT MSGO,T JRST TCPIT1 TCPIT2: .IOT MSGO,[^M] .IOT MSGO,[^J] CALL TCPRES ;Get response code in B. JRST TCPLUZ ; Unable to even say hello ?!? SKIPFALSE %QUIET JRST TCPIT3 TYPE MSGO,"SEND FROM:<" ;Give server the Return Path. MOVEI A,MSGO MOVE T,UNAME CALL 6TYPER .IOT MSGO,["@] MOVE T,SITE CALL 6TYPER .IOT MSGO,[">] .IOT MSGO,[^M] .IOT MSGO,[^J] CALL TCPRES ;If accepted, proceed. CAIA JRST TCPIT4 TCPIT3: TYPE MSGO,"SEND FROM:<>" ;Else try Dummy return path. .IOT MSGO,[^M] .IOT MSGO,[^J] CALL TCPRES ;All servers should accept dummy rtp. JRST TCPLUZ TCPIT4: TYPE MSGO,"RCPT TO:<" TYPUNM MSGO ;Inform mail server who message is for. .IOT MSGO,[">] .IOT MSGO,[^M] .IOT MSGO,[^J] TCPIT5: CALL TCPRES ;See if user online, etc. JRST [ TYPE TTYOP,"A" ; No, we're losing. HRRZ T,TCPBPT ; Show user foreign host response. CALL ATYPE ; Take failure return (Can't). POP P,FLAGS RETURN ] TYPE MSGO,"DATA" .IOT MSGO,[^M] .IOT MSGO,[^J] CALL TCPRES ;Still winning? JRST TCPLUZ SKIPFALSE %QUIET JRST TCPIT7 TCPIT6: MOVE T,PHEAD MOVE TT,HL ;Send header if any. SYSCAL SIOT,[%CLIMM,,MSGO ? T ? TT] JRST TCPLUZ TCPIT7: JUMPE TL,TCPFIN .IOT MSGO,[^M] .IOT MSGO,[^J] MOVE T,PTEXT MOVE TT,TL ;Send the body. SYSCAL SIOT,[%CLIMM,,MSGO ? T ? TT] JRST TCPLUZ TCPFIN: .IOT MSGO,[^M] ;Send terminator sequence. .IOT MSGO,[^J] .IOT MSGO,[".] .IOT MSGO,[^M] .IOT MSGO,[^J] .NETS MSGO, TYPE MSGO,"BYE" .IOT MSGO,[^M] .IOT MSGO,[^J] .NETS MSGO, POP P,FLAGS JRST FINISH ;Finish up like for Chaosnet. TCPLUZ: POP P,FLAGS TYPE TTYOP,"A" ;We're losing. HRRZ T,TCPBPT ;Show user foreign host response. CALL ATYPE CAIN B,502. ;If "Command Not Implemented" RETURN ; Can't anyway. TYPE TTYOP,"ATry sending via COMSAT?" CALL YORN ;Else maybe use the mailer. RETURN FALSE %MAIL ;Try sending. JRST COMSAT ;;; TCPRES - Wait for SMTP response on MSGI channel. ;;; Returns with reply code in B; bp to reply string in A. ;;; Non-skip indicates negative (temp or perm error) reply. ;;; Skip returns if positive response. ;;; (Smashes only A,B,T,TT.) TCPRES: PUSH P,C ;Don't smash things. SETZ TCPBUF MOVE A,[TCPBUF,,TCPBUF+1] BLT A,TCPBUF+777 .NETS MSGO, TCPIN: MOVE A,TCPBPT ;Gonna fill A net buffer with response. SETO B, ;Gonna get a reply code in B. TCPIN1: .IOT MSGI,T ;Get character. JUMPL T,TCPIN7 ;Check for EOF. CAIN T,177 ;Ignore random rubouts. JRST TCPIN1 CAIN T,377 ;Ignore new-TELNET commands JRST [ .IOT MSGI,T ; (gobble gobble) JRST TCPIN1 ] CAIL T,"0 ;Maybe part of reply code? CAILE T,"9 ;Maybe start of reply string? JRST [CAIN T,"- ;Continuation lines start this way. HRLI B,(SETZ) ; Remember to gobble extra reply. JRST TCPIN2 ] SKIPGE B TDZA B,B IMULI B,10. ADDI B,-"0(T) ;Accumulate reply code in B. IDPB T,A ;Stuff reply code. JRST TCPIN1 ;Go back for more. TCPIN2: IDPB T,A ;Stuff reply string. TCPIN3: .IOT MSGI,T ;Get another char. JUMPL T,TCPIN7 ;Check for EOF. CAIN T,^J ;If saw LF JRST TCPIN7 ; Must be EOL. JRST TCPIN2 ;Else go back for more. TCPIN7: JUMPL B,TCPRE1 MOVEI T,0 ;Else tie off buffer. IDPB T,A ;Done inputting response. SKIPE DEBUG JRST [ TYPE TTYOP,"AReply " HRRZ T,B CALL 10TYPE TYPE TTYOP,".A" HRRZ T,TCPBPT CALL ATYPE JRST .+1 ] TCPRE1: JUMPGE B,TCPRE2 ;If multi-line reply HRRZ B,B JRST TCPIN2 ; go gobble additional reply string. TCPRE2: CAIGE B,400. ;If temp or perm error AOS -1(P) ; do not succeed. POP P,C RETURN ;Return reply code in B. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; We are going to send using QSend and COMSAT, instead of trying ;;; to do CLI, which would *probably* fail, since this person isn't ;;; at an ITS. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; COMSAT: SYSCAL OPEN,[%CLBIT,,.UAO %CLIMM,,MAILo [SIXBIT /DSK/] ;Open .MAIL.;MAIL > [SIXBIT /MAIL/] ;for output. [SIXBIT />/] ['.MAIL.]] .LOSE %LSFIL TYPE MAILo,"FROM-PROGRAM:SENDER FROM-XUNAME:" 6TYPE MAILo,XUNAME Type MAILo," FROM-UNAME:" 6TYPE MAILo,UNAME SkipFalse %Via Jrst [Type MAILo," AUTHOR:" Move T,lFName Move TT,pFName Syscal SIOT,[%Climm,,MAILo ? TT ? T] .Lose %LsSys Jrst .+1] TYPE MAILo," RCPT:(" TYPUNM MAILo SkipTrue %Mail ;"HEADER-FORCE:NET" taken out JRST [TYPE MAILo," (R-MODE-SEND 0)" JRST .+1] TYPE MAILo,") TEXT;-1 " SkipFalse %Comment Jrst [Type MAIlo,"[This was a failing send] ------- " Jrst .+1] Movei A,MAILo Call TMesg .CLOSE MAILo, JRST WIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Assorted errors, and What Became Of Them ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Refuse: Type TTYop,"ANo." ;;; ;;;;; The Big Snuff ;;; Done: Skipe Debug .Value .Break 16,144000 ;Self-Destruct ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; - - - S U B R O U T I N E S - - - ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Popj1: Aos (P) CPopj: Return PutChr: .Iot TTYo,T Return AType: Hrli T,440700 AT1: Ildb TT,T Skipn TT Return .Iot TTYo,TT Jrst AT1 10Type: Setz T3, TenT1: Idivi T,10. Push P,TT Aoj T3, Jumpn T,TenT1 TenT2: Pop P,T Addi T,60 .Iot TTYo,T Sojn T3,TenT2 Return Ending: IDivi T,10. ;TT is 1's digit. Caie T,1 Cail TT,4 Movei TT,4 Movei T,Ends(TT) Call AType Return 6TYPER: SETZ TT, ;Type the SIXBIT word in T on channel c(A) ROTC T,6 ADDI TT,40 SYSCAL IOT,[A ? TT] .LOSE %LSSYS JUMPN T,6TYPER Return FylTyp: Movei A,TTYo ;Type the ITS-style filespec contained in Move T,Device ;Device/sname/FN1/FN2 in that order. Call 6Typer .Iot TTYo,[":] Move T,Sname Call 6Typer .Iot TTYo,[";] Move T,FN1 Call 6Typer .Iot TTYo,[" ] Move T,FN2 Call 6Typer Return H6Type: Setz TT, ;Like 6TYPER, but accumulated the text in the Rotc T,6 ;header buffer (and counts the characters). Addi TT,40 Idpb TT,D Aoj HL, Jumpn T,H6Type Return HTextr: Hrli TT,440700 ;Put the text at (TT) into header buffer HT1: Ildb T3,TT Jumpe T3,CPopj Idpb T3,D Jrst HT1 HTEXTS: HRLI TT,440700 ;Put the text at (TT) into header buffer HTS1: ILDB T3,TT ; And count into HL like H6TYPE JUMPE T3,CPOPJ IDPB T3,D AOJA HL,HTS1 SWORD: .IOT SENDi,TT ;Skips past the next "word" in your sends file, CAIE TT,^_ ;a word being any number of chars followed by CAMN TT,EOF ;a space. JRST Dunno CAIE TT,40 JRST SWORD Return SLINE: .Iot SENDi,TT ;Likewise, but skips a line (any chars followed CAIE TT,^_ ;by a LF (presumably, there's a CR before that CAMN TT,EOF ;LF, but not crucial)). JRST Dunno CAIE TT,^J JRST SLINE Return SMsg: .Iot SENDi,TT ;Again, likewise: any chars followed by the EOM Camn TT,EOF ;character, ^_. There *should* be a CRLF after Jrst [Type TTYop,"End-Of-File!A" Return] Caie TT,^_ Jrst SMsg .Iot SENDi,TT ;CR .Iot SENDi,TT ;LF Return gName: MOVE A,pHName Setz B, gName1: .IOT SENDi,T Skipe T Camn T,EOF Jrst gName2 CAIE T,40 CAIN T,"@ Jrst gName2 Cain T,": Jrst gName2 IDPB T,A Aoja B,gName1 gName2: Jumpe B,CPopj Movem B,NamLen Movem T,NamEnd Setz TT, Idpb TT,A Call 7to6 Move T,NamEnd Jrst Popj1 gSite: MOVE A,pHSite Setz B, gSite1: .IOT SENDi,T Upcase T Cail T,"A ; is composed of either "A" - "Z", Caile T,"Z Skipa Jrst gSitec Cail T,"0 ;"0" - "9", Caile T,"9 Skipa Jrst gSitec Caie T,"- ;or "-". Jrst gSite2 gSitec: IDPB T,A Aoja B,gSite1 gSite2: Jumpe B,CPopj Move TT,HSite Camn TT,[Ascii /CHAOS/] Jrst [Call SWord ;Handle "TTY message from chaosnet site" screw. Jrst gSite] Movem T,EndChr Setz TT, Idpb TT,A Movei H,HSite Call SCheck ;Make sure this is a valid site. Return Move T,EndChr Jrst Popj1 TUNAME: Skipg T,NamLen ;Type the current @ on Jrst [Skipn T,H6Name Return Call 6Typer Jrst TUNAM0] MOVE TT,pHname ;channel c(A). Syscal SIOT,[A ? TT ? T] .LOSE %LSSys TUNAM0: SkipFalse %ITS Jrst [Move TT,HShort Camn TT,Site6 Return Syscal IOT,[A ? ["@]] .Lose %LsSys Move T,HShort Call 6Typer Return] SYSCAL IOT,[A ? ["@]] .LOSE %LSSys Move T,pHSite TSite2: Ildb TT,T Skipn TT Return Syscal IOT,[A ? TT] .Lose %LsSys Jrst TSite2 TMESG: True %Flush MOVE T,TL ;Type body of message on channel c(A) Move TT,pText TMesg2: Syscal SIOT,[A ? TT ? T] .LOSE %LSSYS False %Flush Return AddPag: Aos InPage ;Add page to text buffer, and inc Syscal CORBLK,[%Climm,,%Cbprv ;the #chars we can maximally store %Climm,,%Jself ;in it. InPage %Climm,,%Jsnew] .Lose %LsSys Movei T,2000*5 Addm T,BufLen Return DELCHR: LDB A,TBP ;Delete the last character in the text buffer. Soj TL, DBP TBP Cain A,^J Jrst [.Iot TTYop,[^P] ;When you delete a Line-Feed, do .Iot TTYop,["U] ;a Line-Starve, Ldb A,TBP ;and take care of the preceeding CR. Jrst DelChr] Caie A,^I Cain A,^H Jrst [Call CLine ;On and , don't try and Call ReLine ;be clever (hairy), just retype line. Return] Cain A,^M ;When you rub the CR, the (now new) line Jrst [Call ReLine ;is retyped. Return] Erase: Caie A,177 Caige A,40 Skipa Jrst bi .IOT TTYop,[^P] .IOT TTYop,T3 bi: .IOT TTYop,[^P] .IOT TTYop,T3 Return ReLine: Skipn TL ;Retype the current line on the text (after clearing Return ;the line, natch). Move B,TL top6: Jumpe B,bot6 Ldb T,TBP Cain T,^J Jrst bot6 Soj B, DBP TBP Jrst top6 bot6: Move C,TL Sub C,B Syscal SIOT,[%Climm,,TTYo ? TBP ? C] .Lose %LsSys Return CLine: Type TTYop,"HL" Return YorN: Type ," (Y/N) " ;-1 = Yes, 0 = No .Iot TTYi,T UpCase T Cain T,"N Jrst [Xct TEcho .Iot TTYo,["o] Return] Cain T,"Y Jrst [Xct TEcho .Iot TTYo,["e] .Iot TTYo,["s] Jrst Popj1] .Iot TTYo,[^G] Jrst YorN ;Get SIXBIT word from either the BP in A, SixGet: Setz B, ;or channel c(A). B has the word, and T Move TT,[440600,,B] ;the delimiting char. 6Loop: SkipTrue %BP Jrst [Syscal IOT,[A ? T] .Lose %LsSys Jrst .+2] Ildb T,A Caie T,40 Cain T,^I Jrst [Jumpe B,6Loop ;Leading whitespace ignored, Jrst Popj1] ;trailing delimits. Caie T,^M Cain T,^C Jrst 6Test Caie T,^_ Camn T,EOF Jrst 6Test Caie T,": Cain T,"; Jrst 6Test Caie T,"@ Cain T,"% Jrst 6Test Skipe T Cain T,"] Jrst 6Test Tlnn TT,770000 Jrst 6Loop UpCase T Subi T,40 Idpb T,TT Jrst 6Loop 6Test: Skipe B Aos (P) Return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Parse an ASCII string for @. Sets appropriate ;;; bits depending on what was found. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BParse: False %gotSite+%gotName+%NoMore Setzm BPlen Move TT,pHName Setz B, BP1: Ildb A,G Jumpe A,BP1.1 Caie A,^C Cain A,^_ Jrst BP1.1 Cain A,^M Jrst BP1.1 Caie A,40 Cain A,^I Jrst [Jumpe B,BP1 ;Ignore leading whitespace, but delimit Jrst BP2] ;on trailing. Caie A,"@ Cain A,"% Jrst BP2 Cain A,", Jrst BP2 Idpb A,TT Aoja B,BP1 BP1.1: True %NoMore BP2: Movem A,EndChr ;Save delimiting character Jumpe B,BP3 ;No given. Movem B,NamLen ;Save name-length, Movem B,BPlen ;and accumulate total# chars. Setz T, Idpb T,TT True %gotName False %Sixed Caie A,"@ Cain A,"% ;If it's @ or %, then keep reading, Skipa ;and parse the site, else return win-mode. Jrst Popj1 BP3: SkipFalse %NoMore Jrst BP7 Move TT,pHTSit Setz C, BP5: Ildb A,G Jumpe A,BP6 Caie A,^C Cain A,^M Jrst BP6 Caie A,40 Cain A,^_ Jrst BP6 UpCase A Idpb A,TT Aoja C,BP5 BP6: Movem A,EndChr Addm C,BPlen Jumpe C,BP7 Setz T, Idpb T,TT Movei H,HTSite Call SCheck Return True %gotSite BP7: Skipn BPlen Return Jrst Popj1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Assorted TTY input routines ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gTo: Ask "To: " Return ;^G or ^D Jrst Popj1 ;No input Move G,pTTYb Call BParse Jrst gTo Popj2: Aos (P) Jrst Popj1 gFile: Ask "File: " Return ;^G or ^D Return ;No input Setzm FN1 Movsi T,'DSK ;Set defaults to DSK:hsname;^X > Movem T,Device Movsi TT,(Sixbit />/) Movem TT,FN2 Move T3,HSname Movem T3,Sname True %BP Move A,pTTYb gFile1: Call SixGet Jrst gFile2 Cain T,": Jrst [Movem B,Device Jrst gFile1] Cain T,"; Jrst [Movem B,Sname Jrst gFile1] Movei T3,FN1 Skipe FN1 Movei T3,FN2 Movem B,(T3) Jumpn T,gFile1 gFile2: Skipe FN1 Jrst Popj1 Move T,Xuname Movem T,FN1 Jrst Popj1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Does terminal input into buffer, with minor editing. T has ;;; the address of the ASCIZ string which is to be a prompt (on ;;; a new line). Skips if there was input, with #chars in nChars. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gTTY: Setzm nChars Move E,pTTYb Hrli T,440700 Movem T,pTTYp ;Make the header pointer. Movem TT,TTYpl ;Save length of prompt. gTTH: .Iot TTYop,[^P] ;Type the prompt & any text. .Iot TTYop,["A] gTTHa: Move T,TTYpl Move TT,pTTYp Syscal SIOT,[%Climm,,TTYo ? TT ? T] .Lose %LsSys Move T,nChars Move TT,pTTYb Syscal SIOT,[%Climm,,TTYo ? TT ? T] .Lose %LsSys gTT: .Iot TTYi,T Cain T,%TXTOP\"H Jrst [Type ," Type in an ASCII string delimited by . Special characters are ^L (refresh screen), (delete back character), ^R (reprint line), ^U (flush current input but read more), and ^D or ^G (cancel input) " Jrst gTTH] Andi T,%TXASC Cain T,^U Jrst [Setzm nChars Call Cline Jrst gTTHa] Caie T,^D Cain T,^G Return Cain T,^M Jrst [Setz T, Idpb T,E Skipe nChars Aos (P) Jrst Popj1] Cain T,^L Jrst [.Iot TTYop,[^P] .Iot TTYop,["C] Jrst gTTH] Cain T,^R Jrst [Call CLine Jrst gTTH] Cain T,177 Jrst [Skipn nChars Jrst gTT Sos nChars Setz T, DPB T,E ;Write a 0 over this char DBP E ;and back up to last one .Iot TTYop,[^P] .Iot TTYop,["X] Jrst gTT] Caige T,40 ;No control chars Jrst [.Iot TTYo,[^G] Jrst gTT] Xct TEcho Aos TT,nChars Caile TT,gTBlen*5 Jrst [Sos nChars ;Buffer full .Iot TTYo,[^G] .Iot TTYop,[^P] .Iot TTYop,["X] Jrst gTT] Idpb T,E Jrst gTT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Interrupt handlers ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GotBak: SkipTrue %TTYiok Jrst Dismis Syscal DISMIS,[P ? %Climm,,ReIn] .Lose Flush: Movei T3,TTYi .ITYIC T3, .Lose Cain T3,^S SkipTrue %Flush Jrst Dismis .Reset TTYo, Syscal TTYFLS,[%Clbit,,1 ? %Climm,,TTYi] .Lose Type ,"Flushed" Aos (P) Aos (P) Dismis: Syscal DISMIS,[P] .Lose ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sends File Parsing heuristics. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SFPars: SkipTrue %SFopen Jrst [SYSCAL OPEN,[%CLBIT,,.UAI %CLIMM,,SENDi [SIXBIT /DSK/] ;Open your sends file UNAME [SIXBIT /SENDS/] SENDIR] JRST CLIunm ;If no sends file, no sends! True %SFopen Setzm nSFPs Jrst .+1] Setom BigHed ;Assume 1-line header SFP1: .IOT SENDi,C Camn C,EOF Jrst CLIunm Caig C,40 ;Ignore leading funny chars. Jrst SFP1 Movei A,SENDi Call SixGet Jrst CLIunm ;;; ;;; B has the word, C has the first char of word, T has last. ;;; MATCH: Caie C,"[ ;[Message/Reply ... ] JRST MATCH1 CAIE T,"@ ;[uname: ... ] or [uname@site: ... ] CAIN T,": JRST [MOVEM B,H6Name Setzm BigHed ;No header really Move A,T Call 6to7 ;More special dispensation. CAIE A,"@ Jrst SamSit Call gSite Jrst CLIunm Jrst eoSFP] Came B,[Sixbit "HERE"] Camn B,[Sixbit "THERE"] Jrst NxtMsg Call SixGet Jrst CLIunm CAME B,[Sixbit /FROM/] Jrst CLIunm Call gName Jrst CLIunm Move T,HName Camn T,[Ascii /MACSY/] Jrst [Call SWORD ;Goddam Macsyma sends! Call gName Jrst CLIunm Jrst SamSit] Came T,[Ascii /a/] Camn T,[Ascii /A/] ;Sigh... Jrst [Call gName Jrst CLIunm Jrst .+1] Move T,NamEnd Caie T,"@ Call Sword Call gSite Jrst CLIunm Jrst eoSFP MATCH1: CAIE C,"M ;"M"essage from... JRST MATCH2 CAMN B,['ESSAGE] JRST [Call SWORD ;"from" Call gName Jrst CLIunm Caie T,"@ Jrst SamSit Call gSite Jrst CLIunm Jrst eoSFP] JRST CLIUNM MATCH2: CAIE C,"T ;"T"TY message from... JRST MATCH3 CAME B,[Sixbit /TY/] JRST CLIUNM QSEND: Call SWORD ;"message" Call SWORD ;"from" CALL gName ;We assume site comes first. Jrst CLIunm CAIN T,"@ JRST [Call gSite ;We win Jrst CLIunm Jrst eoSFP] MOVE A,pHName ;We lose. MOVE B,pHSite Move TT,NamLen QSend1: ILDB T,A Jumpe T,QSend2 IDPB T,B Sojn TT,QSend1 QSend2: Move T,HSite Camn T,[Ascii /chaos/] Jrst [Call SWORD Call gSite Jrst CLIunm Jrst QSend3] Movei H,HSite Call SCheck Jrst CLIunm QSend3: Call Sline QSend4: Call gName Jrst CLIunm Cain T,": ;Maybe header? Jrst [Move T,H6Name ;Yes. Came T,[Sixbit "FROM"] ;This from line? Jrst QSend3 ; No, so skip it and get another Jrst QSend4] ;Yes, so get the real uname now. Caie T,"@ ;Should be username@site Jrst Dunno Jrst eoSFP MATCH3: CAIN C,"Y ;You have mail... CAME B,[Sixbit /OU/] JRST CLIUNM NxtMsg: Call SMsg Jrst SFP1 CLIUNM: Skipe nSFPs Jrst Dunno SkipTrue %SubDDT Jrst [Type ,"Not DDT!" Return] .VALUE [ASCIZ ":DDTSYM CLIUNM/ 1/ 1Qî :VP "] Skipe A CAMN A,UNAME ;If from you, or no uname, - Eh, Dunno! JRST DUNNO Movem A,H6Name Call 6to7 SamSit: Call NoSite eoSFP: SkipTrue %Sixed Call 7to6 Skipe DupOK Jrst eoSFP1 Move T,H6Name Camn T,Uname Jrst [Move T,HShort ;If same uname Camn T,Site6 ;at same site Jrst NxtMsg ; then skip it. Jrst .+1] eoSFP1: Aos nSFPs Jrst Popj1 Dunno: Type TTYop,"A(Author?)" Return NoSite: Movei H,ITSnam Call SCheck Jrst [Type TTYop,"A(This-site lossage!)" Jrst Done] Return 6to7: True %Sixed Move T,H6Name Move T3,pHName Setzm NamLen 6to7.1: Setz TT, Rotc T,6 Addi TT,40 Idpb TT,T3 Aos NamLen Jumpn T,6to7.1 Return 7to6: True %Sixed Move T,pHName Move TT,pH6Name Move T3,NamLen Setzm H6Name HN6.2: Ildb A,T UpCase A Subi A,40 Idpb A,TT Sojn T3,HN6.2 Return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Important stuff: Looks up an ascii string to make sure ;;; it's a valid site, and then sets all sorts of funny bits, ;;; like %Arpa and %Chaos (relfecting what nets the site is, ;;; on, and so forth. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCHECK: SKIPFALSE %HOSTMAP ;Map in host table if needed. JRST SCHE10 MOVEI A,HOSTIN MOVEI B,HOSTI CALL NETWRK"HSTMAP JRST [TYPE ," Failed to get host table!" JRST DONE] MOVE A,[NETWRK"NW%ARP] ;Prefer our ARPAnet address. CALL NETWRK"OWNHST ;Find out who we are. JRST [ MOVE A,[NETWRK"NW%CHS] ; Use CHAOSnet if necessary. CALL NETWRK"OWNHST ; Find out who we are. .LOSE ; Must be on one or the other! SETZM TCPP ; No TCP available. JRST SCHE07 ] SETOM TCPP ;TCP is available. SCHE07: MOVE B,A ;Channel to host table. CALL NETWRK"HSTSIX .LOSE ; Find our own name in SIXBIT TDC A,[SIXBIT /MIT- /] ; It should start "MIT-" TDNE A,[SIXBIT /____ /] ; Does it? SKIPA A,SITE ; Nope, use SITE, might be good enough LSH A,24. ; Yep, use last two characters MOVEM A,SITE6 ; Stash it away! CALL NETWRK"HSTSRC ;Find our own host name. .LOSE ; We are not in the host table? HRRZM A,OWNNAM ;Stash ptr to own host name. TRUE %HOSTMAP ;Host table now mapped in. SCHE10: MOVE A,H ;Get ptr to rcpt host name. CALL NETWRK"HSTLOOK ;Try looking it up. JRST [ MOVEI T,[ASCIZ "AAmbiguous host name: "] SKIPN B MOVEI T,[ASCIZ "AUnknown host: "] CALL ATYPE MOVE T,H CALL ATYPE RETURN ] FALSE %ARPA+%CHAOS ;Find which network it is on. CAMN TT,[NETWRK"NW%CHS] JRST [ TRUE %CHAOS FALSE %ARPA JRST SCZ ] ;Prefer Chaosnet. FALSE %CHAOS TRUE %ARPA ;Else say it is on the "ARPAnet". JUMPE B,SCZ ;Maybe that's all there is. HLRZ C,(B) ;Else look up via SITE table entry. HRRZ C,HOSTS3+NETWRK"STRADR(C) ;CDR of SITE is fist ADDRESS entry. SETZ B, ;B is best addr seen so far. SCHE20: MOVE A,HOSTS3(C) ;Get a host addr. NETWRK"GETNET TT,A ;Find which network it is on. CAMN TT,[NETWRK"NW%CHS] JRST [ TRUE %CHAOS FALSE %ARPA JRST SCZ ] ;Prefer Chaosnet. CAME TT,[NETWRK"NW%AI] ;Check for best Internet address. CAMN TT,[NETWRK"NW%LCS] MOVE B,A ;AI and LCS are close by. CAME TT,[NETWRK"NW%ARP] ;ARPAnet is close by. CAMN TT,[NETWRK"NW%MIL] ;MILNET is just as close. MOVE B,A SCHE29: HRRZ C,HOSTS3+NETWRK"ADRCDR(C) ;Find next ADDRESS entry. JUMPN C,SCHE20 ;Check out remaining addrs. SKIPE B ;If best bet, use it, else default. MOVE A,B SCZ: MOVEM A,HSNUM ;Rememer host addr. CALL NETWRK"HSTSIX ;Get SIXBIT abbr. for host. MOVE A,SIXBIT "" ; Might not be one. MOVEM A,HSHORT ;Remember it. MOVEI A,HSITE MOVE B,HSNUM CALL NETWRK"HSTSRC ;Now back again to a real (full) name. MOVEI A,HTSITE HRLI A,440700 MOVE B,PHSITE SC3: ILDB T,A IDPB T,B JUMPN T,SC3 FCHEK: SKIPTRUE %CHAOS ;If demanded Chaosnet, make sure it's SKIPTRUE %FORCE ;possible. SKIPA JRST [TYPE TTYOP,"A" MOVEI T,HSITE CALL ATYPE TYPE TTYOP," is not on CHAOSnet)AMsg:A" FALSE %FORCE JRST .+1] SC4: False %CLI+%ITS Move T,HShort Came T,[Sixbit /MIT-MC/] Camn T,[Sixbit /MIT-AI/] Jrst anITS Came T,[Sixbit /MIT-KS/] Camn T,[Sixbit /MIT-KL/] Jrst anITS Came T,[Sixbit /MIT-MX/] Camn T,[Sixbit /MIT-MD/] Jrst anITS Came T,[Sixbit /MIT-ML/] Camn T,[Sixbit /MIT-DM/] Jrst anITS SkipTrue %Chaos True %ARPA Jrst Popj1 anITS: True %ITS+%CLI SkipFalse %Force False %CLI Lsh T,4*6 ;Turn MIT-AI into AI Movem T,HShort Movsi TT,'CLI Came T,Site6 Jrst [Lsh TT,-2*6 Ior TT,HShort Jrst .+1] Movem TT,CLI Jrst Popj1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Echo fiddling. Control characters never echo, tho uncontrol ;;; sometimes do not (like at Meta-command level) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EchoOn: SkipFalse %Echo Return ;Echo already on. True %Echo Move T,[024242,,424242] ;Echo everything but control chars. Move TT,[030202,,020242] Syscal TTYSET,[%Climm,,TTYi ? T ? TT] .Lose %LsSys Movsi T,(JFCL) ;nop Movem T,TEcho Return EchoOf: SkipTrue %Echo Return ;Echo already off. False %Echo Move T,[020202,,020202] ;Echo nothing. Move TT,[030202,,020202] Syscal TTYSET,[%Climm,,TTYi ? T ? TT] .Lose %LsSys Move T,[.Iot TTYo,T] Movem T,TEcho Return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Special character handlers for main input ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Quote: .Iot TTYo,["_] .Iot TTYop,[^P] .Iot TTYop,["B] True %Quote Jrst Input Ctrl$W: Jumpe TL,Input ;Delete back word. Movei T3,"X SkipFalse %CanEOL Movei T3,"B False %Alpha Move E,TL wtop: Jumpe TL,EndCW Ldb B,TBP UpCase B Cail B,"A Caile B,"Z Jrst [SkipFalse %Alpha ;If this char is NON-alpha, and Jrst EndCW ;we've already deleted an ALPHA, Jrst .+2] ;then time to stop. True %Alpha Call DelChr Jrst wtop EndCW: SkipTrue %CanEOL Jrst ToKBuf .Iot TTYop,[^P] .Iot TTYop,["L] ToKBuf: SkipTrue %WUonly ;Save snuffed text in kill buffer. Jrst [Move T,peKBuf Setzm LKbuf True %WUonly Jrst .+2] Move T,psKBuf Sub E,TL ;E has # chars deleted Movei TT,KILen*5 Sub TT,LKBuf ;# chars we can save Camle E,TT Move E,TT Addm E,LKBuf Move B,TBP ;Save current BP Move TT,E Idivi TT,5 Sub T,TT Jumpe T3,ToK1 DBPwul: DBP T Sojn T3,DBPwul ToK1: Movem T,psKBuf ToK2: Ildb TT,B Idpb TT,T Sojn E,ToK2 Jrst Input Ctrl$U: Jumpe TL,Input ;Delete current line. Move E,TL Ldb B,TBP Caie B,^J Jrst utag .Iot TTYop,[^P] .Iot TTYop,["U] utag: Soj TL, DBP TBP Jumpe TL,CLEOL Ldb B,TBP Caie B,^J Jrst utag CLEOL: Call CLine Jrst ToKBuf Delete: Jumpe TL,Input SkipTrue %WUonly Jrst Remove Move TT,KILen*5 ;Save that char in kill buffer only Sub TT,LKBuf ;if done IMMEDIATELY following Jumpe TT,Remove ;^W's and ^U's. Aos LKBuf Move T,psKBuf Ldb A,TBP DBP T Movem T,psKBuf Idpb A,T Remove: Movei T3,"X ;Use ^PX to delete char Call DELCHR JRST INPUT Quit: Jumpe TL,Done Type TTYop,"AQuit?" Call YorN Jrst ReIn Jrst Done Ctrl$T: Caige TL,2 Jrst Input Ldb T3,TBP DBP TBP Ldb TT,TBP Caie T3,^J Cain TT,^J Jrst [Ibp TBP Jrst Input] Move A,T3 Call Erase Move A,TT Call Erase .Iot TTYo,T3 Dpb T,TBP .Iot TTYo,TT Idpb TT,TBP Jrst Input Ctrl$R: Call CLine Call ReLine Jrst Input ReType: .Iot TTYop,[^P] .Iot TTYop,["C] RTnc: True %KnoWho TYPE ,"To " TYPUNM .Iot TTYo,[":] .Iot TTYo,[^M] Jumpe TL,Input Movei A,TTYo Call TMesg JRST INPUT Yank: Skipn LKBuf Jrst Input Move T,TL Add T,LKBuf Camle T,BufLen Call AddPag Move TL,T Move T,psKBuf Move TT,LKBuf Yank1: Ildb B,T .Iot TTYo,B Idpb B,TBP Sojn TT,Yank1 Jrst Input ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; META/Escape commands ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Meta: Caie A,^[ Jrst Quit oMeta: False %TTYiok ;Where you call meta from the outside, so that Call EchoOff ;flags and stuff are set. gMeta: SkipFalse %Meta Jrst Metae Type TTYop,"A>>" Meta1: .Iot TTYi,A Caie A,%TXTOP\"H Jrst Meta2 Meta$H: True %Flush Type ," You are at Meta-command level. Commands recognized here are: 0 - Show flags set (in AC0). A - Append file to end of text. B - Give Brief command list C - Like 'M' but with the Comment [This was a failing send] D - Dump this message to a file. E - Edit escape (Not yet, maybe later). F - Specify new From: field (i.e. author of this message) H - Print this help list. I - Insert file--Same as 'A'. J - Print brief list of SENDER jname/function correlations. K - Toggle Kaosnet vs CLI as medium for tween-ITS messages. M - Mail the message, then Quit. N - Gets NAME@SITE from the Next send in your sends file. P - Polygramme (send to multiple recipients) Q - Quit everything. R - Like :REPLY Get this NAME@SITE from top of sends file. ^C, S - Send message. Like doing then ^C T - Enter a new NAME@SITE for this message to go to. V - Toggle header Verbosity (ex: REPLY <-> FREPLY) W - Say Who this message is to. Z - Zero text buffer then re-enter, keeping same NAME@SITE. Hit to continue entering message. " False %Flush Jrst gMeta Meta2: Andi A,%TXASC ;Only look at ASCII part Cain A,177 ;Meta-Rubout? Jrst [Call EchoOn ; Yes, same as ^W. Make sure Jrst Ctrl$W] ; echoing is on and handle it. .Iot TTYo,[^M] ;Get to a new line. UpCase A Movsi B,-nMetas Meta3: Hlrz T,Metas(B) Hrrz TT,Metas(B) Camn A,T Jrst (TT) Aobjn B,Meta3 MetaNo: .Iot TTYo,["'] .Iot TTYo,A Type ,"'? 'H' for Help." Jrst gMeta Metae: True %TTYiok ;All Meta-commands should exit through here False %Meta Call EchoOn Jrst ReIn Metal: .Iot TTYop,[^P] .Iot TTYop,["C] Jrst gMeta Meta$W: Type ,"Who? To " Typunm SkipTrue %Multi Jrst gMeta Type ," (poly-to " Movei T,MSbuff Call AType .Iot TTYo,[")] Jrst gMeta Meta$J: Type ," --Jname(s)-- --Format-- S or SEND :SEND name@site FS or FSEND Same RP or REPLY :REPLY FR or FREPLY Same RA :RA SA :SA name@site : All JCL is optional. See :INFO SENDER JNAMES for details." Jrst gMeta Meta$Z: Type ,"Zero" Jumpe TL,[Type ," WHAT? There's no text!" Jrst gMeta] .Iot TTYo,["?] Call YorN Jrst gMeta Setz TL, Move TBP,pText Jrst ReType Meta$Q: Type ,"Quit" Jumpe TL,Done .Iot TTYo,["?] Call YorN Jrst gMeta Jrst Done Meta$T: False %Force Call gTo Jrst gMeta ;^G or ^D Jrst [SkipTrue %Multi Jrst gMeta Jrst Meta$Q] True %Send SkipTrue %Multi Jrst gMeta Jrst DoIt Meta$R: SkipFalse %SFopen Jrst [.Close SENDi, False %SFopen Jrst .+1] False %Send Jrst MetaN1 Meta$N: SkipFalse %SFopen Call SMsg MetaN1: Move A,pHName ;Save old HName and HSNum Move B,pOHName MetaN2: Ildb T,A Idpb T,B Jumpn T,MetaN2 Move T,HSNum Movem T,OHSNum Call SFPars ;Get new HName/HSNum, Jrst gMeta Move T,HSNum ;and compare to old. If same, keep Came T,OHSNum ;walking through the file. Jrst MetaN4 Move A,pOHName Move B,pHName MetaN3: Ildb T,A Ildb TT,B Came T,TT Jrst MetaN4 Jumpe T,[Jumpe TT,Meta$N Jrst MetaN4] Jumpe TT,[Jumpe T,Meta$N Jrst MetaN4] Jrst MetaN3 MetaN4: .Iot TTYo,["(] Move T,nSFPs Call 10Type Move T,nSFPs Call Ending Type ,") To: " Typunm Jrst gMeta Meta$V: SkipFalse %Quiet Jrst [Type ,"Division by zero (fool!)" Jrst gMeta] Toggle %Fast Type ,"Verbosity: " SkipFalse %Fast Jrst [Type ,"Minimal" Jrst gMeta] Type ,"Extreme" Jrst gMeta Meta$M: Type ,"Mailing." True %Mail Jrst COMSAT Meta$S: Type ,"Sending. " Jrst DoIt Meta$I: Type ,"Insert." Jrst AorI Meta$A: Type ,"Append." AorI: Call gFile Jrst gMeta Syscal OPEN,[%Clbit,,.uai %Climm,,INSi Device ? FN1 ? FN2 ? Sname] Jrst [Type TTYop,"ANo such file: " Call FylTyp .Iot TTYo,[^M] Jrst AorI] Syscal FILLEN,[%Climm,,INSi %Clout,,A] .Lose %LsSys Move C,TL Add C,A Ins2: Camg C,BufLen Jrst Ins3 Call AddPag Jrst Ins2 Ins3: Move T,A Syscal SIOT,[%Climm,,INSi ? TBP ? T] .Lose %LsSys .Close INSi, Ins4: Ldb B,TBP Caie B,^C Jrst Ins5 Soj C, DBP TBP Soja A,Ins4 Ins5: Movem C,TL .Iot TTYo,[^M] Move T,A Call 10Type Type ," characters read from " Call FylTyp Jrst gMeta Meta$D: Jumpe TL,[Type ,"No text to dump!" Jrst gMeta] Type ,"Dump." Dump1: Call gFile Jrst gMeta Move T,FN2 Caie T,[Sixbit //] Jrst Dump2 Syscal OPEN,[%Clbit,,.uai %Climm,,TEMPc Device ? FN1 ? FN2 ? Sname] Jrst Dump2 Call FylTyp Type ," exists. Write over it?" Call YorN Jrst gMeta .Close TEMPc, Dump2: Syscal OPEN,[%Clbit,,.uao %Climm,,DUMPo Device ? FN1 ? FN2 ? Sname] Jrst [Type ,"Can't open " Call FylTyp Jrst Dump1] Move T,pText Move TT,TL Syscal SIOT,[%Climm,,DUMPo ? T ? TT] .Lose %LsSys .Close DUMPo, .Iot TTYo,[^M] Move T,TL Call 10Type Type ," characters dumped to " Call FylTyp Jrst gMeta Meta$C: Type ,"Commented mail." True %Mail+%Comment Jrst Comsat Meta$K: SkipTrue %ITS Jrst [Type ,"Not an ITS!" Jrst gMeta] SkipTrue %Chaos Jrst [Type ,"Sorry, DM's not on Chaosnet!" Jrst gMeta] Toggle %CLI SkipTrue %CLI Jrst [Type ,"Chaosnet" False %Fast Jrst gMeta] Type ,"CLI" Jrst gMeta Meta$F: Ask "From: " Jrst gMeta ;^D or ^G Jrst gMeta ;No input True %Via Move T,nChars Movem T,lFName Move TT,pTTYb Move T3,pFName MetaF1: Ildb A,TT Idpb A,T3 Sojn T,MetaF1 Jrst gMeta MSend0: True %Meta Jrst MSend1 MSend: SkipFalse %Multi Jrst [Type ,"Continue?" Call YorN Skipa Jrst NMSend False %Multi Jrst .+1] MSend1: False %Multi Ask "Poly-to: " Jrst gMeta ;^D or ^G Jrst gMeta ;No input Move T,pTTYb Move TT,pMSbuf Movem TT,MSenBP ;Init BP to next name in string. Move B,nChars SavMSn: Ildb A,T ;Save text (ascizied) Idpb A,TT Sojn B,SavMSn Setzb T,nthMSN Idpb T,TT True %Multi False %Knowho Jrst gMeta Meta$B: Type ,"Brief list of commands: A/ppend file, B/rief command list, C/ommented mail, D/ump text to file, enter new F/rom field, H/elp, I/nsert file, show J/names, K/aosnet&CLI, M/ail text, N/ext message, P/ollygramme send, Q/uit, R/eply, S/end, T/o, W/ho, and Z/ero" Jrst gMeta pFlags: Type TTYop,"Flags set:A" Move A,Flags Move C,[440700,,FNames] pFloop: Trnn A,1 Jrst pFf .Iot TTYo,[" ] pFt: Ildb T,C Jumpe T,nFlag .Iot TTYo,T Jrst pFt pFf: Ildb T,C Jumpn T,pFf nFlag: Lsh A,-1 Jumpn A,pFloop Jrst gMeta ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; State-saving/recoving code ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; S$FLAG==0 S$H6NAM==1 S$HSHOR==2 S$HSNUM==3 S$NAMLN==4 S$HNAME==5 Saves: Movem Flags,S$FLAG(A) ;Save flag word Move T,H6Name Movem T,S$H6NAM(A) Move T,HShort Movem T,S$HSHOR(A) Move T,HSNum Movem T,S$HSNUM(A) Skipg TT,NamLen Jrst [Setzm S$NAMLN(A) Setzm S$HNAME(A) Return] Movem TT,S$NAMLN(A) Move B,[440700,,S$HNAME(A)] Move C,[440700,,HName] CallRet MovStr Gets: Move Flags,S$FLAG(A) Move T,S$H6NAM(A) Movem T,H6Name Move T,S$HSHOR(A) Movem T,HShort Move T,S$HSNUM(A) Movem T,HSNum Skipg TT,S$NAMLN(A) Jrst [Setzm NamLen Setzm HName Return] Movem TT,NamLen Move B,[440700,,HName] Move C,[440700,,S$HNAME(A)] ; Call MovStr MovStr: Ildb T3,C Idpb T3,B Sojg TT,MovStr Idpb TT,B Return ;;; ;;;;; End of executable code ;;; Variables Constants Death==._-12 ;The Last Page BUFbot=*2000 END Begin