;+ ; ; RANDOM NUMBER GENERATOR. ; ; ; ; CALL FORMAT: MOV #LIST,R5 ; CALL RANDOM ; ; ; ; WHERE R5 = ADDRESS OF: .BYTE 2,0 ; .WORD RANDMB ;WHERE RANDMB: .WORD 0 (FOR MY USE) ; .WORD RANGE ;WHERE RANGE: .WORD 3 (FOR RANGE. EG:0-3) ; .WORD RAN ;WHERE RAN: .BLKW 1 (GETS RANDOM NUMBER) ; ; ; ; .MCALL GTIM$C ; ; PRIMEN= 5003. ;PRIME NUMBER USED FOR CALCS. ; TIME: .BLKW 8. RANDM:: MOV R0,-(SP) ;SAVE ALL REGISTERS. MOV R1,-(SP) ; MOV R2,-(SP) ; MOV R3,-(SP) ; MOV R4,-(SP) ; MOV R5,-(SP) ; ; TST (R5)+ ;ADJUST PARAMETER LIST ADDRESS. ; TST @(R5) ;IS RANDOM BASE = 0 BNE RANDM2 ;BRANCH IF NOT. ; GTIM$C TIME ;INITIALIZE RANDOM MOV TIME+G.TICT,@(R5) ; BASE WITH TICKS. ; RANDM2: MOV @(R5),R1 ;CREATE NEW INC R1 ; RANDOM MUL #PRIMEN,R1 ; VALUE. MOV R1,@(R5) ;SAVE FOR NEXT TIME THROUGH. MOV R1,R4 ;AND SAVE IT ; CLR R0 ;SET R0 = CLR @4(R5) ; INITIALISE RESULT MOV @2(R5),R3 ; GET DIVISOR MOV R3,R2 ; STORE IT BEQ RANDM4 ; IF 0 - RETURN 0 ; 10$: ASR R2 ; SEE IF POWER OF 2 BCC 10$ ; BNE 20$ ; IF NE NO - CARRY ON INC R3 ; YES - TRY THE NEXT ONE UP ; 20$: DIV R3,R0 ; NEW RANDOM NUMBER. BIT #3,R3 ; MULTIPLE OF 4? BNE 30$ ; IF NE - SPECIAL BIT #40,R4 ; UP IT? BNE 30$ ; IF NE - NO INC R1 ; YES BIT #1,R1 ; OR DOWN? BNE 30$ ; NO SUB #2,R1 ; YES ; 30$: INC R1 CMP R1,@2(R5) ; OUT OF RANGE? BGT RANDM2 ; YES - TRY AGAIN MOV R1,@4(R5) ;GIVE ANSWER TO CALLER. ; ; RANDM4: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; REGISTERS. MOV (SP)+,R3 ; MOV (SP)+,R2 ; MOV (SP)+,R1 ; MOV (SP)+,R0 ; ; RETURN ;RETURN. ; .END ;