
; 	matrix-rotations with 6 muls...mem rulez=only sin table!
;	by Warlock/AMNESTY...

jumps

.386p
CODE32 SEGMENT PARA PUBLIC USE32
ASSUME cs:CODE32, ds:CODE32

		PUBLIC	angleX
		PUBLIC	angleY
		PUBLIC	angleZ
		PUBLIC	_rotatem
		PUBLIC	sin

		angleX	dd 0
		angleY	dd 0
		angleZ	dd 0

_rotatem:	
		mov	eax,angleX
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	sin1,ebx
		add	eax,64
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	cos1,ebx
		mov	eax,angleY
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	sin2,ebx
		add	eax,64
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	cos2,ebx
		mov	eax,angleZ
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	sin3,ebx
		add	eax,64
		and	eax,0ffh
		movsx	ebx, word ptr [sin+eax*2]
		mov	cos3,ebx
		mov	eax,cos3
		imul	dword ptr [cos2]
		shrd	eax,edx,10
		mov	dword ptr [matrix],eax
		mov	eax,sin2
		neg	eax
		mov	dword ptr [matrix+24],eax
		mov	eax,sin3
		imul	dword ptr [cos2]
		shrd	eax,edx,10
		mov	dword ptr [matrix+12],eax
		mov	eax,sin3
		imul	dword ptr [cos1]
		shrd	eax,edx,10
		mov	s3c1,eax
		mov	eax,sin3
		imul	dword ptr [sin1]
		shrd	eax,edx,10
		mov	s3s1,eax
		mov	eax,cos3
		imul	dword ptr [sin2]
		shrd	eax,edx,10
		mov	c3s2,eax
		imul	dword ptr [sin1]
		shrd	eax,edx,10
		neg	eax
		sub	eax,s3c1
		mov	dword ptr [matrix+4],eax
		mov	eax,c3s2
		imul	dword ptr [cos1]
		shrd	eax,edx,10
		sub	eax,s3s1
		mov	dword ptr [matrix+8],eax
		mov	eax,s3s1
		imul	dword ptr [sin2]
		shrd	eax,edx,10
		mov	ebx,eax
		mov	eax,cos3
		imul	dword ptr [cos1]
		shrd	eax,edx,10
		sub	eax,ebx
		mov	dword ptr [matrix+16],eax
		mov	eax,cos2
		imul	dword ptr [sin1]
		shrd	eax,edx,10
		neg	eax
		mov	dword ptr [matrix+28],eax
		mov	eax,cos2
		imul	dword ptr [cos1]
		shrd	eax,edx,10
		mov	dword ptr [matrix+32],eax
		mov	eax,s3c1
		imul	dword ptr [sin2]
		shrd	eax,edx,10
		mov	ebx,eax
		mov	eax,cos3
		imul	dword ptr [sin1]
		shrd	eax,edx,10
		add	eax,ebx
		mov	dword ptr [matrix+20],eax		
		mov	eax,dword ptr [matrix]
		imul	dword ptr [matrix+4]
		mov	ab1,eax
		mov	eax,dword ptr [matrix+12]
		imul	eax,dword ptr [matrix+16]
		mov	ab2,eax
		mov	eax,dword ptr [matrix+24]
		imul	dword ptr [matrix+28]
		mov	ab3,eax
	rotloop:
		movsx	eax,word ptr [esi]
		movsx	ebx,word ptr [esi+2]
		imul	ebx
		mov	xy,eax	;next constant:) per 3d-point!
		movsx	eax, word ptr [esi]
		movsx	ebx, word ptr [esi+2]
		add	eax,dword ptr [matrix+4]
		add	ebx,dword ptr [matrix]
		imul	ebx
		sub	eax,xy
		sub	eax,ab1
		sar	eax,10
		mov	ebx,eax
		movsx	eax,word ptr [esi+4]
		imul	eax,dword ptr [matrix+8]
		sar	eax,10
		add	ebx,eax	;==>xr
		movsx	eax, word ptr [esi]
		movsx	ebp, word ptr [esi+2]
		add	eax,dword ptr [matrix+16]
		add	ebp,dword ptr [matrix+12]
		imul	ebp
		sub	eax,xy
		sub	eax,ab2
		sar	eax,10
		mov	ebp,eax
		movsx	eax,word ptr [esi+4]
		imul	eax,dword ptr [matrix+20]
		sar	eax,10
		add	ebp,eax ;==>yr
		movsx	eax, word ptr [esi]
		movsx	edi, word ptr [esi+2]
		add	eax,dword ptr [matrix+28]
		add	edi,dword ptr [matrix+24]
		imul	edi
		sub	eax,xy
		sub	eax,ab3
		sar	eax,10
		mov	edi,eax
		movsx	eax,word ptr [esi+4]
		imul	eax,dword ptr [matrix+32]
		sar	eax,10
		add	edi,eax ;==>zr
	        mov	word ptr [esi],bx
		mov	word ptr [esi+2],bp
		mov	word ptr [esi+4],di
		add	esi,6	
		loop	rotloop		
		ret

		include	sin.255

		matrix:		
		dd 9 DUP (?)	;  c3c2  -s3c1-c3s2s1  -s3s1+c3s2c1
			    	;  s3c2   c3c1-s3s2s1   c3s1+s3s2c1
			    	;   -s2     -c2s1          c2c1
		xy	dd ?
		s3c1	dd ?
		c3s2	dd ?
		s3s1	dd ?
		IRPC	roxi,<123>
		sin&roxi 	dd ?
		cos&roxi	dd ?
		ab&roxi		dd ?
		ENDM

CODE32 ENDS
END
