Сижу с генераторами ПСЧ8 для Вектор-06Ц.
Написалось три генератора, все 3 - отстой и работают кое-как, но делюсь.
Если у кого-то есть лучше - дайте знать.
Код:
; random_xorshift
; вход: E - верхняя граница
; выход: A - псевдослучайное число [0, E]
RND8: push h
push d
lhld SEED ; Загружаем состояние
; XOR-shift алгоритм
mov a, h
rrc ; Сдвиг вправо
mov h, a
mov a, l
rlc ; Сдвиг влево
mov l, a
xra h ; XOR между H и L
mov h, a
shld SEED ; Сохраняем новое состояние
mov a, l ; Берем случайное число
cmp e ; Ограничиваем диапазоном [0, E]
jc RDONE
MLX: sub e
cmp e
jnc MLX
RDONE: pop d
pop h
ret
SEED: db 13h
Код:
; RND Дениса Попова переводим на 8080, вариант №1
; вход: E - верхняя граница
; выход: A - псевдослучайное число [0, E]
RND8: lda SEED
mov B,A
stc ; rrca 1
cma
rar
cma
stc ; rrca 2
cma
rar
cma
stc ; rrca 3
cma
rar
cma
xri 0x1f ; A=A xor 0x1f
add B ; A=A+B
sbi 255 ; A=A-255-CY
sta SEED
cmp E
jnc RND8 ; если >= E, генерим по новой
ret
SEED: db 13h
Код:
; RND Дениса Попова переводим на 8080, вариант №2
; вход: E - верхняя граница
; выход: A - псевдослучайное число [0, E]
RND8: lda SEED
mov B,A
rar ; rrca 1
jnc RR2
ori 80h
RR2: rar ; rrca 2
jnc RR3
ori 80h
RR3: rar ; rrca 3
jnc RR4
ori 80h
RR4: xri 0x1f
add b
sbi 255 ; приплыли
sta SEED
cmp E
jnc RND8 ; если >= E, генерим по новой
ret
SEED: db 13h
- - - Добавлено - - -
Есть ещё инновационный подход.
1) Пишем за минуту программу на питоне
2) Генерируем нужное нам кол-во псевдослучайных чисел в нужном диапазоне
3) Загоняем в таблицу
4) По этой таблице и ходим в своей программе, чтобы не иметь себе мозг. Enjoy