;	ulong	mult20( ulong num_1, ulong num_2 )
;	{
;		return( (num_1 * num_2) >> 20 );
;	}
;
;	May 1990, SHIMA

MULT20_TEXT	segment	byte public 'CODE'
MULT20_TEXT	ends
DGROUP	group	_DATA,_BSS
	assume	cs:MULT20_TEXT,ds:DGROUP,ss:DGROUP
;	assume	cs:MULT20_TEXT,ds:DGROUP
_DATA	segment word public 'DATA'
d@	label	byte
d@w	label	word
_DATA	ends
_BSS	segment word public 'BSS'
b@	label	byte
b@w	label	word
_BSS	ends
MULT20_TEXT	segment	byte public 'CODE'
_mult20	proc	far
	push	bp
	mov	bp,sp
	sub	sp,8

	mov	ax, word ptr [bp+6]	; L_num_1
	mul	word ptr [bp+10]	; L_num_2
	mov	word ptr [bp-6], dx	; A_1

	mov	ax, word ptr [bp+8]	; H_num_1
	mul	word ptr [bp+12]	; H_num_2
	mov	word ptr [bp-4], ax	; A_2
	mov	word ptr [bp-2], dx	; A_3

	mov	ax, word ptr [bp+6]	; L_num_1
	mul	word ptr [bp+12]	; H_num_2
	add	word ptr [bp-6], ax	; A_1
	adc	word ptr [bp-4], dx	; A_2
	jnc	sk1
	inc	word ptr [bp-2]		; A_3
sk1:
	mov	ax, word ptr [bp+8]	; H_num_1
	mul	word ptr [bp+10]	; H_num_2
	add	word ptr [bp-6], ax	; A_1
	adc	word ptr [bp-4], dx	; A_2
	jnc	sk2
	inc	word ptr [bp-2]		; A_3
sk2:
	mov	cl, 4
	mov	bl, byte ptr [bp-6]	; H_A_1
	shr	bl, cl			; bl = bl >> 4
	mov	ax, word ptr [bp-5]
	rol	ax, cl
	mov	bh, al
	and	bh, 00fh
	and	al, 0f0H
	or	al, bl
	mov	dx, word ptr [bp-3]
	shl	dx, cl
	or	dl, bh
	mov	sp,bp
	pop	bp
	ret
_mult20	endp
MULT20_TEXT	ends
_DATA	segment word public 'DATA'
s@	label	byte
_DATA	ends
MULT20_TEXT	segment	byte public 'CODE'
MULT20_TEXT	ends
	public	_mult20
	end
