1! LAWRENCE UNIVERSITY COMPUTER CENTER APPLETON, WISCONSIN 54911 (414) 739-3681, EXT 564 PROGRAM NAME, VERSION AND DATE: TIMER, VERSION 1A, 12-JUN-74 PROGRAM AUTHORSHIP: 2! TIMER, ONE OF THE PROGRAMS OF THE TIMER PACKAGE, WAS DESIGNED AND WRITTEN BY PAUL KONING OF THE LAWRENCE UNIVERSITY COMPUTER CENTER. PURPOSE OF PROGRAM: 3! TIMER IS A PROGRAM THAT RUNS DETACHED TO DETERMINE EVERY 10 MINUTES THE NUMBER OF JOB (DETACHED AND NORMAL), THE STATUS OF ALL TERMINALS AND THE TIME REQUIRED (WALL-CLOCK TIME THAT IS) 4! FOR SOME DISK I/O. IT ALSO KEEPS TRACK OF THE DATE AND TIME AND SAVES IT, SO THAT IT CAN (TOGETHER WITH TIMOUT) DETERMINE SYSTEM UPTIME, NUMBER OF CRASHES AND THE LIKE. LANGUAGE AND OPERATING SYSTEM: 5! TIMER IS WRITTEN IN BASIC-PLUS FOR OPERATION UNDER RSTS V4A-12 ON A PDP11/20 OR PDP11/35 WITH 28K OF CORE. IT MAKES USE OF CERTAIN PRIVILEGED SYS FUNCTIONS PRESENT IN RSTS V4A-12. 6! IT ALSO MAKES FREQUENT REFERENCES TO THE RSTS SYSTEM TABLES. (FOR DETAILS, SEE THE RSTS-11 SYSTEM MANAGER'S GUIDE [DEC-11-ORSMA-B-D] AND THE RSTS LISTINGS). 10! AVAILABILITY: TIMER IS A NON-PROPRIETARY PROGRAM PRODUCT OF LAWRENCE UNIVERSITY. IT IS DISTRIBUTED AT COST FOR EDUCATIONAL USE, ON THE CONDITION THAT IT NOT BE SOLD, RENTED OR LEASED FOR PROFIT. LIMITATIONS: 11! TIMER WILL ONLY MONITOR A SYSTEM WITH UP TO 24 TERMINALS INCLUDING THE CONSOLE, AND IT WILL ONLY RUN ON RSTS V4A-12. IT IS PROBABLY POSSIBLE TO OPERATE IT UNDER RSTS/E, BUT TO DO THAT 12! A RATHER LARGE NUMBER OF MODIFICATIONS MAY BE NECESSARY. (A RSTS/E VERSION WILL BE DEVELOPED AND IS DUE FOR COMPLETION AROUND 1-OCT-74; THE SAME APPLIES TO THEOTHER PROGRAMS IN THE TIMER PACKAGE: TIMOUT AND CREATE) 13! FURTHER DOCUMENTATION: FOR FURTHER DOCUMENTATION, INCLUDING RUN INSTRUCTIONS AND USER'S GUIDE, PLEASE REFER TO THE TIMER DOCUMENTATION, MSPD # PDP11/74/010, OR CONTACT THE AUTHOR AT THE ADDRESS MENTIONED ABOVE. 20! DISCLAIMER: NEITHER THE AUTHOR OF THIS PROGRAM NOR LAWRENCE UNIVERSITY ASSUME ANY LIABILITY, EXPRESSED OR IMPLIED, WITH RESPECT TO THE CORRECTNESS OR PERFORMANCE OF THIS PROGRAM. 100 DIM M%(30) 105 A%=PEEK(2098%)+2%:B%=PEEK(A%):B%=B%+512% UNLESS B% AND 512%: A$=SYS(CHR$(6%)+CHR$(-6%)+CVT%$(SWAP%(A%))+ CVT%$(SWAP%(B%))) 106 ! SET THE "SYS" BIT IN JOB DATA WORD 110 ON ERROR GOTO 13000 :A$=SYS(CHR$(6%)+CHR$(-7%)) 120 PRINT"KB0 IS NOW LOGGED OFF":PRINT CHR$(10%);FOR I%=1% TO 10%:O%=0% 130 A$=SYS(CHR$(6%)+CHR$(7%)):A$=SYS(CHR$(6%)+CHR$(12%)) 140 ON ERROR GOTO 13000 :A$=SYS(CHR$(6%)+CHR$(-7%)) 150 CHANGE SYS(CHR$(6%)+CHR$(-3%)) TO M%: M%(I%)=M%(I%)+SWAP%(M%(I%+1%)) FOR I%=5% TO 25% STEP 2% 155 GOSUB 15000:GOSUB 16000 ! LOG OFF AND LOG ON AGAIN ON [254,254] 160 OPEN"TIMOUT.TMR" FOR INPUT AS FILE 1% !!!!! THIS FILE ON [254,254] HAS TO BE CREATED WITH "$CREATE" 210 DIM #1%,X%(5%),D%(4%,2000%):IF O% THEN X%(0%)=2% 220 J9%=X%(3%):IF X%(0%)=-1% THEN X%(4%)=X%(4%)+1% ELSE IF X%(0%)=0% THEN X%(5%)=X%(5%)+1% ELSE IF O% THEN X%(2%)=X%(2%)+1% ! CONSULT THE STATUS FLAG 230 D%(0%,J9%),D%(1%,J9%)=-1%:D%(2%,J9%)=D%(2%,0%):D%(3%,J9%)=D%(3%,0%): D%(4%,J9%)=X%(0%):J9%,X%(3%)=J9%+1% 235 A%,X%(0%)=-1% ! SET CRASH AND BYPASS FLAGS 240 FOR J%=J9% TO 2000% 245 IF A% THEN A%=0%:GOTO 280 250 FOR I%=1% TO 20% ! COUNT 30-SECOND LOOPS 260 SLEEP 30%:IF ASCII(CHR$(SWAP%(PEEK(2196%)))) THEN GOSUB 470 ! ARE LOGINS DISABLED? 265 D%(2%,0%)=PEEK(2050%):D%(3%,0%)=PEEK(2048%) ! SAVE TIME AND DATE OF LAST SCAN IN CASE OF CRASH 267 F7%=X%(0%):F7%=D%(4%,2000%) ! MAKE SURE ALL DATA IS NOW ON DISK 270 NEXT I% ! LOOP IF TIME IS NOT UP NOW 280 D%(2%,J%)=PEEK(2050%):D%(3%,J%)=PEEK(2048%) ! SAVE TIME AND DATE 310 K1%,K2%,K0%,L3%,L4%=0% 320 K0%=K0%+2%:K3%=PEEK(M%(11%)+K0%):IF K3%<0% THEN 410 ELSE IF K3%=0% THEN 320 330 K4%=PEEK(PEEK(K3%)):K5%=ASCII(CHR$(SWAP%(PEEK(K4%+28%))))/2% 340 IF ASCII(CHR$(PEEK(K4%+2%)))=K0% THEN 360 350 K2%=K2%+32% IF K2%<224%:GOTO 320 ! COUNT DETACHED JOBS 360 K1%=K1%+1% IF K1%<15%:L%=K5%:IF L%>=16% THEN 390 370 L2%=1%:L2%=L2%*2% FOR L9%=1% TO L% ! SHIFT BIT TO RIGHT PLACE 380 L3%=L3%+L2%:GOTO 320 ! NORMAL JOB COUNTED, KB# SAVED, WAS <16 390 L%=L%-16%:L2%=1%:L2%=L2%*2% FOR L9%=1% TO L% 400 L2%=SWAP%(L2%):L4%=L4%+L2%:GOTO 320 ! NORMAL, KB# >=16 410 D%(0%,J%)=L3%:D%(1%,J%)=L4%+K2%+K1% ! FINAL RESULTS SAVED 420 GOSUB 10000 ! REMEMBER THE TIME 430 OPEN"[254,254]TIME.TIM"FOR INPUT AS FILE 2%:INPUT LINE #2%,X$: CLOSE 2% 440 GOSUB 11000 ! HOW MUCH TIME PASSED BY ? 450 D%(4%,J%)=Q9%:X%(3%)=J%:NEXT J% ! ALWAYS SAVE THE INDEX 460 GOTO 13005 470 K0%=0% 480 K0%=K0%+2%:K3%=PEEK(M%(11%)+K0%):IF K3%<0% THEN RETURN ELSE IF K3%=0% THEN 480 490 IF RAD$(PEEK(M%(23%)+K0%))+RAD$(PEEK(M%(25%)+K0%))<>"SHUTUP" THEN 480 ! IS THERE ANY PROGRAM NAMED 'SHUTUP' RUNNING? 500 X%(0%)=0% ! SET FLAG FOR ORDERLY SHUTDOWN 510 CLOSE 1%,2% 520 GOTO 32000 ! QUIT BEFORE "SHUTUP" QUITS YOU! 10000 Q1%=PEEK(2050%):Q2%=ASCII(CHR$(PEEK(2052%))) 10010 Q3%=ASCII(CHR$(SWAP%(PEEK(2052%)))):Q4%=ASCII(CHR$(PEEK(2054%))) 10020 RETURN 11000 Q5%=PEEK(2050%):Q6%=ASCII(CHR$(PEEK(2052%))) 11010 Q7%=ASCII(CHR$(SWAP%(PEEK(2052%)))):Q8%=ASCII(CHR$(PEEK(2054%))) 11020 Q9%=(((Q1%-Q5%)*60%+Q2%-Q6%)*10%+Q3%-Q7%)*6%+Q4%-Q8% 11030 RETURN 13000 O%=-1%:RESUME 130 IF ERR=28%:RESUME 13005 ! IF ^C TYPED, IGNORE IT AND DETACH ANYWAY 13005 IF ERL>190% THEN X%(1%)=X%(1%)+1%:X%(0%)=1% 13006 CLOSE 1%,2%,3%:OPEN"ERROR.ERR" FOR OUTPUT AS FILE 4% 13007 A$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+""+CHR$(12%)+CHR$(10%)+ "TIMER ERROR #"+NUM$(ERR)+"AT LINE"+NUM$(ERL)+ CHR$(13%)+CHR$(10%)) 13008 A$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+"PLEASE INFORM C.C. STAFF"+ CHR$(12%)+CHR$(10%)) 13010 A$=SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)): A$=MID(A$,3%,INSTR(3%,A$,CHR$(0%))-3%) 13012 IF ERR=0% THEN A$="OVERFLOW OF 'TIMOUT.TMR[254,254]'" 13015 %,A$ 13019 %,"A1% =";A1%,"J% =";J% 13020 %,"LINE NUMBER";ERL:%,DATE$(0%),TIME$(0%):%:%, CHR$(26%);:CLOSE 4%:GOSUB 15000:GOTO 32010 ! WRITE REST OF ERROR MESSAGE, CLOSE FILES, AND LOG OFF 15000 CLOSE A% FOR A%=1% TO 12%:A%=PEEK(2098%)+2%:B%=PEEK(A%): B%=B%+8192% UNLESS B% AND 8192%:A$=SYS(CHR$(6%)+CHR$(-6%)+ CVT%$(SWAP%(A%))+CVT%$(SWAP%(B%))):A$=SYS(CHR$(6%)+CHR$(5%)): RETURN 16000 A$=SYS(CHR$(6%)+CHR$(4%)+RIGHT(SYS(CHR$(6%)+CHR$(14%)+CVT%$(0%)+ CVT%$(0%)+CHR$(254%)+CHR$(254%)),3%)):A%=PEEK(2098%)+2%: B%=PEEK(A%):B%=B%-8192% IF B% AND 8192%:A$=SYS(CHR$(6%)+CHR$(-6%)+ CVT%$(SWAP%(A%))+CVT%$(SWAP%(B%))):RETURN 32000 GOSUB 15000 ! LOG OFF (!) 32010 A$=SYS(CHR$(9%)) ! AND WIPE OUT 32767 END