home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / d_polyset68k.s < prev    next >
Text File  |  2000-06-17  |  56KB  |  1,974 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_polyset.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _acolormap
  20.         XREF    _d_aspancount
  21.         XREF    _errorterm
  22.         XREF    _erroradjustup
  23.         XREF    _erroradjustdown
  24.         XREF    _d_countextrastep
  25.         XREF    _ubasestep
  26.         XREF    _r_affinetridesc
  27.         XREF    _a_ststepxwhole
  28.         XREF    _a_sstepxfrac
  29.         XREF    _a_tstepxfrac
  30.         XREF    _r_lstepx
  31.         XREF    _r_lstepy
  32.         XREF    _r_sstepx
  33.         XREF    _r_sstepy
  34.         XREF    _r_tstepx
  35.         XREF    _r_tstepy
  36.         XREF    _r_zistepx
  37.         XREF    _r_zistepy
  38.         XREF    _zspantable
  39.         XREF    _skintable
  40.         XREF    _r_p0
  41.         XREF    _r_p1
  42.         XREF    _r_p2
  43.         XREF    _d_xdenom
  44.         XREF    _d_pcolormap
  45.         XREF    _d_scantable
  46.         XREF    _d_viewbuffer
  47.         XREF    _d_pedgespanpackage
  48.         XREF    _d_pdest
  49.         XREF    _d_pz
  50.         XREF    _d_aspancount
  51.         XREF    _d_ptex
  52.         XREF    _d_sfrac
  53.         XREF    _d_tfrac
  54.         XREF    _d_light
  55.         XREF    _d_zi
  56.         XREF    _d_pdestextrastep
  57.         XREF    _d_pzextrastep
  58.         XREF    _d_countextrastep
  59.         XREF    _d_ptexextrastep
  60.         XREF    _d_sfracextrastep
  61.         XREF    _d_tfracextrastep
  62.         XREF    _d_lightextrastep
  63.         XREF    _d_ziextrastep
  64.         XREF    _d_pdestbasestep
  65.         XREF    _d_pzbasestep
  66.         XREF    _d_ptexbasestep
  67.         XREF    _d_sfracbasestep
  68.         XREF    _d_tfracbasestep
  69.         XREF    _d_lightbasestep
  70.         XREF    _d_zibasestep
  71.         XREF    _d_zwidth
  72.         XREF    _d_pzbuffer
  73.         XREF    _a_spans
  74.         XREF    _pedgetable
  75.         XREF    _edgetables
  76.         XREF    _screenwidth
  77.         XREF    _FloorDivMod
  78.  
  79.         XDEF    _D_DrawNonSubdiv
  80.         XDEF    _D_PolysetRecursiveTriangle
  81.         XDEF    _D_RasterizeAliasPolySmooth
  82.  
  83. ALIAS_ONSEAM            =       $20             ;must match the def. in r_shared.h
  84.  
  85. PSPANP_PDEST            =       0
  86. PSPANP_PZ               =       4
  87. PSPANP_COUNT            =       8
  88. PSPANP_PTEX             =       12
  89. PSPANP_SFRAC            =       16
  90. PSPANP_TFRAC            =       20
  91. PSPANP_LIGHT            =       24
  92. PSPANP_ZI               =       28
  93. PSPANP_SIZEOF           =       32
  94. PSPANP_SIZEOF_EXP       =       5
  95.  
  96. R_PSKIN                 =       0
  97. R_PSKINDESC             =       4
  98. R_SKINWIDTH             =       8
  99. R_SKINHEIGHT            =       12
  100. R_PTRIANGLES            =       16
  101. R_PFINALVERTS           =       20
  102. R_NUMTRIANGLES          =       24
  103. R_DRAWTYPE              =       28
  104. R_SEAMFIXUP16           =       32
  105. R_SIZEOF                =       36
  106.  
  107. PTEMP_QUOTIENT          =       0
  108. PTEMP_REMAINDER         =       4
  109.  
  110. ETAB_ISFLATTOP          =       0
  111. ETAB_NUMLEFTEDGES       =       4
  112. ETAB_PLEV0              =       8
  113. ETAB_PLEV1              =       12
  114. ETAB_PLEV2              =       16
  115. ETAB_NUMRIGHTEDGES      =       20
  116. ETAB_PREV0              =       24
  117. ETAB_PREV1              =       28
  118. ETAB_PREV2              =       32
  119. ETAB_SIZEOF             =       36
  120.  
  121. MT_FACESFRONT           =       0
  122. MT_VERTINDEX            =       4
  123. MT_SIZEOF               =       16
  124.  
  125. FV_V                    =       0
  126. FV_FLAGS                =       24
  127. FV_RESERVED             =       28
  128. FV_SIZEOF               =       32
  129. FV_SIZEOF_EXP           =       5
  130.  
  131. EDGETABLE_SIZEOF        =       36
  132.  
  133. ******************************************************************************
  134. *
  135. *       void D_PolysetDrawSpans8 (spanpackage_t *pspanpackage)
  136. *
  137. *       standard scan drawing function for alias models
  138. *
  139. ******************************************************************************
  140.  
  141.         cnop    0,4
  142. _D_PolysetDrawSpans8
  143.  
  144.  
  145. *****   stackframe
  146.  
  147.         rsreset
  148. .intregs        rs.l    11
  149.         rs.l    1
  150. .pspan          rs.l    1
  151.  
  152.  
  153. ****** prologue
  154.  
  155.         movem.l d2-d7/a2-a6,-(sp)
  156.         move.l  .pspan(sp),a0
  157.         move.l  _d_aspancount,d0
  158.         move.l  _errorterm,d1
  159.         move.l  _erroradjustup,d2
  160.         move.l  _erroradjustdown,d3
  161.         move.l  _d_countextrastep,a1
  162.         move.l  _ubasestep,d5
  163.         move.l  _acolormap,a3
  164.         move.l  _r_zistepx,d4
  165.         move.l  _a_ststepxwhole,a5
  166.         move.l  _a_sstepxfrac,a4
  167.         move.l  _a_tstepxfrac,d6
  168.         swap    d6
  169.         move.l  _r_lstepx,a6
  170.         move.l  _r_affinetridesc+R_SKINWIDTH,d7
  171.         move    d7,d6
  172. .loop
  173.  
  174. *                lcount = d_aspancount - pspanpackage->count;
  175. *
  176. *                errorterm += erroradjustup;
  177. *                if (errorterm >= 0)
  178. *                {
  179. *                        d_aspancount += d_countextrastep;
  180. *                        errorterm -= erroradjustdown;
  181. *                }
  182. *                else
  183. *                {
  184. *                        d_aspancount += ubasestep;
  185. *                }
  186.  
  187.         move.l  d0,d7
  188.         sub.l   PSPANP_COUNT(a0),d7     ;lcount = d_aspancount-pspa...
  189.         add.l   d2,d1                   ;errorterm += erroradjustup
  190.         blt.b   .else                   ;if (errorterm >= 0)
  191.         add.l   a1,d0                   ;d_aspancount += d_countextrastep
  192.         sub.l   d3,d1                   ;errorterm -= error adjustdown
  193.         bra.b   .next
  194. .else
  195.         add.l   d5,d0                   ;d_aspancount += ubasestep
  196. .next
  197.         subq.l  #1,d7
  198.         blt.b   .loopend
  199.  
  200. *                        lpdest = pspanpackage->pdest;
  201. *                        lptex = pspanpackage->ptex;
  202. *                        lpz = pspanpackage->pz;
  203. *                        lsfrac = pspanpackage->sfrac;
  204. *                        ltfrac = pspanpackage->tfrac;
  205. *                        llight = pspanpackage->light;
  206. *                        lzi = pspanpackage->zi;
  207.  
  208.         movem.l d0-d3/d5/a0/a1,-(sp)
  209.         move.l  (a0)+,d2                ;lpdest = pspanpackage->dest
  210.         move.l  (a0)+,a1                ;lpz = pspanpackage->pz
  211.         addq.l  #4,a0
  212.         move.l  (a0)+,a2                ;lptex = pspanpackage->ptex
  213.         move.l  (a0)+,d3                ;lsfrac = pspanpackage->sfrac
  214.         move.l  (a0)+,d5                ;tsfrac = pspanpackage->tfrac
  215.         swap    d5
  216.         move.l  (a0)+,d1                ;llight = pspanpackage->light
  217.         move.l  (a0)+,d0                ;lzi = pspanpackage->zi
  218.         move.l  d2,a0
  219.         moveq   #0,d2
  220.  
  221. ****** main drawing loop
  222.  
  223. ****** d0 = lzi
  224. ****** d1 = llight
  225. ****** d3 = lsfrac
  226. ****** d4 = r_zistepx
  227. ****** d5 = ltfrac
  228. ****** d6 = a_tstepxfrac [high] and r_affinetridesc.skinwidth [low]
  229. ****** d7 = lcount-1
  230. ****** a0 -> lpdest
  231. ****** a1 -> lpz
  232. ****** a2 -> lptex
  233. ****** a3 -> acolormap
  234. ****** a4 = a_sstepxfrac
  235. ****** a5 = a_ststepxwhole
  236. ****** a6 = r_lstepx
  237.  
  238. *                        do
  239. *                        {
  240. *                                if ((lzi >> 16) >= *lpz)
  241. *                                {
  242. *                                        *lpdest = ((byte *)acolormap)[*lptex + (llight & 0xFF00)];
  243. *                                        *lpz = lzi >> 16;
  244. *                                }
  245. *                                lpdest++;
  246. *                                lzi += r_zistepx;
  247. *                                lpz++;
  248. *                                llight += r_lstepx;
  249. *                                lptex += a_ststepxwhole;
  250. *                                lsfrac += a_sstepxfrac;
  251. *                                lptex += lsfrac >> 16;
  252. *                                lsfrac &= 0xFFFF;
  253. *                                ltfrac += a_tstepxfrac;
  254. *                                if (ltfrac & 0x10000)
  255. *                                {
  256. *                                        lptex += r_affinetridesc.skinwidth;
  257. *                                        ltfrac &= 0xFFFF;
  258. *                                }
  259. *                        } while (--lcount);
  260.  
  261. .loop2
  262.         swap    d0
  263.         cmp     (a1)+,d0                ;if ((lzi >> 16) >= *lpz)
  264.         blt.b   .cont
  265.         move    d1,d2
  266.         move.b  (a2),d2                 ;d3 = *lptex + (llight & $ff00)
  267.         move.b  0(a3,d2.l),(a0)         ;*lpdest = ((byte *)acolormap[d2]
  268.         move    d0,-2(a1)               ;*lpz = lzi >> 16
  269. .cont
  270.         addq.l  #1,a0                   ;lpdest++
  271.         swap    d0
  272.         add.l   d4,d0                   ;lzi += r_zistepx
  273.         add.l   a6,d1                   ;llight += r_lstepx
  274.         add.l   a5,a2                   ;lptex += a_ststepxwhole
  275.         add.l   a4,d3                   ;lsfrac += a_sstepxfrac
  276.         swap    d3
  277.         add     d3,a2                   ;lptex += lsfrac >> 16
  278.         clr     d3
  279.         swap    d3                      ;lsfrac &= $ffff
  280.         add.l   d6,d5                   ;ltfrac += a_tstepxfrac
  281.         bcc.b   .cont2                  ;if (ltfrac & $10000)
  282.         add     d6,a2                   ;lptex += r_affine...
  283. .cont2
  284.         dbra    d7,.loop2               ;while (--lcount)
  285.         movem.l (sp)+,d0-d3/d5/a0/a1
  286. .loopend
  287.  
  288. *                pspanpackage++;
  289. *        } while (pspanpackage->count != -999999);
  290.  
  291.         lea     PSPANP_SIZEOF(a0),a0    ;pspanpackage++
  292.         cmp.l   #-999999,PSPANP_COUNT(a0) ; while (pspanpackage->count...)
  293.         bne.b   .loop
  294.         movem.l (sp)+,d2-d7/a2-a6
  295.         rts
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305. ******************************************************************************
  306. *
  307. *       void D_PolysetRecursiveTriangle (int *lp1, int *lp2, int *lp3)
  308. *
  309. ******************************************************************************
  310.  
  311.         cnop    0,4
  312. _D_PolysetRecursiveTriangle
  313.  
  314.  
  315. *****   stackframe
  316.  
  317.         rsreset
  318. .new            rs.l    6
  319. .intregs        rs.l    11
  320.         rs.l    1
  321. .lp1            rs.l    1
  322. .lp2            rs.l    1
  323. .lp3            rs.l    1
  324.  
  325.  
  326.         movem.l d2-d7/a2-a6,-(sp)
  327.         sub.l   #.intregs,sp
  328.         move.l  .lp1(sp),a0
  329.         move.l  .lp2(sp),a1
  330.         move.l  .lp3(sp),a2
  331.         lea     _zspantable,a5
  332.         move.l  _d_viewbuffer,a6
  333.         bsr     DoRecursion
  334.         add.l   #.intregs,sp
  335.         movem.l (sp)+,d2-d7/a2-a6
  336.         rts
  337.  
  338. ****** a0 -> lp1
  339. ****** a1 -> lp2
  340. ****** a2 -> lp3
  341.  
  342. DoRecursion
  343.         lea     -6*4(sp),sp
  344.         move.l  sp,a4
  345.  
  346. *        d = lp2[0] - lp1[0];
  347. *        if (d < -1 || d > 1)
  348. *                goto split;
  349. *        d = lp2[1] - lp1[1];
  350. *        if (d < -1 || d > 1)
  351. *                goto split;
  352. *
  353. *        d = lp3[0] - lp2[0];
  354. *        if (d < -1 || d > 1)
  355. *                goto split2;
  356. *        d = lp3[1] - lp2[1];
  357. *        if (d < -1 || d > 1)
  358. *                goto split2;
  359. *
  360. *        d = lp1[0] - lp3[0];
  361. *        if (d < -1 || d > 1)
  362. *                goto split3;
  363. *        d = lp1[1] - lp3[1];
  364. *        if (d < -1 || d > 1)
  365.  
  366.         move.l  (a1),d0
  367.         move.l  (a0),d1
  368.         move.l  1*4(a1),d2
  369.         move.l  1*4(a0),d3
  370.         move.l  d0,d4
  371.         sub.l   d1,d4                   ;d = lp2[0] - lp1[0]
  372.         addq.l  #1,d4
  373.         cmp.l   #2,d4                   ;if (d < -1 || d > 1)
  374.         bhi.b   .split                  ;goto split
  375.         move.l  d2,d5
  376.         sub.l   d3,d5                   ;d = lp2[1] - lp1[1]
  377.         addq.l  #1,d5
  378.         cmp.l   #2,d5                   ;if (d < -1 || d > 1)
  379.         bhi.b   .split                  ;goto split
  380.         move.l  (a2),d4
  381.         move.l  d4,d5
  382.         sub.l   d0,d4                   ;d = lp3[0] - lp2[0]
  383.         addq.l  #1,d4
  384.         cmp.l   #2,d4                   ;if (d < -1 || d > 1)
  385.         bhi.b   .split2                 ;goto split2
  386.         move.l  1*4(a2),d4
  387.         move.l  d4,d6
  388.         sub.l   d2,d4                   ;d = lp3[1] - lp2[1]
  389.         addq.l  #1,d4
  390.         cmp.l   #2,d4                   ;if (d < -1 || d > 1)
  391.         bhi.b   .split2                 ;goto split2
  392.         sub.l   d1,d5                   ;d = lp1[0] - lp3[0]
  393.         addq.l  #1,d5
  394.         cmp.l   #2,d5                   ;if (d < -1 || d > 1)
  395.         bhi.b   .split3                 ;goto split3
  396.         sub.l   d3,d6                   ;d = lp1[1] - lp3[1]
  397.         addq.l  #1,d6
  398.         cmp.l   #2,d6                   ;if (d < -1 || d > 1)
  399.         bls.b   .exit
  400.  
  401. *split3:
  402. *                temp = lp1;
  403. *                lp1 = lp3;
  404. *                lp3 = lp2;
  405. *                lp2 = temp;
  406. *
  407. *                goto split;
  408. *
  409. *split2:
  410. *        temp = lp1;
  411. *        lp1 = lp2;
  412. *        lp2 = lp3;
  413. *        lp3 = temp;
  414.  
  415. .split3
  416.         exg     a1,a2                   ;rotate forward
  417.         exg     a1,a0
  418.         move.l  (a1),d0
  419.         move.l  (a0),d1
  420.         move.l  1*4(a1),d2
  421.         move.l  1*4(a0),d3
  422.         bra.b   .split
  423. .split2
  424.         exg     a1,a0                   ;rotate backward
  425.         exg     a1,a2
  426.         move.l  (a1),d0
  427.         move.l  (a0),d1
  428.         move.l  1*4(a1),d2
  429.         move.l  1*4(a0),d3
  430. .split
  431.  
  432. *        new[0] = (lp1[0] + lp2[0]) >> 1;
  433. *        new[1] = (lp1[1] + lp2[1]) >> 1;
  434. *        new[2] = (lp1[2] + lp2[2]) >> 1;
  435. *        new[3] = (lp1[3] + lp2[3]) >> 1;
  436. *        new[5] = (lp1[5] + lp2[5]) >> 1;
  437.  
  438.         move.l  d0,d4
  439.         move.l  d0,a3
  440.         add.l   d1,d4
  441.         asr.l   #1,d4                   ;d4 = new[0]
  442.         move.l  d2,d5
  443.         add.l   d3,d5
  444.         asr.l   #1,d5                   ;d5 = new[1]
  445.         move.l  2*4(a0),d6
  446.         add.l   2*4(a1),d6
  447.         asr.l   #1,d6                   ;d6 = new[2]
  448.         move.l  3*4(a0),d7
  449.         add.l   3*4(a1),d7
  450.         asr.l   #1,d7                   ;d7 = new[3]
  451.         move.l  5*4(a0),d0
  452.         add.l   5*4(a1),d0
  453.         asr.l   #1,d0                   ;d0 = new[5]
  454.  
  455. *        if (lp2[1] > lp1[1])
  456. *                goto nodraw;
  457. *        if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
  458. *                goto nodraw;
  459.  
  460.         move.l  d4,(a4)+                ;store new[]
  461.         move.l  d5,(a4)+
  462.         move.l  d6,(a4)+
  463.         move.l  d7,(a4)+
  464.         move.l  d0,4(a4)
  465.         lea     -16(a4),a4
  466.         swap    d0                      ;z = new[5]>>16
  467.         cmp.l   d3,d2                   ;if (lp2[1] > lp1[1])
  468.         bgt.b   .nodraw                 ;goto nodraw
  469.         cmp.l   d2,d3                   ;if (lp2[1] == lp1[1)
  470.         bne.b   .draw
  471.         cmp.l   d1,a3                   ;&& (lp2[0] < lp1[0])
  472.         blt.b   .nodraw                 ;goto nodraw
  473. .draw
  474.  
  475. *        z = new[5]>>16;
  476. *        zbuf = zspantable[new[1]] + new[0];
  477. *        if (z >= *zbuf)
  478. *        {
  479. *                int             pix;
  480. *
  481. *                *zbuf = z;
  482. *                pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
  483. *                d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
  484. *        }
  485.  
  486.         move.l  0(a5,d5.l*4),a3
  487.         cmp     0(a3,d4.l*2),d0         ;if (z >= *zbuf)
  488.         blt.b   .nodraw
  489.         move    d0,0(a3,d4.l*2)         ;*zbuf = z
  490.         swap    d6
  491.         swap    d7
  492.         lea     _skintable,a3
  493.         move.l  0(a3,d7.w*4),a3         ;skintable[new[3]]
  494.         move.b  0(a3,d6.w),d2           ;d2 = skintable[new[3]][new[2]>>16]
  495.         and     #$ff,d2
  496.         move.l  _d_pcolormap,a3
  497.         move.b  0(a3,d2.w),d2           ;pix = d_pcolormap[d2]
  498.         lea     _d_scantable,a3
  499.         move.l  0(a3,d5.l*4),d1         ;d_scantable[new[1]]
  500.         add.l   d4,d1                   ;+new[0]
  501.         move.b  d2,0(a6,d1.l)           ;d_viewbuffer[d1] = pix
  502. .nodraw
  503.  
  504. *// recursively continue
  505. *        D_PolysetRecursiveTriangle (lp3, lp1, new);
  506. *        D_PolysetRecursiveTriangle (lp3, new, lp2);
  507.  
  508.         movem.l a1/a2/a4,-(sp)
  509.         move.l  a0,a1
  510.         move.l  a2,a0
  511.         move.l  a4,a2
  512.         bsr     DoRecursion             ;DRT (lp3, lp1, new)
  513.         movem.l (sp)+,a1/a2/a4
  514.         move.l  a2,a0
  515.         move.l  a1,a2
  516.         move.l  a4,a1
  517.         bsr     DoRecursion             ;DRT (lp3, new, lp2)
  518. .exit
  519.         lea     6*4(sp),sp
  520.         rts
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528. ******************************************************************************
  529. *
  530. *       void D_PolysetSetUpForLineScan (fixed8_t startvertu,
  531. *               fixed8_t startvertv, fixed8_t endvertu, fixed8_t endvertv)
  532. *
  533. *       Parameters are transferred in registers d0-d3
  534. ******************************************************************************
  535.  
  536.         cnop    0,4
  537. _D_PolysetSetUpForLineScan
  538.  
  539.  
  540. *****   stackframe
  541.  
  542.         rsreset
  543. .intregs        rs.l    2
  544.         rs.l    1
  545. .startvertu     rs.l    1
  546. .startvertv     rs.l    1
  547. .endvertu       rs.l    1
  548. .endvertv       rs.l    1
  549.  
  550.  
  551. *        errorterm = -1;
  552. *
  553. *        tm = endvertu - startvertu;
  554. *        tn = endvertv - startvertv;
  555.  
  556.         move.l  #-1,_errorterm
  557.         sub.l   d0,d2
  558.         sub.l   d1,d3
  559.         add.l   #15,d2
  560.         add.l   #15,d3
  561.  
  562. *        if (((tm <= 16) && (tm >= -15)) &&
  563. *                ((tn <= 16) && (tn >= -15)))
  564. *        {
  565. *                ptemp = &adivtab[((tm+15) << 5) + (tn+15)];
  566. *                ubasestep = ptemp->quotient;
  567. *                erroradjustup = ptemp->remainder;
  568. *                erroradjustdown = tn;
  569. *        }
  570.  
  571.         cmp.l   #31,d2
  572.         bhi.b   .else
  573.         cmp.l   #31,d3
  574.         bhi.b   .else
  575.         lea     _adivtab,a0
  576.         lsl.l   #5,d2
  577.         add.l   d3,d2
  578.         lea     0(a0,d2.l*8),a0
  579.         move.l  PTEMP_QUOTIENT(a0),_ubasestep
  580.         move.l  PTEMP_REMAINDER(a0),_erroradjustup
  581.         sub.l   #15,d3
  582.         move.l  d3,_erroradjustdown
  583.         bra.b   .exit
  584.  
  585. *        {
  586. *                dm = (double)tm;
  587. *                dn = (double)tn;
  588. *
  589. *                FloorDivMod (dm, dn, &ubasestep, &erroradjustup);
  590. *
  591. *                erroradjustdown = dn;
  592. *        }
  593.  
  594. .else
  595.         sub.l   #15,d2
  596.         sub.l   #15,d3
  597.         fmove.l d2,fp0
  598.         fmove.l d3,fp1
  599.         move.l  #_erroradjustup,-(sp)
  600.         move.l  #_ubasestep,-(sp)
  601.         fmove.d fp1,-(sp)
  602.         fmove.d fp0,-(sp)
  603.         jsr     _FloorDivMod
  604.         add     #24,sp
  605.         move.l  d3,_erroradjustdown
  606. .exit
  607.         rts
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614. *****************************************************************************
  615. *
  616. *       void D_PolysetCalcGradients (int skinwidth)
  617. *
  618. ******************************************************************************
  619.  
  620.         cnop    0,4
  621. _D_PolysetCalcGradients
  622.  
  623.  
  624. *****   stackframe
  625.         rsreset
  626. .fpuregs        rs.x    6
  627. .intregs        rs.l    3
  628.         rs.l    1
  629. .skinwidth      rs.l    1
  630.  
  631. ***** prologue
  632.  
  633.         movem.l d2/d3/a2,-(sp)
  634.         fmovem.x        fp2-fp7,-(sp)
  635.  
  636. *        p00_minus_p20 = r_p0[0] - r_p2[0];
  637. *        p01_minus_p21 = r_p0[1] - r_p2[1];
  638. *        p10_minus_p20 = r_p1[0] - r_p2[0];
  639. *        p11_minus_p21 = r_p1[1] - r_p2[1];
  640. *
  641. *        xstepdenominv = 1.0 / (float)d_xdenom;
  642. *
  643. *        ystepdenominv = -xstepdenominv;
  644.  
  645.         lea     _r_p2,a0
  646.         lea     _r_p1,a1
  647.         lea     _r_p0,a2
  648.         move.l  (a2),d0
  649.         move.l  1*4(a2),d1
  650.         move.l  (a0),d2
  651.         sub.l   d2,d0
  652.         fmove.l d0,fp0                  ;fp0 = p00_minus_p20
  653.         move.l  1*4(a0),d3
  654.         sub.l   d3,d1
  655.         fmove.l d1,fp1                  ;fp1 = p01_minus_p21
  656.         sub.l   (a1),d2
  657.         neg.l   d2
  658.         fmove.l d2,fp2                  ;fp2 = p10_minus_p20
  659.         sub.l   4(a1),d3
  660.         neg.l   d3
  661.         fmove.l d3,fp3                  ;fp3 = p11_minus_p21
  662.  
  663.         fmove.l _d_xdenom,fp4
  664.         fmove.s #1,fp5
  665.         fdiv    fp4,fp5                 ;fp5 = 1.0 / (float)d_xdenom
  666.         fneg    fp5,fp6                 ;fp6 = ystepdenominv
  667.         fmul    fp5,fp1
  668.         fmul    fp5,fp3
  669.         fmul    fp6,fp0
  670.         fmul    fp6,fp2
  671.  
  672. *        t0 = r_p0[4] - r_p2[4];
  673. *        t1 = r_p1[4] - r_p2[4];
  674. *        r_lstepx = (int)
  675. *                        ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
  676. *        r_lstepy = (int)
  677. *                        ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
  678.  
  679.         fmove.l fpcr,d2
  680.         fmove.l #$000000b0,fpcr
  681.         move.l  4*4(a0),d0
  682.         move.l  d0,d1
  683.         sub.l   4*4(a2),d0
  684.         neg.l   d0
  685.         fmove.l d0,fp4                  ;fp4 = t0
  686.         sub.l   4*4(a1),d1
  687.         neg.l   d1
  688.         fmove.l d1,fp5                  ;fp5 = t1
  689.         fmove   fp4,fp6
  690.         fmul    fp3,fp6
  691.         fmove   fp5,fp7
  692.         fmul    fp1,fp7
  693.         fsub    fp6,fp7
  694.         fmove.l fp7,_r_lstepx
  695.         fmul    fp2,fp4
  696.         fmul    fp0,fp5
  697.         fsub    fp4,fp5
  698.         fmove.l fp5,_r_lstepy
  699.         fmove.l d2,fpcr
  700.  
  701. *        t0 = r_p0[2] - r_p2[2];
  702. *        t1 = r_p1[2] - r_p2[2];
  703. *        r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  704. *                        xstepdenominv);
  705. *        r_sstepy = (int)((t1 * p00_minus_p20 - t0* p10_minus_p20) *
  706. *                        ystepdenominv);
  707.  
  708.         move.l  2*4(a0),d0
  709.         move.l  d0,d1
  710.         sub.l   2*4(a2),d0
  711.         neg.l   d0
  712.         fmove.l d0,fp4                  ;fp4 = t0
  713.         sub.l   2*4(a1),d1
  714.         neg.l   d1
  715.         fmove.l d1,fp5                  ;fp5 = t1
  716.         fmove   fp4,fp6
  717.         fmul    fp3,fp6
  718.         fmove   fp5,fp7
  719.         fmul    fp1,fp7
  720.         fsub    fp6,fp7
  721.         fmove.l fp7,d2
  722.         move.l  d2,_r_sstepx
  723.         fmul    fp2,fp4
  724.         fmul    fp0,fp5
  725.         fsub    fp4,fp5
  726.         fmove.l fp5,_r_sstepy
  727.  
  728. *        t0 = r_p0[3] - r_p2[3];
  729. *        t1 = r_p1[3] - r_p2[3];
  730. *        r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  731. *                        xstepdenominv);
  732. *        r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
  733. *                        ystepdenominv);
  734.  
  735.         move.l  3*4(a0),d0
  736.         move.l  d0,d1
  737.         sub.l   3*4(a2),d0
  738.         neg.l   d0
  739.         fmove.l d0,fp4                  ;fp4 = t0
  740.         sub.l   3*4(a1),d1
  741.         neg.l   d1
  742.         fmove.l d1,fp5                  ;fp5 = t1
  743.         fmove   fp4,fp6
  744.         fmul    fp3,fp6
  745.         fmove   fp5,fp7
  746.         fmul    fp1,fp7
  747.         fsub    fp6,fp7
  748.         fmove.l fp7,d3
  749.         move.l  d3,_r_tstepx
  750.         fmul    fp2,fp4
  751.         fmul    fp0,fp5
  752.         fsub    fp4,fp5
  753.         fmove.l fp5,_r_tstepy
  754.  
  755. *        t0 = r_p0[5] - r_p2[5];
  756. *        t1 = r_p1[5] - r_p2[5];
  757. *        r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  758. *                        xstepdenominv);
  759. *        r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
  760. *                        ystepdenominv);
  761.  
  762.         move.l  5*4(a0),d0
  763.         move.l  d0,d1
  764.         sub.l   5*4(a2),d0
  765.         neg.l   d0
  766.         fmove.l d0,fp4                  ;fp4 = t0
  767.         sub.l   5*4(a1),d1
  768.         neg.l   d1
  769.         fmove.l d1,fp5                  ;fp5 = t1
  770.         fmove   fp4,fp6
  771.         fmul    fp3,fp6
  772.         fmove   fp5,fp7
  773.         fmul    fp1,fp7
  774.         fsub    fp6,fp7
  775.         fmove.l fp7,_r_zistepx
  776.         fmul    fp2,fp4
  777.         fmul    fp0,fp5
  778.         fsub    fp4,fp5
  779.         fmove.l fp5,_r_zistepy
  780.  
  781. *        a_sstepxfrac = r_sstepx & 0xFFFF;
  782. *        a_tstepxfrac = r_tstepx & 0xFFFF;
  783. *        a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16);
  784.  
  785.         move.l  .skinwidth(sp),d0
  786.         swap    d3
  787.         muls    d3,d0
  788.         clr     d3
  789.         swap    d3
  790.         move.l  d2,d1
  791.         swap    d1
  792.         ext.l   d1
  793.         add.l   d1,d0
  794.         and.l   #$ffff,d2
  795.         move.l  d2,_a_sstepxfrac
  796.         move.l  d3,_a_tstepxfrac
  797.         move.l  d0,_a_ststepxwhole
  798.         fmovem.x        (sp)+,fp2-fp7
  799.         movem.l (sp)+,d2/d3/a2
  800.         rts
  801.  
  802.  
  803.  
  804.  
  805. ******************************************************************************
  806. *
  807. *       void D_RasterizeAliasPolySmooth (void)
  808. *
  809. ******************************************************************************
  810.         cnop    0,4
  811. _D_RasterizeAliasPolySmooth
  812.  
  813. *****   stackframe
  814.         rsreset
  815. .pdestx         rs.l    1
  816. .pzx            rs.l    1
  817. .aspanx         rs.l    1
  818. .ptexx          rs.l    1
  819. .sfracx         rs.l    1
  820. .tfracx         rs.l    1
  821. .lightx         rs.l    1
  822. .zix            rs.l    1
  823. .pdestb         rs.l    1
  824. .pzb            rs.l    1
  825. .aspanb         rs.l    1
  826. .ptexb          rs.l    1
  827. .sfracb         rs.l    1
  828. .tfracb         rs.l    1
  829. .lightb         rs.l    1
  830. .zib            rs.l    1
  831. .r_affine       rs.l    1
  832. .height         rs.l    1
  833. .initLH         rs.l    1
  834. .initRH         rs.l    1
  835. .savearea       rs.l    11
  836. .intregs        rs.l    11
  837.         rs.l    1
  838.  
  839.         movem.l d2-d7/a2-a6,-(sp)
  840.         sub     #.intregs,sp
  841.  
  842. *        plefttop = pedgetable->pleftedgevert0;
  843. *        prighttop = pedgetable->prightedgevert0;
  844. *
  845. *        pleftbottom = pedgetable->pleftedgevert1;
  846. *        prightbottom = pedgetable->prightedgevert1;
  847. *
  848. *        initialleftheight = pleftbottom[1] - plefttop[1];
  849. *        initialrightheight = prightbottom[1] - prighttop[1];
  850.  
  851.         move.l  _pedgetable,a0
  852.         move.l  ETAB_PLEV0(a0),a6       ;a6 = plefttop
  853.         move.l  ETAB_PREV0(a0),a2       ;a2 = prighttop
  854.         move.l  ETAB_PLEV1(a0),a3       ;a3 = pleftbottom
  855.         move.l  ETAB_PREV1(a0),a4       ;a4 = prightbottom
  856.         lea     _r_affinetridesc,a5
  857.         move.l  4(a3),d6
  858.         move.l  4(a6),d7                ;d7 = plefttop[1]
  859.         move.l  d6,d2
  860.         sub.l   d7,d2
  861.         move.l  d2,.initLH(sp)          ;initialleftheight
  862.         move.l  4(a4),d3
  863.         move.l  4(a2),d4
  864.         move.l  d3,d5
  865.         sub.l   d4,d5
  866.         move.l  d5,.initRH(sp)          ;initialrightheight
  867.         move.l  R_SKINWIDTH(a5),d4
  868.         move.l  d4,.r_affine(sp)
  869.         move.l  d4,-(sp)
  870.         bsr     _D_PolysetCalcGradients
  871.         addq    #4,sp
  872.         move.l  d6,d3
  873.         move.l  (a3),d2
  874.         move.l  d7,d1
  875.         move.l  (a6),d0
  876.         bsr     _D_PolysetSetUpForLineScan
  877.  
  878. *        d_pedgespanpackage = a_spans;
  879. *
  880. *        ystart = plefttop[1];
  881. *        d_aspancount = plefttop[0] - prighttop[0];
  882. *
  883. *        d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
  884. *                        (plefttop[3] >> 16) * r_affinetridesc.skinwidth;
  885. *        d_sfrac = plefttop[2] & 0xFFFF;
  886. *        d_tfrac = plefttop[3] & 0xFFFF;
  887. *        d_pzbasestep = d_zwidth + ubasestep;
  888. *        d_pzextrastep = d_pzbasestep + 1;
  889. *        d_light = plefttop[4];
  890. *        d_zi = plefttop[5];
  891. *
  892. *        d_pdestbasestep = screenwidth + ubasestep;
  893. *        d_pdestextrastep = d_pdestbasestep + 1;
  894. *        d_pdest = (byte *)d_viewbuffer +
  895. *                        ystart * screenwidth + plefttop[0];
  896. *        d_pz = d_pzbuffer + ystart * d_zwidth + plefttop[0];
  897.  
  898.         move.l  _a_spans,_d_pedgespanpackage
  899.         move.l  (a6),d2
  900.         sub.l   (a2),d2
  901.         move.l  d2,_d_aspancount        ;d_aspancount = plefttop[0] - ...
  902.         move.l  2*4(a6),d0
  903.         move.l  3*4(a6),d1
  904.         move.l  d0,d3                   ;d3 = plefttop[2]
  905.         move.l  d1,d6                   ;d6 = plefttop[3]
  906.         swap    d0
  907.         swap    d1
  908.         and.l   #$ffff,d0
  909.         and.l   #$ffff,d1
  910.         mulu    d4,d1
  911.         add.l   d0,d1
  912.         add.l   R_PSKIN(a5),d1
  913.         move.l  d1,_d_ptex              ;d_ptex = ...
  914.         and.l   #$ffff,d3
  915.         and.l   #$ffff,d6
  916.         move.l  d3,_d_sfrac             ;d_sfrac = plefttop[2]&$ffff
  917.         move.l  d6,_d_tfrac             ;d_tfrac = plefttop[3]&$ffff
  918.         move.l  _d_zwidth,d0
  919.         move.l  d0,d3                   ;d3 = d_zwidth
  920.         move.l  _ubasestep,d1
  921.         move.l  d1,.aspanb(sp)
  922.         move.l  d1,d5                   ;d5 = ubasestep
  923.         add.l   d1,d0
  924.         addq.l  #1,d1
  925.         move.l  d1,_d_countextrastep
  926.         move.l  d1,.aspanx(sp)
  927.         add.l   d0,d0
  928.         move.l  d0,.pzb(sp)             ;d_pzbasestep = d_zwidth + ubasestep
  929.         addq.l  #2,d0
  930.         move.l  d0,.pzx(sp)             ;d_pzextrastep = d_pzbasestep + 1
  931.         move.l  4*4(a6),_d_light        ;d_light = plefttop[4]
  932.         move.l  5*4(a6),_d_zi           ;d_zi = plefttop[5]
  933.         move.l  _screenwidth,d0
  934.         add.l   d0,d1
  935.         move.l  d1,.pdestx(sp)          ;d_pdestextrastep = ...
  936.         subq.l  #1,d1
  937.         move.l  d1,.pdestb(sp)          ;d_pdestbasestep = screenwidth + ..
  938.         mulu    d7,d0                   ;screenwidth * ystart
  939.         move.l  (a6),d6
  940.         add.l   d6,d0                   ;+ plefttop[0]
  941.         add.l   _d_viewbuffer,d0
  942.         move.l  d0,_d_pdest             ;d_pdest + d_viewbuffer + ...
  943.         mulu    d7,d3                   ;d_zwidth * ystart
  944.         add.l   d6,d3                   ;+ plefttop[0]
  945.         add.l   d3,d3
  946.         add.l   _d_pzbuffer,d3
  947.         move.l  d3,_d_pz                ;d_pz = d_pzbuffer + ...
  948.  
  949. *        if (ubasestep < 0)
  950. *                working_lstepx = r_lstepx - 1;
  951. *        else
  952. *                working_lstepx = r_lstepx;
  953. *
  954. *        d_countextrastep = ubasestep + 1;
  955. *        d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> 16) +
  956. *                        ((r_tstepy + r_tstepx * ubasestep) >> 16) *
  957. *                        r_affinetridesc.skinwidth;
  958. *        d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF;
  959. *        d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF;
  960. *        d_lightbasestep = r_lstepy + working_lstepx * ubasestep;
  961. *        d_zibasestep = r_zistepy + r_zistepx * ubasestep;
  962. *
  963. *        d_ptexextrastep = ((r_sstepy + r_sstepx * d_countextrastep) >> 16) +
  964. *                        ((r_tstepy + r_tstepx * d_countextrastep) >> 16) *
  965. *                        r_affinetridesc.skinwidth;
  966. *        d_sfracextrastep = (r_sstepy + r_sstepx*d_countextrastep) & 0xFFFF;
  967. *        d_tfracextrastep = (r_tstepy + r_tstepx*d_countextrastep) & 0xFFFF;
  968. *        d_lightextrastep = d_lightbasestep + working_lstepx;
  969. *        d_ziextrastep = d_zibasestep + r_zistepx;
  970. *
  971.  
  972.         move.l  _r_sstepy,a0
  973.         move.l  _r_sstepx,d1
  974.         move.l  _r_tstepy,a1
  975.         move.l  _r_tstepx,d6
  976.         move.l  d1,d2
  977.         muls.l  d5,d2
  978.         move.l  d6,d7
  979.         muls.l  d5,d7
  980.         add.l   a0,d2
  981.         add.l   a1,d7
  982.         move.l  d2,d0
  983.         move.l  d7,d3
  984.         and.l   #$ffff,d0
  985.         move.l  d0,.sfracb(sp)
  986.         and.l   #$ffff,d3
  987.         swap    d3
  988.         move.l  d3,.tfracb(sp)
  989.         swap    d3
  990.         add.l   d1,d0
  991.         add.l   d6,d3
  992.         and.l   #$ffff,d0
  993.         move.l  d0,.sfracx(sp)
  994.         and.l   #$ffff,d3
  995.         swap    d3
  996.         move.l  d3,.tfracx(sp)
  997.         swap    d3
  998.         move.l  d2,d0
  999.         move.l  d7,d3
  1000.         swap    d2
  1001.         ext.l   d2
  1002.         swap    d7
  1003.         muls    d4,d7
  1004.         add.l   d2,d7
  1005.         move.l  d7,.ptexb(sp)
  1006.         add.l   d1,d0
  1007.         add.l   d6,d3
  1008.         swap    d0
  1009.         ext.l   d0
  1010.         swap    d3
  1011.         muls    d4,d3
  1012.         add.l   d0,d3
  1013.         move.l  d3,.ptexx(sp)
  1014.         move.l  _r_lstepy,d0
  1015.         move.l  _r_lstepx,d1
  1016.         tst.l   d5                      ;(if ubasestep < 0)
  1017.         bge.b   .ge
  1018.         subq.l  #1,d1                   ;working_lstepx = r_lstepx - 1
  1019. .ge
  1020.         move.l  d1,d2
  1021.         muls.l  d5,d1
  1022.         add.l   d0,d1
  1023.         move.l  d1,.lightb(sp)
  1024.         add.l   d2,d1
  1025.         move.l  d1,.lightx(sp)
  1026.         move.l  _r_zistepy,d0
  1027.         move.l  _r_zistepx,d1
  1028.         move.l  d1,d2
  1029.         muls.l  d5,d1
  1030.         add.l   d0,d1
  1031.         move.l  d1,.zib(sp)
  1032.         add.l   d2,d1
  1033.         move.l  d1,.zix(sp)
  1034.  
  1035.  
  1036.  
  1037. *****   D_PolysetScanLeftEdge (inlined)
  1038.  
  1039.  
  1040.         movem.l d2-d7/a2-a6,.savearea(sp)
  1041.         move.l  _d_pedgespanpackage,a0
  1042.         move.l  _d_pdest,a1
  1043.         move.l  _d_pz,a2
  1044.         move.l  _d_aspancount,d6
  1045.         move.l  _d_ptex,a3
  1046.         move.l  _d_sfrac,d4
  1047.         move.l  _d_tfrac,d5
  1048.         swap    d5
  1049.         move.l  _d_light,a5
  1050.         move.l  _d_zi,a4
  1051.         move.l  _errorterm,d2
  1052.         move.l  _erroradjustup,d1
  1053.         move.l  _erroradjustdown,d0
  1054.         move.l  .initLH(sp),d7
  1055.         subq    #1,d7
  1056. .loopA
  1057.  
  1058. *                d_pedgespanpackage->pdest = d_pdest;
  1059. *                d_pedgespanpackage->pz = d_pz;
  1060. *                d_pedgespanpackage->count = d_aspancount;
  1061. *                d_pedgespanpackage->ptex = d_ptex;
  1062. *
  1063. *                d_pedgespanpackage->sfrac = d_sfrac;
  1064. *                d_pedgespanpackage->tfrac = d_tfrac;
  1065. *
  1066. *                d_pedgespanpackage->light = d_light;
  1067. *                d_pedgespanpackage->zi = d_zi;
  1068. *
  1069. *                d_pedgespanpackage++;
  1070. *
  1071. *                errorterm += erroradjustup;
  1072. *                if (errorterm >= 0)
  1073.  
  1074.         move.l  a1,(a0)+
  1075.         move.l  a2,(a0)+
  1076.         move.l  d6,(a0)+
  1077.         move.l  a3,(a0)+
  1078.         move.l  d4,(a0)+
  1079.         swap    d5
  1080.         clr     (a0)+
  1081.         move    d5,(a0)+
  1082.         swap    d5
  1083.         move.l  a5,(a0)+
  1084.         move.l  a4,(a0)+
  1085.         add.l   d1,d2
  1086.         blt.b   .elseA
  1087.  
  1088. *                        d_pdest += d_pdestextrastep;
  1089. *                        d_pz += d_pzextrastep;
  1090. *                        d_aspancount += d_countextrastep;
  1091. *                        d_ptex += d_ptexextrastep;
  1092. *                        d_sfrac += d_sfracextrastep;
  1093. *                        d_ptex += d_sfrac >> 16;
  1094. *
  1095. *                        d_sfrac &= 0xFFFF;
  1096. *                        d_tfrac += d_tfracextrastep;
  1097. *                        if (d_tfrac & 0x10000)
  1098. *                        {
  1099. *                                d_ptex += r_affinetridesc.skinwidth;
  1100. *                                d_tfrac &= 0xFFFF;
  1101. *                        }
  1102. *                        d_light += d_lightextrastep;
  1103. *                        d_zi += d_ziextrastep;
  1104. *                        errorterm -= erroradjustdown;
  1105.  
  1106.         lea     .pdestx(sp),a6
  1107.         add.l   (a6)+,a1
  1108.         add.l   (a6)+,a2
  1109.         add.l   (a6)+,d6
  1110.         add.l   (a6)+,a3
  1111.         add.l   (a6)+,d4
  1112.         swap    d4
  1113.         add     d4,a3
  1114.         clr     d4
  1115.         swap    d4
  1116.         add.l   (a6)+,d5
  1117.         bcc.b   .contA
  1118.         add.l   .r_affine(sp),a3
  1119. .contA
  1120.         add.l   (a6)+,a5
  1121.         add.l   (a6)+,a4
  1122.         sub.l   d0,d2
  1123.         bra.b   .nextA
  1124. .elseA
  1125.  
  1126. *                        d_pdest += d_pdestbasestep;
  1127. *                        d_pz += d_pzbasestep;
  1128. *                        d_aspancount += ubasestep;
  1129. *                        d_ptex += d_ptexbasestep;
  1130. *                        d_sfrac += d_sfracbasestep;
  1131. *                        d_ptex += d_sfrac >> 16;
  1132. *                        d_sfrac &= 0xFFFF;
  1133. *                        d_tfrac += d_tfracbasestep;
  1134. *                        if (d_tfrac & 0x10000)
  1135. *                        {
  1136. *                                d_ptex += r_affinetridesc.skinwidth;
  1137. *                                d_tfrac &= 0xFFFF;
  1138. *                        }
  1139. *                        d_light += d_lightbasestep;
  1140. *                        d_zi += d_zibasestep;
  1141.  
  1142.         lea     .pdestb(sp),a6
  1143.         add.l   (a6)+,a1
  1144.         add.l   (a6)+,a2
  1145.         add.l   (a6)+,d6
  1146.         add.l   (a6)+,a3
  1147.         add.l   (a6)+,d4
  1148.         swap    d4
  1149.         add     d4,a3
  1150.         clr     d4
  1151.         swap    d4
  1152.         add.l   (a6)+,d5
  1153.         bcc.b   .cont2A
  1154.         add.l   .r_affine(sp),a3
  1155. .cont2A
  1156.         add.l   (a6)+,a5
  1157.         add.l   (a6)+,a4
  1158. .nextA
  1159.         dbra    d7,.loopA
  1160.         move.l  a0,_d_pedgespanpackage
  1161.         movem.l .savearea(sp),d2-d7/a2-a6
  1162.  
  1163. ******  End of D_PolysetScanLeftEdge
  1164.  
  1165.  
  1166.  
  1167.  
  1168. *        if (pedgetable->numleftedges == 2)
  1169. *        {
  1170. *                int             height;
  1171. *
  1172. *                plefttop = pleftbottom;
  1173. *                pleftbottom = pedgetable->pleftedgevert2;
  1174. *
  1175. *                D_PolysetSetUpForLineScan(plefttop[0], plefttop[1],
  1176. *                                                          pleftbottom[0], pleftbottom[1]);
  1177. *
  1178. *                height = pleftbottom[1] - plefttop[1];
  1179. *
  1180. *// TODO: make this a function; modularize this function in general
  1181. *
  1182. *                ystart = plefttop[1];
  1183. *                d_aspancount = plefttop[0] - prighttop[0];
  1184. *                d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
  1185. *                                (plefttop[3] >> 16) * r_affinetridesc.skinwidth;
  1186. *                d_sfrac = 0;
  1187. *                d_tfrac = 0;
  1188. *                d_light = plefttop[4];
  1189. *                d_zi = plefttop[5];
  1190. *
  1191. *                d_pdestbasestep = screenwidth + ubasestep;
  1192. *                d_pdestextrastep = d_pdestbasestep + 1;
  1193. *                d_pdest = (byte *)d_viewbuffer + ystart * screenwidth + plefttop[0];
  1194. *                d_pzbasestep = d_zwidth + ubasestep;
  1195. *                d_pzextrastep = d_pzbasestep + 1;
  1196. *                d_pz = d_pzbuffer + ystart * d_zwidth + plefttop[0];
  1197. *
  1198. *                if (ubasestep < 0)
  1199. *                        working_lstepx = r_lstepx - 1;
  1200. *                else
  1201. *                        working_lstepx = r_lstepx;
  1202. *
  1203. *                d_countextrastep = ubasestep + 1;
  1204. *                d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> 16) +
  1205. *                                ((r_tstepy + r_tstepx * ubasestep) >> 16) *
  1206. *                                r_affinetridesc.skinwidth;
  1207. *                d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF;
  1208. *                d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF;
  1209. *                d_lightbasestep = r_lstepy + working_lstepx * ubasestep;
  1210. *                d_zibasestep = r_zistepy + r_zistepx * ubasestep;
  1211. *
  1212. *                d_ptexextrastep = ((r_sstepy + r_sstepx * d_countextrastep) >> 16) +
  1213. *                                ((r_tstepy + r_tstepx * d_countextrastep) >> 16) *
  1214. *                                r_affinetridesc.skinwidth;
  1215. *                d_sfracextrastep = (r_sstepy+r_sstepx*d_countextrastep) & 0xFFFF;
  1216. *                d_tfracextrastep = (r_tstepy+r_tstepx*d_countextrastep) & 0xFFFF;
  1217. *                d_lightextrastep = d_lightbasestep + working_lstepx;
  1218. *                d_ziextrastep = d_zibasestep + r_zistepx;
  1219.  
  1220.  
  1221.         move.l  _pedgetable,a0
  1222.         cmp.l   #2,ETAB_NUMLEFTEDGES(a0)
  1223.         bne.b   .cont
  1224.         move.l  a3,a6
  1225.         move.l  ETAB_PLEV2(a0),a3
  1226.         move.l  4(a3),d5
  1227.         move.l  d5,d3
  1228.         move.l  (a3),d2
  1229.         move.l  4(a6),d7
  1230.         move.l  d7,d1
  1231.         move.l  (a6),d6
  1232.         move.l  d6,d0
  1233.         bsr     _D_PolysetSetUpForLineScan
  1234.         sub.l   d7,d5
  1235.         move.l  d5,.height(sp)
  1236.         sub.l   (a2),d6
  1237.         move.l  d6,_d_aspancount        ;d_aspancount = plefttop[0] - ...
  1238.  
  1239.         move.l  2*4(a6),d0
  1240.         move.l  3*4(a6),d1
  1241.         move.l  d0,d3                   ;d3 = plefttop[2]
  1242.         move.l  d1,d6                   ;d6 = plefttop[3]
  1243.         swap    d0
  1244.         swap    d1
  1245.         and.l   #$ffff,d0
  1246.         and.l   #$ffff,d1
  1247.         mulu    d4,d1
  1248.         add.l   d0,d1
  1249.         add.l   R_PSKIN(a5),d1
  1250.         move.l  d1,_d_ptex              ;d_ptex = ...
  1251.         clr.l   _d_sfrac
  1252.         clr.l   _d_tfrac
  1253.         move.l  _d_zwidth,d0
  1254.         move.l  d0,d3                   ;d3 = d_zwidth
  1255.         move.l  _ubasestep,d1
  1256.         move.l  d1,.aspanb(sp)
  1257.         move.l  d1,d5                   ;d5 = ubasestep
  1258.         add.l   d1,d0
  1259.         addq.l  #1,d1
  1260.         move.l  d1,_d_countextrastep
  1261.         move.l  d1,.aspanx(sp)
  1262.         add.l   d0,d0
  1263.         move.l  d0,.pzb(sp)             ;d_pzbasestep = d_zwidth + ubasestep
  1264.         addq.l  #2,d0
  1265.         move.l  d0,.pzx(sp)             ;d_pzextrastep = d_pzbasestep + 1
  1266.         move.l  4*4(a6),_d_light        ;d_light = plefttop[4]
  1267.         move.l  5*4(a6),_d_zi           ;d_zi = plefttop[5]
  1268.         move.l  _screenwidth,d0
  1269.         add.l   d0,d1
  1270.         move.l  d1,.pdestx(sp)          ;d_pdestextrastep = ...
  1271.         subq.l  #1,d1
  1272.         move.l  d1,.pdestb(sp)          ;d_pdestbasestep = screenwidth + ..
  1273.         mulu    d7,d0                   ;screenwidth * ystart
  1274.         move.l  (a6),d6
  1275.         add.l   d6,d0                   ;+ plefttop[0]
  1276.         add.l   _d_viewbuffer,d0
  1277.         move.l  d0,_d_pdest             ;d_pdest + d_viewbuffer + ...
  1278.         mulu    d7,d3                   ;d_zwidth * ystart
  1279.         add.l   d6,d3                   ;+ plefttop[0]
  1280.         add.l   d3,d3
  1281.         add.l   _d_pzbuffer,d3
  1282.         move.l  d3,_d_pz                ;d_pz = d_pzbuffer + ...
  1283.  
  1284.         move.l  _r_sstepy,a0
  1285.         move.l  _r_sstepx,d1
  1286.         move.l  _r_tstepy,a1
  1287.         move.l  _r_tstepx,d6
  1288.         move.l  d1,d2
  1289.         muls.l  d5,d2
  1290.         move.l  d6,d7
  1291.         muls.l  d5,d7
  1292.         add.l   a0,d2
  1293.         add.l   a1,d7
  1294.         move.l  d2,d0
  1295.         move.l  d7,d3
  1296.         and.l   #$ffff,d0
  1297.         move.l  d0,.sfracb(sp)
  1298.         and.l   #$ffff,d3
  1299.         swap    d3
  1300.         move.l  d3,.tfracb(sp)
  1301.         swap    d3
  1302.         add.l   d1,d0
  1303.         add.l   d6,d3
  1304.         and.l   #$ffff,d0
  1305.         move.l  d0,.sfracx(sp)
  1306.         and.l   #$ffff,d3
  1307.         swap    d3
  1308.         move.l  d3,.tfracx(sp)
  1309.         swap    d3
  1310.         move.l  d2,d0
  1311.         move.l  d7,d3
  1312.         swap    d2
  1313.         ext.l   d2
  1314.         swap    d7
  1315.         muls    d4,d7
  1316.         add.l   d2,d7
  1317.         move.l  d7,.ptexb(sp)
  1318.         add.l   d1,d0
  1319.         add.l   d6,d3
  1320.         swap    d0
  1321.         ext.l   d0
  1322.         swap    d3
  1323.         muls    d4,d3
  1324.         add.l   d0,d3
  1325.         move.l  d3,.ptexx(sp)
  1326.         move.l  _r_lstepy,d0
  1327.         move.l  _r_lstepx,d1
  1328.         tst.l   d5                      ;(if ubasestep < 0)
  1329.         bge.b   .ge2
  1330.         subq.l  #1,d1                   ;working_lstepx = r_lstepx - 1
  1331. .ge2
  1332.         move.l  d1,d2
  1333.         muls.l  d5,d1
  1334.         add.l   d0,d1
  1335.         move.l  d1,.lightb(sp)
  1336.         add.l   d2,d1
  1337.         move.l  d1,.lightx(sp)
  1338.         move.l  _r_zistepy,d0
  1339.         move.l  _r_zistepx,d1
  1340.         move.l  d1,d2
  1341.         muls.l  d5,d1
  1342.         add.l   d0,d1
  1343.         move.l  d1,.zib(sp)
  1344.         add.l   d2,d1
  1345.         move.l  d1,.zix(sp)
  1346.  
  1347.  
  1348. *****   D_PolysetScanLeftEdge (inlined)
  1349.  
  1350.  
  1351.         movem.l d2-d7/a2-a6,.savearea(sp)
  1352.         move.l  _d_pedgespanpackage,a0
  1353.         move.l  _d_pdest,a1
  1354.         move.l  _d_pz,a2
  1355.         move.l  _d_aspancount,d6
  1356.         move.l  _d_ptex,a3
  1357.         move.l  _d_sfrac,d4
  1358.         move.l  _d_tfrac,d5
  1359.         swap    d5
  1360.         move.l  _d_light,a5
  1361.         move.l  _d_zi,a4
  1362.         move.l  _errorterm,d2
  1363.         move.l  _erroradjustup,d1
  1364.         move.l  _erroradjustdown,d0
  1365.         move.l  .height(sp),d7
  1366.         subq    #1,d7
  1367. .loopB
  1368.  
  1369. *                d_pedgespanpackage->pdest = d_pdest;
  1370. *                d_pedgespanpackage->pz = d_pz;
  1371. *                d_pedgespanpackage->count = d_aspancount;
  1372. *                d_pedgespanpackage->ptex = d_ptex;
  1373. *
  1374. *                d_pedgespanpackage->sfrac = d_sfrac;
  1375. *                d_pedgespanpackage->tfrac = d_tfrac;
  1376. *
  1377. *                d_pedgespanpackage->light = d_light;
  1378. *                d_pedgespanpackage->zi = d_zi;
  1379. *
  1380. *                d_pedgespanpackage++;
  1381. *
  1382. *                errorterm += erroradjustup;
  1383. *                if (errorterm >= 0)
  1384.  
  1385.         move.l  a1,(a0)+
  1386.         move.l  a2,(a0)+
  1387.         move.l  d6,(a0)+
  1388.         move.l  a3,(a0)+
  1389.         move.l  d4,(a0)+
  1390.         swap    d5
  1391.         clr     (a0)+
  1392.         move    d5,(a0)+
  1393.         swap    d5
  1394.         move.l  a5,(a0)+
  1395.         move.l  a4,(a0)+
  1396.         add.l   d1,d2
  1397.         blt.b   .elseB
  1398.  
  1399. *                        d_pdest += d_pdestextrastep;
  1400. *                        d_pz += d_pzextrastep;
  1401. *                        d_aspancount += d_countextrastep;
  1402. *                        d_ptex += d_ptexextrastep;
  1403. *                        d_sfrac += d_sfracextrastep;
  1404. *                        d_ptex += d_sfrac >> 16;
  1405. *
  1406. *                        d_sfrac &= 0xFFFF;
  1407. *                        d_tfrac += d_tfracextrastep;
  1408. *                        if (d_tfrac & 0x10000)
  1409. *                        {
  1410. *                                d_ptex += r_affinetridesc.skinwidth;
  1411. *                                d_tfrac &= 0xFFFF;
  1412. *                        }
  1413. *                        d_light += d_lightextrastep;
  1414. *                        d_zi += d_ziextrastep;
  1415. *                        errorterm -= erroradjustdown;
  1416.  
  1417.         lea     .pdestx(sp),a6
  1418.         add.l   (a6)+,a1
  1419.         add.l   (a6)+,a2
  1420.         add.l   (a6)+,d6
  1421.         add.l   (a6)+,a3
  1422.         add.l   (a6)+,d4
  1423.         swap    d4
  1424.         add     d4,a3
  1425.         clr     d4
  1426.         swap    d4
  1427.         add.l   (a6)+,d5
  1428.         bcc.b   .contB
  1429.         add.l   .r_affine(sp),a3
  1430. .contB
  1431.         add.l   (a6)+,a5
  1432.         add.l   (a6)+,a4
  1433.         sub.l   d0,d2
  1434.         bra.b   .nextB
  1435. .elseB
  1436.  
  1437. *                        d_pdest += d_pdestbasestep;
  1438. *                        d_pz += d_pzbasestep;
  1439. *                        d_aspancount += ubasestep;
  1440. *                        d_ptex += d_ptexbasestep;
  1441. *                        d_sfrac += d_sfracbasestep;
  1442. *                        d_ptex += d_sfrac >> 16;
  1443. *                        d_sfrac &= 0xFFFF;
  1444. *                        d_tfrac += d_tfracbasestep;
  1445. *                        if (d_tfrac & 0x10000)
  1446. *                        {
  1447. *                                d_ptex += r_affinetridesc.skinwidth;
  1448. *                                d_tfrac &= 0xFFFF;
  1449. *                        }
  1450. *                        d_light += d_lightbasestep;
  1451. *                        d_zi += d_zibasestep;
  1452.  
  1453.         lea     .pdestb(sp),a6
  1454.         add.l   (a6)+,a1
  1455.         add.l   (a6)+,a2
  1456.         add.l   (a6)+,d6
  1457.         add.l   (a6)+,a3
  1458.         add.l   (a6)+,d4
  1459.         swap    d4
  1460.         add     d4,a3
  1461.         clr     d4
  1462.         swap    d4
  1463.         add.l   (a6)+,d5
  1464.         bcc.b   .cont2B
  1465.         add.l   .r_affine(sp),a3
  1466. .cont2B
  1467.         add.l   (a6)+,a5
  1468.         add.l   (a6)+,a4
  1469. .nextB
  1470.         dbra    d7,.loopB
  1471.         move.l  a0,_d_pedgespanpackage
  1472.         movem.l .savearea(sp),d2-d7/a2-a6
  1473.  
  1474.  
  1475. .cont
  1476.  
  1477. *        d_pedgespanpackage = a_spans;
  1478. *
  1479. *        D_PolysetSetUpForLineScan(prighttop[0], prighttop[1],
  1480. *                                                  prightbottom[0], prightbottom[1]);
  1481. *        d_aspancount = 0;
  1482. *        d_countextrastep = ubasestep + 1;
  1483. *        originalcount = a_spans[initialrightheight].count;
  1484. *        a_spans[initialrightheight].count = -999999; // mark end of the spanpackages
  1485. *        D_PolysetDrawSpans8 (a_spans);
  1486.  
  1487.         move.l  _a_spans,_d_pedgespanpackage
  1488.         move.l  4(a4),d3
  1489.         move.l  (a4),d2
  1490.         move.l  4(a2),d1
  1491.         move.l  (a2),d0
  1492.         bsr     _D_PolysetSetUpForLineScan
  1493.         clr.l   _d_aspancount
  1494.         move.l  _ubasestep,d0
  1495.         addq.l  #1,d0
  1496.         move.l  d0,_d_countextrastep
  1497.         move.l  _a_spans,a3
  1498.         move.l  .initRH(sp),d6
  1499.         move.l  d6,d0
  1500.         asl.l   #PSPANP_SIZEOF_EXP,d0
  1501.         move.l  PSPANP_COUNT(a3,d0.l),d7
  1502.         move.l  #-999999,PSPANP_COUNT(a3,d0.l)
  1503.         move.l  a3,-(sp)
  1504.         bsr     _D_PolysetDrawSpans8
  1505.         addq    #4,sp
  1506.  
  1507. *        if (pedgetable->numrightedges == 2)
  1508. *        {
  1509. *                int                             height;
  1510. *                spanpackage_t   *pstart;
  1511. *
  1512. *                pstart = a_spans + initialrightheight;
  1513. *                pstart->count = originalcount;
  1514. *
  1515. *                d_aspancount = prightbottom[0] - prighttop[0];
  1516. *
  1517. *                prighttop = prightbottom;
  1518. *                prightbottom = pedgetable->prightedgevert2;
  1519. *
  1520. *                height = prightbottom[1] - prighttop[1];
  1521. *
  1522. *                D_PolysetSetUpForLineScan(prighttop[0], prighttop[1],
  1523. *                                                          prightbottom[0], prightbottom[1]);
  1524. *
  1525. *                d_countextrastep = ubasestep + 1;
  1526. *                a_spans[initialrightheight + height].count = -999999;
  1527. *                                                                                        // mark end of the spanpackages
  1528. *                D_PolysetDrawSpans8 (pstart);
  1529.  
  1530.         move.l  _pedgetable,a0
  1531.         cmp.l   #2,ETAB_NUMRIGHTEDGES(a0)
  1532.         bne.b   .exit
  1533.         move.l  a3,a6
  1534.         move.l  d6,d0
  1535.         asl.l   #PSPANP_SIZEOF_EXP,d0
  1536.         add.l   d0,a6
  1537.         move.l  d7,PSPANP_COUNT(a6)
  1538.         move.l  (a4),d0
  1539.         sub.l   (a2),d0
  1540.         move.l  d0,_d_aspancount
  1541.         move.l  a4,a2
  1542.         move.l  ETAB_PREV2(a0),a4
  1543.         move.l  4(a4),d5
  1544.         move.l  d5,d3
  1545.         move.l  4(a2),d0
  1546.         sub.l   d0,d5
  1547.         move.l  (a4),d2
  1548.         move.l  d0,d1
  1549.         move.l  (a2),d0
  1550.         bsr     _D_PolysetSetUpForLineScan
  1551.         move.l  _ubasestep,d4
  1552.         addq.l  #1,d4
  1553.         move.l  d4,_d_countextrastep
  1554.         add.l   d6,d5
  1555.         asl.l   #PSPANP_SIZEOF_EXP,d5
  1556.         move.l  #-999999,PSPANP_COUNT(a3,d5.l)
  1557.         move.l  a6,-(sp)
  1558.         bsr     _D_PolysetDrawSpans8
  1559.         addq    #4,sp
  1560. .exit
  1561.         add     #.intregs,sp
  1562.         movem.l (sp)+,d2-d7/a2-a6
  1563.         rts
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570. ******************************************************************************
  1571. *
  1572. *       void D_DrawNonSubdiv (void)
  1573. *
  1574. ******************************************************************************
  1575.         cnop    0,4
  1576. _D_DrawNonSubdiv
  1577.  
  1578.         movem.l d2-d7/a2-a6,-(sp)
  1579.  
  1580. *        pfv = r_affinetridesc.pfinalverts;
  1581. *        ptri = r_affinetridesc.ptriangles;
  1582. *        lnumtriangles = r_affinetridesc.numtriangles;
  1583.  
  1584.         lea     _r_affinetridesc,a0
  1585.         move.l  R_PFINALVERTS(a0),a2    ;pfv = f_affinetridesc.pfinalverts
  1586.         move.l  R_PTRIANGLES(a0),a3     ;ptri = f_affinetridesc.ptriangles
  1587.         move.l  R_NUMTRIANGLES(a0),d3   ;lnumtriangles = r_affine...
  1588.         subq    #1,d3
  1589. .loop
  1590.  
  1591. *                index0 = pfv + ptri->vertindex[0];
  1592. *                index1 = pfv + ptri->vertindex[1];
  1593. *                index2 = pfv + ptri->vertindex[2];
  1594. *
  1595. *                d_xdenom = (index0->v[1]-index1->v[1]) *
  1596. *                                (index0->v[0]-index2->v[0]) -
  1597. *                                (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
  1598.  
  1599.         move.l  MT_VERTINDEX+0*4(a3),d0
  1600.         asl.l   #FV_SIZEOF_EXP,d0
  1601.         lea     0(a2,d0.l),a0           ;a0 = index0
  1602.         move.l  MT_VERTINDEX+1*4(a3),d0
  1603.         asl.l   #FV_SIZEOF_EXP,d0
  1604.         lea     0(a2,d0.l),a1           ;a1 = index1
  1605.         move.l  MT_VERTINDEX+2*4(a3),d0
  1606.         asl.l   #FV_SIZEOF_EXP,d0
  1607.         lea     0(a2,d0.l),a4           ;a2 = index2
  1608.         movem.l d3/a3,-(sp)
  1609.         move.l  (a0)+,d0                ;d0 = index0->v[0]
  1610.         move.l  (a0)+,d1                ;d1 = index0->v[1]
  1611.         move.l  (a1)+,a6                ;d2 = index1->v[0]
  1612.         move.l  (a1)+,d2                ;a6 = index1->v[1]
  1613.         move.l  (a4)+,d4                ;d4 = index2->v[0]
  1614.         move.l  (a4)+,d5                ;d5 = index2->v[1]
  1615.         move.l  d0,d6
  1616.         move.l  d1,d7
  1617.         sub.l   d4,d6                   ;index0->v[0]-index2->v[0]
  1618.         sub.l   d2,d7                   ;index0->v[1]-index1->v[1]
  1619.         move.l  d6,d3
  1620.         muls.l  d7,d3
  1621.         move.l  d0,d6
  1622.         move.l  d1,d7
  1623.         sub.l   a6,d6                   ;index0->v[0]-index1->v[0]
  1624.         sub.l   d5,d7                   ;index0->v[1]-index2->v[1]
  1625.         muls.l  d6,d7
  1626.  
  1627. *                if (d_xdenom >= 0)
  1628. *                {
  1629. *                        continue;
  1630. *                }
  1631.  
  1632.         sub.l   d7,d3
  1633.         bge.w   .next                   ;if (d_xdenom >= 0)
  1634.         move.l  d3,_d_xdenom            ;d_xdenom = ...
  1635.  
  1636. *                r_p0[0] = index0->v[0];         // u
  1637. *                r_p0[1] = index0->v[1];         // v
  1638. *                r_p0[2] = index0->v[2];         // s
  1639. *                r_p0[3] = index0->v[3];         // t
  1640. *                r_p0[4] = index0->v[4];         // light
  1641. *                r_p0[5] = index0->v[5];         // iz
  1642. *
  1643. *                r_p1[0] = index1->v[0];
  1644. *                r_p1[1] = index1->v[1];
  1645. *                r_p1[2] = index1->v[2];
  1646. *                r_p1[3] = index1->v[3];
  1647. *                r_p1[4] = index1->v[4];
  1648. *                r_p1[5] = index1->v[5];
  1649. *
  1650. *                r_p2[0] = index2->v[0];
  1651. *                r_p2[1] = index2->v[1];
  1652. *                r_p2[2] = index2->v[2];
  1653. *                r_p2[3] = index2->v[3];
  1654. *                r_p2[4] = index2->v[4];
  1655. *                r_p2[5] = index2->v[5];
  1656.  
  1657.         lea     _r_p1,a5
  1658.         move.l  a6,(a5)+                ;r_p1[0] = index1->v[0]
  1659.         move.l  d2,(a5)+                ;r_p1[1] = index1->v[1]
  1660.         move.l  (a1)+,(a5)+             ;...
  1661.         move.l  (a1)+,(a5)+
  1662.         move.l  (a1)+,(a5)+
  1663.         move.l  (a1)+,(a5)+
  1664.         lea     _r_p0,a6
  1665.         move.l  d0,(a6)+                ;r_p0[0] = index0->v[0]
  1666.         move.l  d1,(a6)+                ;...
  1667.         move.l  (a0)+,(a6)+
  1668.         move.l  (a0)+,(a6)+
  1669.         move.l  (a0)+,(a6)+
  1670.         move.l  (a0)+,(a6)+
  1671.         move.l  MT_FACESFRONT(a3),d6
  1672.         lea     _r_p2,a3                ;r_p2[0] = index2->v[0]
  1673.         move.l  d4,(a3)+                ;...
  1674.         move.l  d5,(a3)+
  1675.         move.l  (a4)+,(a3)+
  1676.         move.l  (a4)+,(a3)+
  1677.         move.l  (a4)+,(a3)+
  1678.         move.l  (a4)+,(a3)+
  1679.  
  1680. *                if (!ptri->facesfront)
  1681. *                {
  1682. *                        if (index0->flags & ALIAS_ONSEAM)
  1683. *                                r_p0[2] += r_affinetridesc.seamfixupX16;
  1684. *                        if (index1->flags & ALIAS_ONSEAM)
  1685. *                                r_p1[2] += r_affinetridesc.seamfixupX16;
  1686. *                        if (index2->flags & ALIAS_ONSEAM)
  1687. *                                r_p2[2] += r_affinetridesc.seamfixupX16;
  1688. *                }
  1689.  
  1690.         tst.l   d6                      ;if (!ptri->facesfront)
  1691.         bne.b   .cont
  1692.         move.l  _r_affinetridesc+R_SEAMFIXUP16,d3
  1693.         move.l  (a0),d0                 ;if (index0->flags & ALIAS_ONSEAM)
  1694.         and.l   #ALIAS_ONSEAM,d0
  1695.         beq.b   .1
  1696.         add.l   d3,-16(a6)              ;r_p0[2] += r_affinetridesc.se...
  1697. .1
  1698.         move.l  (a1),d0
  1699.         and.l   #ALIAS_ONSEAM,d0
  1700.         beq.b   .2
  1701.         add.l   d3,-16(a5)
  1702. .2
  1703.         move.l  (a4),d0
  1704.         and.l   #ALIAS_ONSEAM,d0
  1705.         beq.b   .cont
  1706.         add.l   d3,-16(a3)
  1707. .cont
  1708.  
  1709. ******  D_PolysetSetEdgeTable (inlined)
  1710.  
  1711.         cmp.l   d2,d1
  1712.         blt.b   .lt1
  1713.         beq.b   .eq1
  1714. .gt1
  1715.         moveq   #EDGETABLE_SIZEOF,d0
  1716.         cmp.l   d5,d1
  1717.         beq.b   .eq2
  1718.         cmp.l   d5,d2
  1719.         beq.b   .eq3
  1720.         cmp.l   d5,d1
  1721.         ble.b   .skip
  1722.         add.l   #2*EDGETABLE_SIZEOF,d0
  1723. .skip
  1724.         cmp.l   d5,d2
  1725.         ble.b   .skip2
  1726.         add.l   #4*EDGETABLE_SIZEOF,d0
  1727. .skip2
  1728.         add.l   #_edgetables,d0
  1729.         move.l  d0,_pedgetable
  1730.         bra.b   .done
  1731. .eq2
  1732.         move.l  #_edgetables+8*EDGETABLE_SIZEOF,_pedgetable
  1733.         bra.b   .done
  1734. .eq3
  1735.         move.l  #_edgetables+10*EDGETABLE_SIZEOF,_pedgetable
  1736.         bra.b   .done
  1737. .eq1
  1738.         cmp.l   d5,d1
  1739.         bge.b   .ge
  1740.         move.l  #_edgetables+2*EDGETABLE_SIZEOF,_pedgetable
  1741.         bra.b   .done
  1742. .ge
  1743.         move.l  #_edgetables+5*EDGETABLE_SIZEOF,_pedgetable
  1744.         bra.b   .done
  1745. .lt1
  1746.         moveq   #0,d0
  1747.         cmp.l   d5,d1
  1748.         beq.b   .eq4
  1749.         cmp.l   d5,d2
  1750.         beq.b   .eq5
  1751.         cmp.l   d5,d1
  1752.         ble.b   .skip3
  1753.         add.l   #2*EDGETABLE_SIZEOF,d0
  1754. .skip3
  1755.         cmp.l   d5,d2
  1756.         ble.b   .skip4
  1757.         add.l   #4*EDGETABLE_SIZEOF,d0
  1758. .skip4
  1759.         add.l   #_edgetables,d0
  1760.         move.l  d0,_pedgetable
  1761.         bra.b   .done
  1762. .eq4
  1763.         move.l  #_edgetables+9*EDGETABLE_SIZEOF,_pedgetable
  1764.         bra.b   .done
  1765. .eq5
  1766.         move.l  #_edgetables+11*EDGETABLE_SIZEOF,_pedgetable
  1767. .done
  1768.  
  1769. ******  end of D_PolysetSetEdgeTable
  1770.  
  1771.         bsr     _D_RasterizeAliasPolySmooth
  1772. .next
  1773.         movem.l (sp)+,d3/a3
  1774.         lea     MT_SIZEOF(a3),a3        ;ptri++
  1775.         dbra    d3,.loop
  1776.         movem.l (sp)+,d2-d7/a2-a6
  1777.         rts
  1778.  
  1779. _adivtab
  1780.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,1
  1781.     dc.l    -5,1,-6,1,-7,2,-1,2,-3,3,0
  1782.     dc.l    3,-3,5,0,7,-1,$F,0,0,0,-$F
  1783.     dc.l    0,-$8,1,-5,0,-4,1,-3,0,-3,3
  1784.     dc.l    -3,6,-2,1,-2,3,-2,5,-2,7,-2
  1785.     dc.l    $9,-2,$B,-2,$D,-1,0,-1,1,0,-$E
  1786.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,1
  1787.     dc.l    -5,1,-6,2,0,2,-2,2,-4,3,-2
  1788.     dc.l    4,-2,7,0,$E,0,0,0,-$E,0,-7
  1789.     dc.l    0,-5,1,-4,2,-3,1,-3,4,-2,0
  1790.     dc.l    -2,2,-2,4,-2,6,-2,$8,-2,$A,-2
  1791.     dc.l    $C,-1,0,-1,1,-1,2,0,-$D,0,-$D
  1792.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,1
  1793.     dc.l    -5,1,-6,2,-1,2,-3,3,-1,4,-1
  1794.     dc.l    6,-1,$D,0,0,0,-$D,0,-7,1,-5
  1795.     dc.l    2,-4,3,-3,2,-3,5,-2,1,-2,3
  1796.     dc.l    -2,5,-2,7,-2,$9,-2,$B,-1,0,-1
  1797.     dc.l    1,-1,2,-1,3,0,-$C,0,-$C,0,-$C
  1798.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,1
  1799.     dc.l    -5,2,0,2,-2,3,0,4,0,6,0
  1800.     dc.l    $C,0,0,0,-$C,0,-6,0,-4,0,-3
  1801.     dc.l    0,-3,3,-2,0,-2,2,-2,4,-2,6
  1802.     dc.l    -2,$8,-2,$A,-1,0,-1,1,-1,2,-1
  1803.     dc.l    3,-1,4,0,-$B,0,-$B,0,-$B,0,-$B
  1804.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,1
  1805.     dc.l    -5,2,-1,2,-3,3,-2,5,-1,$B,0
  1806.     dc.l    0,0,-$B,0,-6,1,-4,1,-3,1,-3
  1807.     dc.l    4,-2,1,-2,3,-2,5,-2,7,-2,$9
  1808.     dc.l    -1,0,-1,1,-1,2,-1,3,-1,4,-1
  1809.     dc.l    5,0,-$A,0,-$A,0,-$A,0,-$A,0,-$A
  1810.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,2
  1811.     dc.l    0,2,-2,3,-1,5,0,$A,0,0,0
  1812.     dc.l    -$A,0,-5,0,-4,2,-3,2,-2,0,-2
  1813.     dc.l    2,-2,4,-2,6,-2,$8,-1,0,-1,1
  1814.     dc.l    -1,2,-1,3,-1,4,-1,5,-1,6,0
  1815.     dc.l    -$9,0,-$9,0,-$9,0,-$9,0,-$9,0,-$9
  1816.     dc.l    1,0,1,-1,1,-2,1,-3,1,-4,2
  1817.     dc.l    -1,3,0,4,-1,$9,0,0,0,-$9,0
  1818.     dc.l    -5,1,-3,0,-3,3,-2,1,-2,3,-2
  1819.     dc.l    5,-2,7,-1,0,-1,1,-1,2,-1,3
  1820.     dc.l    -1,4,-1,5,-1,6,-1,7,0,-$8,0
  1821.     dc.l    -$8,0,-$8,0,-$8,0,-$8,0,-$8,0,-$8
  1822.     dc.l    1,0,1,-1,1,-2,1,-3,2,0,2
  1823.     dc.l    -2,4,0,$8,0,0,0,-$8,0,-4,0
  1824.     dc.l    -3,1,-2,0,-2,2,-2,4,-2,6,-1
  1825.     dc.l    0,-1,1,-1,2,-1,3,-1,4,-1,5
  1826.     dc.l    -1,6,-1,7,-1,$8,0,-7,0,-7,0
  1827.     dc.l    -7,0,-7,0,-7,0,-7,0,-7,0,-7
  1828.     dc.l    1,0,1,-1,1,-2,1,-3,2,-1,3
  1829.     dc.l    -1,7,0,0,0,-7,0,-4,1,-3,2
  1830.     dc.l    -2,1,-2,3,-2,5,-1,0,-1,1,-1
  1831.     dc.l    2,-1,3,-1,4,-1,5,-1,6,-1,7
  1832.     dc.l    -1,$8,-1,$9,0,-6,0,-6,0,-6,0
  1833.     dc.l    -6,0,-6,0,-6,0,-6,0,-6,0,-6
  1834.     dc.l    1,0,1,-1,1,-2,2,0,3,0,6
  1835.     dc.l    0,0,0,-6,0,-3,0,-2,0,-2,2
  1836.     dc.l    -2,4,-1,0,-1,1,-1,2,-1,3,-1
  1837.     dc.l    4,-1,5,-1,6,-1,7,-1,$8,-1,$9
  1838.     dc.l    -1,$A,0,-5,0,-5,0,-5,0,-5,0
  1839.     dc.l    -5,0,-5,0,-5,0,-5,0,-5,0,-5
  1840.     dc.l    1,0,1,-1,1,-2,2,-1,5,0,0
  1841.     dc.l    0,-5,0,-3,1,-2,1,-2,3,-1,0
  1842.     dc.l    -1,1,-1,2,-1,3,-1,4,-1,5,-1
  1843.     dc.l    6,-1,7,-1,$8,-1,$9,-1,$A,-1,$B
  1844.     dc.l    0,-4,0,-4,0,-4,0,-4,0,-4,0
  1845.     dc.l    -4,0,-4,0,-4,0,-4,0,-4,0,-4
  1846.     dc.l    1,0,1,-1,2,0,4,0,0,0,-4
  1847.     dc.l    0,-2,0,-2,2,-1,0,-1,1,-1,2
  1848.     dc.l    -1,3,-1,4,-1,5,-1,6,-1,7,-1
  1849.     dc.l    $8,-1,$9,-1,$A,-1,$B,-1,$C,0,-3
  1850.     dc.l    0,-3,0,-3,0,-3,0,-3,0,-3,0
  1851.     dc.l    -3,0,-3,0,-3,0,-3,0,-3,0,-3
  1852.     dc.l    1,0,1,-1,3,0,0,0,-3,0,-2
  1853.     dc.l    1,-1,0,-1,1,-1,2,-1,3,-1,4
  1854.     dc.l    -1,5,-1,6,-1,7,-1,$8,-1,$9,-1
  1855.     dc.l    $A,-1,$B,-1,$C,-1,$D,0,-2,0,-2
  1856.     dc.l    0,-2,0,-2,0,-2,0,-2,0,-2,0
  1857.     dc.l    -2,0,-2,0,-2,0,-2,0,-2,0,-2
  1858.     dc.l    1,0,2,0,0,0,-2,0,-1,0,-1
  1859.     dc.l    1,-1,2,-1,3,-1,4,-1,5,-1,6
  1860.     dc.l    -1,7,-1,$8,-1,$9,-1,$A,-1,$B,-1
  1861.     dc.l    $C,-1,$D,-1,$E,0,-1,0,-1,0,-1
  1862.     dc.l    0,-1,0,-1,0,-1,0,-1,0,-1,0
  1863.     dc.l    -1,0,-1,0,-1,0,-1,0,-1,0,-1
  1864.     dc.l    1,0,0,0,-1,0,-1,1,-1,2,-1
  1865.     dc.l    3,-1,4,-1,5,-1,6,-1,7,-1,$8
  1866.     dc.l    -1,$9,-1,$A,-1,$B,-1,$C,-1,$D,-1
  1867.     dc.l    $E,-1,$F,0,0,0,0,0,0,0,0
  1868.     dc.l    0,0,0,0,0,0,0,0,0,0,0
  1869.     dc.l    0,0,0,0,0,0,0,0,0,0,0
  1870.     dc.l    0,0,0,0,0,0,0,0,0,0,0
  1871.     dc.l    0,0,0,0,0,0,0,0,0,0,0
  1872.     dc.l    0,0,0,0,0,0,0,0,0,0,0
  1873.     dc.l    0,-1,-$E,-1,-$D,-1,-$C,-1,-$B,-1,-$A
  1874.     dc.l    -1,-$9,-1,-$8,-1,-7,-1,-6,-1,-5,-1
  1875.     dc.l    -4,-1,-3,-1,-2,-1,-1,-1,0,0,0
  1876.     dc.l    1,0,0,1,0,1,0,1,0,1,0
  1877.     dc.l    1,0,1,0,1,0,1,0,1,0,1
  1878.     dc.l    0,1,0,1,0,1,0,1,0,1,-1
  1879.     dc.l    -$D,-1,-$C,-1,-$B,-1,-$A,-1,-$9,-1,-$8
  1880.     dc.l    -1,-7,-1,-6,-1,-5,-1,-4,-1,-3,-1
  1881.     dc.l    -2,-1,-1,-1,0,-2,0,0,0,2,0
  1882.     dc.l    1,0,0,2,0,2,0,2,0,2,0
  1883.     dc.l    2,0,2,0,2,0,2,0,2,0,2
  1884.     dc.l    0,2,0,2,0,2,0,2,-1,-$C,-1
  1885.     dc.l    -$B,-1,-$A,-1,-$9,-1,-$8,-1,-7,-1,-6
  1886.     dc.l    -1,-5,-1,-4,-1,-3,-1,-2,-1,-1,-1
  1887.     dc.l    0,-2,-1,-3,0,0,0,3,0,1,1
  1888.     dc.l    1,0,0,3,0,3,0,3,0,3,0
  1889.     dc.l    3,0,3,0,3,0,3,0,3,0,3
  1890.     dc.l    0,3,0,3,0,3,-1,-$B,-1,-$A,-1
  1891.     dc.l    -$9,-1,-$8,-1,-7,-1,-6,-1,-5,-1,-4
  1892.     dc.l    -1,-3,-1,-2,-1,-1,-1,0,-2,-2,-2
  1893.     dc.l    0,-4,0,0,0,4,0,2,0,1,1
  1894.     dc.l    1,0,0,4,0,4,0,4,0,4,0
  1895.     dc.l    4,0,4,0,4,0,4,0,4,0,4
  1896.     dc.l    0,4,0,4,-1,-$A,-1,-$9,-1,-$8,-1
  1897.     dc.l    -7,-1,-6,-1,-5,-1,-4,-1,-3,-1,-2
  1898.     dc.l    -1,-1,-1,0,-2,-3,-2,-1,-3,-1,-5
  1899.     dc.l    0,0,0,5,0,2,1,1,2,1,1
  1900.     dc.l    1,0,0,5,0,5,0,5,0,5,0
  1901.     dc.l    5,0,5,0,5,0,5,0,5,0,5
  1902.     dc.l    0,5,-1,-$9,-1,-$8,-1,-7,-1,-6,-1
  1903.     dc.l    -5,-1,-4,-1,-3,-1,-2,-1,-1,-1,0
  1904.     dc.l    -2,-4,-2,-2,-2,0,-3,0,-6,0,0
  1905.     dc.l    0,6,0,3,0,2,0,1,2,1,1
  1906.     dc.l    1,0,0,6,0,6,0,6,0,6,0
  1907.     dc.l    6,0,6,0,6,0,6,0,6,0,6
  1908.     dc.l    -1,-$8,-1,-7,-1,-6,-1,-5,-1,-4,-1
  1909.     dc.l    -3,-1,-2,-1,-1,-1,0,-2,-5,-2,-3
  1910.     dc.l    -2,-1,-3,-2,-4,-1,-7,0,0,0,7
  1911.     dc.l    0,3,1,2,1,1,3,1,2,1,1
  1912.     dc.l    1,0,0,7,0,7,0,7,0,7,0
  1913.     dc.l    7,0,7,0,7,0,7,0,7,-1,-7
  1914.     dc.l    -1,-6,-1,-5,-1,-4,-1,-3,-1,-2,-1
  1915.     dc.l    -1,-1,0,-2,-6,-2,-4,-2,-2,-2,0
  1916.     dc.l    -3,-1,-4,0,-$8,0,0,0,$8,0,4
  1917.     dc.l    0,2,2,2,0,1,3,1,2,1,1
  1918.     dc.l    1,0,0,$8,0,$8,0,$8,0,$8,0
  1919.     dc.l    $8,0,$8,0,$8,0,$8,-1,-6,-1,-5
  1920.     dc.l    -1,-4,-1,-3,-1,-2,-1,-1,-1,0,-2
  1921.     dc.l    -7,-2,-5,-2,-3,-2,-1,-3,-3,-3,0
  1922.     dc.l    -5,-1,-$9,0,0,0,$9,0,4,1,3
  1923.     dc.l    0,2,1,1,4,1,3,1,2,1,1
  1924.     dc.l    1,0,0,$9,0,$9,0,$9,0,$9,0
  1925.     dc.l    $9,0,$9,0,$9,-1,-5,-1,-4,-1,-3
  1926.     dc.l    -1,-2,-1,-1,-1,0,-2,-$8,-2,-6,-2
  1927.     dc.l    -4,-2,-2,-2,0,-3,-2,-4,-2,-5,0
  1928.     dc.l    -$A,0,0,0,$A,0,5,0,3,1,2
  1929.     dc.l    2,2,0,1,4,1,3,1,2,1,1
  1930.     dc.l    1,0,0,$A,0,$A,0,$A,0,$A,0
  1931.     dc.l    $A,0,$A,-1,-4,-1,-3,-1,-2,-1,-1
  1932.     dc.l    -1,0,-2,-$9,-2,-7,-2,-5,-2,-3,-2
  1933.     dc.l    -1,-3,-4,-3,-1,-4,-1,-6,-1,-$B,0
  1934.     dc.l    0,0,$B,0,5,1,3,2,2,3,2
  1935.     dc.l    1,1,5,1,4,1,3,1,2,1,1
  1936.     dc.l    1,0,0,$B,0,$B,0,$B,0,$B,0
  1937.     dc.l    $B,-1,-3,-1,-2,-1,-1,-1,0,-2,-$A
  1938.     dc.l    -2,-$8,-2,-6,-2,-4,-2,-2,-2,0,-3
  1939.     dc.l    -3,-3,0,-4,0,-6,0,-$C,0,0,0
  1940.     dc.l    $C,0,6,0,4,0,3,0,2,2,2
  1941.     dc.l    0,1,5,1,4,1,3,1,2,1,1
  1942.     dc.l    1,0,0,$C,0,$C,0,$C,0,$C,-1
  1943.     dc.l    -2,-1,-1,-1,0,-2,-$B,-2,-$9,-2,-7
  1944.     dc.l    -2,-5,-2,-3,-2,-1,-3,-5,-3,-2,-4
  1945.     dc.l    -3,-5,-2,-7,-1,-$D,0,0,0,$D,0
  1946.     dc.l    6,1,4,1,3,1,2,3,2,1,1
  1947.     dc.l    6,1,5,1,4,1,3,1,2,1,1
  1948.     dc.l    1,0,0,$D,0,$D,0,$D,-1,-1,-1
  1949.     dc.l    0,-2,-$C,-2,-$A,-2,-$8,-2,-6,-2,-4
  1950.     dc.l    -2,-2,-2,0,-3,-4,-3,-1,-4,-2,-5
  1951.     dc.l    -1,-7,0,-$E,0,0,0,$E,0,7,0
  1952.     dc.l    4,2,3,2,2,4,2,2,2,0,1
  1953.     dc.l    6,1,5,1,4,1,3,1,2,1,1
  1954.     dc.l    1,0,0,$E,0,$E,-1,0,-2,-$D,-2
  1955.     dc.l    -$B,-2,-$9,-2,-7,-2,-5,-2,-3,-2,-1
  1956.     dc.l    -3,-6,-3,-3,-3,0,-4,-1,-5,0,-$8
  1957.     dc.l    -1,-$F,0,0,0,$F,0,7,1,5,0
  1958.     dc.l    3,3,3,0,2,3,2,1,1,7,1
  1959.     dc.l    6,1,5,1,4,1,3,1,2,1,1
  1960.     dc.l    1,0,0,$F,-2,-$E,-2,-$C,-2,-$A,-2
  1961.     dc.l    -$8,-2,-6,-2,-4,-2,-2,-2,0,-3,-5
  1962.     dc.l    -3,-2,-4,-4,-4,0,-6,-2,-$8,0,-$10
  1963.     dc.l    0,0,0,$10,0,$8,0,5,1,4,0
  1964.     dc.l    3,1,2,4,2,2,2,0,1,7,1
  1965.     dc.l    6,1,5,1,4,1,3,1,2,1,1
  1966.     dc.l    1,0
  1967.  
  1968.