home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / d_part68k.s < prev    next >
Text File  |  2000-06-17  |  8KB  |  265 lines

  1. * Copyright (C) 1996-1997 Id Software, Inc. 
  2. * This program is free software; you can redistribute it and/or 
  3. * modify it under the terms of the GNU General Public License 
  4. * as published by the Free Software Foundation; either version 2 
  5. * of the License, or (at your option) any later version. 
  6. * This program is distributed in the hope that it will be useful, 
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. * See the GNU General Public License for more details. 
  10. * You should have received a copy of the GNU General Public License 
  11. * along with this program; if not, write to the Free Software 
  12. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14. **
  15. ** Quake for AMIGA
  16. ** d_part.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _r_origin
  20.         XREF    _r_pright
  21.         XREF    _r_pup
  22.         XREF    _r_ppn
  23.         XREF    _xcenter
  24.         XREF    _ycenter
  25.         XREF    _d_vrectbottom_particle
  26.         XREF    _d_vrectright_particle
  27.         XREF    _d_vrecty
  28.         XREF    _d_vrectx
  29.         XREF    _d_pzbuffer
  30.         XREF    _d_zwidth
  31.         XREF    _d_viewbuffer
  32.         XREF    _d_scantable
  33.         XREF    _d_y_aspect_shift
  34.         XREF    _d_pix_min
  35.         XREF    _d_pix_max
  36.         XREF    _d_pix_shift
  37.         XREF    _screenwidth
  38.  
  39.         XDEF    _D_DrawParticle
  40.  
  41. PARTICLE_Z_CLIP         equ.s   8.0             ;must match the values in d_iface.h!
  42.  
  43. PART_ORG        =       0
  44. PART_COLOR      =       12
  45.  
  46. ******************************************************************************
  47. *
  48. *       void _D_DrawParticle (particle_t *pparticle)
  49. *
  50. ******************************************************************************
  51.  
  52.         cnop    0,4
  53. _D_DrawParticle
  54.  
  55.         rsreset
  56. .fpuregs        rs.x    4
  57. .regs           rs.l    8
  58.         rs.l    1
  59. .pparticle      rs.l    1
  60.  
  61.         movem.l d2-d7/a2/a3,-(sp)
  62.         fmovem.x        fp2-fp5,-(sp)
  63.         move.l  .pparticle(sp),a2
  64.         lea     _r_origin,a0
  65.         fmove.s (a2)+,fp0
  66.         fsub.s  (a0)+,fp0               ;fp0 = local[0]
  67.         fmove.s (a2)+,fp1
  68.         fsub.s  (a0)+,fp1               ;fp1 = local[1]
  69.         fmove.s (a2)+,fp2
  70.         fsub.s  (a0)+,fp2               ;fp2 = local[2]
  71.         lea     -12(a2),a2
  72.         lea     _r_pright,a1
  73.         fmove.s (a1)+,fp3
  74.         fmul    fp0,fp3
  75.         fmove.s (a1)+,fp4
  76.         fmul    fp1,fp4
  77.         fadd    fp4,fp3
  78.         fmove.s (a1)+,fp4
  79.         fmul    fp2,fp4
  80.         fadd    fp4,fp3                 ;fp3 = transformed[0]
  81.         lea     _r_pup,a1
  82.         fmove.s (a1)+,fp4
  83.         fmul    fp0,fp4
  84.         fmove.s (a1)+,fp5
  85.         fmul    fp1,fp5
  86.         fadd    fp5,fp4
  87.         fmove.s (a1)+,fp5
  88.         fmul    fp2,fp5
  89.         fadd    fp5,fp4                 ;fp4 = transformed[1]
  90.         lea     _r_ppn,a1
  91.         fmul.s  (a1)+,fp0
  92.         fmul.s  (a1)+,fp1
  93.         fadd    fp0,fp1
  94.         fmul.s  (a1)+,fp2
  95.         fadd    fp1,fp2                 ;fp2 = transformed[2]
  96.         fcmp.s  #PARTICLE_Z_CLIP,fp2
  97.         fblt.w  .exit
  98.         fmove.s #1,fp0
  99.         fdiv    fp2,fp0                 ;zi = 1.0 / transformed[2]
  100.         fmove.s #0.5,fp1
  101.         fmul    fp0,fp3
  102.         fmul    fp0,fp4
  103.         fadd    fp1,fp3
  104.         fadd    fp1,fp4
  105.         fadd.s  _xcenter,fp3
  106.         fmove.l fp3,d0                  ;d0 = u
  107.         fsub.s  _ycenter,fp4
  108.         fneg    fp4
  109.         fmove.l fp4,d1                  ;d1 = v
  110.         cmp.l   _d_vrectbottom_particle,d1
  111.         bgt.w   .exit
  112.         cmp.l   _d_vrectright_particle,d0
  113.         bgt.w   .exit
  114.         cmp.l   _d_vrecty,d1
  115.         blt.w   .exit
  116.         cmp.l   _d_vrectx,d0
  117.         blt.w   .exit
  118.         move.l  _d_pzbuffer,a0
  119.         lea     _d_scantable,a1
  120.         move.l  0(a1,d1.l*4),a1
  121.         move.l  _d_zwidth,d2            ;d2 = d_zwidth
  122.         muls    d2,d1
  123.         add.l   d0,d1
  124.         lea     0(a0,d1.l*2),a0         ;a0 = pz
  125.         add.l   d0,a1
  126.         add.l   _d_viewbuffer,a1        ;a1 = pdest
  127.         fmul.s  #32768,fp0
  128.         fmove.l fp0,d0                  ;izi = (int)(zi * 0x8000)
  129.         move.l  d0,d5                   ;d5 = izi
  130.         move.l  _d_pix_shift,d1
  131.         asr.l   d1,d0                   ;d0 = pix
  132.         move.l  _d_pix_min,d1
  133.         cmp.l   d1,d0
  134.         bgt.b   .cont
  135.         move.l  d1,d0
  136. .cont
  137.         move.l  _d_pix_max,d1
  138.         cmp.l   d1,d0
  139.         blt.b   .cont2
  140.         move.l  d1,d0
  141. .cont2
  142.         fmove.s PART_COLOR(a2),fp0
  143.         fmove.l fp0,d4
  144.         move.l  _screenwidth,d1
  145.         move.l  _d_y_aspect_shift,d3
  146.         cmp.l   #4,d0                   ;switch (pix)
  147.         bgt.b   .more
  148.         beq.b   .four
  149.         cmp.l   #2,d0
  150.         bgt.b   .three
  151.         beq.b   .two
  152. .one                                            ;case 1
  153.         lsl     d3,d0
  154.         subq    #1,d0
  155. .one_loop
  156.         cmp     (a0),d5                 ;if (pz[0] <= izi)
  157.         blt.b   .one_next
  158.         move    d5,(a0)                 ;pz[0] = izi
  159.         move.b  d4,(a1)                 ;pdest[0] = pparticle->color
  160. .one_next
  161.         add.l   d1,a1                   ;pdest += screenwidth
  162.         lea     0(a0,d2.l*2),a0         ;pz += d_zwidth
  163.         dbra    d0,.one_loop            ;count--
  164.         bra.w   .exit
  165. .two                                            ;case 2
  166.         lsl     d3,d0
  167.         subq    #1,d0
  168. .two_loop
  169.         cmp     (a0),d5                 ;if (pz[0] <= izi)
  170.         blt.b   .two_2
  171.         move    d5,(a0)                 ;pz[0] = izi
  172.         move.b  d4,(a1)                 ;pdest[0] = pparticle->color
  173. .two_2
  174.         cmp     2(a0),d5                ;if (pz[1] <= izi)
  175.         blt.b   .two_next
  176.         move    d5,2(a0)                ;pz[1] = izi
  177.         move.b  d4,1(a1)                ;pdest[1] = pparticle->color
  178. .two_next
  179.         add.l   d1,a1                   ;pdest += screenwidth
  180.         lea     0(a0,d2.l*2),a0         ;pz += d_zwidth
  181.         dbra    d0,.two_loop            ;count--
  182.         bra.w   .exit
  183. .three                                          ;case3
  184.         lsl     d3,d0
  185.         subq    #1,d0
  186. .three_loop
  187.         cmp     (a0),d5                 ;if (pz[0] <= izi)
  188.         blt.b   .three_2
  189.         move    d5,(a0)                 ;pz[0] = izi
  190.         move.b  d4,(a1)                 ;pdest[0] = pparticle->color
  191. .three_2
  192.         cmp     2(a0),d5                ;if (pz[1] <= izi)
  193.         blt.b   .three_3
  194.         move    d5,2(a0)                ;pz[1] = izi
  195.         move.b  d4,1(a1)                ;pdest[1] = pparticle->color
  196. .three_3
  197.         cmp     4(a0),d5                ;if (pz[2] <= izi)
  198.         blt.b   .three_next
  199.         move    d5,4(a0)                ;pz[2] = izi
  200.         move.b  d4,2(a1)                ;pdest[2] = pparticle->color
  201. .three_next
  202.         add.l   d1,a1                   ;pdest += screenwidth
  203.         lea     0(a0,d2.l*2),a0         ;pz += d_zwidth
  204.         dbra    d0,.three_loop          ;count--
  205.         bra.b   .exit
  206. .four                                           ;case4
  207.         lsl     d3,d0
  208.         subq    #1,d0
  209. .four_loop
  210.         cmp     (a0),d5                 ;if (pz[0] <= izi)
  211.         blt.b   .four_2
  212.         move    d5,(a0)                 ;pz[0] = izi
  213.         move.b  d4,(a1)                 ;pdest[0] = pparticle->color
  214. .four_2
  215.         cmp     2(a0),d5                ;if (pz[1] <= izi)
  216.         blt.b   .four_3
  217.         move    d5,2(a0)                ;pz[1] = izi
  218.         move.b  d4,1(a1)                ;pdest[1] = pparticle->color
  219. .four_3
  220.         cmp     4(a0),d5                ;if (pz[2] <= izi)
  221.         blt.b   .four_4
  222.         move    d5,4(a0)                ;pz[2] = izi
  223.         move.b  d4,2(a1)                ;pdest[2] = pparticle->color
  224. .four_4
  225.         cmp     6(a0),d5                ;if (pz[3] <= izi)
  226.         blt.b   .four_next
  227.         move    d5,6(a0)                ;pz[3] = izi
  228.         move.b  d4,3(a1)                ;pdest[3] = pparticle->color
  229. .four_next
  230.         add.l   d1,a1                   ;pdest += screenwidth
  231.         lea     0(a0,d2.l*2),a0         ;pz += d_zwidth
  232.         dbra    d0,.four_loop           ;count--
  233.         bra.b   .exit
  234. .more
  235.         move    d0,d6
  236.         subq    #1,d6
  237.         lsl     d3,d0
  238.         subq    #1,d0
  239. .more_loop
  240.         move.l  a0,a2
  241.         move.l  a1,a3
  242.         move    d6,d7
  243. .more_loop2
  244.         addq.l  #1,a3
  245.         cmp     (a2)+,d5                ;if (pz[i] <= izi)
  246.         blt.b   .more_next
  247.         move    d5,-2(a2)               ;pz[i] = izi
  248.         move.b  d4,-1(a3)               ;pdest[i] = pparticle->color
  249. .more_next
  250.         dbra    d7,.more_loop2
  251.         add.l   d1,a1                   ;pdest += screenwidth
  252.         lea     0(a0,d2.l*2),a0         ;pz += d_zwidth
  253.         dbra    d0,.more_loop
  254. .exit
  255.         fmovem.x        (sp)+,fp2-fp5
  256.         movem.l (sp)+,d2-d7/a2/a3
  257.         rts
  258.  
  259.