home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / texmap / tmap_flt.asm < prev    next >
Assembly Source File  |  1998-06-08  |  4KB  |  179 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_flt.asm $
  13. ; $Revision: 1.10 $
  14. ; $Author: john $
  15. ; $Date: 1995/02/20 18:22:53 $
  16. ;
  17. ; Flat shader derived from texture mapper (kind of slow)
  18. ;
  19. ; $Log: tmap_flt.asm $
  20. ; Revision 1.10  1995/02/20  18:22:53  john
  21. ; Put all the externs in the assembly modules into tmap_inc.asm.
  22. ; Also, moved all the C versions of the inner loops into a new module, 
  23. ; scanline.c.
  24. ; Revision 1.9  1995/02/20  17:08:51  john
  25. ; Added code so that you can build the tmapper with no assembly!
  26. ; Revision 1.8  1994/12/02  23:29:21  mike
  27. ; change jb/ja to jl/jg.
  28. ; Revision 1.7  1994/11/12  16:39:35  mike
  29. ; jae to ja.
  30. ; Revision 1.6  1994/08/09  11:27:53  john
  31. ; Added cthru mode.
  32. ; Revision 1.5  1994/07/08  17:43:11  john
  33. ; Added flat-shaded-zbuffered polygon.
  34. ; Revision 1.4  1994/04/08  16:25:43  mike
  35. ; optimize inner loop of flat shader.
  36. ; Revision 1.3  1994/03/31  08:34:20  mike
  37. ; Optimized (well, speeded-up) inner loop for tmap-based flat shader.
  38. ; Revision 1.2  1993/11/22  10:24:57  mike
  39. ; *** empty log message ***
  40. ; Revision 1.1  1993/09/08  17:29:46  mike
  41. ; Initial revision
  42. ;
  43. ;
  44.  
  45.     .386
  46.  
  47.     public    asm_tmap_scanline_flat_
  48.  
  49.     include    tmap_inc.asm
  50.  
  51. _DATA    SEGMENT DWORD PUBLIC USE32 'DATA'
  52.  
  53.  
  54. _DATA    ENDS
  55.  
  56. DGROUP    GROUP    _DATA
  57.  
  58. _TEXT   SEGMENT DWORD PUBLIC USE32 'CODE'
  59.  
  60.     ASSUME    DS:_DATA
  61.     ASSUME    CS:_TEXT
  62.  
  63. ; --------------------------------------------------------------------------------------------------
  64. ; Enter:
  65. ;    _xleft    fixed point left x coordinate
  66. ;    _xright    fixed point right x coordinate
  67. ;    _y    fixed point y coordinate
  68. ;**;    _pixptr    address of source pixel map
  69.  
  70. ;   for (x = (int) xleft; x <= (int) xright; x++) {
  71. ;      _setcolor(read_pixel_from_tmap(srcb,((int) (u/z)) & 63,((int) (v/z)) & 63));
  72. ;      _setpixel(x,y);
  73. ;
  74. ;      z += dz_dx;
  75. ;   }
  76.  
  77. asm_tmap_scanline_flat_:
  78.     pusha
  79.  
  80. ; Setup for loop:    _loop_count  iterations = (int) xright - (int) xleft
  81. ;**;    esi    source pixel pointer = pixptr
  82. ;    edi    initial row pointer = y*320+x
  83.  
  84. ; set esi = pointer to start of texture map data
  85. ;**    mov    esi,_pixptr
  86.  
  87. ; set edi = address of first pixel to modify
  88.     mov    edi,_fx_y
  89.     cmp    edi,_window_bottom
  90.     ja    _none_to_do
  91.  
  92.     imul    edi,_bytes_per_row
  93.     mov    eax,_fx_xleft
  94.     test    eax, eax
  95.     jns    eax_ok
  96.     sub    eax,eax
  97. eax_ok:
  98.     add    edi,eax
  99.     add    edi,write_buffer
  100.  
  101. ; set _loop_count = # of iterations
  102.     mov    eax,_fx_xright
  103.  
  104.     cmp    eax,_window_right
  105.     jl    eax_ok1
  106.     mov    eax,_window_right
  107. eax_ok1:    cmp    eax,_window_left
  108.     jg    eax_ok2
  109.     mov    eax,_window_left
  110. eax_ok2:
  111.  
  112.     mov    ebx,_fx_xleft
  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.     dec    eax
  119. _ok_to_do:
  120.     mov    ecx,eax
  121.  
  122. ; edi = destination pixel pointer
  123.     cmp    _tmap_flat_cthru_table, 0
  124.     jne    do_flat_cthru
  125.  
  126.     mov    al,_tmap_flat_color
  127.  
  128. ; word align
  129.     inc    ecx
  130.     test    edi,1
  131.     je    edi_even
  132.     mov    es:[edi],al
  133.     inc    edi
  134.     dec    ecx
  135.     je    _none_to_do
  136. edi_even:    shr    ecx,1
  137.     je    _no_full_words
  138.     mov    ah,al
  139.     rep    stosw
  140. _no_full_words:    adc    ecx,ecx    ; if cy set, then write one more pixel (ecx == 0)
  141.     rep    stosb    ; write 0 or 1 pixel
  142.  
  143. _none_to_do:    popa
  144.     ret
  145.  
  146. do_flat_cthru:
  147.     mov    esi, _tmap_flat_cthru_table
  148.     xor    eax, eax
  149.     cmp    ecx, 0
  150.     je    _none_to_do
  151.     ; edi = dest, esi = table, ecx = count
  152.  
  153. flat_cthru_loop:
  154.     mov    al, es:[edi]    ; get already drawn pixel
  155.     mov    al, [eax+esi]    ; xlat thru cthru table
  156.     mov    es:[edi],al    ; write it
  157.     inc    edi
  158.     dec    ecx
  159.     jnz    flat_cthru_loop
  160.     popa
  161.     ret
  162.  
  163. _TEXT    ends
  164.  
  165.     end
  166.  
  167.  
  168. 
  169.