
Сообщение от
Шынни
Куда уж поинтересней, 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
...