home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / BLURZOO2.SO < prev    next >
Text File  |  2003-01-02  |  28KB  |  1,592 lines

  1. ; Motherfuckin' blurzoomer-rotator thingy from south of heaven.
  2. ; Not to forget some morphin' bits as well. Kick it, chef.
  3. ; A screen for delta.
  4. ; Frametime is 40ms min, cos of 'run out of input for feedback' problem.
  5. ; A small accelerator (nemesis, ct1, phantom) helps alot!
  6.  
  7. ;======= OBJECT EQUATES ========
  8.  
  9. XZoom.RX:    =    42
  10. XZoom.RY:    =    26
  11.  
  12.                 RSRESET
  13. BlurZoom.truecolor_tbl:        RS.L    4096
  14. BlurZoom.OBJ_START:        RS.B    0
  15. BlurZoom.circles_tbl:        RS.W    100*3
  16. BlurZoom.circles2_tbl:        RS.W    100*3
  17. BlurZoom.circles3_tbl:        RS.W    100*3
  18. BlurZoom.pyramid_tbl:        RS.W    100*3
  19. BlurZoom.delta_tbl:        RS.W    100*3
  20. BlurZoom.shape_tbl:        RS.W    100*3
  21. BlurZoom.destshape_tbl:        RS.W    100*3
  22. BlurZoom.OBJ_END:        RS.B    0
  23. BlurZoom.matrix_tbl:        RS.W    3*3
  24. BlurZoom.rotofadeoffset_tbl:    RS.W    160*100
  25. BlurZoom.sprite_buf:        RS.W    16*16
  26. BlurZoom.fadepal_tbl:        RS.W    1<<16
  27. BlurZoom.morph_tbl:        RS.W    1+10*2
  28. BlurZoom.BLOCK_SIZE:        RS.B    0
  29.  
  30. ;======= OBJECT TABLE ========
  31.  
  32. ; Must be first in object!!
  33. BlurZoom.table:
  34.     DC.L    BlurZoom.mainLoop
  35.     DC.L    BlurZoom.init
  36.     DC.L    BlurZoom.deInit
  37.     DC.L    TOGGLE_BOBS
  38.     DC.L    SET_BLUR
  39.     DC.L    SET_ROTO
  40.     DC.L    SET_ROTOFADE
  41.     DC.L    0
  42.  
  43. ;======= RESOLUTION SETTING ROUTINE ========
  44.  
  45. BlurZoom.initRealtime:
  46.     move.l    #BlurZoom.setRes,vbl_gfx
  47.  
  48.     bsr.l    Mem.getBlock
  49.     move.l    d0,BlurZoom.baseAdr
  50.  
  51.     bsr    BlurZoom.initMorphTable
  52.  
  53. ; Clear obj tables!!!
  54.     move.w    #(BlurZoom.OBJ_END-BlurZoom.OBJ_START)/2-1,d7
  55.     movea.l    BlurZoom.baseAdr,a0
  56.     adda.l    #BlurZoom.OBJ_START,a0
  57. .clear_loop:
  58.     clr.w    (a0)+
  59.     dbf    d7,.clear_loop
  60.  
  61.     movea.l    BlurZoom.baseAdr,a0
  62.     adda.l    #BlurZoom.circles_tbl,a0
  63.     bsr    INIT_CIRCLES
  64.     movea.l    BlurZoom.baseAdr,a0
  65.     adda.l    #BlurZoom.circles2_tbl,a0
  66.     bsr    INIT_CIRCLES2
  67.     movea.l    BlurZoom.baseAdr,a0
  68.     adda.l    #BlurZoom.circles3_tbl,a0
  69.     bsr    INIT_CIRCLES3
  70.     movea.l    BlurZoom.baseAdr,a0
  71.     adda.l    #BlurZoom.pyramid_tbl,a0
  72.     bsr    INIT_PYRAMID
  73.     movea.l    BlurZoom.baseAdr,a0
  74.     adda.l    #BlurZoom.delta_tbl,a0
  75.     bsr    INIT_DELTA
  76.  
  77.     movea.l    BlurZoom.baseAdr,a0
  78.     movea.l    a0,a1
  79.     adda.l    #BlurZoom.truecolor_tbl,a0
  80.     lea    flow_tbl,a1
  81.     bsr.l    Pal.makeGradientTc
  82.  
  83.     bsr    CALC_FADEPAL
  84.  
  85.     move.w    #sintbllen/64,d0
  86.     move.w    #27500,d1
  87.     bsr    XZoom.calcVectors
  88.     addi.l    #80<<8,d4
  89.     addi.l    #50<<8,d5
  90.     movea.l    BlurZoom.baseAdr,a0
  91.     adda.l    #BlurZoom.rotofadeoffset_tbl,a0
  92.     bsr    XZoom.calcOffsets
  93.  
  94.     bsr    SET_ROTO
  95.     clr.w    enablebobs
  96.  
  97.     move.l    $4ba.w,morphstarttime
  98.  
  99.     move.w    monitormode,d0
  100.     cmpi.w    #vga60,d0
  101.     beq.s    .vga60
  102.     cmpi.w    #vga100,d0
  103.     beq.s    .vga100
  104.     cmpi.w    #rgb50,d0
  105.     beq.s    .rgb50
  106. * Unknown monitormode..
  107.     rts
  108. .vga60:    move.l    #PLOT_8BY8SPRITE160200,spriteRout
  109.     rts
  110. .vga100:move.l    #PLOT_8BY8SPRITE160100,spriteRout
  111.     rts
  112. .rgb50:    move.l    #PLOT_8BY8SPRITE320100,spriteRout
  113.     rts
  114.  
  115. BlurZoom.setRes:
  116.     IFEQ    testmode
  117.     move.l    frmcnt,d0
  118.     sub.l    lastframecount,d0
  119.     beq.s    .end
  120.  
  121.     move.l    #rts,vbl_gfx
  122.  
  123.     move.w    monitormode,d0
  124.     cmpi.w    #vga60,d0
  125.     beq.s    .vga60
  126.     cmpi.w    #vga100,d0
  127.     beq.s    .vga100
  128.     cmpi.w    #rgb50,d0
  129.     beq.s    .rgb50
  130. * Unknown monitormode..
  131. .end:    rts
  132. .vga60:    bra.l    vga60_16bit_160_200
  133. .vga100:bra.l    vga100_16bit_160_100
  134. .rgb50:    bra.l    rgb50_16bit_320_100
  135.     ENDC
  136.  
  137. ;======= INIT SUBROUTINE ========
  138.  
  139. * OUTPUT: d0.l: 0   = All clear.
  140. *               neg = Error! Not initialized!
  141. BlurZoom.init:
  142.     move.l    #BlurZoom.BLOCK_SIZE,d0
  143.     bsr.l    Mem.register
  144.  
  145. .success:
  146.     moveq    #0,d0
  147.     rts
  148. .error:    moveq    #-1,d0
  149.     rts
  150.  
  151. BlurZoom.deInit:
  152.     
  153.     rts
  154.  
  155. ;======= SCREENINIT SUBROUTINE ========
  156.  
  157. BlurZoom.initScreen:
  158.  
  159.     rts
  160.  
  161. ;======= MAINLOOP SUBROUTINE ========
  162.  
  163. BlurZoom.mainLoop:
  164.     move.w    $0468.w,.old468
  165.  
  166.     move.l    frmcnt,d0
  167.     sub.l    lastframecount,d0
  168.     bne.s    .res_done
  169.     move.l    d0,-(sp)
  170.     bsr    BlurZoom.initRealtime
  171.     move.l    (sp)+,d0
  172. .res_done:
  173.     cmpi.l    #3,d0
  174.     bhs.s    .end_screeninit
  175.     bsr    BlurZoom.initScreen
  176. .end_screeninit:
  177.  
  178.     lea    scr,a2
  179.     movea.l    (a2),a0
  180.     movea.l    8(a2),a1
  181.     movea.l    BlurZoom.baseAdr,a2
  182.     adda.l    #BlurZoom.rotofadeoffset_tbl,a2
  183.     movea.l    backgroundadr,a3
  184.     jsr    (a3)
  185.  
  186. .paint_bobs:
  187.     tst.w    enablebobs
  188.     beq    .end_paint_bobs
  189.     move.w    colorpos,d0
  190.     addq.w    #1,d0
  191.     andi.w    #$1ff,d0
  192.     move.w    d0,colorpos
  193.     movea.l    BlurZoom.baseAdr,a0
  194.     adda.l    #BlurZoom.truecolor_tbl,a0
  195.     lea    (a0,d0.w*4),a0
  196.     moveq    #0,d0
  197.     moveq    #0,d1
  198.     moveq    #0,d2
  199.     move.b    (a0)+,d0
  200.     move.b    (a0)+,d1
  201.     move.w    (a0)+,d2
  202.     movea.l    BlurZoom.baseAdr,a0
  203.     lea    presprite_dat,a1
  204.     adda.l    #BlurZoom.sprite_buf,a0
  205.     bsr    CALC_8BY8SPRITE
  206.  
  207.     movea.l    BlurZoom.baseAdr,a0
  208.     adda.l    #BlurZoom.morph_tbl,a0
  209.     move.w    (a0)+,d1
  210.     move.w    morphstep,d2
  211.     move.l    $4ba.w,d0
  212.     sub.l    morphstarttime,d0
  213.     cmpi.l    #512,d0
  214.     blt.s    .ok
  215.     moveq    #0,d0
  216.     move.l    $4ba.w,morphstarttime
  217.     addq.w    #1,d2
  218.     cmp.w    d1,d2
  219.     blt.s    .ok
  220.     moveq    #0,d2
  221. .ok:    move.w    d2,morphstep
  222.     movem.l    (a0,d2.w*4),a1-a2
  223.     lsl.w    #6,d0
  224.  
  225.     movea.l    BlurZoom.baseAdr,a0
  226.     adda.l    #BlurZoom.shape_tbl,a0
  227.     bsr    MORPH_3DPOINTS
  228.  
  229.     move.w    $4bc.w,d0
  230.     move.w    d0,d1
  231.     move.w    d0,d2
  232.     lsl.w    #1,d0
  233.     mulu.w    #5,d1
  234.     lsr.w    #2,d1
  235.     mulu.w    #3,d2
  236.     lsr.w    #2,d2
  237.     movea.l    BlurZoom.baseAdr,a0
  238.     adda.l    #BlurZoom.matrix_tbl,a0
  239.     bsr    GENERATE_MATRIX
  240.  
  241.     movea.l    BlurZoom.baseAdr,a0
  242.     movea.l    a0,a1
  243.     movea.l    a0,a2
  244.     adda.l    #BlurZoom.destshape_tbl,a0
  245.     adda.l    #BlurZoom.matrix_tbl,a1
  246.     adda.l    #BlurZoom.shape_tbl,a2
  247. ;    adda.l    #BlurZoom.delta_tbl,a2
  248.     move.w    (a2)+,d7
  249.     bsr    ROTATE_OBJECT
  250.  
  251.     movea.l    BlurZoom.baseAdr,a0
  252.     adda.l    #BlurZoom.destshape_tbl,a0
  253.     bsr    SORT_OBJECT
  254.  
  255.     movea.l    BlurZoom.baseAdr,a0
  256.     adda.l    #BlurZoom.destshape_tbl,a0
  257.     move.w    (a0)+,d7
  258.     subq.w    #1,d7
  259.     bmi.s    .end
  260.  
  261. .loop:    move.w    (a0)+,d0
  262.     move.w    (a0)+,d1
  263.     asr.w    #1,d0
  264.     asr.w    #1,d1
  265.     addq    #2,a0
  266.     add.w    #80-4,d0
  267.     add.w    #50-4,d1
  268.  
  269.     move.w    d7,-(sp)
  270.     move.l    a0,-(sp)
  271.  
  272.     movea.l    scr,a0
  273.     movea.l    BlurZoom.baseAdr,a1
  274.     adda.l    #BlurZoom.sprite_buf,a1
  275.     movea.l    spriteRout,a2
  276.     jsr    (a2)
  277.  
  278.     movea.l    (sp)+,a0
  279.     move.w    (sp)+,d7
  280.  
  281.     dbf    d7,.loop
  282. .end:
  283. .end_paint_bobs:
  284.  
  285.     lea    scr,a0
  286.     move.l    (a0)+,d0
  287.     move.l    (a0)+,d1
  288.     move.l    (a0),-4(a0)
  289.     move.l    d0,(a0)
  290.     move.l    d1,-8(a0)
  291.  
  292.     IFEQ    testmode
  293.     move.l    d0,d1
  294.     lsr.w    #8,d0
  295.     move.l    d0,$ffff8200.w
  296.     move.b    d1,$ffff820d.w
  297.  
  298.     move.w    .old468(pc),d0
  299.     moveq    #2,d2
  300.     cmpi.w    #vga100,monitormode
  301.     bne.s    .novga100
  302.     moveq    #4,d2
  303. .novga100:
  304. .loop468:
  305.     move.w    $0468.w,d1
  306.     sub.w    d0,d1
  307.     cmp.w    d2,d1
  308.     blt.s    .loop468
  309.     ENDC
  310.     rts
  311.  
  312. .old468:
  313.     DC.W    0
  314.  
  315. ;======= OBJECT SUBROUTINES ========
  316.  
  317. TOGGLE_BOBS:
  318.     not.w    enablebobs
  319.     rts
  320.  
  321. SET_ROTO:
  322.     move.w    monitormode,d0
  323.     cmpi.w    #vga100,d0
  324.     beq.s    .vga100
  325.     cmpi.w    #vga60,d0
  326.     beq.s    .vga60
  327.     cmpi.w    #rgb50,d0
  328.     beq.s    .rgb50
  329.     rts
  330. .vga100:move.l    #PLOT_ROTO_160100,backgroundadr
  331.     rts
  332. .vga60:    move.l    #PLOT_ROTO_160200,backgroundadr
  333.     rts
  334. .rgb50:    move.l    #PLOT_ROTO_320100,backgroundadr
  335.     rts
  336.  
  337. SET_ROTOFADE:
  338.     move.w    monitormode,d0
  339.     cmpi.w    #vga100,d0
  340.     beq.s    .vga100
  341.     cmpi.w    #vga60,d0
  342.     beq.s    .vga60
  343.     cmpi.w    #rgb50,d0
  344.     beq.s    .rgb50
  345.     rts
  346. .vga100:move.l    #PLOT_ROTOF160100,backgroundadr
  347.     rts
  348. .vga60:    move.l    #PLOT_ROTOF160200,backgroundadr
  349.     rts
  350. .rgb50:    move.l    #PLOT_ROTOF320100,backgroundadr
  351.     rts
  352.  
  353. SET_BLUR:
  354.     move.w    monitormode,d0
  355.     cmpi.w    #vga100,d0
  356.     beq.s    .vga100
  357.     cmpi.w    #vga60,d0
  358.     beq.s    .vga60
  359.     cmpi.w    #rgb50,d0
  360.     beq.s    .rgb50
  361.     rts
  362. .vga100:move.l    #BLUR_160100,backgroundadr
  363.     rts
  364. .vga60:    move.l    #BLUR_160200,backgroundadr
  365.     rts
  366. .rgb50:    move.l    #BLUR_320100,backgroundadr
  367.     rts
  368.  
  369. BlurZoom.initMorphTable:
  370.     movea.l    BlurZoom.baseAdr,a0
  371.     movea.l    a0,a1
  372.     adda.l    #BlurZoom.morph_tbl,a0
  373.     move.w    #4,(a0)+
  374.     movea.l    a1,a2
  375.     adda.l    #BlurZoom.circles_tbl,a2
  376.     movea.l    a2,a6
  377.     move.l    a2,(a0)+
  378.     movea.l    a1,a2
  379.     adda.l    #BlurZoom.circles2_tbl,a2
  380.     move.l    a2,(a0)+
  381.     movea.l    a1,a2
  382.     adda.l    #BlurZoom.circles3_tbl,a2
  383.     move.l    a2,(a0)+
  384.     movea.l    a1,a2
  385.     adda.l    #BlurZoom.pyramid_tbl,a2
  386.     move.l    a2,(a0)+
  387.     move.l    a6,(a0)+                ; Repeat 1st.
  388.     rts
  389.  
  390. * INPUT: d0.w: $0-$ff red
  391. *        d1.w: $0-$ff green
  392. *        d2.w: $0-$ff blue
  393. *        a0: highcolor rle sprite buffer to write to
  394. *        a1: bpp rle sprite data
  395. CALC_8BY8SPRITE:
  396.     moveq    #8-1,d7
  397.  
  398. .yloop:    move.w    (a1)+,d6
  399.     move.w    d6,(a0)+
  400.     bmi.s    .end_xloop
  401.     move.w    (a1)+,(a0)+
  402.  
  403. .xloop:    moveq    #0,d3
  404.     move.w    (a1)+,d3
  405.     move.l    d3,d4
  406.     move.l    d3,d5
  407.     mulu.w    d0,d3
  408.     mulu.w    d1,d4
  409.     mulu.w    d2,d5
  410.     andi.w    #%1111100000000000,d3
  411.     andi.w    #%1111110000000000,d4
  412.     lsr.w    #5,d4
  413.     lsr.w    #8,d5
  414.     lsr.w    #3,d5
  415.     or.w    d3,d5
  416.     or.w    d4,d5
  417.     move.w    d5,(a0)+
  418.     dbra    d6,.xloop
  419. .end_xloop:
  420.  
  421.     dbra    d7,.yloop
  422.     rts
  423.  
  424. * INPUT: a0: shape
  425. INIT_CIRCLES:
  426.     lea    sine_tbl,a1
  427.     lea    2(a0),a6
  428.     moveq    #0,d0
  429.     moveq    #0,d4
  430.     moveq    #9,d3
  431.  
  432. .loop1:    Get_SinCos    a1,d0,d1,d2
  433.     asr.w    d3,d1
  434.     asr.w    d3,d2
  435.     move.w    d1,(a6)+
  436.     move.w    d2,(a6)+
  437.     clr.w    (a6)+
  438.     addq.w    #1,d4
  439.     add.w    #sintbllen/32,d0
  440.     cmp.w    #sintbllen,d0
  441.     blt.s    .loop1
  442.  
  443.     moveq    #0,d0
  444.  
  445. .loop2:    Get_SinCos    a1,d0,d1,d2
  446.     asr.w    d3,d1
  447.     asr.w    d3,d2
  448.     move.w    d1,(a6)+
  449.     move.w    d2,(a6)+
  450.     clr.w    (a6)+
  451.     addq.w    #1,d4
  452.     add.w    #sintbllen/32,d0
  453.     cmp.w    #sintbllen,d0
  454.     blt.s    .loop2
  455.  
  456.     move.w    d4,(a0)
  457.     rts
  458.  
  459. * INPUT: a0: shape
  460. INIT_CIRCLES2:
  461.     lea    sine_tbl,a1
  462.     lea    2(a0),a6
  463.     moveq    #0,d0
  464.     moveq    #0,d4
  465.     moveq    #9,d3
  466.  
  467. .loop1:    Get_SinCos    a1,d0,d1,d2
  468.     asr.w    d3,d1
  469.     asr.w    d3,d2
  470.     move.w    d1,(a6)+
  471.     move.w    d2,(a6)+
  472.     clr.w    (a6)+
  473.     addq.w    #1,d4
  474.     add.w    #sintbllen/32,d0
  475.     cmp.w    #sintbllen,d0
  476.     blt.s    .loop1
  477.  
  478.     moveq    #0,d0
  479.  
  480. .loop2:    Get_SinCos    a1,d0,d1,d2
  481.     asr.w    d3,d1
  482.     asr.w    d3,d2
  483.     clr.w    (a6)+
  484.     move.w    d1,(a6)+
  485.     move.w    d2,(a6)+
  486.     addq.w    #1,d4
  487.     add.w    #sintbllen/32,d0
  488.     cmp.w    #sintbllen,d0
  489.     blt.s    .loop2
  490.  
  491.     move.w    d4,(a0)
  492.     rts
  493.  
  494. * INPUT: a0: shape
  495. INIT_CIRCLES3:
  496.     lea    sine_tbl,a1
  497.     lea    2(a0),a6
  498.     moveq    #0,d0
  499.     moveq    #0,d4
  500.     moveq    #9,d3
  501.  
  502. .loop1:    Get_Sin    a1,d0,d1
  503.     move.w    d0,d2
  504.     add.w    d2,d2
  505.     Do_SinModulo    d2
  506.     Get_Sin    a1,d2,d2
  507.     asr.w    d3,d1
  508.     asr.w    d3,d2
  509.     move.w    d1,(a6)+
  510.     move.w    d2,(a6)+
  511.     clr.w    (a6)+
  512.     addq.w    #1,d4
  513.     add.w    #sintbllen/32,d0
  514.     cmp.w    #sintbllen,d0
  515.     blt.s    .loop1
  516.  
  517.     moveq    #0,d0
  518.  
  519. .loop2:    Get_Sin    a1,d0,d1
  520.     move.w    d0,d2
  521.     add.w    d2,d2
  522.     Do_SinModulo    d2
  523.     Get_Sin    a1,d2,d2
  524.     asr.w    d3,d1
  525.     asr.w    d3,d2
  526.     clr.w    (a6)+
  527.     move.w    d1,(a6)+
  528.     move.w    d2,(a6)+
  529.     addq.w    #1,d4
  530.     add.w    #sintbllen/32,d0
  531.     cmp.w    #sintbllen,d0
  532.     blt.s    .loop2
  533.  
  534.     move.w    d4,(a0)
  535.     rts
  536.  
  537. * INPUT: a0: shape
  538. INIT_PYRAMID:
  539.     lea    2(a0),a6
  540.     moveq    #0,d4
  541.  
  542.     move.w    #-48,d0
  543.     move.w    #-48,d1
  544.     move.w    #-48,d2
  545.  
  546. .loop1:    add.w    #96/8,d0
  547.     move.w    d0,(a6)+
  548.     move.w    d1,(a6)+
  549.     move.w    d2,(a6)+
  550.     addq.w    #1,d4    
  551.     cmpi.w    #48,d0
  552.     blt.s    .loop1
  553.  
  554. .loop2:    add.w    #96/8,d1
  555.     move.w    d0,(a6)+
  556.     move.w    d1,(a6)+
  557.     move.w    d2,(a6)+
  558.     addq.w    #1,d4    
  559.     cmpi.w    #48,d1
  560.     blt.s    .loop2
  561.  
  562. .loop3:    sub.w    #96/8,d0
  563.     move.w    d0,(a6)+
  564.     move.w    d1,(a6)+
  565.     move.w    d2,(a6)+
  566.     addq.w    #1,d4    
  567.     cmpi.w    #-48,d0
  568.     bgt.s    .loop3
  569.  
  570. .loop4:    sub.w    #96/8,d1
  571.     move.w    d0,(a6)+
  572.     move.w    d1,(a6)+
  573.     move.w    d2,(a6)+
  574.     addq.w    #1,d4    
  575.     cmpi.w    #-48,d1
  576.     bgt.s    .loop4
  577.  
  578.     moveq    #0,d0
  579.     moveq    #0,d1
  580.     moveq    #48,d2
  581.  
  582. .loop5:    move.w    d0,(a6)+
  583.     move.w    d1,(a6)+
  584.     move.w    d2,(a6)+
  585.     addq.w    #1,d4    
  586.     sub.w    #96/8,d2
  587.     sub.w    #48/8,d1
  588.     sub.w    #48/8,d0
  589.     cmpi.w    #-48,d2
  590.     bgt.s    .loop5
  591.  
  592.     moveq    #48/8,d0
  593.     moveq    #-48/8,d1
  594.     moveq    #48-(96/8),d2
  595.  
  596. .loop6:    move.w    d0,(a6)+
  597.     move.w    d1,(a6)+
  598.     move.w    d2,(a6)+
  599.     addq.w    #1,d4    
  600.     sub.w    #96/8,d2
  601.     sub.w    #48/8,d1
  602.     add.w    #48/8,d0
  603.     cmpi.w    #-48,d2
  604.     bgt.s    .loop6
  605.  
  606.     moveq    #-48/8,d0
  607.     moveq    #48/8,d1
  608.     moveq    #48-(96/8),d2
  609.  
  610. .loop7:    move.w    d0,(a6)+
  611.     move.w    d1,(a6)+
  612.     move.w    d2,(a6)+
  613.     addq.w    #1,d4    
  614.     sub.w    #96/8,d2
  615.     add.w    #48/8,d1
  616.     sub.w    #48/8,d0
  617.     cmpi.w    #-48,d2
  618.     bgt.s    .loop7
  619.  
  620.     moveq    #48/8,d0
  621.     moveq    #48/8,d1
  622.     moveq    #48-(96/8),d2
  623.  
  624. .loop8:    move.w    d0,(a6)+
  625.     move.w    d1,(a6)+
  626.     move.w    d2,(a6)+
  627.     addq.w    #1,d4    
  628.     sub.w    #96/8,d2
  629.     add.w    #48/8,d1
  630.     add.w    #48/8,d0
  631.     cmpi.w    #-48,d2
  632.     bgt.s    .loop8
  633.  
  634.     move.w    d4,(a0)
  635.     rts
  636.  
  637. * INPUT: a0: shape
  638. INIT_DELTA:
  639.     lea    2(a0),a6
  640.     moveq    #0,d4
  641.  
  642.     move.w    #-48,d0
  643.     move.w    #-48,d1
  644.     move.w    #-16,d2
  645.  
  646. .loop:
  647.  
  648. .loop1:    add.w    #96/8,d0
  649.     move.w    d0,(a6)+
  650.     move.w    d1,(a6)+
  651.     move.w    d2,(a6)+
  652.     addq.w    #1,d4    
  653.     cmpi.w    #48,d0
  654.     blt.s    .loop1
  655.  
  656. .loop2:    sub.w    #48/8,d0
  657.     add.w    #96/8,d1
  658.     move.w    d0,(a6)+
  659.     move.w    d1,(a6)+
  660.     move.w    d2,(a6)+
  661.     addq.w    #1,d4    
  662.     cmpi.w    #0,d0
  663.     bgt.s    .loop2
  664.  
  665. .loop3:    sub.w    #48/8,d0
  666.     sub.w    #96/8,d1
  667.     move.w    d0,(a6)+
  668.     move.w    d1,(a6)+
  669.     move.w    d2,(a6)+
  670.     addq.w    #1,d4    
  671.     cmpi.w    #-48,d0
  672.     bgt.s    .loop3
  673.  
  674.     addi.w    #16,d2
  675.     cmpi.w    #16,d2
  676.     ble.s    .loop
  677.  
  678.     move.w    d4,(a0)
  679.     rts
  680.  
  681. * INPUT: d0.w: X rotation (a)
  682. *        d1.w: Y rotation (b)
  683. *        d2.w: Z rotation (c)
  684. *        a0: matrix table to output to
  685. GENERATE_MATRIX:
  686. * 1> rotate 3 axis.
  687.     Do_SinModulo    d0
  688.     Do_SinModulo    d1
  689.     Do_SinModulo    d2
  690.     movea.w    d0,a3
  691.     movea.w    d1,a4
  692.     movea.w    d2,a5
  693.     lea    sine_tbl,a2
  694.  
  695. * X := + x*cos(b)*cos(c)
  696. *      - y*cos(b)*sin(c)
  697. *      + z*sin(b)
  698.     Get_SinCos    a2,d1,d3,d4
  699.     Get_SinCos    a2,d2,d5,d6
  700.     muls.w    d4,d6                * / cos(b)*sin(c)
  701.     add.l    d6,d6                * |
  702.     swap    d6                * \
  703.     muls.w    d4,d5                * / -cos(b)*sin(c)
  704.     add.l    d5,d5                * |
  705.     swap    d5                * |
  706.     neg.w    d5                * \
  707.     move.w    d6,(a0)+
  708.     move.w    d5,(a0)+
  709.     move.w    d3,(a0)+
  710.     
  711. * Y := + x*(sin(a)*sin(b)*cos(c)+cos(a)*sin(c))
  712. *      + y*(cos(a)*cos(c)-sin(a)*sin(b)*sin(c))
  713. *      - z*sin(a)*cos(b)
  714.     Get_SinCos    a2,a3,d0,d1
  715.     Get_Sin        a2,a4,d2
  716.     Get_SinCos    a2,a5,d4,d5
  717.     muls.w    d0,d2
  718.     add.l    d2,d2
  719.     swap    d2
  720.     muls.w    d2,d5
  721.     add.l    d5,d5
  722.     swap    d5
  723.     muls.w    d1,d4
  724.     add.l    d4,d4
  725.     swap    d4
  726.     add.w    d4,d5
  727.     bvc.s    .skipyvd5
  728.     addq.w    #1,d5
  729.     neg.w    d5
  730. .skipyvd5:
  731.     move.w    d5,d3
  732.     ;Get_SinCos    a2,a3,d0,d1
  733.     Get_Sin        a2,a4,d2
  734.     Get_SinCos    a2,a5,d4,d5
  735.     muls.w    d1,d5
  736.     add.l    d5,d5
  737.     swap    d5
  738.     muls.w    d0,d2
  739.     add.l    d2,d2
  740.     swap    d2
  741.     muls.w    d2,d4
  742.     add.l    d4,d4
  743.     swap    d4
  744.     sub.w    d4,d5
  745.     bvc.s    .skipyv2d5
  746.     addq.w    #1,d5
  747.     neg.w    d5
  748. .skipyv2d5:
  749.     Get_Cos        a2,a4,d4
  750.     muls.w    d0,d4
  751.     add.l    d4,d4
  752.     swap    d4
  753.     neg.w    d4
  754.     move.w    d3,(a0)+
  755.     move.w    d5,(a0)+
  756.     move.w    d4,(a0)+
  757.  
  758. * Z := + x*(sin(a)*sin(c)-cos(a)*sin(b)*cos(c))
  759. *      + y*(cos(a)*sin(b)*sin(c)+sin(a)*cos(c))
  760. *      + z*cos(a)*cos(b)
  761.     Get_SinCos    a2,a3,d0,d1
  762.     Get_Sin        a2,a4,d2
  763.     Get_SinCos    a2,a5,d4,d5
  764.     muls.w    d0,d4
  765.     add.l    d4,d4
  766.     bvc.s    .skipzd4
  767.     subq.l    #1,d4
  768. .skipzd4:
  769.     swap    d4
  770.     muls.w    d1,d2
  771.     add.l    d2,d2
  772.     bvc.s    .skipzd2
  773.     subq.l    #1,d2
  774. .skipzd2:
  775.     swap    d2
  776.     muls.w    d2,d5
  777.     add.l    d5,d5
  778.     swap    d5
  779.     sub.w    d5,d4
  780.     bvc.s    .skipzvd4
  781.     addq.w    #1,d4
  782.     neg.w    d4
  783. .skipzvd4:
  784.     move.w    d4,d3
  785.     ;Get_SinCos    a2,a3,d0,d1
  786.     Get_Sin        a2,a4,d2
  787.     Get_SinCos    a2,a5,d4,d5
  788.     muls.w    d1,d2
  789.     add.l    d2,d2
  790.     bvc.s    .skipz2d2
  791.     subq.l    #1,d2
  792. .skipz2d2:
  793.     swap    d2
  794.     muls.w    d2,d4
  795.     add.l    d4,d4
  796.     swap    d4
  797.     muls.w    d0,d5
  798.     add.l    d5,d5
  799.     bvc.s    .skipzd5
  800.     subq.l    #1,d5
  801. .skipzd5:
  802.     swap    d5
  803.     add.w    d4,d5
  804.     bvc.s    .skipzvd5
  805.     addq.w    #1,d5
  806.     neg.w    d5
  807. .skipzvd5:
  808.     Get_Cos        a2,a4,d4
  809.     muls.w    d1,d4
  810.     add.l    d4,d4
  811.     bvc.s    .skipz2d4
  812.     subq.l    #1,d4
  813. .skipz2d4:
  814.     swap    d4
  815.     move.w    d3,(a0)+
  816.     move.w    d5,(a0)+
  817.     move.w    d4,(a0)+
  818.  
  819.     rts
  820.  
  821. * INPUT: d7.w: number of points
  822. *        a0: detination vertices
  823. *        a1: rotation matrix
  824. *        a2: vertices
  825. ROTATE_OBJECT:
  826.     move.w    d7,(a0)+
  827.     subq.w    #1,d7
  828.     bmi.s    .end
  829.  
  830. .vertexloop:
  831.     movem.w    (a2)+,d0-d2
  832.  
  833.     REPT    3
  834.     move.w    d0,d3
  835.     move.w    d1,d4
  836.     move.w    d2,d5
  837.     muls.w    (a1)+,d3
  838.     muls.w    (a1)+,d4
  839.     muls.w    (a1)+,d5
  840.     add.l    d3,d5
  841.     add.l    d4,d5
  842.     add.l    d5,d5
  843.     swap    d5
  844.     move.w    d5,(a0)+            * Store coordinate.
  845.     ENDR
  846.  
  847.     lea    -6*3(a1),a1
  848.     dbra    d7,.vertexloop
  849.  
  850. .end:    rts
  851.  
  852. ; Calculates fade-palette. Just fast enough, altho it can be optimised!
  853. CALC_FADEPAL:
  854.     movea.l    BlurZoom.baseAdr,a0
  855.     adda.l    #BlurZoom.fadepal_tbl,a0
  856.     clr.l    d7
  857.     move.w    #%1111100000000000,d3
  858.     move.w    #%0000011111000000,d4
  859.     move.w    #%0000000000011111,d5
  860.  
  861. .loop:    move.l    d7,d0
  862.     move.l    d7,d1
  863.     and.w    d3,d0
  864.     and.w    d4,d1
  865.     movea.l    d0,a1
  866.     movea.l    d1,a2
  867.     lsl.l    #8,d0
  868.     lsl.l    #8,d1
  869.     sub.l    a1,d0
  870.     sub.l    a2,d1
  871.     lsr.l    #8,d0
  872.     lsr.l    #8,d1
  873.     and.w    d3,d0
  874.     and.w    d4,d1
  875.     or.w    d1,d0
  876.     moveq    #32-1,d6
  877.  
  878. .blueloop:
  879.     move.l    d7,d2
  880.     and.w    d5,d2
  881.     movea.l    d2,a3
  882.     lsl.l    #8,d2
  883.     sub.l    a3,d2
  884.     lsr.l    #8,d2
  885.     and.w    d5,d2
  886.     or.w    d0,d2
  887.     move.w    d2,(a0)+
  888.     addq.w    #1,d7    
  889.  
  890.     dbf    d6,.blueloop
  891.  
  892.     tst.w    d7
  893.     bne.s    .loop
  894.     
  895.     rts
  896.  
  897. ; Calculates rotationwindow vectors: a, b-a, c-a.
  898. ; We do this the convenient way. If we realize that:
  899. ; b-a = 2(r.x,0)'=2*r.x[+cos(t),+sin(t)]=2[+xc,+xs]
  900. ; c-a = 2(0,r.y)'=2*r.y[-sin(t),+cos(t)]=2[-ys,+yc]
  901. ;       b-a  
  902. ;   a *----->* b
  903. ;     |
  904. ; c-a |  *--> (rx,0)' = r.x*[+cos(t),+sin(t)]
  905. ;     |  |
  906. ;     v  v
  907. ;   c *  (0,r.y)' = r.y*[-sin(t),+cos(t)]
  908. ;
  909. ; a.x = -cos(t)*r.x +sin(t)*r.y = -xc +ys
  910. ; a.y = -cos(t)*r.x -cos(t)*r.y = -xs -yc
  911. ;
  912. ; b.x = +xc +ys
  913. ; b.y = +xs -yc
  914. ;
  915. ; c.x = -xc -ys
  916. ; c.y = -xs +yc
  917. ;
  918. ; INPUT:
  919. ; d0.w = angle theta = t
  920. ; d1.w = scale [-32768,+32767] =^ [-2.0,+2.0]
  921. ; OUTPUT:
  922. ; d0.w = (b-a).x (8:8)
  923. ; d1.w = (b-a).y (8:8)
  924. ; d2.w = (c-a).x (8:8)
  925. ; d3.w = (c-a).y (8:8)
  926. ; d4.w = a.x (8:8)
  927. ; d5.w = a.y (8:8)
  928. XZoom.calcVectors:
  929.     Do_SinModulo    d0
  930.     Get_SinCos    sine_tbl,d0,d0,d3
  931. ; d0.w=sin(t), d3.w=cos(t)
  932.  
  933.     muls.w    d1,d0
  934.     muls.w    d1,d3
  935.     add.l    d0,d0
  936.     add.l    d3,d3
  937.     swap    d0
  938.     swap    d3
  939.     move.w    d0,d2
  940.     move.w    d3,d1
  941.     muls.w    #+XZoom.RX,d0
  942.     muls.w    #+XZoom.RX,d1
  943.     muls.w    #+XZoom.RY,d2
  944.     muls.w    #+XZoom.RY,d3
  945. ; d0.l=xs, d1.l=xc, d2.l=ys, d3.l=yc
  946.  
  947. ; We calculate a.
  948.     move.l    d1,d4
  949.     neg.l    d4
  950.     add.l    d2,d4
  951.     move.l    d0,d5
  952.     neg.l    d5
  953.     sub.l    d3,d5
  954.     asr.l    #6,d4
  955.     asr.l    #6,d5
  956.  
  957. ; We calculate b-a, c-a.
  958.     asr.l    #5,d0
  959.     asr.l    #5,d1
  960.     neg.l    d2
  961.     asr.l    #5,d2
  962.     asr.l    #5,d3
  963.     exg.l    d0,d1
  964.     rts
  965.  
  966. ; Rotoreaming sewer-screwing.
  967. ; INPUT:
  968. ; d0.l = h.x (8:8)
  969. ; d1.l = h.y (8:8)
  970. ; d2.l = v.x (8:8)
  971. ; d3.l = v.y (8:8)
  972. ; d4.w = x (8:8)
  973. ; d5.w = y (8:8)
  974. ; a0: offsettable
  975. XZoom.calcOffsets:
  976. ; We calculate stepvectors (slopes) from the window-vectors.
  977.     divs.w    #160,d0
  978.     divs.w    #160,d1
  979.     divs.w    #100,d2
  980.     divs.w    #100,d3
  981.     ext.l    d0
  982.     ext.l    d1
  983.     ext.l    d2
  984.     ext.l    d3
  985. ; d0.w = hx_step, d1.w = hy_step, d2.w = vx_step, d3.w = vy_step (8:8)
  986.  
  987. ; Arrange the upperleft vector coordinates for speed.
  988.     lsl.l    #8,d4
  989.     swap    d5
  990.     move.w    d4,d5
  991.     swap    d5
  992.     swap    d4
  993. ; d4.l = x..X, d5.l = x.Yy
  994.     move.l    d5,d7
  995.     clr.w    d6
  996.     move.b    d4,d6
  997. ; d6.b = X, d7.l = x.Yy
  998.  
  999. ; Arrange the vx_step, vy_step coordinates for speed.
  1000.     lsl.l    #8,d2
  1001.     swap    d3
  1002.     move.w    d2,d3
  1003.     swap    d3
  1004.     swap    d2
  1005.     move.b    d2,d5
  1006.     movea.l    d3,a3
  1007. ; d5.b = X, a3 = x.Yy
  1008.  
  1009. ; Arrange the hx_step, hy_step coordinates for speed.
  1010.     lsl.l    #8,d0
  1011.     swap    d1
  1012.     move.w    d0,d1
  1013.     swap    d1
  1014.     swap    d0
  1015.     move.b    d0,d2
  1016.     movea.l    d1,a4
  1017. ; d2.b = X, a4 = x.Yy
  1018.  
  1019.     move.l    d7,d0
  1020. ; d7.l = x.Yy
  1021.  
  1022.     clr.l    d4
  1023.     moveq    #100-1,d7
  1024.  
  1025.     move.w    monitormode,d0
  1026.     cmpi.w    #vga60,d0
  1027.     beq.s    Blurzoom.calc12Offsets
  1028.     cmpi.w    #vga100,d0
  1029.     beq.s    Blurzoom.calc11Offsets
  1030.     cmpi.w    #rgb50,d0
  1031.     beq.s    Blurzoom.calc11Offsets
  1032. ; Unknown monitormode..
  1033.     rts
  1034.  
  1035. Blurzoom.calc11Offsets:
  1036. .yloop:    swap    d7
  1037.     move.w    #160-1,d7
  1038.     move.l    d0,d1
  1039.     move.w    d6,d3
  1040.  
  1041. .xloop:    move.w    d1,d4
  1042.     lsr.w    #8,d4
  1043.     mulu.w    #160,d4
  1044.     add.w    d3,d4
  1045.     move.w    d4,(a0)+
  1046.     add.l    a4,d1
  1047.     addx.b    d2,d3
  1048.     dbf    d7,.xloop
  1049.  
  1050.     add.l    a3,d0                ; Yy:=Yy+Yy_vstep, x:=x+x_vstep
  1051.     addx.b    d5,d6                ; X:=X+X_vstep
  1052.     
  1053.     swap    d7
  1054.     dbf    d7,.yloop
  1055.     rts
  1056.  
  1057. Blurzoom.calc12Offsets:
  1058. .yloop:    swap    d7
  1059.     move.w    #160-1,d7
  1060.     move.l    d0,d1
  1061.     move.w    d6,d3
  1062.  
  1063. .xloop:    move.w    d1,d4
  1064.     lsr.w    #8,d4
  1065.     mulu.w    #160*2,d4
  1066.     add.w    d3,d4
  1067.     move.w    d4,(a0)+
  1068.     add.l    a4,d1
  1069.     addx.b    d2,d3
  1070.     dbf    d7,.xloop
  1071.  
  1072.     add.l    a3,d0                ; Yy:=Yy+Yy_vstep, x:=x+x_vstep
  1073.     addx.b    d5,d6                ; X:=X+X_vstep
  1074.     
  1075.     swap    d7
  1076.     dbf    d7,.yloop
  1077.     rts
  1078.  
  1079. * Perform a linear morph between 3d vertices.
  1080. * INPUT: d0.w: 0..32767 morph index
  1081. *        a0: destination vertices
  1082. *        a1: begin vertices
  1083. *        a2: end vertices
  1084. MORPH_3DPOINTS:
  1085.     move.w    #32767,d3
  1086.     sub.w    d0,d3
  1087.     addq    #2,a2
  1088.     move.w    (a1)+,d7
  1089.     move.w    d7,(a0)+
  1090.     subq.w    #1,d7
  1091.     bmi.s    .end
  1092.  
  1093. .loop:
  1094.     REPT    3
  1095.     move.w    (a1)+,d1
  1096.     move.w    (a2)+,d2
  1097.     muls.w    d3,d1
  1098.     muls.w    d0,d2
  1099.     add.l    d1,d2
  1100.     add.l    d2,d2
  1101.     swap    d2
  1102.     move.w    d2,(a0)+
  1103.     ENDR    
  1104.     dbra    d7,.loop
  1105.  
  1106. .end:    rts
  1107.  
  1108. * INPUT: a0: 3d object
  1109. SORT_OBJECT:
  1110.     move.w    (a0)+,d7            * d7.w: number of elements
  1111.     movea.l    a0,a6
  1112.     move.w    d7,d4
  1113.     subq.w    #1,d7
  1114.     ble.s    .endcombsort
  1115.     lsr.w    #1,d4                * d4.w: gapsize
  1116.     movea.w    #6,a5
  1117.     bra.s    .endcalcgap
  1118. .combsortloop:
  1119.     cmpi.w    #2,d4                * / If the gapsize
  1120.     bhi.s    .calcgap            * | is already 1 or
  1121.     moveq    #1,d4                * | 2 then always
  1122.     bra.s    .endcalcgap            * \ set it to 1.
  1123. .calcgap:
  1124.     mulu.w    #((1<<16)*10)/13,d4        * / Resize
  1125.     swap    d4                * \ the gap.
  1126. .endcalcgap:
  1127.     move.w    d7,d6
  1128.     sub.w    d4,d6
  1129.     move.w    d4,d0
  1130.     mulu.w    #6,d0
  1131.     lea    (a0,d0.l),a1
  1132.     moveq    #0,d5                * d5.w: number of swaps done in loop
  1133.  
  1134. .combsortinloop:
  1135.     move.w    4(a0),d0
  1136.     move.w    4(a1),d1
  1137.     cmp.w    d1,d0
  1138.     ble.s    .noswap
  1139.     move.l    (a0),d2
  1140.     move.l    (a1),(a0)+
  1141.     move.l    d2,(a1)+
  1142.     move.w    d0,(a1)+
  1143.     move.w    d1,(a0)+
  1144.     addq.w    #1,d5
  1145.     dbra    d6,.combsortinloop
  1146.     bra.s    .combsortloopend
  1147. .noswap:    
  1148.     adda.l    a5,a0
  1149.     adda.l    a5,a1
  1150.     dbra    d6,.combsortinloop
  1151. .combsortloopend:
  1152.     movea.l    a6,a0
  1153.     move.w    d5,d5
  1154.     bne.s    .combsortloop
  1155.     cmpi.w    #1,d4
  1156.     bne.s    .combsortloop
  1157. .endcombsort:
  1158.  
  1159. .rts:    rts
  1160.  
  1161. ; INPUT:
  1162. ; a0: dst screen
  1163. ; a1: src screen
  1164. ; a2: offsetmap
  1165. PLOT_ROTO_320100:
  1166.     move.w    #(160*100)/32-1,d7
  1167.  
  1168. .loop:    REPT    4
  1169.     movem.w    (a2)+,d0-d6/a3
  1170.     move.l    0(a1,d0.l*4),(a0)+
  1171.     move.l    0(a1,d1.l*4),(a0)+
  1172.     move.l    0(a1,d2.l*4),(a0)+
  1173.     move.l    0(a1,d3.l*4),(a0)+
  1174.     move.l    0(a1,d4.l*4),(a0)+
  1175.     move.l    0(a1,d5.l*4),(a0)+
  1176.     move.l    0(a1,d6.l*4),(a0)+
  1177.     move.l    0(a1,a3.l*4),(a0)+
  1178.     ENDR
  1179.     dbf    d7,.loop
  1180.     rts 
  1181.  
  1182. ; INPUT:
  1183. ; a0: dst screen
  1184. ; a1: src screen
  1185. ; a2: offsetmap
  1186. PLOT_ROTO_160100:
  1187.     move.w    #160*100/32-1,d7
  1188.  
  1189. .loop:    REPT    4
  1190.     movem.w    (a2)+,d0-d6/a3
  1191.     move.w    0(a1,d0.l*2),(a0)+
  1192.     move.w    0(a1,d1.l*2),(a0)+
  1193.     move.w    0(a1,d2.l*2),(a0)+
  1194.     move.w    0(a1,d3.l*2),(a0)+
  1195.     move.w    0(a1,d4.l*2),(a0)+
  1196.     move.w    0(a1,d5.l*2),(a0)+
  1197.     move.w    0(a1,d6.l*2),(a0)+
  1198.     move.w    0(a1,a3.l*2),(a0)+
  1199.     ENDR
  1200.     dbf    d7,.loop
  1201.     rts 
  1202.  
  1203. ; INPUT:
  1204. ; a0: dst screen
  1205. ; a1: src screen
  1206. ; a2: offsetmap
  1207. PLOT_ROTO_160200:
  1208.     moveq    #100-1,d7
  1209.     lea    160*2(a0),a4
  1210.  
  1211. .yloop:    swap    d7
  1212.     move.w    #160/8-1,d7
  1213.  
  1214. .xloop:    movem.w    (a2)+,d0-d6/a3
  1215.     move.w    0(a1,d0.l*2),(a0)+
  1216.     move.w    0(a1,d1.l*2),(a0)+
  1217.     move.w    0(a1,d2.l*2),(a0)+
  1218.     move.w    0(a1,d3.l*2),(a0)+
  1219.     move.w    0(a1,d4.l*2),(a0)+
  1220.     move.w    0(a1,d5.l*2),(a0)+
  1221.     move.w    0(a1,d6.l*2),(a0)+
  1222.     move.w    0(a1,a3.l*2),(a0)+
  1223.     move.w    0(a1,d0.l*2),(a4)+
  1224.     move.w    0(a1,d1.l*2),(a4)+
  1225.     move.w    0(a1,d2.l*2),(a4)+
  1226.     move.w    0(a1,d3.l*2),(a4)+
  1227.     move.w    0(a1,d4.l*2),(a4)+
  1228.     move.w    0(a1,d5.l*2),(a4)+
  1229.     move.w    0(a1,d6.l*2),(a4)+
  1230.     move.w    0(a1,a3.l*2),(a4)+
  1231.     dbf    d7,.xloop
  1232.  
  1233.     adda.w    #160*2,a0
  1234.     adda.w    #160*2,a4
  1235.     swap    d7
  1236.     dbf    d7,.yloop
  1237.     rts 
  1238.  
  1239. ; INPUT:
  1240. ; a0: dst screen
  1241. ; a1: src screen
  1242. ; a2: offsetmap
  1243. PLOT_ROTOF320100:
  1244.     move.l    BlurZoom.baseAdr,a3
  1245.     adda.l    #BlurZoom.fadepal_tbl,a3
  1246.     moveq    #0,d0
  1247.     move.w    #160*100/8-1,d7
  1248.  
  1249. .loop:    REPT    8
  1250.     move.w    (a2)+,d0
  1251.     move.w    (a1,d0.l*4),d0
  1252.     move.w    (a3,d0.l*2),d0
  1253.     move.w    d0,(a0)+
  1254.     move.w    d0,(a0)+
  1255.     ENDR
  1256.     dbra    d7,.loop
  1257.     rts 
  1258.  
  1259. ; INPUT:
  1260. ; a0: dst screen
  1261. ; a1: src screen
  1262. ; a2: offsetmap
  1263. PLOT_ROTOF160100:
  1264.     movea.l    BlurZoom.baseAdr,a3
  1265.     adda.l    #BlurZoom.fadepal_tbl,a3
  1266.     moveq    #0,d0
  1267.     move.w    #160*100/8-1,d7
  1268.  
  1269. .loop:    REPT    8
  1270.     move.w    (a2)+,d0
  1271.     move.w    (a1,d0.l*2),d0
  1272.     move.w    (a3,d0.l*2),d0
  1273.     move.w    d0,(a0)+
  1274.     ENDR
  1275.     dbra    d7,.loop
  1276.     rts 
  1277.  
  1278. ; INPUT:
  1279. ; a0: dst screen
  1280. ; a1: src screen
  1281. ; a2: offsetmap
  1282. PLOT_ROTOF160200:
  1283.     movea.l    BlurZoom.baseAdr,a3
  1284.     adda.l    #BlurZoom.fadepal_tbl,a3
  1285.     moveq    #0,d0
  1286.     moveq    #100-1,d7
  1287.  
  1288. .yloop:    moveq    #160/8-1,d6
  1289.     lea    160*2(a0),a4
  1290.  
  1291. .xloop:    REPT    8
  1292.     move.w    (a2)+,d0
  1293.     move.w    (a1,d0.l*2),d0
  1294.     move.w    (a3,d0.l*2),d0
  1295.     move.w    d0,(a0)+
  1296.     move.w    d0,(a4)+
  1297.     ENDR
  1298.     dbf    d6,.xloop
  1299.  
  1300.     adda.w    #160*2,a0
  1301.     dbf    d7,.yloop
  1302.     rts 
  1303.  
  1304. ; INPUT:
  1305. ; a0: dst screen
  1306. ; a1: src screen
  1307. BLUR_320100:
  1308.     move.w    #%0111101111101111,d1
  1309.     move.w    #160*100-1,d7
  1310. .loop:    move.w    (a1),d0
  1311.     addq    #4,a1
  1312.     lsr.w    #1,d0
  1313.     and.w    d1,d0
  1314.     move.w    d0,(a0)+
  1315.     move.w    d0,(a0)+
  1316.     dbra    d7,.loop
  1317.     rts
  1318.  
  1319. ; INPUT:
  1320. ; a0: dst screen
  1321. ; a1: src screen
  1322. BLUR_160100:
  1323.     move.w    #%0111101111101111,d1
  1324.     move.w    #160*100-1,d7
  1325. .loop:    move.w    (a1)+,d0
  1326.     lsr.w    #1,d0
  1327.     and.w    d1,d0
  1328.     move.w    d0,(a0)+
  1329.     dbra    d7,.loop
  1330.     rts
  1331.  
  1332. ; INPUT:
  1333. ; a0: dst screen
  1334. ; a1: src screen
  1335. BLUR_160200:
  1336.     move.w    #%0111101111101111,d1
  1337.     moveq    #100-1,d7
  1338.     lea    160*2(a0),a2
  1339.  
  1340. .yloop:    moveq    #160/8-1,d6
  1341.  
  1342. .xloop:    REPT    8
  1343.     move.w    (a1)+,d0
  1344.     lsr.w    #1,d0
  1345.     and.w    d1,d0
  1346.     move.w    d0,(a0)+
  1347.     move.w    d0,(a2)+
  1348.     ENDR
  1349.     dbf    d6,.xloop
  1350.  
  1351.     adda.w    #160*2,a0
  1352.     adda.w    #160*2,a1
  1353.     adda.w    #160*2,a2
  1354.     dbf    d7,.yloop
  1355.     rts
  1356.  
  1357. * INPUT: d0.w: topleft x
  1358. *        d1.w: topleft y
  1359. *        d2.w: topright dx
  1360. *        d3.w: topright dy
  1361. *        d4.w: bottomleft dx
  1362. *        d5.w: bottomleft dy
  1363. *        a0: screen
  1364. *        a1: texture
  1365. PLOT_ROTOLAYER:
  1366.  
  1367. .xloop:    move.w    d0,d4
  1368.     move.b    d1,d4
  1369.     move.w    (a1,d4.l*2),(a0)+
  1370.     add.l    d2,d0
  1371.     addx.b    d3,d1
  1372.     dbra    d6,.xloop
  1373.  
  1374.     rts
  1375.  
  1376. * B-ware! No clipping!
  1377. * INPUT: d0.w: topleft x
  1378. *        d1.w: topleft y
  1379. *        a0: screen
  1380. *        a1: sprite
  1381. PLOT_8BY8SPRITE320100:
  1382.     lea    (a0,d0.w*4),a0
  1383.     move.w    #160*4,d5
  1384.     mulu.w    d5,d1
  1385.     adda.l    d1,a0
  1386.     movea.l    a0,a6
  1387.     movea.w    d5,a5
  1388.     moveq    #8-1,d7
  1389.     move.w    #%0111101111101111,d2
  1390.  
  1391. .yloop:    move.w    (a1)+,d6
  1392.     bmi.s    .end_xloop
  1393.     move.w    (a1)+,d0
  1394.     lea    (a0,d0.w*4),a0
  1395.  
  1396. .xloop:
  1397.     IFNE    1
  1398.     move.w    (a1)+,d0
  1399.     lsr.w    #1,d0
  1400.     and.w    d2,d0
  1401.     move.w    (a0),d1
  1402.     lsr.w    #1,d1
  1403.     and.w    d2,d1
  1404.     add.w    d0,d1
  1405.     move.w    d1,(a0)+
  1406.     move.w    d1,(a0)+
  1407.     ELSE
  1408.     move.w    (a1),(a0)+
  1409.     move.w    (a1)+,(a0)+
  1410.     ENDC
  1411. .skip_pixel:
  1412.     dbra    d6,.xloop
  1413. .end_xloop:
  1414.  
  1415.     adda.l    a5,a6
  1416.     movea.l    a6,a0
  1417.     dbra    d7,.yloop
  1418.     rts
  1419.  
  1420. * B-ware! No clipping!
  1421. * INPUT: d0.w: topleft x
  1422. *        d1.w: topleft y
  1423. *        a0: screen
  1424. *        a1: sprite
  1425. PLOT_8BY8SPRITE160100:
  1426.     lea    (a0,d0.w*2),a0
  1427.     move.w    #160*2,d5
  1428.     mulu.w    d5,d1
  1429.     adda.l    d1,a0
  1430.     movea.l    a0,a6
  1431.     movea.w    d5,a5
  1432.     moveq    #8-1,d7
  1433.     move.w    #%0111101111101111,d2
  1434.  
  1435. .yloop:    move.w    (a1)+,d6
  1436.     bmi.s    .end_xloop
  1437.     move.w    (a1)+,d0
  1438.     lea    (a0,d0.w*2),a0
  1439.  
  1440. .xloop:
  1441.     IFNE    1
  1442.     move.w    (a1)+,d0
  1443.     lsr.w    #1,d0
  1444.     and.w    d2,d0
  1445.     move.w    (a0),d1
  1446.     lsr.w    #1,d1
  1447.     and.w    d2,d1
  1448.     add.w    d0,d1
  1449.     move.w    d1,(a0)+
  1450.     ELSE
  1451.     move.w    (a1)+,(a0)+
  1452.     ENDC
  1453. .skip_pixel:
  1454.     dbra    d6,.xloop
  1455. .end_xloop:
  1456.  
  1457.     adda.l    a5,a6
  1458.     movea.l    a6,a0
  1459.     dbra    d7,.yloop
  1460.     rts
  1461.  
  1462. * B-ware! No clipping!
  1463. * INPUT: d0.w: topleft x
  1464. *        d1.w: topleft y
  1465. *        a0: screen
  1466. *        a1: sprite
  1467. PLOT_8BY8SPRITE160200:
  1468.     lea    (a0,d0.w*2),a0
  1469.     move.w    #160*2*2,d5
  1470.     mulu.w    d5,d1
  1471.     adda.l    d1,a0
  1472.     movea.l    a0,a6
  1473.     movea.w    d5,a5
  1474.     moveq    #8-1,d7
  1475.     move.w    #%0111101111101111,d2
  1476.  
  1477. .yloop:    move.w    (a1)+,d6
  1478.     bmi.s    .end_xloop
  1479.     move.w    (a1)+,d0
  1480.     lea    (a0,d0.w*2),a0            ; even line
  1481.     lea    160*2(a0),a2            ; odd line
  1482.  
  1483. .xloop:
  1484.     IFNE    1
  1485.     move.w    (a1)+,d0
  1486.     lsr.w    #1,d0
  1487.     and.w    d2,d0
  1488.     move.w    (a0),d1
  1489.     lsr.w    #1,d1
  1490.     and.w    d2,d1
  1491.     add.w    d0,d1
  1492.     move.w    d1,(a0)+
  1493.     move.w    d1,(a2)+
  1494.     ELSE
  1495.     move.w    (a1),(a0)+
  1496.     move.w    (a1)+,(a2)+
  1497.     ENDC
  1498. .skip_pixel:
  1499.     dbf    d6,.xloop
  1500. .end_xloop:
  1501.  
  1502.     adda.l    a5,a6
  1503.     movea.l    a6,a0
  1504.     dbf    d7,.yloop
  1505.     rts
  1506.  
  1507. ;======= OBJECT DATA ========
  1508.  
  1509.     DATA
  1510.  
  1511. enablebobs:
  1512.     DC.W    0
  1513.  
  1514. backgroundadr:
  1515.     DC.L    PLOT_ROTO_160100
  1516.  
  1517. presprite_dat
  1518.     DC.W    2-1,3,$20,$20
  1519.     DC.W    4-1,2,$20,$40,$40,$20
  1520.     DC.W    6-1,1,$20,$40,$80,$80,$20,$20
  1521.     DC.W    8-1,0,$20,$40,$80,$ff,$ff,$80,$40,$20
  1522.     DC.W    8-1,0,$20,$40,$80,$ff,$ff,$80,$40,$20
  1523.     DC.W    6-1,1,$20,$40,$80,$80,$40,$20
  1524.     DC.W    4-1,2,$20,$40,$40,$20
  1525.     DC.W    2-1,3,$20,$20
  1526.  
  1527. sprite_dat:
  1528.     DC.W    2-1,3,$18e3,$18e3
  1529.     DC.W    4-1,2,$18e3,$39e7,$39e7,$18e3
  1530.     DC.W    6-1,1,$18e3,$39e7,$7bef,$7bef,$39e7,$18e3
  1531.     DC.W    8-1,0,$18e3,$39e7,$7bef,$ffff,$ffff,$7bef,$39e7,$18e3
  1532.     DC.W    8-1,0,$18e3,$39e7,$7bef,$ffff,$ffff,$7bef,$39e7,$18e3
  1533.     DC.W    6-1,1,$18e3,$39e7,$7bef,$7bef,$39e7,$18e3
  1534.     DC.W    4-1,2,$18e3,$39e7,$39e7,$18e3
  1535.     DC.W    2-1,3,$18e3,$18e3
  1536.  
  1537. flow_tbl:
  1538.     DC.W    32    (.end-.start)/4
  1539.     DC.W    4
  1540. .start:    DC.L    $ff000000    ;DC.L    $00000000
  1541.     DC.L    $ff00001f    ;DC.L    $003f0000
  1542.     DC.L    $ff00003f    ;DC.L    $007f0000
  1543.     DC.L    $ff00005f    ;DC.L    $3fdf0000
  1544.     DC.L    $ff00007f    ;DC.L    $7fff0000
  1545.     DC.L    $ff00009f    ;DC.L    $dfff0000
  1546.     DC.L    $ff0000bf    ;DC.L    $ffff0000
  1547.     DC.L    $ff0000df    ;DC.L    $ffff003f
  1548.     DC.L    $ff0000ff    ;DC.L    $ffff007f
  1549.     DC.L    $df1f00ff    ;DC.L    $ffff00bf
  1550.     DC.L    $bf3f00ff    ;DC.L    $ffff00ff
  1551.     DC.L    $9f5f00ff    ;DC.L    $ffff00ff
  1552.     DC.L    $7f7f00ff    ;DC.L    $ffff00ff
  1553.     DC.L    $5f9f00ff    ;DC.L    $ffff00ff
  1554.     DC.L    $3fbf00ff    ;DC.L    $ffff00ff
  1555.     DC.L    $1fdf00ff    ;DC.L    $ffff00ff
  1556.     DC.L    $00ff00ff    ;DC.L    $ffff00ff
  1557.     DC.L    $1fff00ff
  1558.     DC.L    $3fff00ff
  1559.     DC.L    $5fff00ff
  1560.     DC.L    $7fff00ff
  1561.     DC.L    $9fff00ff
  1562.     DC.L    $bfff00ff
  1563.     DC.L    $dfff00ff
  1564.     DC.L    $ffff00ff
  1565.     DC.L    $ffdf00df
  1566.     DC.L    $ffbf00bf
  1567.     DC.L    $ff9f009f
  1568.     DC.L    $ff7f007f
  1569.     DC.L    $ff5f005f
  1570.     DC.L    $ff3f003f
  1571.     DC.L    $ff1f001f
  1572.     DC.L    $ff000000
  1573. .end:
  1574.  
  1575. spriteRout:
  1576.     DC.L    PLOT_8BY8SPRITE160100
  1577.  
  1578. ;======= OBJECT RESERVES ========
  1579.  
  1580.     BSS
  1581.  
  1582. colorpos:
  1583.     DS.W    1
  1584. morphstarttime:
  1585.     DS.L    1
  1586. morphstep:
  1587.     DS.W    1
  1588. BlurZoom.baseAdr:
  1589.     DS.L    1
  1590.  
  1591. ;======= END OF DEMO-EFFECT OBJECT ========