PDA

Просмотр полной версии : Нужны процедуры.



transman
06.07.2007, 14:18
Может у кого есть процедуры
1 - генератор случайных чисел, генерящий число в заданном 8bit диапазоне.
выдающий разные числа даже при первом обращении
2 - процедура деления 16bit/8bit=16bit остаток не важен

ng_dead
06.07.2007, 14:49
Может у кого есть процедуры
1 - генератор случайных чисел, генерящий число в заданном 8bit диапазоне.
выдающий разные числа даже при первом обращении
2 - процедура деления 16bit/8bit=16bit остаток не важен
1. пользовал процу из какойто книженции. помойму "как написать игру на ассемблере", посмотри мож подойдет.
2: http://www.zxdn.narod.ru/coding/bd22divd.txt

axor
09.07.2007, 12:08
По rnd здесь.

jim
24.07.2007, 20:48
вот. выдрано из beta basic


rand_ ld d,0
ld bc,(rnd)
ld h,c
ld l,#fd
ld a,b
or a
sbc hl,bc
sbc a,d
sbc hl,bc
sbc a,d
ld e,a
sbc hl,de
jr nc,r1
inc hl
r1 ld (rnd),hl
ret
rnd dw 0


Добавлено через 13 минут
процедура деления по модулю вместе с процедурой вызова рандомайзера. на входе в А указываешь максимальное число диапазона в котором нужно получить рнд. на выходе рнд от нуля до макс..



mod ld a,16
ld hl,0
m0 rl e
rl d
rl l
rl h
sbc hl,bc
jr nc,m1
add hl,bc
m1 ccf
dec a
jr nz,m0
ret

rand push af
call rand_
pop af
ld c,a
ld b,0
ex de,hl
call mod
ld a,l
ret

Raider
23.08.2007, 00:27
вот моя 16 бит

; rnd = seed*5+1

seed: LD HL,0
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
INC HL
LD (SEED+1),HL ; hl = rnd

Vladson
16.01.2008, 05:24
Raider, старший байт какой-то не особо случайный получается. Таким образом если использовать её например для заполнения экрана то придётся в 2 раза больше раз её выполнять.

Всё-же ИМХО вариант из beta basic предпочтительнее (сам я использую что-то типа его.)


По rnd здесь.
От туда очень понравился вариант

RND LD A, (R1)
LD D, A
LD A, (R2)
LD (R1), A
ADD A, D
LD D, A
LD A, (R3)
LD (R2), A
ADD A, D
RLCA
LD (R3), A
RET
Просто элегантное решение.

Raider
29.09.2008, 23:22
Raider, старший байт какой-то не особо случайный получается. Таким образом если использовать её например для заполнения экрана то придётся в 2 раза больше раз её выполнять.


смотря как ты заполняешь. просто байтом?
совершенно особая ситуация возникает если приходится ставить множество случайных точек на экран, генерации X, а затем Y. Вот там-то быстро можно увидеть, какой RND генератор "настоящий". Попробуйте, кстати для эксперимента. Увлекательнейшее дело.

генераторы основанные на принципе "сдвиг и xor" дают случайный бит. их используют для шума. но такие генераторы дают очень плохой случайный байт.

в линейном конгруэнтном датчике псевдо-случайной последовательности, что определяется формулой X[n+1] = (X[n] * A) mod B + C
наиболее "шумят" старшие биты. наименее - младшие.
* - это обычное умножение, A следует брать любым, но жел-но таким что остаток от денения его на 4 дает 1.
mod - операция взятия остатка от деления. (здесь получается B = 65536)
+ сложение. C следует брать любым, всегда нечетным

Добавлено через 4 минуты
а вот еще фокус для экспериментаторов с RND.
если взять как случайное число сумму случайных чисел, скажем 3-4 и более, то у данной последовательности изменяется мат.ожидание, меняется распределение.
оно меняется от uniform (чистый белый шум) например на triangular.
а такой шум звучит иначе.

для 1-битной пищалки можно попытаться складывать биты. тоже будет изменение тембра шума.

jerri
09.11.2008, 18:38
вот эта процедура на 100% эмулирует рандом из ПЗУ


sub_random
push de,bc,af
ld de,0
seed equ $-2
xor a
ld h,a,l,a,b,a
add hl,de
adc a,b
dup 3
add hl,hl
adc a,a
edup
add hl,de
adc a,b
dup 2
add hl,hl
adc a,a
edup
add hl,de
adc a,b
add hl,hl
adc a,a
add hl,de
adc a,b
sub #4a
neg
ld c,a
add hl,bc
ld (seed),hl
pop af,bc,de
ret

Vladson
23.11.2008, 23:05
Попробуйте, кстати для эксперимента. Увлекательнейшее дело.
Пробовал, очень увлекательно :)

Дело в том что вариант HL*5+1 даёт последовательность из 65536 чисел, а тот что мне понравился из ~16млн (после чего всё идёт по второму кругу)