home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 15 / MA_Cover_15.iso / source / winquake / amiga_d_68k.s < prev    next >
Encoding:
Text File  |  2000-02-23  |  23.7 KB  |  1,605 lines

  1.  
  2. ; 680x0 optimised Quake render routines by John Selck.
  3.  
  4.     ; d_scan.c:
  5.  
  6.         XDEF    @D_WarpScreen
  7.         XDEF    @Turbulent8
  8.         ;XDEF    @D_DrawTurbulent8Span    ; used by @Turbulent8 only
  9.         XDEF    _D_DrawSpans8
  10.         XDEF    @D_DrawSpans8
  11.         XDEF    @D_DrawSpans16
  12.         XDEF    @D_DrawZSpans
  13.         XDEF    _D_DrawZSpans
  14.  
  15.     ; d_sky.c:
  16.  
  17.         XDEF    @D_DrawSkyScans8
  18.         XDEF    _D_DrawSkyScans8
  19.         ;XDEF    @D_Sky_uv_To_st    ; used by D_DrawSkyScans8 only
  20.  
  21.     ; d_sprite.c:
  22.  
  23.         XDEF    _D_SpriteDrawSpans
  24.         XDEF    @D_SpriteDrawSpans
  25.  
  26.     ; d_part.c:
  27.  
  28.         XDEF    @D_DrawParticle
  29.  
  30.     ; d_edge.c:
  31.  
  32.         XDEF    _D_CalcGradients
  33.         XDEF    @D_CalcGradients
  34.  
  35.     ; external defs:
  36.  
  37.         XREF    @TransformVector
  38.         XREF    @VectorScale
  39.  
  40.         XREF    _miplevel
  41.         XREF    _xscaleinv
  42.         XREF    _yscaleinv
  43.         XREF    _transformed_modelorg
  44.  
  45.         XREF    _xcenter
  46.         XREF    _ycenter
  47.         XREF    _d_scantable
  48.         XREF    _d_pzbuffer
  49.         XREF    _d_zwidth
  50.         XREF    _d_vrectx
  51.         XREF    _d_vrecty
  52.         XREF    _d_vrectright_particle
  53.         XREF    _d_vrectbottom_particle
  54.         XREF    _d_pix_min
  55.         XREF    _d_pix_max
  56.         XREF    _d_pix_shift
  57.         XREF    _d_y_aspect_shift
  58.         XREF    _r_origin
  59.         XREF    _r_ppn
  60.         XREF    _r_pright
  61.         XREF    _r_pup
  62.  
  63.         XREF    _cacheblock
  64.         XREF    _d_sdivzstepu
  65.         XREF    _d_sdivzstepv
  66.         XREF    _d_sdivzorigin
  67.         XREF    _d_tdivzstepu
  68.         XREF    _d_tdivzstepv
  69.         XREF    _d_tdivzorigin
  70.         XREF    _d_zistepu
  71.         XREF    _d_zistepv
  72.         XREF    _d_ziorigin
  73.         XREF    _screenwidth
  74.         XREF    _d_viewbuffer
  75.         XREF    _sadjust
  76.         XREF    _tadjust
  77.         XREF    _bbextents
  78.         XREF    _bbextentt
  79.         XREF    _cachewidth
  80.  
  81.         XREF    _d_zwidth
  82.         XREF    _d_pzbuffer
  83.  
  84.         XREF    _cl
  85.         XREF    _sintable
  86.  
  87.         XREF    _r_refdef
  88.         XREF    _vup
  89.         XREF    _vid
  90.         XREF    _vright
  91.         XREF    _vpn
  92.         XREF    _skyspeed
  93.         XREF    _skytime
  94.         XREF    _r_skysource
  95.  
  96.         XREF    _scr_vrect
  97.         XREF    _intsintable
  98.  
  99.         SECTION    "Span",CODE
  100.  
  101. @D_WarpScreen:
  102.         fmovem.x    fp2-fp7,-(sp)
  103.         movem.l    d2-d7/a2-a6,-(sp)
  104.  
  105.         fmove.l    _r_refdef+8,fp0        ; w
  106.         fmove.l    _r_refdef+12,fp1    ; h
  107.         fmove.x    fp0,fp2
  108.         fmove.x    fp1,fp3
  109.         fdiv.l    _scr_vrect+8,fp2    ; wratio
  110.  
  111.         lea    oldsp(pc),a0
  112.         move.l    sp,(a0)
  113.         sub.w    #(1280+8+1024+8)*4,sp
  114.         move.l    sp,d0
  115.         and.w    #$fff0,d0
  116.         move.l    d0,sp
  117.  
  118.         fdiv.l    _scr_vrect+12,fp3    ; hratio
  119.  
  120.         move.l    _d_viewbuffer,a0
  121.  
  122.         move.l    _screenwidth,d0
  123.         muls.l    _r_refdef+4,d0
  124.         fmove.x    fp3,fp6
  125.         fmul.x    fp1,fp6
  126.         fmove.x    fp1,fp7
  127.         fadd.s    #6,fp7
  128.         fdiv.x    fp7,fp6    ; hratio*h/(h+AMP2*2)
  129.  
  130.         ;lea    rowptr(pc),a5
  131.         lea    1288*4(sp),a5
  132.  
  133.         move.l    _scr_vrect+12,d6
  134.         addq.l    #6,d6
  135.         moveq    #0,d7
  136. .w1
  137.         fmove.l    d7,fp7
  138.         fmul.x    fp6,fp7
  139.         addq.l    #1,d7
  140.         fmove.l    fp7,d1
  141.         muls.l    _screenwidth,d1
  142.         add.l    d0,d1
  143.         add.l    a0,d1
  144.         move.l    d1,(a5)+
  145.         subq.l    #1,d6
  146.         bne.b    .w1
  147.  
  148.         move.l    _r_refdef+4,d0
  149.         fmove.x    fp3,fp6
  150.         fmul.x    fp1,fp6
  151.         fmove.x    fp1,fp7
  152.         fadd.s    #6,fp7
  153.         fdiv.x    fp7,fp6    ; wratio*w/(w+AMP2*2)
  154.  
  155.         ;lea    column(pc),a5
  156.         move.l    sp,a5
  157.  
  158.         move.l    _scr_vrect+8,d6
  159.         addq.l    #6,d6
  160.         moveq    #0,d7
  161. .w0
  162.         fmove.l    d7,fp7
  163.         fmul.x    fp6,fp7
  164.         addq.l    #1,d7
  165.         fmove.l    fp7,d1
  166.         add.l    d0,d1
  167.         move.l    d1,(a5)+
  168.         subq.l    #1,d6
  169.         bne.b    .w0
  170.  
  171.         fmove.d    _cl+$023c,fp0
  172.         fmul.s    #20,fp0
  173.         fmove.l    fp0,d0
  174.         and.l    #$7f,d0
  175.         lea    _intsintable,a0
  176.         lea    (a0,d0.w*4),a0
  177.  
  178.         move.l    _scr_vrect+4,d0
  179.         mulu.l    _vid+16,d0
  180.         add.l    _scr_vrect,d0
  181.         move.l    _vid,a1
  182.         add.l    d0,a1
  183.  
  184.  
  185.         moveq    #0,d7
  186. .wrp0
  187.         moveq    #0,d0
  188.         move.l    (a0,d7.w*4),d0
  189.         move.l    sp,a2
  190.         ;lea    column,a2
  191.         lea    (a2,d0.w*4),a2
  192.         lea    1288*4(sp),a3
  193.         ;lea    rowptr,a3
  194.         lea    (a3,d7.w*4),a3
  195.  
  196.         movem.l    a0-a2,-(sp)
  197.  
  198.         moveq    #0,d6
  199. .wrp1        move.l    (a0)+,d0
  200.         move.l    (a3,d0.w*4),a5
  201.         add.l    (a2)+,a5
  202.         move.b    (a5),(a1)+
  203.         move.l    (a0)+,d0
  204.         move.l    (a3,d0.w*4),a5
  205.         add.l    (a2)+,a5
  206.         move.b    (a5),(a1)+
  207.         move.l    (a0)+,d0
  208.         move.l    (a3,d0.w*4),a5
  209.         add.l    (a2)+,a5
  210.         move.b    (a5),(a1)+
  211.         move.l    (a0)+,d0
  212.         move.l    (a3,d0.w*4),a5
  213.         add.l    (a2)+,a5
  214.         move.b    (a5),(a1)+
  215.         addq.l    #4,d6
  216.         cmp.l    _scr_vrect+8,d6
  217.         blt.b    .wrp1
  218.         movem.l    (sp)+,a0-a2
  219.  
  220.         add.l    _vid+16,a1
  221.         addq.l    #1,d7
  222.         cmp.l    _scr_vrect+12,d7
  223.         blt.b    .wrp0
  224.  
  225.         move.l    oldsp(pc),sp
  226.  
  227.         movem.l    (sp)+,d2-d7/a2-a6
  228.         fmovem.x    (sp)+,fp2-fp7
  229.         rts
  230.         cnop    0,4
  231. oldsp:        dc.l    0
  232.  
  233. ; void __asm D_DrawTurbulent8Span (void);
  234. ; void __asm Turbulent8 (register __a0 espan_t *pspan)
  235.  
  236. ;    turbulent polygon span renderer
  237.  
  238.         cnop    0,4
  239. @Turbulent8:
  240.         fmovem.x    fp2-fp7,-(sp)
  241.  
  242.         fmove.d    _cl+$023c,fp0
  243.         fmul.s    #20,fp0
  244.         movem.l    d2-d7/a2-a6,-(sp)
  245.         move.l    a0,a6
  246.         lea    _sintable,a2
  247.         fmove.l    fp0,d0
  248.  
  249.         fmove.s    #16,fp4
  250.         fmove.x    fp4,fp5
  251.         fmove.x    fp4,fp6
  252.         fmul.s    _d_sdivzstepu,fp4
  253.         and.w    #$7f,d0
  254.         lea    (a2,d0.w*4),a2
  255.         fmul.s    _d_tdivzstepu,fp5
  256.         move.l    _cacheblock,a0
  257.         move.l    _sadjust,a3
  258.         fmul.s    _d_zistepu,fp6
  259.         subq.l    #4,sp
  260. .t1
  261.         move.l    (a6),d0        ; pspan->u
  262.         fmove.l    d0,fp3
  263.  
  264.         fmove.s    _d_sdivzstepu,fp0
  265.         fmul.x    fp3,fp0
  266.     move.l    4(a6),d1    ; pspan->v
  267.     fmove.l    d1,fp7
  268.         fmove.s    _d_sdivzstepv,fp1
  269.         fmul.x    fp7,fp1
  270.         fadd.x    fp1,fp0
  271.         fadd.s    _d_sdivzorigin,fp0
  272.  
  273.         fmove.s    _d_tdivzstepu,fp1
  274.         fmul.x    fp3,fp1
  275.         fmove.s    _d_tdivzstepv,fp2
  276.         fmul.x    fp7,fp2
  277.     move.l    8(a6),d7    ; pspan->count
  278.         fadd.x    fp2,fp1
  279.         fadd.s    _d_tdivzorigin,fp1
  280.  
  281.         fmove.s    _d_zistepu,fp2
  282.         fmul.x    fp3,fp2
  283.     move.l    _d_viewbuffer,a1
  284.         fmove.s    _d_zistepv,fp3
  285.         fmul.x    fp7,fp3
  286.     muls.l    _screenwidth,d1
  287.         fadd.x    fp3,fp2
  288.         fadd.s    _d_ziorigin,fp2
  289.  
  290.         fmove.s    #65536,fp3
  291.         fdiv.x    fp2,fp3
  292.  
  293.     add.l    d0,a1
  294.     add.l    d1,a1
  295.  
  296.     move.l    _bbextents,d0
  297.     move.l    _bbextentt,d1
  298.  
  299.         fmove.x    fp0,fp7
  300.         fmul.x    fp3,fp7
  301.         fmove.l    fp7,d2
  302.  
  303.         fmul.x    fp1,fp3
  304.  
  305.         add.l    a3,d2
  306.  
  307.         cmp.l    d0,d2
  308.         ble.b    .f0
  309.         move.l    d0,d2
  310.         bra.b    .f1
  311. .f0
  312.         tst.l    d2
  313.         bpl.b    .f1
  314.         moveq    #0,d2
  315. .f1
  316.         fmove.l    fp3,d3
  317.         add.l    _tadjust,d3
  318.  
  319.         cmp.l    d1,d3
  320.         ble.b    .f2
  321.         move.l    d1,d3
  322.         bra.b    .f3
  323. .f2
  324.         tst.l    d3
  325.         bpl.b    .f3
  326.         moveq    #0,d3
  327. .f3
  328.  
  329. .t0
  330.         moveq    #16,d1
  331.         cmp.l    d1,d7
  332.         blt.b    .tt
  333.  
  334.         fadd.x    fp4,fp0
  335.         fadd.x    fp5,fp1
  336.         fadd.x    fp6,fp2
  337.         fmove.s    #65536,fp3
  338.         fdiv.x    fp2,fp3
  339.  
  340.         move.l    d1,d6
  341.         sub.l    d1,d7
  342.         move.l    d7,(sp)
  343.  
  344.         fmove.x    fp0,fp7
  345.         fmul.x    fp3,fp7
  346.     move.l    _bbextents,d0
  347.     move.l    _bbextentt,d7
  348.         fmove.l    fp7,d4
  349.         add.l    a3,d4
  350.  
  351.         cmp.l    d0,d4
  352.         ble.b    .f4
  353.         move.l    d0,d4
  354.         bra.b    .f5
  355. .f4
  356.         cmp.l    d1,d4
  357.         bge.b    .f5
  358.         move.l    d1,d4
  359. .f5
  360.         fmul.x    fp1,fp3
  361.         fmove.l    fp3,d5
  362.         add.l    _tadjust,d5
  363.  
  364.         cmp.l    d7,d5
  365.         ble.b    .f6
  366.         move.l    d7,d5
  367.         bra.b    .f7
  368. .f6
  369.         cmp.l    d1,d5
  370.         bge.b    .f7
  371.         move.l    d1,d5
  372. .f7
  373.         move.l    d4,a4
  374.         move.l    d5,a5
  375.         sub.l    d2,d4
  376.         sub.l    d3,d5
  377.         asr.l    #4,d4
  378.         asr.l    #4,d5
  379.         bra.w    .ttrend
  380. .tt
  381.         move.l    d7,d6
  382.         clr.l    (sp)
  383.  
  384.         move.l    d6,d0
  385.         subq.l    #1,d0
  386.         ble.w    .ttrend
  387.         fmove.l    d0,fp7
  388.  
  389.         fmove.s    _d_sdivzstepu,fp3
  390.         fmul.x    fp7,fp3
  391.         fadd.x    fp3,fp0
  392.         fmove.s    _d_tdivzstepu,fp3
  393.         fmul.x    fp7,fp3
  394.         fadd.x    fp3,fp1
  395.         fmove.s    _d_zistepu,fp3
  396.         fmul.x    fp7,fp3
  397.         fadd.x    fp3,fp2
  398.         fmove.s    #65536,fp3
  399.         fdiv.x    fp2,fp3
  400.  
  401.         move.l    _bbextents,d0
  402.         move.l    _bbextentt,d7
  403.  
  404.         fmove.x    fp0,fp7
  405.         fmul.x    fp3,fp7
  406.         fmove.l    fp7,d4
  407.  
  408.         fmul.x    fp1,fp3
  409.  
  410.         add.l    a3,d4
  411.  
  412.         cmp.l    d0,d4
  413.         ble.b    .f8
  414.         move.l    d0,d4
  415.         bra.b    .f9
  416. .f8
  417.         cmp.l    d1,d4
  418.         bge.b    .f9
  419.         move.l    d1,d4
  420. .f9
  421.         fmove.l    fp3,d5
  422.         add.l    _tadjust,d5
  423.  
  424.         cmp.l    d7,d5
  425.         ble.b    .f10
  426.         move.l    d7,d5
  427.         bra.b    .f11
  428. .f10
  429.         cmp.l    d1,d5
  430.         bge.b    .f11
  431.         move.l    d1,d5
  432. .f11
  433.         move.l    d4,a4
  434.         move.l    d6,d0
  435.         move.l    d5,a5
  436.         subq.l    #1,d0
  437.         sub.l    d2,d4
  438.         lsl.l    #8,d0
  439.         sub.l    d3,d5
  440.         divs.w    d0,d4
  441.         divs.w    d0,d5
  442.         ext.l    d4
  443.         ext.l    d5
  444.         lsl.l    #8,d4
  445.         lsl.l    #8,d5
  446. .ttrend
  447.         moveq    #$7f,d7
  448. .ti
  449.         move.l    d2,d0
  450.         move.l    d3,d1
  451.         swap    d0
  452.         swap    d1
  453.         and.w    d7,d0
  454.         and.w    d7,d1
  455.         move.l    (a2,d0.w*4),d0
  456.         move.l    (a2,d1.w*4),d1
  457.  
  458.         add.l    d3,d0
  459.         add.l    d2,d1
  460.         swap    d0
  461.         swap    d1
  462.         and.w    #$3f,d0
  463.         and.w    #$3f,d1
  464.         lsl.w    #6,d0
  465.         add.l    d4,d2
  466.         add.w    d1,d0
  467.         add.l    d5,d3
  468.         move.b    (a0,d0.w),(a1)+
  469.  
  470.         subq.l    #1,d6
  471.         bgt.b    .ti
  472.  
  473.         move.l    a4,d2
  474.         move.l    a5,d3
  475.  
  476.         move.l    (sp),d7
  477.         bgt.w    .t0
  478.  
  479.         move.l    12(a6),a6
  480.         move.l    a6,d0
  481.         bne.w    .t1
  482.  
  483.         addq.l    #4,sp
  484.         movem.l    (sp)+,d2-d7/a2-a6
  485.         fmovem.x    (sp)+,fp2-fp7
  486.         rts
  487.  
  488. ; void __asm D_DrawSpans8 (register __a0 espan_t *pspan)
  489.  
  490. ;    perspective texture mapped polygon span renderer
  491.  
  492.         cnop    0,4
  493. @D_DrawSpans16:
  494. @D_DrawSpans8:
  495. _D_DrawSpans8:
  496.         fmovem.x    fp2-fp7,-(sp)
  497.  
  498.         fmove.s    #16,fp4
  499.         fmove.x    fp4,fp5
  500.         fmove.x    fp4,fp6
  501.         fmul.s    _d_sdivzstepu,fp4
  502.     movem.l    d2-d7/a2-a6,-(sp)
  503.         fmul.s    _d_tdivzstepu,fp5
  504.     move.l    _cacheblock,a1
  505.         fmul.s    _d_zistepu,fp6
  506.     move.l    _sadjust,a6
  507. .l1
  508.         move.l    (a0),d0        ; pspan->u
  509.         fmove.l    d0,fp3
  510.  
  511.         fmove.s    _d_sdivzstepu,fp0
  512.         fmul.x    fp3,fp0
  513.     move.l    4(a0),d1    ; pspan->v
  514.     fmove.l    d1,fp7
  515.         fmove.s    _d_sdivzstepv,fp1
  516.         fmul.x    fp7,fp1
  517.         fadd.x    fp1,fp0
  518.         fadd.s    _d_sdivzorigin,fp0
  519.  
  520.         fmove.s    _d_tdivzstepu,fp1
  521.         fmul.x    fp3,fp1
  522.         fmove.s    _d_tdivzstepv,fp2
  523.         fmul.x    fp7,fp2
  524.     move.l    8(a0),d7    ; pspan->count
  525.         fadd.x    fp2,fp1
  526.         fadd.s    _d_tdivzorigin,fp1
  527.  
  528.         fmove.s    _d_zistepu,fp2
  529.         fmul.x    fp3,fp2
  530.     move.l    _d_viewbuffer,a2
  531.         fmove.s    _d_zistepv,fp3
  532.         fmul.x    fp7,fp3
  533.     muls.l    _screenwidth,d1
  534.         fadd.x    fp3,fp2
  535.         fadd.s    _d_ziorigin,fp2
  536.  
  537.         fmove.s    #65536,fp3
  538.         fdiv.x    fp2,fp3
  539.  
  540.     add.l    d0,a2
  541.     add.l    d1,a2
  542.  
  543.         ; fp0 = sdivz
  544.         ; fp1 = tdivz
  545.         ; fp2 = zi
  546.         ; fp3 = z
  547.  
  548.     move.l    _bbextents,d0
  549.     move.l    _bbextentt,d1
  550.  
  551.         fmove.x    fp0,fp7
  552.         fmul.x    fp3,fp7
  553.         fmove.l    fp7,d2
  554.  
  555.         fmul.x    fp1,fp3
  556.  
  557.         add.l    a6,d2
  558.  
  559.         cmp.l    d0,d2
  560.         ble.b    .ss0
  561.         move.l    d0,d2
  562.         bra.b    .ss1
  563. .ss0
  564.         tst.l    d2
  565.         bpl.b    .ss1
  566.         moveq    #0,d2
  567. .ss1
  568.         fmove.l    fp3,d3
  569.  
  570.         cmp.w    #16,d7        ;
  571.         blt.b    .sdiv        ;
  572.         fmove.s    #65536,fp3    ;
  573.         fadd.x    fp6,fp2        ;
  574.         fdiv.x    fp2,fp3        ;
  575. .sdiv
  576.         add.l    _tadjust,d3
  577.  
  578.         cmp.l    d1,d3
  579.         ble.b    .ss2
  580.         move.l    d1,d3
  581.         bra.b    .ss3
  582. .ss2
  583.         tst.l    d3
  584.         bpl.b    .ss3
  585.         moveq    #0,d3
  586. .ss3
  587.  
  588. .here
  589.         moveq    #16,d1
  590.         cmp.l    d1,d7
  591.         blt.w    .sx1
  592.  
  593.         fadd.x    fp4,fp0
  594.         fadd.x    fp5,fp1
  595.  
  596.         move.l    d7,a3
  597.         move.l    d1,d6
  598.         sub.l    d1,a3
  599.  
  600.         fmove.x    fp0,fp7
  601.         fmul.x    fp3,fp7
  602.     move.l    _bbextents,d0
  603.     move.l    _bbextentt,d7
  604.         fmove.l    fp7,d4
  605.         add.l    a6,d4
  606.  
  607.         fmul.x    fp1,fp3
  608.  
  609.         cmp.l    d0,d4
  610.         ble.b    .ss4
  611.         move.l    d0,d4
  612.         bra.b    .ss5
  613. .ss4
  614.         cmp.l    d1,d4
  615.         bge.b    .ss5
  616.         move.l    d1,d4
  617. .ss5
  618.         fmove.l    fp3,d5
  619.         add.l    _tadjust,d5
  620.  
  621.         cmp.l    d1,a3        ;
  622.         blt.b    .abc        ;
  623.         fadd.x    fp6,fp2        ;
  624.         fmove.s    #65536,fp3    ;
  625.         fdiv.x    fp2,fp3        ;
  626. .abc
  627.         cmp.l    d7,d5
  628.         ble.b    .ss6
  629.         move.l    d7,d5
  630.         bra.b    .ss7
  631. .ss6
  632.         cmp.l    d1,d5
  633.         bge.b    .ss7
  634.         move.l    d1,d5
  635. .ss7
  636.         move.l    d4,a4
  637.         move.l    d5,a5
  638.         sub.l    d2,d4
  639.         sub.l    d3,d5
  640.         asr.l    #4,d4
  641.         asr.l    #4,d5
  642.  
  643.         moveq    #16,d6
  644.         move.l    _cachewidth,d7
  645. iter    MACRO
  646.         move.l    d2,d1
  647.         move.l    d3,d0
  648.         lsr.l    d6,d1
  649.         lsr.l    d6,d0
  650.         mulu.w    d7,d0
  651.         add.l    d4,d2
  652.         add.w    d1,d0
  653.         move.b    (a1,d0.l),(a2)+
  654.         add.l    d5,d3
  655.     ENDM
  656.         iter
  657.         iter
  658.         iter
  659.         iter
  660.         iter
  661.         iter
  662.         iter
  663.         iter
  664.         iter
  665.         iter
  666.         iter
  667.         iter
  668.         iter
  669.         iter
  670.         iter
  671.         move.l    d2,d1
  672.         move.l    d3,d0
  673.         lsr.l    d6,d1
  674.         lsr.l    d6,d0
  675.         mulu.w    d7,d0
  676.         move.l    a4,d2
  677.         add.w    d1,d0
  678.         move.b    (a1,d0.l),(a2)+
  679.         move.l    a5,d3
  680.  
  681.         move.l    a3,d7
  682.         bgt.w    .here
  683.  
  684.         move.l    12(a0),a0
  685.         move.l    a0,d0
  686.         bne.w    .l1
  687.         bra.w    .dexit
  688. .sx1
  689.         move.l    d7,d6
  690.         sub.l    a3,a3
  691.  
  692.         move.l    d6,d0
  693.         subq.l    #1,d0
  694.         ble.w    .ssrend
  695.     ;    fmove.l    d0,fp7
  696.         lea    l_to_s(pc),a4
  697.         fmove.s    (a4,d0.w*4),fp7
  698.  
  699.         fmove.s    _d_sdivzstepu,fp3
  700.         fmul.x    fp7,fp3
  701.         fadd.x    fp3,fp0
  702.         fmove.s    _d_tdivzstepu,fp3
  703.         fmul.x    fp7,fp3
  704.         fadd.x    fp3,fp1
  705.         fmove.s    _d_zistepu,fp3
  706.         fmul.x    fp7,fp3
  707.         fadd.x    fp3,fp2
  708.         fmove.s    #65536,fp3
  709.         fdiv.x    fp2,fp3
  710.  
  711.         move.l    _bbextents,d0
  712.         move.l    _bbextentt,d7
  713.  
  714.         fmove.x    fp0,fp7
  715.         fmul.x    fp3,fp7
  716.         fmove.l    fp7,d4
  717.         add.l    a6,d4
  718.  
  719.         fmul.x    fp1,fp3
  720.  
  721.         cmp.l    d0,d4
  722.         ble.b    .ss4b
  723.         move.l    d0,d4
  724.         bra.b    .ss5b
  725. .ss4b
  726.         cmp.l    d1,d4
  727.         bge.b    .ss5b
  728.         move.l    d1,d4
  729. .ss5b
  730.         fmove.l    fp3,d5
  731.         add.l    _tadjust,d5
  732.  
  733.         cmp.l    d7,d5
  734.         ble.b    .ss6b
  735.         move.l    d7,d5
  736.         bra.b    .ss7b
  737. .ss6b
  738.         cmp.l    d1,d5
  739.         bge.b    .ss7b
  740.         move.l    d1,d5
  741. .ss7b
  742.         move.l    d6,d0
  743.         sub.l    d2,d4
  744.         subq.l    #1,d0
  745.         sub.l    d3,d5
  746.         lsl.l    #8,d0
  747.         divs.w    d0,d4
  748.         divs.w    d0,d5
  749. .ssrend
  750.         lsr.l    #8,d2
  751.         lsr.l    #8,d3
  752.  
  753.         move.l    _cachewidth,d7
  754.  
  755. .l0        move.w    d2,d1
  756.         move.w    d3,d0
  757.         lsr.w    #8,d1
  758.         lsr.w    #8,d0
  759.         mulu.w    d7,d0
  760.         add.w    d4,d2
  761.         add.w    d1,d0
  762.         move.b    (a1,d0.l),(a2)+
  763.         add.w    d5,d3
  764.         subq.l    #1,d6
  765.         bgt.b    .l0
  766.  
  767.         move.l    12(a0),a0
  768.         move.l    a0,d0
  769.         bne.w    .l1
  770. .dexit
  771.         movem.l    (sp)+,d2-d7/a2-a6
  772.         fmovem.x    (sp)+,fp2-fp7
  773.         rts
  774.  
  775.         cnop    0,8
  776. l_to_s:
  777.         dc.l    $00000000    ; 0
  778.         dc.l    $3f800000    ; 1
  779.         dc.l    $40000000    ; 2
  780.         dc.l    $40400000    ; 3
  781.         dc.l    $40800000    ; 4
  782.         dc.l    $40a00000    ; 5
  783.         dc.l    $40c00000    ; 6
  784.         dc.l    $40e00000    ; 7
  785.         dc.l    $41000000    ; 8
  786.         dc.l    $41100000    ; 9
  787.         dc.l    $41200000    ; 10
  788.         dc.l    $41300000    ; 11
  789.         dc.l    $41400000    ; 12
  790.         dc.l    $41500000    ; 13
  791.         dc.l    $41600000    ; 14
  792.         dc.l    $41700000    ; 15
  793.  
  794. ; void __asm D_DrawZSpans (register __a0 espan_t *pspan)
  795.  
  796. ;    z-buffer render loop
  797.  
  798.         cnop    0,4
  799. @D_DrawZSpans:
  800. _D_DrawZSpans:
  801.         FMOVEM.X    FP2/FP5-FP7,-(SP)
  802.         MOVEM.L    D2/D5-D7/A2/A3/A5,-(SP)
  803.         FMOVE.S    (_d_zistepu).L,FP7
  804.         FMOVE.X    FP7,FP1
  805.         fmul.s    #2147483648,fp1
  806.         MOVE.L    A0,A5
  807.         MOVE.L    (_d_pzbuffer).L,A3
  808.         FMOVE.S    (_d_ziorigin).L,FP5
  809.         FMOVE.L    FP1,D7
  810.         FMOVE.S    (_d_zistepv).L,FP6
  811. .j4
  812.         move.l    (a5)+,d0
  813.         fmove.l    d0,fp1
  814.         fmul.x    fp7,fp1
  815.         move.l    (a5)+,d1
  816.         fmove.l    d1,fp2
  817.         fmul.x    fp6,fp2
  818.         mulu.l    _d_zwidth,d1
  819.         add.l    d1,d0
  820.         fadd.x    fp5,fp2
  821.         fadd.x    fp1,fp2
  822.         fmul.s    #2147483648,fp2
  823.         lea    (a3,d0.l*2),a1
  824.         MOVE.L    (A5)+,D6
  825.         fmove.l    fp2,d5
  826.  
  827.         MOVE.L    A1,D0
  828.         BTST    #1,D0
  829.         BEQ.B    .j3
  830.         MOVE.L    D5,D0
  831.         SWAP    D0
  832.         SUBQ.L    #1,D6
  833.         ADD.L    D7,D5
  834.         MOVE.W    D0,(A1)+
  835. .j3
  836.         MOVE.L    D6,D2
  837.         ASR.L    #1,D2
  838.         BLE.B    .j1
  839.  
  840.  
  841.         ; d5=izi
  842.         ; d7=izistep
  843. .j0
  844.         move.l    d5,d0
  845.         add.l    d7,d5
  846.         move.l    d5,d1
  847.         swap    d1
  848.         add.l    d7,d5
  849.         move.w    d1,d0
  850.         move.l    d0,(a1)+
  851.         subq.l    #1,d2
  852.         bgt.b    .j0
  853.  
  854. .j1        BTST    #0,D6
  855.         BEQ.B    .j2
  856.         SWAP    D5
  857.         MOVE.W    D5,(A1)
  858. .j2
  859.         MOVE.L    (A5),A5
  860.         MOVE.L    A5,D0
  861.         bne.b    .j4
  862.         MOVEM.L    (SP)+,D2/D5-D7/A2/A3/A5
  863.         FMOVEM.X    (SP)+,FP2/FP5-FP7
  864.         RTS
  865.  
  866. ; void __asm D_DrawSkyScans8 (register __a0 espan_t *pspan)
  867.  
  868. ;    sky span renderer
  869.  
  870.         cnop    0,4
  871. @D_DrawSkyScans8:
  872. _D_DrawSkyScans8:
  873.         fmovem.x    fp2-fp5,-(sp)
  874.         movem.l    d2-d7/a2-a6,-(sp)
  875.         subq.l    #4,sp
  876.  
  877.         move.l    a0,a6
  878. .l2s
  879.         move.l    (a6),d2        ; pspan->u
  880.         move.l    4(a6),d3    ; pspan->v
  881.  
  882.         move.l    _d_viewbuffer,a1
  883.         add.l    d2,a1
  884.         move.l    _screenwidth,d0
  885.         muls.w    d3,d0
  886.         add.l    d0,a1
  887.  
  888.         move.l    d2,a2
  889.         move.l    d3,a3
  890.         bsr.w    D_Sky_uv_To_st
  891.         move.l    d6,d2
  892.         move.l    d7,d3
  893.  
  894.         move.l    8(a6),d5    ; pspan->count
  895. .l1s
  896.         moveq    #$20,d0
  897.         cmp.l    d0,d5
  898.         blt.b    .s0s
  899.         move.l    d0,d4
  900.         dc.w    $0c40
  901. .s0s        move.l    d5,d4
  902.  
  903.         sub.l    d4,d5
  904.         move.l    d5,(sp)
  905.         beq.b    .s1s
  906.  
  907.     ; full 32 pixels
  908.  
  909.         add.l    d4,a2
  910.         bsr.w    D_Sky_uv_To_st
  911.         move.l    d6,a4
  912.         move.l    d7,a5
  913.         sub.l    d2,d6
  914.         sub.l    d3,d7
  915.         asr.l    #5,d6
  916.         asr.l    #5,d7
  917.         bra.b    .dol0
  918. .s1s
  919.     ; less than 32 pixels
  920.  
  921.         move.l    d4,d5
  922.         subq.l    #1,d5
  923.         ble.b    .dol0
  924.  
  925.     ; 2 to 31 pixels
  926.  
  927.         add.l    d5,a2
  928.         bsr.b    D_Sky_uv_To_st
  929.         move.l    d6,a4
  930.         move.l    d7,a5
  931.         sub.l    d2,d6
  932.         lsl.l    #8,d5
  933.         sub.l    d3,d7
  934.         divs.w    d5,d6
  935.         divs.w    d5,d7
  936.         ext.l    d6
  937.         ext.l    d7
  938.         lsl.l    #8,d6
  939.         lsl.l    #8,d7
  940.  
  941. ;        move.l    d6,a4
  942. ;        move.l    d7,a5
  943. ;        sub.l    d2,d6
  944. ;        sub.l    d3,d7
  945. ;        divs.l    d5,d6
  946. ;        divs.l    d5,d7
  947. .dol0
  948.         move.l    _r_skysource,a0
  949.         move.l    #$7f0000,d5
  950. .l0s
  951.         move.l    d2,d0
  952.         move.l    d3,d1
  953.         and.l    d5,d0
  954.         and.l    d5,d1
  955.         lsl.l    #8,d1
  956.         add.l    d1,d0
  957.         swap    d0
  958.         move.b    (a0,d0.w),(a1)+
  959.         add.l    d6,d2
  960.         add.l    d7,d3
  961.         subq.l    #1,d4
  962.         bgt.b    .l0s
  963.  
  964.         move.l    a4,d2
  965.         move.l    a5,d3
  966.  
  967.         move.l    (sp),d5
  968.         bgt.b    .l1s
  969.  
  970.         move.l    12(a6),a6
  971.         move.l    a6,d0
  972.         bne.w    .l2s
  973.  
  974.         addq.l    #4,sp
  975.         movem.l    (sp)+,d2-d7/a2-a6
  976.         fmovem.x    (sp)+,fp2-fp5
  977.         rts
  978.  
  979. ; void D_Sky_uv_To_st (int u, int v, fixed16_t *s, fixed16_t *t)
  980.  
  981. ;    support routine for sky span renderer
  982.  
  983.         cnop    0,4
  984. D_Sky_uv_To_st:
  985.         fmove.s    #4096,fp1
  986.         fmul.s    _vpn+4,fp1
  987.  
  988.         move.l    a2,d0
  989.         move.l    a3,d1
  990.  
  991.         movem.l    d2-d3,-(sp)
  992.  
  993.         move.l    _r_refdef+12,d2
  994.         move.l    _r_refdef+8,d3
  995.         cmp.l    d2,d3
  996.         blt.b    .r0
  997.         fmove.l    d3,fp0
  998.         bra.b    .r1
  999. .r0
  1000.         fmove.l    d2,fp0
  1001. .r1                ; FP0=temp
  1002.  
  1003.         move.l    _vid+$14,d2
  1004.         asr.l    #1,d2
  1005.         sub.l    d2,d0
  1006.         fmove.l    d0,fp2
  1007.         fmul.s    #8192,fp2
  1008.         fdiv.x    fp0,fp2    ; wu=8192*(u-vid.width>>1)/temp
  1009.  
  1010.         move.l    _vid+$18,d2
  1011.         asr.l    #1,d2
  1012.         sub.l    d1,d2
  1013.         fmove.l    d2,fp3
  1014.         fmul.s    #8192,fp3
  1015.         fdiv.x    fp0,fp3    ; wv=8192*(vid.height>>1-v)/temp
  1016.  
  1017.         fmove.s    #4096,fp0
  1018.         fmul.s    _vpn+0,fp0
  1019.         fmove.x    fp2,fp4
  1020.         fmul.s    _vright+0,fp4
  1021.         fmove.x    fp3,fp5
  1022.         fmul.s    _vup+0,fp5
  1023.         fadd.x    fp4,fp0
  1024.         fadd.x    fp5,fp0
  1025.  
  1026.         ;fmove.s    #4096,fp1    ; moved up for pipelining
  1027.         ;fmul.s    _vpn+4,fp1
  1028.         fmove.x    fp2,fp4
  1029.         fmul.s    _vright+4,fp4
  1030.         fmove.x    fp3,fp5
  1031.         fmul.s    _vup+4,fp5
  1032.         fadd.x    fp4,fp1
  1033.         fadd.x    fp5,fp1
  1034.  
  1035.         fmul.s    _vright+8,fp2
  1036.         fmul.s    _vup+8,fp3
  1037.         fmove.s    #4096,fp4
  1038.         fmul.s    _vpn+8,fp4
  1039.         fadd.x    fp3,fp2
  1040.         fadd.x    fp4,fp2
  1041.         fmul.s    #3,fp2
  1042.  
  1043.         fmove.x    fp0,fp3
  1044.         fmove.x    fp1,fp4
  1045.         fmove.x    fp2,fp5
  1046.         fmul.x    fp3,fp3
  1047.         fmul.x    fp4,fp4
  1048.         fmul.x    fp5,fp5
  1049.         fadd.x    fp4,fp3
  1050.         fadd.x    fp5,fp3
  1051.         fsqrt.x    fp3
  1052.         fmove.s    #1,fp4
  1053.         fdiv.x    fp3,fp4
  1054.         fmul.x    fp4,fp0
  1055.         fmul.x    fp4,fp1
  1056.         fmul.x    fp4,fp2
  1057.  
  1058.         fmove.s    _skytime,fp2
  1059.         fmul.s    _skyspeed,fp2
  1060.  
  1061.         fmul.s    #378,fp0
  1062.         fadd.x    fp2,fp0
  1063.         fmul.s    #65536,fp0
  1064.         fmove.l    fp0,d6
  1065.  
  1066.         fmul.s    #378,fp1
  1067.         fadd.x    fp2,fp1
  1068.         fmul.s    #65536,fp1
  1069.  
  1070.         movem.l    (sp)+,d2-d3
  1071.         fmove.l    fp1,d7
  1072.         rts
  1073.  
  1074. ;void __asm D_SpriteDrawSpans (register __a0 sspan_t *pspan);
  1075.  
  1076.         cnop    0,4
  1077. _D_SpriteDrawSpans:
  1078. @D_SpriteDrawSpans:
  1079.         fmovem.x    fp2-fp5,-(sp)
  1080.  
  1081.         fmove.s    _d_ziorigin,fp2
  1082.         fmove.s    #65536,fp3
  1083.         fdiv.x    fp2,fp3        ; z
  1084.  
  1085.         movem.l    d2-d7/a2-a6,-(sp)
  1086.         move.l    a0,a6
  1087.         move.l    _cacheblock,a0    ; pbase
  1088.  
  1089.         fmul.s    #32768,fp2
  1090.  
  1091.         move.l    _bbextents,a4
  1092.         move.l    _sadjust,a5
  1093.  
  1094.         fmove.l    fp2,d6        ; izi
  1095. .ls1
  1096.         move.l    8(a6),d7    ; count
  1097.         ble.w    .skip
  1098.  
  1099.         move.l    (a6),d0
  1100.         fmove.l    d0,fp4    ; du
  1101.  
  1102.         fmove.s    _d_sdivzstepu,fp0
  1103.         fmul.x    fp4,fp0
  1104.     move.l    4(a6),d1
  1105.     fmove.l    d1,fp5    ; dv
  1106.         fmove.s    _d_sdivzstepv,fp1
  1107.         fmul.x    fp5,fp1
  1108.     move.l    _d_viewbuffer,a1
  1109.     move.l    d1,d2
  1110.     add.l    d0,a1
  1111.         fadd.x    fp1,fp0
  1112.         fadd.s    _d_sdivzorigin,fp0    ; sdivz
  1113.  
  1114.         fmove.s    _d_tdivzstepu,fp1
  1115.         fmul.x    fp4,fp1
  1116.     mulu.l    _screenwidth,d2
  1117.     add.l    d2,a1    ; pdest
  1118.         fmove.s    _d_tdivzstepv,fp2
  1119.         fmul.x    fp5,fp2
  1120.     move.l    _d_pzbuffer,a2
  1121.     move.l    d1,d2
  1122.     mulu.l    _d_zwidth,d2
  1123.         fadd.x    fp2,fp1
  1124.         fadd.s    _d_tdivzorigin,fp1    ; tdivz
  1125.  
  1126.         fmove.x    fp0,fp4
  1127.         fmul.x    fp3,fp4
  1128.     add.l    d0,d2
  1129.     moveq    #-1,d1
  1130.     add.l    d2,d2
  1131.     move.l    d7,d0
  1132.     add.l    d2,a2    ; pz
  1133.     subq.l    #1,d0
  1134.         fmove.l    fp4,d2
  1135.     fmove.l    d0,fp4        ; spancountminus1
  1136.         fmul.x    fp3,fp1
  1137.  
  1138.         add.l    a5,d2    ; s
  1139.  
  1140.         cmp.l    a4,d2
  1141.         ble.b    .s0
  1142.         move.l    a4,d2
  1143.         bra.b    .s1
  1144. .s0
  1145.         tst.l    d2
  1146.         bpl.b    .s1
  1147.         moveq    #0,d2
  1148. .s1
  1149.         fmove.l    fp1,d3
  1150.     fmove.s    _d_sdivzstepu,fp5
  1151.     fmul.x    fp4,fp5
  1152.         add.l    _tadjust,d3    ; t
  1153.  
  1154.         move.l    _bbextentt,d0
  1155.         cmp.l    d0,d3
  1156.         ble.b    .s2
  1157.         move.l    d0,d3
  1158.         bra.b    .s3
  1159. .s2
  1160.         tst.l    d3
  1161.         bpl.b    .s3
  1162.         moveq    #0,d3
  1163. .s3
  1164.         fadd.x    fp5,fp0
  1165.         fmul.x    fp3,fp0
  1166.     swap    d3
  1167.     muls.w    _cachewidth+2,d3
  1168.     move.l    a0,a3
  1169.     move.l    a4,d0
  1170.     add.l    d3,a3
  1171.         fmove.l    fp0,d4
  1172.         add.l    a5,d4
  1173.  
  1174.         cmp.l    d0,d4
  1175.         bgt.b    .s4
  1176.         moveq    #8,d0
  1177.         cmp.l    d0,d4
  1178.         bge.b    .s5
  1179. .s4
  1180.         move.l    d0,d4
  1181. .s5
  1182.  
  1183.         move.l    d7,d0
  1184.         subq.l    #1,d0
  1185.         ble.b    .sd
  1186.         sub.l    d2,d4
  1187.         divs.l    d0,d4
  1188. .sd
  1189. .ls0
  1190.         move.l    d2,d0
  1191.         swap    d0
  1192.         move.b    (a3,d0.w),d3
  1193.         cmp.b    d1,d3
  1194.         beq.b    .ss
  1195.         cmp.w    (a2),d6
  1196.         ble.b    .ss
  1197.         move.w    d6,(a2)
  1198.         move.b    d3,(a1)
  1199. .ss
  1200.         add.l    d4,d2
  1201.         addq.l    #2,a2
  1202.         addq.l    #1,a1
  1203.         subq.l    #1,d7
  1204.         bgt.b    .ls0
  1205. .skip
  1206.         add.w    #12,a6
  1207.         moveq    #-128,d0
  1208.         cmp.l    8(a6),d0
  1209.         bne.w    .ls1
  1210.  
  1211.         movem.l    (sp)+,d2-d7/a2-a6
  1212.         fmovem.x    (sp)+,fp2-fp5
  1213.         rts
  1214.  
  1215. ; void __asm D_DrawParticle (register __a0 particle_t *pparticle);
  1216.  
  1217. ;    Draws a single particle.
  1218.  
  1219.         cnop    0,4
  1220. @D_DrawParticle:
  1221.         fmovem.x    fp2-fp7,-(sp)
  1222.         movem.l    d4-d7/a2-a3/a5,-(sp)
  1223.  
  1224.         move.l    a0,a5
  1225.  
  1226.         fmove.s    (a5),fp5
  1227.         fsub.s    _r_origin,fp5
  1228.         fmove.s    4(a5),fp6
  1229.         fsub.s    _r_origin+4,fp6
  1230.         fmove.s    8(a5),fp7
  1231.         fsub.s    _r_origin+8,fp7
  1232.  
  1233.         fmove.s    _r_ppn,fp0
  1234.         fmul.x    fp5,fp0
  1235.         fmove.s    _r_ppn+4,fp1
  1236.         fmul.x    fp6,fp1
  1237.         fmove.s    _r_ppn+8,fp2
  1238.         fmul.x    fp7,fp2
  1239.         fadd.x    fp1,fp0
  1240.         fadd.x    fp2,fp0
  1241.  
  1242.         fcmp.s    #8,fp0
  1243.         fbult.w    .end
  1244.  
  1245.         fmove.s    #1,fp4
  1246.         fdiv.x    fp0,fp4
  1247.  
  1248.         fmove.s    _r_pright,fp0
  1249.         fmul.x    fp5,fp0
  1250.         fmove.s    _r_pright+4,fp1
  1251.         fmul.x    fp6,fp1
  1252.         fmove.s    _r_pright+8,fp2
  1253.         fmul.x    fp7,fp2
  1254.         fadd.x    fp1,fp0
  1255.         fadd.x    fp2,fp0
  1256.         fmul.x    fp4,fp0
  1257.         fadd.s    _xcenter,fp0
  1258.         fadd.s    #0.5,fp0
  1259.         fmove.l    fp0,d7
  1260.  
  1261.         cmp.l    _d_vrectright_particle,d7
  1262.         bgt.w    .end
  1263.         cmp.l    _d_vrectx,d7
  1264.         blt.w    .end
  1265.  
  1266.         fmove.s    _r_pup,fp0
  1267.         fmul.x    fp5,fp0
  1268.         fmove.s    _r_pup+4,fp1
  1269.         fmul.x    fp6,fp1
  1270.         fmove.s    _r_pup+8,fp2
  1271.         fmul.x    fp7,fp2
  1272.         fadd.x    fp1,fp0
  1273.         fadd.x    fp2,fp0
  1274.         fmul.x    fp4,fp0
  1275.         fmove.s    _ycenter,fp1
  1276.         fsub.x    fp0,fp1
  1277.         fadd.s    #0.5,fp1
  1278.         fmove.l    fp1,d6
  1279.  
  1280.         cmp.l    _d_vrectbottom_particle,d6
  1281.         bgt.w    .end
  1282.         cmp.l    _d_vrecty,d6
  1283.         blt.w    .end
  1284.  
  1285.         fmul.s    #32768,fp4
  1286.  
  1287.         move.l    _d_zwidth,d0
  1288.         mulu.w    d6,d0
  1289.         move.l    _d_pzbuffer,a3
  1290.         add.l    d7,d0
  1291.         add.l    d0,a3
  1292.         add.l    d0,a3
  1293.  
  1294.         lea    _d_scantable,a1
  1295.         move.l    _d_viewbuffer,a2
  1296.         add.l    (a1,d6.l*4),a2
  1297.         add.l    d7,a2
  1298.  
  1299.         fmove.l    fp4,d7    ; z
  1300.         move.l    _d_pix_shift,d0
  1301.         move.l    d7,d6
  1302.         asr.l    d0,d6    ; size
  1303.  
  1304.         move.l    _d_pix_min,d0
  1305.         cmp.l    d0,d6
  1306.         blt.b    .r0p
  1307.         move.l    _d_pix_max,d0
  1308.         cmp.l    d0,d6
  1309.         ble.b    .r1p
  1310. .r0p
  1311.         move.l    d0,d6
  1312. .r1p
  1313.         fmove.s    12(a5),fp0
  1314.         fmove.l    fp0,d1
  1315.         move.l    _d_zwidth,a5
  1316.         add.l    a5,a5
  1317.  
  1318.         move.l    d6,d0
  1319.         subq.l    #1,d0
  1320.         beq.b    .part0
  1321.         subq.l    #1,d0
  1322.         beq.b    .part1
  1323.         subq.l    #1,d0
  1324.         beq.b    .part2
  1325.         subq.l    #1,d0
  1326.         beq.w    .part3
  1327.         bra.w    .partx
  1328. .part0
  1329.         move.l    _d_y_aspect_shift,d0
  1330.         moveq    #0,d6
  1331.         bset    d0,d6
  1332.         tst.l    d6
  1333.         beq.w    .end
  1334. .l0p
  1335.         cmp.w    (a3),d7
  1336.         ble.b    .s0p
  1337.         move.w    d7,(a3)
  1338.         move.b    d1,(a2)
  1339. .s0p
  1340.         add.l    _screenwidth,a2
  1341.         add.l    a5,a3
  1342.         subq.l    #1,d6
  1343.         bne.b    .l0p
  1344.         bra.w    .end
  1345.  
  1346. .part1
  1347.         move.l    _d_y_aspect_shift,d0
  1348.         moveq    #2,d6
  1349.         lsl.l    d0,d6
  1350.         tst.l    d6
  1351.         beq.w    .end
  1352. .l1p
  1353.         cmp.w    (a3),d7
  1354.         ble.b    .s1a
  1355.         move.w    d7,(a3)
  1356.         move.b    d1,(a2)
  1357. .s1a
  1358.         cmp.w    2(a3),d7
  1359.         ble.b    .s1b
  1360.         move.w    d7,2(a3)
  1361.         move.b    d1,1(a2)
  1362. .s1b
  1363.         add.l    _screenwidth,a2
  1364.         add.l    a5,a3
  1365.         subq.l    #1,d6
  1366.         bne.b    .l1p
  1367.         bra.w    .end
  1368.  
  1369. .part2
  1370.         move.l    _d_y_aspect_shift,d0
  1371.         moveq    #3,d6
  1372.         lsl.l    d0,d6
  1373.         tst.l    d6
  1374.         beq.w    .end
  1375. .l2p
  1376.         cmp.w    (a3),d7
  1377.         ble.b    .s2a
  1378.         move.w    d7,(a3)
  1379.         move.b    d1,(a2)
  1380. .s2a
  1381.         cmp.w    2(a3),d7
  1382.         ble.b    .s2b
  1383.         move.w    d7,2(a3)
  1384.         move.b    d1,1(a2)
  1385. .s2b
  1386.         cmp.w    4(a3),d7
  1387.         ble.b    .s2c
  1388.         move.w    d7,4(a3)
  1389.         move.b    d1,2(a2)
  1390. .s2c
  1391.         add.l    _screenwidth,a2
  1392.         add.l    a5,a3
  1393.         subq.l    #1,d6
  1394.         bne.b    .l2p
  1395.         bra.b    .end
  1396.  
  1397. .part3
  1398.         move.l    _d_y_aspect_shift,d0
  1399.         moveq    #4,d6
  1400.         lsl.l    d0,d6
  1401.         tst.l    d6
  1402.         beq.b    .end
  1403. .l3p
  1404.         cmp.w    (a3),d7
  1405.         ble.b    .s3a
  1406.         move.w    d7,(a3)
  1407.         move.b    d1,(a2)
  1408. .s3a
  1409.         cmp.w    2(a3),d7
  1410.         ble.b    .s3b
  1411.         move.w    d7,2(a3)
  1412.         move.b    d1,1(a2)
  1413. .s3b
  1414.         cmp.w    4(a3),d7
  1415.         ble.b    .s3c
  1416.         move.w    d7,4(a3)
  1417.         move.b    d1,2(a2)
  1418. .s3c
  1419.         cmp.w    6(a3),d7
  1420.         ble.b    .s3d
  1421.         move.w    d7,6(a3)
  1422.         move.b    d1,3(a2)
  1423. .s3d
  1424.         add.l    _screenwidth,a2
  1425.         add.l    a5,a3
  1426.         subq.l    #1,d6
  1427.         bne.b    .l3p
  1428.         bra.b    .end
  1429.  
  1430. .partx
  1431.         move.l    _d_y_aspect_shift,d0
  1432.         move.l    d6,d5
  1433.         beq.b    .end
  1434.         lsl.l    d0,d5
  1435.         tst.l    d5
  1436.         beq.b    .end
  1437. .l4p
  1438.         move.l    a3,a0
  1439.         move.l    d6,d4
  1440. .l5p
  1441.         cmp.w    (a0),d7
  1442.         ble.b    .s4p
  1443.         move.w    d7,(a0)
  1444.         move.b    d1,(a2,d4.w)
  1445. .s4p
  1446.         addq.l    #2,a0
  1447.         subq.l    #1,d4
  1448.         bne.b    .l5p
  1449.  
  1450.         add.l    _screenwidth,a2
  1451.         add.l    a5,a3
  1452.         subq.l    #1,d5
  1453.         bne.b    .l4p
  1454. .end
  1455.         movem.l    (sp)+,d4-d7/a2-a3/a5
  1456.         fmovem.x    (sp)+,fp2-fp7
  1457.         rts
  1458.  
  1459.         cnop    0,4
  1460. _D_CalcGradients:
  1461. @D_CalcGradients:
  1462.         fmovem.x    fp2-fp6,-(sp)
  1463.  
  1464.         moveq    #0,d0
  1465.         move.l    _miplevel,d1
  1466.         bset    d1,d0
  1467.         fmove.s    #1,fp2
  1468.         fdiv.l    d0,fp2    ; mipscale
  1469.  
  1470.         move.l    a5,-(sp)
  1471.  
  1472.         move.l    a0,a5
  1473.  
  1474.         move.l    $34(a5),a0
  1475.         lea    p_saxis(pc),a1
  1476.         jsr    @TransformVector
  1477.  
  1478.         move.l    $34(a5),a0
  1479.         add.w    #16,a0
  1480.         lea    p_taxis,a1
  1481.         jsr    @TransformVector
  1482.  
  1483.         fmove.x    fp2,fp0
  1484.         fmul.s    _xscaleinv,fp0
  1485.     lea    p_saxis,a0
  1486.     lea    p_taxis,a1
  1487.         fmove.x    fp0,fp1
  1488.         fmul.s    (a0)+,fp1
  1489.     move.l    $30(a5),d0
  1490.     sub.w    d0,d0
  1491.         fmove.s    fp1,_d_sdivzstepu
  1492.         fmul.s    (a1)+,fp0
  1493.     move.l    _miplevel,d1
  1494.     asr.l    d1,d0
  1495.         fmove.s    fp0,_d_tdivzstepu
  1496.  
  1497.         fneg.x    fp2,fp0
  1498.         fmul.s    _yscaleinv,fp0
  1499.     subq.l    #1,d0
  1500.     move.l    d0,_bbextents
  1501.         fmove.x    fp0,fp1
  1502.         fmul.s    (a0)+,fp1
  1503.     move.l    $32(a5),d0
  1504.     sub.w    d0,d0
  1505.         fmove.s    fp1,_d_sdivzstepv
  1506.         fmul.s    (a1)+,fp0
  1507.     move.l    _miplevel,d1
  1508.     asr.l    d1,d0
  1509.         fmove.s    fp0,_d_tdivzstepv
  1510.  
  1511.         fmove.s    (a0),fp0
  1512.         fmul.x    fp2,fp0
  1513.     subq.l    #1,d0
  1514.     move.l    d0,_bbextentt
  1515.         fmove.s    _xcenter,fp1
  1516.         fmul.s    _d_sdivzstepu,fp1
  1517.         fsub.x    fp1,fp0
  1518.         fmove.s    _ycenter,fp1
  1519.         fmul.s    _d_sdivzstepv,fp1
  1520.         fsub.x    fp1,fp0
  1521.         fmove.s    fp0,_d_sdivzorigin
  1522.  
  1523.         fmove.s    (a1),fp0
  1524.         fmul.x    fp2,fp0
  1525.         fmove.s    _xcenter,fp1
  1526.         fmul.s    _d_tdivzstepu,fp1
  1527.         fsub.x    fp1,fp0
  1528.         fmove.s    _ycenter,fp1
  1529.         fmul.s    _d_tdivzstepv,fp1
  1530.     lea    _transformed_modelorg,a0
  1531.         fsub.x    fp1,fp0
  1532.         fmove.s    fp0,_d_tdivzorigin
  1533.  
  1534.         fmove.s    (a0)+,fp4
  1535.         fmul.x    fp2,fp4
  1536.         fmove.s    (a0)+,fp5
  1537.         fmul.x    fp2,fp5
  1538.         fmove.s    (a0),fp6
  1539.         fmul.x    fp2,fp6
  1540.  
  1541.         fmove.s    #65536,fp3
  1542.         fmul.x    fp2,fp3
  1543.  
  1544.         lea    p_saxis,a1
  1545.         fmove.x    fp4,fp0
  1546.         fmul.s    (a1)+,fp0
  1547.         fmove.x    fp5,fp1
  1548.         fmul.s    (a1)+,fp1
  1549.         fadd.x    fp1,fp0
  1550.         fmove.x    fp6,fp1
  1551.         fmul.s    (a1),fp1
  1552.     move.l    $2c(a5),d0
  1553.     sub.w    d0,d0
  1554.         fadd.x    fp1,fp0
  1555.         fmul.s    #65536,fp0
  1556.     move.l    _miplevel,d1
  1557.     asr.l    d1,d0
  1558.     move.l    $34(a5),a0
  1559.         fadd.s    #0.5,fp0
  1560.         fintrz.x    fp0
  1561.         fmove.s    12(a0),fp1
  1562.         fmul.x    fp3,fp1
  1563.     lea    p_taxis,a1
  1564.         fadd.x    fp1,fp0
  1565.         fmove.l    fp0,d1
  1566.  
  1567.         fmove.x    fp4,fp0
  1568.         fmul.s    (a1)+,fp0
  1569.     sub.l    d0,d1
  1570.     move.l    d1,_sadjust
  1571.         fmove.x    fp5,fp1
  1572.         fmul.s    (a1)+,fp1
  1573.         fadd.x    fp1,fp0
  1574.         fmove.x    fp6,fp1
  1575.         fmul.s    (a1),fp1
  1576.     move.l    $2e(a5),d0
  1577.     sub.w    d0,d0
  1578.         fadd.x    fp1,fp0
  1579.         fmul.s    #65536,fp0
  1580.     move.l    _miplevel,d1
  1581.     asr.l    d1,d0
  1582.     move.l    $34(a5),a0
  1583.         fadd.s    #0.5,fp0
  1584.         fintrz.x    fp0
  1585.         fmove.s    $1c(a0),fp1
  1586.         fmul.x    fp3,fp1
  1587.     move.l    (sp)+,a5
  1588.         fadd.x    fp1,fp0
  1589.         fmove.l    fp0,d1
  1590.         sub.l    d0,d1
  1591.         move.l    d1,_tadjust
  1592.  
  1593.         fmovem.x    (sp)+,fp2-fp6
  1594.         rts
  1595.  
  1596.         cnop    0,8
  1597. p_saxis:    dc.l    0,0,0
  1598. p_taxis:    dc.l    0,0,0
  1599.  
  1600. ;        cnop    0,8
  1601. ;column:        ds.l    1280
  1602. ;rowptr:        ds.l    1024
  1603.  
  1604.         END
  1605.