home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 113
/
EnigmaAmiga113CD.iso
/
software
/
sviluppo
/
quake_src
/
d_part68k.s
< prev
next >
Wrap
Text File
|
2000-06-17
|
8KB
|
265 lines
*
* Copyright (C) 1996-1997 Id Software, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
**
** Quake for AMIGA
** d_part.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
**
XREF _r_origin
XREF _r_pright
XREF _r_pup
XREF _r_ppn
XREF _xcenter
XREF _ycenter
XREF _d_vrectbottom_particle
XREF _d_vrectright_particle
XREF _d_vrecty
XREF _d_vrectx
XREF _d_pzbuffer
XREF _d_zwidth
XREF _d_viewbuffer
XREF _d_scantable
XREF _d_y_aspect_shift
XREF _d_pix_min
XREF _d_pix_max
XREF _d_pix_shift
XREF _screenwidth
XDEF _D_DrawParticle
PARTICLE_Z_CLIP equ.s 8.0 ;must match the values in d_iface.h!
PART_ORG = 0
PART_COLOR = 12
******************************************************************************
*
* void _D_DrawParticle (particle_t *pparticle)
*
******************************************************************************
cnop 0,4
_D_DrawParticle
rsreset
.fpuregs rs.x 4
.regs rs.l 8
rs.l 1
.pparticle rs.l 1
movem.l d2-d7/a2/a3,-(sp)
fmovem.x fp2-fp5,-(sp)
move.l .pparticle(sp),a2
lea _r_origin,a0
fmove.s (a2)+,fp0
fsub.s (a0)+,fp0 ;fp0 = local[0]
fmove.s (a2)+,fp1
fsub.s (a0)+,fp1 ;fp1 = local[1]
fmove.s (a2)+,fp2
fsub.s (a0)+,fp2 ;fp2 = local[2]
lea -12(a2),a2
lea _r_pright,a1
fmove.s (a1)+,fp3
fmul fp0,fp3
fmove.s (a1)+,fp4
fmul fp1,fp4
fadd fp4,fp3
fmove.s (a1)+,fp4
fmul fp2,fp4
fadd fp4,fp3 ;fp3 = transformed[0]
lea _r_pup,a1
fmove.s (a1)+,fp4
fmul fp0,fp4
fmove.s (a1)+,fp5
fmul fp1,fp5
fadd fp5,fp4
fmove.s (a1)+,fp5
fmul fp2,fp5
fadd fp5,fp4 ;fp4 = transformed[1]
lea _r_ppn,a1
fmul.s (a1)+,fp0
fmul.s (a1)+,fp1
fadd fp0,fp1
fmul.s (a1)+,fp2
fadd fp1,fp2 ;fp2 = transformed[2]
fcmp.s #PARTICLE_Z_CLIP,fp2
fblt.w .exit
fmove.s #1,fp0
fdiv fp2,fp0 ;zi = 1.0 / transformed[2]
fmove.s #0.5,fp1
fmul fp0,fp3
fmul fp0,fp4
fadd fp1,fp3
fadd fp1,fp4
fadd.s _xcenter,fp3
fmove.l fp3,d0 ;d0 = u
fsub.s _ycenter,fp4
fneg fp4
fmove.l fp4,d1 ;d1 = v
cmp.l _d_vrectbottom_particle,d1
bgt.w .exit
cmp.l _d_vrectright_particle,d0
bgt.w .exit
cmp.l _d_vrecty,d1
blt.w .exit
cmp.l _d_vrectx,d0
blt.w .exit
move.l _d_pzbuffer,a0
lea _d_scantable,a1
move.l 0(a1,d1.l*4),a1
move.l _d_zwidth,d2 ;d2 = d_zwidth
muls d2,d1
add.l d0,d1
lea 0(a0,d1.l*2),a0 ;a0 = pz
add.l d0,a1
add.l _d_viewbuffer,a1 ;a1 = pdest
fmul.s #32768,fp0
fmove.l fp0,d0 ;izi = (int)(zi * 0x8000)
move.l d0,d5 ;d5 = izi
move.l _d_pix_shift,d1
asr.l d1,d0 ;d0 = pix
move.l _d_pix_min,d1
cmp.l d1,d0
bgt.b .cont
move.l d1,d0
.cont
move.l _d_pix_max,d1
cmp.l d1,d0
blt.b .cont2
move.l d1,d0
.cont2
fmove.s PART_COLOR(a2),fp0
fmove.l fp0,d4
move.l _screenwidth,d1
move.l _d_y_aspect_shift,d3
cmp.l #4,d0 ;switch (pix)
bgt.b .more
beq.b .four
cmp.l #2,d0
bgt.b .three
beq.b .two
.one ;case 1
lsl d3,d0
subq #1,d0
.one_loop
cmp (a0),d5 ;if (pz[0] <= izi)
blt.b .one_next
move d5,(a0) ;pz[0] = izi
move.b d4,(a1) ;pdest[0] = pparticle->color
.one_next
add.l d1,a1 ;pdest += screenwidth
lea 0(a0,d2.l*2),a0 ;pz += d_zwidth
dbra d0,.one_loop ;count--
bra.w .exit
.two ;case 2
lsl d3,d0
subq #1,d0
.two_loop
cmp (a0),d5 ;if (pz[0] <= izi)
blt.b .two_2
move d5,(a0) ;pz[0] = izi
move.b d4,(a1) ;pdest[0] = pparticle->color
.two_2
cmp 2(a0),d5 ;if (pz[1] <= izi)
blt.b .two_next
move d5,2(a0) ;pz[1] = izi
move.b d4,1(a1) ;pdest[1] = pparticle->color
.two_next
add.l d1,a1 ;pdest += screenwidth
lea 0(a0,d2.l*2),a0 ;pz += d_zwidth
dbra d0,.two_loop ;count--
bra.w .exit
.three ;case3
lsl d3,d0
subq #1,d0
.three_loop
cmp (a0),d5 ;if (pz[0] <= izi)
blt.b .three_2
move d5,(a0) ;pz[0] = izi
move.b d4,(a1) ;pdest[0] = pparticle->color
.three_2
cmp 2(a0),d5 ;if (pz[1] <= izi)
blt.b .three_3
move d5,2(a0) ;pz[1] = izi
move.b d4,1(a1) ;pdest[1] = pparticle->color
.three_3
cmp 4(a0),d5 ;if (pz[2] <= izi)
blt.b .three_next
move d5,4(a0) ;pz[2] = izi
move.b d4,2(a1) ;pdest[2] = pparticle->color
.three_next
add.l d1,a1 ;pdest += screenwidth
lea 0(a0,d2.l*2),a0 ;pz += d_zwidth
dbra d0,.three_loop ;count--
bra.b .exit
.four ;case4
lsl d3,d0
subq #1,d0
.four_loop
cmp (a0),d5 ;if (pz[0] <= izi)
blt.b .four_2
move d5,(a0) ;pz[0] = izi
move.b d4,(a1) ;pdest[0] = pparticle->color
.four_2
cmp 2(a0),d5 ;if (pz[1] <= izi)
blt.b .four_3
move d5,2(a0) ;pz[1] = izi
move.b d4,1(a1) ;pdest[1] = pparticle->color
.four_3
cmp 4(a0),d5 ;if (pz[2] <= izi)
blt.b .four_4
move d5,4(a0) ;pz[2] = izi
move.b d4,2(a1) ;pdest[2] = pparticle->color
.four_4
cmp 6(a0),d5 ;if (pz[3] <= izi)
blt.b .four_next
move d5,6(a0) ;pz[3] = izi
move.b d4,3(a1) ;pdest[3] = pparticle->color
.four_next
add.l d1,a1 ;pdest += screenwidth
lea 0(a0,d2.l*2),a0 ;pz += d_zwidth
dbra d0,.four_loop ;count--
bra.b .exit
.more
move d0,d6
subq #1,d6
lsl d3,d0
subq #1,d0
.more_loop
move.l a0,a2
move.l a1,a3
move d6,d7
.more_loop2
addq.l #1,a3
cmp (a2)+,d5 ;if (pz[i] <= izi)
blt.b .more_next
move d5,-2(a2) ;pz[i] = izi
move.b d4,-1(a3) ;pdest[i] = pparticle->color
.more_next
dbra d7,.more_loop2
add.l d1,a1 ;pdest += screenwidth
lea 0(a0,d2.l*2),a0 ;pz += d_zwidth
dbra d0,.more_loop
.exit
fmovem.x (sp)+,fp2-fp5
movem.l (sp)+,d2-d7/a2/a3
rts