rand.s



;	
; Randum number generator
;
; Written and donated by Sidney Cadot - sidney@ch.twi.tudelft.nl
;
; May be distributed with the cc65 runtime using the same license.
;
;
; int rand (void);
; void srand (unsigned seed);
;
;  Uses 4-byte state.
;  Multiplier must be 1 (mod 4)
;  Added value must be 1 (mod 2)
;  This guarantees max. period (2**32)
;  Bits 8-22 are returned (positive 2-byte int)
;  where 0 is LSB, 31 is MSB.
;  This is better as lower bits exhibit easily
;  detectable patterns.
;

      	.export		_rand, _srand

.bss

rand:  	.res	4		; Seed

.code

_rand:	clc
	lda	rand+0		; SEED *= $01010101
	adc     rand+1
	sta     rand+1
	adc     rand+2
	sta     rand+2
	adc     rand+3
	sta     rand+3
	clc
	lda     rand+0		; SEED += $31415927
	adc     #$27
	sta     rand+0
	lda     rand+1
	adc     #$59
	sta     rand+1
	pha
 	lda     rand+2
	adc     #$41
	sta     rand+2
	and     #$7f		; Suppress sign bit (make it positive)
	tax
 	lda     rand+3
	adc     #$31
	sta     rand+3
	pla			; return bit 8-22 in (X,A)
	rts

_srand:	sta	rand+0		; Store the seed
	stx	rand+1
	lda     #0
	sta     rand+2          ; Set MSW to zero
	sta     rand+3
	rts



Valid HTML 4.0! rand.s.html; generated on Sat Oct 13 22:41:33 2001 by ca65html
uz@cc65.org