.TITLE MONTE ;.MACRO .MONTE F,INTEG,N,LO1,HI1,LO2,HI2,LO3,HI3,LO4,HI4,LO5,HI5,LO6,HI6 ; Does a Monte Carlo integration of the user-supplied ; function whose entry point is F. The answer is INTEG. ; N is the number of ; events to be generated. If X1 is the first ; variable, then LO1-->X1-->HI1 is the range over which ; X1 is to be integrated. The ranges of up to 6 ; variables are optional. ; User must define the F(X) subroutine: ; Location F: entry point ; Location F-4: output of function ; Location F-10: X1 input ; Location F-14: X2 input etc. (optional) A0=R0 A1=R1 A2=R2 .GLOBL .MONTE .MCALL .RAND DIM: .BLKW 1 ;NUMBER OF VARIABLES, 1..6 HI6: .BLKW 2 LO6: .BLKW 2 HI5: .BLKW 2 LO5: .BLKW 2 HI4: .BLKW 2 LO4: .BLKW 2 HI3: .BLKW 2 LO3: .BLKW 2 HI2: .BLKW 2 LO2: .BLKW 2 HI1: .BLKW 2 LO1: .BLKW 2 N: .BLKW 1 ;NUMBER OF MONTE CARLO EVENTS INTEG: .BLKW 2 F: .BLKW 1 ;ADDRESS OF USER FUNCTION .MONTE: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) STF A0,-(SP) STF A1,-(SP) STF A2,-(SP) MOV N,R0 CLRF A2 ;THE INTEGRAL L1: MOV #LO1,R1 MOV DIM,R3 MOV F,R2 SUB #4,R2 L2: .RAND A0 ;X1=LO1+RAND*(HI1-LO1) GENERATE VARIABLE X1 LDF -4(R1),A1 ;HI1 SUBF (R1),A1 ;SUB LO1 MULF A0,A1 ADDF (R1),A1 STF A1,-(R2) ;MOVE X1 TO INPUT OF USER'S FUNCTION SUB #10,R1 ;DO NEXT VARIABLE SOB R3,L2 CALL @F MOV F,R3 ADDF -4(R3),A2 ;INTEGRAL=INTEGRAL+FUNCTION SOB R0,L1 LDCIF N,A0 DIVF A0,A2 ;INTEGRAL=INTEGRAL/N MOV DIM,R3 ;MUL BY RANGES OF VARIABLES: HI1-LO1 MOV #LO1,R1 L3: LDF -4(R1),A0 ;HI1 SUBF (R1),A0 ;LO1 MULF A0,A2 SUB #10,R1 SOB R3,L3 STF A2,INTEG LDF (SP)+,A2 LDF (SP)+,A1 LDF (SP)+,A0 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN .END