home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / r_aclipppc.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  11.6 KB  |  568 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. ##
  17. ## r_aclipPPC.s
  18. ##
  19. ## Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
  20. ##
  21.  
  22. .include    "macrosPPC.i"
  23.  
  24. #
  25. # external references
  26. #
  27.  
  28.     xrefa    r_refdef
  29.     xrefv    INT2DBL_0
  30.     xrefv    c0_5
  31.  
  32.  
  33. #
  34. # defines
  35. #
  36.  
  37. .set    ALIAS_LEFT_CLIP        ,1
  38. .set    ALIAS_TOP_CLIP         ,2
  39. .set    ALIAS_RIGHT_CLIP       ,4
  40. .set    ALIAS_BOTTOM_CLIP      ,8
  41.  
  42. .set    FV_V                   ,0
  43. .set    FV_FLAGS               ,24
  44. .set    FV_RESERVED            ,28
  45. .set    FV_SIZEOF              ,32
  46. .set    FV_SIZEOF_EXP          ,5
  47.  
  48. .set    REFDEF_VRECT           ,0
  49. .set    REFDEF_ALIASVRECT      ,20
  50. .set    REFDEF_VRECTRIGHT      ,40
  51. .set    REFDEF_VRECTBOTTOM     ,44
  52. .set    REFDEF_ALIASVRECTRIGHT ,48
  53. .set    REFDEF_ALIASVRECTBOTTOM,52
  54.  
  55. .set    VRECT_X                ,0
  56. .set    VRECT_Y                ,4
  57. .set    VRECT_WIDTH            ,8
  58. .set    VRECT_HEIGHT           ,12
  59. .set    VRECT_PNEXT            ,16
  60.  
  61.  
  62.  
  63.  
  64. ###########################################################################
  65. #
  66. #       void _R_Alias_clip_left (finalvert_t *pfv0, finalvert_t *pfv1,
  67. #                                finalvert_t *out)
  68. #
  69. ###########################################################################
  70.  
  71.     funcdef    R_Alias_clip_left
  72.  
  73.     init    0,16,0,0
  74.  
  75.     lf      f1,INT2DBL_0        #for int2dbl setup, tmp=r6
  76.     stfd    f1,local(r1)
  77.     lxa     r7,r_refdef
  78.     lwz     r7,REFDEF_ALIASVRECT+VRECT_X(r7)
  79.     ls      f2,c0_5
  80.     subi    r3,r3,4
  81.     subi    r4,r4,4
  82.     subi    r5,r5,4
  83.     lwzu    r8,4(r3)
  84.     lwzu    r9,4(r3)
  85.     lwzu    r10,4(r4)
  86.     lwzu    r11,4(r4)
  87.     cmpw    r9,r11
  88.     blt     .lcont
  89.     subf    r12,r8,r7
  90.     int2dbl f3,r12,r6,local,f1
  91.     fadd    f4,f2,f3
  92.     subf    r12,r8,r10
  93.     int2dbl f5,r12,r6,local,f1
  94.     fdivs   f6,f3,f5
  95.     fctiwz  f0,f4
  96.     stfd    f0,local+8(r1)
  97.     lwz     r12,local+12(r1)
  98.     add     r12,r12,r8
  99.     stwu    r12,4(r5)
  100.     li      r0,5
  101.     mtctr   r0
  102.     b       .lentry
  103. .lloop:
  104.     lwzu    r9,4(r3)
  105.     lwzu    r11,4(r4)
  106. .lentry:
  107.     subf    r12,r9,r11
  108.     int2dbl f3,r12,r6,local,f1
  109.     fmadds  f3,f3,f6,f2
  110.     fctiwz  f0,f3
  111.     stfd    f0,local+8(r1)
  112.     lwz     r12,local+12(r1)
  113.     add     r12,r12,r9
  114.     stwu    r12,4(r5)
  115.     bdnz    .lloop
  116.     b       .lexit
  117. .lcont:
  118.     subf    r12,r10,r7
  119.     int2dbl f3,r12,r6,local,f1
  120.     fadd    f4,f2,f3
  121.     subf    r12,r10,r8
  122.     int2dbl f5,r12,r6,local,f1
  123.     fdivs   f6,f3,f5
  124.     fctiwz  f0,f4
  125.     stfd    f0,local+8(r1)
  126.     lwz     r12,local+12(r1)
  127.     add     r12,r12,r10
  128.     stwu    r12,4(r5)
  129.     li      r0,5
  130.     mtctr   r0
  131.     b       .lentry2
  132. .lloop2:
  133.     lwzu    r9,4(r3)
  134.     lwzu    r11,4(r4)
  135. .lentry2:
  136.     subf    r12,r11,r9
  137.     int2dbl f3,r12,r6,local,f1
  138.     fmadds  f3,f3,f6,f2
  139.     fctiwz  f0,f3
  140.     stfd    f0,local+8(r1)
  141.     lwz     r12,local+12(r1)
  142.     add     r12,r12,r11
  143.     stwu    r12,4(r5)
  144.     bdnz    .lloop2
  145. .lexit:
  146.     exit
  147.  
  148.     funcend    R_Alias_clip_left
  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.     funcdef    R_Alias_clip_right
  161.  
  162.     init    0,16,0,0
  163.  
  164.     lf      f1,INT2DBL_0        #for int2dbl_setup, tmp=r6
  165.     stfd    f1,local(r1)
  166.     lxa     r7,r_refdef
  167.     lwz     r7,REFDEF_ALIASVRECTRIGHT(r7)
  168.     ls      f2,c0_5
  169.     subi    r3,r3,4
  170.     subi    r4,r4,4
  171.     subi    r5,r5,4
  172.     lwzu    r8,4(r3)
  173.     lwzu    r9,4(r3)
  174.     lwzu    r10,4(r4)
  175.     lwzu    r11,4(r4)
  176.     cmpw    r9,r11
  177.     blt     .rcont
  178.     subf    r12,r8,r7
  179.     int2dbl f3,r12,r6,local,f1
  180.     fadd    f4,f2,f3
  181.     subf    r12,r8,r10
  182.     int2dbl f5,r12,r6,local,f1
  183.     fdivs   f6,f3,f5
  184.     fctiwz  f0,f4
  185.     stfd    f0,local+8(r1)
  186.     lwz     r12,local+12(r1)
  187.     add     r12,r12,r8
  188.     stwu    r12,4(r5)
  189.     li      r0,5
  190.     mtctr   r0
  191.     b       .rentry
  192. .rloop:
  193.     lwzu    r9,4(r3)
  194.     lwzu    r11,4(r4)
  195. .rentry:
  196.     subf    r12,r9,r11
  197.     int2dbl f3,r12,r6,local,f1
  198.     fmadds  f3,f3,f6,f2
  199.     fctiwz  f0,f3
  200.     stfd    f0,local+8(r1)
  201.     lwz     r12,local+12(r1)
  202.     add     r12,r12,r9
  203.     stwu    r12,4(r5)
  204.     bdnz    .rloop
  205.     b       .rexit
  206. .rcont:
  207.     subf    r12,r10,r7
  208.     int2dbl f3,r12,r6,local,f1
  209.     fadd    f4,f2,f3
  210.     subf    r12,r10,r8
  211.     int2dbl f5,r12,r6,local,f1
  212.     fdivs   f6,f3,f5
  213.     fctiwz  f0,f4
  214.     stfd    f0,local+8(r1)
  215.     lwz     r12,local+12(r1)
  216.     add     r12,r12,r10
  217.     stwu    r12,4(r5)
  218.     li      r0,5
  219.     mtctr   r0
  220.     b       .rentry2
  221. .rloop2:
  222.     lwzu    r9,4(r3)
  223.     lwzu    r11,4(r4)
  224. .rentry2:
  225.     subf    r12,r11,r9
  226.     int2dbl f3,r12,r6,local,f1
  227.     fmadds  f3,f3,f6,f2
  228.     fctiwz  f0,f3
  229.     stfd    f0,local+8(r1)
  230.     lwz     r12,local+12(r1)
  231.     add     r12,r12,r11
  232.     stwu    r12,4(r5)
  233.     bdnz    .rloop2
  234. .rexit:
  235.     exit
  236.  
  237.     funcend    R_Alias_clip_right
  238.  
  239.  
  240.  
  241.  
  242. ###########################################################################
  243. #
  244. #       void R_Alias_clip_top (finalvert_t *pfv0, finalvert_t *pfv1,
  245. #                                finalvert_t *out)
  246. #
  247. ###########################################################################
  248.  
  249.     funcdef    R_Alias_clip_top
  250.  
  251.     init    0,16,0,0
  252.  
  253.     lf      f1,INT2DBL_0        #for int2dbl_setup, tmp=r6
  254.     stfd    f1,local(r1)
  255.     lxa     r7,r_refdef
  256.     lwz     r7,REFDEF_ALIASVRECT+VRECT_Y(r7)
  257.     ls      f2,c0_5
  258.     subi    r3,r3,4
  259.     subi    r4,r4,4
  260.     subi    r5,r5,4
  261.     lwzu    r8,4(r3)
  262.     lwzu    r9,4(r3)
  263.     lwzu    r10,4(r4)
  264.     lwzu    r11,4(r4)
  265.     cmpw    r9,r11
  266.     blt     .tcont
  267.     subf    r12,r9,r7
  268.     int2dbl f3,r12,r6,local,f1
  269.     fadd    f4,f2,f3
  270.     subf    r12,r9,r11
  271.     int2dbl f5,r12,r6,local,f1
  272.     fdivs   f6,f3,f5
  273.     fctiwz  f0,f4
  274.     stfd    f0,local+8(r1)
  275.     lwz     r12,local+12(r1)
  276.     add     r12,r12,r9
  277.     stwu    r12,4(r5)
  278.     li      r0,5
  279.     mtctr   r0
  280.     b       .tentry
  281. .tloop:
  282.     lwzu    r8,4(r3)
  283.     lwzu    r10,4(r4)
  284. .tentry:
  285.     subf    r12,r8,r10
  286.     int2dbl f3,r12,r6,local,f1
  287.     fmadds  f3,f3,f6,f2
  288.     fctiwz  f0,f3
  289.     stfd    f0,local+8(r1)
  290.     lwz     r12,local+12(r1)
  291.     add     r12,r12,r8
  292.     stwu    r12,4(r5)
  293.     bdnz    .tloop
  294.     b       .texit
  295. .tcont:
  296.     subf    r12,r11,r7
  297.     int2dbl f3,r12,r6,local,f1
  298.     fadd    f4,f2,f3
  299.     subf    r12,r11,r9
  300.     int2dbl f5,r12,r6,local,f1
  301.     fdivs   f6,f3,f5
  302.     fctiwz  f0,f4
  303.     stfd    f0,local+8(r1)
  304.     lwz     r12,local+12(r1)
  305.     add     r12,r12,r11
  306.     stwu    r12,4(r5)
  307.     li      r0,5
  308.     mtctr   r0
  309.     b       .tentry2
  310. .tloop2:
  311.     lwzu    r8,4(r3)
  312.     lwzu    r10,4(r4)
  313. .tentry2:
  314.     subf    r12,r10,r8
  315.     int2dbl f3,r12,r6,local,f1
  316.     fmadds  f3,f3,f6,f2
  317.     fctiwz  f0,f3
  318.     stfd    f0,local+8(r1)
  319.     lwz     r12,local+12(r1)
  320.     add     r12,r12,r10
  321.     stwu    r12,4(r5)
  322.     bdnz    .tloop2
  323. .texit:
  324.     lwz     r3,-20(r5)
  325.     lwz     r4,-16(r5)
  326.     stw     r4,-20(r5)
  327.     stw     r3,-16(r5)
  328.     exit
  329.  
  330.     funcend    R_Alias_clip_top
  331.  
  332.  
  333.  
  334.  
  335. ###########################################################################
  336. #
  337. #       void R_Alias_clip_bottom (finalvert_t *pfv0, finalvert_t *pfv1,
  338. #                                finalvert_t *out)
  339. #
  340. ###########################################################################
  341.  
  342.     funcdef    R_Alias_clip_bottom
  343.  
  344.     init    0,16,0,0
  345.  
  346.     lf      f1,INT2DBL_0        #for int2dbl_setup, tmp=r6
  347.     stfd    f1,local(r1)
  348.     lxa     r7,r_refdef
  349.     lwz     r7,REFDEF_ALIASVRECTBOTTOM(r7)
  350.     ls      f2,c0_5
  351.     subi    r3,r3,4
  352.     subi    r4,r4,4
  353.     subi    r5,r5,4
  354.     lwzu    r8,4(r3)
  355.     lwzu    r9,4(r3)
  356.     lwzu    r10,4(r4)
  357.     lwzu    r11,4(r4)
  358.     cmpw    r9,r11
  359.     blt     .bcont
  360.     subf    r12,r9,r7
  361.     int2dbl f3,r12,r6,local,f1
  362.     fadd    f4,f2,f3
  363.     subf    r12,r9,r11
  364.     int2dbl f5,r12,r6,local,f1
  365.     fdivs   f6,f3,f5
  366.     fctiwz  f0,f4
  367.     stfd    f0,local+8(r1)
  368.     lwz     r12,local+12(r1)
  369.     add     r12,r12,r9
  370.     stwu    r12,4(r5)
  371.     li      r0,5
  372.     mtctr   r0
  373.     b       .bentry
  374. .bloop:
  375.     lwzu    r8,4(r3)
  376.     lwzu    r10,4(r4)
  377. .bentry:
  378.     subf    r12,r8,r10
  379.     int2dbl f3,r12,r6,local,f1
  380.     fmadds  f3,f3,f6,f2
  381.     fctiwz  f0,f3
  382.     stfd    f0,local+8(r1)
  383.     lwz     r12,local+12(r1)
  384.     add     r12,r12,r8
  385.     stwu    r12,4(r5)
  386.     bdnz    .bloop
  387.     b       .bexit
  388. .bcont:
  389.     subf    r12,r11,r7
  390.     int2dbl f3,r12,r6,local,f1
  391.     fadd    f4,f2,f3
  392.     subf    r12,r11,r9
  393.     int2dbl f5,r12,r6,local,f1
  394.     fdivs   f6,f3,f5
  395.     fctiwz  f0,f4
  396.     stfd    f0,local+8(r1)
  397.     lwz     r12,local+12(r1)
  398.     add     r12,r12,r11
  399.     stwu    r12,4(r5)
  400.     li      r0,5
  401.     mtctr   r0
  402.     b       .bentry2
  403. .bloop2:
  404.     lwzu    r8,4(r3)
  405.     lwzu    r10,4(r4)
  406. .bentry2:
  407.     subf    r12,r10,r8
  408.     int2dbl f3,r12,r6,local,f1
  409.     fmadds  f3,f3,f6,f2
  410.     fctiwz  f0,f3
  411.     stfd    f0,-8(r1)
  412.     lwz     r12,-4(r1)
  413.     add     r12,r12,r10
  414.     stwu    r12,4(r5)
  415.     bdnz    .bloop2
  416. .bexit:
  417.     lwz     r3,-20(r5)
  418.     lwz     r4,-16(r5)
  419.     stw     r4,-20(r5)
  420.     stw     r3,-16(r5)
  421.     exit
  422.  
  423.     funcend    R_Alias_clip_bottom
  424.  
  425.  
  426.  
  427.  
  428. ###########################################################################
  429. #
  430. #       int R_AliasClip  (finalvert_t *in, finalvert_t *out, int flag,
  431. #                          int count, void(*clip)(...)
  432. #
  433. ###########################################################################
  434.  
  435.     funcdef    R_AliasClip
  436.  
  437.     init    0,0,13,0
  438.     stmw    r19,gb(r1)
  439.  
  440. #        j = count-1;
  441. #        k = 0;
  442. #        for (i=0 ; i<count ; j = i, i++)
  443. #        {
  444.  
  445.     mr      r20,r6
  446.     subic.  r8,r6,1
  447.     blt     .acskip
  448.     slwi    r8,r8,FV_SIZEOF_EXP
  449.     add     r31,r3,r8               #r31 = in[j]
  450.     lxa     r10,r_refdef
  451.     lwz     r30,REFDEF_ALIASVRECT+VRECT_X(r10)
  452.     lwz     r29,REFDEF_ALIASVRECT+VRECT_Y(r10)
  453.     lwz     r28,REFDEF_ALIASVRECTRIGHT(r10)
  454.     lwz     r27,REFDEF_ALIASVRECTBOTTOM(r10)
  455.     mr      r26,r3
  456.     mr      r25,r3
  457.     mr      r24,r5
  458.     mr      r22,r7
  459.     mr      r21,r4
  460.     mr      r19,r4
  461.  
  462. #                oldflags = in[j].flags & flag;
  463. #                flags = in[i].flags & flag;
  464. #                if (flags && oldflags)
  465. #                        continue;
  466.  
  467. .acloop:
  468.     lwz     r0,FV_FLAGS(r31)
  469.     and     r0,r0,r24
  470.     lwz     r23,FV_FLAGS(r25)
  471.     and.    r23,r23,r24
  472.     beq     .acdo
  473.     mr.     r0,r0
  474.     bne     .acnext
  475. .acdo:
  476.  
  477. #                if (oldflags ^ flags)
  478. #                {
  479. #                        clip (&in[j], &in[i], &out[k]);
  480. #                        out[k].flags = 0;
  481. #                        if (out[k].v[0] < r_refdef.aliasvrect.x)
  482. #                                out[k].flags |= ALIAS_LEFT_CLIP;
  483. #                        if (out[k].v[1] < r_refdef.aliasvrect.y)
  484. #                                out[k].flags |= ALIAS_TOP_CLIP;
  485. #                        if (out[k].v[0] > r_refdef.aliasvrectright)
  486. #                                out[k].flags |= ALIAS_RIGHT_CLIP;
  487. #                        if (out[k].v[1] > r_refdef.aliasvrectbottom)
  488. #                                out[k].flags |= ALIAS_BOTTOM_CLIP;
  489. #                        k++;
  490. #                }
  491.  
  492.     xor.    r0,r0,r23
  493.     beq     .accont
  494.     mtlr    r22
  495.     mr      r3,r31
  496.     mr      r4,r25
  497.     mr      r5,r21
  498.     blrl
  499.     li      r3,0
  500.     lwz     r0,0(r21)
  501.     cmpw    r0,r30
  502.     bge     .ac1
  503.     ori     r3,r3,ALIAS_LEFT_CLIP
  504. .ac1:
  505.     cmpw    r0,r28
  506.     ble     .ac2
  507.     ori     r3,r3,ALIAS_RIGHT_CLIP
  508. .ac2:
  509.     lwz     r0,4(r21)
  510.     cmpw    r0,r29
  511.     bge     .ac3
  512.     ori     r3,r3,ALIAS_TOP_CLIP
  513. .ac3:
  514.     cmpw    r0,r27
  515.     ble     .ac4
  516.     ori     r3,r3,ALIAS_BOTTOM_CLIP
  517. .ac4:
  518.     stw     r3,FV_FLAGS(r21)
  519.     la      r21,FV_SIZEOF(r21)
  520.  
  521. #                if (!flags)
  522. #                {
  523. #                        out[k] = in[i];
  524. #                        k++;
  525. #                }
  526.  
  527. .accont:
  528.     mr.     r23,r23
  529.     bne     .acnext
  530.     lwz     r0,0(r25)
  531.     stw     r0,0(r21)
  532.     lwz     r3,4(r25)
  533.     stw     r3,4(r21)
  534.     lwz     r0,8(r25)
  535.     stw     r0,8(r21)
  536.     lwz     r3,12(r25)
  537.     stw     r3,12(r21)
  538.     lwz     r0,16(r25)
  539.     stw     r0,16(r21)
  540.     lwz     r3,20(r25)
  541.     stw     r3,20(r21)
  542.     lwz     r0,24(r25)
  543.     stw     r0,24(r21)
  544.     la      r21,FV_SIZEOF(r21)
  545. .acnext:
  546.     mr      r31,r26
  547.     la      r26,FV_SIZEOF(r26)
  548.     la      r25,FV_SIZEOF(r25)
  549.     subic.  r20,r20,1
  550.     bne     .acloop
  551.  
  552. #        return k;
  553.  
  554. .acskip:
  555.     subf    r3,r19,r21
  556.     srawi   r3,r3,FV_SIZEOF_EXP
  557.  
  558.     lmw    r19,gb(r1)
  559.     exit
  560.  
  561.     funcend    R_AliasClip
  562.