;******************************************************
;
;   IF - command file conditional processing utility
;
;******************************************************
;1.0 25-Oct-84 DFP written by D. Pallmann.
;1.1 01-Nov-84 DFP add ".IF JOB" construct.
;
;       IF PPN=account command
;       IF PPN<>account command
;
;       IF TIME=hours:minutes command
;       IF TIME<hours:minutes command
;       IF TIME>hours:minutes command
;       IF TIME<>hours:minutes command
;
;       IF IDLE command

       VMAJOR=1
       VMINOR=1

       SEARCH  SYS
       SEARCH  SYSSYM

       .OFINI
       .OFDEF  PARAM,4                 ;parameter
       .OFDEF  TIME,4                  ;time of day
       .OFSIZ  IMPSIZ

START:  PHDR    -1,0,PH$REE!PH$REU      ;program header
       GETIMP  IMPSIZ,A5               ;allocate impure area
       JOBIDX  A4                      ;index JCB

GETPRM: LEA     A1,PARAM(A5)            ;convert compare parameter
       PACK                            ; to RAD50
       PACK                            ;  code
       BYP

CHKPRM: LEA     A0,PRMTBL               ;index parameter table
       MOV     #-2,D5                  ;pre-set jump index
10$:    TST     @A0                     ;end of table?
       JEQ     FMTERR                  ; yes - branch
       ADDW    #2,D5                   ;increment jump index
       CMM     (A0)+,PARAM(A5)         ;command match?
       BNE     10$                     ; no

BRANCH: MOVW    JMPTBL[~D5],D5          ;simulate TJMP D5
       JMP     JMPTBL[~D5]             ; instruction

PRMTBL: RAD50   /PPN   /
       RAD50   /TIME  /
       RAD50   /IDLE  /
       RAD50   /JOB   /
       LWORD   0

JMPTBL: WORD    IF.PPN-JMPTBL
       WORD    IF.TIM-JMPTBL
       WORD    IF.IDL-JMPTBL
       WORD    IF.JOB-JMPTBL

PAGE
IF.PPN: CMPB    @A2,#'=
       BEQ     PPN.EQ

PPN.NE: CMPB    (A2)+,#'<
       JNE     FMTERR
       CMPB    (A2)+,#'>
       JNE     FMTERR
       BYP
       CMPB    @A2,#'[
       BNE     10$
       INC     A2
10$:    GTPPN
       CMPB    @A2,#']
       BNE     20$
       INC     A2
20$:    BYP
       CMMW    JOBUSR(A4),D1
       JNE     EXECUT
       JMP     EXIT

PPN.EQ: INC     A2
       BYP
       CMPB    @A2,#'[
       BNE     10$
       INC     A2
10$:    GTPPN
       CMPB    @A2,#']
       BNE     20$
       INC     A2
20$:    BYP
       CMMW    JOBUSR(A4),D1
       JEQ     EXECUT
       JMP     EXIT

PAGE
IF.TIM: GTIMES  TIME(A5)
       CMPB    @A2,#'=
       BEQ     TIM.EQ
       CMPB    @A2,#'<
       BEQ     TIM.LT

TIM.GT: CMPB    (A2)+,#'>
       JNE     FMTERR
       CALL    GT.TIM
       CMMB    TIME(A5),D0
       JLT     EXIT
       JGT     EXECUT
       CMMB    TIME+1(A5),D1
       JGT     EXECUT
       JMP     EXIT

TIM.LT: INC     A2
       CMPB    @A2,#'>
       BEQ     TIM.NE
       CALL    GT.TIM
       CMMB    TIME(A5),D0
       JLT     EXECUT
       JGT     EXIT
       CMMB    TIME+1(A5),D1
       JLT     EXECUT
       JMP     EXIT

TIM.EQ: INC     A2
       CALL    GT.TIM
       CMMB    TIME(A5),D0
       JNE     EXIT
       CMMB    TIME+1(A5),D1
       JEQ     EXECUT
       JMP     EXIT

TIM.NE: INC     A2
       CALL    GT.TIM
       CMMB    TIME(A5),D0
       JNE     EXECUT
       CMMB    TIME+1(A5),D1
       JNE     EXECUT
       JMP     EXIT

GT.TIM: BYP
       GTDEC
       MOV     D1,D0
       CMPB    (A2)+,#':
       JNE     FMTERR
       GTDEC
       RTN

PAGE
IF.JOB: CMPB    @A2,#'=
       BEQ     IF.JEQ

IF.JNE: CMPB    (A2)+,#'<
       JNE     FMTERR
       CMPB    (A2)+,#'>
       JNE     FMTERR
       CALL    IF.JSR
       CMM     JOBNAM(A0),PARAM(A5)
       JNE     EXECUT
       JMP     EXIT

IF.JEQ: INC     A2
       CALL    IF.JSR
       CMM     JOBNAM(A0),PARAM(A5)
       JEQ     EXECUT
       JMP     EXIT

IF.JSR: BYP
       LEA     A1,PARAM(A5)
       PACK
       PACK
       JOBIDX  A0
       RTN

PAGE
;IF IDLE command
;
;       Execute command if system is idle
;       Used for MONTST, REBOOT, etc.

IF.IDL: MOV     JOBTBL,A0
10$:    MOV     (A0)+,D0
       BEQ     10$
       BMI     EXECUT
       MOV     D0,A1
       CMP     A1,A4
       BEQ     10$
       TSTW    JOBUSR(A1)              ;user idle if logged out
       BEQ     10$
       MOVW    JOBSTS(A1),D0           ;user idle if at monitor level
       ANDW    #J.MON,D0
       BNE     10$
       MOVW    JOBSTS(A1),D0           ;user idle if in external wait state
       ANDW    #J.EXW,D0
       BNE     10$
       CMM     JOBPRG(A1),#[SHE]_16.+[LL ] ;user idle if running SHELL
       BEQ     10$
       CMM     JOBPRG(A1),#[MOD]_16.+[EM ] ;user idle if running MODEM
       BEQ     10$
       CMM     JOBPRG(A1),#[LOG]_16.+[IN ] ;user idle if running LOGIN
       BEQ     10$
       CMM     JOBNAM(A1),#[TAS]_16.+[K  ] ;user idle if named TASK
       BEQ     10$
       JMP     EXIT

PAGE
EXECUT: BYP
       SAVE    A0-A5,D0-D5
       AMOS
       RSTCON
       REST    A0-A5,D0-D5
       JMP     EXIT

FMTERR: TYPECR  ? command format error
       CRLF
       BR      EXIT

EXIT:   EXIT

       END