; ;****************************************************************************** ; ;CHECK FOR ERROR & DIE IF FIND ONE. ; ;****************************************************************************** ; .MACRO CHKERR,ADDR,?L1 .IF NB ADDR BLBS R0,ADDR ;EVERYTHING IS OK. $EXIT_S R0 ;UH OH, ERROR --- DIE!!! .IFF BLBS R0,L1 $EXIT_S R0 L1: .ENDC .ENDM CHKERR ; ;****************************************************************************** ; ;INCRIMENT VALUE AS SPECIFIED & GENERATE ERROR IF OVERFLOW OCCURS. ; ;****************************************************************************** ; .MACRO INCCHK VAL,INC,MAX VAL= VAL + INC ;DUH. .IF GT VAL - MAX ;TOO BIG? .ERROR ;MAX IS TOO SMALL. .ENDC .ENDM INCCHK ; ;****************************************************************************** ; ;OFFSET DEFINITIONS. ; ;****************************************************************************** ; .MACRO OFFSET FIELD,LENGTH,BEGIN .IF NB BEGIN .CUR_OFFSET.= 0 .ENDC FIELD= .CUR_OFFSET. .CUR_OFFSET.= .CUR_OFFSET. + LENGTH .ENDM OFFSET ; ;****************************************************************************** ; ;DEFINE ENTRY SIZE. ; ;****************************************************************************** ; .MACRO DEFSIZ VAR VAR= .CUR_OFFSET. .ENDM DEFSIZ ; ;****************************************************************************** ; ;WAIT THE SPECIFIED # OF SECONDS. ; ;****************************************************************************** ; .MACRO WAITSEC WAKEUP,?L1,?L2 .IF IDN %EXTRACT(0,1,WAKEUP) # ;IF 1ST CHAR IS # SIGN, CREATE ;OWN ASCII TIME -- OTHERWISE ASSUME ;WAKEUP IS POINTER TO BINARY TIME TO ;WAKE UP. $BINTIM_S TIMBUF=L1,- ;FIND OUT WHEN TO WAKE UP. TIMADR=.BIN_TIME. CHKERR $SCHDWK_S DAYTIM=.BIN_TIME. ;TELL PROGRAM WHEN TO WAKE UP. CHKERR $HIBER_S ;GO TO SLEEP. CHKERR L2 .IF EQ %LENGTH(WAKEUP) - 2 ;1 DIGIT OR 2? L1: ;1 DIGIT. .ASCID /0 00:00:0%EXTRACT(1,1,WAKEUP).00/ .IFF L1: ;2 DIGITS. .ASCID /0 00:00:%EXTRACT(1,2,WAKEUP).00/ .ENDC ;EQ %LENGTH(WAKEUP) 2. .IF NOT_DEFINED .BIN_TIME. ;1ST TIME WAKESEC WAS CALLED? .SAVE_PSECT LOCAL_BLOCK ;YES -- CREATE .BIN_TIME.. .BIN_TIME. ;WAS PUT IN ANOTHER .PSECT BECAUSE ;THE CURRENT ONE MAY BE NON-WRITABLE. .PSECT MACRO_DATA,CON,LCL,NOEXE,NOSHR,PIC,REL,NOVEC,WRT,QUAD .BIN_TIME.: ;THE BINARY TIME. .BLKQ 1 .RESTORE_PSECT .ENDC ;NOT_DEFINED .BIN_TIME. L2: .IFF ;USER SUPPLIED THE BINARY TIME. $SCHDWK_S DAYTIM=WAKEUP ;TELL PROGRAM WHEN TO WAKE UP. CHKERR $HIBER_S ;GO TO SLEEP. CHKERR .ENDC ;IDN %EXTRACT(0,1,WAKEUP) #. .ENDM WAITSEC ; ;****************************************************************************** ; ;INVOKE SUPPLIED MACRO; IF ERROR, INVOKE IT UP TO NUM - 1 MORE TIMES. IF ANY ;INVOKATION BRINGS SUCCESS, EXIT NUMTRY; OTHERWISE DIE WITH $EXIT_S R0. ; ;****************************************************************************** ; .MACRO NUMTRY MACCAL,NUM=1,WAKEUP,?L1,?L2,?L3,?L4 MOVL NUM,R7 ;# OF TIMES TO TRY IF ERROR. L1: MACCAL ;CALL THE MACRO. BLBC R0,L2 ;IF ERROR, THEN TRY AGAIN. JMP L4 ;SUCCESS!!! L2: MOVL R0,.SAVE_R0. WAITSEC WAKEUP ;WAIT A SPELL. SOBGTR R7,L3 ;OH NO -- TRY AGAIN! $EXIT_S .SAVE_R0. ;DIE W/ REASON. L3: JMP L1 .IF NOT_DEFINED .SAVE_R0. ;1ST TIME NUMTRY WAS CALLED? .SAVE_PSECT LOCAL_BLOCK ;YES -- CREATE .SAVE_R0.. .SAVE_R0. ;WAS PUT IN ANOTHER .PSECT BECAUSE ;THE CURRENT ONE MAY BE NON-WRITABLE. .PSECT MACRO_DATA,CON,LCL,NOEXE,NOSHR,PIC,REL,NOVEC,WRT,QUAD .SAVE_R0.: .BLKL 1 .RESTORE_PSECT .ENDC ;NOT_DEFINED .SAVE_R0. L4: .ENDM NUMTRY