Metropoli BBS
VIEWER: fixed.asm MODE: TEXT (ASCII)
				.model small,c
				locals

				extrn oldpos:word

				.code

				public FixedMul,FixedDiv,FixedAdd,Distance


param1 			equ [4+bp]
param2 			equ [6+bp]
param3 			equ [8+bp]
param4			equ [10+bp]



FixMul			macro r2		; multiplies eax by r2
								; result in eax
								; trashes edx
				imul dword ptr r2
				shrd eax,edx,16

				endm


FixDiv			macro r2		; divides eax by r2
								; result in eax
								; trashes edx
				mov edx,eax
				sar edx,16
				shl eax,16
				idiv dword ptr r2

				endm

.386

FixedAdd		proc near

				push bp
				mov bp,sp

				mov eax,param1
				add eax,param3

				mov edx,eax
				shr edx,16

				pop bp

				ret

FixedAdd		endp


FixedMul		proc near

				push bp
				mov bp,sp

				mov eax,param1
				FixMul param3

				mov edx,eax
				shr edx,16

				pop bp
				ret

FixedMul		endp


FixedDiv		proc near

				push bp
				mov bp,sp

				mov eax,param1
				FixDiv param3

				mov edx,eax
				shr edx,16

				pop bp
				ret

FixedDiv		endp


Distance		proc near

				push bp
				mov bp,sp

				push si
				push di

				xor esi,esi
				xor edi,edi

				mov di,word ptr param1
				shl di,4
				add di,oldpos
				mov si,word ptr param2
				shl si,4
				add si,oldpos

				mov eax,[edi]	; oldpos[a].x
				sub eax,[esi]	; - oldpos[b].x

				FixMul eax		; ^2

				mov ebx,eax

				mov eax,[edi+4] ; oldpos[a].y
				sub eax,[esi+4] ;  - oldpos[b].y

				FixMul eax		; ^2

				add eax,ebx

				mov edi,eax		; get square root..
				or edi,edi
				jz @@zero
				js @@zero

				bsr ecx,edi					; 1st approximation
				sub cl,16
				ja @@2

				lea esi,[edi*2]
				jmp @@3
@@2:
				shr cl,1
				add cl,16
				mov esi,1
				shl esi,cl

@@3:
				mov eax,edi					; 2nd approximation
				FixDiv esi
				mov ebx,esi
				sub ebx,eax
				sar ebx,1
				sub esi,ebx

				mov eax,edi					; 3rd approximation
				FixDiv esi
				mov ebx,esi
				sub ebx,eax
				sar ebx,1
				sub esi,ebx

				mov eax,edi					; 4th approximation
				FixDiv esi
				mov ebx,esi
				sub ebx,eax
				sar ebx,1
				sub esi,ebx

				mov eax,esi
				mov edx,eax
				shr edx,16
@@1:
				pop di
				pop si
				pop bp
				ret

@@zero:
				xor ax,ax
				xor dx,dx
				jmp @@1


Distance		endp







				end
[ RETURN TO DIRECTORY ]