home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / SPIRAL4.SO < prev    next >
Text File  |  2003-12-25  |  19KB  |  1,067 lines

  1. ; Merging spirals screen, for delta (originally). Uses Ufly.
  2. ; Rotating spiral experiment. Let's hope for some psychedelic shit.
  3. ; Parametrised, elegant and straightforward. Sadly, still no quadrangles.
  4. ;
  5. ; Newest version. Inspired by some pc shit.
  6. ;
  7. ; Now used for 'out' demo.
  8. ;
  9. ; Added some different trajectories..
  10.  
  11.     IFND    DEMO_SYSTEM
  12. testmode:    =    0
  13.     move.l    #Spiral.table,fxAdr
  14.     INCLUDE    TESTER.S
  15.     TEXT
  16.     INCLUDE    TEXTURE.I
  17.     TEXT
  18.     INCLUDE    SFLY_DSP.S
  19.     TEXT
  20.     ENDC
  21.  
  22. ;======= OBJECT EQUATES ========
  23.  
  24. Spiral.STEPS:        =    30
  25. Spiral.LENGTH_LOG:    =    7
  26. Spiral.LENGTH:        =    1<<Spiral.LENGTH_LOG
  27. Spiral.SPEED:        =    50
  28.  
  29. ;======= OBJECT TABLE ========
  30.  
  31. ; Must be first in object!!
  32. Spiral.table:
  33.     DC.L    Spiral.mainLoop
  34.     DC.L    Spiral.init
  35.     DC.L    Spiral.initRT
  36.     DC.L    Spiral.deinitRT
  37.     DC.L    Spiral.switchWorldRot
  38.     DC.L    Spiral.zoomIn
  39.     DC.L    Spiral.zoomOut
  40.     DC.L    Spiral.rotXLeft
  41.     DC.L    Spiral.rotXRight
  42.     DC.L    Spiral.rotYLeft
  43.     DC.L    Spiral.rotYRight
  44.     DC.L    Spiral.toggleCloud
  45.     DC.L    0
  46.  
  47. ;======= RESOLUTION SETTING ROUTINE ========
  48.  
  49. Spiral.setRes:
  50.     move.l    frmcnt,d0
  51.     cmp.l    lastframecount,d0
  52.     beq.s    .end
  53.  
  54.     move.l    #rts,vbl_gfx
  55.  
  56.     move.w    monitormode,d0
  57.     cmpi.w    #vga60,d0
  58.     beq.s    .vga60
  59.     cmpi.w    #vga100,d0
  60.     beq.s    .vga100
  61.     cmpi.w    #rgb50,d0
  62.     beq.s    .rgb50
  63. ; Unknown monitormode..
  64.     rts
  65. .vga60:    bra.l    vga60_16bit_320_200
  66. .vga100:bra.l    vga100_16bit_320_200
  67. .rgb50:    bra.l    rgb50_16bit_320_200
  68. .end:    rts
  69.  
  70. ;======= INIT SUBROUTINE ========
  71.  
  72. ; OUTPUT:
  73. ; d0.l: =0 all clear, <0 error
  74. Spiral.init:
  75.     lea    sine_tbl,a1
  76.     bsr.l    Matrix.init
  77.  
  78.     lea    Spiral.palInstTable,a1
  79.     lea    Spiral.pal,a0
  80.     bsr.l    Pal.makeGradientHc
  81.  
  82.     lea    Spiral.texture,a0
  83.     move.l    #"Word",(a0)+
  84.     move.l    #"PerP",(a0)+
  85.     move.l    #"ixel",(a0)+
  86.     move.l    #$00400040,(a0)+
  87.     lea    Spiral.pal,a1
  88. ;    lea    Spiral.incPal,a1
  89.     moveq    #6,d0
  90.     moveq    #3,d1
  91.     move.l    #$127A73B2,d2
  92.     bsr.l    Texture.createWords2
  93.  
  94. .success:
  95.     moveq    #0,d0
  96.     rts
  97. .error:    moveq    #-1,d0
  98.     rts
  99.  
  100. ;======= REALTIME INIT SUBROUTINE ========
  101.  
  102. Spiral.initRT:
  103.     move.l    #Spiral.setRes,vbl_gfx
  104.  
  105.     bsr.l    HumanFly.init
  106.  
  107.     lea    Viewport.settingsTable,a0
  108.     move.w    #320,Viewport.XSCREEN(a0)
  109.     move.w    #200,Viewport.YSCREEN(a0)
  110.     move.w    #0,Viewport.XSTART(a0)
  111.     move.w    #0,Viewport.YSTART(a0)
  112.     move.w    #320,Viewport.XEND(a0)
  113.     move.w    #200,Viewport.YEND(a0)
  114.     move.w    #160,Viewport.XCENTER(a0)
  115.     move.w    #100,Viewport.YCENTER(a0)
  116.     move.w    #256+32,Viewport.ASPECT(a0)
  117.     move.w    #$100,Viewport.FOCAL(a0)
  118.     bsr.l    Viewport.update
  119.  
  120.     lea    Spiral.textureTable,a0
  121.     bsr.l    Polygon.init
  122.  
  123.     bsr.l    ObjectRegistry.clear
  124.  
  125.     move.w    #$140,d0
  126.     move.w    #0,d1
  127.     lea    Spiral.object1,a0
  128.     bsr    Spiral.generateSolid
  129. ; d0.l=size
  130.  
  131.     lea    Spiral.object1,a0
  132.     bsr.l    ObjectRegistry.set
  133.     tst.w    d0
  134.     bmi.s    .error
  135.  
  136.     lea    Spiral.cloud,a0
  137.     move.l    #Spiral.cloudEnd-Spiral.cloud,d0
  138.     bsr.l    ObjectRegistry.set
  139.     tst.w    d0
  140.     bmi.s    .error
  141.  
  142.     move.w    #Primitive.WORD|Primitive.CEILADD,d0
  143.     moveq    #0,d1
  144.     bsr    Primitive.setPaintMode
  145.  
  146.     move.w    $04BC.w,Spiral.startTime
  147.  
  148.     IFNE    0
  149. ; Turn write-alloc and datacache lameness off (better for random access).
  150.     movec    cacr,d0
  151.     move.l    d0,old_ca
  152.     bclr    #13,d0                ; Disable write-alloc.
  153.     bclr    #8,d0                 ; Disable datacache.
  154.     bset    #11,d0                ; Clear datacache.
  155.     bset    #0,d0                ; Enable instruction-burst.
  156.     movec    d0,cacr
  157.     ENDC
  158.  
  159. .success:
  160.     moveq    #0,d0
  161.     rts
  162. .error:    moveq    #-1,d0
  163.     rts
  164.  
  165. Spiral.deinitRT:
  166.     IFNE    0
  167. ; Restore cache to original state.
  168.     move.l    old_ca(pc),d0
  169.     movec    d0,cacr
  170.     ENDC
  171.  
  172.     clr.l    d0
  173.     rts
  174.  
  175. old_ca:    DS.L    1
  176.  
  177. ;======= SCREENINIT SUBROUTINE ========
  178.  
  179. Spiral.initScreen:
  180.     rts
  181.  
  182. ;======= MAINLOOP SUBROUTINE ========
  183.  
  184. Spiral.mainLoop:
  185.     move.w    $0468.w,.old468
  186.  
  187.     movea.l    scr,a0
  188.     bsr.l    Primitive.setScreenbuffer
  189.  
  190.     move.l    frmcnt,d0
  191.     sub.l    lastframecount,d0
  192.     cmpi.l    #3,d0
  193.     bhs.s    .end_screeninit
  194.     bsr    Spiral.initScreen
  195. .end_screeninit:
  196.  
  197. ; zoom..
  198.     move.w    Spiral.zoomDir,d2
  199.     beq.s    .end_zoom
  200.     move.w    Spiral.oldZ,d0
  201.     move.w    $04BC.w,d1
  202.     sub.w    Spiral.zoomStart,d1
  203.     lsl.w    #4,d1
  204.     cmpi.w    #1000,d1
  205.     blt.s    .in_range
  206.     move.w    #1000,d1
  207.     muls.w    d2,d1
  208.     clr.w    Spiral.zoomDir
  209.     add.w    d1,d0
  210.     move.w    d0,Spiral.oldZ
  211.     move.w    d0,Spiral.z
  212.     bra.s    .end_zoom
  213. .in_range:
  214.     muls.w    d2,d1
  215.     add.w    d1,d0
  216.     move.w    d0,Spiral.z
  217. .end_zoom:
  218.  
  219. ; x rotation..
  220.     move.w    Spiral.xRotDir,d2
  221.     beq.s    .end_xrot
  222.     move.w    Spiral.oldXRot,d0
  223.     move.w    $04BC.w,d1
  224.     sub.w    Spiral.xRotStart,d1
  225.     lsl.w    #3,d1
  226.     cmpi.w    #sintbllen/4,d1
  227.     blt.s    .in_range_xr
  228.     move.w    #sintbllen/4,d1
  229.     muls.w    d2,d1
  230.     clr.w    Spiral.xRotDir
  231.     add.w    d1,d0
  232.     move.w    d0,Spiral.oldXRot
  233.     move.w    d0,Spiral.xRot
  234.     bra.s    .end_xrot
  235. .in_range_xr:
  236.     muls.w    d2,d1
  237.     add.w    d1,d0
  238.     move.w    d0,Spiral.xRot
  239. .end_xrot:
  240.  
  241. ; y rotation..
  242.     move.w    Spiral.yRotDir,d2
  243.     beq.s    .end_yrot
  244.     move.w    Spiral.oldYRot,d0
  245.     move.w    $04BC.w,d1
  246.     sub.w    Spiral.yRotStart,d1
  247.     lsl.w    #3,d1
  248.     cmpi.w    #sintbllen/4,d1
  249.     blt.s    .in_range_yr
  250.     move.w    #sintbllen/4,d1
  251.     muls.w    d2,d1
  252.     clr.w    Spiral.yRotDir
  253.     add.w    d1,d0
  254.     move.w    d0,Spiral.oldYRot
  255.     move.w    d0,Spiral.yRot
  256.     bra.s    .end_yrot
  257. .in_range_yr:
  258.     muls.w    d2,d1
  259.     add.w    d1,d0
  260.     move.w    d0,Spiral.yRot
  261. .end_yrot:
  262.  
  263. ; New x,y,z rotation..
  264.     bsr    getTime
  265.     move.w    d0,d3
  266.     cmpi.l    #1024,d0
  267.     blt.s    .time_ok
  268.     move.w    #1024,d3
  269. .time_ok:
  270.     Get_Sin    sine_tbl+2,d3,d3
  271.     neg.w    d3
  272.     eori.w    #$8000,d3
  273.     mulu.w    d3,d0
  274.     swap    d0
  275.     move.w    d0,d1
  276.     move.w    d0,d2
  277.     mulu.w    #3,d1
  278.     mulu.w    #7,d2
  279.     lsr.l    d1
  280.     lsr.l    #2,d2
  281.     movem.w    d0-d2,Spiral.xRot
  282.  
  283. ; Move sparks.
  284.     lea    Spiral.cloud,a0
  285.     lea    Spiral.cloudOrg,a1
  286.     move.w    (a0),d7
  287.     addq    #4,a0
  288.     subq.w    #1,d7
  289. .loop:    clr.l    d0
  290.     move.w    (a1)+,d0
  291.     move.w    $04BC.w,d1
  292.     lsl.w    #4,d1
  293.     add.w    d1,d0
  294.     divu.w    #(Spiral.STEPS+2)*Spiral.LENGTH,d0
  295.     swap    d0
  296.     subi.w    #(Spiral.STEPS+2)*Spiral.LENGTH/2,d0
  297.     move.w    d0,Vertex.Z(a0)
  298.     addq    #Vertex.SIZE,a0
  299.     dbf    d7,.loop
  300.  
  301.     lea    Spiral.cloud,a0
  302.     moveq    #1,d0
  303.     moveq    #%0001,d1
  304.     bsr    ObjectRegistry.replace
  305.  
  306.     bsr    Spiral.paint
  307.  
  308. ; bg color shit!
  309.     tst.l    Spiral.bgCol
  310.     beq.s    .end_bgcol
  311.     clr.l    Spiral.bgCol
  312. .end_bgcol:
  313.  
  314.     IFEQ    testmode
  315.     lea    scr,a0
  316.     move.l    (a0)+,d0
  317.     move.l    (a0)+,d1
  318.     move.l    (a0),-4(a0)
  319.     move.l    d0,(a0)
  320.     move.l    d1,-8(a0)
  321.     move.l    d0,d1
  322.     lsr.w    #8,d0
  323.     move.l    d0,$ffff8200.w
  324.     move.b    d1,$ffff820d.w
  325.     ENDC
  326.  
  327.     move.w    .old468(pc),d0
  328. .wait:    cmp.w    $0468.w,d0
  329.     beq.s    .wait
  330.  
  331. .end:    rts
  332.  
  333. .old468:DC.W    0
  334.  
  335. ;======= OBJECT SUBROUTINES ========
  336.  
  337. Spiral.toggleCloud:
  338.     not.w    Spiral.cloudOn
  339.     not.l    Spiral.bgCol
  340.     rts
  341.  
  342. Spiral.switchWorldRot:
  343.     not.w    Spiral.worldRot
  344.     move.w    $04BC.w,Spiral.worldRotStart
  345. ;    not.l    Spiral.bgCol
  346.     rts
  347.  
  348. Spiral.zoomIn:
  349.     move.w    #-1,Spiral.zoomDir
  350.     move.w    Spiral.z,Spiral.oldZ
  351.     move.w    $04BC.w,Spiral.zoomStart
  352.     not.l    Spiral.bgCol
  353.     rts
  354.  
  355. Spiral.zoomOut:
  356.     move.w    #+1,Spiral.zoomDir
  357.     move.w    Spiral.z,Spiral.oldZ
  358.     move.w    $04BC.w,Spiral.zoomStart
  359.     not.l    Spiral.bgCol
  360.     rts
  361.  
  362. Spiral.rotXLeft:
  363.     move.w    #-1,Spiral.xRotDir
  364.     move.w    Spiral.xRot,Spiral.oldXRot
  365.     move.w    $04BC.w,Spiral.xRotStart
  366. ;    not.l    Spiral.bgCol
  367.     rts
  368.  
  369. Spiral.rotXRight:
  370.     move.w    #+1,Spiral.xRotDir
  371.     move.w    Spiral.xRot,Spiral.oldXRot
  372.     move.w    $04BC.w,Spiral.xRotStart
  373. ;    not.l    Spiral.bgCol
  374.     rts
  375.  
  376. Spiral.rotYLeft:
  377.     move.w    #-1,Spiral.yRotDir
  378.     move.w    Spiral.yRot,Spiral.oldYRot
  379. ;    move.w    $04BC.w,Spiral.yRotStart
  380.     rts
  381.  
  382. Spiral.rotYRight:
  383.     move.w    #+1,Spiral.yRotDir
  384.     move.w    Spiral.yRot,Spiral.oldYRot
  385.     move.w    $04BC.w,Spiral.yRotStart
  386. ;    not.l    Spiral.bgCol
  387.     rts
  388.  
  389. ; Generates spiral object.
  390. ;
  391. ; r = (cos(t),sin(t),t), phi(r) = (-sin(t),cos(t),1)/sqrt(2)
  392. ; -                          -
  393. ;
  394. ; v = (cos(t),sin(t),0), u = (sin(t),-cos(t),1)/sqrt(2)
  395. ; -                      -
  396. ;
  397. ; INPUT:
  398. ; d0.w=width [0..$7FFF]
  399. ; d1.w=colornum
  400. ; a0: destination object
  401. ; OUTPUT:
  402. ; d0.l=size
  403. Spiral.generateSolid:
  404.     movea.l    a0,a6
  405.     move.w    d0,d2
  406.     move.w    d1,d6
  407.  
  408.     move.w    #Spiral.STEPS*4+2,(a0)+        ;#vertices+#normals
  409.     clr.w    (a0)+                ;#normals
  410.  
  411.     move.l    a0,-(sp)
  412.     lea    sine_tbl,a1
  413.     move.w    #Spiral.STEPS-1,d7
  414.  
  415. ; a=1/8, l=1/sqrt(9/8)=sqrt(8/9)=2*sqrt(2)/3
  416.  
  417. .loop:    move.w    d7,d0
  418.     mulu.w    #Spiral.SPEED,d0
  419.     Do_SinModulo    d0
  420.     Get_SinCos    a1,d0,d0,d1
  421.     muls.w    d2,d0
  422.     muls.w    d2,d1
  423.     add.l    d0,d0
  424.     add.l    d1,d1
  425.     swap    d0
  426.     swap    d1
  427.     move.w    d7,d3
  428.     lsl.w    #Spiral.LENGTH_LOG,d3
  429.     subi.w    #Spiral.STEPS*Spiral.LENGTH/2,d3
  430.     lea    .temp(pc),a2
  431.     movem.w    d0/d1/d3,(a2)
  432.  
  433. ; Calc u.
  434.     move.w    d7,d0
  435.     mulu.w    #Spiral.SPEED,d0
  436.     Do_SinModulo    d0
  437.     Get_SinCos    a1,d0,d0,d1
  438.     muls.w    #181/2,d0            ; scale up u (thickness)
  439.     muls.w    #181/2,d1            ; scale up u (thickness)
  440.     swap    d0
  441.     swap    d1
  442.     exg.l    d0,d1
  443.     neg.w    d0
  444. ; Calc scalar..
  445.     move.w    #91/2,d3    Spiral.LENGTH-1,d3
  446. ; d0.w=u.x, d1.w=u.y, d3.w=u.z=1/a.
  447.  
  448. ; Calc v vectors.
  449.     move.w    d7,d4
  450.     mulu.w    #Spiral.SPEED,d4
  451.     Do_SinModulo    d4
  452.     Get_SinCos    a1,d4,d4,d5
  453.     lsl.l    #8-1,d4                ; scale up v (thickness)
  454.     lsl.l    #8-1,d5                ; scale up v (thickness)
  455.     swap    d4
  456.     swap    d5
  457. ; d4.w=v.x, d5.w=v.y, v.z=0.
  458.  
  459. ; (+u,0)
  460.     movem.w    (a2),a3-a5
  461.     adda.w    d0,a3
  462.     adda.w    d1,a4
  463.     adda.w    d3,a5
  464.     move.w    a3,(a0)+
  465.     move.w    a4,(a0)+
  466.     move.w    a5,(a0)+
  467.  
  468. ; (0,+v)
  469.     movem.w    (a2),a3-a5
  470.     adda.w    d4,a3
  471.     adda.w    d5,a4
  472.     move.w    a3,(a0)+
  473.     move.w    a4,(a0)+
  474.     move.w    a5,(a0)+
  475.  
  476. ; (-u,0)
  477.     movem.w    (a2),a3-a5
  478.     suba.w    d0,a3
  479.     suba.w    d1,a4
  480.     suba.w    d3,a5
  481.     move.w    a3,(a0)+
  482.     move.w    a4,(a0)+
  483.     move.w    a5,(a0)+
  484.  
  485. ; (0,-v)
  486.     movem.w    (a2),a3-a5
  487.     suba.w    d4,a3
  488.     suba.w    d5,a4
  489.     move.w    a3,(a0)+
  490.     move.w    a4,(a0)+
  491.     move.w    a5,(a0)+
  492.  
  493.     dbf    d7,.loop
  494.  
  495. ; Head and tail vertices...
  496.  
  497.     move.w    #(-1*Spiral.SPEED)&(sintbllen-1),d0
  498.     Get_SinCos    a1,d0,d0,d1
  499.     muls.w    d2,d0
  500.     muls.w    d2,d1
  501.     add.l    d0,d0
  502.     add.l    d1,d1
  503.     swap    d0
  504.     swap    d1
  505.     move.w    d0,(a0)+
  506.     move.w    d1,(a0)+
  507.     move.w    #-(Spiral.STEPS+1)*Spiral.LENGTH/2,(a0)+
  508.  
  509.     move.w    #((Spiral.STEPS+1)*Spiral.SPEED)&(sintbllen-1),d0
  510.     Get_SinCos    a1,d0,d0,d1
  511.     muls.w    d2,d0
  512.     muls.w    d2,d1
  513.     add.l    d0,d0
  514.     add.l    d1,d1
  515.     swap    d0
  516.     swap    d1
  517.     move.w    d0,(a0)+
  518.     move.w    d1,(a0)+
  519.     move.w    #+(Spiral.STEPS+2)*Spiral.LENGTH/2,(a0)+
  520.  
  521. ; --------------------
  522. ; Texel shit!
  523.  
  524.     IFNE    1
  525.  
  526.     movea.l    (sp)+,a5
  527.     move.w    #Spiral.STEPS*4+2,(a0)+        ; #texels
  528.     move.w    #Spiral.STEPS-1,d7
  529.  
  530. .texelloop:
  531.     move.w    d7,d6
  532.     addq.w    #1,d6
  533.     andi.w    #%11111,d6
  534.     lsl.w    #5,d6
  535.     subq.w    #1,d6
  536.     move.w    d6,(a0)+
  537.     move.w    #0,(a0)+
  538.     move.w    d6,(a0)+
  539.     move.w    #63,(a0)+
  540.     move.w    d6,(a0)+
  541.     move.w    #127,(a0)+ #0,(a0)+
  542.     move.w    d6,(a0)+
  543.     move.w    #63,(a0)+ #63,(a0)+
  544.     dbf    d7,.texelloop
  545.  
  546.     ELSE
  547.  
  548.     movea.l    (sp)+,a5
  549.     move.w    #Spiral.STEPS*4+2,(a0)+        ; #texels
  550.     move.w    #Spiral.STEPS-1,d7
  551.  
  552. .texelloop:
  553. ; Calc u.
  554.     move.w    d7,d0
  555.     lsl.w    #7,d0
  556.     Do_SinModulo    d0
  557.     Get_SinCos    a1,d0,d0,d1
  558.     lsl.l    #6,d0
  559.     lsl.l    #6,d1
  560.     swap    d0
  561.     swap    d1
  562.     exg.l    d0,d1
  563.     neg.w    d0
  564. ; Calc scalar..
  565.     moveq    #63,d3
  566. ; d0.w=u.x, d1.w=u.y, d3.w=u.z=1/a.
  567.  
  568. ; Calc v vectors.
  569.     move.w    d7,d4
  570.     lsl.w    #7,d4
  571.     Do_SinModulo    d4
  572.     Get_SinCos    a1,d4,d4,d5
  573.     lsl.l    #7,d4
  574.     lsl.l    #7,d5
  575.     swap    d4
  576.     swap    d5
  577. ; d4.w=v.x, d5.w=v.y, v.z=0.
  578.  
  579. ; (+u/2,+v/2)
  580.     movea.w    #128,a3
  581.     movea.w    #128,a4
  582.     movea.w    #128,a5
  583.     adda.w    d0,a3
  584.     adda.w    d1,a4
  585.     adda.w    d4,a3
  586.     adda.w    d5,a4
  587.     move.w    a3,(a0)+
  588.     move.w    a4,(a0)+
  589.  
  590.     add.w    d0,d0
  591.     add.w    d1,d1
  592.     add.w    d3,d3
  593.     add.w    d4,d4
  594.     add.w    d5,d5
  595.  
  596. ; (+u/2,-v/2)
  597.     suba.w    d4,a3
  598.     suba.w    d5,a4
  599.     move.w    a3,(a0)+
  600.     move.w    a4,(a0)+
  601.  
  602. ; (-u/2,-v/2)
  603.     suba.w    d0,a3
  604.     suba.w    d1,a4
  605.     move.w    a3,(a0)+
  606.     move.w    a4,(a0)+
  607.  
  608. ; (-u/2,+v/2)
  609.     adda.w    d4,a3
  610.     adda.w    d5,a4
  611.     move.w    a3,(a0)+
  612.     move.w    a4,(a0)+
  613.     dbf    d7,.texelloop
  614.  
  615.     ENDC
  616.  
  617. ; Head and tail texels..
  618.     IFNE    1
  619.     move.w    #0,(a0)+
  620.     move.w    #0,(a0)+
  621.     move.w    #(Spiral.STEPS&%11111)<<5-1,(a0)+
  622.     move.w    #0,(a0)+
  623.     ELSE
  624.     move.l    #$00800080,(a0)+
  625.     move.l    #$00800080,(a0)+
  626.     ENDC
  627.  
  628. ;------------
  629. ; Primitives
  630.  
  631. ; Output primitives..
  632.     move.w    #(Spiral.STEPS-1)*8+8,(a0)+        ; #primitives
  633.  
  634.     move.w    #Polygon.TRI|Polygon.TEXTUREMAPPED,d6
  635.  
  636. ; head, tail
  637.     move.w    d6,(a0)+
  638.     clr.w    (a0)+
  639.     move.w    #1,(a0)+
  640.     move.w    #Spiral.STEPS*4+1,(a0)+
  641.     move.l    -6(a0),(a0)+
  642.     move.w    -6(a0),(a0)+
  643.  
  644.     move.w    d6,(a0)+
  645.     move.w    #1,(a0)+
  646.     move.w    #2,(a0)+
  647.     move.w    #Spiral.STEPS*4+1,(a0)+
  648.     move.l    -6(a0),(a0)+
  649.     move.w    -6(a0),(a0)+
  650.  
  651.     move.w    d6,(a0)+
  652.     move.w    #2,(a0)+
  653.     move.w    #3,(a0)+
  654.     move.w    #Spiral.STEPS*4+1,(a0)+
  655.     move.l    -6(a0),(a0)+
  656.     move.w    -6(a0),(a0)+
  657.  
  658.     move.w    d6,(a0)+
  659.     move.w    #3,(a0)+
  660.     clr.w    (a0)+
  661.     move.w    #Spiral.STEPS*4+1,(a0)+
  662.     move.l    -6(a0),(a0)+
  663.     move.w    -6(a0),(a0)+
  664.     
  665.     move.w    d6,(a0)+
  666.     move.w    #Spiral.STEPS*4-3,(a0)+
  667.     move.w    #Spiral.STEPS*4-4,(a0)+
  668.     move.w    #Spiral.STEPS*4,(a0)+
  669.     move.l    -6(a0),(a0)+
  670.     move.w    -6(a0),(a0)+
  671.  
  672.     move.w    d6,(a0)+
  673.     move.w    #Spiral.STEPS*4-2,(a0)+
  674.     move.w    #Spiral.STEPS*4-3,(a0)+
  675.     move.w    #Spiral.STEPS*4,(a0)+
  676.     move.l    -6(a0),(a0)+
  677.     move.w    -6(a0),(a0)+
  678.  
  679.     move.w    d6,(a0)+
  680.     move.w    #Spiral.STEPS*4-1,(a0)+
  681.     move.w    #Spiral.STEPS*4-2,(a0)+
  682.     move.w    #Spiral.STEPS*4,(a0)+
  683.     move.l    -6(a0),(a0)+
  684.     move.w    -6(a0),(a0)+
  685.  
  686.     move.w    d6,(a0)+
  687.     move.w    #Spiral.STEPS*4-4,(a0)+
  688.     move.w    #Spiral.STEPS*4-1,(a0)+
  689.     move.w    #Spiral.STEPS*4,(a0)+
  690.     move.l    -6(a0),(a0)+
  691.     move.w    -6(a0),(a0)+
  692.     
  693.     move.w    #Spiral.STEPS-2,d7
  694.  
  695. .primloop:
  696. ; t1
  697.     move.w    d6,(a0)+
  698.     move.w    d7,d0
  699.     lsl.w    #2,d0                    ; d0.w=(x,y)
  700.     move.w    d0,(a0)+
  701.     move.w    d7,d1
  702.     addq.w    #1,d1
  703.     lsl.w    #2,d1                    ; d1.w=(x,y+1)
  704.     move.w    d1,(a0)+
  705.     move.w    d0,d2
  706.     move.w    d1,d3                    ; d3.w=(x,y+1)
  707.     addq.w    #1,d1                    ; d1.w=(x+1,y+1)
  708.     move.w    d1,(a0)+
  709.     addq.w    #1,d0                    ; d0.w=(x+1,y)
  710.     move.l    -6(a0),(a0)+
  711.     move.w    -6(a0),(a0)+
  712.  
  713.     IFNE    1
  714. ; t1a
  715.     move.w    d6,(a0)+
  716.     move.w    d0,(a0)+
  717.     subq.w    #1,d0
  718.     move.w    d0,(a0)+
  719.     addq.w    #1,d0
  720.     move.w    d1,(a0)+
  721.     move.l    -6(a0),(a0)+
  722.     move.w    -6(a0),(a0)+
  723.     ENDC
  724. ; t2
  725.     move.w    d6,(a0)+
  726.     move.w    d0,(a0)+
  727.     move.w    d1,(a0)+
  728.     addq.w    #1,d1                    ; d1.w=(x+2,y+1)
  729.     move.w    d1,(a0)+
  730.     addq.w    #1,d0                    ; d0.w=(x+2,y)
  731.     move.l    -6(a0),(a0)+
  732.     move.w    -6(a0),(a0)+
  733.  
  734.     IFNE    1
  735. ; t2a
  736.     move.w    d6,(a0)+
  737.     move.w    d0,(a0)+
  738.     subq.w    #1,d0
  739.     move.w    d0,(a0)+
  740.     addq.w    #1,d0
  741.     move.w    d1,(a0)+
  742.     move.l    -6(a0),(a0)+
  743.     move.w    -6(a0),(a0)+
  744.     ENDC
  745.  
  746. ; t3
  747.     move.w    d6,(a0)+
  748.     move.w    d0,(a0)+
  749.     move.w    d1,(a0)+
  750.     addq.w    #1,d1                    ; d1.w=(x+3,y+1)
  751.     move.w    d1,(a0)+
  752.     addq.w    #1,d0                    ; d0.w=(x+3,y)
  753.     move.l    -6(a0),(a0)+
  754.     move.w    -6(a0),(a0)+
  755.  
  756.     IFNE    1
  757. ; t3a
  758.     move.w    d6,(a0)+
  759.     move.w    d0,(a0)+
  760.     subq.w    #1,d0
  761.     move.w    d0,(a0)+
  762.     addq.w    #1,d0
  763.     move.w    d1,(a0)+
  764.     move.l    -6(a0),(a0)+
  765.     move.w    -6(a0),(a0)+
  766.     ENDC
  767.  
  768. ; t4
  769.     move.w    d6,(a0)+
  770.     move.w    d0,(a0)+                ; d0.w=(x+3,y)
  771.     move.w    d1,(a0)+                ; d1.w=(x+3,y+1)
  772.     move.w    d3,(a0)+                ; d3.w=(x,y+1)
  773.     move.l    -6(a0),(a0)+
  774.     move.w    -6(a0),(a0)+
  775.  
  776.     IFNE    1
  777. ; t4a
  778.     move.w    d6,(a0)+
  779.     move.w    d0,(a0)+
  780.     move.w    d3,(a0)+
  781.     subq.w    #3,d0
  782.     move.w    d0,(a0)+
  783.     move.l    -6(a0),(a0)+
  784.     move.w    -6(a0),(a0)+
  785.     ENDC
  786.  
  787.     dbra    d7,.primloop
  788.  
  789.     move.l    a0,d0
  790.     sub.l    a6,d0
  791.     rts
  792.  
  793. .temp:    ds.w    3
  794.  
  795. Spiral.paint:
  796.     bsr.l    PrimitiveMesh.new
  797.  
  798.     tst.w    Spiral.worldRot
  799.     bne.s    .rot_world            
  800.     clr.w    d2
  801.     bra.s    .gen
  802. .rot_world:                    ; rot wereld!
  803.     move.w    $04BC.w,d2
  804.     sub.w    Spiral.worldRotStart,d2
  805.     mulu.w    #3,d2
  806.     lsr.l    #2,d2
  807. .gen:    move.w    Spiral.xRot,d0
  808.     move.w    Spiral.yRot,d1
  809.     move.w    Spiral.zRot,d2
  810.     bsr.l    Matrix.generate
  811.     clr.w    d0
  812.     clr.w    d1
  813.     move.w    Spiral.z,d2
  814.     bsr.l    Matrix.translate
  815.  
  816.     bsr.l    Matrix.push
  817.  
  818. ; Push spiral1.
  819.     move.w    $04BC.w,d2
  820.     sub.w    Spiral.startTime,d2
  821.     mulu.w    #5,d2
  822.     lsr.l    #1,d2
  823.     clr.w    d0
  824.     clr.w    d1
  825.     bsr.l    Matrix.generate
  826.     clr.w    d0
  827.     clr.w    d1
  828.     clr.w    d2
  829.     bsr.l    Matrix.translate
  830.     bsr.l    Matrix.push
  831.  
  832.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  833.     moveq    #0,d1
  834.     bsr.l    TransformObject.transform
  835.  
  836.     bsr.l    Matrix.pop
  837.  
  838. ; Push spiral2.
  839.     move.w    $04BC.w,d2
  840.     sub.w    Spiral.startTime,d2
  841.     mulu.w    #5,d2
  842.     lsr.l    #1,d2
  843.     addi.w    #sintbllen/2,d2
  844.     clr.w    d0
  845.     clr.w    d1
  846.     bsr.l    Matrix.generate
  847.     clr.w    d0
  848.     clr.w    d1
  849.     clr.w    d2
  850.     bsr.l    Matrix.translate
  851.     bsr.l    Matrix.push
  852.  
  853.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  854.     moveq    #0,d1
  855.     bsr.l    TransformObject.transform
  856.  
  857.     bsr.l    Matrix.pop
  858.  
  859. ; Push cloud.
  860.     tst.w    Spiral.cloudOn
  861.     beq.s    .end_cloud
  862.     clr.w    d0
  863.     clr.w    d1
  864.     clr.w    d2
  865.     bsr.l    Matrix.generate
  866.     clr.w    d0
  867.     clr.w    d1
  868.     clr.w    d2
  869.     bsr.l    Matrix.translate
  870.     bsr.l    Matrix.push
  871.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  872.     moveq    #1,d1
  873.     bsr.l    TransformObject.transform
  874.     bsr.l    Matrix.pop
  875. .end_cloud:
  876.  
  877.     bsr.l    Matrix.pop
  878.  
  879.     bsr.l    PrimitiveMesh.sortZ
  880.     bsr.l    PrimitiveMesh.complete
  881.  
  882.     IFNE    1
  883.     lea    Viewport.settingsTable,a0
  884.     movem.w    Viewport.XSTART(a0),d0/d6
  885.     movem.w    Viewport.YSTART(a0),d1/d7
  886.     move.l    Spiral.bgCol,d4
  887.     bsr.l    Viewport.paintRectangle
  888.     ELSE
  889.     movea.l    Spiral.rectAddressTable,a0
  890.     move.w    (a0)+,d7
  891.     beq.s    .end_restore
  892.     subq.w    #1,d7
  893. .restore_loop:
  894.     move.w    d7,-(sp)
  895.     movem.w    (a0)+,d1/d7
  896.     movem.w    (a0)+,d0/d6
  897.     move.l    a0,-(sp)
  898.     moveq    #0,d4
  899.     bsr    Viewport.paintRectangle
  900.     movea.l    (sp)+,a0
  901.     move.w    (sp)+,d7
  902.     dbra    d7,.restore_loop
  903. .end_restore:
  904.     ENDC
  905.  
  906.     movea.l    Spiral.rectAddressTable,a0
  907.     bsr.l    PrimitiveMesh.paint
  908.  
  909.     lea    Spiral.rectAddressTable,a0
  910.      move.l    (a0)+,d0
  911.     move.l    (a0)+,d1
  912.     move.l    (a0),-(a0)
  913.     move.l    d0,4(a0)
  914.     move.l    d1,-(a0)
  915.  
  916.     moveq    #0,d0
  917.     rts
  918.  
  919. .error:    moveq    #-1,d0
  920.     rts
  921.  
  922. ;======= OBJECT DATA ========
  923.  
  924.     DATA
  925.  
  926. Spiral.sprite:
  927.     INCBIN    MINIBAL3.RLE
  928.  
  929. Spiral.textureTable:
  930.      DC.L    Spiral.texture
  931.     DC.L    Spiral.sprite
  932.     DC.L    0
  933.  
  934. Spiral.rectAddressTable:
  935.     DC.L    Spiral.rectTable
  936.     DC.L    Spiral.rectTable2
  937.     DC.L    Spiral.rectTable3
  938.  
  939. Spiral.z:
  940.     DC.W    2000
  941.  
  942. Spiral.cloudOrg:
  943.     DC.W    1500,300,-200,-1400,500,-700,+1000,400,1270,1700
  944.     DC.W    -1800,-600,100,1400,-500,600,-1000,900,-1170,1900
  945.  
  946. Spiral.cloud:
  947.     DC.W    20
  948.     DC.W    0
  949.     DC.W    130,70,1500
  950.     DC.W    80,23,300
  951.     DC.W    -50,50,-200
  952.     DC.W    70,30,-1400
  953.     DC.W    20,-45,500
  954.     DC.W    -120,50,-700
  955.     DC.W    -65,-35,+1000
  956.     DC.W    90,65,400
  957.     DC.W    55,-30,1270
  958.     DC.W    -30,-56,+1700
  959.     DC.W    -65,70,-1800
  960.     DC.W    30,43,-600
  961.     DC.W    -60,60,100
  962.     DC.W    70,-30,1400
  963.     DC.W    -60,-45,-500
  964.     DC.W    -110,30,+600
  965.     DC.W    55,-45,-1000
  966.     DC.W    70,55,+900
  967.     DC.W    -55,30,-1170
  968.     DC.W    -60,76,+1900
  969.     DC.W    0
  970.     DC.W    20
  971.     DC.W    Primitive.SPRITETYPE|1,0
  972.     DC.W    Primitive.SPRITETYPE|1,1
  973.     DC.W    Primitive.SPRITETYPE|1,2
  974.     DC.W    Primitive.SPRITETYPE|1,3
  975.     DC.W    Primitive.SPRITETYPE|1,4
  976.     DC.W    Primitive.SPRITETYPE|1,5
  977.     DC.W    Primitive.SPRITETYPE|1,6
  978.     DC.W    Primitive.SPRITETYPE|1,7
  979.     DC.W    Primitive.SPRITETYPE|1,8
  980.     DC.W    Primitive.SPRITETYPE|1,9
  981.     DC.W    Primitive.SPRITETYPE|1,10
  982.     DC.W    Primitive.SPRITETYPE|1,11
  983.     DC.W    Primitive.SPRITETYPE|1,12
  984.     DC.W    Primitive.SPRITETYPE|1,13
  985.     DC.W    Primitive.SPRITETYPE|1,14
  986.     DC.W    Primitive.SPRITETYPE|1,15
  987.     DC.W    Primitive.SPRITETYPE|1,16
  988.     DC.W    Primitive.SPRITETYPE|1,17
  989.     DC.W    Primitive.SPRITETYPE|1,18
  990.     DC.W    Primitive.SPRITETYPE|1,19
  991. Spiral.cloudEnd:
  992.  
  993. Spiral.palInstTable:
  994.     DC.W    (.end-.start)/4-1
  995.     DC.W    5
  996. .start:    DC.L    $00000000
  997.     DC.L    $003F0000
  998.     DC.L    $005F0000
  999.     DC.L    $3f7F005f
  1000.     DC.L    $003F0000
  1001.     DC.L    $00000000
  1002.     DC.L    $00000000
  1003.     DC.L    $00000000
  1004.     DC.L    $00000000
  1005. .end:
  1006.  
  1007. Spiral.incPal:
  1008.     INCBIN    PAL.DAT
  1009.  
  1010. Spiral.cloudOn:
  1011.     DC.W    0
  1012.  
  1013. ;======= OBJECT RESERVES ========
  1014.  
  1015.     BSS
  1016.  
  1017. Spiral.pal:
  1018.     DS.W    256
  1019.  
  1020. Spiral.rectTable:
  1021.     DS.W    1+4*32
  1022. Spiral.rectTable2:
  1023.     DS.W    1+4*32
  1024. Spiral.rectTable3:
  1025.     DS.W    1+4*32
  1026.  
  1027. Spiral.object1:
  1028.     DS.W    4096
  1029.  
  1030. Spiral.texture:
  1031.     DS.W    10+64*64
  1032.  
  1033. Spiral.worldRot:
  1034.     DS.W    1
  1035. Spiral.worldRotStart:
  1036.     DS.W    1
  1037. Spiral.zoomStart:
  1038.     DS.W    1
  1039. Spiral.oldZ:
  1040.     DS.W    1
  1041. Spiral.zoomDir:
  1042.     DS.W    1
  1043. Spiral.xRot:
  1044.     DS.W    1
  1045. Spiral.yRot:
  1046.     DS.W    1
  1047. Spiral.zRot:
  1048.     DS.W    1
  1049. Spiral.xRotStart:
  1050.     DS.W    1
  1051. Spiral.oldXRot:
  1052.     DS.W    1
  1053. Spiral.xRotDir:
  1054.     DS.W    1
  1055. Spiral.yRotStart:
  1056.     DS.W    1
  1057. Spiral.oldYRot:
  1058.     DS.W    1
  1059. Spiral.yRotDir:
  1060.     DS.W    1
  1061. Spiral.bgCol:
  1062.     DS.L    1
  1063. Spiral.startTime:
  1064.     DS.W    1
  1065.  
  1066. ;======= END OF DEMO-EFFECT OBJECT ========
  1067.