Понадобилось знаковое 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).
Всё сошлось.


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

