home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / r_aclip68k.s < prev    next >
Text File  |  2000-06-17  |  13KB  |  596 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. ** r_aclip.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _r_refdef
  20.  
  21.         XDEF    _R_Alias_clip_left
  22.         XDEF    _R_Alias_clip_right
  23.         XDEF    _R_Alias_clip_top
  24.         XDEF    _R_Alias_clip_bottom
  25.         XDEF    _R_AliasClip
  26.  
  27. ALIAS_LEFT_CLIP         =       1
  28. ALIAS_TOP_CLIP          =       2
  29. ALIAS_RIGHT_CLIP        =       4
  30. ALIAS_BOTTOM_CLIP       =       8
  31.  
  32. FV_V                    =       0
  33. FV_FLAGS                =       24
  34. FV_RESERVED             =       28
  35. FV_SIZEOF               =       32
  36. FV_SIZEOF_EXP           =       5
  37.  
  38. REFDEF_VRECT            =       0
  39. REFDEF_ALIASVRECT       =       20
  40. REFDEF_VRECTRIGHT       =       40
  41. REFDEF_VRECTBOTTOM      =       44
  42. REFDEF_ALIASVRECTRIGHT  =       48
  43. REFDEF_ALIASVRECTBOTTOM =       52
  44.  
  45. VRECT_X                 =       0
  46. VRECT_Y                 =       4
  47. VRECT_WIDTH             =       8
  48. VRECT_HEIGHT            =       12
  49. VRECT_PNEXT             =       16
  50.  
  51.         fpu
  52.  
  53.  
  54.  
  55.  
  56. ******************************************************************************
  57. *
  58. *       void _R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
  59. *                                finalvert_t *out)
  60. *
  61. ******************************************************************************
  62.  
  63.         cnop    0,4
  64. _R_Alias_clip_left
  65.  
  66. *****   stackframe
  67.  
  68.         rsreset
  69. .fpuregs        rs.x    2
  70. .intregs        rs.l    5
  71.         rs.l    1
  72. .pfv0           rs.l    1
  73. .pfv1           rs.l    1
  74. .out            rs.l    1
  75.  
  76.  
  77.         movem.l d2-d4/a2/a3,-(sp)
  78.         fmovem.x        fp2/fp3,-(sp)
  79.         move.l  .pfv0(sp),a0
  80.         move.l  .pfv1(sp),a1
  81.         move.l  .out(sp),a2
  82.         lea     _r_refdef,a3
  83.         fmove.s #0.5,fp2
  84.         move.l  (a0)+,d2
  85.         move.l  (a0)+,d3
  86.         move.l  (a1)+,d0
  87.         move.l  (a1)+,d1
  88.         move.l  REFDEF_ALIASVRECT+VRECT_X(a3),d4
  89.         cmp.l   d1,d3
  90.         blt.b   .cont
  91.         sub.l   d2,d4
  92.         fmove.l d4,fp0
  93.         fmove   fp0,fp3
  94.         fadd    fp2,fp3
  95.         move.l  d0,d4
  96.         sub.l   d2,d4
  97.         fmove.l d4,fp1
  98.         fdiv    fp1,fp0
  99.         fmove.l fp3,d0
  100.         add.l   d2,d0
  101.         move.l  d0,(a2)+
  102.         moveq   #5-1,d2
  103.         bra.b   .entry
  104. .loop
  105.         move.l  (a0)+,d3
  106.         move.l  (a1)+,d1
  107. .entry
  108.         sub.l   d3,d1
  109.         fmove.l d1,fp1
  110.         fmul    fp0,fp1
  111.         fadd    fp2,fp1
  112.         fmove.l fp1,d1
  113.         add.l   d3,d1
  114.         move.l  d1,(a2)+
  115.         dbra    d2,.loop
  116.         bra.b   .exit
  117. .cont
  118.         sub.l   d0,d4
  119.         fmove.l d4,fp0
  120.         fmove   fp0,fp3
  121.         fadd    fp2,fp3
  122.         move.l  d2,d4
  123.         sub.l   d0,d4
  124.         fmove.l d4,fp1
  125.         fdiv    fp1,fp0
  126.         fmove.l fp3,d2
  127.         add.l   d0,d2
  128.         move.l  d2,(a2)+
  129.         moveq   #5-1,d2
  130.         bra.b   .entry2
  131. .loop2
  132.         move.l  (a0)+,d3
  133.         move.l  (a1)+,d1
  134. .entry2
  135.         sub.l   d1,d3
  136.         fmove.l d3,fp1
  137.         fmul    fp0,fp1
  138.         fadd    fp2,fp1
  139.         fmove.l fp1,d3
  140.         add.l   d1,d3
  141.         move.l  d3,(a2)+
  142.         dbra    d2,.loop2
  143. .exit
  144.         fmovem.x        (sp)+,fp2/fp3
  145.         movem.l (sp)+,d2-d4/a2/a3
  146.         rts
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153. ******************************************************************************
  154. *
  155. *       void _R_Alias_clip_right (finalvert_t *pfv0, finalvert_t *pfv1,
  156. *                                 finalvert_t *out)
  157. *
  158. ******************************************************************************
  159.  
  160.         cnop    0,4
  161. _R_Alias_clip_right
  162.  
  163. *****   stackframe
  164.  
  165.         rsreset
  166. .fpuregs        rs.x    2
  167. .intregs        rs.l    5
  168.         rs.l    1
  169. .pfv0           rs.l    1
  170. .pfv1           rs.l    1
  171. .out            rs.l    1
  172.  
  173.  
  174.         movem.l d2-d4/a2/a3,-(sp)
  175.         fmovem.x        fp2/fp3,-(sp)
  176.         move.l  .pfv0(sp),a0
  177.         move.l  .pfv1(sp),a1
  178.         move.l  .out(sp),a2
  179.         lea     _r_refdef,a3
  180.         fmove.s #0.5,fp2
  181.         move.l  (a0)+,d2
  182.         move.l  (a0)+,d3
  183.         move.l  (a1)+,d0
  184.         move.l  (a1)+,d1
  185.         move.l  REFDEF_ALIASVRECTRIGHT(a3),d4
  186.         cmp.l   d1,d3
  187.         blt.b   .cont
  188.         sub.l   d2,d4
  189.         fmove.l d4,fp0
  190.         fmove   fp0,fp3
  191.         fadd    fp2,fp3
  192.         move.l  d0,d4
  193.         sub.l   d2,d4
  194.         fmove.l d4,fp1
  195.         fdiv    fp1,fp0
  196.         fmove.l fp3,d0
  197.         add.l   d2,d0
  198.         move.l  d0,(a2)+
  199.         moveq   #5-1,d2
  200.         bra.b   .entry
  201. .loop
  202.         move.l  (a0)+,d3
  203.         move.l  (a1)+,d1
  204. .entry
  205.         sub.l   d3,d1
  206.         fmove.l d1,fp1
  207.         fmul    fp0,fp1
  208.         fadd    fp2,fp1
  209.         fmove.l fp1,d1
  210.         add.l   d3,d1
  211.         move.l  d1,(a2)+
  212.         dbra    d2,.loop
  213.         bra.b   .exit
  214. .cont
  215.         sub.l   d0,d4
  216.         fmove.l d4,fp0
  217.         fmove   fp0,fp3
  218.         fadd    fp2,fp3
  219.         move.l  d2,d4
  220.         sub.l   d0,d4
  221.         fmove.l d4,fp1
  222.         fdiv    fp1,fp0
  223.         fmove.l fp3,d2
  224.         add.l   d0,d2
  225.         move.l  d2,(a2)+
  226.         moveq   #5-1,d2
  227.         bra.b   .entry2
  228. .loop2
  229.         move.l  (a0)+,d3
  230.         move.l  (a1)+,d1
  231. .entry2
  232.         sub.l   d1,d3
  233.         fmove.l d3,fp1
  234.         fmul    fp0,fp1
  235.         fadd    fp2,fp1
  236.         fmove.l fp1,d3
  237.         add.l   d1,d3
  238.         move.l  d3,(a2)+
  239.         dbra    d2,.loop2
  240. .exit
  241.         fmovem.x        (sp)+,fp2/fp3
  242.         movem.l (sp)+,d2-d4/a2/a3
  243.         rts
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251. ******************************************************************************
  252. *
  253. *       void _R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1,
  254. *                               finalvert_t *out)
  255. *
  256. ******************************************************************************
  257.  
  258.         cnop    0,4
  259. _R_Alias_clip_top
  260.  
  261. *****   stackframe
  262.  
  263.         rsreset
  264. .fpuregs        rs.x    2
  265. .intregs        rs.l    5
  266.         rs.l    1
  267. .pfv0           rs.l    1
  268. .pfv1           rs.l    1
  269. .out            rs.l    1
  270.  
  271.  
  272.         movem.l d2-d4/a2/a3,-(sp)
  273.         fmovem.x        fp2/fp3,-(sp)
  274.         move.l  .pfv0(sp),a0
  275.         move.l  .pfv1(sp),a1
  276.         move.l  .out(sp),a2
  277.         lea     _r_refdef,a3
  278.         fmove.s #0.5,fp2
  279.         move.l  (a0)+,d2
  280.         move.l  (a0)+,d3
  281.         move.l  (a1)+,d0
  282.         move.l  (a1)+,d1
  283.         move.l  REFDEF_ALIASVRECT+VRECT_Y(a3),d4
  284.         cmp.l   d1,d3
  285.         blt.b   .cont
  286.         sub.l   d3,d4
  287.         fmove.l d4,fp0
  288.         fmove   fp0,fp3
  289.         fadd    fp2,fp3
  290.         move.l  d1,d4
  291.         sub.l   d3,d4
  292.         fmove.l d4,fp1
  293.         fdiv    fp1,fp0
  294.         fmove.l fp3,d1
  295.         add.l   d3,d1
  296.         move.l  d1,(a2)+
  297.         moveq   #5-1,d3
  298.         bra.b   .entry
  299. .loop
  300.         move.l  (a0)+,d2
  301.         move.l  (a1)+,d0
  302. .entry
  303.         sub.l   d2,d0
  304.         fmove.l d0,fp1
  305.         fmul    fp0,fp1
  306.         fadd    fp2,fp1
  307.         fmove.l fp1,d0
  308.         add.l   d2,d0
  309.         move.l  d0,(a2)+
  310.         dbra    d3,.loop
  311.         bra.b   .exit
  312. .cont
  313.         sub.l   d1,d4
  314.         fmove.l d4,fp0
  315.         fmove   fp0,fp3
  316.         fadd    fp2,fp3
  317.         move.l  d3,d4
  318.         sub.l   d1,d4
  319.         fmove.l d4,fp1
  320.         fdiv    fp1,fp0
  321.         fmove.l fp3,d3
  322.         add.l   d1,d3
  323.         move.l  d3,(a2)+
  324.         moveq   #5-1,d3
  325.         bra.b   .entry2
  326. .loop2
  327.         move.l  (a0)+,d2
  328.         move.l  (a1)+,d0
  329. .entry2
  330.         sub.l   d0,d2
  331.         fmove.l d2,fp1
  332.         fmul    fp0,fp1
  333.         fadd    fp2,fp1
  334.         fmove.l fp1,d2
  335.         add.l   d0,d2
  336.         move.l  d2,(a2)+
  337.         dbra    d3,.loop2
  338. .exit
  339.         move.l  -24(a2),d0
  340.         move.l  -20(a2),-24(a2)
  341.         move.l  d0,-20(a2)
  342.         fmovem.x        (sp)+,fp2/fp3
  343.         movem.l (sp)+,d2-d4/a2/a3
  344.         rts
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351. ******************************************************************************
  352. *
  353. *       void _R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
  354. *                                  finalvert_t *out)
  355. *
  356. ******************************************************************************
  357.  
  358.         cnop    0,4
  359. _R_Alias_clip_bottom
  360.  
  361. *****   stackframe
  362.  
  363.         rsreset
  364. .fpuregs        rs.x    2
  365. .intregs        rs.l    5
  366.         rs.l    1
  367. .pfv0           rs.l    1
  368. .pfv1           rs.l    1
  369. .out            rs.l    1
  370.  
  371.  
  372.         movem.l d2-d4/a2/a3,-(sp)
  373.         fmovem.x        fp2/fp3,-(sp)
  374.         move.l  .pfv0(sp),a0
  375.         move.l  .pfv1(sp),a1
  376.         move.l  .out(sp),a2
  377.         lea     _r_refdef,a3
  378.         fmove.s #0.5,fp2
  379.         move.l  (a0)+,d2
  380.         move.l  (a0)+,d3
  381.         move.l  (a1)+,d0
  382.         move.l  (a1)+,d1
  383.         move.l  REFDEF_ALIASVRECTBOTTOM(a3),d4
  384.         cmp.l   d1,d3
  385.         blt.b   .cont
  386.         sub.l   d3,d4
  387.         fmove.l d4,fp0
  388.         fmove   fp0,fp3
  389.         fadd    fp2,fp3
  390.         move.l  d1,d4
  391.         sub.l   d3,d4
  392.         fmove.l d4,fp1
  393.         fdiv    fp1,fp0
  394.         fmove.l fp3,d1
  395.         add.l   d3,d1
  396.         move.l  d1,(a2)+
  397.         moveq   #5-1,d3
  398.         bra.b   .entry
  399. .loop
  400.         move.l  (a0)+,d2
  401.         move.l  (a1)+,d0
  402. .entry
  403.         sub.l   d2,d0
  404.         fmove.l d0,fp1
  405.         fmul    fp0,fp1
  406.         fadd    fp2,fp1
  407.         fmove.l fp1,d0
  408.         add.l   d2,d0
  409.         move.l  d0,(a2)+
  410.         dbra    d3,.loop
  411.         bra.b   .exit
  412. .cont
  413.         sub.l   d1,d4
  414.         fmove.l d4,fp0
  415.         fmove   fp0,fp3
  416.         fadd    fp2,fp3
  417.         move.l  d3,d4
  418.         sub.l   d1,d4
  419.         fmove.l d4,fp1
  420.         fdiv    fp1,fp0
  421.         fmove.l fp3,d3
  422.         add.l   d1,d3
  423.         move.l  d3,(a2)+
  424.         moveq   #5-1,d3
  425.         bra.b   .entry2
  426. .loop2
  427.         move.l  (a0)+,d2
  428.         move.l  (a1)+,d0
  429. .entry2
  430.         sub.l   d0,d2
  431.         fmove.l d2,fp1
  432.         fmul    fp0,fp1
  433.         fadd    fp2,fp1
  434.         fmove.l fp1,d2
  435.         add.l   d0,d2
  436.         move.l  d2,(a2)+
  437.         dbra    d3,.loop2
  438. .exit
  439.         move.l  -24(a2),d0
  440.         move.l  -20(a2),-24(a2)
  441.         move.l  d0,-20(a2)
  442.         fmovem.x        (sp)+,fp2/fp3
  443.         movem.l (sp)+,d2-d4/a2/a3
  444.         rts
  445.  
  446.  
  447.  
  448.  
  449.  
  450. ******************************************************************************
  451. *
  452. *       int _R_AliasClip  (finalvert_t *in, finalvert_t *out, int flag,
  453. *                          int count, void(*clip)(...)
  454. *
  455. ******************************************************************************
  456.  
  457.         cnop    0,4
  458. _R_AliasClip
  459.  
  460. *****   stackframe
  461.  
  462.         rsreset
  463. .intregs        rs.l    11
  464.         rs.l    1
  465. .in             rs.l    1
  466. .out            rs.l    1
  467. .flag           rs.l    1
  468. .count          rs.l    1
  469. .clip           rs.l    1
  470.  
  471.  
  472.         movem.l d2-d7/a2-a6,-(sp)
  473.         move.l  .in(sp),a2
  474.         move.l  .out(sp),a3
  475.         move.l  .flag(sp),d2
  476.         move.l  .count(sp),d3
  477.         move.l  .clip(sp),a4
  478.  
  479. *        j = count-1;
  480. *        k = 0;
  481. *        for (i=0 ; i<count ; j = i, i++)
  482. *        {
  483.  
  484.         move.l  d3,d5
  485.         subq.l  #1,d5
  486.         bmi.w   .skip
  487.         move.l  d5,d0                   ;j = count-1
  488.         asl.l   #FV_SIZEOF_EXP,d0
  489.         lea     0(a2,d0.l),a6           ;a6 = in[j]
  490.         lea     _r_refdef,a5
  491.         move.l  REFDEF_ALIASVRECT+VRECT_X(a5),d3
  492.         move.l  REFDEF_ALIASVRECT+VRECT_Y(a5),d4
  493.         move.l  REFDEF_ALIASVRECTRIGHT(a5),d6
  494.         move.l  REFDEF_ALIASVRECTBOTTOM(a5),d7
  495.         move.l  a2,a5
  496.  
  497. *                oldflags = in[j].flags & flag;
  498. *                flags = in[i].flags & flag;
  499. *                if (flags && oldflags)
  500. *                        continue;
  501.  
  502. .loop
  503.         move.l  FV_FLAGS(a6),d0
  504.         and.l   d2,d0                   ;oldflags = in[j].flags & flag
  505.         move.l  FV_FLAGS(a2),d1
  506.         and.l   d2,d1                   ;flags = in[i].flags & flag
  507.         beq.b   .do
  508.         tst.l   d0
  509.         bne.w   .next
  510. .do
  511.  
  512. *                if (oldflags ^ flags)
  513. *                {
  514. *                        clip (&in[j], &in[i], &out[k]);
  515. *                        out[k].flags = 0;
  516. *                        if (out[k].v[0] < r_refdef.aliasvrect.x)
  517. *                                out[k].flags |= ALIAS_LEFT_CLIP;
  518. *                        if (out[k].v[1] < r_refdef.aliasvrect.y)
  519. *                                out[k].flags |= ALIAS_TOP_CLIP;
  520. *                        if (out[k].v[0] > r_refdef.aliasvrectright)
  521. *                                out[k].flags |= ALIAS_RIGHT_CLIP;
  522. *                        if (out[k].v[1] > r_refdef.aliasvrectbottom)
  523. *                                out[k].flags |= ALIAS_BOTTOM_CLIP;
  524. *                        k++;
  525. *                }
  526.  
  527.         eor.l   d1,d0                   ;if (oldflags ^ flags)
  528.         beq.b   .cont
  529.         move.l  d1,-(sp)
  530.         move.l  a3,-(sp)
  531.         move.l  a2,-(sp)
  532.         move.l  a6,-(sp)
  533.         jsr     (a4)                    ;clip (&in[j], &in[i], &out[k])
  534.         add     #12,sp
  535.         moveq   #0,d1                   ;out[k].flags = 0
  536.         move.l  (a3),d0                 ;if (out[k].v[0] < ...
  537.         cmp.l   d3,d0
  538.         bge.b   .1
  539.         or.l    #ALIAS_LEFT_CLIP,d1     ;out[k].flags |= ALIAS_LEFT_CLIP
  540. .1
  541.         cmp.l   d6,d0                   ;if (out[k].v[0] > ...
  542.         ble.b   .2
  543.         or.l    #ALIAS_RIGHT_CLIP,d1    ;out[k].flags |= ALIAS_RIGHT_CLIP
  544. .2
  545.         move.l  4(a3),d0                ;if (out[k].v[1] < ...
  546.         cmp.l   d4,d0
  547.         bge.b   .3
  548.         or.l    #ALIAS_TOP_CLIP,d1      ;out[k].flags |= ALIAS_TOP_CLIP
  549. .3
  550.         cmp.l   d7,d0                   ;if (out[k].v[1] > ...
  551.         ble.b   .4
  552.         or.l    #ALIAS_BOTTOM_CLIP,d1   ;out[k].flags |= ALIAS_BOTTOM_CLIP
  553. .4
  554.         move.l  d1,FV_FLAGS(a3)
  555.         lea     FV_SIZEOF(a3),a3        ;k++
  556.         move.l  (sp)+,d1
  557.  
  558. *                if (!flags)
  559. *                {
  560. *                        out[k] = in[i];
  561. *                        k++;
  562. *                }
  563.  
  564. .cont
  565.         tst.l   d1                      ;if (!flags)
  566.         bne.b   .next
  567.         move.l  (a2)+,(a3)+             ;out[k] = in[i]
  568.         move.l  (a2)+,(a3)+
  569.         move.l  (a2)+,(a3)+
  570.         move.l  (a2)+,(a3)+
  571.         move.l  (a2)+,(a3)+
  572.         move.l  (a2)+,(a3)+
  573.         move.l  (a2)+,(a3)+
  574.         addq    #4,a3
  575.         sub     #28,a2
  576. .next
  577.         move.l  a5,a6
  578.         lea     FV_SIZEOF(a5),a5
  579.         lea     FV_SIZEOF(a2),a2
  580.         dbra    d5,.loop
  581.  
  582. *        return k;
  583.  
  584. .skip
  585.         move.l  a3,d0
  586.         sub.l   .out(sp),d0
  587.         asr.l   #FV_SIZEOF_EXP,d0
  588.         movem.l (sp)+,d2-d7/a2-a6
  589.         rts
  590.