diff --git a/build/misc.tcl b/build/misc.tcl index 348e92bb..c12f1a07 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -749,6 +749,10 @@ respond "*" ":link device;jobdev hf,device;jobdev hsname\r" respond "*" ":midas device; jobdev shoe_rwk; gunner\r" expect ":KILL" +# Trivial Gunner +respond "*" ":midas cstacy;_gunner >\r" +expect ":KILL" + # pr respond "*" ":midas sys1;ts pr_sysen1;pr\r" expect ":KILL" diff --git a/build/timestamps.txt b/build/timestamps.txt index 38d974a6..0b3bb382 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -250,6 +250,7 @@ cprog/search.c 197704190853.24 cprog/shell.c 197710221249.25 c/phase.args 197608191750.12 c/recipe.text 197608280859.25 +cstacy/gunner.6 198502200143.45 c/stdio.h 198007161739.28 c/testc.c 197704170753.25 c/testc.stinkr 197705210818.40 diff --git a/src/cstacy/gunner.6 b/src/cstacy/gunner.6 new file mode 100644 index 00000000..16ba1724 --- /dev/null +++ b/src/cstacy/gunner.6 @@ -0,0 +1,476 @@ +;-*- Mode: Midas -*- + +TITLE GUNNER - Trivial Gunner Demon + +;;; ACs. + +Z=0 ;Super temp. +A=1 ;A-E general purpose, +B=2 ; always preserved. +C=3 +D=4 +E=5 +TY=6 ;TTY number. +T=15 ;Temps. +TT=T+1 +P=17 ;Stack pointer. + +;;; I/O Channels. + +CLIC==1 ;CLI output. +ERRI==2 ;ERR device input. +TTYO==3 ;TTY typeout. + +;;; Other crap. + +MEMSIZ=1000000 ;The size of memory. +PG$BTS==10. ;# Bits in page addr. +PG$SIZ=1_PG$BTS ;ITS page size in words. +PG$DEC=PG$SIZ/2 ;DEC page size in words. +PG$MSK==PG$SIZ-1 ;Mask for page address bits. + + + +SUBTTL Basic Definitions + +DEFINE INFORM A,B,C,D,E,F,G +PRINTX \A!B!C!D!E!F!G +\ +TERMIN + +DEFINE IFCE A,B +IFE SIXBIT/A/-SIXBIT/B/,TERMIN + +DEFINE SYSCAL A,B + .CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))] +TERMIN + +CALL==: ;Procedure call. +RET==: ;Return. +CALRET==:JRST ;Tail-recursive call. +NOP==: ;(On KL's TRN is faster but who cares.) +IF2, LOSE=:JSR AUTPSY +DDTBRK=:.BREAK 16, + +DEFINE EVAL SYM,PLACE + MOVE T,[SQUOZE 0,SYM] + .EVAL T, + .VALUE [ASCIZ ":System symbol missing"] + MOVEM T,PLACE +TERMIN + +DEFINE DELAY SCALE,TIM +IFCE SCALE,MS, MOVEI Z,2000.*TIM +IFCE SCALE,US, MOVEI Z,TIM +IFCE SCALE,SEC,MOVEI Z,20000.*TIM + SOJG Z,. +TERMIN + +DEFINE ROUND AC + SKIPE AC+1 + AOS AC +TERMIN + +DEFINE PUSHER AC,LIST +SF==0 +IRP LOC,,[LIST] +PUSH AC,LOC +SF==SF+1 +TERMIN +TERMIN + +DEFINE POPPER AC,LIST +IRP LOC,,[LIST] +POP AC,LOC +TERMIN +TERMIN + +DEFINE TMPLOC VAL,ARG + %%%TLC==. + LOC VAL + ARG + LOC %%%TLC +TERMIN + + +;;; Compatability definitions: + +DEFINE NOTHING +TERMIN + +CRET==%CLOUT,, +EQUALS PUSHAE,PUSHER +EQUALS POPAE,POPPER +EQUALS LVAR,NOTHING + + +SUBTTL Formatted Output + +FMTIN: PUSHER P,[A,B,C] + PUSH P,[FMTOUT] + JRST @-4(P) +FMTOUT: POPPER P,[C,B,A] + POP P,(P) + RET + + +DEFINE FORMAT STRM,&STRING&,ARGS + CALL [ IFSE STRM,T, MOVEI Z,TTYO + .ELSE MOVEI Z,STRM + MOVEM Z,OCHAN + CALL FMTIN + ZZZ==-1 + IRP ARG,,[ARGS] + PUSH P,ARG + ZZZ==.IRPCNT + TERMIN + HRROI A,[ASCII STRING] + MOVEI B,.LENGTH STRING + MOVNI C,ZZZ+1 + CALRET FORMAT"FORMAT ] +TERMIN + + +DEFINE TYO STRM,CHAR + CALL [ IFSE STRM,T, MOVEI Z,TTYO + .ELSE MOVEI Z,STRM + MOVEM Z,OCHAN + MOVEI T,CHAR + SYSCAL IOT,[ OCHAN ? T ] + LOSE + RET ] +TERMIN + +DEFINE CRLF STRM + FORMAT STRM,"~%" +TERMIN + + +;;; Provide a layer of protective sugar for random output routnes. +;;; Routines take channel in OCHAN and never skip. + +DEFINE OUTPUT STRM,RTN + CALL [ IFSE STRM,T, MOVEI Z,TTYO + .ELSE MOVEI Z,STRM + MOVEM Z,OCHAN + CALL RTN + RET ] +TERMIN + +;;; REPORT something on the TTY or in the log file. + +DEFINE REPORT &STRING&,ARGS + CALL [ SKIPE LOG + FORMAT T,STRING,[ARGS] + RET ] +TERMIN + +DEFINE REPOUT RTN + CALL [ SKIPE LOG + OUTPUT T,RTN + RET ] +TERMIN + +$$ITAB==1 ;GETPOS provided +$$IERR==0 ;Use default error macro. +$$PCODE==0 ;CLI device doesn't support it +$$ENGL==0 ;English numbers not needed +$$PFN==0 ;File names not needed +$$ERRS==0 ;Errors not needed +.INSRT DSK:SYSENG;FORMAT + + +;;; DATPT - Print the current date and time. +;;; Uses KLH's time hacking package. +;;; Looks like 7 August 1976 08:31 EDT + +.INSRT DSK:KSC;TIMRTS + +DATPT: PUSHER P,[A,B] + CALL LTMENG ;Get ptr to date and time string. + HLRZ B,A ;Extract length. + HRLI A,440700 ;ASCII string.. + SYSCAL SIOT,[ OCHAN ? A ? B ] + LOSE + POPPER P,[B,A] + RET + +;;; TIMPT - Print the time in D (stolen from DDT). +;;; Arg to print is in D. +;;; Looks like HH:MM:SS + +TIMPT: PUSHER P,[C,D,E] + MOVEI C,0. + JUMPE D,CPOPJ + CAMGE D,TMT1(C) + AOJA C,.-1 +TMP3: IDIV D,TMT1(C) + MOVEI T,60(D) + SYSCAL IOT,[ OCHAN ? T ] + LOSE + MOVE D,E + TRNN C,1 + JRST TIMPT8 + CAIL C,5 + JRST TIMPT9 + MOVEI T,": + SYSCAL IOT,[ OCHAN ? T ] + LOSE +TIMPT8: AOJA C,TMP3 +TIMPT9: POPPER P,[E,D,C] + RET + + +TMT1: 36000. + 3600. + 600. + 60. + 10. + 1 + + + + +SUBTTL I/O routines + + +;;; OUTSTR - String output (simple cover function). +;;; A/ Bp to string +;;; B/ Length + +OUTSTR: MOVE T,OCHAN ;Get channel number + SYSCAL SIOT,[T ? A ? B] + LOSE ; Shouldn't lose. + RET ;Never skip. + + +;;; GETPOS - Get Horiztonal Cursor Position +;;; Channel in OCHAN +;;; Returns value in A, -1 if unknown + +GETPOS: SYSCAL RCPOS,[ OCHAN ? %CLOUT,,A ] + SKIPA A,[-1] + HRRZ A,A + RET + + +;;; DSKEOF - Move to end of file open in channel in A. + +DSKEOF: SYSCAL FILLEN,[ A ? %CLOUT,,T ] + LOSE + SYSCAL ACCESS,[ A ? T ] + LOSE + RET + + + + +SUBTTL Interrupt Handler, Misc, Etc. + +;;; EVSYMS - Place here any symbols you want evaluated. +;;; (This should be a table...) + +EVSYMS: EVAL LUBLK,LUBLK ;Length of luser block. + EVAL NCT,NCT ;Number of TTYs. + EVAL SLOADU,SLOADU + RET + +;;; Many Happy Returns + +POPJ1: AOS (P) ;Skip +CPOPJ: RET ;Return + +INTRET: SYSCAL DISMIS,[%CLBIT,,INTACS ? P] ;Interrupt return. + JSR SYSLOS + +SYSLOS:: +AUTPSY: 0 ;Here for fatal errors. +DONE: SKIPN DEBUG ;If not debugging +DEATH: .LOGOUT 1, ; just die. + .VALUE @ERRVAL ;Else val-out + JRST DEATH ;and die if proceeded. + +ERRVAL: 0 ;Error string. + + +;;; Interrupt Handler + +TMPLOC 42,{-LTSINT,,TSINT} ;New style interrupt handler. +INTACS==SETZ+2+T_6 ;Push T and TT; then JPC, SUUOH, and LSPCL. + +TSINT: INTACS,,P +LTSINT==:.-TSINT + + +SUBTTL Main Program + +GO:: +GUNNER: MOVE P,[-PDLLEN,,PDL-1] + CALL TIMINI ;Init time variables + LOSE ; fail if time unknown + CALL EVSYMS ;Find ITS symbols. + MOVE A,[-10.,,[ .ROPTION ? TLO 0,%OPINT\%OPOPC ;(BUMRTL?) + .ROPTION ? MOVEM B + .RMASK ? IOR 0,[%PIPDL\%PIIOC] + SIXBIT /XUNAME/ ? MOVEM MYUNM + SIXBIT /XJNAME/ ? MOVEM MYJNM ]] + SYSCAL USRVAR,[ %CLIMM,,%JSELF ? A ] + LOSE + SKIPLE LOG ;Where do reports go? + CAIA ;If user demanding log file + TLNN B,%OPDDT ;Or if not under DDT + JRST [ SYSCAL OPEN,[ %CLBIT,,<%DOWOV+.UAO> ? %CLIMM,,TTYO + [SIXBIT /DSK/] + [SIXBIT /GUNNER/] + [SIXBIT /LOG/] + [SIXBIT /SPACY/]] + LOSE + MOVEI A,TTYO + CALL DSKEOF + JRST GUNN09 ] + SYSCAL OPEN,[%CLBIT,,<.UAO+%TJDIS> ? %CLIMM,,TTYO ? [SIXBIT /TTY/]] + LOSE +GUNN09: SYSCAL SSTATU,[ %CLOUT,,D ? %CLOUT,,SYSDBG + %CLOUT,,E ? REPEAT 2,%CLOUT,,JUNK + %CLOUT,,B ? %CLOUT,,C ] + LOSE + REPORT "~%----~%" + OUTPUT T,DATPT + REPORT " ~S ~S (v~S). ~S ITS.~S",[MYUNM,MYJNM,VERSHN,B,C] + SKIPE SYSDBG + REPORT " being debugged" + HRLZ A,SLOADU ? HRRI A,A ? .GETLOC A, + MOVEI B,10000. + IDIVM B,A + ROUND A + REPORT "~&~D lusers, Fairshare= ~D%",[E,A] + SKIPLE D + JRST [ REPORT "~&System going down in " + IDIVI D,30. + ROUND D + REPOUT TIMPT + REPORT " -- logging out." + JRST GUNN99] + REPORT "~&" + +GUNN10: CALL FRETYS ;Free up idle TTYs. +GUNN90: REPORT "~&~S ~S logging out at ",[MYUNM,MYJNM] + OUTPUT T,DATPT +GUNN99: .CLOSE TTYO, + JRST DONE ;See yah. + + +SUBTTL Free idle TTYs + +;Losers connect to MC from safe sites or hardwired lines and leave their +;consoles sitting around idle forever and never log in. This also +;happens when broken terminals spuriously type ^Zs on MINITS HUBs. +; +; FRETYS flushes idle unlogged TTY users in a simple-minded fashion. +; Never skips. + +FRETYS: PUSHER P,[A,B,D] + MOVE TY,NCT ;Number of TTYs. + SUBI TY,1 ;Start with highest TTY number. +FRET10: SYSCAL TTYGET,[ %CLIMM,,%JSNUM(TY) + REPEAT 2, %CLOUT,,JUNK + %CLOUT,,B ] ;Job index. + LOSE ; Bogus NCT? + JUMPL B,FRET80 ;Ignore free consoles. + HRRM B,INDEX ;Remember index of loser. + SYSCAL TTYVAR,[ %CLIMM,,%JSNUM(TY) ? [SIXBIT /IDLTIM/] + %CLOUT,,A ] ;A gets idle time. + LOSE + MOVE T,[-4,,[SIXBIT /XUNAME/ ? MOVEM UNAME + SIXBIT /XJNAME/ ? MOVEM JNAME ]] + SYSCAL USRVAR,[ %CLIMM,,%JSNUM(B) ? T ] + LOSE + IDIVI A,30. ;Convert idle time to seconds. + ROUND A + MOVE D,A + CAMGE D,[60.*20.] ;Ignore if not yet idle for 20 minutes + JRST FRET80 + MOVE B,JNAME + CAMN B,[SIXBIT /HACTRN/] + JRST [ HLRO A,UNAME + CAMN A,[-1] + JRST FRET40 + JRST .+1 ] +FRET30: CAMG D,[60.*60.] ;Tattle on anyone idle over an hour. + JRST FRET80 + REPORT "~&Leaving alone T~2<~;0~O~> ~S ~S, idle ",[TY,UNAME,JNAME] + REPOUT TIMPT + JRST FRET80 + +FRET40: REPORT "~&Gunning job ~O T~2<~;0~O~> ~S, idle ",[INDEX,TY,UNAME] + REPOUT TIMPT + SYSCAL OPEN,[ %CLBIT,,.UAO ? %CLIMM,,CLIC + [SIXBIT /CLI/] + UNAME + [SIXBIT /HACTRN/]] + JRST FRET60 + FORMAT CLIC,"ï~2&[GUNNER: This console not in use for " + OUTPUT CLIC,TIMPT + FORMAT CLIC,"]~%" + .CLOSE CLIC, +FRET60: HRRZ A,INDEX + SKIPN DEBUG ;Don't gun if debugging. + .GUN A, ; Else give him the big see-yah. + NOP +FRET80: SOJGE TY,FRET10 ;System console is last. +FRET90: POPPER P,[D,B,A] ;Here when done. + RET ;Never skips. + + + +SUBTTL Map In Users +;;; LUSER takes a user index in A and maps a loser block into USRPAG. + +IFN 0,[ + +LUSER: PUSHER P,[A] + IMUL A,LUSER ;Compute addr of luser's block. + LSH A,-10. ;Page # in SYS job. + SYSCAL CORBLK,[ %CLIMM,,%CBNDR ? %CLIMM,,%JSELF + %CLIMM,,USRPAG ? [400000] ? A] + LOSE +];IFN0 + + + +SUBTTL Storage + +LUBLK: 0 ;Length of ITS user block. +NCT: 0 ;# of TTYs on machine. +SLOADU: 0 +SYSDBG: 0 + +PDLLEN==64. +PDL: BLOCK PDLLEN ;The Stack. +JUNK: 0 ;The kitchen sink. + +MYUNM: 0 ;Our user name. +MYJNM: 0 ;Our job name. + +VERSHN: .FNAM2 +DEBUG: 0 ;-1 iff debugging +LOG: -1 ;Controls logging: + ;-1 => log on TTY if have it, else file + ; 0 => no messages at all + ; 1 => use log file even if have TTY + +OCHAN: 0 ;Typeout channel. + +INDEX: 0 ;Job index of luser. +UNAME: 0 ;UNAME of luser. +JNAME: 0 ;JNAME of luser. + +USRPAG==<<.+PG$SIZ-1>/PG$SIZ>*PG$SIZ + +END GUNNER + + +;;; Local Modes: +;;; Mode:MIDAS +;;; Comment column: 32 +;;; End: