;************************************************************************
; AUTOLG - Automatic logoff program for those jobs without *
; activity for more than a specified period of time. In *
; the original version the time period is 7 minutes. This *
; effort is done to satisfy the requirements for logging off *
; unattended terminals. Only those jobs that have terminals *
; associated with them should be affected; all other jobs *
; should be in the EXEMPT table (this includes JOB1, spoolers *
; and any other special jobs.) *
; *
; PROGRAMMER: R. Forrest Stanley *
; SITE: Darnall Army Community Hospital, FT. Hood, Tx. *
; DATE: 12 September 1984 *
; *
; The US Army does not assume any responsibitiy or liability *
; for damages resulting from the use of this software. *
; *
;************************************************************************
; This creates AUTOLG.OBJ
; When the M68 is finished enter the command:
;
; LNKLIT AUTOLG <CR>
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
VMAJOR=1
VMINOR=0
EXTERN $OTCPU
PHDR -2,PV$RSM!PV$WSM!PV$RPD!PV$WPD!PV$PRV!PH$REU
START:
MOVB #0,D5 ;USE D6 FOR FIRST TIME FLAG
LEA A2,FN ;SET UP INPUT FILE SPECS
FSPEC DDB ;START INIT OF INPUT DDB
INIT DDB ; (NOTE THE CLEVER NAME FOR THE BUFFER)
LOOKUP DDB ;CHECK TO SEE IF THE FILE EXISTS
BNE 10$ ;NO, GO TO THE OUTPUT SECTION
OPENI DDB ;YES, OPEN INPUT FILE FOR TABLE BUILDING
BR INPUT
10$:
MOVB #^B11111111,D5 ;SET FLAG AND MOVE ON FOR FIRST RUN
JMP NEWFIL
INPUT:
LEA A2,JNAME ;LOAD INDEXES FOR ARRAYS
LEA A3,JCPU
30$:
FILINL DDB ;GET JOBNAME - PACKED
LEA A5,DDB ;TEST FOR END OF FILE
TST D.SIZ(A5) ;IF YES, GO TO WORK ON DATA
BEQ WORK
MOV D1,(A2)+ ;PUT INTO JOB NAME ARRAY
FILINL DDB ;GET OLD CPU TIME - BINARY
MOV D1,(A3)+
40$: FILINB DDB ;THIS LOOP WILL STRIP THE ASCII DATA
CMPB D1,#12 ;LOOK FOR LINE FEED
BNE 40$
BR 30$ ;NO, CONTINUE TO READ FILE
WORK: CLOSE DDB ;CLOSE INPUT FILE AND MOVE ON
MOV JOBTBL,A0 ;GET INDEX FOR JOB TABLE
AGAIN:
MOV (A0)+,D5 ;LOOK AT TABLE ENTRY
BEQ AGAIN ;IF, BLANK GO GET ANOUTH ENTRY
CMP D5,#-1 ;CHECK FOR END OF TABLE
BEQ 48$ ;YES, GO TO OUTPUT SECTION
LEA A4,EXEMPT ;SET INDEX FOR JOB EXEMPT TABLE
MOVB EXNUM,D6 ;SET COUNTER FOR THE NEXT LOOP (NUMBER OF EXEMPT JOBS)
MOV D5,A5 ;GET THE JOB NAME FOR THE EXEMPT LOOP
MOV JOBNAM(A5),D5 ;COMPARES
46$: CMP D5,(A4)+ ;TEST FOR EXEMPT JOB
BEQ AGAIN ;YES, GO GET ANOTHER JOB
DECB D6 ;UPDATE COUNTER
BNE 46$ ;IF NOT ZERO, LOOP
BR NEXT
48$: CLR D5 ;NEED TO CLEAR (LOOK AT START: )
JMP NEWFIL ;GO TO OUTPUT SECTION
NEXT:
LEA A2,JNAME ;INDEXES FOR PROCESSING JOBS
LEA A3,JCPU
CLR D3
MOVB CNT,D3 ;INITIALIZE COUNTER
52$: CMP D5,(A2)+ ;LOOK FOR JOBNAME TO MATCH CPU TIMES
BEQ 54$ ;NO, INC JCPU COUNTER
ADD #4,A3 ;INCREMENT JCPU COUNTER
SOB D3,52$ ;DECREMENT LOOP COUNTER
JMP AGAIN ;NO MATCH (WHICH IS REALLY AN ERROR)
54$: TSTW JOBUSR(A5) ;CHECK TO SEE IF THE JOB IS LOGGED IN
BEQ AGAIN ;IF NOT GO TO NEXT JOBTBL ENTRY
MOV JOBCPU(A5),D1 ;GET THE JOB CPU COUNT
CMP D1,(A3)+ ;CHECK IT FOR CHANGE
BEQ KILL ;IF SO, GO GET'EM
JMP AGAIN ;THIS JOB IS GOOD TO GO
KILL:
MOV JOBTRM(A5),A6 ;
ANDW #^C<LCL>,@A6 ;RESET TERMINAL CHARACTERISTICS
ANDW #^C<J.CAB>,JOBTYP(A5) ;RESET JOB CHARACTERISTICS
MOVW #[DSK],JOBDEV(A5) ;RESET USER DEVICE
CLRB JOBDRV(A5) ;AND NUMBER
MOV JOBBAS(A5),A6 ;CLEAR USER MEMORY PARTITION
MOV JOBSIZ(A5),D4 ;SET COUNTER
60$: CLRB (A6)+
SOB D4,60$
CLR JOBCON(A5) ;CLEAR JOBTBL PARAMETERS
CLR JOBCPU(A5) ;AND THEN
CLR JOBPRG(A5) ;THROW THE BUMM
CLR JOBUSR(A5) ; !!! OUT !!!
TRNS: JMP AGAIN ; !!! NEXT !!!
NEWFIL: ;CREATE THE INPUT FILE
CMPB D5,#377
BEQ 62$
CLR D5
CLR D3
DSKDEL DDB ;DELETE THE OLD FILE
62$: LEA A2,FN ;LOOK FAMILIAR???
FSPEC DDB ;
INIT DDB ;
OPENO DDB ;NO NEED TO CHECK THIS TIME, WE KNOW IT DON'T EXIST
MOV JOBTBL,A0 ;SET INDEX FOR THE JOB TABLE
OUTPUT: MOV (A0)+,D3 ;CHECK FOR BLANK ENTRY
BEQ OUTPUT
CMP D3,#-1 ;CHECK FOR END OF TABLE
BNE 64$
JMP FIN
64$: LEA A4,EXEMPT ;SET INDEX FOR EXEMPT JOBS
CLR D4
MOVB EXNUM,D4 ;SET COUNTER
MOV D3,A5 ;SAME AS ABOVE
MOV JOBNAM(A5),D3
66$: CMP D3,(A4)+ ;PROCESS JOB TABLE VS. EXEMPT
BEQ OUTPUT
SOB D4,66$
MOV JOBNAM(A5),D1 ;PUT JOB NAME AND CPU COUNT INTO FILE
FILOTL DDB
MOV JOBNAM(A5),A1 ;NOW WRITE IT IN ASCII
LEA A2,BUFF
UNPACK ;GET NAME INTO ASCII FROM RAD50
UNPACK
LEA A2,BUFF ;WRITE IT TO DISK
MOV (A2)+,D1
FILOTL DDB
MOV @A2,D1
FILOTL DDB
LEA A2,BUFF ;NOW DO THE CPU TIME IN ASCII
MOV JOBCPU(A5),D1
CALL $OTCPU
LEA A2,BUFF ;MOVE TIME TO DISK BYTE WISE
68$: MOVB (A2)+,D1
CMPB D1,#00 ;CHECK FOR END OF BUFFER
BEQ 70$
FILOTB DDB
BR 68$
70$: CLR D1
MOVW CL,D1 ;END RECORD WITH CRLF (SO WE CAN READ IT)
FILOTW DDB
JMP OUTPUT
FIN:
CLOSE DDB
SLEEP SNOOZE
JMP START
EXIT
;
; DATA DECLARATIONS
;
DDB: BLKB D.DDB
EVEN
FN: BYTE 'E,'X,'E,'M,'P,'T,'.,'D,'A,'T
BYTE 0
EVEN
SNOOZE: LWORD 4200000. ;4200000 :== 7 MINUTES
LWORD 0
EVEN
EXEMPT: RAD50 /JOB1 / ;THIS TABLE INCLUDES THE JOBS THAT WILL NOT BE
RAD50 /SPOOL / ;SCANNED. SHOULD INCLUDE THE OPCON AND ALL SPOOLED
RAD50 /TASK / ;DEVICES
RAD50 /AUTO /
RAD50 /DIABLO/
BYTE 0
EVEN
BUFF: BLKB 40
BYTE 0
EVEN
EXNUM: BYTE 5
EVEN
CL: BYTE 15
BYTE 12
EVEN
JNAME: BLKL 4
EVEN
JCPU: BLKL 4
EVEN
CNT: BYTE 5 ;THIS IS THE NUMBER OF JOBS TO BE SCANNED -
EVEN ;CNT : = JOBS - EXNUM (LATER IT WILL BE DONE BY THE PROGRAM)