User Tools

Site Tools


X ABC Algorithm Random Number Generator

I found this algorithm while I was looking for a high quality PRNG that can also handle zeros in the seed bytes. Initial test were promising. I modified the calculation to save a clc instruction over the original code.

I talked to a cryptographic expert about the algorithm and he stated that given the small resources, it is a well-designed algorithm. It comes with four internal states: X, A, B, C For an 8 bit number, the value of C (which is also returned in Accu) should be used. For 16 bit, the value of B should be used as high byte.

The implementation was optimized using self-modifying code, which yields good speed and low resources, but this implementation won't work in ROM therefore.

In a test, I plotted the output of 51200 random values, which don't seem to reveal any visible patterns:

;; X ABC Algorithm Random Number Generator for 8-Bit Devices
;; Algorithm from EternityForest, slight modification by Wil
;; Implementation and test: Wil
;; This version stores the seed as arguments and uses self-modifying code
;; Routine requires 38 cycles (without the rts) / 28 bytes
;; Return values are in A and, if a 16 bit value is needed also in _rand8_highbyte

.export _rand8:=rand8, _rand8_highbyte:=b1

	inc x1
	lda #$00	;x1
	eor #$c2	;c1
	eor #$11	;a1
	sta a1
	adc #$37	;b1
	sta b1
	eor a1
	adc c1
	sta c1
base/x_abc_random_number_generator_8_16_bit.txt · Last modified: 2021-11-12 13:00 by wil