// #LAYOUT# STD * #TAKE // #LAYOUT# * BASIC_0 #TAKE // #LAYOUT# * * #IGNORE // // A fast pseudorandom generator, modified idea from: // - https://codebase64.org/doku.php?id=base:32bit_galois_lfsr // // Output: // - FAC1 // // See also: // - https://www.atarimagazines.com/compute/issue72/random_numbers.php // rnd_generate: asl RNDX+1 rol RNDX+2 rol RNDX+3 rol RNDX+4 bcs rnd_generate_copy lda RNDX+1 eor #$B7 sta RNDX+1 lda RNDX+2 eor #$1D sta RNDX+2 lda RNDX+3 eor #$C1 sta RNDX+3 lda RNDX+4 eor #$04 sta RNDX+4 sec // make sure Carry is always set, for adc // FALLTROUGH rnd_generate_copy: // Copy the generated number to FAC1, mangle it a little lda RNDX+3 adc #$C6 sta FAC1_mantissa+0 lda RNDX+1 eor #$4E sta FAC1_mantissa+1 lda RNDX+4 eor #$62 sta FAC1_mantissa+2 lda RNDX+2 bit RNDX+2 rol sta FAC1_mantissa+3 // FALLTROUGH rnd_generate_finalize: lda #$00 sta FAC1_sign lda #$80 sta FACOV // just to prevent 0 after normalization sta FAC1_exponent jmp normal_FAC1