home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / DSPRAD.SO < prev    next >
Text File  |  2004-01-05  |  11KB  |  601 lines

  1. ; note: dsp activated, radical jumps in framerate may occur ;)
  2. ;
  3. ; attempt at decent 2^n radialblur.
  4. ; thanx for the info chaos/farbrausch!
  5. ;
  6. ; b = a + 1.5*a
  7. ; c = b + 1.25*b
  8. ;   = a + 1.5*a + 1.25*a + 1.875*a
  9. ; d = c + 1.125*c
  10. ;   = a + 1.5*a + 1.25*a + 1.875*a + 1.125*a + 1.6875*a + 1.40625*a + 2.109*a
  11. ; e = d + 1.0625*d
  12. ;   = a + 1.5*a + 1.25*a + 1.875*a + 1.125*a + 1.6875*a + 1.40625*a + 2.109*a
  13. ;   + 1.0625a + 1.594a + 1.328a + 1.992a + 1.195a + 1.793a + 1.494a + 2.241a
  14. ; f = e + 1.03125*e
  15. ;   = a + 1.5*a + 1.25*a + 1.875*a + 1.125*a + 1.6875*a + 1.40625*a + 2.109*a
  16. ;   + 1.0625a + 1.594a + 1.328a + 1.992a + 1.195a + 1.793a + 1.494a + 2.241a
  17. ;   + 1.03125a + ....
  18. ;
  19. ; we see that the smaller scalefactors only introduce some 'blur',
  20. ; whereas the bigger ones create only some 'discrete copies'.
  21. ;
  22. ; we also notice that the average scale approaches 1.57.
  23. ;
  24. ; for decent blurring trails we would need interpolative scaling...
  25. ; ofcourse that would be slower than snails.
  26. ;
  27. ; dsp stuff is ready. avg 18.6fps on std falcon rgb50. probably a bit
  28. ; faster on vga100. vga100 measured now at 21.3fps (std falc).
  29.  
  30. ;======= OBJECT EQUATES ====================================================
  31.  
  32. ; accuracy:
  33. ; 1: accurate: use fully fledged over the top method
  34. ; 0: fast: use 2^n layers way (feedback, fast but accumulation of artifacts)
  35. Radial.ACCURATE:    =    0
  36.  
  37. ; stuff for accurate version
  38. Radial.NUMLAYERS:    =    40            ; #layers in accurate version
  39. Radial.ZOOMSTEP:    =    1            ; initial zoomstep between layers in accurate version
  40.  
  41. ; stuff for fast version
  42. Radial.CHOP:        =    0            ; use optimised scalingcases in fast version
  43. Radial.DETAIL:        =    1            ; use extra layer in fast mode
  44.  
  45. ;======= OBJECT TABLE ======================================================
  46.  
  47.     IFND    DEMO_SYSTEM
  48. testmode:    =    0
  49.     move.l    #Radial.table,fxAdr
  50.     INCLUDE    TESTER.S
  51.     TEXT
  52.     INCLUDE    DSP.I
  53.     ENDC    
  54.  
  55. ; Must be first in object!!
  56. Radial.table:
  57.     DC.L    Radial.mainLoop
  58.     DC.L    Radial.init
  59.     DC.L    Radial.initRT
  60.     DC.L    Radial.deinitRT
  61.     DC.L    Radial.killDetail
  62.     DC.L    Radial.addDetail
  63.     DC.L    Radial.incZoomStep
  64.     DC.L    Radial.setFadeOut
  65.     DC.L    Radial.setNormalTraject
  66.     DC.L    Radial.setSwingTraject
  67.     DC.L    0
  68.  
  69. ;======= INIT SUBROUTINE ===================================================
  70.  
  71. ; OUTPUT:
  72. ; d0.l: 0   = All clear, neg = Error! Not initialized!
  73. Radial.init:
  74.     lea    Radial.pal,a0
  75.     lea    Radial.flowTable,a1
  76.     bsr    Pal.makeGradientHc
  77.  
  78.     lea    Radial.palr,a0
  79.     lea    Radial.pal,a1
  80.     clr.w    d7
  81. .rloop:    move.w    (a1),(a0)+
  82.     move.w    (a1)+,(a0)+
  83.     addq.b    #1,d7
  84.     bne.s    .rloop
  85.  
  86.     lea    Radial.pal,a1
  87.     lea    Radial.pald,a0
  88.     movea.l    a1,a3
  89.     clr.w    d1
  90.  
  91. .oloop:    clr.w    d0
  92.     move.w    (a3)+,d2
  93.     movea.l    a1,a2
  94.  
  95. .iloop:    move.w    d2,(a0)+
  96.     move.w    (a2)+,(a0)+
  97.     addq.b    #1,d0
  98.     bne.s    .iloop
  99.  
  100.     addq.b    #1,d1
  101.     bne.s    .oloop
  102.  
  103. .success:
  104.     moveq    #0,d0
  105.     rts
  106. .error:    moveq    #-1,d0
  107.     rts
  108.  
  109. ;======= REALTIME INIT SUBROUTINE ==========================================
  110.  
  111. Radial.initRT:
  112. ;    move.l    #Radial.fuckup,vbl_gfx
  113.     move.l    #rts,vbl_gfx
  114.  
  115.     move.l    #(Radial.p56End-Radial.p56)/3,d0
  116.     lea    Radial.p56,a0
  117.     bsr    Dsp.loadProgram
  118.  
  119.     bsr    Radial.sendPic
  120.  
  121.     move.w    #Radial.NUMLAYERS,Radial.numLayers
  122.     move.w    #Radial.ZOOMSTEP,Radial.zoomStep
  123.  
  124.     bsr.w    Radial.addDetail
  125.  
  126.     move.w    monitormode,d0
  127.     cmpi.w    #vga60,d0
  128.     beq.s    .vga60
  129.     cmpi.w    #vga100,d0
  130.     beq.s    .vga100
  131.     cmpi.w    #rgb50,d0
  132.     beq.s    .rgb50
  133. ; Unknown monitormode..
  134. .end:    rts
  135. .vga60:    move.l    #vga60_16bit_160_200,resRout
  136.     rts
  137. .vga100:move.l    #vga100_16bit_160_100,resRout
  138.     rts
  139. .rgb50:    move.l    #rgb50_16bit_320_100,resRout
  140.     rts
  141.  
  142. ;======= DEINITIALISATION ROUTINE ==========================================
  143.  
  144. Radial.deinitRT:
  145.     rts
  146.  
  147. ;======= SCREENINIT SUBROUTINE =============================================
  148.  
  149. Radial.initScreen:
  150.     rts
  151.  
  152. ;======= MAINLOOP SUBROUTINE ===============================================
  153.  
  154. Radial.mainLoop:
  155.     move.w    $0468.w,old468
  156.  
  157.     move.l    frmcnt,d0
  158.     sub.l    lastframecount,d0
  159.     cmpi.l    #3,d0
  160.     bhs.s    .end_screeninit
  161.     bsr    Radial.initScreen
  162. .end_screeninit:
  163.  
  164.     tst.w    Radial.fading
  165.     beq.s    .done_fading
  166.     move.w    $04BC.w,d0
  167.     sub.w    Radial.fadeStart,d0
  168.     cmpi.w    #$200,d0
  169.     bls.s    .fade_ok
  170.     move.w    #$200,d0
  171.     clr.w    Radial.fading
  172. .fade_ok:
  173.     lsr.w    d0
  174.     move.w    d0,Radial.fadePos
  175. .done_fading:
  176.     sendWordToDsp    Radial.fadePos
  177.  
  178.     movea.l    Radial.trajRout,a0
  179.     jsr    (a0)
  180.     ext.l    d0
  181.     ext.l    d1
  182.     sendLongToDsp    d0
  183.     sendLongToDsp    d1
  184.     bsr    Radial.blurDsp
  185.  
  186.     lea    scr,a0
  187.     move.l    (a0)+,d0
  188.     move.l    (a0)+,d1
  189.     move.l    (a0),-4(a0)
  190.     move.l    d0,(a0)
  191.     move.l    d1,-8(a0)
  192.     movea.l    resRout,a0
  193.     suba.l    a1,a1
  194.     movea.l    d0,a2
  195.     bsr.l    Screen.requestUpdate
  196.     clr.l    resRout
  197.  
  198.     move.w    old468,d0
  199. .wait:    cmp.w    $0468.w,d0
  200.     beq.s    .wait
  201.  
  202.     rts
  203.  
  204. ;======= OBJECT SUBROUTINES ================================================
  205.  
  206.  
  207. Radial.killDetail:
  208.     clr.w    Radial.detail
  209.     bsr    Radial.convPic
  210.     rts
  211.  
  212. Radial.addDetail:
  213.     move.w    #1,Radial.detail
  214.     bsr    Radial.convPic
  215.     rts
  216.  
  217.  Radial.incZoomStep:
  218.     addq.w    #1,Radial.zoomStep
  219.     rts
  220.  
  221. Radial.setFadeOut:
  222.     move.w    $04BC.w,Radial.fadeStart
  223.     st    Radial.fading
  224.     clr.w    Radial.fadePos
  225.     rts
  226.  
  227. Radial.setSwingTraject:
  228.     move.l    #Radial.swingTraject,Radial.trajRout
  229.     move.l    $04BA.w,Radial.swingStart
  230.     rts
  231.  
  232. Radial.swingStart:
  233.     DS.L    1
  234.  
  235. Radial.setNormalTraject:
  236.     move.l    #Radial.normalTraject,Radial.trajRout
  237.     rts
  238.  
  239. Radial.BSPEED1:=    2700
  240. Radial.ESPEED1:=    5
  241. Radial.BSPEED2:=    2300
  242. Radial.ESPEED2:=    3
  243. Radial.SW_TIMELOG:=    8
  244. Radial.SW_TIME:=    1<<Radial.SW_TIMELOG
  245.  
  246. Radial.swingTraject:
  247.     lea    sine_tbl,a0
  248.     move.l    $04BA.w,d2
  249.     sub.l    Radial.swingStart,d2
  250.     lsr.l    #1,d2
  251. ; d2.l=t
  252.  
  253.     move.l    d2,d0
  254.     move.l    d2,d1
  255.     cmpi.l    #Radial.SW_TIME,d2
  256.     blt.s    .ok
  257.  
  258.     move.w    #Radial.SW_TIME,d2
  259.     subi.w    #Radial.SW_TIME,d0
  260.     mulu.w    #Radial.ESPEED1,d0
  261.     move.l    d0,d1
  262.     add.l    #((Radial.BSPEED1+Radial.ESPEED1)*Radial.SW_TIME)>>5,d0
  263.     add.l    #((Radial.BSPEED2+Radial.ESPEED2)*Radial.SW_TIME)>>5,d1
  264.     bra.s    .oki
  265.  
  266. .ok:
  267.     move.l    d2,d3
  268.     mulu.l    #(sintbllen<<7)/Radial.SW_TIME,d3    ; d3.l='t*pi'<<8
  269.     lsr.l    #8,d3                    ; d3.l='t*pi'
  270.     Get_Sin    a0,d3,d3                ; d3.w=sin(t*pi) (16b signed)
  271.     move.w    d3,d4
  272.     muls.w    #Radial.BSPEED1-Radial.ESPEED1,d3    ; x_speed 'difference'
  273.     divs.l    #450,d3
  274.     mulu.w    #Radial.BSPEED1+Radial.ESPEED1,d0    ; avg x_speed *2
  275.     add.l    d3,d0
  276.     lsr.l    #5,d0
  277.  
  278.     muls.w    #Radial.BSPEED2-Radial.ESPEED2,d4    ; y_speed 'difference'
  279.     divs.l    #450,d4
  280.     mulu.w    #Radial.BSPEED2+Radial.ESPEED2,d1    ; avg y_speed *2
  281.     add.l    d4,d1
  282.     lsr.l    #5,d1
  283.  
  284.     
  285. .oki:
  286.     IFNE    1
  287. ; smooth amplitude increase..
  288.     mulu.l    #(sintbllen<<6)/Radial.SW_TIME,d2    ; d2.l='t*pi/2'<<8
  289.     lsr.l    #8,d2                    ; d2.l='t*pi/2'
  290.     Get_Cos    a0,d2,d2
  291.     neg.w    d2
  292.     addi.w    #$8000,d2
  293.     lsr.w    #7,d2
  294.     ENDC
  295.  
  296. ; get wave position and amp it.
  297. ; d2.w=amp [0..SW_TIME]
  298.     Do_SinModulo    d0
  299.     Do_SinModulo    d1
  300.     Get_Sin    a0,d0,d0
  301.     Get_Sin    a0,d1,d1
  302.     muls.w    d2,d0
  303.     muls.w    d2,d1
  304.     moveq    #Radial.SW_TIMELOG,d3
  305.     asr.l    d3,d0
  306.     asr.l    d3,d1
  307.  
  308. ; convert center to screen coordinates
  309.     muls.w    #120,d0                ; 36
  310.     swap    d0
  311.     addi.w    #18,d0                ; 18
  312.     muls.w    #70,d1                ; 40
  313.     swap    d1
  314.     addi.w    #20,d1                ; 20
  315.     rts
  316.  
  317. Radial.normalTraject:
  318.     bsr    getTime
  319.     move.w    d0,d1
  320.     mulu.w    #11,d0
  321.     mulu.w    #5,d1
  322.     lsr.l    #2,d0
  323.     lsr.l    d1
  324.     Do_SinModulo    d0
  325.     Do_SinModulo    d1
  326.     lea    sine_tbl,a0
  327.     Get_Sin    a0,d0,d0
  328.     Get_Sin    a0,d1,d1
  329.     muls.w    #120,d0                ; 36
  330.     swap    d0
  331.     addi.w    #18,d0                ; 18
  332.     muls.w    #70,d1                ; 40
  333.     swap    d1
  334.     addi.w    #20,d1                ; 20
  335.     rts
  336.  
  337. ; Only send center of pic.
  338. Radial.sendPic:
  339.     clr.l    d0
  340.  
  341. ; send pal.
  342.     clr.b    d7
  343.     lea    Radial.pal,a0
  344. .loop:    sendWordToDsp    (a0)+
  345.     addq.b    #1,d7
  346.     bne.s    .loop
  347.  
  348. ; send pic.
  349.     clr.l    d0
  350.     lea    Radial.pic+788,a0
  351.     adda.w    #320*71,a0
  352.     moveq    #59-1,d7
  353.  
  354. .yloop:    moveq    #124-1,d6
  355.     adda.w    #98,a0
  356.  
  357. .xloop:    move.b    (a0)+,d0
  358.     sendLongToDsp    d0
  359.     dbf    d6,.xloop
  360.  
  361.     adda.w    #98,a0
  362.     dbf    d7,.yloop
  363.     rts
  364.  
  365. Radial.fuckup:
  366.     lea    sine_tbl,a1
  367.  
  368.     lea    Radial.wpic+(320*100+160)*2,a0
  369.     move.w    $04BC.w,d0
  370.     move.w    d0,d1
  371.     mulu.w    #7,d0
  372.     mulu.w    #11,d1
  373.     lsr.l    #2,d0
  374.     lsr.l    #3,d1
  375.     Do_SinModulo    d0
  376.     Do_SinModulo    d1
  377.     Get_Sin    a1,d0,d0
  378.     Get_Sin    a1,d1,d1
  379.     muls.w    #90*2,d0
  380.     muls.w    #60*2,d1
  381.     swap    d0
  382.     swap    d1
  383.     muls.w    #320*2,d1
  384.     add.w    d0,d0
  385.     adda.w    d0,a0
  386.     adda.l    d1,a0
  387.     addq    #1,a0
  388.     addq.b    #8,-320*2-2(a0)
  389.     addi.b    #16,-320*2(a0)
  390.     addq.b    #8,-320*2+2(a0)
  391.     addi.b    #16,-2(a0)
  392.     addi.b    #32,(a0)
  393.     addq.b    #8,+320*2-2(a0)
  394.     addi.b    #16,+2(a0)
  395.     addi.b    #16,320*2(a0)
  396.     addq.b    #8,+320*2+2(a0)
  397.  
  398.     lea    Radial.wpic+(320*100+160)*2,a0
  399.     move.w    $04BC.w,d0
  400.     move.w    d0,d1
  401.     mulu.w    #13,d0
  402.     mulu.w    #17,d1
  403.     lsr.l    #3,d0
  404.     lsr.l    #4,d1
  405.     Do_SinModulo    d0
  406.     Do_SinModulo    d1
  407.     Get_Sin    a1,d0,d0
  408.     Get_Sin    a1,d1,d1
  409.     muls.w    #90*2,d0
  410.     muls.w    #60*2,d1
  411.     swap    d0
  412.     swap    d1
  413.     muls.w    #320*2,d1
  414.     add.w    d0,d0
  415.     adda.w    d0,a0
  416.     adda.l    d1,a0
  417.     addq    #1,a0
  418.     addq.b    #8,-320*2-2(a0)
  419.     addi.b    #16,-320*2(a0)
  420.     addq.b    #8,-320*2+2(a0)
  421.     addi.b    #16,-2(a0)
  422.     addi.b    #32,(a0)
  423.     addq.b    #8,+320*2-2(a0)
  424.     addi.b    #16,+2(a0)
  425.     addi.b    #16,320*2(a0)
  426.     addq.b    #8,+320*2+2(a0)
  427.  
  428.     rts
  429.  
  430. Radial.convPic:
  431.     lea    Radial.wpic,a0
  432.     lea    Radial.pic+788,a1
  433.     lea    Radial.wpic2,a2
  434.     move.w    #320*200-1,d7
  435.     moveq    #Radial.NUMLAYERS+4,d2
  436.     move.w    Radial.detail,d1
  437.     andi.w    #1,d1
  438.     neg.w    d1
  439.     addq.w    #2,d1
  440.     divu.w    d1,d2
  441. .loop:    clr.l    d0
  442.     move.b    (a1)+,d0
  443.     move.l    d0,d1
  444.     lsl.w    #8,d0
  445.     divu.w    d2,d0
  446.     lsl.l    #5,d1
  447.     move.w    d0,(a0)+
  448.     move.w    d1,(a2)+
  449.     dbf    d7,.loop
  450.     rts
  451.  
  452. ; Single buffer version.. Just trying out to see if suited for dsp.
  453. Radial.blurDsp:
  454. .wait:    btst    #0,$FFFFA202.w
  455.     beq.s    .wait
  456.     lea    $FFFFA206.w,a1
  457.     lea    $FFFFA207.w,a3
  458.     movea.l    scr,a0
  459.     clr.l    d0
  460.     clr.l    d1
  461.     lea    Radial.pal,a2
  462.     move.w    monitormode,d2
  463.     cmpi.w    #vga100,d2
  464.     beq.s    Radial.paintVga100
  465.     cmpi.w    #vga60,d2
  466.     beq.w    Radial.paintVga60
  467.     lea    Radial.palr,a2
  468.     cmpi.w    #rgb50,d2
  469.     beq.w    Radial.paintRgb50
  470. ; Unknown monitormode..
  471.  
  472. Radial.paintVga100:
  473.     move.w    #160*100/100-1,d7
  474. .loop:
  475.     REPT    100
  476.     move.w    (a1),(a0)+
  477.     ENDR
  478.     dbf    d7,.loop
  479.     rts
  480.  
  481. Radial.paintVga60:
  482.     lea    160*2(a0),a2
  483.     movea.w    #160*2,a6
  484.     moveq    #100-1,d7
  485.  
  486. .yloop:    moveq    #2-1,d6
  487.  
  488. .xloop:
  489.     REPT    80
  490.     move.w    (a1),d0
  491.     move.w    d0,(a0)+
  492.     move.w    d0,(a2)+
  493.     ENDR
  494.     dbf    d6,.xloop
  495.  
  496.     adda.l    a6,a0
  497.     adda.l    a6,a2
  498.     dbf    d7,.yloop
  499.     rts
  500.  
  501. Radial.paintRgb50:
  502.     move.w    #160*100/40-1,d7
  503. .loop:
  504.     REPT    40
  505.     move.w    (a1),d0                ; h,t = 1,1
  506.     move.l    d0,(a0)+            ; h,t = 0,1
  507.     swap    d0                ; h,t = 4,0
  508.     ENDR
  509.     dbf    d7,.loop
  510.     rts
  511.  
  512. ;======= OBJECT DATA =======================================================
  513.  
  514.     DATA
  515.  
  516. Radial.pic:
  517.     INCBIN    RAD.APX
  518.  
  519. Radial.flowTable:
  520.     DC.W    (.end-.start)/4
  521.     DC.W    4
  522. .start:    DC.L    $1f1f001f
  523.     DC.L    $1f1f003f
  524.     DC.L    $1f3f007f
  525.     DC.L    $005f00df
  526.     DC.L    $007f00ff
  527.     DC.L    $009f00ff
  528.     DC.L    $00bf00ff
  529.     DC.L    $2fdf00ff
  530.     DC.L    $5fff00ff
  531.     DC.L    $8fff00ff
  532.     DC.L    $bfff00ff
  533.     DC.L    $efff00ff
  534.     DC.L    $ffff00ff
  535.     DC.L    $ffff00ff
  536.     DC.L    $ffff00ff
  537.     DC.L    $ffff00ff
  538.     DC.L    $ffff00ff
  539.     DC.L    $ffff00ff
  540.     DC.L    $ffff00ff
  541. .end:
  542.  
  543. Radial.p56:
  544.     INCBIN    RADIAL2.P56
  545. Radial.p56End:
  546.     EVEN
  547.  
  548. Radial.trajRout:
  549.     DC.L    Radial.normalTraject
  550.  
  551. ;======= OBJECT RESERVES ===================================================
  552.  
  553.     BSS
  554.  
  555. ;    DS.W    1
  556.  
  557. Radial.buf1:
  558.     DS.W    320*200
  559. Radial.buf2:
  560.     DS.W    320*200
  561. Radial.pal:
  562.     DS.W    256
  563. Radial.palr:
  564.     DS.L    256
  565. Radial.pald:
  566.     DS.L    256*256
  567.  
  568. Radial.xoff:
  569.     DS.W    1
  570. Radial.yoff:
  571.     DS.W    1
  572. Radial.xoffl:
  573.     DS.L    1
  574. Radial.yoffl:
  575.     DS.L    1
  576.  
  577. Radial.wpic:
  578.     DS.W    320*200
  579. Radial.wpic2:
  580.     DS.W    320*200
  581.  
  582. Radial.zoomStep:
  583.     DS.W    1
  584. Radial.numLayers:
  585.     DS.W    1
  586.  
  587. Radial.paintRout:
  588.     DS.L    1
  589. Radial.detail:
  590.     DS.W    1
  591. stepTable:
  592.     DS.W    160
  593. stepTableY:
  594.     DS.L    100
  595. Radial.fading:
  596.     DS.W    1
  597. Radial.fadeStart:
  598.     DS.W    1
  599. Radial.fadePos:
  600.     DS.W    1
  601.