Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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.