;COPYRIGHT GENERAL SCIENTIFIC CORPORATION ;ROCKVILLE, MD. ; ;THIS SOFTWARE MAY BE FREELY DISTRIBUTED BY DECUS FOR NON-COMMERCIAL PURPOSES ;SUBJECT TO GSC COPYRIGHT AND DECUS REGULATIONS. ; .TITLE TSX-PLUS WATCH DOG PROGRAM .ENABL LC .GLOBL DATE,ASCBIN,TIMDIF ; ; This routine runs as a detatched job or as a virtual ; or even main job. Its function is to schedule detached ; jobs at times and dates stored in the file WAT:WATCHD.DAT. ; ; The data file must be set-up as follows on a line-by-line basis: ; ; 12345678901234567890123456789012 ; 14:00 03-MAY-82 DEV:FILNAM.COM time and date fully specified ; 16:00 **-***-82 DEV:FILNAM.COM run every day at certain time ; 18:00 **-JUN-82 DEV:FILNAM.COM run every day of June at time ; 08:00 01-***-82 DEV:FILNAM.COM run on date every month ; ; Some assumptions: ; ; 1. The time must always be fully specified ; ; 2. The day or month can be wild carded ; ; 3. The data file must be in assending order by time ; ; 4. Data file has fixed length records of 32 bytes and can ; a maximum of two blocks (or 32 entries) ; ; 5. The file name specified must be a command file for TSX-Plus ; ; 6. The system must be generated so that there are enough detatched ; lines in the system. The total number required will depend upon ; how many simultaneous jobs will be executing on the system. At ; a minimum, two lines are required. ; ; ; ; Ned W. Rhodes September 1982 ; ; .MCALL .PRINT,.EXIT,.CLOSE,.READW,.LOOKUP .SBTTL Constants and Equates .PAGE WILD = '* ;WILD CARD SYMBOL CR = 15 ;CARRIAGE RETURN LF = 12 ;LINE FEED BELL = 7 ;A BELL CAR = 15 ;CARRIAGE RETURN TIME = 0 ;TIME FIELD OFFSET DAY = 6 ;DAY FIELD OFFSET MONTH = 9. ;MONTH FIELD OFFSET MONTH2 = 10. ;MONTH FIELD OFFSET HOURS = 0 ;HOURS FIELD OFFSET MINUTE = 3 ;MINUTES FIELD OFFSET .SBTTL Main program loop .PAGE ; ; ; Open file and read in information ; ; WATCH:: .LOOKUP #LAREA,#1,#FILEN ;WHERE IS FILE?? BCC 1$ ;CONTINUE .PRINT #LOOK ;ERROR MESSAGE .EXIT 1$: .READW #LAREA,#1,#BUFFER,#512.,#0 ;READ IT BCC 2$ ;CONTINUE .PRINT #REED ;ERROR MESSAGE .EXIT 2$: .CLOSE #1 ;RELEASE FILE MOV #BUFFER,R0 ;POINT TO BUFFER ; ; ; Loop here until we have done all the entries ; ; MLOOP: TST (R0) ;ARE WE DONE?? BEQ DONE ;YES CMP #BUFEND,R0 ;AT END OF BUFFER?? BLE DONE ;YES ; ; ; Check for wild day and month ; ; CMPB #WILD,DAY(R0) ;IS IT WILD?? BNE TEST2 ;NOPE CMPB #WILD,MONTH(R0) ;IS IT WILD?? BEQ DVALID ;YES--PROCESS ; ; ; Check for wild day and month exact ; ; TEST2: MOV #PARM,R5 ;GET PARAMETER BLOCK MOV R0,-(SP) ;STACK R0 CALL DATE ;GET ASCII DATE MOV (SP)+,R0 ;RESTORE R0 CMPB #WILD,DAY(R0) ;IS IT WILD?? BNE TEST3 ;NOPE--NEXT TEST CMP MSTOR2,MONTH2(R0) ;MATCH?? BNE TEST3 ;NOPE--NEXT TEST CMP MSTOR,MONTH(R0) ;MATCH?? BEQ DVALID ;YES--PROCESS ; ; ; Check for wild month and exact date ; ; TEST3: CMPB #WILD,MONTH(R0) ;IS IT WILD?? BNE TEST4 ;NOPE--NEXT TEST CMP DSTOR,DAY(R0) ;DATES EXACT?? BEQ DVALID ;YES--PROCESS ; ; ; Check for exact day and month match ; ; TEST4: CMP DSTOR,DAY(R0) ;DAYS THE SAME?? BNE RECYC2 ;NOPE--TRY NEXT ENTRY CMP MSTOR2,MONTH2(R0) ;MONTH MATCH?? BNE RECYC2 ;NOPE--TRY NEXT ENTRY CMPB MSTOR,MONTH(R0) ;MONTH MATCH?? BNE RECYC2 ;NOPE--TRY NEXT ENTRY ; ; ; When we get here, the current entry has a valid day/month ; ; DVALID: MOV R0,-(SP) .PRINT #MSG1 MOV (SP)+,R0 MOV R0,R1 ;ADDRESS OF STRING CALL ASCBIN ;CONVERT HOURS MOV R3,IHR ;AND SAVE IT MOV R0,R1 ;ADDRESS OF STRING ADD #3,R1 ;POINT TO MINUTES CALL ASCBIN ;CONVERT IT MOV R3,IMIN ;SAVE IT MOV #PARM2,R5 ;GET THE PARAMETER BLOCK MOV R0,-(SP) ;SAVE R0 CALL TIMDIF ;TODAY OR TOMORROW ; ; ; Check here for an interval of < 1 second as that ; means that we want to schedule something right ; away. ; ; TST IFLG ;TODAY OR TOMORROW BEQ SCHED ;TODAY -- SCHEDULE IT TST R2 ;CHECK HIGH ORDER BITS BNE RECYC ;NOT SAME MINUTE TST R3 ;CHECK FOR SPECIAL CASE BMI RECYC ;A MINUS IN R3 CMP #3600.,R3 ;LESS THAN ONE MINUTE?? BGT DETAT ;YES, DETATCH THE JOB NOW BR RECYC ;NOPE, MORE ; ; ; Now we sleep a while and when we wake-up ; we schedule our little detached job ; SCHED: MOV R3,-(SP) ;SAVE TIME MOV R2,-(SP) ;SAVE TIME MOV SP,R0 ;EMT POINTER MOV R0,-(SP) ;STACK IT MOV #24*400,-(SP) ;SET .TWAIT CODE MOV SP,R0 ;R0 -> ARG BLOCK EMT 375 ;.TWAIT BIC R0,R0 ;R0=0 ADC R0 ;C=1 IF ERROR ADD #10,SP ;POP ARGS ; ; ; Here is where we actually detatch the job ; to TSX ; ; DETAT: MOV (SP)+,R0 ;RESTORE R0 MOV R0,-(SP) ;AND SAVE AGAIN ADD #16.,R0 ;POINT TO FILE NAME MOV #JOBER,R2 ;POINT TO STORAGE AREA MOVLP: MOVB (R0)+,(R2)+ ;SAVE IT CMPB #CAR,(R0) ;DID WE HIT WE A C/R?? BNE MOVLP ;NOPE CLRB (R0) ;INSURE A ZERO .PRINT #JOBER ;PRINT THE FILE NAME FOR NOW MOV #EMTTER,R0 ;POINT TO EMT BLOCK EMT 375 ;DETATCH IT ; ; Check for errors here ; ; BCC RECYC ;NO ERROR MOV #MSGEMT,R0 ;SEND A MESSAGE EMT 375 ;SEND A MESSAGE TO OPERATOR ; ; ; Point to the next line of the buffer ; ; RECYC: MOV (SP)+,R0 ;RESTORE R0 RECYC2: ADD #32.,R0 ;POINT TO NEXT ONE MOV R0,-(SP) .PRINT #MSG3 MOV (SP)+,R0 JMP MLOOP ;TRY AGAIN ; ; ; Sleep until midnight and start this all over again ; ; DONE: .PRINT #MSG2 MOV #24.,IHR ;MIDNIGHT MOV #1.,IMIN ;PLUS 1 MOV #PARM2,R5 ;POINT TO PARAMETER BLOCK CALL TIMDIF ;COMPUTE DIFFERENCE MOV R3,-(SP) ;SAVE TIME MOV R2,-(SP) ;SAVE TIME MOV SP,R0 ;EMT POINTER MOV R0,-(SP) ;STACK IT MOV #24*400,-(SP) ;SET .TWAIT CODE MOV SP,R0 ;R0 -> ARG BLOCK EMT 375 ;.TWAIT BIC R0,R0 ;R0=0 ADC R0 ;C=1 IF ERROR ADD #10,SP ;POP ARGS JMP WATCH ;AND RECYCLE .SBTTL Buffers and storage .PAGE BUFFER: .BLKW 512. ;WHAT TO DO BUFFER BUFEND = . ;END OF BUFFER LAREA: .BLKW 10. ;EMT AREA IHR: .WORD 0 ;HOURS IMIN: .WORD 0 ;MINUTES ZERO: .WORD 0 ;ZERO IFLG: .WORD 0 ;TODAY/TOMORROW FLAG EMTTER: .BYTE 0,132 ;TSX EMT BLOCK .WORD JOBER ;THE FILE NAME ADDRESS MSGEMT: .BYTE 0,127 ;SEND MSG EMT .WORD 6 ;DESTINATION LINE .WORD MSG ;THE MESSAGE MSG: .ASCII /?WATCH-I-Unable to start detatched job -- / JOBER: .BLKW 8. ;FILE NAME PARM2: .WORD IHR .WORD IMIN .WORD ZERO .WORD ZERO .WORD IFLG DSTOR: .BYTE 0,0,0 ;DAY MSTOR: .BYTE 0 ;MONTH MSTOR2: .BYTE 0,0,0,0,0 ;REST OF DATE .EVEN PARM: .WORD 1 ;ONE PARAMETER .WORD DSTOR ;RETURNED DATE FILEN: .RAD50 /WATWATCHDDAT/ ;DATA FILE LOOK: .ASCIZ /?WATCH-F-File WAT:WATCHD.DAT not found/ REED: .ASCIZ /?WATCH-F-Read error on WAT:WATCHD.DAT/ MSG1: .ASCIZ /?WATCH-I-Day-month match/ MSG2: .ASCIZ /?WATCH-I-Sleep until midnight/ MSG3: .ASCIZ /?WATCH-I-Recycle/ .END WATCH