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