based on two different articles from the internet
;=======================================================================
; RND -> DEHL
;-----------------------------------------------------------------------
get_rnd:
lda .cnt
dcr a
jnz .lfsr
lhld rnd
lxi b,64525
call umul
push h
push d
lhld rnd+2
call umul
pop b
dad h
xchg
pop h
lxi b,1013904223 shr 16
xchg
dad b
xchg
lxi b,1013904223 and 0FFFFh
dad b
jnc @F
inx d
@@:
shld rnd
xchg
shld rnd+2
mvi a,31
;-----------------------------------------------------------------------
.lfsr:
sta .cnt
lhld rnd+2
xchg
lhld rnd
mov a,l
xri 57h
mov l,a
mov a,d
xri 80h
mov d,a
xchg
dad h
xchg
dad h
jnc @F
inx d
@@:
ral
jnc @F
inx h
@@:
shld rnd
xchg
shld rnd+2
xchg
ret
;-----------------------------------------------------------------------
.cnt: db 31
;=======================================================================
;
;=======================================================================
rnd: dd 1
;=======================================================================
needs multiplication:
;=======================================================================
; DEHL = HL * BC
;-----------------------------------------------------------------------
umul:
lxi d,0
mvi a,16
umx1:
dad h
xchg
jnc umx3
dad h
jnc umx2
inx d
umx2:
dad b
jnc umx4
inx d
jmp umx4
umx3:
dad h
jnc umx4
inx d
umx4:
xchg
dcr a
jnz umx1
xchg
ret
;=======================================================================
tested with this way:
;-----------------------------------------------------------------------
call 0C010h
;-----------------------------------------------------------------------
lxi h,30101
lxi d,10103
call set_rnd
@@:
call get_rnd
xra a
mov h,a
inr a
ana d
mov d,a
mvi a,-1
call put_pixel
lda 0FF01h ; exit if shift pressed
rar
rar
jc @B
;-----------------------------------------------------------------------
ret
;-----------------------------------------------------------------------
not ideal, you may see the result here, but maybe enough for common case
