Цитата Сообщение от Шынни Посмотреть сообщение
Куда уж поинтересней, jp/jr не быстрее?
Это меня малость переглючило, я забыл что для ret нужно не только код команды прочитать, но и два байта вытащить из стека, и считал что ret выполняется за 4 такта, поэтому в сумме у меня получилось 14 тактов вместо 20.

Перебор генераторов вида x(n)=x(n-m)-x(n-1) позволил найти парочку весьма симпатичных:
Первый получается при m=22, с длиной цикла 2^22-1, если в изначальном массиве не все числа чётные.
Второй получается при m=37, с длиной цикла 2^37-2^19-2^18+1, если в изначальном массиве только одно нечётное число.
Если забить на сохранение hl, для 8-разрядного генератора можно использовать вполне компактный код:
Код:
rnd8:	ld hl,buf-22
	ld a,(hl)
	inc l
	jr z,rnd_2
rnd_1:	sub a,(hl)
	ld (hl),a
	ld (rnd+1),hl
	ret
rnd_2:	ld l,-22
	jp rnd_1
Для 16-разрядного, при m=22, можно использовать вариант с 11 подпрограммами по 19 байт каждая + 3 байта на модифицируемую команду jp:
Код:
rnd16:	jp rnd_0

rnd_0:	ld hl,nn
	ld a,rnd_1
	ld (rnd+1),a
	ld a,(rnd_10+1)
	sub a,l
	ld l,a
	sub a,h
	ld h,a
	ld (rnd_0+1),hl
	ret
...