home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / SPIKES3.SO < prev    next >
Text File  |  2003-01-02  |  9KB  |  501 lines

  1. ; Ring field of spikes.
  2.  
  3. ******** OBJECT TABLE ********
  4.  
  5. * Must be first in object!!
  6. CSpikes.table:
  7.     DC.L    CSpikes.mainLoop
  8.     DC.L    CSpikes.init
  9.     DC.L    rts
  10.     DC.L    0
  11.  
  12. ; Include the Human Fly engine. The shouldn't be important if it conforms
  13. ; to Human Fly interface standards.
  14.     IFND    DEMO_SYSTEM
  15.     INCLUDE    SFLY_DSP.S            ; Include the CPU-DSP engine.
  16.     TEXT
  17.     ENDC
  18.  
  19. ******** OBJECT EQUATES ********
  20.  
  21. CSpikes.POINTS:        =    16            ; points in ring >1 !!
  22. CSpikes.RINGS:        =    11            ; #rings >1 !!
  23.  
  24. CSpikes.VCOUNT:        =    1+CSpikes.POINTS*CSpikes.RINGS
  25. CSpikes.POLYCOUNT:    =    CSpikes.POINTS*CSpikes.RINGS
  26. CSpikes.TRICOUNT:    =    CSpikes.POINTS
  27. CSpikes.QUADCOUNT:    =    CSpikes.POINTS*(CSpikes.RINGS-1)
  28.  
  29. CSpikes.POINTTABLE_SIZE:=    2+Vertex.SIZE*CSpikes.VCOUNT
  30. CSpikes.TXTTABLE_SIZE:    =    1+Vertex2d.SIZE*CSpikes.VCOUNT
  31. CSpikes.PRIMLIST_SIZE:    =    1+CSpikes.TRICOUNT*7+CSpikes.QUADCOUNT*9
  32.  
  33. CSpikes.GRIDSIZE:    =    CSpikes.POINTTABLE_SIZE+CSpikes.TXTTABLE_SIZE+CSpikes.PRIMLIST_SIZE    ; in words!
  34.  
  35.             RSRESET
  36. CSpikes.screen:        RS.W    160*100
  37. CSpikes.BLOCK_SIZE:    RS.B    0
  38.  
  39. ******** INIT SUBROUTINE ********
  40.  
  41. * OUTPUT: d0.l: 0   = All clear.
  42. *               neg = Error! Not initialized!
  43. CSpikes.init:
  44.     move.l    #CSpikes.BLOCK_SIZE,d0
  45.     bsr.l    Mem.register
  46.  
  47.     lea    sine_tbl,a1
  48.     bsr.l    Matrix.init
  49.  
  50. .success:
  51.     moveq    #0,d0
  52.     rts
  53. .error:    moveq    #-1,d0
  54.     rts
  55.  
  56. ******** REALTIME INIT SUBROUTINE ********
  57.  
  58. CSpikes.realtimeInit:
  59.     move.l    #rts,vbl_gfx
  60.  
  61.     bsr.l    Mem.getBlock
  62.     move.l    d0,d1
  63.     addi.l    #CSpikes.screen,d1
  64.     move.l    d1,CSpikes.screenAdr
  65.  
  66.     bsr.l    HumanFly.init
  67.  
  68.     lea    Viewport.settingsTable,a0
  69.     move.w    #160,Viewport.XSCREEN(a0)
  70.     move.w    #100,Viewport.YSCREEN(a0)
  71.     move.w    #0,Viewport.XSTART(a0)
  72.     move.w    #0,Viewport.YSTART(a0)
  73.     move.w    #160,Viewport.XEND(a0)
  74.     move.w    #100,Viewport.YEND(a0)
  75.     move.w    #80,Viewport.XCENTER(a0)
  76.     move.w    #50,Viewport.YCENTER(a0)
  77.     move.w    #256+32,Viewport.ASPECT(a0)
  78.     move.w    #$100,Viewport.FOCAL(a0)
  79.     bsr.l    Viewport.update
  80.  
  81.     lea    CSpikes.textureTable,a0
  82.     move.l    #Texture.spaceTexture,(a0)
  83.     bsr.l    Polygon.init
  84.  
  85.     bsr.l    ObjectRegistry.clear
  86.  
  87.     moveq    #0,d0
  88.     lea    CSpikes.grid,a0
  89.     bsr.w    CSpikes.generate
  90. ; d0.l=size of generated grid
  91.  
  92.     lea    CSpikes.grid,a0
  93.     bsr.l    ObjectRegistry.set
  94.     tst.w    d0
  95.     bmi.s    .error
  96.  
  97.     move.w    $04BC.w,CSpikes.startTime
  98.  
  99.     moveq    #0,d0
  100.     move.w    monitormode,d1
  101.     cmpi.w    #vga60,d1
  102.     beq.s    .vga60
  103.     cmpi.w    #vga100,d1
  104.     beq.s    .vga100
  105.     cmpi.w    #rgb50,d1
  106.     beq.s    .rgb50
  107. * Unknown monitormode..
  108.     rts
  109. .vga60:    move.l    #vga60_16bit_160_200,CSpikes.resRout
  110.     rts
  111. .vga100:move.l    #vga100_16bit_160_100,CSpikes.resRout
  112.     rts
  113. .rgb50:    move.l    #rgb50_16bit_320_100,CSpikes.resRout
  114.     rts
  115.  
  116. .error:    moveq    #-1,d0
  117.     rts
  118.  
  119. ******** MAINLOOP SUBROUTINE ********
  120.  
  121. CSpikes.mainLoop:
  122.     move.l    frmcnt,d0
  123.     sub.l    lastframecount,d0
  124.     bne.s    .end_realtime_init
  125.     bsr    CSpikes.realtimeInit
  126.     tst.w    d0
  127.     bmi    .end
  128. .end_realtime_init:
  129.  
  130.     bsr    CSpikes.setScreenAddy
  131.  
  132.     bsr.l    PrimitiveMesh.new
  133.  
  134.     bsr.w    CSpikes.addGrid
  135.     tst.l    d0
  136.     bmi    .end
  137.  
  138.     bsr.l    PrimitiveMesh.sortZ
  139.     bsr.l    PrimitiveMesh.complete
  140.  
  141. ;-- start of parallel part..
  142.     moveq    #1,d0
  143.     lea    CSpikes.grid,a0
  144.     bsr.w    CSpikes.generate
  145.  
  146.     bsr.w    CSpikes.flushScreen    
  147. ; todo: put flush back in here?
  148. ;-- parallel part ends here...
  149.  
  150.     movea.l    CSpikes.rectAddressTable,a0
  151.     bsr.l    PrimitiveMesh.paint
  152.  
  153.     lea    scr,a0
  154.     move.l    (a0)+,d0
  155.     move.l    (a0)+,d1
  156.     move.l    (a0),-4(a0)
  157.     move.l    d0,(a0)
  158.     move.l    d1,-8(a0)
  159.     movea.l    CSpikes.resRout,a0
  160.     suba.l    a1,a1
  161.     movea.l    d0,a2
  162.     move.l    frmcnt,d0
  163.     cmp.l    lastframecount,d0
  164.     beq.s    .no_refresh            ; don't show screen when its still crap!
  165.     bsr.l    Screen.requestUpdate
  166.     clr.l    CSpikes.resRout
  167. .no_refresh:
  168. .end:    rts
  169.  
  170. ******** OBJECT SUBROUTINES ********
  171.  
  172. CSpikes.setScreenAddy:
  173.     move.w    monitormode,d0
  174.     cmpi.w    #vga100,d0
  175.     beq.s    .vga100
  176.     movea.l    CSpikes.screenAdr,a0
  177.     bra.l    Primitive.setScreenbuffer
  178. .vga100:movea.l    scr,a0
  179.     bra.l    Primitive.setScreenbuffer
  180.  
  181. ; INPUT:
  182. ; d0.l=genflags (0:total, 1:only points)
  183. ; a0=output buffer
  184. ; OUTPUT:
  185. ; d0.l=size of object
  186. CSpikes.generate:
  187.     movea.l    a0,a6
  188.     move.w    d0,-(sp)
  189.  
  190. ; Generate 3d vertices.
  191.     lea    sine_tbl,a2
  192.     move.w    #CSpikes.VCOUNT,(a0)+
  193.     clr.w    (a0)+
  194.     move.w    $04BC.w,d5
  195.     sub.w    CSpikes.startTime,d5
  196.     add.w    d5,d5
  197.     moveq    #1,d7
  198.  
  199. ; Output first point.
  200.     clr.w    (a0)+
  201.     clr.w    (a0)+
  202.     move.w    d5,d0
  203.     neg.w    d0
  204.     Do_SinModulo    d0
  205.     Get_Sin    a2,d0,d0
  206.     move.w    d0,d1
  207.     asr.w    #6,d0
  208.     asr.w    #7,d1
  209.     add.w    d1,d0
  210.     move.w    d0,(a0)+
  211.  
  212.     tst.w    (sp)+
  213.     bne    .gen_points_special
  214.  
  215. .vyloop:
  216. ; Generate row.
  217.     clr.w    d6
  218.  
  219. .vxloop:move.w    d6,d0
  220.     mulu.w    #sintbllen/CSpikes.POINTS,d0
  221.     Get_SinCos    a2,d0,d0,d1
  222.     muls.w    d7,d0
  223.     muls.w    d7,d1
  224.     asr.l    #8,d0
  225.     asr.l    #8,d1
  226.     move.w    d0,(a0)+
  227.     move.w    d1,(a0)+
  228.     move.w    d7,d0
  229.     mulu.w    #sintbllen*2/CSpikes.POINTS,d0
  230.     sub.w    d5,d0
  231.     Do_SinModulo    d0
  232.     Get_Sin    a2,d0,d0
  233.     move.w    d0,d1
  234.     asr.w    #6,d0
  235.     asr.w    #7,d1
  236.     add.w    d1,d0
  237.     move.w    d0,(a0)+
  238.     addq.w    #1,d6
  239.     cmpi.w    #CSpikes.POINTS,d6
  240.     blt.s    .vxloop
  241.  
  242.     addq.w    #1,d7
  243.     cmpi.w    #CSpikes.RINGS+1,d7
  244.     blt.s    .vyloop
  245.  
  246.     bra.s    .end_gen_points
  247.  
  248. .gen_points_special:
  249.  
  250. .vyloop_s:
  251. ; Generate row.
  252.     moveq    #CSpikes.POINTS-1,d6
  253.  
  254. .vxloop_s:
  255.     addq    #4,a0
  256.     move.w    d7,d0
  257.     mulu.w    #sintbllen*2/CSpikes.POINTS,d0
  258.     sub.w    d5,d0
  259.     Do_SinModulo    d0
  260.     Get_Sin    a2,d0,d0
  261.     move.w    d0,d1
  262.     asr.w    #6,d0
  263.     asr.w    #7,d1
  264.     add.w    d1,d0
  265.     move.w    d0,(a0)+
  266.     dbf    d6,.vxloop_s
  267.  
  268.     addq.w    #1,d7
  269.     cmpi.w    #CSpikes.RINGS+1,d7
  270.     blt.s    .vyloop_s
  271.  
  272.     bra    .end
  273.  
  274. .end_gen_points:
  275.  
  276. ; Generate texture vertices.
  277.     move.w    #CSpikes.VCOUNT,(a0)+
  278.     moveq    #1,d7
  279.     move.w    $04BC.w,d5
  280.     sub.w    CSpikes.startTime,d5
  281.     Do_SinModulo    d5
  282.     Get_Sin    a2,d5,d5
  283.     addi.w    #$4000,d5
  284.  
  285.     clr.l    (a0)+
  286.  
  287. .vloop:    clr.w    d6
  288.  
  289. .uloop:    move.w    d6,d0
  290.     mulu.w    #sintbllen/CSpikes.POINTS,d0
  291.     Do_SinModulo    d0
  292.     Get_SinCos    a2,d0,d0,d1
  293.     muls.w    d7,d0
  294.     muls.w    d7,d1
  295.     asr.l    #8,d0
  296.     asr.l    #8,d1
  297.     asr.l    #1,d0
  298.     asr.l    #1,d1
  299.     andi.w    #$00FF,d0
  300.     andi.w    #$00FF,d1
  301.     move.w    d0,(a0)+
  302.     move.w    d1,(a0)+
  303.     addq.w    #1,d6
  304.     cmpi.w    #CSpikes.POINTS,d6
  305.     blt.s    .uloop
  306.  
  307.     addq.w    #1,d7
  308.     cmpi.w    #CSpikes.RINGS+1,d7
  309.     blt.s    .vloop
  310.  
  311. ; Generate primitives.
  312.     moveq    #CSpikes.POINTS-1,d6
  313.     move.w    #CSpikes.POLYCOUNT,(a0)+
  314.     move.w    d6,d5
  315.  
  316. .headloop:
  317.     move.w    #Polygon.TRI|Polygon.TEXTUREMAPPED|0,(a0)+
  318.  
  319.     move.w    d6,d0
  320.     addq.w    #1,d0
  321.     move.w    d0,(a0)+                ; p0=x
  322.  
  323.     clr.w    (a0)+                    ; p0=0
  324.  
  325.     clr.l    d0
  326.     move.w    d6,d0
  327.     addq.w    #1,d0
  328.     divu.w    #CSpikes.POINTS,d0
  329.     swap    d0
  330.     addq.w    #1,d0
  331.     move.w    d0,(a0)+                ; p0=(x+1) mod p
  332.  
  333.     REPT    3
  334.     move.w    -6(a0),(a0)+
  335.     ENDR
  336.  
  337.     dbra    d6,.headloop
  338.  
  339.     move.w    d5,d6
  340.     moveq    #CSpikes.RINGS-2,d7
  341.  
  342. .ringloop:
  343.  
  344. .bodyloop:
  345.     move.w    #Polygon.QUAD|Polygon.TEXTUREMAPPED|0,(a0)+
  346.  
  347.     move.w    d7,d0
  348.     mulu.w    #CSpikes.POINTS,d0
  349.     add.w    d6,d0
  350.     addq.w    #1,d0
  351.     move.w    d0,(a0)+                ; p0=1+a+r*w
  352.  
  353.     clr.l    d0
  354.     move.w    d6,d0
  355.     addq.w    #1,d0
  356.     divu.w    #CSpikes.POINTS,d0
  357.     swap    d0
  358.     addq.w    #1,d0
  359.     move.w    d7,d1
  360.     mulu.w    #CSpikes.POINTS,d1
  361.     add.w    d1,d0
  362.     move.w    d0,(a0)+                ; p1=1 + (a+1) mod w + r*w
  363.  
  364.     clr.l    d0
  365.     move.w    d6,d0
  366.     addq.w    #1,d0
  367.     divu.w    #CSpikes.POINTS,d0
  368.     swap    d0
  369.     addq.w    #1,d0
  370.     move.w    d7,d1
  371.     addq.w    #1,d1
  372.     mulu.w    #CSpikes.POINTS,d1
  373.     add.w    d1,d0
  374.     move.w    d0,(a0)+                ; p2=1 + (a+1) mod w + (r+1)*w
  375.  
  376.     move.w    d7,d0
  377.     addq.w    #1,d0
  378.     mulu.w    #CSpikes.POINTS,d0
  379.     add.w    d6,d0
  380.     addq.w    #1,d0
  381.     move.w    d0,(a0)+                ; p3=1 + a+(r+1)*w
  382.  
  383.     move.l    -8(a0),(a0)+
  384.     move.l    -8(a0),(a0)+
  385.  
  386.     dbra    d6,.bodyloop
  387.  
  388.     move.w    d5,d6
  389.     dbra    d7,.ringloop
  390.  
  391.  
  392. .end:    move.l    a0,d0
  393.     sub.l    a6,d0
  394.     rts
  395.  
  396. CSpikes.addGrid:
  397.     lea    CSpikes.grid,a0
  398.     moveq    #0,d0                ; handle
  399.     moveq    #%0001,d1            ; Replace only 3d vertices.
  400.     move.l    #CSpikes.GRIDSIZE*2,d2        ; objsize
  401.     bsr.l    ObjectRegistry.replace
  402.  
  403. ; Push world rotation matrix.
  404.     move.w    $04BC.w,d0
  405.     sub.w    CSpikes.startTime,d0
  406.     lea    sine_tbl,a1
  407.     move.w    d0,d2
  408.     mulu.w    #7,d0
  409.     lsr.l    #4,d0
  410.     Do_SinModulo    d0
  411.     Get_Sin    a1,d0,d0
  412.     asr.w    #7,d0
  413.     addi.w    #1024,d0
  414.     clr.l    d1
  415.     mulu.w    #5,d2
  416.     lsr.w    #3,d2
  417.     Do_SinModulo    d2
  418.     Get_Cos    a1,d2,d2
  419.     asr.w    #5,d2
  420.     bsr.l    Matrix.generate
  421.     move.w    #0,d0
  422.     move.w    #0,d1
  423.     move.w    #2800,d2
  424.     bsr.l    Matrix.translate
  425.     bsr.l    Matrix.push
  426.  
  427.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  428.     moveq    #0,d1
  429.     bsr.l    TransformObject.transform
  430.  
  431.     bsr.l    Matrix.pop
  432.  
  433.     moveq    #0,d0
  434.     rts
  435.  
  436. .error:    moveq    #-1,d0
  437.     rts
  438.  
  439. CSpikes.flushScreen:
  440.     move.w    monitormode,d2
  441.     cmpi.w    #vga100,d2
  442.     beq.s    .copy_done
  443.     move.w    #160,d0
  444.     moveq    #100,d1
  445.     movea.l    CSpikes.screenAdr,a1
  446.     movea.l    scr,a0
  447.     cmpi.w    #vga60,d2
  448.     beq.l    DOUBLE_BUFFERV
  449.     cmpi.w    #rgb50,d2
  450.     beq.l    .double_horizontally
  451. ; Unknown monitormode..
  452. .copy_done:
  453.     rts
  454.  
  455. .double_horizontally:
  456.     move.w    #160*100/16-1,d7
  457. .loop:    REPT    16
  458.     move.w    (a1),(a0)+
  459.     move.w    (a1)+,(a0)+
  460.     ENDR
  461.     dbra    d7,.loop
  462.     rts
  463.  
  464. ******** OBJECT DATA ********
  465.  
  466.     DATA
  467.  
  468. CSpikes.rectAddressTable:
  469.     DC.L    CSpikes.rectTable
  470.     DC.L    CSpikes.rectTable2
  471.     DC.L    CSpikes.rectTable3
  472.  
  473. ******** OBJECT RESERVES ********
  474.  
  475.     BSS
  476.  
  477. CSpikes.grid:
  478.     DS.W    CSpikes.GRIDSIZE
  479.  
  480. CSpikes.rectTable:
  481.     DS.W    1+4*32
  482. CSpikes.rectTable2:
  483.     DS.W    1+4*32
  484. CSpikes.rectTable3:
  485.     DS.W    1+4*32
  486.  
  487. CSpikes.distTable:
  488.     DS.W    CSpikes.VCOUNT*3
  489.  
  490. CSpikes.screenAdr:
  491.     DS.L    1
  492. CSpikes.textureTable:
  493.     DS.L    2
  494.  
  495. CSpikes.startTime:
  496.     DS.W    1
  497.  
  498. CSpikes.resRout:
  499.     DS.L    1
  500.  
  501. ******** END OF DEMO-EFFECT OBJECT ********