This is a very simple yet flexible PRNG. It can be configured for 2..16 bits of randomness. Thanks to Zed Yago for providing the proper tap sequences. They are taken from "Graphics Gems".
Tap Sequences
LFSR Term -> Period
-------------------
$03 -> 1..$03
$06 -> 1..$07
$0c -> 1..$0f
$14 -> 1..$1f
$30 -> 1..$3f
$60 -> 1..$7f
$b8 -> 1..$ff
$0110 -> 1..$01ff
$0240 -> 1..$03ff
$0500 -> 1..$07ff
$0ca0 -> 1..$0fff
$1b00 -> 1..$1fff
$3500 -> 1..$3fff
$6000 -> 1..$7fff
$b400 -> 1..$ffff
16-bit version - you have to read the random number from rand.
prng16:
lsr rand+1
ror rand
bcc skip
lda rand+1
; $60 = 1..32767, see table above
eor #$60
sta rand+1
skip:
rts
rand:
; seed mustn't be zero!
.byte $01,$00
8-bit version - returns the random number in A.
prng8:
lsr rand
lda rand
bcc skip
; $30 = 1..63, see table above
eor #$30
sta rand
skip:
rts
rand:
; seed mustn't be zero!
.byte $01