BCD арифметика для реализации МК61 на msp430

Пишу на msp430 симулятор МК61. Микроконтроллеры msp430 имеют возможность складывать 4-разрядные BCD числа, команда dadd SRC,TRG складывает SRC с TRG и флагом переноса CARRY. Хотелось бы выйти на максимально эффективный алгоритм умножения (пока только мантиссы), использующийся сейчас школьный алгоритм (умножение столбиком) на умножение двух 8-разрядных чисел расходует 784 такта без нормализации получившегося числа. При этом приходится использовать 16 разрядные BCD источник и приемник размещенные в регистрах msp430 (благо их хватило). Ассемблерный лист привожу. Вижу как улучшить основной цикл умножения - но только на один такт, но это касается только оптимизации по командам. Знаю что можно использовать аппаратное умножение старших моделей семейства msp430 но, это будет а) не спортивно и б) не нативно задуманному BCD ядру. Приглашаю желающих присоединиться.

;
; множимое  R4:R5:R6:R7
; множитель R8:R9
;  промежуточное слагаемое для i разряда умножения R10:R11:R12:R13
;  счетчик множителя i разряда R14

; загружаем множимое
                mov.w   #0,             R4                      ; 1T
                mov.w   #0,             R5                      ; 1T
                mov.w   @SP61+,         R6
                mov.w   @SP61,          R7
; загружаем множитель
                mov.w   @IXP+,          R8
                mov.w   @IXP,           R9

                push.w  R10
                push.w  R11

; очистка промежуточного слагаемого
                mov.w   #0,             R10                     ; 1T
                mov.w   #0,             R11                     ; 1T
                mov.w   #0,             R12                     ; 1T
                mov.w   #0,             R13                     ; 1T
                mov.w   #0x000F,        R15                     ; 2T

                jmp     loop_mul_while
loop_mul:
                mov.w   R9,             R14                     ; 1T установка разрядного счетчика
                clrc                                            ; 1T
; / делим на 10 множитель
                rrc.w   R8                                      ; 1T
                rrc.w   R9                                      ; 1T
                rra.w   R8                                      ; 1T
                rrc.w   R9                                      ; 1T
                rra.w   R8                                      ; 1T
                rrc.w   R9                                      ; 1T
                rra.w   R8                                      ; 1T
                rrc.w   R9                                      ; 1T =8T

                and.w   R15,            R14                     ; 1T
                xor.w   #0xFFFF,        R14                     ; 1T подготовка разрядного счетчика
                add.w   #1,             R14                     ; 1T к инкременту до 0 (-R14)
                jc      loop_mul_end                            ; 2T R==0 mul abort
loop_mul_beg:
                dadd.w  R7,             R13                     ; 1T   CARRY=0
                dadd.w  R6,             R12                     ; 1T
                dadd.w  R5,             R11                     ; 1T
                dadd.w  R4,             R10                     ; 1T R4:R5:R6:R7 + R10:R11:R12:R13
                add.w   #1,             R14                     ; 1T увеличиваем разрядный счетчик
                jnc     loop_mul_beg                            ; 2T =7T

loop_mul_end:
; Переходим к следующему разряду множителя, то есть множимое * 10
                add.w   R7,             R7                      ; 1T
                addc.w  R6,             R6                      ; 1T
                addc.w  R5,             R5                      ; 1T
                addc.w  R4,             R4                      ; 1T
                add.w   R7,             R7                      ; 1T
                addc.w  R6,             R6                      ; 1T
                addc.w  R5,             R5                      ; 1T
                addc.w  R4,             R4                      ; 1T
                add.w   R7,             R7                      ; 1T
                addc.w  R6,             R6                      ; 1T
                addc.w  R5,             R5                      ; 1T
                addc.w  R4,             R4                      ; 1T
                add.w   R7,             R7                      ; 1T
                addc.w  R6,             R6                      ; 1T
                addc.w  R5,             R5                      ; 1T
                addc.w  R4,             R4                      ; 1T =16T
loop_mul_while:
                mov.w   R8,             R14                     ; 1T
                bis.w   R9,             R14                     ; 1T
                and.w   R14,            R14                     ; 1T множитель равен 0, исчерпан
                jnz     loop_mul                                ; 2T