;************************************************************************ ; 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 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,@A6 ;RESET TERMINAL CHARACTERISTICS ANDW #^C,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) END .