home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 15 / MA_Cover_15.iso / source / winquake / amiga_r_68k.s < prev    next >
Encoding:
Text File  |  2000-03-11  |  18.5 KB  |  1,205 lines

  1. ; 680x0 optimised Quake render routines by John Selck.
  2.  
  3.     ; r_alias.c:
  4.  
  5.         XDEF    _R_AliasTransformAndProjectFinalV
  6.         XDEF    @R_AliasTransformAndProjectFinalV
  7.  
  8.     ; r_draw.c:
  9.  
  10.         XDEF    _R_ClipEdge
  11.         XDEF    @R_ClipEdge
  12.  
  13.     ; r_misc.c:
  14.  
  15.         XDEF    _TransformVector
  16.         XDEF    @TransformVector
  17.  
  18.     ; r_surf.c:
  19.  
  20.         XDEF    @R_AddDynamicLights
  21.         XDEF    @R_DrawSurfaceBlock8_mip0
  22.         XDEF    @R_DrawSurfaceBlock8_mip1
  23.         XDEF    @R_DrawSurfaceBlock8_mip2
  24.         XDEF    @R_DrawSurfaceBlock8_mip3
  25.         XDEF    @R_DrawSurfaceBlock16
  26.  
  27.  
  28.         XREF    _vright
  29.         XREF    _vup
  30.         XREF    _vpn
  31.  
  32.         XREF    _modelorg
  33.         XREF    _xscale
  34.         XREF    _yscale
  35.         XREF    _xcenter
  36.         XREF    _ycenter
  37.         XREF    _r_refdef
  38.         XREF    _r_framecount
  39.         XREF    _edge_p
  40.         XREF    _surface_p
  41.         XREF    _surfaces
  42.         XREF    _newedges
  43.         XREF    _removeedges
  44.  
  45.         XREF    _cacheoffset
  46.         XREF    _r_pedge
  47.         XREF    _r_leftclipped
  48.         XREF    _r_rightclipped
  49.         XREF    _r_nearzionly
  50.         XREF    _r_leftenter
  51.         XREF    _r_leftexit
  52.         XREF    _r_rightenter
  53.         XREF    _r_rightexit
  54.         XREF    _r_emitted
  55.         XREF    _r_nearzi
  56.         XREF    _r_u1
  57.         XREF    _r_v1
  58.         XREF    _r_lzi1
  59.         XREF    _r_ceilv1
  60.         XREF    _r_lastvertvalid
  61.  
  62.         XREF    _vup
  63.         XREF    _vright
  64.         XREF    _vpn
  65.  
  66.         XREF    _aliasxcenter
  67.         XREF    _aliasycenter
  68.         XREF    _r_avertexnormals
  69.  
  70.         XREF    _tmatrix    ; $00
  71.         XREF    _viewmatrix    ; $30
  72.         XREF    _ptriangles    ; $60
  73.         XREF    _r_affinetridesc    ; $64
  74.         XREF    _acolormap    ; $88
  75.         XREF    _r_apverts    ; $8c
  76.         XREF    _pmdl        ; $90
  77.         XREF    _r_plightvec    ; $94
  78.         XREF    _r_ambientlight    ; $a0
  79.         XREF    _r_shadelight    ; $a4
  80.         XREF    _paliashdr    ; $a8
  81.         XREF    _pfinalverts    ; $ac
  82.         XREF    _pauxverts    ; $b0
  83.         XREF    _ziscale    ; $b4
  84.         XREF    _pmodel        ; $b8
  85.         XREF    _alias_forward    ; $bc
  86.         XREF    _alias_right    ; $c8
  87.         XREF    _alias_up    ; $d4
  88.         XREF    _pskindesc    ; $e0
  89.         XREF    _r_amodels_drawn    ; $e4
  90.         XREF    _a_skinwidth    ; $e8
  91.         XREF    _r_anumverts    ; $ec
  92.         XREF    _aliastransform    ; $f0    -> $120
  93.  
  94. __farbss    equ    _aliastransform-$f0
  95.  
  96.         XREF    _vid
  97.  
  98.         XREF    _sourcetstep
  99.         XREF    _prowdestbase
  100.         XREF    _pbasesource
  101.         XREF    _surfrowbytes
  102.         XREF    _r_lightptr
  103.         XREF    _r_stepback
  104.         XREF    _r_lightwidth
  105.         XREF    _r_numvblocks
  106.         XREF    _r_sourcemax
  107.  
  108.         XREF    _cl_dlights
  109.         XREF    _r_drawsurf
  110.         XREF    _blocklights
  111.         XREF    __CXV52
  112.  
  113.         XREF    _r_fullbright
  114.  
  115.  
  116.         SECTION    "Render",CODE
  117.  
  118. ; void __asm R_AliasTransformAndProjectFinalVerts (register __a0 finalvert_t *fv, register __a1 stvert_t *pstverts)
  119.  
  120. ;    point transformation of entities
  121.  
  122. _R_AliasTransformAndProjectFinalV:
  123. @R_AliasTransformAndProjectFinalV:
  124.         sub.w    #$4c,sp
  125.         fmovem.x    fp2-fp7,-(sp)
  126.         movem.l    d6-d7/a2-a3/a5,-(sp)
  127.  
  128.         move.l    a0,a5
  129.         moveq    #0,d7
  130.  
  131.         lea    $64(a7),a3
  132.  
  133.         move.l    __farbss+$118,(a3)+
  134.         move.l    __farbss+$114,(a3)+
  135.         move.l    __farbss+$110,(a3)+
  136.         move.l    __farbss+$11c,(a3)+
  137.  
  138.         move.l    __farbss+$f8,(a3)+
  139.         move.l    __farbss+$f4,(a3)+
  140.         move.l    __farbss+$f0,(a3)+
  141.         move.l    __farbss+$fc,(a3)+
  142.         move.l    _aliasxcenter,(a3)+
  143.  
  144.         move.l    __farbss+$108,(a3)+
  145.         move.l    __farbss+$104,(a3)+
  146.         move.l    __farbss+$100,(a3)+
  147.         move.l    __farbss+$10c,(a3)+
  148.         move.l    _aliasycenter,(a3)+
  149.  
  150.         move.l    _r_plightvec+8,(a3)+
  151.         move.l    _r_plightvec+4,(a3)+
  152.         move.l    _r_plightvec+0,(a3)
  153.  
  154.         move.l    _r_apverts,a2
  155.         bra.w    .atin
  156. .atl0
  157.         moveq    #0,d0
  158.         move.b    (a2),d0
  159.         fmove.w    d0,fp7
  160.         move.b    1(a2),d0
  161.         fmove.w    d0,fp6
  162.         move.b    2(a2),d0
  163.         fmove.w    d0,fp5
  164.  
  165.         lea    $64(a7),a3
  166.  
  167.         fmove.s    (a3)+,fp1
  168.         fmul.x    fp5,fp1
  169.     move.b    3(a2),d0
  170.         fmove.s    (a3)+,fp2
  171.         fmul.x    fp6,fp2
  172.     mulu.w    #12,d0
  173.         fmove.s    (a3)+,fp3
  174.         fmul.x    fp7,fp3
  175.     lea    _r_avertexnormals,a0
  176.         fadd.s    (a3)+,fp3
  177.         fadd.x    fp1,fp3
  178.         fadd.x    fp2,fp3
  179.         fmove.s    #1,fp0
  180.         fdiv.x    fp3,fp0
  181.     move.l    4(a1),8(a5)
  182.     move.l    8(a1),12(a5)
  183.     move.l    (a1),$18(a5)
  184.         fmove.l    fp0,$14(a5)
  185.  
  186.         fmove.s    (a3)+,fp1
  187.         fmul.x    fp5,fp1
  188.     add.l    d0,a0
  189.         fmove.s    (a3)+,fp2
  190.         fmul.x    fp6,fp2
  191.     move.l    _r_ambientlight,d6
  192.         fmove.s    (a3)+,fp3
  193.         fmul.x    fp7,fp3
  194.     addq.l    #1,d7
  195.         fadd.s    (a3)+,fp3
  196.         fadd.x    fp1,fp3
  197.         fadd.x    fp2,fp3
  198.         fmul.x    fp0,fp3
  199.     addq.l    #4,a2
  200.         fadd.s    (a3)+,fp3
  201.         fmove.l    fp3,(a5)
  202.  
  203.         fmove.s    (a3)+,fp1
  204.         fmul.x    fp5,fp1
  205.     add.w    #12,a1
  206.         fmove.s    (a3)+,fp2
  207.         fmul.x    fp6,fp2
  208.         fmove.s    (a3)+,fp3
  209.         fmul.x    fp7,fp3
  210.         fadd.s    (a3)+,fp3
  211.         fadd.x    fp1,fp3
  212.         fadd.x    fp2,fp3
  213.         fmul.x    fp0,fp3
  214.         fadd.s    (a3)+,fp3
  215.         fmove.l    fp3,4(a5)
  216.  
  217.         fmove.s    8(a0),fp2
  218.         fmul.s    (a3)+,fp2
  219.         fmove.s    4(a0),fp3
  220.         fmul.s    (a3)+,fp3
  221.         fmove.s    (a0),fp0
  222.         fmul.s    (a3),fp0
  223.     add.w    #$20,a5
  224.         fadd.x    fp2,fp0
  225.         fadd.x    fp3,fp0
  226.  
  227.         ftst.x    fp0
  228.         fboge.w    .s0
  229.  
  230.         fmul.s    _r_shadelight,fp0
  231.         fmove.l    fp0,d0
  232.         add.l    d0,d6
  233.         bge.b    .s0
  234.         moveq    #0,d6
  235. .s0
  236.         move.l    d6,-$10(a5)
  237. .atin
  238.         cmp.l    _r_anumverts,d7
  239.         blt.w    .atl0
  240.  
  241.         movem.l    (sp)+,d6-d7/a2-a3/a5
  242.         fmovem.x    (sp)+,fp2-fp7
  243.         add.w    #$4c,sp
  244.         rts
  245.  
  246. ; void __asm R_ClipEdge (register __a0 mvertex_t *pv0, register __a1 mvertex_t *pv1, register __a2 clipplane_t *clip);
  247.  
  248. ;    clipping
  249.  
  250.         cnop    0,4
  251. _R_ClipEdge:
  252. @R_ClipEdge:
  253.         fmovem.x    fp2-fp4,-(sp)
  254.         movem.l    a2-a3,-(sp)
  255.  
  256.         bsr.b    R_ClipEdge_inner
  257.  
  258.         movem.l    (sp)+,a2-a3
  259.         fmovem.x    (sp)+,fp2-fp4
  260.         rts
  261.  
  262.         cnop    0,4
  263. R_ClipEdge_inner:
  264.         sub.w    #12,sp
  265.  
  266.         move.l    a2,d0
  267.         beq.w    .emit
  268. .next
  269.         fmove.s    (a0),fp0
  270.         fmul.s    (a2),fp0
  271.         fmove.s    4(a0),fp1
  272.         fmul.s    4(a2),fp1
  273.         fmove.s    8(a0),fp2
  274.         fmul.s    8(a2),fp2
  275.         fadd.x    fp1,fp0
  276.         fadd.x    fp2,fp0
  277.         fsub.s    12(a2),fp0
  278.  
  279.         fmove.s    (a1),fp1
  280.         fmul.s    (a2),fp1
  281.         fmove.s    4(a1),fp2
  282.         fmul.s    4(a2),fp2
  283.         fmove.s    8(a1),fp3
  284.         fmul.s    8(a2),fp3
  285.         fadd.x    fp2,fp1
  286.         fadd.x    fp3,fp1
  287.         fsub.s    12(a2),fp1
  288.  
  289.         ftst.x    fp0
  290.         fbolt.w    .enter
  291.         ftst.x    fp1
  292.         fbuge.w    .loop
  293.  
  294.         move.l    #$7fffffff,_cacheoffset
  295.  
  296.         fmove.x    fp0,fp2
  297.         fsub.x    fp1,fp2
  298.         fdiv.x    fp2,fp0
  299.  
  300.         fmove.s    (a0),fp1
  301.         fmove.s    (a1),fp2
  302.         fsub.x    fp1,fp2
  303.         fmul.x    fp0,fp2
  304.         fadd.x    fp1,fp2
  305.         fmove.s    fp2,(sp)
  306.  
  307.         fmove.s    4(a0),fp1
  308.         fmove.s    4(a1),fp2
  309.         fsub.x    fp1,fp2
  310.         fmul.x    fp0,fp2
  311.         fadd.x    fp1,fp2
  312.         fmove.s    fp2,4(sp)
  313.  
  314.         fmove.s    8(a0),fp1
  315.         fmove.s    8(a1),fp2
  316.         fsub.x    fp1,fp2
  317.         fmul.x    fp0,fp2
  318.         fadd.x    fp1,fp2
  319.         fmove.s    fp2,8(sp)
  320.  
  321.         tst.b    $14(a2)
  322.         beq.b    .ces0
  323.  
  324.         moveq    #1,d0
  325.         move.l    d0,_r_leftclipped
  326.  
  327.         lea    _r_leftexit,a3
  328.         bra.b    .s1
  329. .ces0
  330.         tst.b    $15(a2)
  331.         beq.b    .s2
  332.  
  333.         moveq    #1,d0
  334.         move.l    d0,_r_rightclipped
  335.  
  336.         lea    _r_rightexit,a3
  337. .s1
  338.         move.l    sp,a1
  339.         move.l    (a1)+,(a3)+
  340.         move.l    (a1)+,(a3)+
  341.         move.l    (a1),(a3)
  342. .s2
  343.         move.l    sp,a1
  344.         move.l    16(a2),a2
  345.         bsr.w    R_ClipEdge_inner
  346.         bra.w    .end
  347. .enter
  348.         ftst.x    fp1
  349.         fboge.w    .s3
  350.         tst.l    _r_leftclipped
  351.         bne.w    .end
  352.  
  353.         move.l    _r_framecount,d0
  354.         or.l    #$80000000,d0
  355.         move.l    d0,_cacheoffset
  356.         bra.w    .end
  357. .s3
  358.         clr.l    _r_lastvertvalid
  359.         move.l    #$7fffffff,_cacheoffset
  360.  
  361.         fmove.x    fp0,fp2
  362.         fsub.x    fp1,fp2
  363.         fdiv.x    fp2,fp0
  364.  
  365.         fmove.s    (a0),fp1
  366.         fmove.s    (a1),fp2
  367.         fsub.x    fp1,fp2
  368.         fmul.x    fp0,fp2
  369.         fadd.x    fp1,fp2
  370.         fmove.s    fp2,(sp)
  371.  
  372.         fmove.s    4(a0),fp1
  373.         fmove.s    4(a1),fp2
  374.         fsub.x    fp1,fp2
  375.         fmul.x    fp0,fp2
  376.         fadd.x    fp1,fp2
  377.         fmove.s    fp2,4(sp)
  378.  
  379.         fmove.s    8(a0),fp1
  380.         fmove.s    8(a1),fp2
  381.         fsub.x    fp1,fp2
  382.         fmul.x    fp0,fp2
  383.         fadd.x    fp1,fp2
  384.         fmove.s    fp2,8(sp)
  385.  
  386.         tst.b    $14(a2)
  387.         beq.b    .s4
  388.  
  389.         moveq    #1,d0
  390.         move.l    d0,_r_leftclipped
  391.  
  392.         lea    _r_leftenter,a3
  393.         bra.b    .s5
  394. .s4
  395.         tst.b    $15(a2)
  396.         beq.b    .s6
  397.  
  398.         moveq    #1,d0
  399.         move.l    d0,_r_rightclipped
  400.  
  401.         lea    _r_rightenter,a3
  402. .s5
  403.         move.l    sp,a0
  404.         move.l    (a0)+,(a3)+
  405.         move.l    (a0)+,(a3)+
  406.         move.l    (a0),(a3)
  407. .s6
  408.         move.l    sp,a0
  409.         move.l    16(a2),a2
  410.         bsr.w    R_ClipEdge_inner
  411.         bra.b    .end
  412. .loop
  413.         move.l    16(a2),a2
  414.         move.l    a2,d0
  415.         bne.w    .next
  416. .emit
  417.         add.w    #12,sp
  418.         bra.b    @R_EmitEdge
  419. .end
  420.         add.w    #12,sp
  421.         rts
  422.  
  423. ; void __asm R_EmitEdge (register __a0 mvertex_t *pv0, register __a1 mvertex_t *pv1)
  424.  
  425.     ; u0 = FP2
  426.     ; v0 = FP3
  427.     ; lzi0 = FP4
  428.  
  429.         cnop    0,4
  430. @R_EmitEdge:
  431.         movem.l    d4-d5/d7/a5,-(sp)
  432.  
  433.         move.l    a1,a2
  434.  
  435.         tst.l    _r_lastvertvalid
  436.         beq.b    .notval
  437.         fmove.s    _r_u1,fp2
  438.         fmove.s    _r_v1,fp3
  439.         fmove.s    _r_lzi1,fp4
  440.         move.l    _r_ceilv1,d7
  441.         bra.w    .valid
  442. .notval
  443.         lea    local(pc),a3
  444.         fmove.s    (a0)+,fp0
  445.         fsub.s    _modelorg,fp0
  446.         fmove.s    fp0,(a3)+
  447.         fmove.s    (a0)+,fp0
  448.         fsub.s    _modelorg+4,fp0
  449.         fmove.s    fp0,(a3)+
  450.         fmove.s    (a0),fp0
  451.         fsub.s    _modelorg+8,fp0
  452.         fmove.s    fp0,(a3)
  453.  
  454.         lea    local(pc),a0
  455.         lea    transformed(pc),a1
  456.         bsr    @TransformVector
  457.  
  458.         fmove.s    transformed+8(pc),fp1
  459.         fcmp.s    #1.000000e-02,fp1
  460.         fboge.w    .res0
  461.         fmove.s    #1.000000e-02,fp1
  462. .res0
  463.         fmove.s    #1,fp4
  464.         fdiv.x    fp1,fp4
  465.  
  466.         fmove.s    _xscale,fp2
  467.         fmul.x    fp4,fp2
  468.         fmul.s    transformed(pc),fp2
  469.         fadd.s    _xcenter,fp2
  470.  
  471.         fcmp.s    _r_refdef+$44,fp2
  472.         fboge.w    .res1
  473.         fmove.s    _r_refdef+$44,fp2
  474. .res1
  475.         fcmp.s    _r_refdef+$54,fp2
  476.         fbole.w    .res2
  477.         fmove.s    _r_refdef+$54,fp2
  478. .res2
  479.  
  480.         fmove.s    _yscale,fp3
  481.         fmul.x    fp4,fp3
  482.         fmul.s    transformed+4(pc),fp3
  483.         fneg.x    fp3
  484.         fadd.s    _ycenter,fp3
  485.  
  486.         fcmp.s    _r_refdef+$48,fp3
  487.         fboge.w    .res3
  488.         fmove.s    _r_refdef+$48,fp3
  489. .res3
  490.         fcmp.s    _r_refdef+$58,fp3
  491.         fbole.w    .res4
  492.         fmove.s    _r_refdef+$58,fp3
  493. .res4
  494.         fmove.l    fp3,d7
  495.         fcmp.l    d7,fp3
  496.         fbule.w    .rc0
  497.         addq.l    #1,d7
  498. .rc0
  499. .valid
  500.         lea    local(pc),a3
  501.         fmove.s    (a2)+,fp0
  502.         fsub.s    _modelorg,fp0
  503.         fmove.s    fp0,(a3)+
  504.         fmove.s    (a2)+,fp0
  505.         fsub.s    _modelorg+4,fp0
  506.         fmove.s    fp0,(a3)+
  507.         fmove.s    (a2),fp0
  508.         fsub.s    _modelorg+8,fp0
  509.         fmove.s    fp0,(a3)
  510.  
  511.         lea    local(pc),a0
  512.         lea    transformed(pc),a1
  513.         bsr    @TransformVector
  514.  
  515.         fmove.s    transformed+8(pc),fp1
  516.         fcmp.s    #1.000000e-02,fp1
  517.         fboge.w    .res5
  518.         fmove.s    #1.000000e-02,fp1
  519. .res5
  520.         fmove.s    #1,fp0
  521.         fdiv.x    fp1,fp0
  522.         fmove.s    fp0,_r_lzi1
  523.  
  524.         fmove.s    _xscale,fp0
  525.         fmul.s    _r_lzi1,fp0
  526.         fmul.s    transformed(pc),fp0
  527.         fadd.s    _xcenter,fp0
  528.  
  529.         fcmp.s    _r_refdef+$44,fp0
  530.         fboge.w    .res6
  531.         fmove.s    _r_refdef+$44,fp0
  532. .res6
  533.         fcmp.s    _r_refdef+$54,fp0
  534.         fbole.w    .res7
  535.         fmove.s    _r_refdef+$54,fp0
  536. .res7
  537.         fmove.s    fp0,_r_u1
  538.  
  539.         fmove.s    _yscale,fp0
  540.         fmul.s    _r_lzi1,fp0
  541.         fmul.s    transformed+4(pc),fp0
  542.         fneg.x    fp0
  543.         fadd.s    _ycenter,fp0
  544.  
  545.         fcmp.s    _r_refdef+$48,fp0
  546.         fboge.w    .res8
  547.         fmove.s    _r_refdef+$48,fp0
  548. .res8
  549.         fcmp.s    _r_refdef+$58,fp0
  550.         fbole.w    .res9
  551.         fmove.s    _r_refdef+$58,fp0
  552. .res9
  553.         fmove.s    fp0,_r_v1
  554.  
  555.         fmove.s    _r_lzi1,fp1
  556.         fcmp.x    fp4,fp1
  557.         fbole.w    .res10
  558.         fmove.x    fp1,fp4
  559. .res10
  560.         fmove.x    fp4,fp1
  561.         fcmp.s    _r_nearzi,fp1
  562.         fbole.w    .res11
  563.         fmove.s    fp1,_r_nearzi
  564. .res11
  565.         tst.l    _r_nearzionly
  566.         bne.w    .endemit
  567.  
  568.         move.l    #1,_r_emitted
  569.  
  570.         fmove.l    fp0,d0
  571.         fcmp.l    d0,fp0
  572.         fbule.w    .rc1
  573.         addq.l    #1,d0
  574. .rc1
  575.         move.l    d0,_r_ceilv1
  576.  
  577.         cmp.l    d7,d0
  578.         bne.b    .nocreate
  579.         cmp.l    #$7fffffff,_cacheoffset
  580.         beq.w    .endemit
  581.  
  582.         move.l    _r_framecount,d0
  583.         or.l    #$80000000,d0
  584.         move.l    d0,_cacheoffset
  585.         bra.w    .endemit
  586. .nocreate
  587.         fmove.s    _r_u1,fp0
  588.         fsub.x    fp2,fp0
  589.         fmove.s    _r_v1,fp1
  590.         fsub.x    fp3,fp1
  591.         fdiv.x    fp1,fp0
  592.  
  593.         move.l    _edge_p,a5
  594.         add.l    #$20,_edge_p
  595.  
  596.         fmove.s    fp4,$18(a5)
  597.         move.l    _r_pedge,$1c(a5)
  598.  
  599.         move.l    _surface_p,d1
  600.         sub.l    _surfaces,d1
  601.         asr.l    #6,d1
  602.  
  603.         cmp.l    d0,d7
  604.         bgt.b    .notrail
  605.  
  606.         move.l    d7,d5
  607.  
  608.         fmove.l    d5,fp1
  609.         fsub.x    fp3,fp1
  610.         fmul.x    fp0,fp1
  611.     move.l    _r_ceilv1,d4
  612.     move.w    d1,$10(a5)
  613.     clr.w    $12(a5)
  614.         fadd.x    fp2,fp1
  615.  
  616.         bra.b    .nolead
  617. .notrail
  618.         move.l    _r_ceilv1,d5
  619.  
  620.         fmove.l    d5,fp1
  621.         fsub.s    _r_v1,fp1
  622.         fmul.x    fp0,fp1
  623.     move.l    d7,d4
  624.     clr.w    $10(a5)
  625.     move.w    d1,$12(a5)
  626.         fadd.s    _r_u1,fp1
  627. .nolead
  628.         fmul.s    #1048576,fp1
  629.     lea    _newedges,a0
  630.     subq.l    #1,d4
  631.     lea    0(a0,d5.l*4),a1
  632.     move.l    (a1),a0
  633.         fadd.s    #1048575,fp1
  634.         fmove.l    fp1,d0
  635.  
  636.         fmul.s    #1048576,fp0
  637.         cmp.l    _r_refdef+$4c,d0
  638.         bge.b    .rer0
  639.         move.l    _r_refdef+$4c,d0
  640. .rer0
  641.         cmp.l    _r_refdef+$50,d0
  642.         ble.b    .rer1
  643.         move.l    _r_refdef+$50,d0
  644. .rer1
  645.         move.l    d0,(a5)
  646.         fmove.l    fp0,4(a5)
  647.  
  648.         tst.w    $10(a5)
  649.         beq.b    .rer2
  650.         addq.l    #1,d0
  651. .rer2
  652.         move.l    d0,d7
  653.  
  654.         move.l    a0,d0
  655.         beq.b    .re43
  656.         move.l    (a0),d1
  657.         cmp.l    d7,d1
  658.         blt.b    .re44
  659. .re43:
  660.         move.l    d0,12(a5)
  661.         move.l    a5,(a1)
  662.         bra.b    .re49
  663. .re44:
  664.         move.l    d0,a3
  665.         dc.w    $0c40
  666. .re45:
  667.         move.l    a2,a3
  668.         move.l    12(a3),a2
  669.         move.l    a2,d0
  670.         beq.b    .re48
  671.         cmp.l    (a2),d7
  672.         bge.b    .re45
  673. .re48:
  674.         move.l    a2,12(a5)
  675.         move.l    a5,12(a3)
  676. .re49:
  677.         lea    _removeedges,a0
  678.         lea    0(a0,d4.l*4),a1
  679.         move.l    (a1),$14(a5)
  680.         move.l    a5,(a1)
  681. .endemit
  682.         movem.l    (sp)+,d4-d5/d7/a5
  683.         rts
  684.  
  685.         cnop    0,8
  686. local:        dc.l    0,0,0
  687. transformed:    dc.l    0,0,0
  688.  
  689. ; void __asm TransformVector (register __a0 vec3_t in, register __a1 vec3_t out);
  690.  
  691. ;    general vector transformation
  692.  
  693. _TransformVector:
  694. @TransformVector:
  695.     move.l    a2,-(sp)
  696.  
  697.     lea    _vright,a2
  698.         fmove.s    (a2)+,fp0
  699.         fmul.s    (a0)+,fp0
  700.         fmove.s    (a2)+,fp1
  701.         fmul.s    (a0)+,fp1
  702.         fadd.x    fp1,fp0
  703.         fmove.s    (a2),fp1
  704.         fmul.s    (a0),fp1
  705.     subq.l    #8,a0
  706.     lea    _vup,a2
  707.         fadd.x    fp1,fp0
  708.         fmove.s    fp0,(a1)+
  709.  
  710.         fmove.s    (a2)+,fp0
  711.         fmul.s    (a0)+,fp0
  712.         fmove.s    (a2)+,fp1
  713.         fmul.s    (a0)+,fp1
  714.         fadd.x    fp1,fp0
  715.         fmove.s    (a2),fp1
  716.         fmul.s    (a0),fp1
  717.     subq.l    #8,a0
  718.     lea    _vpn,a2
  719.         fadd.x    fp1,fp0
  720.         fmove.s    fp0,(a1)+
  721.  
  722.         fmove.s    (a2)+,fp0
  723.         fmul.s    (a0)+,fp0
  724.         fmove.s    (a2)+,fp1
  725.         fmul.s    (a0)+,fp1
  726.         fadd.x    fp1,fp0
  727.         fmove.s    (a2),fp1
  728.         fmul.s    (a0),fp1
  729.     move.l    (sp)+,a2
  730.         fadd.x    fp1,fp0
  731.         fmove.s    fp0,(a1)
  732.     rts
  733.  
  734. ; void __asm R_AddDynamicLights (void)
  735.  
  736. ;    adds dynamic lights to lightmaps
  737.  
  738. _r_drawsurf_surf    equ    _r_drawsurf+8
  739.  
  740. vid_colormap    equ    _vid+4
  741.  
  742.         cnop    0,4
  743. @R_AddDynamicLights:
  744.         fmovem.x    fp2-fp6,-(sp)
  745.         movem.l    d2-d7/a2-a6,-(sp)
  746.         subq.l    #4,sp
  747.  
  748.         move.l    _r_drawsurf_surf,a6    ; surf
  749.  
  750.         move.w    $30(a6),d0
  751.         move.w    $32(a6),d1
  752.         ext.l    d0
  753.         ext.l    d1
  754.         asr.l    #4,d0
  755.         asr.l    #4,d1
  756.         addq.l    #1,d0
  757.         addq.l    #1,d1
  758.         move.l    d0,a4
  759.         move.l    d1,a5
  760.  
  761.         lea    _cl_dlights,a2    ; *cl_dlights
  762.         move.l    $34(a6),a3    ; tex
  763.  
  764.         moveq    #0,d1
  765. .adll
  766.         move.l    d1,(sp)
  767.         moveq    #0,d0
  768.         bset    d1,d0
  769.         and.l    8(a6),d0
  770.         beq.w    .continue
  771.  
  772.         move.l    12(a6),a0    ; surf->plane->normal
  773.         fmove.s    (a0)+,fp0
  774.         fmul.s    (a2),fp0
  775.         fmove.s    (a0)+,fp1
  776.         fmul.s    4(a2),fp1
  777.         fadd.x    fp1,fp0
  778.         fmove.s    (a0)+,fp1
  779.         fmul.s    8(a2),fp1
  780.         fadd.x    fp1,fp0
  781.         fsub.s    (a0),fp0    ; dist
  782.  
  783.         fmove.x    fp0,fp1
  784.         ftst.x    fp1
  785.         fbge.w    .dd
  786.         fneg.x    fp1
  787. .dd
  788.         fmove.s    12(a2),fp2    ; rad
  789.         fsub.x    fp1,fp2
  790.  
  791.         fmove.s    $18(a2),fp3    ; minlight
  792.  
  793.         fcmp.x    fp3,fp2
  794.         fblt.w    .continue
  795.         fneg.x    fp3
  796.         fadd.x    fp2,fp3
  797.  
  798.         fneg.x    fp0
  799.  
  800.         move.l    12(a6),a0    ; surf->plane->normal
  801.         fmove.s    (a0)+,fp4
  802.         fmul.x    fp0,fp4
  803.         fadd.s    (a2),fp4
  804.         fmove.s    (a0)+,fp5
  805.         fmul.x    fp0,fp5
  806.         fadd.s    4(a2),fp5
  807.         fmove.s    (a0),fp6
  808.         fmul.x    fp0,fp6
  809.         fadd.s    8(a2),fp6
  810.  
  811.         fmove.x    fp4,fp0
  812.         fmul.s    (a3),fp0
  813.         fmove.x    fp5,fp1
  814.         fmul.s    4(a3),fp1
  815.         fadd.x    fp1,fp0
  816.         fmove.x    fp6,fp1
  817.         fmul.s    8(a3),fp1
  818.     move.w    $2c(a6),d0
  819.     ext.l    d0
  820.         fadd.x    fp1,fp0
  821.         fadd.s    12(a3),fp0
  822.         fmove.l    fp0,d2
  823.         sub.l    d0,d2
  824.  
  825.         fmove.x    fp4,fp0
  826.         fmul.s    16(a3),fp0
  827.         fmove.x    fp5,fp1
  828.         fmul.s    20(a3),fp1
  829.         fadd.x    fp1,fp0
  830.         fmove.x    fp6,fp1
  831.         fmul.s    24(a3),fp1
  832.     move.w    $2e(a6),d0
  833.     ext.l    d0
  834.         fadd.x    fp1,fp0
  835.         fadd.s    28(a3),fp0
  836.         fmove.l    fp0,d3
  837.         sub.l    d0,d3
  838.  
  839.  
  840.         fmul.s    #256,fp2
  841.     lea    _blocklights,a0
  842.     moveq    #0,d7
  843.         fmove.l    fp2,d0
  844.         move.l    d0,a1
  845.  
  846.         fmove.l    fp3,d0
  847.  
  848.         bra.b    .adi0
  849. .adl0
  850.         move.l    d7,d1
  851.         move.l    d3,d5
  852.         lsl.l    #4,d1
  853.         sub.l    d1,d5
  854.         bpl.b    .ads0
  855.         neg.l    d5
  856. .ads0
  857.         moveq    #0,d6
  858.         bra.b    .adi1
  859. .adl1
  860.         move.l    d6,d1
  861.         move.l    d2,d4
  862.         lsl.l    #4,d1
  863.         sub.l    d1,d4
  864.         bpl.b    .ads1
  865.         neg.l    d4
  866. .ads1
  867.         cmp.l    d4,d5
  868.         bge.b    .ads2
  869.         move.l    d5,d1
  870.         lsr.l    #1,d1
  871.         add.l    d1,d4
  872.         bra.b    .ads3
  873. .ads2
  874.         lsr.l    #1,d4
  875.         add.l    d5,d4
  876. .ads3
  877.         cmp.l    d0,d4
  878.         bge.b    .ads4
  879.         lsl.l    #8,d4
  880.         move.l    a1,d1
  881.         sub.l    d4,d1
  882.         add.l    d1,(a0,d6.w*4)
  883. .ads4
  884.         addq.l    #1,d6
  885. .adi1
  886.         cmp.l    a4,d6
  887.         blt.b    .adl1
  888.  
  889.         addq.l    #1,d7
  890.         lea    (a0,a4.w*4),a0
  891. .adi0
  892.         cmp.l    a5,d7
  893.         blt.b    .adl0
  894. .continue
  895.         move.l    (sp),d1
  896.         moveq    #$20,d0
  897.         addq.l    #1,d1
  898.         add.l    d0,a2
  899.         cmp.l    d0,d1
  900.         blt.w    .adll
  901.  
  902.         addq.l    #4,sp
  903.         movem.l    (sp)+,d2-d7/a2-a6
  904.         fmovem.x    (sp)+,fp2-fp6
  905.         rts
  906.  
  907.         cnop    0,8
  908. lnum:        dc.l    0
  909.  
  910. ; void __asm R_DrawSurfaceBlock8_mip0 (void)
  911.  
  912. ;    mipmap level 0
  913.  
  914. @R_DrawSurfaceBlock8_mip0:
  915.         movem.l    d2-d7/a2-a6,-(sp)
  916.  
  917.         move.l    _pbasesource,a5
  918.         move.l    _prowdestbase,a3
  919.  
  920.         moveq    #0,d3
  921.         bra.b    .in
  922. .l2
  923.         move.l    _r_lightptr,a0
  924.         move.l    (a0),d0
  925.         move.l    4(a0),d1
  926.  
  927.         move.l    _r_lightwidth,d2
  928.         lea    0(a0,d2.l*4),a1
  929.         move.l    a1,_r_lightptr
  930.  
  931.         move.l    (a1)+,d4
  932.         move.l    (a1),d5
  933.         sub.l    d0,d4
  934.         sub.l    d1,d5
  935.         lsr.l    #4,d4
  936.         lsr.l    #4,d5
  937.         move.l    d4,a2
  938.         move.l    d5,a6
  939.  
  940.         move.l    vid_colormap,a0
  941.         moveq    #0,d2
  942.         moveq    #$0f,d6
  943. .l1
  944.         move.l    d0,d4
  945.         move.l    d1,d5
  946.         sub.l    d4,d5
  947.         asr.l    #4,d5
  948.  
  949.         move.l    a5,a4
  950.         move.l    a3,a1
  951.  
  952.         moveq    #$0f,d7
  953. .l0        move.w    d4,d2
  954.         move.b    (a4)+,d2
  955.         move.b    0(a0,d2.l),(a1)+
  956.         add.l    d5,d4
  957.         subq.l    #1,d7
  958.         bpl.b    .l0
  959.  
  960.         add.l    _sourcetstep,a5
  961.         add.l    _surfrowbytes,a3
  962.         add.l    a2,d0
  963.         add.l    a6,d1
  964.  
  965.         subq.l    #1,d6
  966.         bpl.b    .l1
  967.  
  968.         cmp.l    _r_sourcemax,a5
  969.         bcs.b    .s00
  970.         sub.l    _r_stepback,a5
  971. .s00
  972.         addq.l    #1,d3
  973. .in
  974.         cmp.l    _r_numvblocks,d3
  975.         blt.b    .l2
  976.  
  977.         movem.l    (sp)+,d2-d7/a2-a6
  978.         rts
  979.  
  980. ; void __asm R_DrawSurfaceBlock8_mip1 (void)
  981.  
  982. ;    mipmap level 1
  983.  
  984. @R_DrawSurfaceBlock8_mip1:
  985.         movem.l    d2-d7/a2-a6,-(sp)
  986.  
  987.         move.l    _pbasesource,a5
  988.         move.l    _prowdestbase,a3
  989.  
  990.         moveq    #0,d3
  991.         bra.b    .in1
  992. .l21
  993.         move.l    _r_lightptr,a0
  994.         move.l    (a0),d0
  995.         move.l    4(a0),d1
  996.  
  997.         move.l    _r_lightwidth,d2
  998.         lea    0(a0,d2.l*4),a1
  999.         move.l    a1,_r_lightptr
  1000.  
  1001.         move.l    (a1)+,d4
  1002.         move.l    (a1),d5
  1003.         sub.l    d0,d4
  1004.         sub.l    d1,d5
  1005.         lsr.l    #3,d4
  1006.         lsr.l    #3,d5
  1007.         move.l    d4,a2
  1008.         move.l    d5,a6
  1009.  
  1010.         move.l    vid_colormap,a0
  1011.         moveq    #0,d2
  1012.         moveq    #$07,d6
  1013. .l11
  1014.         move.l    d0,d4
  1015.         move.l    d1,d5
  1016.         sub.l    d4,d5
  1017.         asr.l    #3,d5
  1018.  
  1019.         move.l    a5,a4
  1020.         move.l    a3,a1
  1021.  
  1022.         moveq    #$07,d7
  1023. .l01        move.w    d4,d2
  1024.         move.b    (a4)+,d2
  1025.         move.b    0(a0,d2.l),(a1)+
  1026.         add.l    d5,d4
  1027.         subq.l    #1,d7
  1028.         bpl.b    .l01
  1029.  
  1030.         add.l    _sourcetstep,a5
  1031.         add.l    _surfrowbytes,a3
  1032.         add.l    a2,d0
  1033.         add.l    a6,d1
  1034.  
  1035.         subq.l    #1,d6
  1036.         bpl.b    .l11
  1037.  
  1038.         cmp.l    _r_sourcemax,a5
  1039.         bcs.b    .s01
  1040.         sub.l    _r_stepback,a5
  1041. .s01
  1042.         addq.l    #1,d3
  1043. .in1
  1044.         cmp.l    _r_numvblocks,d3
  1045.         blt.b    .l21
  1046.  
  1047.         movem.l    (sp)+,d2-d7/a2-a6
  1048.         rts
  1049.  
  1050. ; void __asm R_DrawSurfaceBlock8_mip2 (void)
  1051.  
  1052. ;    mipmap level 2
  1053.  
  1054. @R_DrawSurfaceBlock8_mip2:
  1055.         movem.l    d2-d6/a2-a6,-(sp)
  1056.  
  1057.         move.l    _pbasesource,a5
  1058.         move.l    _prowdestbase,a3
  1059.  
  1060.         moveq    #0,d3
  1061.         bra.w    .in2
  1062. .l22
  1063.         move.l    _r_lightptr,a0
  1064.         move.l    (a0),d0
  1065.         move.l    4(a0),d1
  1066.  
  1067.         move.l    _r_lightwidth,d2
  1068.         lea    0(a0,d2.l*4),a1
  1069.         move.l    a1,_r_lightptr
  1070.  
  1071.         move.l    (a1)+,d4
  1072.         move.l    (a1),d5
  1073.         sub.l    d0,d4
  1074.         sub.l    d1,d5
  1075.         lsr.l    #2,d4
  1076.         lsr.l    #2,d5
  1077.         move.l    d4,a2
  1078.         move.l    d5,a6
  1079.  
  1080.         move.l    vid_colormap,a0
  1081.         moveq    #0,d2
  1082.         moveq    #$03,d6
  1083. .l12
  1084.         move.l    d0,d4
  1085.         move.l    d1,d5
  1086.         sub.l    d4,d5
  1087.         asr.l    #3,d5
  1088.  
  1089.         move.l    a5,a4
  1090.         move.w    d4,d2
  1091.         move.l    a3,a1
  1092.         move.b    (a4)+,d2
  1093.         move.b    0(a0,d2.l),(a1)+
  1094.         add.l    d5,d4
  1095.         move.w    d4,d2
  1096.         move.b    (a4)+,d2
  1097.         move.b    0(a0,d2.l),(a1)+
  1098.         add.l    d5,d4
  1099.         move.w    d4,d2
  1100.         move.b    (a4)+,d2
  1101.         move.b    0(a0,d2.l),(a1)+
  1102.         add.l    d5,d4
  1103.         move.w    d4,d2
  1104.         move.b    (a4)+,d2
  1105.         move.b    0(a0,d2.l),(a1)+
  1106.  
  1107.         add.l    _sourcetstep,a5
  1108.         add.l    _surfrowbytes,a3
  1109.         add.l    a2,d0
  1110.         add.l    a6,d1
  1111.  
  1112.         subq.l    #1,d6
  1113.         bpl.b    .l12
  1114.  
  1115.         cmp.l    _r_sourcemax,a5
  1116.         bcs.b    .s02
  1117.         sub.l    _r_stepback,a5
  1118. .s02
  1119.         addq.l    #1,d3
  1120. .in2
  1121.         cmp.l    _r_numvblocks,d3
  1122.         blt.w    .l22
  1123.  
  1124.         movem.l    (sp)+,d2-d6/a2-a6
  1125.         rts
  1126.  
  1127. ; void __asm R_DrawSurfaceBlock8_mip3 (void)
  1128.  
  1129. ;    mipmap level 3
  1130.  
  1131. @R_DrawSurfaceBlock8_mip3:
  1132.         movem.l    d2-d6/a2-a6,-(sp)
  1133.  
  1134.         move.l    _pbasesource,a5
  1135.         move.l    _prowdestbase,a3
  1136.  
  1137.         moveq    #0,d3
  1138.         bra.b    .in3
  1139. .l23
  1140.         move.l    _r_lightptr,a0
  1141.         move.l    (a0),d0
  1142.         move.l    4(a0),d1
  1143.  
  1144.         move.l    _r_lightwidth,d2
  1145.         lea    0(a0,d2.l*4),a1
  1146.         move.l    a1,_r_lightptr
  1147.  
  1148.         move.l    (a1)+,d4
  1149.         move.l    (a1),d5
  1150.         sub.l    d0,d4
  1151.         sub.l    d1,d5
  1152.         lsr.l    #1,d4
  1153.         lsr.l    #1,d5
  1154.         move.l    d4,a2
  1155.         move.l    d5,a6
  1156.  
  1157.         move.l    vid_colormap,a0
  1158.         moveq    #0,d2
  1159.         moveq    #$01,d6
  1160. .l13
  1161.         move.l    d0,d4
  1162.         move.l    d1,d5
  1163.         sub.l    d4,d5
  1164.         asr.l    #3,d5
  1165.  
  1166.         move.l    a5,a4
  1167.         move.w    d4,d2
  1168.         move.l    a3,a1
  1169.         move.b    (a4)+,d2
  1170.         move.b    0(a0,d2.l),(a1)+
  1171.         add.l    d5,d4
  1172.         move.w    d4,d2
  1173.         move.b    (a4)+,d2
  1174.         move.b    0(a0,d2.l),(a1)+
  1175.  
  1176.         add.l    _sourcetstep,a5
  1177.         add.l    _surfrowbytes,a3
  1178.         add.l    a2,d0
  1179.         add.l    a6,d1
  1180.  
  1181.         subq.l    #1,d6
  1182.         bpl.b    .l13
  1183.  
  1184.         cmp.l    _r_sourcemax,a5
  1185.         bcs.b    .s03
  1186.         sub.l    _r_stepback,a5
  1187. .s03
  1188.         addq.l    #1,d3
  1189. .in3
  1190.         cmp.l    _r_numvblocks,d3
  1191.         blt.b    .l23
  1192.  
  1193.         movem.l    (sp)+,d2-d6/a2-a6
  1194.         rts
  1195.  
  1196. ; void R_DrawSurfaceBlock16 (void)
  1197.  
  1198. ;    dummy
  1199.  
  1200. @R_DrawSurfaceBlock16:    ; not needed in quake 1
  1201.         rts
  1202.  
  1203.  
  1204.         END
  1205.