XDEF RandomSeed,Random assembler entry points XDEF _RandomSeed,_Random C entry points CODE ;============================================================================= ; NAME ; RandomSeed - seed random number generator, call once at beginning of ; your program. CurrentTime provides useful values for this ; ; SYSNOPSIS ; RandomSeed( SeedValue ) ; D0 ; ; FUNCTION ; Seeds the random number generator ; ; INPUTS ; SeedValue - a longword containing any value you like ; ; RESULT ; Random number generator is initialised ; ; BUGS/LIMITATIONS ; None that I know of ; ; SEE ALSO ; ;============================================================================ _RandomSeed MOVE.L 4(SP),D0 entry point for C functions RandomSeed ADD.L D0,D1 user seed in d0 (d1 too) MOVEM.L D0/D1,RND ; drops through to the main random function (not user callable) LongRnd MOVEM.L D2-D3,-(SP) MOVEM.L RND,D0/D1 D0=LSB's, D1=MSB's of random number ANDI.B #$0E,D0 ensure upper 59 bits are an... ORI.B #$20,D0 ...odd binary number MOVE.L D0,D2 MOVE.L D1,D3 ADD.L D2,D2 accounts for 1 of 17 left shifts ADDX.L D3,D3 [D2/D3] = RND*2 ADD.L D2,D0 ADDX.L D3,D1 [D0/D1] = RND*3 SWAP D3 shift [D2/D3] additional 16 times SWAP D2 MOVE.W D2,D3 CLR.W D2 ADD.L D2,D0 add to [D0/D1] ADDX.L D3,D1 MOVEM.L D0/D1,RND save for next time through MOVE.L D1,D0 most random part to D0 MOVEM.L (SP)+,D2-D3 RTS ;============================================================================= ; NAME ; Random - returns a random integer in the specified range ; ; SYSNOPSIS ; RndNum = Random( UpperLimit ) ; D0 D0 ; ; FUNCTION ; returns a random integer in the range 0 to UpperLimit-1 ; ; INPUTS ; UpperLimit - a long (or short will do) in the range 1-65535 ; ; RESULT ; a random integer is returned to you, real quick! ; ; BUGS/LIMITATIONS ; range was limited to 1-65535 to avoid problems with the DIVU instruction ; which can return real wierd values if the result is larger than 16 bits. ; ; SEE ALSO ; ;============================================================================ _Random MOVE.L 4(SP),D0 C entry point Random MOVE.W D2,-(SP) MOVE.W D0,D2 save upper limit BEQ.S 10$ range of 0 returns 0 always BSR.S LongRnd get a longword random number CLR.W D0 use upper word (it's most random) SWAP D0 DIVU.W D2,D0 divide by range... CLR.W D0 ...and use remainder for the value SWAP D0 result in D0.W 10$ MOVE.W (SP)+,D2 RTS BSS RND DS.L 2 random number END