Понадобилось знаковое 8*8=16. Взял для начала "классику"
Скрытый текст
Код:MULS ; HL=H*E (+-)
LD L,0 ; 2b, 7t \
LD D,L ; 1b, 4t |
LD A,H ; 1b, 4t |
XOR E ; 1b, 4t |
EXA ; 1b, 4t |
LD A,H ; 1b, 4t |
NEG ; 2b, 8t > = 20b, 75t
JP M,$+4 ; 3b, 10t |
LD H,A ; 1b, 4t |
LD A,E ; 1b, 4t |
NEG ; 2b, 8t |
JP M,$+4 ; 3b, 10t |
LD E,A ; 1b, 4t /
DUP 8
ADD HL,HL ; 1b, 11t \
JP NC,$+4 ; 3b, 10t > = 40b, 256t
ADD HL,DE ; 1b, 11t /
EDUP
EXA ; 1b, 4t \
JP P,$+7 ; 3b, 10t |
EX DE,HL ; 1b, 4t > = 9b, 47t
LD L,H ; 1b, 4t |
SBC HL,DE ; 2b, 15t |
RET ; 1b, 10t /
[свернуть]
Итого: 67 байт, 378 тактов
Где-то на форуме я уже кидал клич как её ускорить, но ничего путного не вышло.
Казалось-бы раз знаковые биты предварительно обнуляются то достаточно семи DUP вместо восьми, но оказалось что это не так,
ибо -128 (#80) после NEG становится +128 (те-же #80), т.е. всё-таки НАДО ОБРАБАТЫВАТЬ ВСЕ 8 БИТ.
А ускорить всё-таки хотелось... И в результате-таки получилось
Скрытый текст
Код:MULS ;[ HL=H*E (+-)
LD A,H ; 1b, 4t \
XOR E ; 1b, 4t |
EXA ; 1b, 4t |
XOR A ; 1b, 4t |
LD L,A ; 1b, 4t |
LD D,A ; 1b, 4t > = 17b, 64t
SUB H ; 1b, 4t |
JP M,$+4 ; 3b, 10t |
LD H,A ; 1b, 4t |
XOR A ; 1b, 4t |
SUB E ; 1b, 4t |
JP M,$+4 ; 3b, 10t |
LD E,A ; 1b, 4t /
DUP 8
ADD HL,HL ; 1b, 11t \
JP NC,$+4 ; 3b, 10t | = 40b, 256t
ADD HL,DE ; 1b, 11t /
EDUP
EXA ; 1b, 4t \
JP P,$+7 ; 3b, 10t |
EX DE,HL ; 1b, 4t > = 9b, 47t
LD L,H ; 1b, 4t |
SBC HL,DE ; 2b, 15t |
RET ; 1b, 10t /
[свернуть]
Итого: 66 байт, 367 тактов
Ускорение за счёт замены JP на JR, и JP P, на RET P возможно, но количество тактов перестанет быть константой, так что это опционально...
P.S. Обе процедуры дают правильный (одинаковый) результат на тестовой проверке которая перемножала весь диапазон H (0..255) на весь Е (0..255).
Всё сошлось.

