.TITLE MTAST - MARK TIME AST SUPPORT .IDENT /27MAY7/ ;15:25:00, EM ; .ENTRY MTAST - MARK TIME AST SUPPORT ;+ ; M T A S T ; ; PURPOSE: THIS ROUTINE ALLOWS A SPECIFIED SUBROUTINE ; TO BE EXECUTED AFTER AN INTERVAL, AND OPTIONALLY ; REEXECUTED AT THE SAME INTERVAL UNTIL REQUESTED ; TO STOP. THE SUBROUTINE EXECUTES AT AST LEVEL, ; INDEPENDENT OF THE ACTION OF THE BACKGROUND CODE. ; ; INTERFACE: CALLING SEQUENCE: (FORTRAN-CALLABLE SUBROUTINE) ; EXTERNAL SUBNAM ; CALL MTAST (SUBNAM,TIMMAG,UNITS [,RESCHD]) ; CALL CANMTA (NOMORE) ; ; INPUT: ; SUBNAM = (INTEGER*2): ADDRESS OF SUBROUTINE TO BE EXECUTED. ; FORTRAN USERS SHOULD INCLUDE THE SUBROUTINE NAME ; IN AN EXTERNAL STATEMENT. ; ; TIMMAG = (INTEGER*2): NUMBER OF UNITS TO WAIT BEFORE ; EXECUTING SUBROUTINE. ; ; UNITS = (INTEGER*2): TIME UNITS TO WAIT: ; 0 = MILLISECONDS (NOTE THAT, DUE TO A CLOCK ; PERIOD OF 16.67 MILLISECONDS (1 TICK), ALL ; REFERENCES TO MILLISECONDS WILL BE CONVERTED ; THE NEXT HIGHER TICK. THAT IS, A CALL WITH ; TIMMAG=16 AND UNITS=0 RESULTS IN A WAIT ; OF 1 TICK. TIMMAG=17 WILL GET YOU 2 TICKS. ; YOU ARE ALWAYS ASSURED OF WAITING AT LEAST ; THE NUMBER OF MILLISECONDS SPECIFIED.) ; 1 = TICKS (1/60TH OF A SECOND) ; 2 = SECONDS ; 3 = MINUTES ; 4 = HOURS ; ; RESCHD = (BYTE (INTEGER*1)): OPTIONAL FLAG SPECIFYING ; WHETHER TO RESCHEDULE THE SUBROUTINE FOR ANOTHER ; EXECUTION. 1 MEANS RESCHEDULE. ; DEFAULT> 0 (EXECUTE ONLY ONCE) ; ; NOMORE = (BYTE (INTEGER*1)): FLAG SIGNIFYING WHETHER ; TO ALLOW ANY MORE EXECUTIONS OF THE SUBROUTINE. SEE 1.4. ; 1 MEANS NO MORE EXECUTIONS. ; DEFAULT>0 ALLOW ANY EXECUTIONS ALREADY QUEUED TO ; RUN. ; ; METHOD: THE INITIAL CALL TO MTAST SETS UP A MARK-TIME-AST ; ENTRY WITHIN THIS ROUTINE. IT ALSO SETS OR CLEARS ; AN INTERNAL FLAG DEPENDING ON THE PRESENCE AND ; VALUE OF RESCHD. ; ; WHEN THE AST ENTRY IS EFFECTED, THE FLAG IS CHECKED, ; AND IF SET, THE MARK-TIME-AST IS RESCHEDULED. THE ; GENERAL REGISTERS R0-R5 ARE SAVED, AND THE ROUTINE ; IS CALLED. WHEN THE ROUTINE RETURNS, THE REGISTERS ; ARE RESTORED, AND AN AST EXIT IS PERFORMED. ; ; IF THE RESCHD PARAMETER IS SPECIFIED, THE AUTOMATIC ; RERUN OF THE ROUTINE MAY BE TURNED OFF BY THE CALL ; TO CANMTA. THIS PREVENTS THE AST FROM BEING ; RESCHEDULED WHEN THE NEXT AST RUNS. NOTE THAT ; IF YOU CALL CANMTA FROM BACKGROUND CODE AFTER ; SUBNAM HAS RUN AT LEAST ONCE, YOU MAY GET AT LEAST ; ONE MORE EXECUTION OF SUBNAM. THE NOMORE ARGUMENT ; IS PROVIDED TO ALLOW THE CODE TO STOP EXECUTION OF ; THE ROUTINE WITH NO WORRIES OF ITS RUNNING AGAIN. ; ; NOTE THAT THE ROUTINES INASTR AND ENASTR WILL ; INHIBIT AND ENABLE THE EXECUTION OF SUBNAM, ; BUT ALLOW THE AST'S TO BE QUEUED UNTIL READY ; TO EXECUTE THEM. ; ; LANGUAGE: MACRO-11 ; ; RESTRICTIONS: SEPARATE VERSIONS ARE REQUIRED FOR FPU AND ; NON-FPU MACHINES. AT PRESENT, ONLY ONE MARK ; TIME AST CAN BE ACTIVE AT ONCE. ; ; REFERENCES: FOR MORE INFORMATION ON AST'S, CONSULT THE ; RSX-11D EXECUTIVE REFERENCE MANUAL. ;- ; REVISIONS: ; FEB-76 RK WRITTEN ; 12-MAR-76 RK ADDED CODE TO SAVE AND RESTORE ; FLOATING POINT REGISTERS, ALSO ; ADDED MILLISECONDS TO UNITS. ; 29-MAR-76 MK ADDED CONDITIONALS FOR FPU/NON-FPU. ; TOOK OUT F4P PSECTS. ; 31-MAY-77 EM UPDATED TO CONFORM TO STANDARDS. ; ; 2. PROGRAM DETAIL ; ; 2.1 MACROS-- ; .MCALL MRKT$,DIR$,ASTX$S,CMKT$S,PUSH,POP ; ; 2.2 SYMBOL DEFINITION-- ; ;**** DEFINE FPU FOR FPU VERSION ;**** LEAVE FPU UNDEFINED FOR NON-FPU VERSION FPU=0 ; F0=%0 F1=%1 F2=%2 F3=%3 F4=%4 F5=%5 ; ; 2.3 STORAGE ALLOCATION AND INITIALIZATION-- ; MRKT: MRKT$ ,,,MAST SUBADD: .BLKW 1 STOP: .BLKB 1 .EVEN ; ; 2.4 PROGRAM FLOW-- ; ; ENTRY MTAST - SET UP AST, SAVE SUBROUTINE ADDR, AND SEE THAT ; THE STOP FLAG IS SET CORRECTLY. ; MTAST:: MOV 2(R5),SUBADD ;SAVE SUBROUTINE ADDR MOV @4(R5),MRKT+M.KTMG ;SET MAGNITUDE MOV @6(R5),MRKT+M.KTUN ;SET UNITS BNE 2$ ;PROCEED IF OTHER THAN MSEC MOV #1,MRKT+M.KTUN ;SET TICKS CLR R0 ;CLEAR UPPER 16 BITS MOV @4(R5),R1 ;SET LOWER 16 BITS MUL #6,R1 ;6 X MSEC DIV #100.,R0 ;R0 IS TICKS, R1 IS REMAINDER MOV R0,MRKT+M.KTMG ;SET # OF TICKS TST R1 ;DO WE NEED ANOTHER TICK? BEQ 2$ ;NO INC MRKT+M.KTMG ;YES, BUMP IT 1 2$: MOVB #1,STOP ;DEFAULT TO ONLY 1 RUN CMPB @R5,#4 ;DO WE HAVE 4 ARGS? BLT 1$ ;BR IF NOT CMP #-1,@10(R5) ;WAS RESCHD SPECIFIED? BEQ 1$ ;BR IF NOT TSTB @10(R5) ;IS RESCHD NONZERO? BEQ 1$ ;BR IF NOT CLRB STOP ;SPECIFY RESCHEDULE DURING AST 1$: DIR$ #MRKT ;START AST RETURN ; ; AST ENTRY POINT - RESTART AST IF NECESSARY, SAVE REGISTERS, ; AND CALL ROUTINE. ; MAST: BITB #2,STOP ;ARE WE ALLOWED TO DO ANYTHING? BNE MTASTX ;NO, GET OUT BITB #1,STOP ;DO WE RESCHEDULE? BNE 1$ DIR$ #MRKT ;RESCHEDULE AST 1$: .IF DF,FPU STFPS -(SP) ;SAVE FLOATING POINT STATUS SETD ;SET DOUBLE MODE STD F0,-(SP) ;SAVE F ACC 0 STD F1,-(SP) ;SAVE F ACC 1 STD F2,-(SP) ;SAVE F ACC 2 STD F3,-(SP) ;SAVE F ACC 3 LDD F4,F0 ;MOVE F4 TO F0 .IFTF MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) .IFT LDD F5,F1 ;MOVE F5 TO F1 .IFTF MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) .IFT STD F0,-(SP) ;SAVE F ACC 4 STD F1,-(SP) ;SAVE F ACC 5 .ENDC CALL @SUBADD ; ; THE ROUTINE HAS RETURNED, RESTORE REGISTERS AND THE STACK, ; AND DO A ASTX. ; .IF DF,FPU SETD ;SET MODE TO DOUBLE LDD (SP)+,F1 ;GET F5 LDD (SP)+,F0 ;GET F4 STD F1,F5 ;RESTORE F5 .IFTF MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 .IFT STD F0,F4 ;RESTORE F4 .IFTF MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .IFT LDD (SP)+,F3 ;RESTORE F3 LDD (SP)+,F2 ;RESTORE F2 LDD (SP)+,F1 ;RESTORE F1 LDD (SP)+,F0 ;RESTORE F0 LDFPS (SP)+ ;RESTORE FPS STATUS .ENDC MTASTX: TST (SP)+ ;RESTORE STACK ASTX$S ;EXIT THE AST ; ; ENTRY CANMTA - CANCEL THE AST, AND SET BIT 1 IN STOP ; IF NECESSARY. ; CANMTA:: CMKT$S ,#MAST ;CANCEL THE AST BISB #1,STOP ;MAKE SURE IT ISN'T RESCHED CMP #-1,2(R5) ;WAS NOMORE SPECIFIED? BEQ 1$ ;BR IF NO TSTB @2(R5) ;IS IT NONZERO? BEQ 1$ ;NO BISB #2,STOP ;CRIPPLE THE AST ENTRY 1$: RETURN .END