home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / VLM.ZIP / GEISSVIR.S < prev    next >
Text File  |  2004-12-04  |  24KB  |  1,312 lines

  1. ;===========================================================================
  2. ; Atari Coldfire Project - Virtual Light Machine : Plugin
  3. ;===========================================================================
  4.  
  5. ;---------------------------------------------------------------------------
  6. ; 'Geiss'-esque effect as dizzy vlm: virtual 8bpp version.
  7. ;
  8. ; 320x200 feedback blur effect, based on windows 'geiss' dll.
  9. ; meant for accelerated falcons.
  10. ;---------------------------------------------------------------------------
  11.  
  12. ;---------------------------------------------------------------------------
  13. ; plugin assembly options
  14. ;---------------------------------------------------------------------------
  15.  
  16.     comment    HEAD=%111
  17.  
  18.  
  19. STANDALONE:=    1                ; 1: run stand-alone, 0: run as plugin
  20.  
  21.     ifne    STANDALONE
  22.  
  23.     ifne    1
  24.     incbin    test.bin
  25.     include    plugineq.s
  26.     else
  27. TEST_MODE:=    1
  28.     include    test.s
  29.     endc
  30.  
  31.     else
  32.  
  33.     opt    d-
  34.     output    .vlm
  35.     include    plugineq.s
  36.  
  37.     endc
  38.  
  39. ;---------------------------------------------------------------------------
  40. ; plugin table
  41. ;---------------------------------------------------------------------------
  42.  
  43. ; must be first in object!
  44. table:    dc.l    "DZY1"                ; header
  45.     dc.l    info                ; info text, parameters
  46.     dc.l    Display.TRIPLE_BUFFER        ; type of buffering
  47.     dc.l    Res.320X240_8BPP        ; resolution
  48.     dc.l    0                ; layering support
  49.     dc.l    main_loop            ; main loop subroutine
  50.     dc.l    init                ; initialisation subroutine
  51.     dc.l    deinit                ; de-initialisation subroutine
  52.     dc.l    0
  53.  
  54.     include    math.i
  55.     text
  56.  
  57. info:    dc.l    "exam","ple ","modu","le  ",0
  58.     dc.l    0
  59.  
  60. ;---------------------------------------------------------------------------
  61. ; plugin initialisation subroutine
  62. ;---------------------------------------------------------------------------
  63.  
  64. ; input:
  65. ; a0: vlm system routine table
  66. ; output:
  67. ; d0.l= (0: success, -1: error)
  68. init:    move.l    a0,service_adr
  69.  
  70.     lea    flow_table_green,a1
  71.     lea    green_pal,a0
  72.     bsr    Pal.makeGradientTc
  73.     lea    flow_table_orange,a1
  74.     lea    orange_pal,a0
  75.     bsr    Pal.makeGradientTc
  76.     lea    flow_table_purple,a1
  77.     lea    purple_pal,a0
  78.     bsr    Pal.makeGradientTc
  79.     lea    flow_table_blue,a1
  80.     lea    blue_pal,a0
  81.     bsr    Pal.makeGradientTc
  82.     lea    flow_table_bluegrey,a1
  83.     lea    bluegrey_pal,a0
  84.     bsr    Pal.makeGradientTc
  85.  
  86.     bsr    init_8bpp
  87.  
  88.     bsr    precalc_twirl_in_map
  89.  
  90.     lea    muls_table,a0
  91.     clr.w    d7
  92.  
  93. .scalarloop:
  94.     clr.b    d6
  95.  
  96. .numloop:
  97.     move.b    d6,d0
  98.     ext.w    d0
  99.     muls.w    d7,d0
  100.     lsr.w    #8,d0
  101.     move.b    d0,(a0)+
  102.     addq.b    #1,d6
  103.     bne.s    .numloop
  104.  
  105.     addq.b    #1,d7
  106.     bne.s    .scalarloop
  107.  
  108.     movea.l    service_adr,a0
  109.     move.l    #200,d0
  110.     jsr    ServiceTable.SET_BORDERS(a0)
  111.  
  112.     moveq    #0,d0
  113.     rts
  114. .error:    moveq    #-1,d0
  115.     rts
  116.  
  117. ;---------------------------------------------------------------------------
  118. ; plugin de-initialisation subroutine
  119. ;---------------------------------------------------------------------------
  120.  
  121. ; output:
  122. ; d0.l= (0: success, -1: error)
  123. deinit:
  124. ; ...
  125.     moveq    #0,d0
  126.     rts
  127. .error:    moveq    #-1,d0
  128.     rts
  129.  
  130. init_screen:
  131.     bsr    init_screen_8bpp
  132.  
  133.     movea.l    screen,a0
  134.     move.w    #(320*20)/16-1,d7
  135.     clr.l    d0
  136. .tloop:    move.l    d0,(a0)+
  137.     move.l    d0,(a0)+
  138.     move.l    d0,(a0)+
  139.     move.l    d0,(a0)+
  140.     dbf    d7,.tloop
  141.     adda.l    #320*200,a0
  142.     move.w    #(320*20)/16-1,d7
  143.     clr.l    d0
  144. .bloop:    move.l    d0,(a0)+
  145.     move.l    d0,(a0)+
  146.     move.l    d0,(a0)+
  147.     move.l    d0,(a0)+
  148.     dbf    d7,.bloop
  149.     rts
  150.  
  151. ;---------------------------------------------------------------------------
  152. ; plugin main loop subroutine
  153. ;---------------------------------------------------------------------------
  154.  
  155. ; input:
  156. ; a0: screen
  157. main_loop:
  158.     move.l    a0,screen
  159.  
  160.     tst.l    frame_count
  161.     bne.s    .end_screeninit
  162.     bsr    init_screen
  163. .end_screeninit:
  164.  
  165.     add.l    #320*20,screen
  166.  
  167. ;- controls ----------------------------------------------------------------
  168.  
  169.     movea.l    service_adr,a0
  170.     jsr    ServiceTable.GET_HOLD(a0)
  171.     bne    .no_change
  172.  
  173.     move.l    time,old_time
  174.  
  175.     movea.l    service_adr,a0
  176.     jsr    ServiceTable.GET_TIME_RUNNING(a0)
  177.     move.l    d0,time
  178.  
  179.     moveq    #11,d2
  180.     move.l    time,d0
  181.     lsr.l    d2,d0
  182.     move.l    old_time,d1
  183.     lsr.l    d2,d1
  184.     cmp.l    d1,d0
  185.     beq.s    .no_change
  186.  
  187.     Calc_NextRandom
  188.     move.l    d0,d2
  189.     clr.l    d1
  190.     move.w    d0,d1
  191.     divu.w    num_pals,d1                ; random() mod NUM_PALS
  192.     swap    d1
  193.     move.l    (pal_table,d1.w*4),pal_adr
  194.  
  195.     clr.l    d1
  196.     swap    d2
  197.     move.w    d2,d1
  198.     divu.w    num_combis,d1                ; random() mod NUM_COMBIS
  199.     swap    d1
  200.     mulu.w    #3*4,d1
  201.     lea    (combi_table,d1.l),a1
  202.     move.l    (a1)+,plot_rout_adr
  203.     move.l    (a1)+,zoom_rout_adr
  204.     move.l    (a1)+,blur_rout_adr
  205. .no_change:
  206.  
  207. ;    lea    combi_table_end-12,a1
  208. ;    move.l    (a1)+,plot_rout_adr
  209. ;    move.l    (a1)+,zoom_rout_adr
  210. ;    move.l    (a1)+,blur_rout_adr
  211.  
  212. ;- zooming -----------------------------------------------------------------
  213.  
  214.     movea.l    screen,a1
  215.     movea.l    scr_adr,a0
  216.     movea.l    zoom_rout_adr,a2
  217.     jsr    (a2)
  218.  
  219. ;- blurring ----------------------------------------------------------------
  220.  
  221.     movea.l    scr_adr,a1
  222.     movea.l    screen,a0
  223.     movea.l    blur_rout_adr,a2
  224.     jsr    (a2)
  225.  
  226. ;- plots -------------------------------------------------------------------
  227.  
  228.     movea.l    plot_rout_adr,a2
  229.     jsr    (a2)
  230.  
  231. ;- display stuff -----------------------------------------------------------
  232.  
  233.     movea.l    pal_adr,a0
  234.     move.l    service_adr,a1
  235.     jsr    ServiceTable.SET_PAL(a1)
  236.  
  237.     addq.l    #1,frame_count
  238.     rts
  239.  
  240. ;---------------------------------------------------------------------------
  241. ; plugin subroutines
  242. ;---------------------------------------------------------------------------
  243.  
  244. ; INPUT:
  245. ; a0: dst truecolor palette (24b)
  246. ; a1: colorflow instruction table 
  247. Pal.makeGradientTc:
  248.     move.w    (a1)+,d7
  249.     moveq    #0,d0
  250.     move.w    (a1)+,d0
  251.     moveq    #1,d6
  252.     lsl.w    d0,d6
  253.     move.w    d7,d5
  254.     mulu.w    d6,d5
  255.     subq.w    #1,d6
  256.     move.w    d6,d5
  257.     subq.w    #1,d7
  258.  
  259. .biglop    move.l    (a1)+,d1
  260.     move.l    (a1),d2
  261.     moveq.l    #0,d3
  262.     move.l    d3,d4
  263.     move.b    d1,d3
  264.     move.b    d2,d4
  265.     swap    d3
  266.     swap    d4
  267.     sub.l    d3,d4
  268.     asr.l    d0,d4
  269.     move.l    a0,a6
  270. .lop1    swap    d3
  271.     move.w    d3,2(a0)
  272.     addq.l    #4,a0
  273.     swap    d3
  274.     add.l    d4,d3
  275.     dbra    d6,.lop1
  276.     move.w    d5,d6
  277.     move.l    a6,a0
  278.     moveq    #0,d3
  279.     move.l    d3,d4
  280.     swap    d1
  281.     swap    d2
  282.     move.b    d1,d3
  283.     move.b    d2,d4
  284.     swap    d3
  285.     swap    d4
  286.     sub.l    d3,d4
  287.     asr.l    d0,d4
  288. .lop2    swap    d3
  289.     move.b    d3,1(a0)
  290.     addq.l    #4,a0
  291.     swap    d3
  292.     add.l    d4,d3
  293.     dbra    d6,.lop2
  294.     move.l    a6,a0
  295.     move.w    d5,d6
  296.     moveq.l    #0,d3
  297.     move.l    d3,d4
  298.     swap    d1
  299.     swap    d2
  300.     rol.l    #8,d1
  301.     rol.l    #8,d2
  302.     move.b    d1,d3
  303.     move.b    d2,d4
  304.     swap    d3
  305.     swap    d4
  306.     sub.l    d3,d4
  307.     asr.l    d0,d4
  308. .lop3    swap    d3
  309.     move.b    d3,(a0)
  310.     addq.l    #4,a0
  311.     swap    d3
  312.     add.l    d4,d3
  313.     dbra    d6,.lop3
  314.     move.w    d5,d6
  315.     dbra    d7,.biglop
  316.     rts
  317.  
  318. init_screen_8bpp:
  319. ;    movea.l    screen,a0
  320. ;    bsr    clear_screen
  321.     rts
  322.  
  323. init_8bpp:
  324.     andi.l    #$FFFFFFFC,buf_adr
  325.     andi.l    #$FFFFFFFC,scr_adr
  326.  
  327.     lea    sine_tbl,a0
  328.     bsr    calc_sin_table
  329.     clr.l    frame_count
  330.     rts
  331.  
  332. plot_polar_scope_l:
  333. ; polar scope
  334.     movea.l    service_adr,a0
  335.     jsr    ServiceTable.GET_LEFT_OSC(a0)
  336.     movea.l    a0,a1
  337.     movea.l    screen,a0
  338.     moveq    #$7F,d5
  339.     bsr    plot_polar_scope
  340.     rts
  341.  
  342. plot_circle_scope_l:
  343. ; polar scope
  344.     movea.l    service_adr,a0
  345.     jsr    ServiceTable.GET_LEFT_OSC(a0)
  346.     movea.l    a0,a1
  347.     movea.l    screen,a0
  348.     moveq    #$7F,d5
  349.     moveq    #20,d3
  350.     move.w    #$0600,d4                ; d4.w=radius
  351.     bsr    plot_circle_scope
  352.     rts
  353.  
  354. plot_circle_scope_big:
  355. ; polar scope
  356.     movea.l    service_adr,a0
  357.     jsr    ServiceTable.GET_LEFT_OSC(a0)
  358.     movea.l    a0,a1
  359.     movea.l    screen,a0
  360.     moveq    #$7F,d5
  361.     moveq    #19,d3
  362.     move.w    #$0400,d4                ; d4.w=radius
  363.     bsr    plot_circle_scope
  364.     rts
  365.  
  366. plot_hor_scopes:
  367. ; horizontal scope..
  368.     movea.l    service_adr,a0
  369.     jsr    ServiceTable.GET_LEFT_OSC(a0)
  370.     movea.l    a0,a1
  371.     movea.l    screen,a0
  372.     moveq    #68,d0
  373.     moveq    #$7F,d5
  374.     bsr    plot_scope_h_l
  375.  
  376.     movea.l    service_adr,a0
  377.     jsr    ServiceTable.GET_RIGHT_OSC(a0)
  378.     movea.l    a0,a1
  379.     movea.l    screen,a0
  380.     move.w    #132,d0
  381.     moveq    #$7F,d5
  382.     bsr    plot_scope_h_l
  383.     rts
  384.  
  385. plot_hor_scope:
  386. ; horizontal scope..
  387.     movea.l    service_adr,a0
  388.     jsr    ServiceTable.GET_LEFT_OSC(a0)
  389.     movea.l    a0,a1
  390.     movea.l    screen,a0
  391.     moveq    #100,d0
  392.     moveq    #$7F,d5
  393.     bsr    plot_scope_h_5
  394.     rts
  395.  
  396. calc_sin_table:
  397.     Init_SineTable
  398.     rts
  399.  
  400. ; input:
  401. ; a0: screen
  402. clear_screen:
  403.     moveq    #0,d0
  404.     move.l    d0,d1
  405.     move.l    d0,d2
  406.     move.l    d1,d3
  407.     move.l    d2,d4
  408.     move.l    d3,d5
  409.     move.l    d4,d6
  410.     moveq    #100-1,d7
  411.     move.l    d0,a1
  412.     move.l    d1,a2
  413.     move.l    d2,a3
  414.     move.l    d3,a4
  415.     move.l    d4,a5
  416.     move.l    d5,a6
  417.     adda.l    #320*200,a0
  418. .loop:
  419.     REPT    12
  420.     movem.l    d0-d6/a1-a6,-(a0)
  421.     ENDR
  422.     movem.l    d0-d3,-(a0)
  423.     dbra    d7,.loop
  424.     rts
  425.  
  426. ;- scope plotters ----------------------------------------------------------
  427.  
  428. ; input:
  429. ; d0.w=y offset
  430. ; d5.b=color
  431. ; a0: screen
  432. ; a1: scope (256 words)
  433. plot_scope_h:
  434.     mulu.w    #320,d0
  435.     adda.l    d0,a0
  436.     adda.w    #(320-256)/2,a0
  437.     move.w    #256-1,d7
  438.     move.w    (a1),d0
  439.  
  440.     asr.w    #6,d0
  441.  
  442. .yloop:    move.w    d0,d4
  443.     move.w    (a1)+,d0
  444.     asr.w    #6,d0
  445.     move.w    d0,d1
  446.     cmp.w    d1,d4
  447.     bge.s    .oki
  448.     exg    d1,d4
  449. .oki:    sub.w    d1,d4
  450.     muls.w    #320,d1
  451.     lea    (a0,d1.l),a2
  452. .loop:    move.b    d5,(a2)
  453.     adda.w    #320,a2
  454.     dbf    d4,.loop
  455.  
  456.     addq    #1,a0
  457.     dbf    d7,.yloop
  458.  
  459.     rts
  460.  
  461. ; input:
  462. ; d0.w=y offset
  463. ; d5.b=color
  464. ; a0: screen
  465. ; a1: scope (256 words)
  466. plot_scope_h_l:
  467.     mulu.w    #320,d0
  468.     adda.l    d0,a0
  469.     adda.w    #(320-256)/2,a0
  470.     move.w    #256-1,d7
  471.  
  472. .yloop:    move.w    (a1)+,d0
  473.     asr.w    #5,d0
  474.     muls.w    #320,d0
  475.     move.b    d5,(a0,d0.l)
  476.  
  477.     addq    #1,a0
  478.     dbf    d7,.yloop
  479.     rts
  480.  
  481. ; input:
  482. ; d0.w=y offset
  483. ; d5.b=color
  484. ; a0: screen
  485. ; a1: scope (256 words)
  486. plot_scope_h_5:
  487.     mulu.w    #320,d0
  488.     adda.l    d0,a0
  489.     adda.w    #(320-256)/2,a0
  490.     move.w    #256-1,d7
  491.  
  492. .yloop:    move.w    (a1)+,d0
  493.     asr.w    #5,d0
  494.     muls.w    #320,d0
  495.     move.b    d5,(a0,d0.l)
  496.  
  497.     addq    #1,a0
  498.     dbf    d7,.yloop
  499.     rts
  500.  
  501. ; input:
  502. ; d5.b=color
  503. ; a0: screen
  504. ; a1: scope (256 words)
  505. plot_polar_scope:
  506.     adda.l    #320*100+160,a0
  507.     lea    sine_tbl,a2
  508.     moveq    #19,d3
  509.     clr.l    d7
  510.  
  511. .loop:    move.l    d7,d0
  512.     lsl.l    #3,d0
  513.     Get_SinCos    a2,d0,d0,d1
  514.     move.w    (a1)+,d2
  515.  
  516.     bpl.s    .abs
  517.     neg.w    d2
  518. .abs:
  519.  
  520.     muls.w    d2,d0
  521.     muls.w    d2,d1
  522.     asr.l    d3,d0
  523.     asr.l    d3,d1
  524.     muls.w    #320,d1
  525.     ext.l    d0
  526.     add.l    d0,d1
  527.     move.b    d5,(a0,d1.l)
  528.     addq.b    #1,d7
  529.     bne.s    .loop
  530.     rts
  531.  
  532. ; input:
  533. ; d5.b=color
  534. ; a0: screen
  535. ; a1: scope (256 words)
  536. plot_circle_scope:
  537.     adda.l    #320*100+160,a0
  538.     lea    sine_tbl,a2
  539.     clr.l    d7
  540.  
  541. .loop:    move.l    d7,d0
  542.     lsl.l    #3,d0
  543.     addq.w    #4,d0
  544.     Do_SinModulo    d0
  545.     Get_SinCos    a2,d0,d0,d1
  546.     move.w    (a1)+,d2
  547.     add.w    d4,d2
  548.     muls.w    d2,d0
  549.     muls.w    d2,d1
  550.     asr.l    d3,d0
  551.     asr.l    d3,d1
  552.     cmpi.w    #-100,d1
  553.     ble.s    .next
  554.     cmpi.w    #+100,d1
  555.     bge.s    .next
  556.  
  557.     muls.w    #320,d1
  558.     ext.l    d0
  559.     add.l    d0,d1
  560.     move.b    d5,(a0,d1.l)
  561.  
  562. .next:    addq.b    #1,d7
  563.     bne.s    .loop
  564.     rts
  565.  
  566. ;- blurrers ----------------------------------------------------------------
  567.  
  568. ; dst and scr must not be the same!
  569. ; input:
  570. ; a0: dst screen
  571. ; a1: src screen
  572. blur_acc:
  573. ; clear top scan line.
  574.     clr.l    d0
  575.     moveq    #320/4-1,d7
  576. .tloop:    move.l    d0,(a0)+
  577.     dbf    d7,.tloop
  578.  
  579.     adda.w    #320,a1
  580.     move.l    #$FF7F7F7F,d1
  581.     move.l    #$FF3F3F3F,d3
  582.     move.w    #200-2-1,d7
  583.     lea    -321(a1),a2    ; top
  584.     lea    +319(a1),a3    ; btm
  585.     lea    -319(a1),a4    ; left
  586.     lea    +321(a1),a5    ; right
  587.  
  588. .yloop:    moveq    #16-1,d6
  589.  
  590. .xloop:
  591.     rept    5
  592.     move.l    (a2)+,d0
  593.     add.l    (a3)+,d0
  594.     move.l    (a4)+,d2
  595.     add.l    (a5)+,d2
  596.     lsr.l    d0
  597.     lsr.l    d2
  598.     and.l    d1,d0
  599.     and.l    d1,d2
  600.     add.l    d2,d0
  601.     lsr.l    #2,d0
  602.     and.l    d3,d0
  603.     add.l    (a1)+,d0
  604.     lsr.l    d0
  605.     and.l    d1,d0
  606.     move.l    d0,d2
  607.     lsr.l    #2,d2
  608.     and.l    d3,d2
  609.     add.l    d2,d0
  610.     move.l    d0,(a0)+
  611.     endr
  612.     dbf    d6,.xloop
  613.  
  614.     dbf    d7,.yloop
  615.  
  616. ; clear bottom scan line.
  617.     clr.l    d0
  618.     moveq    #320/4-1,d7
  619. .bloop:    move.l    d0,(a0)+
  620.     dbf    d7,.bloop
  621.     rts
  622.  
  623. ; input:
  624. ; a0: dst screen
  625. ; a1: src screen
  626. blur_no:
  627. ; needed in case when the blur doesn't fade enough...
  628.     clr.l    320*99+158(a1)
  629.     clr.l    320*100+158(a1)
  630.  
  631. ; clear top scan line.
  632.     clr.l    d0
  633.     moveq    #320/4-1,d7
  634. .tloop:    move.l    d0,(a0)+
  635.     dbf    d7,.tloop
  636.  
  637.     adda.w    #320,a0
  638.     adda.w    #320,a1
  639.     move.l    #$FF7F7F7F,d1
  640.     move.w    #200-2-1,d7
  641.     move.l    frame_count,d0
  642.     andi.w    #1,d0
  643.     beq.s    .right
  644.     lea    320*1-1(a1),a2    ; left
  645.     bra.s    .yloop
  646. .right:    lea    320*1+1(a1),a2    ; right
  647.  
  648. .yloop:    moveq    #8-1,d6
  649.  
  650. .xloop:
  651.     rept    10
  652.     move.l    (a2)+,d0
  653.     add.l    (a1)+,d0
  654.     lsr.l    d0
  655.     and.l    d1,d0
  656.     move.l    d0,(a0)+
  657.     endr
  658.     dbf    d6,.xloop
  659.  
  660.     dbf    d7,.yloop
  661.  
  662. ; clear bottom scan line.
  663.     clr.l    d0
  664.     moveq    #320/4-1,d7
  665. .bloop:    move.l    d0,(a0)+
  666.     dbf    d7,.bloop
  667.     rts
  668.  
  669. ; input:
  670. ; a0: dst screen
  671. ; a1: src screen
  672. blur_crap:
  673. ; needed in case when the blur doesn't fade enough...
  674.     clr.l    320*99+158(a1)
  675.     clr.l    320*100+158(a1)
  676.  
  677. ; clear top scan line.
  678.     clr.l    d0
  679.     moveq    #320/4-1,d7
  680. .tloop:    move.l    d0,(a0)+
  681.     dbf    d7,.tloop
  682.  
  683.     adda.w    #320,a1
  684.     move.l    #$FF7F7F7F,d1
  685.     move.w    #200-2-1,d7
  686.     move.l    frame_count,d0
  687.     andi.w    #3,d0
  688.     jsr    .table(pc,d0.w*4)
  689.  
  690. .yloop:    moveq    #8-1,d6
  691.  
  692. .xloop:
  693.     rept    10
  694.     move.l    (a2)+,d0
  695.     add.l    (a1)+,d0
  696.     lsr.l    d0
  697.     and.l    d1,d0
  698.     move.l    d0,(a0)+
  699.     endr
  700.     dbf    d6,.xloop
  701.  
  702.     dbf    d7,.yloop
  703.  
  704. ; clear bottom scan line.
  705.     clr.l    d0
  706.     moveq    #320/4-1,d7
  707. .bloop:    move.l    d0,(a0)+
  708.     dbf    d7,.bloop
  709.     rts
  710.  
  711. .table:    bra.w    .ne
  712.     bra.w    .nw
  713.     bra.w    .se
  714.     bra.w    .sw
  715.  
  716. .ne:    lea    -320*1-1(a1),a2
  717.     rts
  718. .nw:    lea    -320*1+1(a1),a2
  719.     rts
  720. .se:    lea    +320*1-1(a1),a2
  721.     rts
  722. .sw:    lea    +320*1+1(a1),a2
  723.     rts
  724.  
  725. blur_dont:
  726. ; needed in case when the blur doesn't fade enough...
  727.     clr.l    320*99+158(a1)
  728.     clr.l    320*100+158(a1)
  729.  
  730.     move.w    #320*200/8-1,d7
  731. .loop:    move.l    (a1)+,(a0)+
  732.     move.l    (a1)+,(a0)+
  733.     dbf    d7,.loop
  734.     rts
  735.  
  736. ;- mappers -----------------------------------------------------------------
  737.  
  738. ; dst and scr must not be the same!
  739. ; input:
  740. ; a0: dst screen
  741. ; a1: src screen
  742. zoom_twirl:
  743.     lea    twirl_map,a3
  744.     adda.l    #320*100+160,a1
  745.     lea    sine_tbl,a2
  746.     clr.l    d3
  747.     move.w    #200-1,d7
  748.  
  749. .yloop:    move.w    #320/16-1,d6
  750.  
  751. .xloop:
  752.     rept    16
  753.     move.l    (a3)+,d3
  754.     move.b    (a1,d3.l),(a0)+
  755.     endr
  756.     dbf    d6,.xloop
  757.  
  758.     dbf    d7,.yloop
  759.     rts
  760.  
  761.     ifne    0
  762. precalc_twirl_map:
  763.     lea    twirl_map,a0
  764.     lea    sine_tbl,a2
  765.     move.w    #-199,d7
  766.  
  767. .yloop:    move.w    #-319,d6
  768.  
  769. .xloop:    move.w    d6,d0
  770.     move.w    d7,d1
  771.     muls.w    d0,d0
  772.     muls.w    d1,d1
  773.     add.l    d0,d1                ; d1.l=x*x+y*y
  774.     bsr    Math.sqrt
  775.     move.l    #$0FFFFFFF,d1
  776.     divu.l    d0,d1                ; g= r^-2 =1/(x*x+y*y)
  777.     Do_SinModulo    d1
  778.     Get_SinCos    a2,d1,d0,d1        ; d0.w=sin(g), d1.w=cos(g)
  779.     move.w    d0,d3
  780.     move.w    d1,d2
  781.     neg.w    d3
  782.     muls.w    d7,d0
  783.     muls.w    d6,d1
  784.     muls.w    d7,d2
  785.     muls.w    d6,d3
  786.     
  787.     add.l    d0,d1
  788.     add.l    d2,d3
  789.     add.l    d1,d1
  790.     add.l    d3,d3
  791.     swap    d1                ; d1.w=+cos(g)*p.x+sin(g)*p.y
  792.     swap    d3                ; d3.w=-sin(g)*p.x+cos(g)*p.y
  793.  
  794. ; scale down a litte to move into the vortex..
  795.     muls.w    #$88,d1
  796.     asr.l    #8,d1                ; d1.w=p'.x
  797.     muls.w    #$88,d3
  798.     asr.l    #8,d3                ; d3.w=p'.y
  799.  
  800.     muls.w    #320,d3
  801.     ext.l    d1
  802.     add.l    d1,d3
  803.     move.l    d3,(a0)+
  804.  
  805.     addq.w    #2,d6
  806.     cmpi.w    #319,d6
  807.     ble.s    .xloop
  808.  
  809.     addq.w    #2,d7
  810.     cmpi.w    #199,d7
  811.     ble.s    .yloop
  812.     
  813.     rts
  814.     endc
  815.  
  816. precalc_twirl_in_map:
  817.     lea    twirl_in_map,a0
  818.     lea    twirl_map,a3
  819.     lea    sine_tbl,a2
  820.     move.w    #-199,d7
  821.  
  822. .yloop:    move.w    #-319,d6
  823.  
  824. .xloop:    move.w    d6,d0
  825.     move.w    d7,d1
  826.     muls.w    d0,d0
  827.     muls.w    d1,d1
  828.     add.l    d0,d1                ; d1.l=x*x+y*y
  829.     bsr    Math.sqrt
  830.     move.l    #$0FFFFFFF,d1
  831.     divu.l    d0,d1                ; g= r^-2 =1/(x*x+y*y)
  832.     Do_SinModulo    d1
  833.     Get_SinCos    a2,d1,d0,d1        ; d0.w=sin(g), d1.w=cos(g)
  834.     move.w    d0,d3
  835.     move.w    d1,d2
  836.     neg.w    d3
  837.     muls.w    d7,d0
  838.     muls.w    d6,d1
  839.     muls.w    d7,d2
  840.     muls.w    d6,d3
  841.     
  842.     add.l    d0,d1
  843.     add.l    d2,d3
  844.     add.l    d1,d1
  845.     add.l    d3,d3
  846.     swap    d1                ; d1.w=+cos(g)*p.x+sin(g)*p.y
  847.     swap    d3                ; d3.w=-sin(g)*p.x+cos(g)*p.y
  848.  
  849. ; scale down a litte to move into the vortex..
  850.     move.w    d1,d4
  851.     move.w    d3,d5
  852.     muls.w    #$7A,d1
  853.     muls.w    #$7A,d3
  854.     muls.w    #$88,d4
  855.     muls.w    #$88,d5
  856.     asr.l    #8,d1                ; d1.w=p'.x
  857.     asr.l    #8,d3                ; d3.w=p'.y
  858.     asr.l    #8,d4                ; d4.w=p'.x
  859.     asr.l    #8,d5                ; d5.w=p'.y
  860.  
  861.     muls.w    #320,d3
  862.     ext.l    d1
  863.     add.l    d1,d3
  864.     move.l    d3,(a0)+
  865.     muls.w    #320,d5
  866.     ext.l    d4
  867.     add.l    d4,d5
  868.     move.l    d5,(a3)+
  869.  
  870.     addq.w    #2,d6
  871.     cmpi.w    #319,d6
  872.     ble.s    .xloop
  873.  
  874.     addq.w    #2,d7
  875.     cmpi.w    #199,d7
  876.     ble.s    .yloop
  877.     
  878.     rts
  879.  
  880. ; dst and scr must not be the same!
  881. ; input:
  882. ; a0: dst screen
  883. ; a1: src screen
  884. zoom_twirl_in:
  885.     lea    twirl_in_map,a3
  886.     adda.l    #320*100+160,a1
  887.     lea    sine_tbl,a2
  888.     clr.l    d3
  889.     move.w    #200-1,d7
  890.  
  891. .yloop:    move.w    #320/16-1,d6
  892.  
  893. .xloop:
  894.     rept    16
  895.     move.l    (a3)+,d3
  896.     move.b    (a1,d3.l),(a0)+
  897.     endr
  898.     dbf    d6,.xloop
  899.  
  900.     dbf    d7,.yloop
  901.     rts
  902.  
  903. ; input:
  904. ; a0: dst screen
  905. ; a1: src screen
  906. zoom_hv:movem.l    a0/a1,-(sp)
  907.     movea.l    service_adr,a2
  908.     jsr    ServiceTable.GET_TIME_RUNNING(a2)
  909.     movem.l    (sp)+,a0/a1
  910.  
  911.     adda.w    #16+320*10,a1
  912.     movea.l    a1,a2
  913.     move.w    #200-1,d7
  914.     move.l    #(9<<16)/10,d4                ; d4.l= step (16:16)
  915.     clr.l    d5
  916.     move.w    d0,d5
  917.     divu.w    #10,d5
  918.     clr.w    d5
  919.     swap    d5                    ; d5.l= t mod 10
  920.     mulu.w    #(1<<16)/10,d5                ; 
  921.  
  922. ;    adda.w    #16+320*10,a1
  923. ;    movea.l    a1,a2
  924. ;    move.w    #200-1,d7
  925. ;    move.l    #(9<<16)/10,d4
  926. ;    clr.l    d5
  927.  
  928. .yloop:    moveq    #32-1,d6
  929.  
  930. .xloop:    move.l    (a1)+,d0
  931.     move.l    d0,(a0)+
  932.     move.b    d0,(a0)+
  933.     move.l    (a1)+,(a0)+
  934.     move.b    (a1)+,(a0)+
  935.     dbf    d6,.xloop
  936.  
  937.     add.l    d4,d5
  938.     move.l    d5,d3
  939.     swap    d3
  940.     mulu.w    #320,d3
  941.     lea    (a2,d3.l),a1
  942.     dbf    d7,.yloop
  943.     rts
  944.  
  945. ; input:
  946. ; a0: dst screen
  947. ; a1: src screen
  948. zoom_hv_slow:
  949.     movem.l    a0/a1,-(sp)
  950.     movea.l    service_adr,a2
  951.     jsr    ServiceTable.GET_TIME_RUNNING(a2)
  952.     movem.l    (sp)+,a0/a1
  953.  
  954.     adda.w    #8+320*5,a1
  955.     movea.l    a1,a2
  956.     move.w    #200-1,d7
  957.     move.l    #(19<<16)/20,d4
  958.     clr.l    d5
  959.     move.w    d0,d5
  960.     divu.w    #20,d5
  961.     clr.w    d5
  962.     swap    d5
  963.     mulu.w    #(1<<16)/20,d5
  964.  
  965. .yloop:    moveq    #16-1,d6
  966.  
  967. .xloop:    move.l    (a1)+,(a0)+
  968.     move.l    (a1)+,d0
  969.     move.l    d0,(a0)+
  970.     move.b    d0,(a0)+
  971.     move.l    (a1)+,(a0)+
  972.     move.l    (a1)+,(a0)+
  973.     move.w    (a1)+,(a0)+
  974.     move.b    (a1)+,(a0)+
  975.     dbf    d6,.xloop
  976.  
  977.     add.l    d4,d5
  978.     move.l    d5,d3
  979.     swap    d3
  980.     mulu.w    #320,d3
  981.     lea    (a2,d3.l),a1
  982.     dbf    d7,.yloop
  983.     rts
  984.  
  985. ; input:
  986. ; a0: dst screen
  987. ; a1: src screen
  988. zoom_bil_slow:
  989.     adda.w    #8+320*5,a1
  990.     lea    muls_table,a3
  991.     move.w    #200-1,d7
  992.     move.l    #(19<<16)/20,a6            ; a6=v_step
  993.  
  994. ; randomize (u,v) start fractions to shake around the bilinear interpolation
  995. ; a bit. this helps reduce rough-looking 'cuts' along the axes.
  996.     Calc_NextRandom
  997.     clr.l    d6
  998.     move.w    d0,d6
  999.     divu.w    #20,d6
  1000.     clr.w    d6
  1001.     swap    d6
  1002.     mulu.w    #(1<<16)/20,d6
  1003.     subi.w    #$8000,d6
  1004.     bcc.s    .oki_y
  1005.     suba.w    #320,a1
  1006. .oki_y:
  1007. ; d6.w=v_frac[0] [0..$FFFF]
  1008.     clr.l    d5
  1009.     move.w    d0,d5
  1010.     divu.w    #20,d5
  1011.     clr.w    d5
  1012.     swap    d5
  1013.     mulu.w    #(1<<16)/20,d5
  1014.     subi.w    #$8000,d5
  1015.     bcc.s    .oki_x
  1016.     subq.w    #1,a1
  1017. .oki_x:    movea.w    d5,a4
  1018. ; a4.w=u_frac[0] [0..$FFFF]
  1019.  
  1020.     movea.l    a1,a5
  1021.     clr.l    d2
  1022.     clr.l    d5
  1023.  
  1024. .yloop:    swap    d7
  1025.     movea.l    a5,a1
  1026.     lea    320(a1),a2
  1027.     move.w    #320-1,d7
  1028.     move.w    a4,d3                ; d3.w=u_frac[0] [0..$FFFF]
  1029.     move.w    d6,d0
  1030.     not.w    d0                ; d0.w=1-v_frac[n] [0..$FFFF]
  1031.     move.w    d6,d2                ; d2.w=vv--
  1032.  
  1033. .xloop:
  1034.  
  1035.     ifne    1
  1036.  
  1037.     move.w    d3,d5                ; d5.w=uu--
  1038.  
  1039. ; Interpolate columns..
  1040.     move.b    (a1),d1                ; d1.b=hne=h[V,U]
  1041.     move.b    (a2),d2                ; d2.b=hse=h[V+1,U]
  1042.     sub.b    d1,d2                ; d2.b=hse-hne
  1043.     add.b    (a3,d2.l),d1            ; d1.b=he=v(hse-hne)+hne
  1044.     move.b    1(a2),d2            ; d2.b=hsw=h[V+1,U+1]
  1045.     move.b    1(a1),d5            ; d5.b=hnw=h[V,U+1]
  1046.     sub.b    d5,d2                ; d2.b=hsw-hnw
  1047.     add.b    (a3,d2.l),d5            ; d5.b=hw=v(hsw-hnw)+hnw
  1048. ; Interpolate row..
  1049.     sub.b    d1,d5                ; d5.b=hr-hl
  1050.     add.b    (a3,d5.l),d1            ; d1.b=u(hr-hl)+hl
  1051.  
  1052.     move.b    d1,(a0)+            ; store.
  1053.  
  1054.     else
  1055.  
  1056.     move.w    d3,d4
  1057.     not.w    d4                ; d4.w=1-u_frac[n] [0..$FFFF]
  1058.  
  1059. ; d0.w=x_int
  1060. ; d3.w=x_frac [0..$FFFF]
  1061. ; d4.w=1-x_frac [0..$FFFF]
  1062. ; d6.w=y_frac [0..$FFFF]
  1063. ; a1: north east pixel
  1064. ; a2: south east pixel
  1065.  
  1066. ; interpolate top.
  1067.     clr.w    d1
  1068.     clr.w    d2
  1069.     move.b    (a1),d1
  1070.     move.b    1(a1),d2
  1071.     mulu.w    d4,d1
  1072.     mulu.w    d3,d2
  1073.     add.l    d1,d2                ; d2.l=top interpolation
  1074.     swap    d2                ; d2.b=btm interpolation
  1075.  
  1076. ; interpolate bottom.
  1077.     clr.w    d1
  1078.     clr.w    d5
  1079.     move.b    (a2),d1
  1080.     move.b    1(a2),d5
  1081.     mulu.w    d4,d1
  1082.     mulu.w    d3,d5
  1083.     add.l    d1,d5                ; d5.l=btm interpolation
  1084.     swap    d5                ; d5.b=btm interpolation
  1085.  
  1086. ; interpolate top and bottom results.
  1087.     mulu.w    d6,d5
  1088.     mulu.w    d0,d2
  1089.     add.l    d2,d5
  1090.     swap    d5
  1091.  
  1092. ; store interpolation.
  1093.     move.b    d5,(a0)+
  1094.  
  1095.     endc
  1096.  
  1097. ; add x_step.
  1098.     add.w    a6,d3                ; d3.w=u_frac[n+1] [0..$FFFF]
  1099.     bcc.s    .skip_x
  1100.     addq    #1,a1
  1101.     addq    #1,a2
  1102. .skip_x:dbf    d7,.xloop
  1103.  
  1104.     add.w    a6,d6
  1105.     bcc.s    .skip
  1106.     adda.w    #320,a5
  1107. .skip:    swap    d7
  1108.     dbf    d7,.yloop
  1109.     rts
  1110.  
  1111. ; input:
  1112. ; a0: dst screen
  1113. ; a1: src screen
  1114. zoom_hv_fast:
  1115.     adda.w    #32+320*20,a1
  1116.     movea.l    a1,a2
  1117.     move.w    #200-1,d7
  1118.     move.l    #(4<<16)/5,d4
  1119.     clr.l    d5
  1120.     move.l    frame_count,d0
  1121.     andi.w    #1,d0
  1122.     beq.s    .case1
  1123.  
  1124. .yloop:    moveq    #64-1,d6
  1125.  
  1126. .xloop:    move.l    (a1)+,d0
  1127.     move.l    d0,(a0)+
  1128.     move.b    d0,(a0)+
  1129.     dbf    d6,.xloop
  1130.  
  1131.     add.l    d4,d5
  1132.     move.l    d5,d3
  1133.     swap    d3
  1134.     mulu.w    #320,d3
  1135.     lea    (a2,d3.l),a1
  1136.     dbf    d7,.yloop
  1137.     rts
  1138.  
  1139. .case1:    move.l    #(2<<16)/5,d5
  1140. .yloop2:moveq    #64-1,d6
  1141.  
  1142. .xloop2:move.w    (a1)+,d0
  1143.     move.w    d0,(a0)+
  1144.     move.b    d0,(a0)+
  1145.     move.w    (a1)+,(a0)+
  1146.     dbf    d6,.xloop2
  1147.  
  1148.     add.l    d4,d5
  1149.     move.l    d5,d3
  1150.     swap    d3
  1151.     mulu.w    #320,d3
  1152.     lea    (a2,d3.l),a1
  1153.     dbf    d7,.yloop2
  1154.     rts
  1155.  
  1156. rts:    rts
  1157.  
  1158. ;======= OBJECT DATA =======================================================
  1159.  
  1160.     data
  1161.  
  1162. flow_table_green:
  1163.     dc.w    4    (.end-.start)/4
  1164.     dc.w    6
  1165. .start:    dc.l    $00000000
  1166.     dc.l    $007F0000
  1167.     dc.l    $FFFF007F
  1168.     dc.l    $FFFF007F
  1169.     dc.l    $FFFF007F
  1170. .end:
  1171.  
  1172. flow_table_orange:
  1173.     dc.w    4    (.end-.start)/4
  1174.     dc.w    6
  1175. .start:    dc.l    $00000000
  1176.     dc.l    $AF000000
  1177.     dc.l    $FFFF007F
  1178.     dc.l    $FFFF007F
  1179.     dc.l    $FFFF007F
  1180. .end:
  1181.  
  1182. flow_table_purple:
  1183.     dc.w    4    (.end-.start)/4
  1184.     dc.w    6
  1185. .start:    dc.l    $00000000
  1186.     dc.l    $7F00007F
  1187.     dc.l    $FF7F00FF
  1188.     dc.l    $FFFF00FF
  1189.     dc.l    $FFFF00FF
  1190. .end:
  1191.  
  1192. flow_table_blue:
  1193.     dc.w    8    (.end-.start)/4
  1194.     dc.w    5
  1195. .start:    dc.l    $00000000
  1196.     dc.l    $003F00FF
  1197.     dc.l    $7FCF00FF
  1198.     dc.l    $FFFF00FF
  1199.     dc.l    $FFFF00FF
  1200.     dc.l    $FFFF00FF
  1201.     dc.l    $FFFF00FF
  1202.     dc.l    $FFFF00FF
  1203.     dc.l    $FFFF00FF
  1204. .end:
  1205.  
  1206. flow_table_bluegrey:
  1207.     dc.w    8    (.end-.start)/4
  1208.     dc.w    5
  1209. .start:    dc.l    $00000000
  1210.     dc.l    $3F3F00FF
  1211.     dc.l    $CFCF00FF
  1212.     dc.l    $FFFF00FF
  1213.     dc.l    $FFFF00FF
  1214.     dc.l    $FFFF00FF
  1215.     dc.l    $FFFF00FF
  1216.     dc.l    $FFFF00FF
  1217.     dc.l    $FFFF00FF
  1218. .end:
  1219.  
  1220. num_pals:
  1221.     dc.w    (pal_table_end-pal_table)/4
  1222.  
  1223. pal_table:
  1224.     dc.l    green_pal,blue_pal,purple_pal,orange_pal,bluegrey_pal
  1225. pal_table_end:
  1226.  
  1227. scr_adr:dc.l    screen1
  1228. buf_adr:dc.l    screen2
  1229.  
  1230. zoom_rout_adr:
  1231.     dc.l    zoom_bil_slow    zoom_hv
  1232. blur_rout_adr:
  1233.     dc.l    blur_dont
  1234. plot_rout_adr:
  1235. ;    dc.l    plot_circle_scope_l
  1236.     dc.l    plot_hor_scopes
  1237. pal_adr:dc.l    green_pal
  1238.  
  1239. num_combis:
  1240.     dc.w    (combi_table_end-combi_table)/12
  1241.  
  1242. combi_table:
  1243. ; horizontal scope works fine, but not all blur/zoom combinations are okay.
  1244.     dc.l    plot_hor_scopes,zoom_hv_slow,blur_acc
  1245.     dc.l    plot_hor_scopes,zoom_hv,blur_acc
  1246.     dc.l    plot_hor_scopes,zoom_hv,blur_crap
  1247.     dc.l    plot_hor_scopes,zoom_hv_fast,blur_crap
  1248. ; polar scope only works fine with accurate blur.
  1249.     dc.l    plot_polar_scope_l,zoom_hv_slow,blur_acc
  1250.     dc.l    plot_polar_scope_l,zoom_hv,blur_acc
  1251.     dc.l    plot_polar_scope_l,zoom_hv_fast,blur_acc
  1252. ; circular scope works fine with most zoom and blur settings.
  1253.     dc.l    plot_circle_scope_l,zoom_hv_slow,blur_crap
  1254.     dc.l    plot_circle_scope_l,zoom_hv,blur_crap
  1255.     dc.l    plot_circle_scope_l,zoom_hv_fast,blur_crap
  1256.     dc.l    plot_circle_scope_l,zoom_hv_slow,blur_acc
  1257.     dc.l    plot_circle_scope_l,zoom_hv,blur_acc
  1258.     dc.l    plot_circle_scope_l,zoom_hv_fast,blur_acc
  1259. ; special bilinear zoom.
  1260.     dc.l    plot_circle_scope_l,zoom_bil_slow,blur_dont
  1261.     dc.l    plot_hor_scopes,zoom_bil_slow,blur_dont
  1262. ; inward vortex; only looks nice with the sloppy blur.
  1263.     dc.l    plot_circle_scope_big,zoom_twirl,blur_crap
  1264.     dc.l    plot_hor_scopes,zoom_twirl,blur_crap
  1265. ; outward vortex, pretty good with circle and horizontal scopes.
  1266.     dc.l    plot_circle_scope_big,zoom_twirl_in,blur_crap
  1267.     dc.l    plot_hor_scopes,zoom_twirl_in,blur_crap
  1268.     dc.l    plot_circle_scope_big,zoom_twirl_in,blur_acc
  1269.     dc.l    plot_hor_scopes,zoom_twirl_in,blur_acc
  1270. combi_table_end:
  1271.  
  1272. ;---------------------------------------------------------------------------
  1273. ; plugin reserves section
  1274. ;---------------------------------------------------------------------------
  1275.  
  1276.     bss
  1277.  
  1278. service_adr:
  1279.     ds.l    1
  1280. screen:    ds.l    1
  1281.  
  1282. time:    ds.l    1
  1283. old_time:
  1284.     ds.l    1
  1285. frame_count:
  1286.     ds.l    1
  1287.  
  1288. muls_table:
  1289.     ds.b    256*256
  1290.  
  1291. sine_tbl:
  1292.     ds.l    sintbllen
  1293.     ds.l    1
  1294. screen1:ds.b    320*200
  1295. screen2:ds.b    320*200
  1296.  
  1297. green_pal:
  1298.     ds.l    256
  1299. orange_pal:
  1300.     ds.l    256
  1301. purple_pal:
  1302.     ds.l    256
  1303. blue_pal:
  1304.     ds.l    256
  1305. bluegrey_pal:
  1306.     ds.l    256
  1307.  
  1308. twirl_map:
  1309.     ds.l    320*200
  1310. twirl_in_map:
  1311.     ds.l    320*200
  1312.