+ #undef tmp
+
+ #define tmp _
+ MOV (tmp, t) //NOTE: must move value away from `t`, as that is also hi(X)
+ tmp = data[tmp];/*
+ LDI Xhi, hi8(data)
+ LDI Xlo, lo8(data)
+ ADD Xlo, tmp ;<-- the offset (formerly `t`) into data[]
+ ADC Xhi, zero
+ LD tmp, X */
+ MOV (t, tmp)
+ #undef tmp
+
+ #define a1 x
+ #define a2 _
+ #define a0 t
+ CLR (a2)
+ CLR (a1)
+
+ /* decision tree multiplication saves cycles and (hopefully) reduces code size
+ _xxx?
+ / \
+ _xx?0 _xx1?
+ | |
+ _x?00 _x?01
+ / \ / \
+ _?000 _?100 _?001 _?101
+ / \ / \ | / \
+ _0000 _1000 _0100 _1100 _1001 _0101 _1101
+ | | | | | | |
+ ... ... ... ... ... ... ...
+ | | | | | | |
+ B0 58 84 8C 69 75 9D */
+ test (0, m____1)
+ m____0: shift16
+ never (1)
+ m___00: shift16
+ test (2, m__100)
+ m__000: shift16
+ test (3, m_1000)
+ m_0000: shift16
+ always (4)
+ add_shift16
+ always (5)
+ add_shift8
+ never (6)
+ shift8
+ always (7)
+ add_shift0
+ RJMP (end_mul) // calc'd 0xb0
+
+ m_1000: add_shift16
+ always (4)
+ add_shift16
+ never (5)
+ shift8
+ always (6)
+ add_shift8
+ never (7)
+ shift0
+ RJMP (end_mul) // calc'd 0x58
+
+ m__100: add_shift16
+ test (3, m_1100)
+ m_0100: shift16
+ RJMP (upper_8) //'ll calc 0x84
+
+ m_1100: add_shift16
+ upper_8: /* used twice, so deduplicated */
+ never (4)
+ shift16
+ never (5)
+ shift8
+ never (6)
+ shift8
+ always (7)
+ add_shift0
+ RJMP (end_mul) // calc'd 0x8c
+
+ m____1: add_shift16
+ never (1)
+ m___01: shift16
+ test (2, m__101)
+ m__001: shift16
+ always (3)
+ m_1001: add_shift16
+ never (4)
+ shift16
+ always (5)
+ add_shift8
+ always (6)
+ add_shift8
+ never (7)
+ shift0
+ RJMP (end_mul) // calc'd 0x69
+
+ m__101: add_shift16
+ test (3, m_1101)
+ m_0101: shift16
+ always (4)
+ add_shift16
+ always (5)
+ add_shift8
+ always (6)
+ add_shift8
+ never (7)
+ shift0
+ RJMP (end_mul) // calc'd 0x75
+
+ m_1101: add_shift16
+ always (4)
+ add_shift16
+ never (5)
+ shift8
+ never (6)
+ shift8
+ always (7)
+ add_shift0
+ // calc'd 0x9d
+
+ end_mul:
+ LSR (a1) //final shift is a common operation for all
+
+ MOV (t, a1) //TODO: use a1 in main() directly
+ #undef a0
+ #undef a1
+ #undef a2
+ RET //TODO: replace CALL/RET with IJMP? (requires undoing goto-mul-hack)