home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / texmap / tmap_16p.asm < prev    next >
Assembly Source File  |  1998-06-08  |  4KB  |  205 lines

  1. ;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  2. ;SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  3. ;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  4. ;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  5. ;IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  6. ;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  7. ;FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  8. ;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  9. ;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  10. ;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  11. ;
  12. ; $Source: f:/miner/source/texmap/rcs/tmap_16p.asm $
  13. ; $Revision: 1.4 $
  14. ; $Author: mike $
  15. ; $Date: 1994/11/30 00:56:40 $
  16. ;
  17. ; Perspective 16 bit per pixel texture mapper
  18. ;
  19. ; $Log: tmap_16p.asm $
  20. ; Revision 1.4  1994/11/30  00:56:40  mike
  21. ; optimization.
  22. ; Revision 1.3  1994/11/12  16:39:32  mike
  23. ; jae to ja.
  24. ; Revision 1.2  1993/11/22  10:24:43  mike
  25. ; *** empty log message ***
  26. ; Revision 1.1  1993/09/08  17:29:21  mike
  27. ; Initial revision
  28. ;
  29. ;
  30.  
  31.     .386
  32.  
  33.     include    tmap_inc.asm
  34.  
  35.     public    asm_tmap_scanline_per_16_
  36.  
  37. _DATA    SEGMENT DWORD PUBLIC USE32 'DATA'
  38.     extrn    _fx_u:dword
  39.     extrn    _fx_v:dword
  40.     extrn    _fx_z:dword
  41.     extrn    _fx_du_dx:dword
  42.     extrn    _fx_dv_dx:dword
  43.     extrn    _fx_dz_dx:dword
  44.     extrn    _fx_y:dword
  45.     extrn    _fx_xleft:dword
  46.     extrn    _fx_xright:dword
  47.  
  48.     extrn    _pixptr:dword
  49.  
  50.     extrn    _x:dword
  51.     extrn    _loop_count:dword
  52.  
  53. temp    dd    ?
  54.  
  55. _DATA    ENDS
  56.  
  57. DGROUP    GROUP    _DATA
  58.  
  59.  
  60. _TEXT   SEGMENT PARA PUBLIC USE32 'CODE'
  61.     ASSUME    DS:_DATA
  62.     ASSUME    CS:_TEXT
  63.  
  64. ; --------------------------------------------------------------------------------------------------
  65. ; Enter:
  66. ;    _xleft    fixed point left x coordinate
  67. ;    _xright    fixed point right x coordinate
  68. ;    _y    fixed point y coordinate
  69. ;    _pixptr    address of source pixel map
  70. ;    _u    fixed point initial u coordinate
  71. ;    _v    fixed point initial v coordinate
  72. ;    _z    fixed point initial z coordinate
  73. ;    _du_dx    fixed point du/dx
  74. ;    _dv_dx    fixed point dv/dx
  75. ;    _dz_dx    fixed point dz/dx
  76.  
  77. ;   for (x = (int) xleft; x <= (int) xright; x++) {
  78. ;      _setcolor(read_pixel_from_tmap(srcb,((int) (u/z)) & 63,((int) (v/z)) & 63));
  79. ;      _setpixel(x,y);
  80. ;
  81. ;      u += du_dx;
  82. ;      v += dv_dx;
  83. ;      z += dz_dx;
  84. ;   }
  85.  
  86. asm_tmap_scanline_per_16_:
  87.     pusha
  88.  
  89. ; Setup for loop:    _loop_count  iterations = (int) xright - (int) xleft
  90. ;    esi    source pixel pointer = pixptr
  91. ;    edi    initial row pointer = y*320+x
  92.  
  93. ; set esi = pointer to start of texture map data
  94.     mov    esi,_pixptr
  95.  
  96. ; set edi = address of first pixel to modify
  97.     mov    edi,_fx_y
  98.  
  99.     cmp    edi,_window_bottom
  100.     ja    _none_to_do
  101.  
  102.     sub    edi,_window_top
  103.     imul    edi,_bytes_per_row
  104.     mov    eax,_fx_xleft
  105.     sar    eax,16
  106.     jns    eax_ok
  107.     sub    eax,eax
  108. eax_ok:
  109.     sub    eax,_window_left
  110.     add    edi,eax
  111.     add    edi,eax
  112.     add    edi,write_buffer
  113.  
  114. ; set _loop_count = # of iterations
  115.     mov    eax,_fx_xright
  116.     sar    eax,16
  117.     cmp    eax,_window_right
  118.     jb    eax_ok1
  119.     mov    eax,_window_right
  120. eax_ok1:    cmp    eax,_window_left
  121.     ja    eax_ok2
  122.     mov    eax,_window_left
  123. eax_ok2:
  124.  
  125.     mov    ebx,_fx_xleft
  126.     sar    ebx,16
  127.     sub    eax,ebx
  128.     js    _none_to_do
  129.     cmp    eax,_window_width
  130.     jbe    _ok_to_do
  131.     mov    eax,_window_width
  132. _ok_to_do:
  133. ;** dec eax ; don't write rightmost pixel
  134. ;** js _none_to_do
  135.     mov    _loop_count,eax
  136.  
  137. ; set initial values
  138.     mov    ebx,_fx_u
  139.     mov    ebp,_fx_v
  140.     mov    ecx,_fx_z
  141.  
  142. ; Usage in loop:    eax    division, pixel value
  143. ;    ebx    u
  144. ;    ecx    z
  145. ;    edx    division
  146. ;    ebp    v
  147. ;    esi    source pixel pointer
  148. ;    edi    destination pixel pointer
  149.  
  150.     align    4
  151. tmap_loop:
  152. ; cmp ecx,_max_ecx
  153. ; jl nonewmax
  154. ; mov _max_ecx,ecx
  155. ;nonewmax:
  156. ; cmp ecx,_min_ecx
  157. ; ja nonewmin
  158. ; mov _min_ecx,ecx
  159. ;nonewmin:
  160.  
  161. ;** cmp ecx,0
  162. ;** jle skip 
  163.  
  164. ; compute u coordinate
  165.     mov    eax,ebx    ; get u
  166.     cdq
  167.     idiv    ecx    ; eax = (u/z)
  168.     and    eax,3fh    ; mask with width-1
  169.     mov    temp,eax
  170.  
  171. ; compute v coordinate
  172.     mov    eax,ebp    ; get v
  173.     cdq
  174.     idiv    ecx    ; eax = (v/z)
  175.     and    eax,3fh    ; mask with height-1
  176.     shl    eax,6    ; multiply by 64 (bitmap width)
  177.     add    eax,temp
  178.  
  179. ; read/write pixel
  180.     mov    ax,[esi+2*eax]    ; get pixel from source bitmap
  181.  
  182. ; update deltas
  183.     mov    [edi],ax
  184.     add    edi,2
  185.  
  186. skip:    add    ebp,_fx_dv_dx
  187.     add    ebx,_fx_du_dx
  188.     add    ecx,_fx_dz_dx
  189.  
  190.     dec    _loop_count
  191.     jns    tmap_loop
  192.  
  193. _none_to_do:    popa
  194.  
  195.     ret
  196.  
  197. _TEXT    ends
  198.  
  199.     end
  200.  
  201.