Не знаю, может где-то уже что-то подобное пробегало, может кому-то пригодится.
Быстрый (116T) генератор псевдослучайных чисел на основе LCG с неплохой равномерностью:
Код:
Random8
; breaks A,HL,DE, returns pseudo-random u8 value in A
; consumes 116T including RET
; ALGO: u16 seed = (seed << 7) - seed + 251
; ALGO: result = (u8) (seed + seed >> 8)
LD HL,#55AA ; 10T, 10T
.seed EQU $-2 ; initialize Random8+1 (seed) with different u16 values to get different sequences
LD E,L ; 4T, 14T
LD D,H ; 4T, 18T
XOR A ; 4T, 22T
SRL H ; 8T, 30T
RR L ; 8T, 38T
RRA ; 4T, 42T
LD H,L ; 4T, 46T
LD L,A ; 4T, 50T
SBC HL,DE ; 11T, 61T
LD DE,251 ; 10T, 71T
ADD HL,DE ; 11T, 82T
LD (.seed),HL ; 16T, 98T
LD A,L ; 4T, 102T
ADD A,H ; 4T, 106T
RET ; 10T, 116T