1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-07 03:35:53 +00:00

Trivial Gunner used on MC.

This is a one-shot program.  It can be linked from DRAGON, with the
first file name e.g. HOURLY or DAILY for the desired frequency.  For
this to work, the file CSTACY; GUNNER LOG must exist.
This commit is contained in:
Lars Brinkhoff
2023-07-13 15:08:38 +02:00
parent bb10ad46ff
commit d9f7db33d5
3 changed files with 481 additions and 0 deletions

View File

@@ -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"

View File

@@ -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

476
src/cstacy/gunner.6 Normal file
View File

@@ -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==:<PUSHJ P,> ;Procedure call.
RET==:<POPJ P,> ;Return.
CALRET==:JRST ;Tail-recursive call.
NOP==:<JFCL> ;(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: