diff --git a/build/dm.tcl b/build/dm.tcl index cbb45bdd..9880fc6f 100644 --- a/build/dm.tcl +++ b/build/dm.tcl @@ -6,3 +6,7 @@ log_progress "ENTERING BUILD SCRIPT: DM" # Demon starter. respond "*" ":midas sys; atsign demstr_sysen2; demstr\r" expect ":KILL" + +# Demon status. Self purifying. +respond "*" ":midas sysen2; ts demst_sysen2; demst\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index f0f97f5a..a17dccf8 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -86,6 +86,7 @@ - DCROCK, digital watch. - DDTDOC, interactive DDT documentation. - DECUUO, TOPS-10 and WAITS emulator. +- DEMST, demon status. - DEMSTR, demon starter. - DFTP, Datacomputer file transfer. - DIGEST, digestify a mailing list. diff --git a/src/sysen2/demst.19 b/src/sysen2/demst.19 new file mode 100755 index 00000000..8d8c8106 --- /dev/null +++ b/src/sysen2/demst.19 @@ -0,0 +1,415 @@ +TITLE RDDMST TAA 11/16/77 + +O=0 +A=1 +B=2 +C=3 +D=4 +E=5 ; MUNGED BY SOUT +F=6 +G=7 +H=8 +P=17 + +TTYO==1 +USRI==2 + +; CONSTANT STRING OUTPUT +DEFINE SOUT CHAN,TXT + MOVE E,[440700,,[ASCII /TXT/]] + MOVEI F,.LENGTH /TXT/ + .CALL [SETZ + SIXBIT /SIOT/ + MOVSI %TJDIS + MOVEI CHAN + E + SETZ F] + .LOSE 1000 +TERMIN + +DEFINE OHPOS NUM + .IOT TTYO,[^P] + .IOT TTYO,["H] + .IOT TTYO,[NUM+8.] +TERMIN + +SYSVER: 0 ; SYSTEM VERSION +JCLBUF: BLOCK 3 +EVTBL: + SQUOZE 0,L +L: 0 + SQUOZE 0,DMNFLG ; DEMONS ALLOWED? +DMNFLG: 0 + SQUOZE 0,DMTTBL +DMTTBL: 0 + SQUOZE 0,DMLNG +DMLNG: 0 + SQUOZE 0,DMTLL +DMTLL: 0 ; DMTLL,,DMTLL AFTER INIT + SQUOZE 0,FLSINS +FLSINS: 0 + SQUOZE 0,LSUUO +LSUUO: 0 + SQUOZE 0,USTP +USTP: 0 + SQUOZE 0,APRC +APRC: 0 + SQUOZE 0,UPC +UPC: 0 + SQUOZE 0,SUUOH +SUUOH: 0 +EVPTR: EVTBL-.,,EVTBL +DEMTAB: 0 ; AOBJN POINTER TO DMTTBL +TIME: 0 ; CURRENT TIME, DISK FORMAT +DAYPTR: 220500,,TIME ; POINTER TO DATE FIELD +MONPTR: 270400,,TIME ; POINTER TO MONTH FIELD +PDLLEN==20 +PDL: BLOCK PDLLEN + + +START: MOVE P,[-PDLLEN,,PDL] + .RSYSI A, + CAME A,SYSVER + JRST INIT + .CALL [SETZ + SIXBIT /OPEN/ + [.UAO+%TJDIS,,TTYO] + [SIXBIT /TTY/] + [SIXBIT /TTY/] + SETZ [SIXBIT /TTY/]] + .LOSE 1000 + SOUT TTYO,[It is now ] + .CALL [SETZ + SIXBIT /RQDATE/ + SETZM TIME] + .LOSE 1000 + HRRZ B,TIME + IDIVI B,120. ; MINUTES SINCE MIDNIGHT + IDIVI B,60. ; HOURS IN B, MINUTES IN C. + CAIGE B,10. + .IOT TTYO,["0] + MOVE A,B + PUSHJ P,DECPRT + .IOT TTYO,[":] + CAIGE C,10. + .IOT TTYO,["0] + MOVE A,C + PUSHJ P,DECPRT + SOUT TTYO,[, ] + LDB A,MONPTR + PUSHJ P,DECPRT + .IOT TTYO,["/] + LDB A,DAYPTR + PUSHJ P,DECPRT + .IOT TTYO,[".] + SKIPG @DMNFLG ; SKIP IF DEMONS ARE LEGAL + JRST [SOUT TTYO,[ Loading of demons is disabled.] + JRST .+1] + .SUSET [.ROPTIO,,A] + TLNN A,OPTCMD ; JCL? + JRST RDALL + .BREAK 12,[..RJCL,,JCLBUF] ; YES + MOVE B,[440700,,JCLBUF] + MOVE C,[440600,,A] + MOVEI A,0 +JCLLOP: TLNN C,770000 + JRST JCLDON + ILDB D,B + CAIE D,^M + CAIN D,^C + JRST JCLDON + JUMPE D,JCLDON + SUBI D,40 + CAIL D,100 + SUBI D,40 + IDPB D,C + JRST JCLLOP +JCLDON: MOVE B,DEMTAB +SCLOOP: CAMN A,(B) + JRST DOPRT + ADD B,DMTLL + JUMPL B,SCLOOP + SOUT TTYO,[ +No such demon?] + .BREAK 16,160000 + +DOPRT: PUSHJ P,DMPRT ; WANTS DEMON NAME IN A, ENTRY IN B + .BREAK 16,160000 + +RDALL: SOUT TTYO,[ + Name Index Next signal Interval] + MOVE B,DEMTAB +RDALOP: SKIPE A,(B) + PUSHJ P,DMPTAB + ADD B,DMTLL + JUMPL B,RDALOP + .BREAK 16,160000 + +; COME HERE TO PRINT STATUS FOR TABLE. NAME IS IN A, TABLE IN B. +DMPTAB: SOUT TTYO,[ +] + PUSHJ P,SIXPRT ; NAME + OHPOS 8. ; NEXT COLUMN + SKIPE C,1(B) + JRST DMPST1 + SOUT TTYO,[ Down] + JRST DMPNXT +DMPST1: JUMPL C,[SOUT TTYO,[ Load] + JRST DMPNXT] + SOUT TTYO,[ ] + IDIV C,L + CAIGE C,10 + .IOT TTYO,[" ] + MOVE A,C + PUSHJ P,OCTPRT + MOVE C,1(B) + MOVE A,@USTP ; JOB STOPPED? + TLNN A,100000 + JRST RUNNIN + SKIPL @APRC ; DISOWNED? + JRST MANSTP + SOUT TTYO,[==] ; DEAD, NEEDS CLEANING UP + POPJ P, +MANSTP: .IOT TTYO,["=] ; MANUALLY STOPPED + POPJ P, +RUNNIN: SKIPN @FLSINS + POPJ P, + MOVE A,@LSUUO + TLZ A,777 + CAME A,[.SLEEP] ; SLEEPING? + JRST [CAME A,[.HANG] + POPJ P, ; NO + MOVEI E,"+ + JRST NRMSLP] + MOVEI E,"* + MOVE A,@UPC + TLNE A,%PCUSR ; IN EXEC MODE? + JRST NRMSLP ; THINGS SURE HAPPEN FAST HERE + HRRZ A,@SUUOH + SUBI A,1 + IDIV C,L ; USER INDEX + TRO C,400000 + .CALL [SETZ + SIXBIT /OPEN/ + [<10\.UII>,,USRI] + [SIXBIT /USR/] + C + SETZI 0] + POPJ P, ; OH, WELL + .ACCESS USRI,A ; LOOK AT CURRENT INSTRUCTION + .IOT USRI,A + .CLOSE USRI, + CAME A,[XCT 35(2)] ; IF .SLEEP IS THIS, THEN IT'S A DEAD MUDDLE + JRST NRMSLP + SOUT TTYO,[**] + POPJ P, +NRMSLP: .IOT TTYO,E + POPJ P, +DMPNXT: OHPOS 18. + HLRZ A,2(B) + JUMPE A,[SOUT TTYO,[Never] + POPJ P,] + MOVE A,3(B) + JUMPE A,[SOUT TTYO,[Never] + POPJ P,] + PUSHJ P,NXTPRT ; TIME OF NEXT SIGNAL + OHPOS 36. + HLRZ A,2(B) + ASH A,1 + CAIL A,10000. + JRST DOPR + .IOT A,[" ] + CAIL A,1000. + JRST DOPR + .IOT A,[" ] + CAIL A,100. + JRST DOPR + .IOT A,[" ] + CAIL A,10. + JRST DOPR + .IOT A,[" ] +DOPR: PUSHJ P,DECPRT + POPJ P, + +; COME HERE TO PRINT A DEMON'S STATUS, NOT FOR TABLE. +; NAME OF DEMON IS IN A, ENTRY IN TABLE IS IN B. + +DMPRT: SOUT TTYO,[ +Demon ] + PUSHJ P,SIXPRT ; SIXBIT NAME OF DEMON + SKIPE C,1(B) ; IDX, 0, OR -1 + JRST ST1 + HLRZ A,2(B) + JUMPE A,[SOUT TTYO,[ is never automatically signalled. +] + JRST DPNDRQ] + MOVE A,3(B) + JUMPE A,[SOUT TTYO,[ will never be automatically signalled. +] + JRST DPNDRQ] + SOUT TTYO,[ will be signalled at ] + PUSHJ P,NXTPRT + .IOT TTYO,[".] + JRST STRAND +ST1: JUMPL C,[SOUT TTYO,[ is coming up.] + JRST STRAND] + SOUT TTYO,[ is up; job index is ] + IDIV C,L + MOVE A,C + PUSHJ P,OCTPRT + .IOT TTYO,[".] + POPJ P, +STRAND: HLRZ A,2(B) + JUMPE A,DONTSG + ASH A,1 + SOUT TTYO,[ +After next signal, will be signalled every ] + PUSHJ P,DECPRT + SOUT TTYO,[ minutes; ] + JRST DPNDRQ +DONTSG: SOUT TTYO,[ +Demon is not periodic; ] +DPNDRQ: HRRZ A,2(B) + PUSHJ P,DECPRT + SOUT TTYO,[ pending requests.] + POPJ P, + +; OUTPUT OCTAL # ON TTYO. # IS IN A. +OCTPRT: PUSH P,B + PUSH P,C + MOVE C,OCTLEN + JRST DECOTL + +; OUTPUT DECIMAL # ON TTYO. # IS IN A. +DECPRT: PUSH P,B + PUSH P,C + MOVE C,DECLEN +DECOTL: IDIV A,(C) + JUMPN A,DECOT1 + MOVE A,B + AOBJN C,DECOTL + .IOT TTYO,["0] + JRST DECDON +DECOT0: IDIV A,(C) +DECOT1: ADDI A,"0 + .IOT TTYO,A + MOVE A,B + AOBJN C,DECOT0 +DECDON: POP P,C + POP P,B + POPJ P, +DECTAB: 1000000. ? 100000. ? 10000. ? 1000. ? 100. ? 10. ? 1. +DECLEN: DECTAB-.,,DECTAB +OCTTAB: 1000000 ? 100000? 10000 ? 1000? 100 ? 10 ? 1 +OCTLEN: OCTTAB-.,,OCTTAB + +; OUTPUT SIXBIT. WORD IS IN A. +SIXPRT: PUSH P,B + PUSH P,C + MOVE B,[440600,,A] +SIXLOP: ILDB C,B + JUMPE C,SIXDON + ADDI C,40 + .IOT TTYO,C + TLNE B,770000 + JRST SIXLOP +SIXDON: POP P,C + POP P,B + POPJ P, + +; PRINT TIME OF NEXT SIGNAL. TIME TO NEXT SIGNAL IS IN A. +NXTPRT: PUSH P,C + PUSH P,D + PUSH P,E + PUSH P,F + PUSH P,G + HRRZ D,TIME + IDIVI D,120. ; MINUTES SINCE MIDNIGHT + ASH A,1 + ADD D,A ; MINUTES BETWEEN MIDNIGHT AND SIGNAL + IDIVI D,60.*24. ; DAYS IN D, MINUTES IN E + IDIVI E,60. ; HOURS IN E, MINUTES IN F + MOVE A,E + CAIGE A,10. + .IOT TTYO,["0] + PUSHJ P,DECPRT + .IOT TTYO,[":] + MOVE A,F + CAIGE A,10. + .IOT TTYO,["0] + PUSHJ P,DECPRT + JUMPE D,NXTOUT + SOUT TTYO,[, ] + LDB E,MONPTR ; GET MONTH + LDB F,DAYPTR ; GET DAY + ADD F,D + IDIV F,MONLEN(E) ; TURN INTO MONTHS PLUS DAYS + JUMPE G,[MOVE G,MONLEN(E) + JRST NXTPR1] + ADD E,F +NXTPR1: MOVEI A,(E) + PUSHJ P,DECPRT + .IOT TTYO,["/] + MOVEI A,(G) + PUSHJ P,DECPRT +NXTOUT: POP P,G + POP P,F + POP P,E + POP P,D + POP P,C + POPJ P, + +; INITIALIZE: EVAL SYMBOLS, MAP IN SYSTEM, DO PDUMP. +; SYSTEM VERSION IS IN A. +INIT: MOVEM A,SYSVER + MOVE A,EVPTR +EVLOP: MOVE B,(A) + .EVAL B, + .VALUE + MOVEM B,1(A) + ADD A,[2,,2] + JUMPL A,EVLOP + MOVE A,DMTLL + HRLI A,(A) + MOVEM A,DMTLL ; DMTLL,,DMTLL FOR SEARCH LOOP + MOVN A,DMLNG + HRLI A,(A) + HRR A,DMTTBL + MOVEM A,DEMTAB ; AOBJN POINTER TO DEMON TABLE + MOVE A,FLSINS ; TO DECIDE IF CROCK IS SLEEPING + HRLI A,C + MOVEM A,FLSINS + MOVE A,LSUUO + HRLI A,C + MOVEM A,LSUUO + MOVE A,APRC + HRLI A,C + MOVEM A,APRC + MOVE A,USTP + HRLI A,C + MOVEM A,USTP + MOVE A,UPC + HRLI A,C + MOVEM A,UPC + MOVE A,SUUOH + HRLI A,C + MOVEM A,SUUOH + MOVE B,[-377,,1] + MOVEI A,1 + .CALL [SETZ + SIXBIT /CORBLK/ + MOVEI %CBRED + MOVEI %JSELF + B + MOVEI %JSABS + SETZ A] + .LOSE 1000 + .VALUE [ASCIZ / +:PDUMP SYS2;TS DEMST +:CONTIN +/] + JRST START + +MONLEN: 0 ? 31. ? 28. ? 31. ? 30. ? 31. ? 30. ? 31. ? 31. ? 30. ? 31. ? 30. ? 31. + +END START \ No newline at end of file