From 47cb894088e2860857d07b221824290f298a860d Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 15 Feb 2018 21:05:40 +0100 Subject: [PATCH] Add FIDO. --- README.md | 1 + build/build.tcl | 4 + src/ksc/fidox.18 | 1088 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1093 insertions(+) create mode 100644 src/ksc/fidox.18 diff --git a/README.md b/README.md index a13a779d..848e0bbc 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ A list of [known ITS machines](doc/machines.md). - FCDEV, talk to LispM file server. - FDIR, fast directory listing. - FED, font editor. + - FIDO, watch for system events and bark. - FILE, Chaosnet file server. - FIND, search for files. - FRETTY, display list of free TTYs. diff --git a/build/build.tcl b/build/build.tcl index fdc61514..1b38b712 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -735,6 +735,10 @@ respond "*" ":midas sys;ts pwmail_ksc;qmail\r" respond "PWORD version (Y or N)? " "Y\r" expect ":KILL" +# FIDO +respond "*" ":midas sys3;ts fido_ksc;fidox\r" +expect ":KILL" + # lisp respond "*" ":link l;fasdfs 1,lisp;.fasl defs\r" respond "*" ":link lisp;grind fasl,lisp;gfile fasl\r" diff --git a/src/ksc/fidox.18 b/src/ksc/fidox.18 new file mode 100644 index 00000000..62490a6e --- /dev/null +++ b/src/ksc/fidox.18 @@ -0,0 +1,1088 @@ +TITLE WATCHDOG + +.MLLIT=1 + +P=17 +A=1 +B=2 +C=3 +D=4 +Z=5 +T=6 +TT=7 + +T1=10 +T2=11 +T3=12 + + +X=10 +Y=11 +CH=13 +U=14 ;USER INDEX +I=15 ;RANDOM INDEX +INT=16 ;ACC FOR INTERRUPT ROUTINE + +TYIC=1 +TYOC=2 +DTYOC=3 ;CHANNEL FOR DISP MODE COMMANDS +CLIC=4 + + +OBLIM==20. +NBARKS==1 ;# OF TIMES TO BARK + +DEFINE SYMS LIST + IRPS FOOA,,[LIST] + SQUOZE 0,FOOA +FOOA: 0 +TERMIN +0 +TERMIN + +DEFINE REPORT A,B +IF1 [PRINTX *A = B +*]TERMIN + +LOC 42 + JSR TSINT ;INTERRUPT ON ^G,^S + +LOC 100 + +;CONSTANT SYMS (NOT ADDRS) +CNSTB: SYMS [LUBLK NCT NF11TY N11TYS] + + ;400000 +NOXTB: SYMS [UMASTER USRHI] + ;OPTIONAL SYMBOLS. +NOXTBA: SYMS [DISUSR PDPUSR LPTUSR] + + ;400000(U) +USRXTB: SYMS [UNAME JNAME TTYTBL SUPPRO] + + ;400000(I) +IXTB: SYMS [DCHSTB IOCHST IOCHNM TTYTYP TTYSTS TCTYP] + +debug: -1 ; -1 if debugging +demon: 0 ; -1 if stated as a demon (not used yet) +toplev: 0 ; -1 if want to be top level and live forever. +bhhack: 0 ; -1 if doing BH hack + +DISTTY: 0 ;0 IF DISPLAY TTY, 1 IF PRINTING +TOOLNG: 0 ;# OF 1/2 MINS. IN DOZTIM +SEEKTB: BLOCK OBLIM+1 ;ROUTINE ADDR FOR OBJECT + %abssk==400000 ; searching for absence of object + %tmpsk==200000 ; "temporary search" for complement of object + %nofls==100000 ; don't forget object - bark each time it appears. + +OBJTAB: BLOCK OBLIM+1 ;6BIT VALUE OF HOST AND USER + ;FOR TTY, LH=6BIT, RH=# +CONV6: BLOCK 5 ;USED TO FORM BARKER LINE +DOZTIM: <10.*30.> ;WAIT THIS MANY 30THS OF SEC + +ZINDEX: 0 +PDL: BLOCK 20 +CLIOPN: SIXBIT / 'CLI/ ;IMAGE BLOCK OUT +CREATR: 0 ;UNAME OF CREATOR + SIXBIT /HACTRN/ + +BRKLOC: ASCII /WOOF!! WOOF!! / +WHERE: BLOCK 1 ;EITHER 'HERE' OR 'GONE' + ASCII /BE: +/ +MSGLOC: BLOCK 6 ;30. CHARS IN LINE +BRKLEN=.-BRKLOC + + +;********MAINLINE******* + +MAINST: .CALL [SETZ + SIXBIT /CORBLK/ + 0,,[0] + 0,,[-1] + SETZ [0,,1]] ;FREE PAGE 1 + .VALUE 0 + +MAIN: MOVE Z,ZINDEX ;-NUM OF OBJS. IN LH,0 IN RH +MLUP: PUSHJ P,@SEEKTB(Z) ;GO LOOK FOR ZTH OBJECT. + JRST MWIN ;NO SKIP IF OBJ. FOUND! + +MFAIL: AOBJN Z,MLUP ;NOT FOUND--TRY ALL OBJS. + SKIPN B,TOOLNG ;SWITCH SET ? + JRST MDOZE ;NO, SLEEP TIME IS SAFELY LESS THAN 1/2 MIN. +ZLONG: MOVEI A,30.*30. ;SLEEP TIME TOO LONG, MUST DO SEVERAL 1/2'S + .SLEEP A, + PUSHJ P,@SEEKTB ;CHECK FOR MASTER + JFCL ;NEVER RETURNS HERE + SOJG B,ZLONG ;LOOP GIVEN # OF TIMES +MDOZE: MOVE A,DOZTIM ;GET SLEEP TIME LEFT + .SLEEP A, ;TAKE A NAP SO FIDO DOESN'T GOBBLE MACH. TIME + JRST MAIN ;BACK TO WORK + +AHEM: SKIPGE SEEKTB(Z) ;SKIP IF BARKING ABOUT PRESENCE + JRST CNVINT ;JUMP IF BARKING ABOUT ABSENCE + MOVE X,@UNAME ;PUT 6BIT UNAME IN 3RD POSITION + MOVEM X,CONV6+2 + MOVE X,@JNAME ;PUT 6BIT JNAME IN 4TH POSITION + MOVEM X,CONV6+3 + MOVE X,TTYNUM' ;NOW CONVERT TTY NUMBER TO 6BIT FOR COMPATIBILITY + JUMPGE X,TNCONV ;JUMP IF VALID NO. + CAME X,[-1,0] ;IF ALL 1'S, DO NOTHING TO TTY POS.-- + JRST CNVINT + MOVE X,[SIXBIT / T?? /] ;ELSE TIS FLAG SAYING NO TTY + MOVEM X,CONV6+1 + JRST CNVINT +TNCONV: SETZ Y, ;ZERO NEXT ACC SO SHIFTS PRODUCE NO GARBAGE + LSHC X,-3 ;USES Y REGISTER ALSO + LSH X,3 ;EFFECT OF LSH'S IS TO SEPARATE THE OCTAL DIGITS BY 3 + LSHC X,9. ;AND PUT THEM OUT IN THE MIDDLE + IOR X,['T,,202000] ;WHERE THEY ARE INSTANTLY CONVERTED. + MOVEM X,CONV6+1 ;STORE IN 2ND POSITION +CNVINT: SKIPE CONV6 ;SHIFT LINE LEFT IF NOTHING IN HEADER + JRST CNV1 + MOVSI X,-3 + MOVE A,CONV6+1(X) + MOVEM A,CONV6(X) + AOBJN X,.-2 + SETZM CONV6+3 ;BLANKS IN LAST POS. +CNV1: MOVE D,[440700,,MSGLOC] ;POINTER TO DEPOSIT ASCII + MOVE T,[440600,,CONV6] ;POINTER TO PICKUP 6BIT + MOVEI B,4 + SKIPGE SEEKTB(Z) + MOVEI B,1 ;CONVERT ONLY 1ST POS. IF BARKING RE ABSENCE +CNVLUP: MOVEI C,6 ;6 6BIT CHARS PER POSITION + ILDB A,T ;GET 6BIT + ADDI A,40 ;CONVERT + IDPB A,D ;DEPOSIT + SOJG C,.-3 ;LOOP THRU 6 CHARS + MOVEI A,40 ;INSERT BLANK BETWIXT POSITIONS + IDPB A,D + SOJG B,CNVLUP ;LUP THRU 4 POSITIONS + SKIPL SEEKTB(Z) ;IF ABSENCE, DO SPEC. INSERTION + JRST .+3 + MOVEI A,40 + IDPB A,D ;I.E. ANOTHER BLANK + MOVEI A,^M ;INSERT 2 MORE CHARS TO GET EVEN 30. IN ALL + IDPB A,D + MOVEI A,^J + IDPB A,D + POPJ P, + +MWIN: skipe bhhack + jrst mwinx + PUSHJ P,AHEM ;PUT INFO INTO OUTPUT BLOCK + SETZM BONCE' ;FLAG TO ERASE OBJECT ONLY ONCE + + PUSH P,Z ;GET TTYTYP FOR MASTER'S TTY... + SETZ Z, + PUSH P,WHERE ;SAVE 'HERE' OR 'GONE' + PUSHJ P,USER + CAIA + JRST [POP P,WHERE ? POP P,Z ? JRST MFAIL] ;!!!?!! + POP P,WHERE ;RESTORE 'HERE' OR 'GONE' + POP P,Z + MOVE I,TTYNUM ;INDEX TO TTYTYP TABLE IN ITS + MOVE A,@TTYTYP ;GET IT + MOVEI B,1 ;BARK ONLY ONCE IF PRINTING TTY + TLNE A,700 ;SKIP IF EVERY BIT=0 IE A PRINTING TTY + MOVEI B,NBARKS ;ELSE BARK N TIMES. +BARK: .OPEN CLIC,CLIOPN ;OPEN CORE-LINK INT. TO SEND MSG. + JRST MFAIL ;KEEP GOING AS LONG AS MASTER ONLINE + MOVE A,[-BRKLEN,,BRKLOC] + SKIPGE SEEKTB(Z) ;IF ABSENCE BARK, + MOVE A,[-BRKLEN+4,,BRKLOC] ;DON'T NEED LAST 4 WDS + .IOT CLIC,A ;IMAGE BLOCK OUTPUT + .CLOSE CLIC, + SKIPE BONCE ;SKIP 1ST TIME + JRST BARK2 ;JUMP TO USUAL + pushj p,forget + SETOM BONCE +BARK2: MOVE A,[<10.*30.>] ;10 SEC BETWEEN BARKS + .SLEEP A, + SOJG B,BARK + SKIPG NOBJS ;ANYTHING LEFT TO LOOK FOR? + .LOGOUT ;NO + JRST MAIN ;YES + +dkoc==15 +mwinx: .call [setz ? sixbit /open/ ? [.uao,,dkoc] ? ['dsk,,] + [sixbit /mail/] ? [sixbit />/] + setz [sixbit /.mail./]] + .lose + movei a,[asciz /FROM:KLH +SENT-BY:FIDO-X +TO:(BKH@SAIL (R-MODE-SEND -1)) +TO:(KLH@SRI-KL) +TEXT;-1 +Woof! Woof! Methinks a Minsky logged in! +/] + pushj p,dkostr + .close dkoc, + pushj p,forget + jrst main + +dkostr: push p,b + hrli a,440700 + caia +dkost2: .iot dkoc,b + ildb b,a + jumpn b,dkost2 + pop p,b + popj p, + +forget: move a,seektb(z) ; see if can forget about this object. + tlne a,%nofls ; skip if ca forget. + jrst [ tlo a,%tmpsk ; Nope, set bit for temporary seek + tlc a,%abssk ; and hunt for complement of what was found. + movem a,seektb(z) + popj p,] + MOVEI A,NILOBJ ;DON'T DO THIS ONE ANY MORE + HRRM A,SEEKTB(Z) ;DON'T HARM LH + SOS NOBJS' ;DECREMENT OBJECT COUNT + popj p, + +nilnow: tlc a,%abssk ; complement absence-seek bit + movem a,seektb(z) +NILOBJ: AOS (P) ;ALWAYS FAIL FOR + POPJ P, ;NULL OBJECT. + +RETYES: SKIPGE A,SEEKTB(Z) ;SKIP IF LOOKING FOR PRESENCE + JRST NILOBJ + tlze a,%tmpsk ; temporary-seek bit set? + jrst nilnow + MOVE A,[ASCII /HERE /] + MOVEM A,WHERE + POPJ P, ;WIN RETURN + +RETNO: SKIPL A,SEEKTB(Z) ;SKIP IF LOOKING FOR ABSENCE + JRST NILOBJ + tlze a,%tmpsk + jrst nilnow + MOVE A,OBJTAB(Z) ;GET 6BIT CHAR REPRESENTATION + HRRZ C,SEEKTB(Z) + CAIN C,TTYSEK + HLLZ A,OBJTAB(Z) + MOVEM A,CONV6 + SETZM CONV6+1 + SETZM CONV6+2 + SETZM CONV6+3 + MOVE A,[ASCII /GONE /] + MOVEM A,WHERE + SETOM TTYNUM + POPJ P, ;WIN RETURN + +MASSEK: MOVE A,@UMASTER ;GET ITS' FLAG WORD + CAMN A,[-1] ;NOT USED IF -1 + JRST RETNO + MOVE U,A ;AHA! GET USER INDEX INTO U + MOVE A,[SIXBIT /MASTER/] + MOVEM A,CONV6 ;HEADER IN BARK + JRST SPCTTY ;WIN RETURN--GET TTY # + + +LPTSEK: MOVE A,@LPTUSR ;SEE IF LPT FREE + CAMN A,[-1] + JRST RETNO ;IF NO ONE USING + MOVE U,A ;USER INDEX + MOVE A,[SIXBIT / LPT/] + MOVEM A,CONV6 + JRST SPCTTY + +DISSEK: MOVE A,@DISUSR ;SEE WHO'S GOT DIS + CAMN A,[-1] + JRST DISSK1 ;ITS SAYS 10 NOT USING IT--CHECK 6. + MOVE U,A + MOVE A,[SIXBIT /340DIS/] + MOVEM A,CONV6 + JRST SPCTTY +DISSK1: CONSZ DIS,[400000,,0] ;TEST 4.9 BIT OF DISPLAY + JRST RETNO ;BIT ON, DIS FREE, THUS 6 DOESN'T HAVE IT + PUSH P,SEEKTB(Z) ;MUST FOOL ROUTINE IN CASE LH NEG. + SETZM SEEKTB(Z) ;I.E. SEARCH FOR PRESENCE + PUSHJ P,SIXSEK ;BIT OFF, 6 HAS DISPLAY--FIND USER OF 6! + JRST .+3 ;SKIP IF SIX BEING USED + POP P,SEEKTB(Z) + JRST RETNO ;ELSE NOBODY HAS SCOPE + POP P,SEEKTB(Z) + MOVE A,[SIXBIT /340DIS/];SIXSEK PUTS ITS OWN JUNK IN CONV6 + MOVEM A,CONV6 ;AND WE DON'T WANT IT + JRST RETYES + + + +SIXSEK: MOVE A,@PDPUSR ;WHO'S GOT PDP-6? + CAMN A,[-1] + JRST RETNO ;NOBODY + MOVE U,A + MOVE A,[SIXBIT / PDP-6/] + MOVEM A,CONV6 + JRST SPCTTY + +SPCTTY: MOVE A,@TTYTBL ;GET TTY INFO USING U + JUMPGE A,SPCGOT ;FOUND IT RIGHT OFF! +SPCUP: MOVE B,@SUPPRO ;SEE WHOSE HACTRN HAS THIS PROC + CAME B,[-1] ;IF -1,THIS IS TOP PROC. + JRST [HRR U,B ? JRST SPCUP] ;GET U OF TOP PROC. +SPCDWN: MOVE A,@TTYTBL ;GET TTY INFO FROM HACTRN + JUMPGE A,SPCGOT ;IT HAS IT! + HRR U,A ;DOESN'T, SEE WHO GAVE IT TO + TLNN A,200000 ;ERROR IF NEVER HAD IT--SKIP + JRST SPCDWN ;ELSE PROCEED DOWN THE TREE + MOVSI A,-1 ;PUT -1,,0 IN AS FLAG TO BARKER +SPCGOT: MOVEM A,TTYNUM + HRRZ B,SEEKTB(Z) ;SEE IF DOING FOR JNAME + CAIE B,JNMSEK ;YES, POPJ BACK INSTEAD! + JRST RETYES ;WIN RETURN + POPJ P, ;RETURN FOR JNAME + + + +MASTER: skipn toplev ; if top level, pretend master always around. + PUSHJ P,USER ;SEE IF MASTER STILL AROUND + JRST MAST2 ;YES + SKIPE NOMSTR' ;NO. SKIP IF WAS PRESENT LAST TIME + JRST MAST1 ;JUMP IF PREVIOUSLY ABSENT + SETOM NOMSTR ;SAY GONE + .RDTIME A, ;GET TIME FOR COUNTDOWN.(DIE IF NOT BACK SOON) + MOVEM A,LFTTIM' ;START OF ABSENCE + JRST NOMORE ;DO NO MORE OBJS. THIS PASS +MAST1: .RDTIME A, ;GET TIME + SUB A,LFTTIM ;SEE HOW LONG MASTER HAS BEEN GONE + CAML A,[<5*60.*30.>] ;5 MINS. GRACE PERIOD + .LOGOUT ;ALAS! +NOMORE: SETZ Z, ;ZERO COUNT TO HALT LOOP THRU OTHER OBJS. + CAIA ;SKIP +MAST2: SETZM NOMSTR ;IF PRESENT + AOS (P) ;NEVER BARK ABOUT MASTER'S STATE + POPJ P, + + +TTYSEK: SETZM CONV6 ;PUT 6BIT BLANKS IN HOST FIELD + HRRZ I,OBJTAB(Z) ;GET TTY NUMBER TO LOOK FOR + MOVE A,@TTYSTS ;GET "RANDOM STATUS" VAR, HAS USER INDEX IN RH + HRRZ U,A + CAIN U,-1 + JRST RETNO ;RH IS -1, MEANS TTY NOT IN USE + MOVEM I,TTYNUM' ;HAVE USER INDEX, SAVE TTY # + JRST RETYES + + +; *TV* IS SPECIAL, WINS IF FREE TV, LOSES IF ALL TV'S BEING USED. +TVSEK: MOVE A,[SIXBIT /*TV*/] + MOVEM A,CONV6 +; MOVN I,N11TYS +; HRLZ I,I +; HRR I,NF11TY ;HAVE -<# 11 TTYS>,,<# OF FIRST 11 TTY> + MOVE I,[-12.,,50] ;EMPIRICAL FACT +TVLUP: HRRZ U,@TTYSTS ;GET STATUS FOR TV + CAIN U,-1 + JRST RETYES ;AHA, FOUND FREE TV! +TVLUP1: AOBJN I,TVLUP + JRST RETNO + + +HOST: SETZ C, ;SWITCH TO DO RIGHT THING + CAIA +USER: SETO C, ;SWITCH + MOVE A,OBJTAB(Z) ;GET 6BIT UNAME TO LOOK FOR + MOVE U,@USRHI ;TOP OF USER VAR. CORE +USRLUP: SUB U,LUBLK ;AS FOR TTY FINDER + JUMPLE U,RETNO ;ALL GONE + CAME A,@UNAME ;SKIP IF UNAMES MATCH! + JRST USRLUP ;ELSE TRY NEXT + JUMPE C,STYFND ;IF HOST, TRY TO FIND THE STY IF ANY + SKIPGE @TTYTBL ;ELSE USER-- SKIP IF TTY EXISTS + JRST USRLUP ;NOPE,THIS PROC. DOESN'T HAVE THE TTY + SETZM CONV6 ;USER SUCCESS!! ZERO HOST FIELD + MOVE A,@TTYTBL + MOVEM A,TTYNUM ;AND SAVE TTY # + JRST RETYES ;WIN RETURN + +STYFND: HRRZ D,IOCHNM ;HOST SEEK COMES HERE.GET ADDR... + ADD D,U ;ADD USER INDEX TO GET USER'S IOCHNM BLOCK + MOVEI B,17 ;17 I/O CHANNELS +STYLUP: HRRZ I,(D) ;RH OF ENTRY=INDEX TO DCHSTB + JUMPE I,STY2 ;IF ZERO, NOTHING. + HLRZ X,@DCHSTB ;GET DEVICE OPEN ON + CAIN X,'STY ;IS IT A PSUEDO-TTY? + JRST STYGOT ;YES, WE FOUND IT! +STY2: ADDI D,1 ;NOPE, TRY ANOTHER CHANNEL + SOJGE B,STYLUP ;LOOP THRU CHNS. + JRST USRLUP ;DIDN'T FIND STY?!? OH WELL GO BACK... +STYGOT: MOVE B,@UNAME ;GET UNAME (HOST #) + MOVEM B,CONV6 ;PUT IN HOST FIELD + HLRZ A,(D) ;GET STY NUMBER + JRST TTYSEK+2 ;LOOK FOR U-JNAME MATCHING STY # + ;(SKIP HOST FIELD AND TTY # INIT) + + +JNMSEK: MOVE A,OBJTAB(Z) ;GET 6BIT JNAME TO LOOK FOR + MOVE U,@USRHI ;TOP OF USER VAR. CORE +JNMLUP: SUB U,LUBLK ;AS FOR TTY FINDER + JUMPLE U,RETNO ;ALL GONE + CAME A,@JNAME ;SKIP IF JNAMES MATCH! + JRST JNMLUP ;ELSE TRY NEXT + SKIPN @UNAME ;IF UNAME IS 0, PROC. ISN'T THERE + JRST JNMLUP + PUSH P,U ;SAVE USER INDEX FOR THIS JOB + PUSHJ P,SPCTTY ;SUCCESS! TRY TO FIND TTY + POP P,U ;RESTORE USER INDEX FOR BARKING + SETZM CONV6 + JRST RETYES ;FOUND IT + + +CONSTANTS +VARIABLES +REPORT [TOP OF DISOWNED CORE]\.-1 + +;*********************** +;**ALL THE FOLLOWING CODE IS NON-ESSENTIAL FOR A DISOWNED FIDO, +;HENCE CAN BE WIPED OUT OR FREED. +;************* + +;TAKES A= WD TO ADD INTO SYM ADDR AND INDIRECT THRU +;B=ADDR OF SYM LIST TO MUNG +EVALER: TDZA D,D ;FOR MANDATORY SYMBOLS +EVALR1: SETO D, ;FOR OPTIONAL SYMBOLS. + PUSH P,A + PUSH P,B + PUSH P,C +EVALUP: MOVE C,(B) ;GET SQUOZE FOR SYM + JUMPE C,EVLDON ;THRU + .EVAL C, ;GET ADDR FOR IT + JRST [ JUMPN D,EVALU1 ? JRST EVLLOS] + IOR C,A ;IOR ADDR INTO IT + MOVEM C,1(B) ;STORE IN RIGHT PLACE +EVALU1: ADDI B,2 ;INCREMENT INDEX + JRST EVALUP ;BACK FOR ALL + +EVLDON: AOS -3(P) +EVLLOS: POP P,C + POP P,B + POP P,A + POPJ P, + + + +INIT: MOVEI A,[ASCIZ /NEW SYS, MUST INITIALIZE-- +TAKE PAWS OFF KEYS AND WAIT +/] + PUSHJ P,TYPE7 + move a,[-<400000/2000>,,200] + setz b, + .CALL [SETZ + SIXBIT /CORBLK/ + %climm,,%cbred ;read access + %climm,,%jself ;map into self + a + %climm,,%jsabs ;map in absolute pages + setz b] + .VALUE 0 + MOVE A,[400000(U)] + MOVEI B,USRXTB + PUSHJ P,EVALER + .LOSE + MOVE A,[400000] + MOVEI B,NOXTB + PUSHJ P,EVALER + .LOSE + MOVEI B,NOXTBA + PUSHJ P,EVALR1 ;THESE ARE OPTIONAL (MIGHT NOT EXIST ON SOME MACHINES) + .LOSE +INIT2: MOVE A,[400000(I)] + MOVEI B,IXTB + PUSHJ P,EVALER + .LOSE + SETZ A, + MOVEI B,CNSTB + PUSHJ P,EVALER + .LOSE + + .RSYSI A, ;GET SYS. VERSION OF THESE SYMS + MOVEM A,SYSID + skipe debug + jrst init9 + .VALUE [ASCIZ /:SYMLOD +:PDUMP DSK:SYSBIN;FIDO BIN +P/] + +init9: MOVEI A,[ASCIZ /INIT DONE +/] + PUSHJ P,TYPE7 + POPJ P, + + +SYSID: 0 ;HOLDS CURRENT ITS VERSION SYMS ARE GOOD FOR + +TSINT: 0 + 0 + MOVEI INT,TYIC + .ITYIC INT, ;SEE IF ^G + .DISMISS TSINT+1 ;NO CHAR??!! + CAIE INT,^G + .DISMISS TSINT+1 ;NOT ^G, PROBABLY ^S + .RESET TYOC, + .RESET TYIC, + MOVEI P,PDL-1 ;RESET PDL + MOVEI A,[ASCIZ /XXX +/] + PUSHJ P,TYPE7 + MOVEI A,GETCOM + HRRM A,TSINT+1 + .DISMISS TSINT+1 + + +GO: MOVEI P,PDL ;INITIALIZE JUMP PDL + .suset [.rintb,,a] + setzm demon + caige a, + setom demon + + .SUSET [.RUNAME,,CREATR] ;GET UNAME OF CREATOR. + MOVE A,[SQUOZE 0,IMPUS] + .EVAL A, ;FIND SITE # WE'RE AT + .VALUE + MOVEM A,OWNHST' ;SAVE + + .OPEN TYIC,[.UII,,'TTY] + .LOSE 1400 + .OPEN TYOC,[.UAO,,'TTY] + .LOSE 1400 + .OPEN DTYOC,[%TJDIS+.UAO,,'TTY] ;DISPLAY MODE + .LOSE 1400 + .RESET TYIC, + SETZB A,B + TRO B,1_TYIC ;SET INTERRUPT ENABLE BIT FOR TTY INPUT + .SETM2 A, ;A AND B ARE MASK WDS + .CALL TTYGET ;GET TTY STATUS WDS + .VALUE 0 + MOVE T1,[424642,,424242] ;MAIN PROG. ECHO, FORCE TO UPPER + MOVE T2,[434242,,420242] ;INT. ON ^G,^S DON'T ECHO RUBOUT + .CALL TTYSET + .VALUE 0 + .RSYSI A, ;GET ITS VERSION NO. + CAME A,SYSID ;SKIP IF SAME AS THE ONE SYMS WERE INT'LD WITH + PUSHJ P,INIT ;ELSE MUST RE-INITIALIZE + MOVE A,[.FNAM1_-6] + PUSHJ P,WTYPE6 ;PRINT OUT NAME AND VERSION + .IOT TYOC,[".] + MOVE A,[.FNAM2] + PUSHJ P,WTYPE6 + .IOT TYOC,[^M] + SETZM RUNFLG' + MOVE A,CREATR ;PUT SIXBIT NAME + MOVEM A,OBJTAB ;OF MASTER AS 1ST THING TO LOOK FOR + MOVEI A,MASTER ;ADDR. OF MASTER-SEEKER ROUTINE + MOVEM A,SEEKTB ;LIKEWISE 1ST THING TO DO AFTER WAKEUP + SETZ Z, ;USER ROUTINE USES Z AS INDEX TO TBS. + PUSHJ P,USER ;FIND TTY TYPE... FIRST FIND MASTER'S TTY # + CAIA ;SKIP WHEN FOUND + .VALUE 0 ;FAILURE SHOULDN'T HAPPEN + MOVE I,TTYNUM ;PUT # IN INDEX FOR TTYTYP (SYS. VAR) + MOVE A,@TTYTYP ;GET TYPE OUT OF ITS + LSH A,9. ;GET BITS 3.9-3.7 =0 FOR PRINTING TTY, + LSH A,-33. ;=1,2, OR 3 FOR DISPLAY TTY. + SETZM DISTTY + SKIPN A ;SKIP WITH DISTTY=0 IF DISPLAY CONSOLE + SETOM DISTTY ;ELSE INDICATE PRINTING CONSOLE. + + MOVEI Z,1 ;POINT INDEX TO ENTRIES AFTER THE MASTER ONES + SETZM NOBJS ;NO. OF OBJS., NOT COUNTING MASTER. + .SUSET [.ROPTIO,,A] ;SEE IF COMMAND BUFFER FULL + SETZM COMBUF' + TLNN A,040000 ;4.6 BIT ON=SOMETHING IN COMMAND BUFF. + JRST GETCOM + SETOM COMBUF + .BREAK 12,[5,,COMLOC] ;GET COMMAND BUFF LINE + MOVE A,[440700,,COMLOC] ;INITIALIZE BYTE POINTER + MOVEM A,CBPT' + .BREAK 12,[400005,,0] ;ZERO COMM. STRING SO IT DOESN'T HANG AROUND + + +GETCOM: PUSHJ P,COMIN ;GET COMMAND LINE + PUSHJ P,COMEX ;PROCESS COMMAND + SKIPN RUNFLG ;SKIP IF COMEX SAYS ^S FOUND + JRST GETCOM ;ELSE GET ANOTHER LINE + SKIPG NOBJS + JRST NULLIN ;JUMP IF NOTHING TO LOOK FOR + MOVN Z,Z ;NEGATE # OF OBJS FOR AOBJN COUNT + HRLZM Z,ZINDEX ;STORE, MAIN LOOP WILL USE + skipe debug + jrst [ .value [asciz /: Not disowning but started î/] + jrst zlbeg] + skipe toplev + jrst [ .value [asciz /5k /] + jrst zlbeg] + + .VALUE [ASCIZ /:PROCED +:DISOWN +/] +zlbeg: SETZ B, ;INITIALIZE 'TOO LONG' FLAG + MOVE A,DOZTIM ;SEE HOW BIG DOZE TIME IS +ZLUP: SUBI A,30.*30. ;TAKE OFF 1/2 MIN. + CAIG A,30.*30. ;SKIP IF DOZTIM GREATER THAN 1/2 MIN. + JRST ZFIX + AOJ B, ;COUNT NO. OF 1/2'S + JRST ZLUP ;LOOP TILL LESS THAN 1/2 REMAINS, PUT BACK +ZFIX: ADDI A,30.*30. ;GET PREV. POS. VALUE (LESS THAN 1/2) + MOVEM A,DOZTIM ;STORE BACK + MOVEM B,TOOLNG ;0 IF OK, SOME COUNT IF SLEEP TOO LONG. + JRST MAINST ;START THE LOOKOUT! + +NULLIN: .value [asciz /: Nothing to look for? Dying... +:kill /] +; MOVEI A,NOOBJS +; PUSHJ P,TYPE7 +; SETZM RUNFLG ;FORGET THE ^S +; JRST GETCOM ;START OVER + + +COMIN: MOVEI CH,CHLIST-1 ;INITIALIZE PDL POINTER + .IOT TYOC,[">] ;PROMPT CHAR (ALSO IDENTIFIES FIDO) +INLUP: PUSHJ P,GETCHR + PUSH CH,A ;STORE INPUT CHAR ON PDL + CAIN A,177 ;RUBOUT? + JRST RUBOUT ;GO IF SO + CAIN A,^L ;CLEAR SCREEN? + JRST DISCLR ;ZAP + CAIN A,^M ;WAS IT A CR=END OF COMMAND LINE? + POPJ P, ;RETURN THEN + CAIN A,"? ;ASKING FOR INFO? + JRST INFORM + CAIN A,^S ;ASKING TO START? + POPJ P, + JRST INLUP ;ELSE ANOTHER CHAR. + + +GETCHR: SKIPE COMBUF ;ZERO IF NOTHING IN COMM. BUFF + JRST GETCH1 ;AHA! USE ILDB TO READ FROM LINE + .IOT TYIC,A ;REGULAR TTY INPUT + CAIA +GETCH1: ILDB A,CBPT + CAIL A,141 ;MUST FORCE LOWER TO UPPER. + CAILE A,172 + CAIA ;SKIP IF UPPERCASE + SUBI A,40 + CAIE A,^M ;CARR. RET. IS DELIMITER + POPJ P, + SETZM COMBUF ;STOP COM LINE INPUT + POPJ P, + + + + +DISCLR: POP CH,A ;GET RID OF ^L + PUSHJ P,CLEARS ;CLEAR SCREEN AND HOME UP + SKIPE NOBJS ;NO LISTING IF NO OBJECTS + PUSHJ P,LISTOB ;PRINT LIST OF OBJS TRAINED FOR SO FAR + .IOT TYOC,[^M] +RETYPE: HLLZ B,CH ;AND REPRINT LINE. GET COUNT + MOVN B,B ;NEGATE FOR AOBJN + JUMPE B,COMIN ;WAIT--IS THERE REALLY ANYTHING TO REPRINT? + .IOT TYOC,[">] + MOVE A,CHLIST(B) ;GET CHAR FROM START OF PDL + .IOT TYOC,A ;KICK OUT + AOBJN B,.-2 ;DO ALL + JRST INLUP ;BACK TO INPUT + +CRR: .IOT TYOC,[^M] + POPJ P, + +CLEARS: .IOT DTYOC,[^P] ;IN DISPLAY MODE, ^P TAKES NEXT CHAR AS + .IOT DTYOC,["C] ;CURSOR CONTROL--'C' CLEARS SCREEN + .IOT DTYOC,[^P] + .IOT DTYOC,["T] ;HOMES UP + POPJ P, ;DONE + + +RUBOUT: POP CH,A ;GET RID OF RUBOUT CHAR + HLLZ A,CH ;GET PDL COUNT + JUMPLE A,ALLOUT ;JUMP IF NOTHING TO BE RUBBED OUT + POP CH,A + .IOT TYOC,A ;GET RID OF CHAR AND ECHO IT + JRST INLUP ;BACK FOR MORE +ALLOUT: .IOT TYOC,[^M] + JRST COMIN + +INFORM: PUSHJ P,CLEARS ;CLEAR SCREEN + SKIPN DISTTY ;SKIP IF PRINTING TTY + JRST INFRM1 + MOVEI A,[ASCIZ /-- ^G TO STOP TYPEOUT -- +/] + PUSHJ P,TYPE7 +INFRM1: MOVEI A,INFLOC ;LOC. OF INFO + PUSHJ P,TYPE7 + .IOT TYOC,[^M] + POP CH,A ;GET RID OF '?' + JRST RETYPE ;BACK TO INPUT + +LISTOB: MOVEI A,[ASCIZ / +--OBJECTS-- +/] + PUSHJ P,TYPE7 + MOVSI T,-9. ;9 ROUTINES TO LOOK FOR +LLUP1: MOVE B,(T)[USER + HOST + TTYSEK + JNMSEK + DISSEK + SIXSEK + LPTSEK + MASSEK + TVSEK] + HRLZ TT,NOBJS ;SEARCH THRU SEEKTB + MOVN TT,TT + ADDI TT,1 ;DON'T DO MASTER +LLUP2: HRRZ A,SEEKTB(TT) + CAMN B,A ;IS ADDR ONE WE'RE LOOKING FOR? + JRST LISGOT ;YEP +LCONT: AOBJN TT,LLUP2 + AOBJN T,LLUP1 + POPJ P, + +LISGOT: MOVE A,(T)[[ASCIZ /USER:/] + [ASCIZ /HOST:/] + [ASCIZ /TTY:/] + [ASCIZ /JOB:/] + [ASCIZ /DEV:/] + [ASCIZ /DEV:/] + [ASCIZ /DEV:/] + [ASCIZ /SPEC:/] + [ASCIZ /SPEC:/]] + PUSHJ P,TYPE7 + .IOT TYOC,[40] ;SPACE + MOVEI A,40 + SKIPGE SEEKTB(TT) ;ONCE MORE IF NOT ABS.-TYPE OBJ. + MOVEI A,"- ;MINUS SIGN IF ABS-TYPE + .IOT TYOC,A + MOVE A,OBJTAB(TT) ;NOW TYPE NAME + CAIN B,TTYSEK ;TTY NAME? USE JUST 3 CHARS + HLLZ A,OBJTAB(TT) + PUSHJ P,WTYPE6 ;TYPE 6BIT WORD IN A + .IOT TYOC,[^M] + JRST LCONT ;BACK TO AOBJN LOOP + +WTYPE6: MOVEM A,[SIXBIT /123456%/] ;FIX UP WITH % DELIMITER + MOVE A,WTYPE6 ;PUT ADDR. OF LOC IN A + PUSHJ P,TYPE6 ;AS ARG FOR REG. 6BIT TYPE ROUTINE + POPJ P, + + + + +COMEX: POP CH,A ;GET LAST CHAR INPUT + PUSH CH,[40] ;INSERT TERMINATING BLANK + PUSH CH,A ;RESTORE LAST CHAR(^M OR ^S) + CAIN A,^S ;IF 'TWAS START COMMAND, + SETOM RUNFLG ;INDICATE THUSLY + + HLLZ T,CH ;GET PDL COUNT + MOVN T,T ;NEGATE FOR AOBJN COUNT + MOVEI TT,OBJPDL-1 ;INITIALIZE PDL FOR OBJ. CHARS + +OBJLUP: MOVE A,CHLIST(T) + HLRZ B,TT ;GET COUNT + JUMPN B,OBJLP2 ;BYPASS IF NOT 1ST CHAR + CAIE A,"- ;MINUS SIGN MEANS NEGATE FOLLOWING OBJ. + JRST OBJLP1 + MOVSI B,400000 ;TURN ON 4.9 BIT + MOVEM B,NEGFLG' ;GE=NO NEGATE, L=NEGATE +objlp0: ADD T,[1,,1] + MOVE A,CHLIST(T) + JRST OBJLP2 + +OBJLP1: SETZM NEGFLG +OBJLP2: CAIE A,40 ;IS CHAR A BLANK OR COMMA? + CAIN A,", + JRST BREAKC ;YES, GO SEE WHAT WE GOT + cain a,"! ; wants object to stay put? + jrst [ movsi a,%nofls + iorm a,negflg + jrst objlp0] + PUSH TT,A ;A NON-BREAK CHAR, STORE IT + JRST CONTIN + + +BREAKC: HLRZ A,TT ;GET OBJ PDL COUNT + JUMPE A,[SETZM NEGFLG + JRST CONTIN] ;JUMP IF NOTHING COLLECTED + MOVE A,NOBJS ;SEE IF TABLE ALREADY FULL + CAIL A,OBLIM ;SKIP IF OK + JRST TMOBJS ;ERROR ROUTINE + JRST TTYCH + +TMOBJS: MOVEI A,[ASCII /TOO MANY OBJS, CAN'T LEARN /] + PUSHJ P,TYPE7 + HLLZ B,TT ;GET CHAR COUNT FOR LOOP + MOVN B,B + MOVE A,OBJPDL(B) + .IOT TYOC,A + AOBJN B,.-2 + .IOT TYOC,[^M] + MOVEI TT,OBJPDL-1 + SETZM RUNFLG ;TURN OFF ^S (GIVE HIM CHANCE TO CORRECT ERR) + JRST CONTIN + + + ;SEE IF OBJ IS TTY +TTYCH: HLRZ A,TT ;GET OBJ. CHAR COUNT + CAIE A,3 ;COULD BE, IF 3 CHARS + JRST HCHEK ;ELSE TRY HOST + MOVEI B,OBJPDL ;ADDR OF 1ST CHAR ON OBJ. PDL + MOVE A,(B) ;GET 1ST CHAR OF OBJ + CAIE A,"T ;MUST BE T IF FOR TTY + JRST UNMPAD ;ELSE IS UNAME. + MOVE A,1(B) ;GET 2ND CHAR + CAIL A,"0 ;SEE IF NUMERIC + CAILE A,"7 ;ONLY OCTAL NOS. ALLOWED + JRST UNMPAD + MOVE A,2(B) ;GET 3RD CHAR + CAIL A,"0 + CAILE A,"7 + JRST UNMPAD + MOVEI A,TTYSEK ;GET TYPE CODE FOR TTY + MOVEM A,SEEKTB(Z) ;PUT IN TABLE + MOVE A,OBJPDL+1 ;2ND CHAR + MOVEI B,-"0(A) ;CONVERT TO NUMBER VALUE + LSH B,3 ;MAKE ROOM FOR SECOND DIGIT + MOVE A,OBJPDL+2 ;3RD CHAR + IORI B,-"0(A) ;NUMBER COMPLETED + MOVEM B,OBJTAB(Z) ;STORE AS VALUE + MOVE D,[440600,,OBJTAB(Z)] ;POINTER FOR PACK6 + MOVSI B,-3 ;COUNT FOR PACK6 + JRST PCKLUP ;PUT 6BIT IN LH OF ENTRY + + +HCHEK: HLRZ A,TT ;GET OBJ PDL CHAR COUNT + CAIE A,4 ;CAN BE HOST ONLY IF 4 CHARS + JRST UNMPAD ;NOPE, IS UNAME. + MOVEI B,OBJPDL ;GET ADDR OF 1ST CHAR + MOVE A,3(B) ;GET 4TH CHAR + CAIE A,"H ;CAN BE HOST ONLY IF 1ST CHAR=H + JRST UNMPAD ;NOPE, IS UNAME. + HRLI B,-3 ;SET UP AOBJN COUNT + MOVE A,(B) ;GET 1ST,2ND,3RD CHARS + CAIL A,"0 + CAILE A,"7 ;TEST FOR NUMERIC + JRST UNMPAD + AOBJN B,.-4 ;LOOP 3 TIMES + MOVEI A,HOST ;PUT ROUTINE ADDR IN TABLE + MOVEM A,SEEKTB(Z) + PUSH TT,["0] ;ADD TWO BLANKS TO PAD INTO 6 CHARS + PUSH TT,["0] + JRST PACK6 + +UNMPAD: HLRZ B,TT ;GET COUNT OF CHARS + SUBI B,1 ;PROPER INDEX + MOVE C,OBJPDL(B) ;GET LAST CHAR + CAIE C,"Z ;=Z? + JRST UNAM ;NO, CAN'T BE SETTING DOZTIM + SOJL B,UNAM ;DECREMENT, JUMP IF NONE LEFT + + SETZ A, ;ZERO GATHERED SUM + MOVEI D,1 ;POWER OF +SETZLP: MOVE C,OBJPDL(B) ;GET CHAR(LAST TO FIRST) + CAIL C,"0 ;NUMERIC? + CAILE C,"9 ;DEC, NOT OCTAL FOR DOZTIM + JRST UNAM + MOVEI C,-"0(C) ;GET DIGIT VALUE + IMUL C,D ;POWER OF 10 + ADD A,C ;GATERING SUM + IMULI D,10. ;RAISE POWER + SOJGE B,SETZLP ;NO LIMIT ON LENGTH OF NUM (IN B) + IMULI A,30. ;CONVERT SECS TO 30THS OF SECS + MOVEM A,DOZTIM + MOVEI TT,OBJPDL-1 ;RESET OBJ PDL POINTER + JRST CONTIN ;NEXT OBJ + + +UNAM: MOVE A,OBJPDL ;CHECK IF J=; GET 1ST CHAR + CAIE A,"J + JRST UNAM1 + MOVE A,OBJPDL+1 ;2ND CHAR + CAIE A,"= + JRST UNAM1 + SUB TT,[2,,2] ;AHA, A JNAME. RESET POINTER TO 2 LESS + HLLZ B,TT ;AOBJN COUNT FOR SHIFTING CHARS DOWN + JUMPE B,CONTIN ;IF NOTHING ELSE + MOVN B,B + MOVE A,OBJPDL+2(B) + MOVEM A,OBJPDL(B) + AOBJN B,.-2 + MOVEI A,JNMSEK + CAIA +UNAM1: MOVEI A,USER + MOVEM A,SEEKTB(Z) + HLRZ A,TT ;GET OBJ CHAR COUNT + CAIN A,6 ;IF 6, NO PAD NEEDED + JRST PACK6 ;CONVERT TO 6BIT + CAIL A,6 ;MORE THAN 6 CHARS IN NAME? + JRST CHOVFL + + SUBI A,6 ;ELSE GET -NUM OF BLANKS TO FILL IN + PUSH TT,[40] ;PUT A BLANK ON PDL + AOJL A,.-1 +PACK6: MOVE D,[440600,,OBJTAB(Z)] ;CHUCKS THEM IN OBJ. TABLE + MOVSI B,-6 +PCKLUP: MOVE A,OBJPDL(B) ;GET CHAR + SUBI A,40 ;CONVERT TO 6BIT + IDPB A,D ;DEPOSIT + AOBJN B,PCKLUP + + MOVE B,SEEKTB(Z) ;SEE IF NAME MATCHES SPECIAL NAMES + MOVE A,OBJTAB(Z) ;IF SO, MUST USE SPECIAL ROUTINE + CAMN A,[SIXBIT /*MAS* /] ;MASTER MODE + MOVEI B,MASSEK + SKIPN LPTUSR + JRST .+3 + CAMN A,[SIXBIT /*LPT* /] ;LINE PRINTER - ONLY ALLOWED IF MACHINE HAS ONE. + MOVEI B,LPTSEK + SKIPN N11TYS + JRST .+3 + CAMN A,[SIXBIT /*TV*/] ;ANY FREE TV - ALLOW ONLY IF MACHINE HAS THEM + MOVEI B,TVSEK + SKIPN DISUSR + JRST .+3 + CAMN A,[SIXBIT /*DIS* /] ;340 DISPLAY - ALLOW ONLY IF MACHINE HAS A 340 + MOVEI B,DISSEK + SKIPN PDPUSR + JRST .+3 + CAMN A,[SIXBIT /*SIX* /] ;PDP-6 + MOVEI B,SIXSEK + +PCKLP9: MOVEM B,SEEKTB(Z) ;STORE SAME OR MODIFIED ADDR. + + SKIPE A,NEGFLG ;LOOK FOR PRESENCE OR ABSENCE? + HLLM A,SEEKTB(Z);SET LH=NEG. ADDR. OK, ONLY 4.9 CHANGED + + PUSHJ P,@SEEKTB(Z) ;SEE IF ALREADY ON SYSTEM + JRST NOWON ;YES! + + HRLZ B,NOBJS ;SEE IF ALREADY IN TABLES + MOVN B,B + JUMPE B,PROVED ;IF NOTHING TO CHECK WITH + +UCKLUP: MOVE A,OBJTAB+1(B) ;DON'T TEST MASTER + CAMN A,OBJTAB(Z) ;SEE IF ALREADY IN OBJTAB + JRST SAMOBJ ;YUH. +UCKL1: AOBJN B,UCKLUP + JRST PROVED ;ALL TRIED, NEW ENTRY IS UNIQUE +SAMOBJ: MOVE A,SEEKTB+1(B) ;SAME OBJTAB ENTRY, SEE ABOUT SEEKTB + CAME A,SEEKTB(Z) + JRST UCKL1 ;NOPE, KEEP CHECKING + JRST INCONT ;AHA! ALREADY IN--DON'T RECORD IT, RE-INIT PDL + +PROVED: AOS NOBJS ;ADD ONE TO # OF OBJS. + AOJ Z, ;INCREMENT INDEX +INCONT: MOVEI TT,OBJPDL-1 ;REINITIALIZE OBJ PDL POINTER + + +CONTIN: AOBJN T,OBJLUP ;LOOP THRU ALL CHARS IN COMMAND LINE + POPJ P, ;RETURN TO MAIN READ LOOP + +NOWON: MOVEI A,'OFF + SKIPL SEEKTB(Z) + MOVEI A,(SIXBIT /ON-/) + HRRM A,NWMSG1 + MOVEI A,NOWMSG + PUSHJ P,TYPE6 + .IOT TYOC,[^M] + PUSH P,T ;CONVERT ROUTINE UPSETS T + PUSHJ P,AHEM ;GET INFO IN OUTPUT BLOCK + POP P,T + MOVE B,[440700,,MSGLOC] + ILDB A,B + .IOT TYOC,A + CAIE A,^M + JRST .-3 + + MOVEI TT,OBJPDL-1 + JRST CONTIN + +NOWMSG: SIXBIT /*ALREA/ +NWMSG1: SIXBIT /DY XXXLINE:%/ + +CHOVFL: MOVEI A,[ASCIZ /TOO MANY CHARS: /] + PUSHJ P,TYPE7 + HLLZ B,TT ;CHAR COUNT + MOVN B,B +BARFLP: MOVE A,OBJPDL(B) + .IOT TYOC,A + AOBJN B,BARFLP + .IOT TYOC,[^M] + MOVEI TT,OBJPDL-1 + SETZM RUNFLG ;GIVE HIM CHANCE TO CORRECT + JRST CONTIN + +TTYGET: SETZ + SIXBIT /TTYGET/ + [TYIC] + 2000,,T1 ;PUT INFO IN ACCS + 2000,,T2 + 402000,,T3 + +TTYSET: SETZ + SIXBIT /TTYSET/ + [TYIC] + T1 ? T2 ? SETZ T3 + +NOOBJS: ASCIZ / +WOOF? WHAT DO I LOOK FOR? +/ + + +TYPE7: HRLI A,440700 ;SET UP BYTE POINTER (ADDR IN A AS ARG.) + MOVEM A,PT7' ;STORE SO DON'T NEED EXTRA ACC +PSHOUT: ILDB A,PT7 ;GET CHAR + JUMPE A,TYPDON ;STOP WHEN ZERO CHAR REACHED (^@) + .IOT TYOC,A + JRST PSHOUT ;LOOP FOREVER +TYPDON: POPJ P, ;BYEBYE + +TYPE6: HRLI A,440600 ;BYTE POINTER TO 6BIT CHARS + MOVEM A,PT6' ;POINTER LIKE FOR TYPE7 +SHVOUT: ILDB A,PT6 ;GET CHAR + CAIN A,'% ;'%' IS DELIMITER + POPJ P, ;RETURN WHEN THRU + ADDI A,40 ;CONVERT 6BIT TO ASCII + .IOT TYOC,A + JRST SHVOUT + + +OBJPDL: BLOCK 50 ;PDL FOR OBJ. NAME CHARS +CHLIST: BLOCK 200. ;200. CHARS SHOULD BE ENUF FOR ONE LINE! +HACKTB: BLOCK OBLIM ;SCRATCHPAD FOR LISTING OBJECTS +COMLOC: BLOCK 21. ;FOR STORING COMMAND LINE (MAX 80. CHRS) + + +INFLOC: ASCIZ / HOW-2 TRAIN FIDO: +GIVE FIDO UP TO 10 THINGS TO WATCH FOR, SEPARATED BY COMMAS, BLANKS, +OR CARRIAGE RETURNS. THERE ARE FIVE TYPES OF OBJECTS: + 1) USER JUST GIVE THE UNAME, E.G.'LOSER' + 2) TTY GIVE 'T' FOLLOWED BY 2-DIGIT OCTAL TTY #, E.G. 'T04' + 3) HOST GIVE 3-DIGIT OCTAL HOST NUMBER,FOLLOWED BY 'H'. + 4) JOB GIVE 'J=' FOLLOWED BY THE NAME OF THE JOB TO WATCH FOR. + 5) DEVICE GIVE: '*LPT*' FIDO BARKS IF PRINTER USED + '*DIS*' DITTO FOR 340 DISPLAY + '*SIX*' DITTO FOR PDP-6 + '*TV*' BARKS IF ANY TV FREE + +- A MINUS SIGN PREFIXED TO ANY OF THE ABOVE WILL MAKE FIDO BARK + IN THE ABSENCE (NOT PRESENCE) OF THE OBJECT FOLLOWING. +! An excl. point prefixed to any of above makes Fido bark only + on transitions to desired state, and not forget about + the object. +Z PREFIX BY DECIMAL # TO SET SLEEP TIME IN SECS (DEFAULT 10 SEC) +^L LISTS OBJECTS THUS FAR, CLEARS SCREEN IF DATAPOINT +^G KILLS THE CURRENT LINE, STOPS TYPEOUT IF ANY +RUBOUT--AS USUAL + + FINALLY, TO USE YOUR WATCHDOG, GIVE +^S WHICH WILL START FIDO PROWLING THE GROUNDS. +/ + +CONSTANTS +VARIABLES +REPORT [END OF FIDO]\.-1 + +END GO