www.pudn.com > tp60src.zip > EXTSTR.ASM


	model	large extend_text,pascal 
	include	extend.inc 
 
	extrn	ExtMul:far,Comp2Ext:far,ExtPow10:far 
 
	.data 
 
C1e8	dt	1e8 
 
	.code	Extend_Text 
 
	Argm	Src,dword,1 
	Argm	Dst,dword,1 
	Loc	Temp,word,4 
	Loc	J,word,1 
	Loc	I,word,1 
	Entry	Str2Ext 
	push	si di 
	push	ds 
	lds	si,Src 
	cld 
	xor	di,di 
	mov	dx,di 
	mov	cx,di 
	mov	bx,di 
	mov	I,di 
	mov	J,di 
@@1:	lodsb 
	cmp	al,'0' 
	jb	@@6 
	cmp	al,'9' 
	ja	@@6 
	sub	al,'0' 
	cbw 
	or	bx,bx 
	jnz	@@3 
	or	cx,cx 
	jnz	@@4 
	or	dx,dx 
	jnz	@@4 
	xchg	ax,di 
	mov	dx,10 
	mul	dx 
@@2:	add	di,ax 
	adc	dx,0 
	adc	cx,0 
	adc	bx,0 
	mov	ax,J 
	add	I,ax 
	jmp	@@1 
@@3:	cmp	bx,3276 
	jae	@@5 
@@4:	push	ax 
	shl	di,1 
	rcl	dx,1 
	rcl	cx,1 
	rcl	bx,1 
	push	bx cx dx di 
	shl	di,1 
	rcl	dx,1 
	rcl	cx,1 
	rcl	bx,1 
	shl	di,1 
	rcl	dx,1 
	rcl	cx,1 
	rcl	bx,1 
	pop	ax 
	add	di,ax 
	pop	ax 
	adc	dx,ax 
	pop	ax 
	adc	cx,ax 
	pop	ax 
	adc	bx,ax 
	pop	ax 
	jmp	@@2 
@@5:	mov	ax,J 
	inc	ax 
	add	I,ax 
	jmp	@@1 
@@6:	cmp	al,'.' 
	jne	@@7 
	cmp	J,0 
	jne	@@7 
	dec	J 
	jmp	@@1 
@@7:	mov	Temp[0],di 
	mov	Temp[2],dx 
	mov	Temp[4],cx 
	mov	Temp[6],bx 
	mov	di,I 
	cmp	al,'E' 
	je	@@8 
	cmp	al,'e' 
	jne	@@13 
@@8:	xor	bx,bx 
	lodsb 
	mov	cl,al 
	cmp	al,'-' 
	je	@@10 
	cmp	al,'+' 
	je	@@10 
@@9:	cmp	al,'0' 
	jb	@@11 
	cmp	al,'9' 
	ja	@@11 
	cmp	bx,1000 
	jae	@@11 
	sub	al,'0' 
	cbw 
	shl	bx,1 
	mov	dx,bx 
	shl	bx,1 
	shl	bx,1 
	add	bx,dx 
	add	bx,ax 
@@10:	lodsb 
	jmp	@@9 
@@11:	cmp	cl,'-' 
	jne	@@12 
	neg	bx 
@@12:	add	di,bx 
@@13:	pop	ds 
	lea	ax,Temp 
	push	ss ax 
	les	ax,Dst 
	push	es ax 
	call	Comp2Ext 
	mov	ax,0f000h 
	cmp	di,ax 
	jge	@@14 
	sub	di,ax 
	push	ax 
	les	ax,Dst 
	push	es ax 
	call	ExtPow10 
@@14:	push	di 
	les	ax,Dst 
	push	es ax 
	call	ExtPow10 
	xchg	ax,si 
	dec	ax 
	sub	ax,Src.Offs 
	jmp	short @@15 
@@15:	pop	di si 
	Exit 
 
	Argm	Src,dword,1 
	Argm	W,word,1 
	Argm	Sign,dword,1 
	Argm	Dst,dword,1 
	Loc	Temp,word,5 
	Loc	P,dword,1 
	Loc	SSP,word,1 
	Loc	J,word,1 
	Loc	I,word,1 
	Entry	Ext2Str 
	push	si di 
	mov	ax,8000h 
	cmp	W,0 
	jg	@@1 
	mov	ax,18 
	xchg	ax,W 
@@1:	mov	j,ax 
	les	di,dst 
	mov	P.Offs,di 
	mov	P.Segm,es 
	push	ds 
	lds	si,Src 
	lea	di,Temp 
	push	ss 
	pop	es 
	cld 
	mov	cx,5 
	rep	movsw 
	pop	ds 
	mov	ax,Temp[8] 
	sub	cx,cx 
	shl	ax,1 
	rcl	cx,1 
	les	di,Sign 
	mov	es:[di],cx 
	shr	ax,1 
	jz	@@2 
	cmp	ax,7fffh 
	jb	@@4 
	mov	dx,7fffh 
	jmp	short @@3 
@@2:	sub	dx,dx 
@@3:	les	di,Dst 
	sub	al,al 
	stosb 
	mov	ax,dx 
	jmp	@@27 
@@4:	sub	ax,3fffh 
	cmp	ax,27 
	jge	@@5 
	or	ax,ax 
	jl	@@5 
	mov	I,8 
	jmp	@@7 
@@5:	mov	dx,4d10h 
	imul	dx 
	xchg	ax,bx 
	mov	ah,4dh 
	mov	al,byte ptr Temp[7] 
	shl	al,1 
	mul	ah 
	add	ax,bx 
	adc	dx,0 
	neg	ax 
	adc	dx,0 
	mov	I,dx 
	cmp	dx,J 
	jl	@@2 
	mov	si,8 
	sub	si,dx 
	mov	ax,1000h 
	cmp	si,ax 
	jl	@@6 
	sub	si,ax 
	push	ax 
	lea	ax,Temp 
	push	ss ax 
	call	ExtPow10 
@@6:	push	si 
	lea	ax,Temp 
	push	ss ax 
	call	ExtPow10 
@@7:	mov	SSP,sp 
@@8:	mov	cx,30 
	sub	cl,byte ptr Temp[8] 
	sub	bx,bx 
	mov	si,Temp[0] 
	mov	di,Temp[2] 
	mov	ax,Temp[4] 
	mov	dx,Temp[6] 
	cmp	cx,16 
	jb	@@9 
	mov	bx,si 
	mov	si,di 
	mov	di,ax 
	mov	ax,dx 
	sub	dx,dx 
	sub	cx,16 
	jz	@@11 
@@9:	push	bp 
	sub	bp,bp 
@@10:	shr	dx,1 
	rcr	ax,1 
	rcr	di,1 
	rcr	si,1 
	rcr	bx,1 
	rcr	bp,1 
	loop	@@10 
	mov	cx,bp 
	pop	bp 
@@11:	push	di 
	lea	di,Temp 
	push	ss 
	pop	es 
	xchg	ax,cx 
	stosw 
	xchg	ax,bx 
	stosw 
	xchg	ax,si 
	stosw 
	pop	ax 
	stosw 
	mov	ax,3ffeh 
	stosw 
	xchg	ax,cx 
@@12:	mov	bx,I 
	les	di,P 
	mov	si,Dst.Offs 
	mov	cx,10000 
	div	cx 
	mov	cx,100*256+10 
	xchg	ax,dx 
	div	ch 
	xchg	ax,dx 
	div	ch 
	cmp	al,ch 
	jb	@@13 
	sub	al,ch 
	inc	bx 
	push	ax 
	mov	al,'1' 
	call	@19 
	pop	ax 
@@13:	call	@15 
	mov	I,bx 
	mov	P.Offs,di 
	lea	ax,Temp 
	push	ss ax 
	cmp	byte ptr Temp[7],0 
	js	@@14 
	push	ss ax ss ax 
	call	Comp2Ext 
	sub	Temp[8],64 
@@14:	lea	ax,C1e8 
	push	ds ax 
	call	ExtMul 
	sub	ax,ax 
	mov	dx,ax 
	cmp	Temp[8],3fffh 
	jb	@@12 
	jmp	@@8 
@15	proc	near 
	call	@@16 
	xchg	ax,dx 
@@16:	mov	ch,ah 
	call	@@17 
	mov	al,ch 
@@17:	cbw 
	div	cl 
	add	ax,'00' 
	call	@@18 
	mov	al,ah 
@@18:	cmp	al,'0' 
	jne	@19 
	cmp	di,si 
	je	@@20 
@19:	stosb 
	dec	W 
	jl	@22 
@@20:	cmp	bx,J 
	jle	@22 
	dec	bx 
	ret 
@15	endp 
@@21:	jmp	@@2 
@22:	mov	sp,SSP 
	cmp	di,si 
	je	@@21 
	dec	di 
	add	bx,di 
	sub	bx,si 
	cmp	byte ptr es:[di],'5' 
	jae	@@25 
@@23:	cmp	di,si 
	je	@@21 
	dec	di 
	cmp	byte ptr es:[di],'0' 
	je	@@23 
	jmp	short @@26 
@@24:	dec	di 
	inc	byte ptr es:[di] 
	cmp	byte ptr es:[di],'9' 
	jbe	@@26 
@@25:	cmp	di,si 
	jne	@@24 
	mov	byte ptr es:[di],'1' 
	inc	bx 
@@26:	mov	byte ptr es:[di+1],0 
	mov	ax,bx 
	jmp	short @@27 
@@27:	pop	di si 
	Exit 
 
	end