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

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