					; 16bit x 16bit multiplication by Soji Yamakawa 2017/10/25
					EXPORT		MUL16_NUM0
					EXPORT		MUL16_NUM1
					EXPORT		MUL16

MUL16_NUM0			RZB			2	; Input i1   Output higher 16bits
MUL16_NUM1			RZB			2	; Input i2   Output lower 16bits

MUL16				PSHS		A,B,X

					CLR			MUL16_SIGN,PCR

					LDD			MUL16_NUM0,PCR
					BPL			MUL16_NUM0_POSITIVE
					COMA
					COMB
					ADDD		#1
					STD			MUL16_NUM0,PCR
					INC			MUL16_SIGN,PCR
MUL16_NUM0_POSITIVE

					LDD			MUL16_NUM1,PCR
					BPL			MUL16_NUM1_POSITIVE
					COMA
					COMB
					ADDD		#1
					STD			MUL16_NUM1,PCR
					INC			MUL16_SIGN,PCR
MUL16_NUM1_POSITIVE

					; (256*Hi0+Lo0)(256*Hi1+Lo1)=65536*Hi0*Hi1+256*(Hi0*Lo1+Hi1*Lo0)+Lo0*Lo1
					LDA			MUL16_NUM0,PCR
					LDB			MUL16_NUM1,PCR
					MUL
					STD			MUL16_HI16,PCR

					LDA			MUL16_NUM0+1,PCR
					LDB			MUL16_NUM1+1,PCR
					MUL
					STD			MUL16_LO16,PCR

					LDD			MUL16_NUM0+1,PCR
					; LDA			MUL16_NUM0+1,PCR
					; LDB			MUL16_NUM1,PCR
					MUL
					ADDD		MUL16_HI16+1,PCR
					STD			MUL16_HI16+1,PCR
					LDA			MUL16_HI16,PCR
					ADCA		#0
					STA			MUL16_HI16,PCR

					LDA			MUL16_NUM0,PCR
					LDB			MUL16_NUM1+1,PCR
					MUL
					ADDD		MUL16_HI16+1,PCR
					STD			MUL16_HI16+1,PCR
					LDA			MUL16_HI16,PCR
					ADCA		#0
					STA			MUL16_HI16,PCR

					LDA			MUL16_SIGN,PCR
					LSRA
					BCC			MUL16_PROD_POSITIVE

					LDD			MUL16_LO16,PCR
					COMA
					COMB
					ADDD		#1
					STD			MUL16_NUM1,PCR

					LDD			MUL16_HI16,PCR
					SBCB		#0
					SBCA		#0
					COMA
					COMB
					STD			MUL16_NUM0,PCR

					PULS		A,B,X
					RTS

MUL16_PROD_POSITIVE
					LDD			MUL16_HI16,PCR
					STD			MUL16_NUM0,PCR
					LDD			MUL16_LO16,PCR
					STD			MUL16_NUM1,PCR
					PULS		A,B,X
					RTS
MUL16_HI16			RZB			2
MUL16_LO16			RZB			2
MUL16_SIGN			RZB			1
