Заменить #10 на #20. Но тогда, естественно, уже возможно перепеолнение.
Код совершенно классический, есть в любом букваре. Есть также классическая вариация с выходом по обнулению второго множителя. Она в среднем быстрее, если множитель маленький, то в разы.
Код:
; r0 = r1 * r2
mul: clr r0
cmp r1, r2
bhis 1$
xor r1, r2
xor r2, r1
xor r1, r2
1$: tst r2
beq 0$
clc
ror r2
bcc 2$
add r1, r0
2$: asl r1
add r1, r0
asr r2
bcs 2$
beq 3$
sub r1, r0
br 2$
3$: sub r1, r0
0$: rts r7
Набил по памяти, но вроде правильно. Это т.н. алгоритм с восстановлением, классическая оптимизация. Тело цикла умножения -- это 2$..bcs 2$ для единичного бита и 2$..br 2$ для нулевого. Выполняется до исчерпания единичных бит в меньшем множителе.
Можно ещё быстрее, но это приводит к ещё большему объёму кода.
А ещё быстрее -- через таблицу квадратов, пользуясь следующим равенством:
((x + y) ^ 2) / 4 - ((x - y) ^ 2) / 4 = x * y;