;************************************************************************
;       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)

       END