;-*-Midas-*- Title :SENSOR - Sends cENSOR A=1 ;General porpoise B=2 C=3 D=4 J=5 F=6 G=7 I=10 ;Index R1=11 ;Returns R2=12 R3=13 T1=14 ;Transient T2=15 T3=16 P=17 ;The obligatory PDL Call= Return= TTYo==1 CLIo==2 USRi==3 PDLen==15 JCLen==20 MaxIs==10 ;Max # unames to /Ignore MaxPs==10 ; " # jnames to /Program MaxFs==10 ; " # jnames to /Forward to ;;; ;;;;; ;;; Define SYSCAL op,args .Call [Setz ? Sixbit /op/ ? args ((Setz))] Termin Define TYPE &string Movei T1,<.Length string> Move T2,[440700,,[Ascii string]] Syscal SIOT,[%Climm,,TTYo ? T2 ? T1] .Lose %LsSys Termin ;;; ;;;;; ;;; Keys: "B ? "F ? "I ? "P ? "S ? "V ? "N Hands: DoB ? DoF ? DoI ? DoP ? DoS ? DoV ? DoN NKeys==.-Hands BFlag: 0 FFlag: 0 IFlag: 0 PFlag: 0 SFlag: 0 VFlag: 0 oChan: TTYo Uname: 0 ;Your uname Valret: Ascii ":SELF .JNAME/1'HACRTN :KILL HACTRNJ L DSK:KP;SERVER BIN :GZP  :FORGET J :VK " Numbel: 1 ;Number of bells before message Verbos: 4 ;Verbosity level SaveSs: -1 ;0 if not Saving Sends Device: Sixbit /DSK/ ;Filename of your sends file Sname: Sixbit /.TEMP./ FN1: 0 FN2: Sixbit /SENDS/ Ignore: 0 ;# unames we're ignoring INames: Block MaxIs ;da poop IValue: Block MaxIs ;Ignorance level Sacred: 0 ;# special programs PNames: Block MaxPs ;more poop PVerb: Block MaxPs ;Verbosity PBell: Block MaxPs ;Bells. Forwar: 0 ;# jnames to foreward to FNames: Block MaxFs FRilly: Block MaxFs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header-parse cruft that needs to be zeroed every pass goes ;;; tween the Zer's. Contents of ZerTop is written over it all. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ZerTop: 0 ;Had better be zero! JOBp: 0 ;-1 if print funame/jname and mesage only. MAILp: 0 ;-1 for mail notification YesCLI: 0 Fname: Block 4 ;From Name F6name: 0 ;6bit name of sender. nonzero iff this is from an ITS site Fsite: Block 3 ;From Site F6Site: 0 FUname: 0 ;From Uname/Jname (might be COMSYS or some such) FJname: 0 Length: 0 ;Length of message pText: 0 ZerBot: 0 ;Hi, mom. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; End zeroed stuff ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; No: 0 ;True if this keyword has the /No prefix gotFN1: 0 PDList: -PDLen,,. Block PDLen JCLbuf: Block JCLen -1 OB: "[ CB: "] EOF: -1,,3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; The program (finally) begins ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Begin: Move P,PDList Syscal OPEN,[%Clbit,,.uao\%TJDIS %Climm,,TTYo [Sixbit /TTY/]] .Lose %LsFil .Suset [.rUNAME,,Uname] JCLp: .Break 12,[..rJCL,,JCLbuf] Skipn JCLbuf Jrst Go ;No JCL to parse Move J,[350700,,Jclbuf] NabCmd: Setzm No Call Getcmd Jrst Go ;Nothing more to get Movsi T1,NKeys Fcomd: Camn R1,Keys(T1) Jrst @Hands(T1) Aobjn T1,Fcomd Type "Unknown command: '" .Iot TTYo,R1 .Iot TTYo,["'] Jrst JCLerr ;;; ;;; /BELLS nnn ;;; DoB: Call Getnum Jrst NoNum Cail R1,10. Jrst BadNum Movem R1,Numbel Setom BFlag Jrst NabCmd ;;; ;;; /VERBOSITY nnn ;;; DoV: Call Getnum Jrst NoNum Caile R1,3 Jrst BadNum Movem R1,Verbos Setom VFlag Jrst NabCmd ;;; ;;; [/NO] /PROGRAM uname bells verbosity ... ;;; DoP: Setz B, Call GetSix Jrst NoArg DoP2: Cail B,MaxPs Jrst ToMany Move C,R1 Call GetNum Jrst [Movei R1,1 ;B=1 Movei R2,2 ;V=2 Jrst SaveP] IDivi R1,10. Caig R1,9. Caile R2,3 Jrst BadNum SaveP: Movem C,PNames(B) Movem R2,PVerb(B) Movem R1,PBell(B) Call GetSix Jrst [Aoj B, Movem B,Sacred Setom PFlag Jrst NabCmd] Aoja B,DoP2 ;;; ;;; [/NO] /SENDSAVE dev:sname;fn1 fn2 ;;; DoS: Skipe No Jrst [Setzm SaveSs Jrst NabCmd] Setom SaveSs Setzm gotFN1 Setom SFlag gFile: Call GetSix Jrst NabCmd Cain R2,": Jrst [Movem R1,Device Jrst gFile] Cain R2,"; Jrst [Movem R1,Sname Jrst gFile] Movei T1,FN1 Skipe gotFN1 Aoj T1, Movem R1,(T1) Setom GotFN1 Jrst gFile ;;; ;;; [/NO] /IGNORE uname intensity ... ;;; DoI: Setz B, Call GetSix Jrst NoArg DoI2: Cail B,MaxIs Jrst ToMany Skipe No Jrst [Setom IValue(B) Jrst DoI3] Move C,R1 Call GetNum Jrst NoNum Movem R1,IValue(B) DoI3: Movem C,INames(B) Call GetSix Jrst [Aoj B, Movem B,Ignore Setom IFlag Jrst NabCmd] Aoja B,DoI2 ;;; ;;; [/NO] /FORWARD jname ... ;;; DoF: Setz B, Call GetSix Jrst NoArg DoF2: Cail B,MaxFs Jrst ToMany Movem R1,FNames(B) Move T1,No Movem T1,FRilly(B) Call GetSix Jrst [Aoj B, Movem B,Forwar Setom FFlag Jrst NabCmd] Aoja B,DoF2 DoN: Setcmm No Jrst NabCmd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; JCL is all parsed - Now we summon a new server, or just ;;; ship off these params to an existing one. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Go: Syscal OPEN,[%Clbit,,.bii %Climm,,USRi [Sixbit /USR/] Uname ['HACRTN]] .Value Valret .Close USRi, Syscal OPEN,[%Clbit,,.uao %Climm,,CLIo [Sixbit /CLI/] Uname ['HACTRN]] Jrst CantS .Iot CLIo,[177] .Iot CLIo,[177] ;Set up lead-in sequence ;;; ;;; <0><#of bells> ;;; SendB: Skipn BFlag Jrst SendF .Iot CLIo,[0] .Iot CLIo,Numbel ;;; ;;; <1><0><0> ... ;;; SendF: Skipn FFlag Jrst SendI .Iot CLIo,[1] .Iot CLIo,Forwar Movn A,Forwar Movss A SendFl: Move T1,FNames(A) Call 6Type .Iot CLIo,[0] Aobjn A,SendF ;;; ;;; <2><0><0> ... ;;; SendI: Skipn IFlag Jrst SendP .Iot CLIo,[2] .Iot CLIo,Ignore Movn A,Ignore Movss A SendI1: .Iot CLIo,IValue(A) Move T1,INames(A) Call 6Type .Iot CLIo,[0] Aobjn A,SendI1 ;;; ;;; <3><0> ... ;;; SendP: Skipn PFLag Jrst SendS .Iot CLIo,[3] .Iot CLIo,Sacred Movn A,Sacred Movss A SendP1: .Iot CLIo,PVerb(A) .Iot CLIo,PBell(A) Move T1,PNames(A) Call 6Type Aobjn A,SendP1 ;;; ;;; <4>[<0><0><0><0>] ;;; SendS: Skipn SFlag Jrst SendV .Iot CLIo,[4] .Iot CLIo,SaveSs Skipn SaveSs Jrst SendV Move T1,Device Call 6Type .Iot CLIo,[0] Move T1,Sname Call 6Type .Iot CLIo,[0] Move T1,FN1 Call 6Type .Iot CLIo,[0] Move T1,FN2 Call 6Type .Iot CLIo,[0] ;;; ;;; <5> ;;; SendV: Skipn SendV Jrst Finish .Iot CLIo,[5] .Iot CLIo,Verbos Finish: .Close CLIo, Type "[Arghs sent]" Jrst Die ;;; ;;;;; ;;; NoNum: Type "Missing numeric argument?" Jrst JCLerr BadNum: Type "Numeric argument out of valid range?" Jrst JCLerr NoArg: Type "Missing argument?" Jrst JCLerr BadArg: Type "Invalid argument?" Jrst JCLerr ToMany: Type "Too many arguments?" JCLerr: .Iot TTYo,[^P] .Iot TTYo,["A] Move A,[440700,,JCLbuf] JEloop: Ildb T1,A Jumpe T1,Die Cail T1,40 .Iot TTYo,T1 Came A,J Jrst JEloop .Iot TTYo,["<] .Iot TTYo,["-] Jrst JEloop CantS: Type "Can't send arguments to HACTRN" DIE: .Logout 1, 6Type: Setz T2, Rotc T1,6 Addi T2,40 .Iot CLIo,T2 Jumpn T1,6Type Return GCmOne: Ibp J GetCmd: Ldb T1,J Caie T1,40 ;Skip leading whitespace Cain T1,^I Jrst GCmOne Caie T1,^M ;Die on ^C, ^M, ^_, ^@ Cain T1,^C Return Skipe T1 Cain T1,^_ Return Caie T1,"/ ;Ah, we found the "/"! Jrst GCmOne Ildb R1,J ;Get the command-char Cail R1,"a Trz R1,40 ;Uppercase it Gc2: Ildb T1,J Caie T1,40 Cain T1,"= Jrst PopJ1 Caie T1,^I Cain T1,", Jrst PopJ1 Jumpn T1,GC2 Jrst PopJ1 GetSix: Setz R1, Movei T3,6 Move T2,[440600,,R1] Ildb R2,J Caie R2,40 Cain R2,^I Jrst .-3 Skipa g6Char: Ildb R2,J Caie R2,^M Cain R2,^C Jrst 6Check Skipe R2 Cain R2,"/ Jrst 6Check Caie R2,"; Cain R2,": Jrst 6Check Cain R2,40 Jrst 6Check Jumpe T3,g6Char Cail R2,"a Trz R2,40 Subi R2,40 Idpb R2,T2 Soja T3,g6Char 6Check: Caie T3,6 Jrst PopJ1 Return GetNum: Setz T3, Ildb T1,J Caie T1,40 Cain T1,^I Jrst GetNum Skipa gNChar: Ildb T1,J Caie T1,^M Cain T1,^C Jrst NCheck Caie T1,"/ Skipn T1 Jrst NCheck Caie T1,40 Cain T1,^I Jrst NCheck Cail T1,"0 Caile T1,"9 Jrst [Skipn T3 Return Pop P,T1 Jrst .-3] Subi T1,"0 Push P,T1 Aoja T3,gNChar NCheck: Skipn T3 Return Setz R1, Movei R2,1 ToTen: Pop P,T1 IMul T1,R2 IMuli R2,10. Add R1,T1 Sojn T3,ToTen Jrst PopJ1 PopJ1: Aos (P) Return ;;; ;;;;; ;;; Variables Constants END Begin