ГСЧ - полная засада. Я бился над chaosgame, получилось так, что период случайных чисел короток.
на помощь пришло ROM(подобный трюк использовался в Fractals/Alan Cox)Вложение 62390
Вид для печати
ГСЧ - полная засада. Я бился над chaosgame, получилось так, что период случайных чисел короток.
на помощь пришло ROM(подобный трюк использовался в Fractals/Alan Cox)Вложение 62390
Ну это естественно, в первом варианте тоже не mov а ld
Проверочный код был:
Не прокатывает, выдаёт повторяющуюся последовательность из 9-12 точек (по разному от начального буфера)Код:RND push hl
ld hl,RNDbuff+256-22
.bfadr EQU $-2
ld a,(hl)
inc l
jr z,.rnd_2
.rnd_1 sub a,(hl)
ld (hl),a
ld (.bfadr),hl
pop hl
ret
.rnd_2 ld l,-22
jp .rnd_1
Вот скрины при первом варианте и при этом
Скрытый текст
Dart Alver,
RNDbuff на 256 байт выровнен, и действительно ли начальные числа попадают куда нужно? Вообще этот генератор очень похож на CRC с полиномом x^22+x^21+1, хоть он и прост, но генерируемая последовательность имеет период 2^22-1 и в этих пределах любые 22 подряд идущих бита(младшие разряды нашего генератора) будут встречаться ровно один раз.
blackmirror, Дико извиняюсь, был неправ. С формулой всё в порядке. Ошибка была в компиляции, нужно было писать не sub a,(hl) , а sub (hl). SjASMPlus команду sub a,(hl) понимает как sub a : sub (hl), а я забыл это поправить отсюда и все косяки были ))
Наверное, пригодится:
https://github.com/impomatic/z80snippets
Писал эффект появления картинки для мегадемо, вышло слишком заморочено. Вот другой вариант, но показ выходит слишком медленный.
Беззнаковое деление 8/8=8.8
(по мотивам Программистам - Алгоритмы работы и примеры процедур для быстрых вычислений на асемблере)
Из недостатков - юзается доп-регистр (в данном случае D, но можно любой) и числа должны быть беззнаковые.
Наверное сейчас это уже никому не надо, но для понимания двоичной математики ковырял-ускорял. Быстрей вроде не получается или это я уже "замылился".Код:; H.L=H/A (D=corrupt)
NEG:LD D,A ; 8+4=12
XOR A:LD L,A ; 4+4=8
RL H,H ; 8+8=16
DUP 7
RLA ; 4
ADD A,D ; 4
JP C,1F ; 10
SUB D ; 4
1 RL H ; 8
EDUP ; t=30
DUP 8
RLA ; 4
ADD A,D ; 4
JP C,2F ; 10
SUB D ; 4
2 RL L ; 8
EDUP ; t=30
; 12+8+16+(30*7)+(30*8)=486 тактов в пиковом случае (min=426)