Home | History | Annotate | Download | only in WinQuake
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 //
     21 // worlda.s
     22 // x86 assembly-language server testing stuff
     23 //
     24 
     25 #define GLQUAKE	1	// don't include unneeded defs
     26 #include "asm_i386.h"
     27 #include "quakeasm.h"
     28 #include "d_ifacea.h"
     29 
     30 #if id386
     31 
     32 	.data
     33 
     34 Ltemp:	.long	0
     35 
     36 	.text
     37 
     38 //----------------------------------------------------------------------
     39 // hull-point test
     40 //----------------------------------------------------------------------
     41 
     42 #define hull	4+8				// because only partially pushed
     43 #define	num		8+4				// because only partially pushed
     44 #define p		12+12			// because only partially pushed
     45 
     46 	.align 4
     47 .globl C(SV_HullPointContents)
     48 C(SV_HullPointContents):
     49 	pushl	%edi				// preserve register variables
     50 	movl	num(%esp),%eax
     51 	testl	%eax,%eax
     52 	js		Lhquickout
     53 
     54 //	float		d;
     55 //	dclipnode_t	*node;
     56 //	mplane_t	*plane;
     57 
     58 	pushl	%ebx
     59 	movl	hull(%esp),%ebx
     60 
     61 	pushl	%ebp
     62 	movl	p(%esp),%edx
     63 
     64 	movl	hu_clipnodes(%ebx),%edi
     65 	movl	hu_planes(%ebx),%ebp
     66 
     67 	subl	%ebx,%ebx
     68 	pushl	%esi
     69 
     70 // %ebx: 0
     71 // %eax: num
     72 // %edx: p
     73 // %edi: hull->clipnodes
     74 // %ebp: hull->planes
     75 
     76 //	while (num >= 0)
     77 //	{
     78 
     79 Lhloop:
     80 
     81 //		node = hull->clipnodes + num;
     82 //		plane = hull->planes + node->planenum;
     83 // !!! if the size of dclipnode_t changes, the scaling of %eax needs to be
     84 //     changed !!!
     85 	movl	nd_planenum(%edi,%eax,8),%ecx
     86 	movl	nd_children(%edi,%eax,8),%eax
     87 	movl	%eax,%esi
     88 	rorl	$16,%eax
     89 	leal	(%ecx,%ecx,4),%ecx
     90 
     91 //		if (plane->type < 3)
     92 //			d = p[plane->type] - plane->dist;
     93 	movb	pl_type(%ebp,%ecx,4),%bl
     94 	cmpb	$3,%bl
     95 	jb		Lnodot
     96 
     97 //		else
     98 //			d = DotProduct (plane->normal, p) - plane->dist;
     99 	flds	pl_normal(%ebp,%ecx,4)
    100 	fmuls	0(%edx)
    101 	flds	pl_normal+4(%ebp,%ecx,4)
    102 	fmuls	4(%edx)
    103 	flds	pl_normal+8(%ebp,%ecx,4)
    104 	fmuls	8(%edx)
    105 	fxch	%st(1)
    106 	faddp	%st(0),%st(2)
    107 	faddp	%st(0),%st(1)
    108 	fsubs	pl_dist(%ebp,%ecx,4)
    109 	jmp		Lsub
    110 
    111 Lnodot:
    112 	flds	pl_dist(%ebp,%ecx,4)
    113 	fsubrs	(%edx,%ebx,4)
    114 
    115 Lsub:
    116 	sarl	$16,%eax
    117 	sarl	$16,%esi
    118 
    119 //		if (d < 0)
    120 //			num = node->children[1];
    121 //		else
    122 //			num = node->children[0];
    123 	fstps	Ltemp
    124 	movl	Ltemp,%ecx
    125 	sarl	$31,%ecx
    126 	andl	%ecx,%esi
    127 	xorl	$0xFFFFFFFF,%ecx
    128 	andl	%ecx,%eax
    129 	orl		%esi,%eax
    130 	jns		Lhloop
    131 
    132 //	return num;
    133 Lhdone:
    134 	popl	%esi
    135 	popl	%ebp
    136 	popl	%ebx				// restore register variables
    137 
    138 Lhquickout:
    139 	popl	%edi
    140 
    141 	ret
    142 
    143 #endif	// id386
    144 
    145