
		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


