С помощью экспертов по Амигам вышел на отличный алгоритм для такого умножения. К1801ВМ1 несколько неуклюж с таблицами, что не позволяет сделать на нем быстрое табличное умножение как на z80 или 6502. Кстати, мотороловские процессоры (680x, 680x0) тут также неуклюжи. Поэтому с 68020 иногда быстрее использовать сдвиги, чем довольно быстрое (28 тактов) аппаратное умножение. Решил поделиться. Как никак, а красота. Константа data умножается беззнаково на 10000, результат в r2 - high, r3 - low.
Код:
mov #data,r0
clr r4
clr r2
mov r0,r3
asl r3
rol r2
asl r3
rol r2
asl r3
rol r2
sub r3,r0
sbc r4
sub r2,r4
asl r3
rol r2
sub r3,r0
sbc r4
sub r2,r4
sub r3,r0
sbc r4
sub r2,r4
swab r0
swab r4
clrb r4
bisb r0,r4
clrb r0
sub r0,r3
sbc r2
sub r4,r2
С аппаратным умножением (K1801ВМ1Г), конечно, короче, но не факт, что быстрее.
Код:
mov #data,r2
mul #10000,r2
bpl bypass
add #10000,r2
bypass
Интересно узнать, какое и насколько быстрее. Прикрепляю программки для тестирования для БК0010 и 0011. C эмулятором аппаратное значительно быстрее, но там эмулируется какая-то PDP-11 с более быстрым, чем у ВМ1Г умножением. Программка с приведённым выше программным умножением с БК0011 под медленным RT-11 обогнала быстрый американский Коммодор-64 (европейский медленнeе) под максимально быстрым бейсиком в ПЗУ - http://litwr2.atspace.eu/pi/pi-spigot-benchmark.html. А с аппaратным возможно обогнала бы и MSX-2.
pi-bk.zip