home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 113
/
EnigmaAmiga113CD.iso
/
software
/
sviluppo
/
quake_src
/
r_aclip68k.s
< prev
next >
Wrap
Text File
|
2000-06-17
|
13KB
|
596 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
** r_aclip.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
**
XREF _r_refdef
XDEF _R_Alias_clip_left
XDEF _R_Alias_clip_right
XDEF _R_Alias_clip_top
XDEF _R_Alias_clip_bottom
XDEF _R_AliasClip
ALIAS_LEFT_CLIP = 1
ALIAS_TOP_CLIP = 2
ALIAS_RIGHT_CLIP = 4
ALIAS_BOTTOM_CLIP = 8
FV_V = 0
FV_FLAGS = 24
FV_RESERVED = 28
FV_SIZEOF = 32
FV_SIZEOF_EXP = 5
REFDEF_VRECT = 0
REFDEF_ALIASVRECT = 20
REFDEF_VRECTRIGHT = 40
REFDEF_VRECTBOTTOM = 44
REFDEF_ALIASVRECTRIGHT = 48
REFDEF_ALIASVRECTBOTTOM = 52
VRECT_X = 0
VRECT_Y = 4
VRECT_WIDTH = 8
VRECT_HEIGHT = 12
VRECT_PNEXT = 16
fpu
******************************************************************************
*
* void _R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
* finalvert_t *out)
*
******************************************************************************
cnop 0,4
_R_Alias_clip_left
***** stackframe
rsreset
.fpuregs rs.x 2
.intregs rs.l 5
rs.l 1
.pfv0 rs.l 1
.pfv1 rs.l 1
.out rs.l 1
movem.l d2-d4/a2/a3,-(sp)
fmovem.x fp2/fp3,-(sp)
move.l .pfv0(sp),a0
move.l .pfv1(sp),a1
move.l .out(sp),a2
lea _r_refdef,a3
fmove.s #0.5,fp2
move.l (a0)+,d2
move.l (a0)+,d3
move.l (a1)+,d0
move.l (a1)+,d1
move.l REFDEF_ALIASVRECT+VRECT_X(a3),d4
cmp.l d1,d3
blt.b .cont
sub.l d2,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d0,d4
sub.l d2,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d0
add.l d2,d0
move.l d0,(a2)+
moveq #5-1,d2
bra.b .entry
.loop
move.l (a0)+,d3
move.l (a1)+,d1
.entry
sub.l d3,d1
fmove.l d1,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d1
add.l d3,d1
move.l d1,(a2)+
dbra d2,.loop
bra.b .exit
.cont
sub.l d0,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d2,d4
sub.l d0,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d2
add.l d0,d2
move.l d2,(a2)+
moveq #5-1,d2
bra.b .entry2
.loop2
move.l (a0)+,d3
move.l (a1)+,d1
.entry2
sub.l d1,d3
fmove.l d3,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d3
add.l d1,d3
move.l d3,(a2)+
dbra d2,.loop2
.exit
fmovem.x (sp)+,fp2/fp3
movem.l (sp)+,d2-d4/a2/a3
rts
******************************************************************************
*
* void _R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
* finalvert_t *out)
*
******************************************************************************
cnop 0,4
_R_Alias_clip_right
***** stackframe
rsreset
.fpuregs rs.x 2
.intregs rs.l 5
rs.l 1
.pfv0 rs.l 1
.pfv1 rs.l 1
.out rs.l 1
movem.l d2-d4/a2/a3,-(sp)
fmovem.x fp2/fp3,-(sp)
move.l .pfv0(sp),a0
move.l .pfv1(sp),a1
move.l .out(sp),a2
lea _r_refdef,a3
fmove.s #0.5,fp2
move.l (a0)+,d2
move.l (a0)+,d3
move.l (a1)+,d0
move.l (a1)+,d1
move.l REFDEF_ALIASVRECTRIGHT(a3),d4
cmp.l d1,d3
blt.b .cont
sub.l d2,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d0,d4
sub.l d2,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d0
add.l d2,d0
move.l d0,(a2)+
moveq #5-1,d2
bra.b .entry
.loop
move.l (a0)+,d3
move.l (a1)+,d1
.entry
sub.l d3,d1
fmove.l d1,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d1
add.l d3,d1
move.l d1,(a2)+
dbra d2,.loop
bra.b .exit
.cont
sub.l d0,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d2,d4
sub.l d0,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d2
add.l d0,d2
move.l d2,(a2)+
moveq #5-1,d2
bra.b .entry2
.loop2
move.l (a0)+,d3
move.l (a1)+,d1
.entry2
sub.l d1,d3
fmove.l d3,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d3
add.l d1,d3
move.l d3,(a2)+
dbra d2,.loop2
.exit
fmovem.x (sp)+,fp2/fp3
movem.l (sp)+,d2-d4/a2/a3
rts
******************************************************************************
*
* void _R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1,
* finalvert_t *out)
*
******************************************************************************
cnop 0,4
_R_Alias_clip_top
***** stackframe
rsreset
.fpuregs rs.x 2
.intregs rs.l 5
rs.l 1
.pfv0 rs.l 1
.pfv1 rs.l 1
.out rs.l 1
movem.l d2-d4/a2/a3,-(sp)
fmovem.x fp2/fp3,-(sp)
move.l .pfv0(sp),a0
move.l .pfv1(sp),a1
move.l .out(sp),a2
lea _r_refdef,a3
fmove.s #0.5,fp2
move.l (a0)+,d2
move.l (a0)+,d3
move.l (a1)+,d0
move.l (a1)+,d1
move.l REFDEF_ALIASVRECT+VRECT_Y(a3),d4
cmp.l d1,d3
blt.b .cont
sub.l d3,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d1,d4
sub.l d3,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d1
add.l d3,d1
move.l d1,(a2)+
moveq #5-1,d3
bra.b .entry
.loop
move.l (a0)+,d2
move.l (a1)+,d0
.entry
sub.l d2,d0
fmove.l d0,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d0
add.l d2,d0
move.l d0,(a2)+
dbra d3,.loop
bra.b .exit
.cont
sub.l d1,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d3,d4
sub.l d1,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d3
add.l d1,d3
move.l d3,(a2)+
moveq #5-1,d3
bra.b .entry2
.loop2
move.l (a0)+,d2
move.l (a1)+,d0
.entry2
sub.l d0,d2
fmove.l d2,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d2
add.l d0,d2
move.l d2,(a2)+
dbra d3,.loop2
.exit
move.l -24(a2),d0
move.l -20(a2),-24(a2)
move.l d0,-20(a2)
fmovem.x (sp)+,fp2/fp3
movem.l (sp)+,d2-d4/a2/a3
rts
******************************************************************************
*
* void _R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
* finalvert_t *out)
*
******************************************************************************
cnop 0,4
_R_Alias_clip_bottom
***** stackframe
rsreset
.fpuregs rs.x 2
.intregs rs.l 5
rs.l 1
.pfv0 rs.l 1
.pfv1 rs.l 1
.out rs.l 1
movem.l d2-d4/a2/a3,-(sp)
fmovem.x fp2/fp3,-(sp)
move.l .pfv0(sp),a0
move.l .pfv1(sp),a1
move.l .out(sp),a2
lea _r_refdef,a3
fmove.s #0.5,fp2
move.l (a0)+,d2
move.l (a0)+,d3
move.l (a1)+,d0
move.l (a1)+,d1
move.l REFDEF_ALIASVRECTBOTTOM(a3),d4
cmp.l d1,d3
blt.b .cont
sub.l d3,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d1,d4
sub.l d3,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d1
add.l d3,d1
move.l d1,(a2)+
moveq #5-1,d3
bra.b .entry
.loop
move.l (a0)+,d2
move.l (a1)+,d0
.entry
sub.l d2,d0
fmove.l d0,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d0
add.l d2,d0
move.l d0,(a2)+
dbra d3,.loop
bra.b .exit
.cont
sub.l d1,d4
fmove.l d4,fp0
fmove fp0,fp3
fadd fp2,fp3
move.l d3,d4
sub.l d1,d4
fmove.l d4,fp1
fdiv fp1,fp0
fmove.l fp3,d3
add.l d1,d3
move.l d3,(a2)+
moveq #5-1,d3
bra.b .entry2
.loop2
move.l (a0)+,d2
move.l (a1)+,d0
.entry2
sub.l d0,d2
fmove.l d2,fp1
fmul fp0,fp1
fadd fp2,fp1
fmove.l fp1,d2
add.l d0,d2
move.l d2,(a2)+
dbra d3,.loop2
.exit
move.l -24(a2),d0
move.l -20(a2),-24(a2)
move.l d0,-20(a2)
fmovem.x (sp)+,fp2/fp3
movem.l (sp)+,d2-d4/a2/a3
rts
******************************************************************************
*
* int _R_AliasClip (finalvert_t *in, finalvert_t *out, int flag,
* int count, void(*clip)(...)
*
******************************************************************************
cnop 0,4
_R_AliasClip
***** stackframe
rsreset
.intregs rs.l 11
rs.l 1
.in rs.l 1
.out rs.l 1
.flag rs.l 1
.count rs.l 1
.clip rs.l 1
movem.l d2-d7/a2-a6,-(sp)
move.l .in(sp),a2
move.l .out(sp),a3
move.l .flag(sp),d2
move.l .count(sp),d3
move.l .clip(sp),a4
* j = count-1;
* k = 0;
* for (i=0 ; i<count ; j = i, i++)
* {
move.l d3,d5
subq.l #1,d5
bmi.w .skip
move.l d5,d0 ;j = count-1
asl.l #FV_SIZEOF_EXP,d0
lea 0(a2,d0.l),a6 ;a6 = in[j]
lea _r_refdef,a5
move.l REFDEF_ALIASVRECT+VRECT_X(a5),d3
move.l REFDEF_ALIASVRECT+VRECT_Y(a5),d4
move.l REFDEF_ALIASVRECTRIGHT(a5),d6
move.l REFDEF_ALIASVRECTBOTTOM(a5),d7
move.l a2,a5
* oldflags = in[j].flags & flag;
* flags = in[i].flags & flag;
* if (flags && oldflags)
* continue;
.loop
move.l FV_FLAGS(a6),d0
and.l d2,d0 ;oldflags = in[j].flags & flag
move.l FV_FLAGS(a2),d1
and.l d2,d1 ;flags = in[i].flags & flag
beq.b .do
tst.l d0
bne.w .next
.do
* if (oldflags ^ flags)
* {
* clip (&in[j], &in[i], &out[k]);
* out[k].flags = 0;
* if (out[k].v[0] < r_refdef.aliasvrect.x)
* out[k].flags |= ALIAS_LEFT_CLIP;
* if (out[k].v[1] < r_refdef.aliasvrect.y)
* out[k].flags |= ALIAS_TOP_CLIP;
* if (out[k].v[0] > r_refdef.aliasvrectright)
* out[k].flags |= ALIAS_RIGHT_CLIP;
* if (out[k].v[1] > r_refdef.aliasvrectbottom)
* out[k].flags |= ALIAS_BOTTOM_CLIP;
* k++;
* }
eor.l d1,d0 ;if (oldflags ^ flags)
beq.b .cont
move.l d1,-(sp)
move.l a3,-(sp)
move.l a2,-(sp)
move.l a6,-(sp)
jsr (a4) ;clip (&in[j], &in[i], &out[k])
add #12,sp
moveq #0,d1 ;out[k].flags = 0
move.l (a3),d0 ;if (out[k].v[0] < ...
cmp.l d3,d0
bge.b .1
or.l #ALIAS_LEFT_CLIP,d1 ;out[k].flags |= ALIAS_LEFT_CLIP
.1
cmp.l d6,d0 ;if (out[k].v[0] > ...
ble.b .2
or.l #ALIAS_RIGHT_CLIP,d1 ;out[k].flags |= ALIAS_RIGHT_CLIP
.2
move.l 4(a3),d0 ;if (out[k].v[1] < ...
cmp.l d4,d0
bge.b .3
or.l #ALIAS_TOP_CLIP,d1 ;out[k].flags |= ALIAS_TOP_CLIP
.3
cmp.l d7,d0 ;if (out[k].v[1] > ...
ble.b .4
or.l #ALIAS_BOTTOM_CLIP,d1 ;out[k].flags |= ALIAS_BOTTOM_CLIP
.4
move.l d1,FV_FLAGS(a3)
lea FV_SIZEOF(a3),a3 ;k++
move.l (sp)+,d1
* if (!flags)
* {
* out[k] = in[i];
* k++;
* }
.cont
tst.l d1 ;if (!flags)
bne.b .next
move.l (a2)+,(a3)+ ;out[k] = in[i]
move.l (a2)+,(a3)+
move.l (a2)+,(a3)+
move.l (a2)+,(a3)+
move.l (a2)+,(a3)+
move.l (a2)+,(a3)+
move.l (a2)+,(a3)+
addq #4,a3
sub #28,a2
.next
move.l a5,a6
lea FV_SIZEOF(a5),a5
lea FV_SIZEOF(a2),a2
dbra d5,.loop
* return k;
.skip
move.l a3,d0
sub.l .out(sp),d0
asr.l #FV_SIZEOF_EXP,d0
movem.l (sp)+,d2-d7/a2-a6
rts