надо что-то такое мутить:
if b=64 then exit ;a=a*64/64
a*b/64 = ( (a+b)^2 - a^2 - b^2 ) / 2 / 64 = (a+b)^2 / 64 - a^2 / 64 - b^2 /64 + rra
need table x^2/64 (x=0..126) или возможно x^2/32 + rra:srl a
...или можь вообще так:
;(a+b)^2 - (a-b)^2 = a^2 + b^2 + 2*a*b - a^2 - b^2 + 2*a*b = 4*a*b
a*b/64 = ( (a+b)^2 - (a-b)^2 ) / 4 / 64 = ( (a+b)^2 / 128 - (a-b)^2 / 128 ) + rra
(используется предрасчитанная табличка x^2 / 128 )
...или вообще
a*b/64 = ( (a+b)^2 - (a-b)^2 ) посчитали в HL (двумя взятиями из таблицы) и старший байт забрали в A (это и есть / 4 / 64)
(используется предрасчитанная табличка x^2)
...и как вариант возможной дальнейшей оптимизации, из таблицы не по 2 байта брать (16битное вычитание), а вначале по младшим байтам решение вынести - повлияют ли они на старшие (перенос), и уж потом из таблицы брать и вычитать старшие, с учетом переноса или его отсутствияКод:; ;mul_ac4: ;hl = (a+c)^2 - (a-c)^2 = a*c*4 ld h,sqr_tbl/256 sub c ld l,a add a,c add a,c ld c,(hl) inc h ld b,(hl) ld l,a ld a,(hl) dec h ld l,(hl) ld h,a sbc hl,bc ;/mul_ac4 ld a,h ;a = a*c*4/256 = a*c/64
[при заполнении 512b sqr_tbl таблицы квадратов не забыть квадраты для отрицательных чисел]Код:;a = a*c/64 = ( (a+c)^2 - (a-c)^2 ) / 256 ld h,sqr_tbl/256 sub c ld l,a ld b,(hl) add a,c add a,c ld c,l ld l,a ld a,(hl) sub b inc h ld a,(hl) ld l,c sbc a,(hl)
- - - Добавлено - - -
взять стандартную процедуру побитного деления и раскрыть-расписать, учитывая, что делитель в данном конкретном случае - это просто два включенных бита / две ветки переходов, с невключенными остальными / пустыми веткамиполучить N*4/3. Есть мысли?
3 = %00000011





Ответить с цитированием
