надо что-то такое мутить:
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)
Код:
;
;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
...и как вариант возможной дальнейшей оптимизации, из таблицы не по 2 байта брать (16битное вычитание), а вначале по младшим байтам решение вынести - повлияют ли они на старшие (перенос), и уж потом из таблицы брать и вычитать старшие, с учетом переноса или его отсутствия
Код:
;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)
[при заполнении 512b sqr_tbl таблицы квадратов не забыть квадраты для отрицательных чисел]
- - - Добавлено - - -
получить N*4/3. Есть мысли?
взять стандартную процедуру побитного деления и раскрыть-расписать, учитывая, что делитель в данном конкретном случае - это просто два включенных бита / две ветки переходов, с невключенными остальными / пустыми ветками
3 = %00000011