PDA

Просмотр полной версии : Обьясните про деление. старый стал не понимаю вообще ничего.



jerri
19.10.2017, 10:35
вот универсальное деление

;НL/DЕ=ВC,НL-остаток
;16/16=16,16

DIVW LD A,Е:ОR D
RЕТ Z
XОR A
LD C,A,В,A
ЕX DЕ,НL
DIVW1 INC В
ВIТ 7,Н
JR NZ,DIVW2
ADD НL,НL
JР DIVW1
DIVW2 ЕX DЕ,НL
DIVW3 ОR A
SВC НL,DЕ
JR NC,DIVW4
ADD НL,DЕ
DIVW4 CCF
RL C,A
RR D,Е
DJNZ DIVW3
LD В,A
RЕТ



вот деление HL/320


; HL - Вход
; A - выход ~(HL/320)
LD A,H
RLCA
AND 1
LD L,A
LD A,H
RLCA
RLCA
RLCA
RLCA
AND 15
ADD A,L
LD L,A
LD A,H
SUB L
SUB L
SUB L

мне нужно быстрое деление на 10

что отсюда надо убрать чтобы было проще и быстрее
желательно с комментариями

Shiny
19.10.2017, 11:00
Это поможет?
http://map.grauw.nl/sources/external/z80bits.html#2

- - - Добавлено - - -

Деление на 10:
http://z80-heaven.wikidot.com/math#toc21

jerri
19.10.2017, 13:18
Шынни, спасибо то что надо

Reobne
19.10.2017, 13:45
Грубо, тупо, в байт, но быстро.

LD B,H
LD C,L ; BC=HL=x
ADD HL,HL ; HL=x*2
ADD HL,BC ; HL=x*2+x=x*3
ADD HL,HL ; HL=x*3*2=x*6
ADD HL,HL ; HL=x*12
ADD HL,HL ; HL=x*24
ADD HL,BC ; HL=x*25
LD A,H ; A=int((x*25)/256)=int(A/10.24)

Shiny
19.10.2017, 14:31
Грубо, тупо, в байт, но быстро.

если 8 бит, то быстрее будет LUT

jerri
19.10.2017, 14:46
Грубо, тупо, в байт, но быстро.

LD B,H
LD C,L ; BC=HL=x
ADD HL,HL ; HL=x*2
ADD HL,BC ; HL=x*2+x=x*3
ADD HL,HL ; HL=x*3*2=x*6
ADD HL,HL ; HL=x*12
ADD HL,HL ; HL=x*24
ADD HL,BC ; HL=x*25
LD A,H ; A=int((x*25)/256)=int(A/10.24)


а результат будет 16 битный?

Shiny
19.10.2017, 14:53
а результат будет 16 битный?

не-а

Reobne
19.10.2017, 14:53
а результат будет 16 битный?
В байт, это в байт. Последнюю строчку я написал только ради комментариев.
HL, соответственно, должен быть не сильно больше 2560. :)

jerri
19.10.2017, 15:08
В байт, это в байт. Последнюю строчку я написал только ради комментариев.
HL, соответственно, должен быть не сильно больше 2560. :)

ага вижу

hl/c получается 66
умножение 64
хотя если умножать на 26
...
то будет 68

результат не очень
но меня деление 16/8 устроит.



div16_8
;hl/c
;hl quotiend
;a remainder
add hl,hl
jp nc,div16c

ld a,h
cpl
ld h,a
ld a,l
cpl
ld l,a
inc hl
call div16c
ld a,h
cpl
ld h,a
ld a,l
cpl
ld l,a
inc hl
ret
div16c
xor a
dup 15
add hl,hl ; unroll 16 times
rla ; ...
cp c ; ...
jr c,$+4 ; ...
sub c ; ...
inc l ; ...
edup
add hl,hl ; unroll 16 times
ret