home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / JULIA.SO < prev    next >
Text File  |  2002-11-11  |  9KB  |  484 lines

  1. ; Morphing julia fractal.. For delta.
  2.  
  3. ******** OBJECT EQUATES ********
  4.  
  5. Julia.ITER_LOG:        =    5
  6. Julia.ITERATIONS:    =    1<<Julia.ITER_LOG
  7. Julia.INTERVAL:        =    1<<7
  8.  
  9. ******** OBJECT TABLE ********
  10.  
  11. * Must be first in object!!
  12. Julia.table:
  13.     DC.L    Julia.mainLoop
  14.     DC.L    Julia.init
  15.     DC.L    Julia.setRes
  16.     DC.L    0
  17.  
  18. ******** RESOLUTION SETTING ROUTINE ********
  19.  
  20. Julia.setRes:
  21.     IFEQ    testmode
  22.     move.l    #rts,vbl_gfx
  23.  
  24.     move.w    $0468.w,d0
  25. .ck468:    cmp.w    $0468.w,d0
  26.     beq.s    .ck468
  27.     move.w    monitormode,d0
  28.     cmpi.w    #vga60,d0
  29.     beq.s    .vga60
  30.     cmpi.w    #vga100,d0
  31.     beq.s    .vga100
  32.     cmpi.w    #rgb50,d0
  33.     beq.s    .rgb50
  34. * Unknown monitormode..
  35.     rts
  36. .vga60:    bra.l    vga60_16bit_160_200
  37. .vga100:bra.l    vga100_16bit_160_100
  38. .rgb50:    bra.l    rgb50_16bit_320_100
  39.     ENDC
  40.     rts
  41.  
  42. ******** INIT SUBROUTINE ********
  43.  
  44. * OUTPUT: d0.l: 0   = All clear.
  45. *               neg = Error! Not initialized!
  46. Julia.init:
  47.     lea    Julia.palette,a0
  48.     lea    Julia.flowPal,a1
  49.     bsr.w    Julia.makeColorFlow
  50.  
  51. .success:
  52.     moveq    #0,d0
  53.     rts
  54. .error:    moveq    #-1,d0
  55.     rts
  56.  
  57. ******** REALTIME INIT SUBROUTINE ********
  58.  
  59. Julia.realtimeInit:
  60. * Kicks in P56 DSP-program..
  61.     move.l    #(Julia.p56End-Julia.p56)/3,d0
  62.     lea    Julia.p56,a0
  63.     bsr.l    Dsp.loadProgram
  64.  
  65.     move.l    $04BA.w,Julia.startTime
  66.     rts
  67.  
  68. ******** SCREENINIT SUBROUTINE ********
  69.  
  70. Julia.initScreen:
  71. * Insert screenarea initialising, etc. in here!
  72.     rts
  73.  
  74. ******** MAINLOOP SUBROUTINE ********
  75.  
  76. Julia.mainLoop:
  77.     move.l    frmcnt,d0
  78.     sub.l    lastframecount,d0
  79.     bne.s    .end_realtime_init
  80.     move.l    d0,-(sp)
  81.     bsr.w    Julia.realtimeInit
  82.     move.l    (sp)+,d0
  83. .end_realtime_init:
  84.     cmpi.l    #3,d0
  85.     bhs.s    .end_screeninit
  86.     bsr.w    Julia.initScreen
  87. .end_screeninit:
  88.  
  89. ; Control mechanism.. Just a lame PI one..
  90.     move.l    frmcnt,d0
  91.     sub.l    lastframecount,d0
  92.     move.l    $04BA.w,d1
  93.     sub.l    Julia.startTime,d1
  94.     addi.l    #$00000800,d1
  95.     move.l    d1,d4
  96.  
  97.     lea    Julia.timeTable,a0
  98.     move.l    d0,d2
  99.     andi.w    #Julia.INTERVAL-1,d2
  100.     move.l    (a0,d2.l*4),d3                ; d3.l=last frame's time 
  101.     sub.l    d3,d4                    ; d4.l=current-last frame's time
  102. ; d4.l=current interval over Julia.INTERVAL frames
  103.  
  104.     move.l    d1,(a0,d2.l*4)                ; Store current time.
  105. ; d3.l=previous interval
  106.  
  107.     mulu.w    #$1800/Julia.INTERVAL,d4
  108.  
  109.     move.w    $04BC.w,d0
  110.     sub.w    Julia.startTime+2,d0
  111.     addi.w    #$0800,d0
  112.     move.w    d0,d2
  113.     mulu.w    #5,d0
  114.     lsr.w    #4,d0
  115.     lsr.w    #3,d2
  116.     lea    sine_tbl,a0
  117.     Do_SinModulo    d0
  118.     Do_SinModulo    d2
  119.     Get_SinCos    a0,d0,d0,d1
  120.     Get_Sin    a0,d2,d2
  121.     asr.w    #3,d2
  122.     addi.w    #$6000,d2
  123.     move.w    #$6000,d2
  124. ;    move.w    d4,d2
  125.     muls.w    d2,d0
  126.     muls.w    d2,d1
  127.     add.l    d0,d0
  128.     add.l    d1,d1
  129.     swap    d0
  130.     swap    d1
  131.     move.w    d0,Julia.x
  132.     move.w    d1,Julia.y
  133.     bsr.w    Julia.paintZoomed
  134.  
  135.     IFEQ    testmode
  136.     lea    scr,a0
  137.     move.l    (a0)+,d0
  138.     move.l    (a0)+,d1
  139.     move.l    (a0),-4(a0)
  140.     move.l    d0,(a0)
  141.     move.l    d1,-8(a0)
  142.     move.l    d0,d1
  143.     lsr.w    #8,d0
  144.     move.l    d0,$ffff8200.w
  145.     move.b    d1,$ffff820d.w
  146.     ENDC
  147.  
  148.     move.l    frmcnt,d0
  149.     sub.l    lastframecount,d0
  150.     bne.s    .res_done
  151.     bsr.w    Julia.setRes
  152. .res_done:
  153.  
  154.     rts
  155.  
  156. ******** OBJECT SUBROUTINES ********
  157.  
  158. * INPUT:
  159. * a0: highcolor buffer to write to
  160. * a1: instruction table 
  161. Julia.makeColorFlow:
  162.     move.l    a0,-(sp)
  163.  
  164.     move.w    (a1)+,d7
  165.     moveq    #0,d0
  166.     move.w    (a1)+,d0
  167.     moveq    #1,d6
  168.     lsl.w    d0,d6
  169.     move.w    d7,d5
  170.     mulu.w    d6,d5
  171.     subq.w    #1,d6
  172.     movea.w    d6,a5
  173.     subq.w    #1,d7
  174.  
  175. .loop:    move.l    (a1)+,d1
  176.     move.l    (a1),d2
  177.     move.l    d1,d3
  178.     move.l    d2,d4
  179.     lsr.l    #8,d3
  180.     lsr.l    #8,d4
  181.     clr.w    d3
  182.     clr.w    d4
  183.     sub.l    d3,d4
  184.     asr.l    d0,d4
  185.     move.l    a0,a6
  186.  
  187. .red_loop:
  188.     swap    d3
  189.     move.w    d3,d5
  190.     lsl.w    #8,d5
  191.     andi.w    #$f800,d5
  192.     move.w    d5,(a0)+
  193.     swap    d3
  194.     add.l    d4,d3
  195.     dbra    d6,.red_loop
  196.  
  197.     move.w    a5,d6
  198.     move.l    a6,a0
  199.     move.l    d1,d3
  200.     move.l    d2,d4
  201.     andi.l    #$00ff0000,d3
  202.     andi.l    #$00ff0000,d4
  203.     sub.l    d3,d4
  204.     asr.l    d0,d4
  205.  
  206. .green_loop:
  207.     swap    d3
  208.     move.w    d3,d5
  209.     lsl.w    #3,d5
  210.     andi.w    #$07e0,d5
  211.     or.w    d5,(a0)+
  212.     swap    d3
  213.     add.l    d4,d3
  214.     dbra    d6,.green_loop
  215.  
  216.     move.l    a6,a0
  217.     move.w    a5,d6
  218.     moveq    #0,d3
  219.     moveq    #0,d4
  220.     move.b    d1,d3
  221.     move.b    d2,d4
  222.     swap    d3
  223.     swap    d4
  224.     sub.l    d3,d4
  225.     asr.l    d0,d4
  226.  
  227. .blue_loop:
  228.     swap    d3
  229.     move.w    d3,d5
  230.     lsr.w    #3,d5
  231.     andi.w    #$001f,d5
  232.     or.w    d5,(a0)+
  233.     swap    d3
  234.     add.l    d4,d3
  235.     dbra    d6,.blue_loop
  236.  
  237.     move.w    a5,d6
  238.     dbra    d7,.loop
  239.  
  240.     movea.l    (sp)+,a1
  241.     rts
  242.  
  243. Julia.paintZoomed:
  244.     move.w    #$7FFF,d4
  245.     move.w    d4,d0
  246.     move.w    d4,d1
  247.     move.w    d4,d2
  248.     move.w    d4,d5
  249.     muls.w    #-80,d0
  250.     muls.w    #-50,d1
  251.     muls.w    #+160,d2
  252.     clr.l    d3
  253.     clr.l    d4
  254.     muls.w    #+100,d5
  255.     bsr.s    Julia.paintDsp
  256.     rts
  257.  
  258. ; Mandelbrot zoomer, 160*100 highcolor, DSP assisted.
  259. ; INPUT:
  260. ; d0.w: topleft x (2:14)
  261. ; d1.w: topleft y (2:14)
  262. ; d2.w: topright width (2:14)
  263. ; d3.w: topright height (2:14)
  264. ; d4.w: bottomleft width (2:14)
  265. ; d5.w: bottomleft height (2:14)
  266. Julia.paintDsp:
  267.     movem.w    Julia.x,d6/d7
  268.     lsl.l    #8,d6
  269.     lsl.l    #7,d7
  270.     sendLongToDsp    d6            ; Send jx.
  271.     sendLongToDsp    d7            ; Send jy.
  272.     muls.l    #3,d0
  273.     muls.l    #3,d1
  274.     sendLongToDsp    d0            ; Send lx.
  275.     sendLongToDsp    d1            ; Send ty.
  276.     divs.l    #160/3,d2
  277.     divs.l    #160/3,d3
  278.     divs.l    #100/3,d4
  279.     divs.l    #100/3,d5
  280.     sendLongToDsp d2            ; Send hdx.
  281.     sendLongToDsp d3            ; Send hdy.
  282.     sendLongToDsp d4            ; Send vdx.
  283.     sendLongToDsp d5            ; Send vdy.
  284.     clr.l    d6
  285.     moveq    #50-1,d7
  286.     movea.l    scr,a0
  287.     lea    Julia.palette,a1
  288.  
  289.     move.w    monitormode,d0
  290.     cmpi.w    #vga60,d0
  291.     beq.s    Julia.paintDspVga60
  292.     cmpi.w    #vga100,d0
  293.     beq.s    Julia.paintDspVga100
  294.     cmpi.w    #rgb50,d0
  295.     beq.s    Julia.paintDspRgb50
  296.  
  297. Julia.paintDspVga100:
  298.     lea    (160*100)*2(a0),a6
  299.     lea    $ffffa206.w,a2
  300.     lea    $ffffa202.w,a3
  301.  
  302. .yloop:    swap    d7
  303.     move.w    #160-1,d7
  304.  
  305. .xloop:    btst.b    #0,(a3)
  306.     beq.s    .xloop
  307.     move.w    (a2),d6
  308.     move.w    (a1,d6.l*2),(a0)+
  309.     move.w    (a1,d6.l*2),-(a6)
  310.     dbra    d7,.xloop
  311.  
  312.     swap    d7
  313.     dbra    d7,.yloop
  314.     rts
  315.  
  316. Julia.paintDspVga60:
  317.     lea    (160*200*2.l,a0),a4
  318.     lea    -160*2(a4),a5
  319.     lea    160*2(a0),a6
  320.     movea.w    #160*2,a3
  321.     lea    $ffffa206.w,a2
  322.  
  323. .yloop:    swap    d7
  324.     move.w    #160-1,d7
  325.  
  326. .xloop:    btst.b    #0,$ffffa202.w
  327.     beq.s    *-6
  328.     move.w    (a2),d6
  329.     move.w    (a1,d6.l*2),d0
  330.     move.w    d0,(a0)+
  331.     move.w    d0,(a6)+
  332.     move.w    d0,-(a4)
  333.     move.w    d0,-(a5)
  334.     dbra    d7,.xloop
  335.  
  336.     swap    d7
  337.     adda.l    a3,a0
  338.     adda.l    a3,a6
  339.     suba.l    a3,a4
  340.     suba.l    a3,a5
  341.     dbra    d7,.yloop
  342.     rts
  343.  
  344. Julia.paintDspRgb50:
  345.     lea    (160*100*4.l,a0),a6
  346.     lea    $ffffa206.w,a2
  347.     lea    $ffffa202.w,a3
  348.  
  349. .yloop:    swap    d7
  350.     move.w    #160-1,d7
  351.  
  352. .xloop:    btst.b    #0,(a3)
  353.     beq.s    .xloop
  354.     move.w    (a2),d6
  355.     move.w    (a1,d6.l*2),d0
  356.     move.w    d0,(a0)+
  357.     move.w    d0,(a0)+
  358.     move.w    d0,-(a6)
  359.     move.w    d0,-(a6)
  360.     dbra    d7,.xloop
  361.  
  362.     swap    d7
  363.     dbra    d7,.yloop
  364.     rts
  365.  
  366. ; Julia zoomer, 160*100 highcolor.
  367. ; INPUT:
  368. ; d0.w: left x (2:14)
  369. ; d1.w: top y (2:14)
  370. ; d2.w: width (2:14)
  371. ; d3.w: height (2:14)
  372. ;--------------------
  373. ;             
  374. ; f(c,n) = f(c,n-1)^2 + j, f(c,0) = c
  375. ; c : complex number: x, y denote Re{c}, Im{c}
  376. Julia.paint:
  377.     lea    Julia.palette,a1
  378.     andi.l    #$FFFF,d2
  379.     andi.l    #$FFFF,d3
  380.     move.l    d2,d4
  381.     move.l    d3,d5
  382.     divu.w    #160,d4
  383.     divu.w    #100,d5
  384.     move.w    d0,.x                ; d4.w = lx (2:14)
  385.     movea.l    d0,a3
  386.     move.w    d1,.y                ; d5.w = ty (2:14)
  387.     movea.l    scr,a0
  388.     moveq    #100-1,d7
  389.     movea.l    #80<<22,a6
  390.     moveq    #7*2,d3
  391.     move.w    Julia.x,a4
  392.     move.w    Julia.y,a5
  393.  
  394. .yloop:    swap    d7
  395.     move.w    #160-1,d7
  396.  
  397. .xloop:    moveq    #Julia.ITERATIONS-1,d6
  398.     movem.w    .x(pc),d0/d1
  399.  
  400. .iteration_loop:
  401. ; Calculate f(c)^2 = x*x-y*y + i(x*y+x*y)
  402.     move.w    d1,d2                ; d2.w=y
  403.     muls.w    d0,d1                ; d1.l=x*y/2
  404.     lsl.l    #2,d1                ; d1.l=x*y+x*y=Y
  405.     muls.w    d0,d0                ; d0.l=x*x/2
  406.     muls.w    d2,d2                ; d2.l=y*y/2
  407. ; Now check if it is within the circle.
  408. ; |C| = |X + i*Y| = sqrt(X*X+Y*Y) < 2.0
  409. ; faster: |C|^2/2 = (X*X+Y*Y)/2 < 2.0
  410.     movea.l    d2,a2
  411.     adda.l    d0,a2
  412.     cmpa.l    a6,a2
  413.     bge.s    .end_iterator
  414.     sub.l    d2,d0                ; d0.l=(x*x-y*y)/2
  415.     add.l    d0,d0                ; d0.l=x*x-y*y=X
  416.     asr.l    d3,d0
  417.     asr.l    d3,d1
  418.     add.w    a4,d0                ; d0.w=X+j.x
  419.     add.w    a5,d1                ; d1.w=Y+j.y
  420.     dbra    d6,.iteration_loop
  421.  
  422. .end_iterator:
  423.     move.w    2(a1,d6.w*2),(a0)+
  424.  
  425.     add.w    d4,.x                ; x := x + dx
  426.     dbra    d7,.xloop
  427.  
  428.     move.w    a3,.x
  429.     add.w    d5,.y                ; y := y + dy
  430.     swap    d7
  431.     dbra    d7,.yloop
  432.     rts
  433.  
  434. .x:    DC.W    0
  435. .y:    DC.W    0
  436.  
  437. ******** OBJECT DATA ********
  438.  
  439.     DATA
  440.  
  441. Julia.p56:
  442.     INCBIN    JULIA.P56
  443. Julia.p56End:
  444.     EVEN
  445.  
  446. Julia.flowPal:
  447.     DC.W    4
  448.     DC.W    Julia.ITER_LOG-2
  449. .start:    ;DC.L    $00000000
  450.     ;DC.L    $7F0000FF
  451.     ;DC.L    $FF0000FF
  452.     ;DC.L    $FF00007F
  453.     ;DC.L    $FF000000
  454.     DC.L    $9F0000FF
  455.     DC.L    $7F0000FF
  456.     DC.L    $5F0000BF
  457.     DC.L    $3F00007F
  458.     DC.L    $0000003F
  459.  
  460. .end:    
  461.  
  462. Julia.radius:
  463.     DC.W    $6000
  464.  
  465. ******** OBJECT RESERVES ********
  466.  
  467.     BSS
  468.  
  469. Julia.palette:
  470.     DS.W    Julia.ITERATIONS
  471.     DS.L    1
  472.  
  473. Julia.x:DS.W    1
  474. Julia.y:DS.W    1
  475.  
  476. Julia.recentFrames:
  477.     DS.L    1
  478. Julia.startTime:
  479.     DS.L    1
  480.  
  481. Julia.timeTable:
  482.     DS.L    Julia.INTERVAL
  483.  
  484. ******** END OF DEMO-EFFECT OBJECT ********