home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / texmap / tmap_z.asm < prev    next >
Assembly Source File  |  1998-06-08  |  4KB  |  167 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_z.asm $
  13. ; $Revision: 1.4 $
  14. ; $Author: mike $
  15. ; $Date: 1994/11/30 00:57:06 $
  16. ; Assembly routines to do a flat-shaded z-buffer tmap.
  17. ; $Log: tmap_z.asm $
  18. ; Revision 1.4  1994/11/30  00:57:06  mike
  19. ; optimization.
  20. ; Revision 1.3  1994/11/12  16:41:14  mike
  21. ; jae -> ja.
  22. ; Revision 1.2  1994/07/08  17:43:14  john
  23. ; Added flat-shaded-zbuffered polygon.
  24. ; Revision 1.1  1994/07/08  10:58:18  john
  25. ; Initial revision
  26.  
  27.     .386
  28.  
  29.     public    asm_tmap_scanline_flat_z_
  30.     public    _tmap_flat_color_z
  31.     public    _tmap_z_buffer
  32.  
  33.     include    tmap_inc.asm
  34.  
  35. _DATA    SEGMENT DWORD PUBLIC USE32 'DATA'
  36.  
  37.     extrn    _fx_y:dword
  38.     extrn    _fx_xleft:dword
  39.     extrn    _fx_xright:dword
  40.     extrn    _fx_z:dword
  41.     extrn    _fx_dz_dx:dword
  42.         
  43. ;**    extrn    _pixptr:dword
  44.  
  45. _tmap_flat_color_z    db    ?
  46. _tmap_z_buffer        dd    0
  47. _loop_count        dd    0
  48.  
  49. _DATA    ENDS
  50.  
  51. DGROUP    GROUP    _DATA
  52.  
  53. _TEXT   SEGMENT PARA PUBLIC USE32 'CODE'
  54.  
  55.     ASSUME    DS:_DATA
  56.     ASSUME    CS:_TEXT
  57.  
  58. ; --------------------------------------------------------------------------------------------------
  59. ; Enter:
  60. ;    _xleft    fixed point left x coordinate
  61. ;    _xright    fixed point right x coordinate
  62. ;    _y    fixed point y coordinate
  63. ;**;    _pixptr    address of source pixel map
  64.  
  65. ;   for (x = (int) xleft; x <= (int) xright; x++) {
  66. ;      _setcolor(read_pixel_from_tmap(srcb,((int) (u/z)) & 63,((int) (v/z)) & 63));
  67. ;      _setpixel(x,y);
  68. ;
  69. ;      z += dz_dx;
  70. ;   }
  71.  
  72. asm_tmap_scanline_flat_z_:
  73.     pusha
  74.  
  75. ; Setup for loop:    _loop_count  iterations = (int) xright - (int) xleft
  76. ;**;    esi    source pixel pointer = pixptr
  77. ;    edi    initial row pointer = y*320+x
  78.  
  79. ; set esi = pointer to start of texture map data
  80. ;**    mov    esi,_pixptr
  81.  
  82. ; set edi = address of first pixel to modify
  83.     mov    edi,_fx_y
  84.     shr    edi,16
  85.     cmp    edi,_window_bottom
  86.     ja    _none_to_do
  87.  
  88.     imul    edi,_bytes_per_row
  89.     mov    eax,_fx_xleft
  90.     sar    eax,16
  91.     jns    eax_ok
  92.     sub    eax,eax
  93. eax_ok:
  94.     add    edi,eax
  95.     mov    esi,edi
  96.     shl    esi, 2
  97.     add    esi, _tmap_z_buffer
  98.     add    edi,write_buffer
  99.  
  100. ; set _loop_count = # of iterations
  101.     mov    eax,_fx_xright
  102.     sar    eax,16
  103.  
  104.     cmp    eax,_window_right
  105.     jb    eax_ok1
  106.     mov    eax,_window_right
  107. eax_ok1:    cmp    eax,_window_left
  108.     ja    eax_ok2
  109.     mov    eax,_window_left
  110. eax_ok2:
  111.     mov    ebx,_fx_xleft
  112.     sar    ebx,16
  113.     sub    eax,ebx
  114.     js    _none_to_do
  115.     cmp    eax,_window_width
  116.     jbe    _ok_to_do
  117.     mov    eax,_window_width
  118. _ok_to_do:
  119.     mov    _loop_count, eax
  120.  
  121.     mov    cl,_tmap_flat_color_z
  122.     mov    edx, _fx_z
  123.     mov    ebp, _fx_dz_dx
  124.     mov    ebx, 4
  125.     
  126. _size = (_end1 - _start1)/num_iters
  127.     mov    eax,num_iters-1
  128.     sub    eax,_loop_count
  129.     jns    j_eax_ok1
  130.     inc    eax    ; sort of a hack, but we can get -1 here and want to be graceful
  131.     jns    j_eax_ok1    ; if we jump, we had -1, which is kind of ok, if not, we int 3
  132.     int    3    ; oops, going to jump behind _start1, very bad...
  133.     sub    eax,eax    ; ok to continue
  134. j_eax_ok1:    imul    eax,eax,dword ptr _size
  135.     add    eax,offset _start1
  136.     jmp    eax
  137.  
  138.     align    4
  139. _start1:
  140.  
  141. rept num_iters
  142. local l1
  143.     cmp    edx, [esi]
  144.     jge    l1
  145.     mov    [esi], edx
  146.     mov    [edi], cl
  147. l1:    add    esi, ebx
  148.     add    edx, ebp
  149.     inc    edi
  150. endm
  151. _end1:
  152.  
  153. _none_to_do:    popa
  154.     ret
  155.  
  156.  
  157. _TEXT    ends
  158.  
  159.     end
  160.