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