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. // surf16.s
  22. // x86 assembly-language 16 bpp surface block drawing code.
  23. //
  24.  
  25. #include "asm_i386.h"
  26. #include "quakeasm.h"
  27. #include "asm_draw.h"
  28.  
  29. #if id386
  30.  
  31. //----------------------------------------------------------------------
  32. // Surface block drawer
  33. //----------------------------------------------------------------------
  34.  
  35.         .data
  36.  
  37. k:                      .long   0
  38. loopentry:      .long   0
  39.  
  40.         .align  4
  41. blockjumptable16:
  42.         .long   LEnter2_16
  43.         .long   LEnter4_16
  44.         .long   0, LEnter8_16
  45.         .long   0, 0, 0, LEnter16_16
  46.  
  47.  
  48.         .text
  49.  
  50.         .align 4
  51. .globl C(R_Surf16Start)
  52. C(R_Surf16Start):
  53.  
  54.         .align 4
  55. .globl C(R_DrawSurfaceBlock16)
  56. C(R_DrawSurfaceBlock16):
  57.         pushl   %ebp                            // preserve caller's stack frame
  58.         pushl   %edi
  59.         pushl   %esi                            // preserve register variables
  60.         pushl   %ebx
  61.  
  62.         movl    C(blocksize),%eax
  63.         movl    C(prowdestbase),%edi
  64.         movl    C(pbasesource),%esi
  65.         movl    C(sourcesstep),%ebx
  66.         movl    blockjumptable16-4(,%eax,2),%ecx
  67.         movl    %eax,k
  68.         movl    %ecx,loopentry
  69.         movl    C(lightleft),%edx
  70.         movl    C(lightright),%ebp
  71.  
  72. Lblockloop16:
  73.  
  74.         subl    %edx,%ebp
  75.         movb    C(blockdivshift),%cl
  76.         sarl    %cl,%ebp
  77.         jns             Lp1_16
  78.         testl   C(blockdivmask),%ebp
  79.         jz              Lp1_16
  80.         incl    %ebp
  81. Lp1_16:
  82.  
  83.         subl    %eax,%eax
  84.         subl    %ecx,%ecx       // high words must be 0 in loop for addressing
  85.  
  86.         jmp             *loopentry
  87.  
  88.         .align  4
  89.  
  90. #include "block16.h"
  91.  
  92.         movl    C(pbasesource),%esi
  93.         movl    C(lightleft),%edx
  94.         movl    C(lightright),%ebp
  95.         movl    C(sourcetstep),%eax
  96.         movl    C(lightrightstep),%ecx
  97.         movl    C(prowdestbase),%edi
  98.  
  99.         addl    %eax,%esi
  100.         addl    %ecx,%ebp
  101.  
  102.         movl    C(lightleftstep),%eax
  103.         movl    C(surfrowbytes),%ecx
  104.  
  105.         addl    %eax,%edx
  106.         addl    %ecx,%edi
  107.  
  108.         movl    %esi,C(pbasesource)
  109.         movl    %ebp,C(lightright)
  110.         movl    k,%eax
  111.         movl    %edx,C(lightleft)
  112.         decl    %eax
  113.         movl    %edi,C(prowdestbase)
  114.         movl    %eax,k
  115.         jnz             Lblockloop16
  116.  
  117.         popl    %ebx                            // restore register variables
  118.         popl    %esi
  119.         popl    %edi
  120.         popl    %ebp                            // restore the caller's stack frame
  121.         ret
  122.  
  123. .globl C(R_Surf16End)
  124. C(R_Surf16End):
  125.  
  126. //----------------------------------------------------------------------
  127. // Code patching routines
  128. //----------------------------------------------------------------------
  129.         .data
  130.  
  131.         .align 4
  132. LPatchTable16:
  133.         .long   LBPatch0-4
  134.         .long   LBPatch1-4
  135.         .long   LBPatch2-4
  136.         .long   LBPatch3-4
  137.         .long   LBPatch4-4
  138.         .long   LBPatch5-4
  139.         .long   LBPatch6-4
  140.         .long   LBPatch7-4
  141.         .long   LBPatch8-4
  142.         .long   LBPatch9-4
  143.         .long   LBPatch10-4
  144.         .long   LBPatch11-4
  145.         .long   LBPatch12-4
  146.         .long   LBPatch13-4
  147.         .long   LBPatch14-4
  148.         .long   LBPatch15-4
  149.  
  150.         .text
  151.  
  152.         .align 4
  153. .globl C(R_Surf16Patch)
  154. C(R_Surf16Patch):
  155.         pushl   %ebx
  156.  
  157.         movl    C(colormap),%eax
  158.         movl    $LPatchTable16,%ebx
  159.         movl    $16,%ecx
  160. LPatchLoop16:
  161.         movl    (%ebx),%edx
  162.         addl    $4,%ebx
  163.         movl    %eax,(%edx)
  164.         decl    %ecx
  165.         jnz             LPatchLoop16
  166.  
  167.         popl    %ebx
  168.  
  169.         ret
  170.  
  171.  
  172. #endif  // id386
  173.