home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 113
/
EnigmaAmiga113CD.iso
/
software
/
sviluppo
/
quake_src
/
d_polyset68k.s
< prev
next >
Wrap
Text File
|
2000-06-17
|
56KB
|
1,974 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_polyset.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
**
XREF _acolormap
XREF _d_aspancount
XREF _errorterm
XREF _erroradjustup
XREF _erroradjustdown
XREF _d_countextrastep
XREF _ubasestep
XREF _r_affinetridesc
XREF _a_ststepxwhole
XREF _a_sstepxfrac
XREF _a_tstepxfrac
XREF _r_lstepx
XREF _r_lstepy
XREF _r_sstepx
XREF _r_sstepy
XREF _r_tstepx
XREF _r_tstepy
XREF _r_zistepx
XREF _r_zistepy
XREF _zspantable
XREF _skintable
XREF _r_p0
XREF _r_p1
XREF _r_p2
XREF _d_xdenom
XREF _d_pcolormap
XREF _d_scantable
XREF _d_viewbuffer
XREF _d_pedgespanpackage
XREF _d_pdest
XREF _d_pz
XREF _d_aspancount
XREF _d_ptex
XREF _d_sfrac
XREF _d_tfrac
XREF _d_light
XREF _d_zi
XREF _d_pdestextrastep
XREF _d_pzextrastep
XREF _d_countextrastep
XREF _d_ptexextrastep
XREF _d_sfracextrastep
XREF _d_tfracextrastep
XREF _d_lightextrastep
XREF _d_ziextrastep
XREF _d_pdestbasestep
XREF _d_pzbasestep
XREF _d_ptexbasestep
XREF _d_sfracbasestep
XREF _d_tfracbasestep
XREF _d_lightbasestep
XREF _d_zibasestep
XREF _d_zwidth
XREF _d_pzbuffer
XREF _a_spans
XREF _pedgetable
XREF _edgetables
XREF _screenwidth
XREF _FloorDivMod
XDEF _D_DrawNonSubdiv
XDEF _D_PolysetRecursiveTriangle
XDEF _D_RasterizeAliasPolySmooth
ALIAS_ONSEAM = $20 ;must match the def. in r_shared.h
PSPANP_PDEST = 0
PSPANP_PZ = 4
PSPANP_COUNT = 8
PSPANP_PTEX = 12
PSPANP_SFRAC = 16
PSPANP_TFRAC = 20
PSPANP_LIGHT = 24
PSPANP_ZI = 28
PSPANP_SIZEOF = 32
PSPANP_SIZEOF_EXP = 5
R_PSKIN = 0
R_PSKINDESC = 4
R_SKINWIDTH = 8
R_SKINHEIGHT = 12
R_PTRIANGLES = 16
R_PFINALVERTS = 20
R_NUMTRIANGLES = 24
R_DRAWTYPE = 28
R_SEAMFIXUP16 = 32
R_SIZEOF = 36
PTEMP_QUOTIENT = 0
PTEMP_REMAINDER = 4
ETAB_ISFLATTOP = 0
ETAB_NUMLEFTEDGES = 4
ETAB_PLEV0 = 8
ETAB_PLEV1 = 12
ETAB_PLEV2 = 16
ETAB_NUMRIGHTEDGES = 20
ETAB_PREV0 = 24
ETAB_PREV1 = 28
ETAB_PREV2 = 32
ETAB_SIZEOF = 36
MT_FACESFRONT = 0
MT_VERTINDEX = 4
MT_SIZEOF = 16
FV_V = 0
FV_FLAGS = 24
FV_RESERVED = 28
FV_SIZEOF = 32
FV_SIZEOF_EXP = 5
EDGETABLE_SIZEOF = 36
******************************************************************************
*
* void D_PolysetDrawSpans8 (spanpackage_t *pspanpackage)
*
* standard scan drawing function for alias models
*
******************************************************************************
cnop 0,4
_D_PolysetDrawSpans8
***** stackframe
rsreset
.intregs rs.l 11
rs.l 1
.pspan rs.l 1
****** prologue
movem.l d2-d7/a2-a6,-(sp)
move.l .pspan(sp),a0
move.l _d_aspancount,d0
move.l _errorterm,d1
move.l _erroradjustup,d2
move.l _erroradjustdown,d3
move.l _d_countextrastep,a1
move.l _ubasestep,d5
move.l _acolormap,a3
move.l _r_zistepx,d4
move.l _a_ststepxwhole,a5
move.l _a_sstepxfrac,a4
move.l _a_tstepxfrac,d6
swap d6
move.l _r_lstepx,a6
move.l _r_affinetridesc+R_SKINWIDTH,d7
move d7,d6
.loop
* lcount = d_aspancount - pspanpackage->count;
*
* errorterm += erroradjustup;
* if (errorterm >= 0)
* {
* d_aspancount += d_countextrastep;
* errorterm -= erroradjustdown;
* }
* else
* {
* d_aspancount += ubasestep;
* }
move.l d0,d7
sub.l PSPANP_COUNT(a0),d7 ;lcount = d_aspancount-pspa...
add.l d2,d1 ;errorterm += erroradjustup
blt.b .else ;if (errorterm >= 0)
add.l a1,d0 ;d_aspancount += d_countextrastep
sub.l d3,d1 ;errorterm -= error adjustdown
bra.b .next
.else
add.l d5,d0 ;d_aspancount += ubasestep
.next
subq.l #1,d7
blt.b .loopend
* lpdest = pspanpackage->pdest;
* lptex = pspanpackage->ptex;
* lpz = pspanpackage->pz;
* lsfrac = pspanpackage->sfrac;
* ltfrac = pspanpackage->tfrac;
* llight = pspanpackage->light;
* lzi = pspanpackage->zi;
movem.l d0-d3/d5/a0/a1,-(sp)
move.l (a0)+,d2 ;lpdest = pspanpackage->dest
move.l (a0)+,a1 ;lpz = pspanpackage->pz
addq.l #4,a0
move.l (a0)+,a2 ;lptex = pspanpackage->ptex
move.l (a0)+,d3 ;lsfrac = pspanpackage->sfrac
move.l (a0)+,d5 ;tsfrac = pspanpackage->tfrac
swap d5
move.l (a0)+,d1 ;llight = pspanpackage->light
move.l (a0)+,d0 ;lzi = pspanpackage->zi
move.l d2,a0
moveq #0,d2
****** main drawing loop
****** d0 = lzi
****** d1 = llight
****** d3 = lsfrac
****** d4 = r_zistepx
****** d5 = ltfrac
****** d6 = a_tstepxfrac [high] and r_affinetridesc.skinwidth [low]
****** d7 = lcount-1
****** a0 -> lpdest
****** a1 -> lpz
****** a2 -> lptex
****** a3 -> acolormap
****** a4 = a_sstepxfrac
****** a5 = a_ststepxwhole
****** a6 = r_lstepx
* do
* {
* if ((lzi >> 16) >= *lpz)
* {
* *lpdest = ((byte *)acolormap)[*lptex + (llight & 0xFF00)];
* *lpz = lzi >> 16;
* }
* lpdest++;
* lzi += r_zistepx;
* lpz++;
* llight += r_lstepx;
* lptex += a_ststepxwhole;
* lsfrac += a_sstepxfrac;
* lptex += lsfrac >> 16;
* lsfrac &= 0xFFFF;
* ltfrac += a_tstepxfrac;
* if (ltfrac & 0x10000)
* {
* lptex += r_affinetridesc.skinwidth;
* ltfrac &= 0xFFFF;
* }
* } while (--lcount);
.loop2
swap d0
cmp (a1)+,d0 ;if ((lzi >> 16) >= *lpz)
blt.b .cont
move d1,d2
move.b (a2),d2 ;d3 = *lptex + (llight & $ff00)
move.b 0(a3,d2.l),(a0) ;*lpdest = ((byte *)acolormap[d2]
move d0,-2(a1) ;*lpz = lzi >> 16
.cont
addq.l #1,a0 ;lpdest++
swap d0
add.l d4,d0 ;lzi += r_zistepx
add.l a6,d1 ;llight += r_lstepx
add.l a5,a2 ;lptex += a_ststepxwhole
add.l a4,d3 ;lsfrac += a_sstepxfrac
swap d3
add d3,a2 ;lptex += lsfrac >> 16
clr d3
swap d3 ;lsfrac &= $ffff
add.l d6,d5 ;ltfrac += a_tstepxfrac
bcc.b .cont2 ;if (ltfrac & $10000)
add d6,a2 ;lptex += r_affine...
.cont2
dbra d7,.loop2 ;while (--lcount)
movem.l (sp)+,d0-d3/d5/a0/a1
.loopend
* pspanpackage++;
* } while (pspanpackage->count != -999999);
lea PSPANP_SIZEOF(a0),a0 ;pspanpackage++
cmp.l #-999999,PSPANP_COUNT(a0) ; while (pspanpackage->count...)
bne.b .loop
movem.l (sp)+,d2-d7/a2-a6
rts
******************************************************************************
*
* void D_PolysetRecursiveTriangle (int *lp1, int *lp2, int *lp3)
*
******************************************************************************
cnop 0,4
_D_PolysetRecursiveTriangle
***** stackframe
rsreset
.new rs.l 6
.intregs rs.l 11
rs.l 1
.lp1 rs.l 1
.lp2 rs.l 1
.lp3 rs.l 1
movem.l d2-d7/a2-a6,-(sp)
sub.l #.intregs,sp
move.l .lp1(sp),a0
move.l .lp2(sp),a1
move.l .lp3(sp),a2
lea _zspantable,a5
move.l _d_viewbuffer,a6
bsr DoRecursion
add.l #.intregs,sp
movem.l (sp)+,d2-d7/a2-a6
rts
****** a0 -> lp1
****** a1 -> lp2
****** a2 -> lp3
DoRecursion
lea -6*4(sp),sp
move.l sp,a4
* d = lp2[0] - lp1[0];
* if (d < -1 || d > 1)
* goto split;
* d = lp2[1] - lp1[1];
* if (d < -1 || d > 1)
* goto split;
*
* d = lp3[0] - lp2[0];
* if (d < -1 || d > 1)
* goto split2;
* d = lp3[1] - lp2[1];
* if (d < -1 || d > 1)
* goto split2;
*
* d = lp1[0] - lp3[0];
* if (d < -1 || d > 1)
* goto split3;
* d = lp1[1] - lp3[1];
* if (d < -1 || d > 1)
move.l (a1),d0
move.l (a0),d1
move.l 1*4(a1),d2
move.l 1*4(a0),d3
move.l d0,d4
sub.l d1,d4 ;d = lp2[0] - lp1[0]
addq.l #1,d4
cmp.l #2,d4 ;if (d < -1 || d > 1)
bhi.b .split ;goto split
move.l d2,d5
sub.l d3,d5 ;d = lp2[1] - lp1[1]
addq.l #1,d5
cmp.l #2,d5 ;if (d < -1 || d > 1)
bhi.b .split ;goto split
move.l (a2),d4
move.l d4,d5
sub.l d0,d4 ;d = lp3[0] - lp2[0]
addq.l #1,d4
cmp.l #2,d4 ;if (d < -1 || d > 1)
bhi.b .split2 ;goto split2
move.l 1*4(a2),d4
move.l d4,d6
sub.l d2,d4 ;d = lp3[1] - lp2[1]
addq.l #1,d4
cmp.l #2,d4 ;if (d < -1 || d > 1)
bhi.b .split2 ;goto split2
sub.l d1,d5 ;d = lp1[0] - lp3[0]
addq.l #1,d5
cmp.l #2,d5 ;if (d < -1 || d > 1)
bhi.b .split3 ;goto split3
sub.l d3,d6 ;d = lp1[1] - lp3[1]
addq.l #1,d6
cmp.l #2,d6 ;if (d < -1 || d > 1)
bls.b .exit
*split3:
* temp = lp1;
* lp1 = lp3;
* lp3 = lp2;
* lp2 = temp;
*
* goto split;
*
*split2:
* temp = lp1;
* lp1 = lp2;
* lp2 = lp3;
* lp3 = temp;
.split3
exg a1,a2 ;rotate forward
exg a1,a0
move.l (a1),d0
move.l (a0),d1
move.l 1*4(a1),d2
move.l 1*4(a0),d3
bra.b .split
.split2
exg a1,a0 ;rotate backward
exg a1,a2
move.l (a1),d0
move.l (a0),d1
move.l 1*4(a1),d2
move.l 1*4(a0),d3
.split
* new[0] = (lp1[0] + lp2[0]) >> 1;
* new[1] = (lp1[1] + lp2[1]) >> 1;
* new[2] = (lp1[2] + lp2[2]) >> 1;
* new[3] = (lp1[3] + lp2[3]) >> 1;
* new[5] = (lp1[5] + lp2[5]) >> 1;
move.l d0,d4
move.l d0,a3
add.l d1,d4
asr.l #1,d4 ;d4 = new[0]
move.l d2,d5
add.l d3,d5
asr.l #1,d5 ;d5 = new[1]
move.l 2*4(a0),d6
add.l 2*4(a1),d6
asr.l #1,d6 ;d6 = new[2]
move.l 3*4(a0),d7
add.l 3*4(a1),d7
asr.l #1,d7 ;d7 = new[3]
move.l 5*4(a0),d0
add.l 5*4(a1),d0
asr.l #1,d0 ;d0 = new[5]
* if (lp2[1] > lp1[1])
* goto nodraw;
* if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
* goto nodraw;
move.l d4,(a4)+ ;store new[]
move.l d5,(a4)+
move.l d6,(a4)+
move.l d7,(a4)+
move.l d0,4(a4)
lea -16(a4),a4
swap d0 ;z = new[5]>>16
cmp.l d3,d2 ;if (lp2[1] > lp1[1])
bgt.b .nodraw ;goto nodraw
cmp.l d2,d3 ;if (lp2[1] == lp1[1)
bne.b .draw
cmp.l d1,a3 ;&& (lp2[0] < lp1[0])
blt.b .nodraw ;goto nodraw
.draw
* z = new[5]>>16;
* zbuf = zspantable[new[1]] + new[0];
* if (z >= *zbuf)
* {
* int pix;
*
* *zbuf = z;
* pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
* d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
* }
move.l 0(a5,d5.l*4),a3
cmp 0(a3,d4.l*2),d0 ;if (z >= *zbuf)
blt.b .nodraw
move d0,0(a3,d4.l*2) ;*zbuf = z
swap d6
swap d7
lea _skintable,a3
move.l 0(a3,d7.w*4),a3 ;skintable[new[3]]
move.b 0(a3,d6.w),d2 ;d2 = skintable[new[3]][new[2]>>16]
and #$ff,d2
move.l _d_pcolormap,a3
move.b 0(a3,d2.w),d2 ;pix = d_pcolormap[d2]
lea _d_scantable,a3
move.l 0(a3,d5.l*4),d1 ;d_scantable[new[1]]
add.l d4,d1 ;+new[0]
move.b d2,0(a6,d1.l) ;d_viewbuffer[d1] = pix
.nodraw
*// recursively continue
* D_PolysetRecursiveTriangle (lp3, lp1, new);
* D_PolysetRecursiveTriangle (lp3, new, lp2);
movem.l a1/a2/a4,-(sp)
move.l a0,a1
move.l a2,a0
move.l a4,a2
bsr DoRecursion ;DRT (lp3, lp1, new)
movem.l (sp)+,a1/a2/a4
move.l a2,a0
move.l a1,a2
move.l a4,a1
bsr DoRecursion ;DRT (lp3, new, lp2)
.exit
lea 6*4(sp),sp
rts
******************************************************************************
*
* void D_PolysetSetUpForLineScan (fixed8_t startvertu,
* fixed8_t startvertv, fixed8_t endvertu, fixed8_t endvertv)
*
* Parameters are transferred in registers d0-d3
******************************************************************************
cnop 0,4
_D_PolysetSetUpForLineScan
***** stackframe
rsreset
.intregs rs.l 2
rs.l 1
.startvertu rs.l 1
.startvertv rs.l 1
.endvertu rs.l 1
.endvertv rs.l 1
* errorterm = -1;
*
* tm = endvertu - startvertu;
* tn = endvertv - startvertv;
move.l #-1,_errorterm
sub.l d0,d2
sub.l d1,d3
add.l #15,d2
add.l #15,d3
* if (((tm <= 16) && (tm >= -15)) &&
* ((tn <= 16) && (tn >= -15)))
* {
* ptemp = &adivtab[((tm+15) << 5) + (tn+15)];
* ubasestep = ptemp->quotient;
* erroradjustup = ptemp->remainder;
* erroradjustdown = tn;
* }
cmp.l #31,d2
bhi.b .else
cmp.l #31,d3
bhi.b .else
lea _adivtab,a0
lsl.l #5,d2
add.l d3,d2
lea 0(a0,d2.l*8),a0
move.l PTEMP_QUOTIENT(a0),_ubasestep
move.l PTEMP_REMAINDER(a0),_erroradjustup
sub.l #15,d3
move.l d3,_erroradjustdown
bra.b .exit
* {
* dm = (double)tm;
* dn = (double)tn;
*
* FloorDivMod (dm, dn, &ubasestep, &erroradjustup);
*
* erroradjustdown = dn;
* }
.else
sub.l #15,d2
sub.l #15,d3
fmove.l d2,fp0
fmove.l d3,fp1
move.l #_erroradjustup,-(sp)
move.l #_ubasestep,-(sp)
fmove.d fp1,-(sp)
fmove.d fp0,-(sp)
jsr _FloorDivMod
add #24,sp
move.l d3,_erroradjustdown
.exit
rts
*****************************************************************************
*
* void D_PolysetCalcGradients (int skinwidth)
*
******************************************************************************
cnop 0,4
_D_PolysetCalcGradients
***** stackframe
rsreset
.fpuregs rs.x 6
.intregs rs.l 3
rs.l 1
.skinwidth rs.l 1
***** prologue
movem.l d2/d3/a2,-(sp)
fmovem.x fp2-fp7,-(sp)
* p00_minus_p20 = r_p0[0] - r_p2[0];
* p01_minus_p21 = r_p0[1] - r_p2[1];
* p10_minus_p20 = r_p1[0] - r_p2[0];
* p11_minus_p21 = r_p1[1] - r_p2[1];
*
* xstepdenominv = 1.0 / (float)d_xdenom;
*
* ystepdenominv = -xstepdenominv;
lea _r_p2,a0
lea _r_p1,a1
lea _r_p0,a2
move.l (a2),d0
move.l 1*4(a2),d1
move.l (a0),d2
sub.l d2,d0
fmove.l d0,fp0 ;fp0 = p00_minus_p20
move.l 1*4(a0),d3
sub.l d3,d1
fmove.l d1,fp1 ;fp1 = p01_minus_p21
sub.l (a1),d2
neg.l d2
fmove.l d2,fp2 ;fp2 = p10_minus_p20
sub.l 4(a1),d3
neg.l d3
fmove.l d3,fp3 ;fp3 = p11_minus_p21
fmove.l _d_xdenom,fp4
fmove.s #1,fp5
fdiv fp4,fp5 ;fp5 = 1.0 / (float)d_xdenom
fneg fp5,fp6 ;fp6 = ystepdenominv
fmul fp5,fp1
fmul fp5,fp3
fmul fp6,fp0
fmul fp6,fp2
* t0 = r_p0[4] - r_p2[4];
* t1 = r_p1[4] - r_p2[4];
* r_lstepx = (int)
* ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
* r_lstepy = (int)
* ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
fmove.l fpcr,d2
fmove.l #$000000b0,fpcr
move.l 4*4(a0),d0
move.l d0,d1
sub.l 4*4(a2),d0
neg.l d0
fmove.l d0,fp4 ;fp4 = t0
sub.l 4*4(a1),d1
neg.l d1
fmove.l d1,fp5 ;fp5 = t1
fmove fp4,fp6
fmul fp3,fp6
fmove fp5,fp7
fmul fp1,fp7
fsub fp6,fp7
fmove.l fp7,_r_lstepx
fmul fp2,fp4
fmul fp0,fp5
fsub fp4,fp5
fmove.l fp5,_r_lstepy
fmove.l d2,fpcr
* t0 = r_p0[2] - r_p2[2];
* t1 = r_p1[2] - r_p2[2];
* r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
* xstepdenominv);
* r_sstepy = (int)((t1 * p00_minus_p20 - t0* p10_minus_p20) *
* ystepdenominv);
move.l 2*4(a0),d0
move.l d0,d1
sub.l 2*4(a2),d0
neg.l d0
fmove.l d0,fp4 ;fp4 = t0
sub.l 2*4(a1),d1
neg.l d1
fmove.l d1,fp5 ;fp5 = t1
fmove fp4,fp6
fmul fp3,fp6
fmove fp5,fp7
fmul fp1,fp7
fsub fp6,fp7
fmove.l fp7,d2
move.l d2,_r_sstepx
fmul fp2,fp4
fmul fp0,fp5
fsub fp4,fp5
fmove.l fp5,_r_sstepy
* t0 = r_p0[3] - r_p2[3];
* t1 = r_p1[3] - r_p2[3];
* r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
* xstepdenominv);
* r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
* ystepdenominv);
move.l 3*4(a0),d0
move.l d0,d1
sub.l 3*4(a2),d0
neg.l d0
fmove.l d0,fp4 ;fp4 = t0
sub.l 3*4(a1),d1
neg.l d1
fmove.l d1,fp5 ;fp5 = t1
fmove fp4,fp6
fmul fp3,fp6
fmove fp5,fp7
fmul fp1,fp7
fsub fp6,fp7
fmove.l fp7,d3
move.l d3,_r_tstepx
fmul fp2,fp4
fmul fp0,fp5
fsub fp4,fp5
fmove.l fp5,_r_tstepy
* t0 = r_p0[5] - r_p2[5];
* t1 = r_p1[5] - r_p2[5];
* r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
* xstepdenominv);
* r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
* ystepdenominv);
move.l 5*4(a0),d0
move.l d0,d1
sub.l 5*4(a2),d0
neg.l d0
fmove.l d0,fp4 ;fp4 = t0
sub.l 5*4(a1),d1
neg.l d1
fmove.l d1,fp5 ;fp5 = t1
fmove fp4,fp6
fmul fp3,fp6
fmove fp5,fp7
fmul fp1,fp7
fsub fp6,fp7
fmove.l fp7,_r_zistepx
fmul fp2,fp4
fmul fp0,fp5
fsub fp4,fp5
fmove.l fp5,_r_zistepy
* a_sstepxfrac = r_sstepx & 0xFFFF;
* a_tstepxfrac = r_tstepx & 0xFFFF;
* a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16);
move.l .skinwidth(sp),d0
swap d3
muls d3,d0
clr d3
swap d3
move.l d2,d1
swap d1
ext.l d1
add.l d1,d0
and.l #$ffff,d2
move.l d2,_a_sstepxfrac
move.l d3,_a_tstepxfrac
move.l d0,_a_ststepxwhole
fmovem.x (sp)+,fp2-fp7
movem.l (sp)+,d2/d3/a2
rts
******************************************************************************
*
* void D_RasterizeAliasPolySmooth (void)
*
******************************************************************************
cnop 0,4
_D_RasterizeAliasPolySmooth
***** stackframe
rsreset
.pdestx rs.l 1
.pzx rs.l 1
.aspanx rs.l 1
.ptexx rs.l 1
.sfracx rs.l 1
.tfracx rs.l 1
.lightx rs.l 1
.zix rs.l 1
.pdestb rs.l 1
.pzb rs.l 1
.aspanb rs.l 1
.ptexb rs.l 1
.sfracb rs.l 1
.tfracb rs.l 1
.lightb rs.l 1
.zib rs.l 1
.r_affine rs.l 1
.height rs.l 1
.initLH rs.l 1
.initRH rs.l 1
.savearea rs.l 11
.intregs rs.l 11
rs.l 1
movem.l d2-d7/a2-a6,-(sp)
sub #.intregs,sp
* plefttop = pedgetable->pleftedgevert0;
* prighttop = pedgetable->prightedgevert0;
*
* pleftbottom = pedgetable->pleftedgevert1;
* prightbottom = pedgetable->prightedgevert1;
*
* initialleftheight = pleftbottom[1] - plefttop[1];
* initialrightheight = prightbottom[1] - prighttop[1];
move.l _pedgetable,a0
move.l ETAB_PLEV0(a0),a6 ;a6 = plefttop
move.l ETAB_PREV0(a0),a2 ;a2 = prighttop
move.l ETAB_PLEV1(a0),a3 ;a3 = pleftbottom
move.l ETAB_PREV1(a0),a4 ;a4 = prightbottom
lea _r_affinetridesc,a5
move.l 4(a3),d6
move.l 4(a6),d7 ;d7 = plefttop[1]
move.l d6,d2
sub.l d7,d2
move.l d2,.initLH(sp) ;initialleftheight
move.l 4(a4),d3
move.l 4(a2),d4
move.l d3,d5
sub.l d4,d5
move.l d5,.initRH(sp) ;initialrightheight
move.l R_SKINWIDTH(a5),d4
move.l d4,.r_affine(sp)
move.l d4,-(sp)
bsr _D_PolysetCalcGradients
addq #4,sp
move.l d6,d3
move.l (a3),d2
move.l d7,d1
move.l (a6),d0
bsr _D_PolysetSetUpForLineScan
* d_pedgespanpackage = a_spans;
*
* ystart = plefttop[1];
* d_aspancount = plefttop[0] - prighttop[0];
*
* d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
* (plefttop[3] >> 16) * r_affinetridesc.skinwidth;
* d_sfrac = plefttop[2] & 0xFFFF;
* d_tfrac = plefttop[3] & 0xFFFF;
* d_pzbasestep = d_zwidth + ubasestep;
* d_pzextrastep = d_pzbasestep + 1;
* d_light = plefttop[4];
* d_zi = plefttop[5];
*
* d_pdestbasestep = screenwidth + ubasestep;
* d_pdestextrastep = d_pdestbasestep + 1;
* d_pdest = (byte *)d_viewbuffer +
* ystart * screenwidth + plefttop[0];
* d_pz = d_pzbuffer + ystart * d_zwidth + plefttop[0];
move.l _a_spans,_d_pedgespanpackage
move.l (a6),d2
sub.l (a2),d2
move.l d2,_d_aspancount ;d_aspancount = plefttop[0] - ...
move.l 2*4(a6),d0
move.l 3*4(a6),d1
move.l d0,d3 ;d3 = plefttop[2]
move.l d1,d6 ;d6 = plefttop[3]
swap d0
swap d1
and.l #$ffff,d0
and.l #$ffff,d1
mulu d4,d1
add.l d0,d1
add.l R_PSKIN(a5),d1
move.l d1,_d_ptex ;d_ptex = ...
and.l #$ffff,d3
and.l #$ffff,d6
move.l d3,_d_sfrac ;d_sfrac = plefttop[2]&$ffff
move.l d6,_d_tfrac ;d_tfrac = plefttop[3]&$ffff
move.l _d_zwidth,d0
move.l d0,d3 ;d3 = d_zwidth
move.l _ubasestep,d1
move.l d1,.aspanb(sp)
move.l d1,d5 ;d5 = ubasestep
add.l d1,d0
addq.l #1,d1
move.l d1,_d_countextrastep
move.l d1,.aspanx(sp)
add.l d0,d0
move.l d0,.pzb(sp) ;d_pzbasestep = d_zwidth + ubasestep
addq.l #2,d0
move.l d0,.pzx(sp) ;d_pzextrastep = d_pzbasestep + 1
move.l 4*4(a6),_d_light ;d_light = plefttop[4]
move.l 5*4(a6),_d_zi ;d_zi = plefttop[5]
move.l _screenwidth,d0
add.l d0,d1
move.l d1,.pdestx(sp) ;d_pdestextrastep = ...
subq.l #1,d1
move.l d1,.pdestb(sp) ;d_pdestbasestep = screenwidth + ..
mulu d7,d0 ;screenwidth * ystart
move.l (a6),d6
add.l d6,d0 ;+ plefttop[0]
add.l _d_viewbuffer,d0
move.l d0,_d_pdest ;d_pdest + d_viewbuffer + ...
mulu d7,d3 ;d_zwidth * ystart
add.l d6,d3 ;+ plefttop[0]
add.l d3,d3
add.l _d_pzbuffer,d3
move.l d3,_d_pz ;d_pz = d_pzbuffer + ...
* if (ubasestep < 0)
* working_lstepx = r_lstepx - 1;
* else
* working_lstepx = r_lstepx;
*
* d_countextrastep = ubasestep + 1;
* d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> 16) +
* ((r_tstepy + r_tstepx * ubasestep) >> 16) *
* r_affinetridesc.skinwidth;
* d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF;
* d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF;
* d_lightbasestep = r_lstepy + working_lstepx * ubasestep;
* d_zibasestep = r_zistepy + r_zistepx * ubasestep;
*
* d_ptexextrastep = ((r_sstepy + r_sstepx * d_countextrastep) >> 16) +
* ((r_tstepy + r_tstepx * d_countextrastep) >> 16) *
* r_affinetridesc.skinwidth;
* d_sfracextrastep = (r_sstepy + r_sstepx*d_countextrastep) & 0xFFFF;
* d_tfracextrastep = (r_tstepy + r_tstepx*d_countextrastep) & 0xFFFF;
* d_lightextrastep = d_lightbasestep + working_lstepx;
* d_ziextrastep = d_zibasestep + r_zistepx;
*
move.l _r_sstepy,a0
move.l _r_sstepx,d1
move.l _r_tstepy,a1
move.l _r_tstepx,d6
move.l d1,d2
muls.l d5,d2
move.l d6,d7
muls.l d5,d7
add.l a0,d2
add.l a1,d7
move.l d2,d0
move.l d7,d3
and.l #$ffff,d0
move.l d0,.sfracb(sp)
and.l #$ffff,d3
swap d3
move.l d3,.tfracb(sp)
swap d3
add.l d1,d0
add.l d6,d3
and.l #$ffff,d0
move.l d0,.sfracx(sp)
and.l #$ffff,d3
swap d3
move.l d3,.tfracx(sp)
swap d3
move.l d2,d0
move.l d7,d3
swap d2
ext.l d2
swap d7
muls d4,d7
add.l d2,d7
move.l d7,.ptexb(sp)
add.l d1,d0
add.l d6,d3
swap d0
ext.l d0
swap d3
muls d4,d3
add.l d0,d3
move.l d3,.ptexx(sp)
move.l _r_lstepy,d0
move.l _r_lstepx,d1
tst.l d5 ;(if ubasestep < 0)
bge.b .ge
subq.l #1,d1 ;working_lstepx = r_lstepx - 1
.ge
move.l d1,d2
muls.l d5,d1
add.l d0,d1
move.l d1,.lightb(sp)
add.l d2,d1
move.l d1,.lightx(sp)
move.l _r_zistepy,d0
move.l _r_zistepx,d1
move.l d1,d2
muls.l d5,d1
add.l d0,d1
move.l d1,.zib(sp)
add.l d2,d1
move.l d1,.zix(sp)
***** D_PolysetScanLeftEdge (inlined)
movem.l d2-d7/a2-a6,.savearea(sp)
move.l _d_pedgespanpackage,a0
move.l _d_pdest,a1
move.l _d_pz,a2
move.l _d_aspancount,d6
move.l _d_ptex,a3
move.l _d_sfrac,d4
move.l _d_tfrac,d5
swap d5
move.l _d_light,a5
move.l _d_zi,a4
move.l _errorterm,d2
move.l _erroradjustup,d1
move.l _erroradjustdown,d0
move.l .initLH(sp),d7
subq #1,d7
.loopA
* d_pedgespanpackage->pdest = d_pdest;
* d_pedgespanpackage->pz = d_pz;
* d_pedgespanpackage->count = d_aspancount;
* d_pedgespanpackage->ptex = d_ptex;
*
* d_pedgespanpackage->sfrac = d_sfrac;
* d_pedgespanpackage->tfrac = d_tfrac;
*
* d_pedgespanpackage->light = d_light;
* d_pedgespanpackage->zi = d_zi;
*
* d_pedgespanpackage++;
*
* errorterm += erroradjustup;
* if (errorterm >= 0)
move.l a1,(a0)+
move.l a2,(a0)+
move.l d6,(a0)+
move.l a3,(a0)+
move.l d4,(a0)+
swap d5
clr (a0)+
move d5,(a0)+
swap d5
move.l a5,(a0)+
move.l a4,(a0)+
add.l d1,d2
blt.b .elseA
* d_pdest += d_pdestextrastep;
* d_pz += d_pzextrastep;
* d_aspancount += d_countextrastep;
* d_ptex += d_ptexextrastep;
* d_sfrac += d_sfracextrastep;
* d_ptex += d_sfrac >> 16;
*
* d_sfrac &= 0xFFFF;
* d_tfrac += d_tfracextrastep;
* if (d_tfrac & 0x10000)
* {
* d_ptex += r_affinetridesc.skinwidth;
* d_tfrac &= 0xFFFF;
* }
* d_light += d_lightextrastep;
* d_zi += d_ziextrastep;
* errorterm -= erroradjustdown;
lea .pdestx(sp),a6
add.l (a6)+,a1
add.l (a6)+,a2
add.l (a6)+,d6
add.l (a6)+,a3
add.l (a6)+,d4
swap d4
add d4,a3
clr d4
swap d4
add.l (a6)+,d5
bcc.b .contA
add.l .r_affine(sp),a3
.contA
add.l (a6)+,a5
add.l (a6)+,a4
sub.l d0,d2
bra.b .nextA
.elseA
* d_pdest += d_pdestbasestep;
* d_pz += d_pzbasestep;
* d_aspancount += ubasestep;
* d_ptex += d_ptexbasestep;
* d_sfrac += d_sfracbasestep;
* d_ptex += d_sfrac >> 16;
* d_sfrac &= 0xFFFF;
* d_tfrac += d_tfracbasestep;
* if (d_tfrac & 0x10000)
* {
* d_ptex += r_affinetridesc.skinwidth;
* d_tfrac &= 0xFFFF;
* }
* d_light += d_lightbasestep;
* d_zi += d_zibasestep;
lea .pdestb(sp),a6
add.l (a6)+,a1
add.l (a6)+,a2
add.l (a6)+,d6
add.l (a6)+,a3
add.l (a6)+,d4
swap d4
add d4,a3
clr d4
swap d4
add.l (a6)+,d5
bcc.b .cont2A
add.l .r_affine(sp),a3
.cont2A
add.l (a6)+,a5
add.l (a6)+,a4
.nextA
dbra d7,.loopA
move.l a0,_d_pedgespanpackage
movem.l .savearea(sp),d2-d7/a2-a6
****** End of D_PolysetScanLeftEdge
* if (pedgetable->numleftedges == 2)
* {
* int height;
*
* plefttop = pleftbottom;
* pleftbottom = pedgetable->pleftedgevert2;
*
* D_PolysetSetUpForLineScan(plefttop[0], plefttop[1],
* pleftbottom[0], pleftbottom[1]);
*
* height = pleftbottom[1] - plefttop[1];
*
*// TODO: make this a function; modularize this function in general
*
* ystart = plefttop[1];
* d_aspancount = plefttop[0] - prighttop[0];
* d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
* (plefttop[3] >> 16) * r_affinetridesc.skinwidth;
* d_sfrac = 0;
* d_tfrac = 0;
* d_light = plefttop[4];
* d_zi = plefttop[5];
*
* d_pdestbasestep = screenwidth + ubasestep;
* d_pdestextrastep = d_pdestbasestep + 1;
* d_pdest = (byte *)d_viewbuffer + ystart * screenwidth + plefttop[0];
* d_pzbasestep = d_zwidth + ubasestep;
* d_pzextrastep = d_pzbasestep + 1;
* d_pz = d_pzbuffer + ystart * d_zwidth + plefttop[0];
*
* if (ubasestep < 0)
* working_lstepx = r_lstepx - 1;
* else
* working_lstepx = r_lstepx;
*
* d_countextrastep = ubasestep + 1;
* d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> 16) +
* ((r_tstepy + r_tstepx * ubasestep) >> 16) *
* r_affinetridesc.skinwidth;
* d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF;
* d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF;
* d_lightbasestep = r_lstepy + working_lstepx * ubasestep;
* d_zibasestep = r_zistepy + r_zistepx * ubasestep;
*
* d_ptexextrastep = ((r_sstepy + r_sstepx * d_countextrastep) >> 16) +
* ((r_tstepy + r_tstepx * d_countextrastep) >> 16) *
* r_affinetridesc.skinwidth;
* d_sfracextrastep = (r_sstepy+r_sstepx*d_countextrastep) & 0xFFFF;
* d_tfracextrastep = (r_tstepy+r_tstepx*d_countextrastep) & 0xFFFF;
* d_lightextrastep = d_lightbasestep + working_lstepx;
* d_ziextrastep = d_zibasestep + r_zistepx;
move.l _pedgetable,a0
cmp.l #2,ETAB_NUMLEFTEDGES(a0)
bne.b .cont
move.l a3,a6
move.l ETAB_PLEV2(a0),a3
move.l 4(a3),d5
move.l d5,d3
move.l (a3),d2
move.l 4(a6),d7
move.l d7,d1
move.l (a6),d6
move.l d6,d0
bsr _D_PolysetSetUpForLineScan
sub.l d7,d5
move.l d5,.height(sp)
sub.l (a2),d6
move.l d6,_d_aspancount ;d_aspancount = plefttop[0] - ...
move.l 2*4(a6),d0
move.l 3*4(a6),d1
move.l d0,d3 ;d3 = plefttop[2]
move.l d1,d6 ;d6 = plefttop[3]
swap d0
swap d1
and.l #$ffff,d0
and.l #$ffff,d1
mulu d4,d1
add.l d0,d1
add.l R_PSKIN(a5),d1
move.l d1,_d_ptex ;d_ptex = ...
clr.l _d_sfrac
clr.l _d_tfrac
move.l _d_zwidth,d0
move.l d0,d3 ;d3 = d_zwidth
move.l _ubasestep,d1
move.l d1,.aspanb(sp)
move.l d1,d5 ;d5 = ubasestep
add.l d1,d0
addq.l #1,d1
move.l d1,_d_countextrastep
move.l d1,.aspanx(sp)
add.l d0,d0
move.l d0,.pzb(sp) ;d_pzbasestep = d_zwidth + ubasestep
addq.l #2,d0
move.l d0,.pzx(sp) ;d_pzextrastep = d_pzbasestep + 1
move.l 4*4(a6),_d_light ;d_light = plefttop[4]
move.l 5*4(a6),_d_zi ;d_zi = plefttop[5]
move.l _screenwidth,d0
add.l d0,d1
move.l d1,.pdestx(sp) ;d_pdestextrastep = ...
subq.l #1,d1
move.l d1,.pdestb(sp) ;d_pdestbasestep = screenwidth + ..
mulu d7,d0 ;screenwidth * ystart
move.l (a6),d6
add.l d6,d0 ;+ plefttop[0]
add.l _d_viewbuffer,d0
move.l d0,_d_pdest ;d_pdest + d_viewbuffer + ...
mulu d7,d3 ;d_zwidth * ystart
add.l d6,d3 ;+ plefttop[0]
add.l d3,d3
add.l _d_pzbuffer,d3
move.l d3,_d_pz ;d_pz = d_pzbuffer + ...
move.l _r_sstepy,a0
move.l _r_sstepx,d1
move.l _r_tstepy,a1
move.l _r_tstepx,d6
move.l d1,d2
muls.l d5,d2
move.l d6,d7
muls.l d5,d7
add.l a0,d2
add.l a1,d7
move.l d2,d0
move.l d7,d3
and.l #$ffff,d0
move.l d0,.sfracb(sp)
and.l #$ffff,d3
swap d3
move.l d3,.tfracb(sp)
swap d3
add.l d1,d0
add.l d6,d3
and.l #$ffff,d0
move.l d0,.sfracx(sp)
and.l #$ffff,d3
swap d3
move.l d3,.tfracx(sp)
swap d3
move.l d2,d0
move.l d7,d3
swap d2
ext.l d2
swap d7
muls d4,d7
add.l d2,d7
move.l d7,.ptexb(sp)
add.l d1,d0
add.l d6,d3
swap d0
ext.l d0
swap d3
muls d4,d3
add.l d0,d3
move.l d3,.ptexx(sp)
move.l _r_lstepy,d0
move.l _r_lstepx,d1
tst.l d5 ;(if ubasestep < 0)
bge.b .ge2
subq.l #1,d1 ;working_lstepx = r_lstepx - 1
.ge2
move.l d1,d2
muls.l d5,d1
add.l d0,d1
move.l d1,.lightb(sp)
add.l d2,d1
move.l d1,.lightx(sp)
move.l _r_zistepy,d0
move.l _r_zistepx,d1
move.l d1,d2
muls.l d5,d1
add.l d0,d1
move.l d1,.zib(sp)
add.l d2,d1
move.l d1,.zix(sp)
***** D_PolysetScanLeftEdge (inlined)
movem.l d2-d7/a2-a6,.savearea(sp)
move.l _d_pedgespanpackage,a0
move.l _d_pdest,a1
move.l _d_pz,a2
move.l _d_aspancount,d6
move.l _d_ptex,a3
move.l _d_sfrac,d4
move.l _d_tfrac,d5
swap d5
move.l _d_light,a5
move.l _d_zi,a4
move.l _errorterm,d2
move.l _erroradjustup,d1
move.l _erroradjustdown,d0
move.l .height(sp),d7
subq #1,d7
.loopB
* d_pedgespanpackage->pdest = d_pdest;
* d_pedgespanpackage->pz = d_pz;
* d_pedgespanpackage->count = d_aspancount;
* d_pedgespanpackage->ptex = d_ptex;
*
* d_pedgespanpackage->sfrac = d_sfrac;
* d_pedgespanpackage->tfrac = d_tfrac;
*
* d_pedgespanpackage->light = d_light;
* d_pedgespanpackage->zi = d_zi;
*
* d_pedgespanpackage++;
*
* errorterm += erroradjustup;
* if (errorterm >= 0)
move.l a1,(a0)+
move.l a2,(a0)+
move.l d6,(a0)+
move.l a3,(a0)+
move.l d4,(a0)+
swap d5
clr (a0)+
move d5,(a0)+
swap d5
move.l a5,(a0)+
move.l a4,(a0)+
add.l d1,d2
blt.b .elseB
* d_pdest += d_pdestextrastep;
* d_pz += d_pzextrastep;
* d_aspancount += d_countextrastep;
* d_ptex += d_ptexextrastep;
* d_sfrac += d_sfracextrastep;
* d_ptex += d_sfrac >> 16;
*
* d_sfrac &= 0xFFFF;
* d_tfrac += d_tfracextrastep;
* if (d_tfrac & 0x10000)
* {
* d_ptex += r_affinetridesc.skinwidth;
* d_tfrac &= 0xFFFF;
* }
* d_light += d_lightextrastep;
* d_zi += d_ziextrastep;
* errorterm -= erroradjustdown;
lea .pdestx(sp),a6
add.l (a6)+,a1
add.l (a6)+,a2
add.l (a6)+,d6
add.l (a6)+,a3
add.l (a6)+,d4
swap d4
add d4,a3
clr d4
swap d4
add.l (a6)+,d5
bcc.b .contB
add.l .r_affine(sp),a3
.contB
add.l (a6)+,a5
add.l (a6)+,a4
sub.l d0,d2
bra.b .nextB
.elseB
* d_pdest += d_pdestbasestep;
* d_pz += d_pzbasestep;
* d_aspancount += ubasestep;
* d_ptex += d_ptexbasestep;
* d_sfrac += d_sfracbasestep;
* d_ptex += d_sfrac >> 16;
* d_sfrac &= 0xFFFF;
* d_tfrac += d_tfracbasestep;
* if (d_tfrac & 0x10000)
* {
* d_ptex += r_affinetridesc.skinwidth;
* d_tfrac &= 0xFFFF;
* }
* d_light += d_lightbasestep;
* d_zi += d_zibasestep;
lea .pdestb(sp),a6
add.l (a6)+,a1
add.l (a6)+,a2
add.l (a6)+,d6
add.l (a6)+,a3
add.l (a6)+,d4
swap d4
add d4,a3
clr d4
swap d4
add.l (a6)+,d5
bcc.b .cont2B
add.l .r_affine(sp),a3
.cont2B
add.l (a6)+,a5
add.l (a6)+,a4
.nextB
dbra d7,.loopB
move.l a0,_d_pedgespanpackage
movem.l .savearea(sp),d2-d7/a2-a6
.cont
* d_pedgespanpackage = a_spans;
*
* D_PolysetSetUpForLineScan(prighttop[0], prighttop[1],
* prightbottom[0], prightbottom[1]);
* d_aspancount = 0;
* d_countextrastep = ubasestep + 1;
* originalcount = a_spans[initialrightheight].count;
* a_spans[initialrightheight].count = -999999; // mark end of the spanpackages
* D_PolysetDrawSpans8 (a_spans);
move.l _a_spans,_d_pedgespanpackage
move.l 4(a4),d3
move.l (a4),d2
move.l 4(a2),d1
move.l (a2),d0
bsr _D_PolysetSetUpForLineScan
clr.l _d_aspancount
move.l _ubasestep,d0
addq.l #1,d0
move.l d0,_d_countextrastep
move.l _a_spans,a3
move.l .initRH(sp),d6
move.l d6,d0
asl.l #PSPANP_SIZEOF_EXP,d0
move.l PSPANP_COUNT(a3,d0.l),d7
move.l #-999999,PSPANP_COUNT(a3,d0.l)
move.l a3,-(sp)
bsr _D_PolysetDrawSpans8
addq #4,sp
* if (pedgetable->numrightedges == 2)
* {
* int height;
* spanpackage_t *pstart;
*
* pstart = a_spans + initialrightheight;
* pstart->count = originalcount;
*
* d_aspancount = prightbottom[0] - prighttop[0];
*
* prighttop = prightbottom;
* prightbottom = pedgetable->prightedgevert2;
*
* height = prightbottom[1] - prighttop[1];
*
* D_PolysetSetUpForLineScan(prighttop[0], prighttop[1],
* prightbottom[0], prightbottom[1]);
*
* d_countextrastep = ubasestep + 1;
* a_spans[initialrightheight + height].count = -999999;
* // mark end of the spanpackages
* D_PolysetDrawSpans8 (pstart);
move.l _pedgetable,a0
cmp.l #2,ETAB_NUMRIGHTEDGES(a0)
bne.b .exit
move.l a3,a6
move.l d6,d0
asl.l #PSPANP_SIZEOF_EXP,d0
add.l d0,a6
move.l d7,PSPANP_COUNT(a6)
move.l (a4),d0
sub.l (a2),d0
move.l d0,_d_aspancount
move.l a4,a2
move.l ETAB_PREV2(a0),a4
move.l 4(a4),d5
move.l d5,d3
move.l 4(a2),d0
sub.l d0,d5
move.l (a4),d2
move.l d0,d1
move.l (a2),d0
bsr _D_PolysetSetUpForLineScan
move.l _ubasestep,d4
addq.l #1,d4
move.l d4,_d_countextrastep
add.l d6,d5
asl.l #PSPANP_SIZEOF_EXP,d5
move.l #-999999,PSPANP_COUNT(a3,d5.l)
move.l a6,-(sp)
bsr _D_PolysetDrawSpans8
addq #4,sp
.exit
add #.intregs,sp
movem.l (sp)+,d2-d7/a2-a6
rts
******************************************************************************
*
* void D_DrawNonSubdiv (void)
*
******************************************************************************
cnop 0,4
_D_DrawNonSubdiv
movem.l d2-d7/a2-a6,-(sp)
* pfv = r_affinetridesc.pfinalverts;
* ptri = r_affinetridesc.ptriangles;
* lnumtriangles = r_affinetridesc.numtriangles;
lea _r_affinetridesc,a0
move.l R_PFINALVERTS(a0),a2 ;pfv = f_affinetridesc.pfinalverts
move.l R_PTRIANGLES(a0),a3 ;ptri = f_affinetridesc.ptriangles
move.l R_NUMTRIANGLES(a0),d3 ;lnumtriangles = r_affine...
subq #1,d3
.loop
* index0 = pfv + ptri->vertindex[0];
* index1 = pfv + ptri->vertindex[1];
* index2 = pfv + ptri->vertindex[2];
*
* d_xdenom = (index0->v[1]-index1->v[1]) *
* (index0->v[0]-index2->v[0]) -
* (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
move.l MT_VERTINDEX+0*4(a3),d0
asl.l #FV_SIZEOF_EXP,d0
lea 0(a2,d0.l),a0 ;a0 = index0
move.l MT_VERTINDEX+1*4(a3),d0
asl.l #FV_SIZEOF_EXP,d0
lea 0(a2,d0.l),a1 ;a1 = index1
move.l MT_VERTINDEX+2*4(a3),d0
asl.l #FV_SIZEOF_EXP,d0
lea 0(a2,d0.l),a4 ;a2 = index2
movem.l d3/a3,-(sp)
move.l (a0)+,d0 ;d0 = index0->v[0]
move.l (a0)+,d1 ;d1 = index0->v[1]
move.l (a1)+,a6 ;d2 = index1->v[0]
move.l (a1)+,d2 ;a6 = index1->v[1]
move.l (a4)+,d4 ;d4 = index2->v[0]
move.l (a4)+,d5 ;d5 = index2->v[1]
move.l d0,d6
move.l d1,d7
sub.l d4,d6 ;index0->v[0]-index2->v[0]
sub.l d2,d7 ;index0->v[1]-index1->v[1]
move.l d6,d3
muls.l d7,d3
move.l d0,d6
move.l d1,d7
sub.l a6,d6 ;index0->v[0]-index1->v[0]
sub.l d5,d7 ;index0->v[1]-index2->v[1]
muls.l d6,d7
* if (d_xdenom >= 0)
* {
* continue;
* }
sub.l d7,d3
bge.w .next ;if (d_xdenom >= 0)
move.l d3,_d_xdenom ;d_xdenom = ...
* r_p0[0] = index0->v[0]; // u
* r_p0[1] = index0->v[1]; // v
* r_p0[2] = index0->v[2]; // s
* r_p0[3] = index0->v[3]; // t
* r_p0[4] = index0->v[4]; // light
* r_p0[5] = index0->v[5]; // iz
*
* r_p1[0] = index1->v[0];
* r_p1[1] = index1->v[1];
* r_p1[2] = index1->v[2];
* r_p1[3] = index1->v[3];
* r_p1[4] = index1->v[4];
* r_p1[5] = index1->v[5];
*
* r_p2[0] = index2->v[0];
* r_p2[1] = index2->v[1];
* r_p2[2] = index2->v[2];
* r_p2[3] = index2->v[3];
* r_p2[4] = index2->v[4];
* r_p2[5] = index2->v[5];
lea _r_p1,a5
move.l a6,(a5)+ ;r_p1[0] = index1->v[0]
move.l d2,(a5)+ ;r_p1[1] = index1->v[1]
move.l (a1)+,(a5)+ ;...
move.l (a1)+,(a5)+
move.l (a1)+,(a5)+
move.l (a1)+,(a5)+
lea _r_p0,a6
move.l d0,(a6)+ ;r_p0[0] = index0->v[0]
move.l d1,(a6)+ ;...
move.l (a0)+,(a6)+
move.l (a0)+,(a6)+
move.l (a0)+,(a6)+
move.l (a0)+,(a6)+
move.l MT_FACESFRONT(a3),d6
lea _r_p2,a3 ;r_p2[0] = index2->v[0]
move.l d4,(a3)+ ;...
move.l d5,(a3)+
move.l (a4)+,(a3)+
move.l (a4)+,(a3)+
move.l (a4)+,(a3)+
move.l (a4)+,(a3)+
* if (!ptri->facesfront)
* {
* if (index0->flags & ALIAS_ONSEAM)
* r_p0[2] += r_affinetridesc.seamfixupX16;
* if (index1->flags & ALIAS_ONSEAM)
* r_p1[2] += r_affinetridesc.seamfixupX16;
* if (index2->flags & ALIAS_ONSEAM)
* r_p2[2] += r_affinetridesc.seamfixupX16;
* }
tst.l d6 ;if (!ptri->facesfront)
bne.b .cont
move.l _r_affinetridesc+R_SEAMFIXUP16,d3
move.l (a0),d0 ;if (index0->flags & ALIAS_ONSEAM)
and.l #ALIAS_ONSEAM,d0
beq.b .1
add.l d3,-16(a6) ;r_p0[2] += r_affinetridesc.se...
.1
move.l (a1),d0
and.l #ALIAS_ONSEAM,d0
beq.b .2
add.l d3,-16(a5)
.2
move.l (a4),d0
and.l #ALIAS_ONSEAM,d0
beq.b .cont
add.l d3,-16(a3)
.cont
****** D_PolysetSetEdgeTable (inlined)
cmp.l d2,d1
blt.b .lt1
beq.b .eq1
.gt1
moveq #EDGETABLE_SIZEOF,d0
cmp.l d5,d1
beq.b .eq2
cmp.l d5,d2
beq.b .eq3
cmp.l d5,d1
ble.b .skip
add.l #2*EDGETABLE_SIZEOF,d0
.skip
cmp.l d5,d2
ble.b .skip2
add.l #4*EDGETABLE_SIZEOF,d0
.skip2
add.l #_edgetables,d0
move.l d0,_pedgetable
bra.b .done
.eq2
move.l #_edgetables+8*EDGETABLE_SIZEOF,_pedgetable
bra.b .done
.eq3
move.l #_edgetables+10*EDGETABLE_SIZEOF,_pedgetable
bra.b .done
.eq1
cmp.l d5,d1
bge.b .ge
move.l #_edgetables+2*EDGETABLE_SIZEOF,_pedgetable
bra.b .done
.ge
move.l #_edgetables+5*EDGETABLE_SIZEOF,_pedgetable
bra.b .done
.lt1
moveq #0,d0
cmp.l d5,d1
beq.b .eq4
cmp.l d5,d2
beq.b .eq5
cmp.l d5,d1
ble.b .skip3
add.l #2*EDGETABLE_SIZEOF,d0
.skip3
cmp.l d5,d2
ble.b .skip4
add.l #4*EDGETABLE_SIZEOF,d0
.skip4
add.l #_edgetables,d0
move.l d0,_pedgetable
bra.b .done
.eq4
move.l #_edgetables+9*EDGETABLE_SIZEOF,_pedgetable
bra.b .done
.eq5
move.l #_edgetables+11*EDGETABLE_SIZEOF,_pedgetable
.done
****** end of D_PolysetSetEdgeTable
bsr _D_RasterizeAliasPolySmooth
.next
movem.l (sp)+,d3/a3
lea MT_SIZEOF(a3),a3 ;ptri++
dbra d3,.loop
movem.l (sp)+,d2-d7/a2-a6
rts
_adivtab
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,1
dc.l -5,1,-6,1,-7,2,-1,2,-3,3,0
dc.l 3,-3,5,0,7,-1,$F,0,0,0,-$F
dc.l 0,-$8,1,-5,0,-4,1,-3,0,-3,3
dc.l -3,6,-2,1,-2,3,-2,5,-2,7,-2
dc.l $9,-2,$B,-2,$D,-1,0,-1,1,0,-$E
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,1
dc.l -5,1,-6,2,0,2,-2,2,-4,3,-2
dc.l 4,-2,7,0,$E,0,0,0,-$E,0,-7
dc.l 0,-5,1,-4,2,-3,1,-3,4,-2,0
dc.l -2,2,-2,4,-2,6,-2,$8,-2,$A,-2
dc.l $C,-1,0,-1,1,-1,2,0,-$D,0,-$D
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,1
dc.l -5,1,-6,2,-1,2,-3,3,-1,4,-1
dc.l 6,-1,$D,0,0,0,-$D,0,-7,1,-5
dc.l 2,-4,3,-3,2,-3,5,-2,1,-2,3
dc.l -2,5,-2,7,-2,$9,-2,$B,-1,0,-1
dc.l 1,-1,2,-1,3,0,-$C,0,-$C,0,-$C
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,1
dc.l -5,2,0,2,-2,3,0,4,0,6,0
dc.l $C,0,0,0,-$C,0,-6,0,-4,0,-3
dc.l 0,-3,3,-2,0,-2,2,-2,4,-2,6
dc.l -2,$8,-2,$A,-1,0,-1,1,-1,2,-1
dc.l 3,-1,4,0,-$B,0,-$B,0,-$B,0,-$B
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,1
dc.l -5,2,-1,2,-3,3,-2,5,-1,$B,0
dc.l 0,0,-$B,0,-6,1,-4,1,-3,1,-3
dc.l 4,-2,1,-2,3,-2,5,-2,7,-2,$9
dc.l -1,0,-1,1,-1,2,-1,3,-1,4,-1
dc.l 5,0,-$A,0,-$A,0,-$A,0,-$A,0,-$A
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,2
dc.l 0,2,-2,3,-1,5,0,$A,0,0,0
dc.l -$A,0,-5,0,-4,2,-3,2,-2,0,-2
dc.l 2,-2,4,-2,6,-2,$8,-1,0,-1,1
dc.l -1,2,-1,3,-1,4,-1,5,-1,6,0
dc.l -$9,0,-$9,0,-$9,0,-$9,0,-$9,0,-$9
dc.l 1,0,1,-1,1,-2,1,-3,1,-4,2
dc.l -1,3,0,4,-1,$9,0,0,0,-$9,0
dc.l -5,1,-3,0,-3,3,-2,1,-2,3,-2
dc.l 5,-2,7,-1,0,-1,1,-1,2,-1,3
dc.l -1,4,-1,5,-1,6,-1,7,0,-$8,0
dc.l -$8,0,-$8,0,-$8,0,-$8,0,-$8,0,-$8
dc.l 1,0,1,-1,1,-2,1,-3,2,0,2
dc.l -2,4,0,$8,0,0,0,-$8,0,-4,0
dc.l -3,1,-2,0,-2,2,-2,4,-2,6,-1
dc.l 0,-1,1,-1,2,-1,3,-1,4,-1,5
dc.l -1,6,-1,7,-1,$8,0,-7,0,-7,0
dc.l -7,0,-7,0,-7,0,-7,0,-7,0,-7
dc.l 1,0,1,-1,1,-2,1,-3,2,-1,3
dc.l -1,7,0,0,0,-7,0,-4,1,-3,2
dc.l -2,1,-2,3,-2,5,-1,0,-1,1,-1
dc.l 2,-1,3,-1,4,-1,5,-1,6,-1,7
dc.l -1,$8,-1,$9,0,-6,0,-6,0,-6,0
dc.l -6,0,-6,0,-6,0,-6,0,-6,0,-6
dc.l 1,0,1,-1,1,-2,2,0,3,0,6
dc.l 0,0,0,-6,0,-3,0,-2,0,-2,2
dc.l -2,4,-1,0,-1,1,-1,2,-1,3,-1
dc.l 4,-1,5,-1,6,-1,7,-1,$8,-1,$9
dc.l -1,$A,0,-5,0,-5,0,-5,0,-5,0
dc.l -5,0,-5,0,-5,0,-5,0,-5,0,-5
dc.l 1,0,1,-1,1,-2,2,-1,5,0,0
dc.l 0,-5,0,-3,1,-2,1,-2,3,-1,0
dc.l -1,1,-1,2,-1,3,-1,4,-1,5,-1
dc.l 6,-1,7,-1,$8,-1,$9,-1,$A,-1,$B
dc.l 0,-4,0,-4,0,-4,0,-4,0,-4,0
dc.l -4,0,-4,0,-4,0,-4,0,-4,0,-4
dc.l 1,0,1,-1,2,0,4,0,0,0,-4
dc.l 0,-2,0,-2,2,-1,0,-1,1,-1,2
dc.l -1,3,-1,4,-1,5,-1,6,-1,7,-1
dc.l $8,-1,$9,-1,$A,-1,$B,-1,$C,0,-3
dc.l 0,-3,0,-3,0,-3,0,-3,0,-3,0
dc.l -3,0,-3,0,-3,0,-3,0,-3,0,-3
dc.l 1,0,1,-1,3,0,0,0,-3,0,-2
dc.l 1,-1,0,-1,1,-1,2,-1,3,-1,4
dc.l -1,5,-1,6,-1,7,-1,$8,-1,$9,-1
dc.l $A,-1,$B,-1,$C,-1,$D,0,-2,0,-2
dc.l 0,-2,0,-2,0,-2,0,-2,0,-2,0
dc.l -2,0,-2,0,-2,0,-2,0,-2,0,-2
dc.l 1,0,2,0,0,0,-2,0,-1,0,-1
dc.l 1,-1,2,-1,3,-1,4,-1,5,-1,6
dc.l -1,7,-1,$8,-1,$9,-1,$A,-1,$B,-1
dc.l $C,-1,$D,-1,$E,0,-1,0,-1,0,-1
dc.l 0,-1,0,-1,0,-1,0,-1,0,-1,0
dc.l -1,0,-1,0,-1,0,-1,0,-1,0,-1
dc.l 1,0,0,0,-1,0,-1,1,-1,2,-1
dc.l 3,-1,4,-1,5,-1,6,-1,7,-1,$8
dc.l -1,$9,-1,$A,-1,$B,-1,$C,-1,$D,-1
dc.l $E,-1,$F,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0
dc.l 0,-1,-$E,-1,-$D,-1,-$C,-1,-$B,-1,-$A
dc.l -1,-$9,-1,-$8,-1,-7,-1,-6,-1,-5,-1
dc.l -4,-1,-3,-1,-2,-1,-1,-1,0,0,0
dc.l 1,0,0,1,0,1,0,1,0,1,0
dc.l 1,0,1,0,1,0,1,0,1,0,1
dc.l 0,1,0,1,0,1,0,1,0,1,-1
dc.l -$D,-1,-$C,-1,-$B,-1,-$A,-1,-$9,-1,-$8
dc.l -1,-7,-1,-6,-1,-5,-1,-4,-1,-3,-1
dc.l -2,-1,-1,-1,0,-2,0,0,0,2,0
dc.l 1,0,0,2,0,2,0,2,0,2,0
dc.l 2,0,2,0,2,0,2,0,2,0,2
dc.l 0,2,0,2,0,2,0,2,-1,-$C,-1
dc.l -$B,-1,-$A,-1,-$9,-1,-$8,-1,-7,-1,-6
dc.l -1,-5,-1,-4,-1,-3,-1,-2,-1,-1,-1
dc.l 0,-2,-1,-3,0,0,0,3,0,1,1
dc.l 1,0,0,3,0,3,0,3,0,3,0
dc.l 3,0,3,0,3,0,3,0,3,0,3
dc.l 0,3,0,3,0,3,-1,-$B,-1,-$A,-1
dc.l -$9,-1,-$8,-1,-7,-1,-6,-1,-5,-1,-4
dc.l -1,-3,-1,-2,-1,-1,-1,0,-2,-2,-2
dc.l 0,-4,0,0,0,4,0,2,0,1,1
dc.l 1,0,0,4,0,4,0,4,0,4,0
dc.l 4,0,4,0,4,0,4,0,4,0,4
dc.l 0,4,0,4,-1,-$A,-1,-$9,-1,-$8,-1
dc.l -7,-1,-6,-1,-5,-1,-4,-1,-3,-1,-2
dc.l -1,-1,-1,0,-2,-3,-2,-1,-3,-1,-5
dc.l 0,0,0,5,0,2,1,1,2,1,1
dc.l 1,0,0,5,0,5,0,5,0,5,0
dc.l 5,0,5,0,5,0,5,0,5,0,5
dc.l 0,5,-1,-$9,-1,-$8,-1,-7,-1,-6,-1
dc.l -5,-1,-4,-1,-3,-1,-2,-1,-1,-1,0
dc.l -2,-4,-2,-2,-2,0,-3,0,-6,0,0
dc.l 0,6,0,3,0,2,0,1,2,1,1
dc.l 1,0,0,6,0,6,0,6,0,6,0
dc.l 6,0,6,0,6,0,6,0,6,0,6
dc.l -1,-$8,-1,-7,-1,-6,-1,-5,-1,-4,-1
dc.l -3,-1,-2,-1,-1,-1,0,-2,-5,-2,-3
dc.l -2,-1,-3,-2,-4,-1,-7,0,0,0,7
dc.l 0,3,1,2,1,1,3,1,2,1,1
dc.l 1,0,0,7,0,7,0,7,0,7,0
dc.l 7,0,7,0,7,0,7,0,7,-1,-7
dc.l -1,-6,-1,-5,-1,-4,-1,-3,-1,-2,-1
dc.l -1,-1,0,-2,-6,-2,-4,-2,-2,-2,0
dc.l -3,-1,-4,0,-$8,0,0,0,$8,0,4
dc.l 0,2,2,2,0,1,3,1,2,1,1
dc.l 1,0,0,$8,0,$8,0,$8,0,$8,0
dc.l $8,0,$8,0,$8,0,$8,-1,-6,-1,-5
dc.l -1,-4,-1,-3,-1,-2,-1,-1,-1,0,-2
dc.l -7,-2,-5,-2,-3,-2,-1,-3,-3,-3,0
dc.l -5,-1,-$9,0,0,0,$9,0,4,1,3
dc.l 0,2,1,1,4,1,3,1,2,1,1
dc.l 1,0,0,$9,0,$9,0,$9,0,$9,0
dc.l $9,0,$9,0,$9,-1,-5,-1,-4,-1,-3
dc.l -1,-2,-1,-1,-1,0,-2,-$8,-2,-6,-2
dc.l -4,-2,-2,-2,0,-3,-2,-4,-2,-5,0
dc.l -$A,0,0,0,$A,0,5,0,3,1,2
dc.l 2,2,0,1,4,1,3,1,2,1,1
dc.l 1,0,0,$A,0,$A,0,$A,0,$A,0
dc.l $A,0,$A,-1,-4,-1,-3,-1,-2,-1,-1
dc.l -1,0,-2,-$9,-2,-7,-2,-5,-2,-3,-2
dc.l -1,-3,-4,-3,-1,-4,-1,-6,-1,-$B,0
dc.l 0,0,$B,0,5,1,3,2,2,3,2
dc.l 1,1,5,1,4,1,3,1,2,1,1
dc.l 1,0,0,$B,0,$B,0,$B,0,$B,0
dc.l $B,-1,-3,-1,-2,-1,-1,-1,0,-2,-$A
dc.l -2,-$8,-2,-6,-2,-4,-2,-2,-2,0,-3
dc.l -3,-3,0,-4,0,-6,0,-$C,0,0,0
dc.l $C,0,6,0,4,0,3,0,2,2,2
dc.l 0,1,5,1,4,1,3,1,2,1,1
dc.l 1,0,0,$C,0,$C,0,$C,0,$C,-1
dc.l -2,-1,-1,-1,0,-2,-$B,-2,-$9,-2,-7
dc.l -2,-5,-2,-3,-2,-1,-3,-5,-3,-2,-4
dc.l -3,-5,-2,-7,-1,-$D,0,0,0,$D,0
dc.l 6,1,4,1,3,1,2,3,2,1,1
dc.l 6,1,5,1,4,1,3,1,2,1,1
dc.l 1,0,0,$D,0,$D,0,$D,-1,-1,-1
dc.l 0,-2,-$C,-2,-$A,-2,-$8,-2,-6,-2,-4
dc.l -2,-2,-2,0,-3,-4,-3,-1,-4,-2,-5
dc.l -1,-7,0,-$E,0,0,0,$E,0,7,0
dc.l 4,2,3,2,2,4,2,2,2,0,1
dc.l 6,1,5,1,4,1,3,1,2,1,1
dc.l 1,0,0,$E,0,$E,-1,0,-2,-$D,-2
dc.l -$B,-2,-$9,-2,-7,-2,-5,-2,-3,-2,-1
dc.l -3,-6,-3,-3,-3,0,-4,-1,-5,0,-$8
dc.l -1,-$F,0,0,0,$F,0,7,1,5,0
dc.l 3,3,3,0,2,3,2,1,1,7,1
dc.l 6,1,5,1,4,1,3,1,2,1,1
dc.l 1,0,0,$F,-2,-$E,-2,-$C,-2,-$A,-2
dc.l -$8,-2,-6,-2,-4,-2,-2,-2,0,-3,-5
dc.l -3,-2,-4,-4,-4,0,-6,-2,-$8,0,-$10
dc.l 0,0,0,$10,0,$8,0,5,1,4,0
dc.l 3,1,2,4,2,2,2,0,1,7,1
dc.l 6,1,5,1,4,1,3,1,2,1,1
dc.l 1,0