home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / d_skyppc.s < prev    next >
Text File  |  2000-06-17  |  13KB  |  422 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. ## d_skyPPC.s
  18. ##
  19. ## Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
  20. ##
  21.  
  22. .set NOLR,1
  23. .include        "macrosPPC.i"
  24.  
  25. #
  26. # external references
  27. #
  28.  
  29.     xrefv    d_viewbuffer
  30.     xrefv    screenwidth
  31.     xrefa    r_refdef
  32.     xrefv    r_skysource
  33.     xrefa    vid
  34.     xrefa    vright
  35.     xrefa    vpn
  36.     xrefa    vup
  37.     xrefv    skytime
  38.     xrefv    skyspeed
  39.  
  40.     xrefv    INT2DBL_0
  41.     xrefv    c0
  42.     xrefv    c0_5
  43.     xrefv    c65536
  44.     xrefa    _ReciprocTable
  45.  
  46.  
  47. #
  48. # defines
  49. #
  50.  
  51. .set    PSPAN_NEXT         ,12
  52. .set    REFDEF_VRECT_X     ,0
  53. .set    REFDEF_VRECT_Y     ,4
  54. .set    REFDEF_VRECT_WIDTH ,8
  55. .set    REFDEF_VRECT_HEIGHT,12
  56. .set    VID_WIDTH          ,20
  57. .set    VID_HEIGHT         ,24
  58.  
  59. .set    SKYSHIFT           ,7
  60. .set    SKYSIZE            ,(1<<SKYSHIFT)
  61. .set    SKYMASK            ,(SKYSIZE-1)
  62. .set    SKY_SPAN_SHIFT     ,5
  63. .set    SKY_SPAN_MAX       ,(1<<SKY_SPAN_SHIFT)
  64. .set    R_SKY_SMASK        ,0x7f0000
  65. .set    R_SKY_TMASK        ,0x7f0000
  66.  
  67.  
  68.  
  69.  
  70.  
  71. ###########################################################################
  72. #
  73. #       void D_DrawSkyScans8 (espan_t *pspan)
  74. #
  75. #       standard scan drawing function for the sky
  76. #
  77. #       D_Sky_uv_To_st is inlined.
  78. #
  79. #       IMPORTANT!! SKY_SPAN_SHIFT must *NOT* exceed 5 (The ReciprocTable
  80. #       has to be extended)
  81. #
  82. ###########################################################################
  83.  
  84.     funcdef    D_DrawSkyScans8
  85.  
  86.     init    0,16,12,12
  87.     stmw    r20,gb(r1)
  88.     stfd    f14,fb+0*8(r1)
  89.     stfd    f15,fb+1*8(r1)
  90.     stfd    f16,fb+2*8(r1)
  91.     stfd    f17,fb+3*8(r1)
  92.     stfd    f18,fb+4*8(r1)
  93.     stfd    f19,fb+5*8(r1)
  94.     stfd    f20,fb+6*8(r1)
  95.     stfd    f21,fb+7*8(r1)
  96.     stfd    f22,fb+8*8(r1)
  97.     stfd    f23,fb+9*8(r1)
  98.     stfd    f24,fb+10*8(r1)
  99.     stfd    f25,fb+11*8(r1)
  100.  
  101.     lf      f1,INT2DBL_0        #for int2dbl_setup, r4=tmp
  102.     stfd    f1,local(r1)
  103.         lw      r5,d_viewbuffer         #r5 = d_viewbuffer
  104.         lw      r6,screenwidth          #r6 = screenwidth
  105.         lw      r7,r_skysource          #r7 = r_skysource
  106.         lxa     r8,_ReciprocTable
  107.         lxa     r9,r_refdef
  108.         lxa     r12,vid            #r12 = vid
  109.         lxa     r31,vpn
  110.         lxa     r30,vup
  111.         lxa     r29,vright
  112.         lwz     r10,REFDEF_VRECT_HEIGHT(r9)
  113.         lwz     r11,REFDEF_VRECT_WIDTH(r9)
  114.         cmpw    r11,r10
  115.         blt     .height
  116.         int2dbl f2,r11,r4,local,f1    #f2 = temp = (float)r_refdef...
  117.         b       .width
  118. .height:
  119.         int2dbl f2,r10,r4,local,f1    #f2 = temp = (float)r_refdef...
  120. .width:
  121.         ls      f3,c8192
  122.         ls      f5,c4096                #f5 = 4096
  123.         ls      f0,c3
  124.         ls      f15,ca
  125.         ls      f19,c0
  126.         ls      f20,c0_5
  127.         lfs     f6,0(r31)
  128.         fmuls   f6,f6,f5                #f6 = 4096*vpn[0]
  129.         lfs     f7,4(r31)
  130.         fmuls   f7,f7,f5                #f7 = 4096*vpn[1]
  131.         lfs     f8,8(r31)
  132.         fmuls   f8,f8,f5                #f8 = 4096*vpn[2]
  133.         fdivs   f3,f3,f2                #f3 = 8192 / temp
  134.         subi    r3,r3,4
  135.         lwz     r31,VID_WIDTH(r12)
  136.         srawi   r31,r31,1               #r31 = vid.width >> 1
  137.         lwz     r12,VID_HEIGHT(r12)
  138.         srawi   r12,r12,1               #r12 = vid.height >> 1
  139.         int2dbl f9,r12,r4,local,f1    #f9 = (float)vid.height >> 1
  140.  
  141.         ls      f14,skytime
  142.         ls      f4,skyspeed
  143.         fmuls   f14,f14,f4
  144.         ls      f4,c65536
  145.         fmuls   f14,f14,f4
  146.         fctiwz  f14,f14
  147.         stfd    f14,local+8(r1)
  148.         lwz     r27,local+12(r1)        #r27 = skytime * skyspeed*$10000
  149. .loop:
  150.         lwzu    r9,4(r3)                #r9 = u
  151.         lwzu    r10,4(r3)               #r10 = v
  152.         int2dbl f4,r10,r4,local,f1    #f4 = (float)pspan->v
  153.         mullw   r0,r10,r6
  154.         add     r0,r0,r9
  155.         add     r11,r5,r0               #r11 = pdest = d_viewbuffer + ...
  156.         subi    r11,r11,1               #prepare for postincrement
  157.         fsubs   f10,f9,f4               #f10 = ((vid.height>>1)-v)
  158.         fmuls   f10,f10,f3              #wv = 8192 * fp0 / temp
  159.         lfs     f11,0(r30)
  160.         fmadds  f23,f11,f10,f6          #f23 = 4096*vpn[0] + wv*vup[0]
  161.         lfs     f11,4(r30)
  162.         fmadds  f24,f11,f10,f7          #f24 = 4096*vpn[1] + wv*vup[1]
  163.         lfs     f11,8(r30)
  164.         fmadds  f25,f11,f10,f8          #f25 = 4096*vpn[2] + wv*vup[2]
  165.         lfs     f4,0(r29)
  166.         fmuls   f4,f4,f3                #f4 = 8192 * vright[0] / temp
  167.         lfs     f12,4(r29)
  168.         fmuls   f12,f12,f3              #f12 = 8192 * vright[1] / temp
  169.         lfs     f13,8(r29)
  170.         fmuls   f13,f13,f3              #f13 = 8192 * vright[2] / temp
  171.         fmuls   f25,f25,f0
  172.         fmuls   f13,f13,f0
  173.         lwzu    r28,4(r3)               #r28 = count = pspan->count
  174.         li      r0,1
  175.         dcbtst  r11,r0
  176.  
  177. ######  D_Sky_uv_To_st (inlined)
  178.  
  179.         subf    r0,r31,r9
  180.         int2dbl f16,r0,r4,local,f1    #f16 = (float(u-vid.width>>1))
  181.         fmadds  f21,f16,f4,f23          #f17 = end[0]
  182.         fmuls   f17,f21,f21
  183.         fmadds  f22,f16,f12,f24         #f18 = end[1]
  184.         fmadds  f17,f22,f22,f17         #f17 = end[0]^2 + end[1]^2
  185.         fmadds  f18,f16,f13,f25         #f18 = end[2]
  186.         fmadds  f17,f18,f18,f17         #f17 = end[0]^2 + end[1]^2 + end[2]^2
  187.         fcmpo   cr0,f17,f19
  188.         beq     .zero
  189.         frsqrte f16,f17
  190.         fres    f16,f16
  191.         fdivs   f18,f17,f16
  192.         fadd    f16,f18,f16
  193.         fmul    f17,f16,f20             #f17 = sqrt(...)
  194. .zero:
  195.         fdivs   f18,f15,f17
  196.         fmuls   f21,f21,f18             #f21 = 6*(SKYSIZE/2-1)*end[0]
  197.         fmuls   f22,f22,f18             #f22 = 6*(SKYSIZE/2-1)*end[1]
  198.         fctiwz  f21,f21
  199.         stfd    f21,local+8(r1)
  200.         lwz     r26,local+12(r1)
  201.         add     r26,r26,r27             #r26 = s
  202.         fctiwz  f22,f22
  203.         stfd    f22,local+8(r1)
  204.         lwz     r25,local+12(r1)
  205.         add     r25,r25,r27             #r25 = t
  206.  
  207. ######  end of D_Sky_uv_To_st
  208.  
  209. ######  Second loop. In every iteration one part of the whole span is drawn
  210.  
  211. #                do
  212. #                {
  213. #                        if (count >= SKY_SPAN_MAX)
  214. #                                spancount = SKY_SPAN_MAX;
  215. #                        else
  216. #                                spancount = count;
  217. #
  218. #                        count -= spancount;
  219. #
  220. #                        if (count)
  221. #                        {
  222.  
  223. .loop2:
  224.         cmpwi   r28,SKY_SPAN_MAX
  225.         bgt     .cont
  226.         mtctr   r28
  227.         subi    r20,r28,1               #r20 = spancountminus1
  228.         li      r28,0                   #r28 = count -= spancount
  229.         b       .finalpart
  230. .cont:
  231.         li      r20,SKY_SPAN_MAX        #r20 = spancount = SKY_SPAN_MAX
  232.         subf    r28,r20,r28             #r28 = count -= spancount
  233.         mtctr   r20
  234.  
  235.  
  236. ######  Evaluation of the values for the inner loop. This version is used for
  237. ######  span size = SKY_SPAN_MAX
  238.  
  239. #                        // calculate s and t at far end of span,
  240. #                        // calculate s and t steps across span by shifting
  241. #                                u += spancount;
  242. #
  243. #                                D_Sky_uv_To_st (u, v, &snext, &tnext);
  244. #
  245. #                                sstep = (snext - s) >> SKY_SPAN_SHIFT;
  246. #                                tstep = (tnext - t) >> SKY_SPAN_SHIFT;
  247. #                        }
  248.  
  249.  
  250.         add     r9,r9,r20               #u += spancount
  251.  
  252. ######  D_Sky_uv_To_st (inlined)
  253.  
  254.         subf    r0,r31,r9
  255.         int2dbl f16,r0,r4,local,f1    #f16 = (float(u-vid.width>>1))
  256.         fmadds  f21,f16,f4,f23          #f17 = end[0]
  257.         fmuls   f17,f21,f21
  258.         fmadds  f22,f16,f12,f24         #f18 = end[1]
  259.         fmadds  f17,f22,f22,f17         #f17 = end[0]^2 + end[1]^2
  260.         fmadds  f18,f16,f13,f25         #f18 = end[2]
  261.         fmadds  f17,f18,f18,f17         #f17 = end[0]^2 + end[1]^2 + end[2]^2
  262.         fcmpo   cr0,f17,f19
  263.         beq     .zero2
  264.         frsqrte f16,f17
  265.         fres    f16,f16
  266.         fdivs   f18,f17,f16
  267.         fadd    f16,f18,f16
  268.         fmul    f17,f16,f20             #f17 = sqrt(...)
  269. .zero2:
  270.         fdivs   f18,f15,f17
  271.         fmuls   f21,f21,f18             #f21 = 6#(SKYSIZE/2-1)*end[0]
  272.         fctiwz  f21,f21
  273.         stfd    f21,local+8(r1)
  274.         fmuls   f22,f22,f18             #f22 = 6*(SKYSIZE/2-1)*end[1]
  275.         lwz     r24,local+12(r1)
  276.         fctiwz  f22,f22
  277.         stfd    f22,local+8(r1)
  278.         add     r24,r24,r27             #r24 = snext
  279.         lwz     r23,local+12(r1)
  280.         add     r23,r23,r27             #r23 = tnext
  281.  
  282. ######  end of D_Sky_uv_To_st
  283.  
  284.         subf    r22,r26,r24             #r22 = snext - s
  285.         subf    r21,r25,r23             #r21 = tnext - t
  286.         srawi   r22,r22,SKY_SPAN_SHIFT  #r22 = sstep
  287.         srawi   r21,r21,SKY_SPAN_SHIFT  #r21 = tstep
  288.         b       .mainloop
  289.  
  290.  
  291. .finalpart:
  292.         add     r9,r9,r20               #u += spancountminus1
  293.  
  294. ######  D_Sky_uv_To_st (inlined)
  295.  
  296.         subf    r0,r31,r9
  297.         int2dbl f16,r0,r4,local,f1    #f16 = (float(u-vid.width>>1))
  298.         fmadds  f21,f16,f4,f23          #f17 = end[0]
  299.         fmuls   f17,f21,f21
  300.         fmadds  f22,f16,f12,f24         #f18 = end[1]
  301.         fmadds  f17,f22,f22,f17         #f17 = end[0]^2 + end[1]^2
  302.         fmadds  f18,f16,f13,f25         #f18 = end[2]
  303.         fmadds  f17,f18,f18,f17         #f17 = end[0]^2 + end[1]^2 + end[2]^2
  304.         fcmpo   cr0,f17,f19
  305.         beq     .zero3
  306.         frsqrte f16,f17
  307.         fres    f16,f16
  308.         fdivs   f18,f17,f16
  309.         fadd    f16,f18,f16
  310.         fmul    f17,f16,f20             #f17 = sqrt(...)
  311. .zero3:
  312.         cmplwi  r20,5
  313.         fdivs   f18,f15,f17
  314.         fmuls   f21,f21,f18             #f21 = 6*(SKYSIZE/2-1)*end[0]
  315.         fctiwz  f21,f21
  316.         stfd    f21,local+8(r1)
  317.         fmuls   f22,f22,f18             #f22 = 6*(SKYSIZE/2-1)*end[1]
  318.         lwz     r24,local+12(r1)
  319.         fctiwz  f22,f22
  320.         stfd    f22,local+8(r1)
  321.         add     r24,r24,r27             #r24 = snext
  322.         lwz     r23,local+12(r1)
  323.         add     r23,r23,r27             #r23 = tnext
  324.  
  325. ######  end of D_Sky_uv_To_st
  326.  
  327.         subf    r22,r26,r24             #r22 = snext - s
  328.         subf    r21,r25,r23             #r21 = tnext - t
  329.  
  330.         blt     .special
  331. .qdiv:
  332.         slwi    r0,r20,2
  333.         lwzx    r0,r8,r0
  334.         mulhw   r22,r22,r0
  335.         mulhw   r21,r21,r0
  336.         b       .mainloop
  337. .special:
  338.         cmplwi  r20,1
  339.         ble     .mainloop
  340.         cmplwi  r20,3
  341.         beq     .qdiv
  342.         blt     .spec_2
  343.         srawi   r22,r22,2
  344.         srawi   r21,r21,2
  345.         b       .mainloop
  346. .spec_2:
  347.         srawi   r22,r22,1
  348.         srawi   r21,r21,1
  349.  
  350.  
  351. ######  Main drawing loop.
  352.  
  353. #                        do
  354. #                        {
  355. #                                *pdest++ = r_skysource[((t & R_SKY_TMASK) >> 8) +
  356. #                                                ((s & R_SKY_SMASK) >> 16)];
  357. #                                s += sstep;
  358. #                                t += tstep;
  359. #                        } while (--spancount > 0);
  360.  
  361.  
  362. .mainloop:
  363.         rlwinm  r0,r25,24,17,23         #implied: R_SKY_TMASK
  364.         add     r25,r25,r21             #t += tstep
  365.         rlwimi  r0,r26,16,25,31         #implied: R_SKY_SMASK
  366.         add     r26,r26,r22             #s += sstep
  367.         lbzx    r0,r7,r0                #r_skysource[...]
  368.         stbu    r0,1(r11)
  369.         bdnz    .mainloop
  370.  
  371. ######  loop terminations
  372.  
  373.         mr      r26,r24                 #s = snext
  374.         mr      r25,r23                 #t = tnext
  375.         mr.     r28,r28
  376.         bgt     .loop2
  377.         lwz     r3,4(r3)
  378.         mr.     r3,r3
  379.         subi    r3,r3,4
  380.         bne     .loop
  381.  
  382.     lfd    f14,fb+0*8(r1)
  383.     lfd    f15,fb+1*8(r1)
  384.     lfd    f16,fb+2*8(r1)
  385.     lfd    f17,fb+3*8(r1)
  386.     lfd    f18,fb+4*8(r1)
  387.     lfd    f19,fb+5*8(r1)
  388.     lfd    f20,fb+6*8(r1)
  389.     lfd    f21,fb+7*8(r1)
  390.     lfd    f22,fb+8*8(r1)
  391.     lfd    f23,fb+9*8(r1)
  392.     lfd    f24,fb+10*8(r1)
  393.     lfd    f25,fb+11*8(r1)
  394.     lmw    r20,gb(r1)
  395.     exit
  396.  
  397.     funcend    D_DrawSkyScans8
  398.  
  399.  
  400.  
  401.  
  402. .ifdef    WOS
  403.     .tocd
  404. .else
  405.     .data
  406. .endif
  407.  
  408. lab c8192
  409.     .float    8192.0
  410. lab c4096
  411.     .float    4096.0
  412. lab c3
  413.     .float    3.0
  414. lab ca
  415.     .float    24772608.0    # => 65536*6*(SKYSIZE/2-1)
  416.