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

  1. ; Ditherblur screen for delta. Done with u-fly.
  2. ; You might recognise some hmmm-ness..
  3.  
  4. ;======= OBJECT EQUATES ========
  5.  
  6. InCube.2ND_TEXTURE:    =    0
  7. InCube.SKIP:        =    7
  8.  
  9. InCube.RINGS:        =    8
  10. InCube.SLICES:        =    16
  11. InCube.VERTICES:    =    InCube.RINGS*InCube.SLICES
  12. InCube.POLYS:        =    InCube.RINGS*InCube.SLICES
  13. InCube.RING_R:        =    100
  14.  
  15.             RSRESET
  16. InCube.screen1:        RS.W    160*100
  17. InCube.screen2:        RS.W    160*100
  18. InCube.screen3:        RS.W    160*100
  19. InCube.object:        RS.W    4096
  20. InCube.BLOCK_SIZE:    RS.B    0
  21.  
  22. ;======= OBJECT TABLE ========
  23.  
  24. ; Must be first in object!!
  25. InCube.table:
  26.     DC.L    InCube.mainLoop
  27.     DC.L    InCube.init
  28.     DC.L    InCube.setRes
  29.     DC.L    InCube.setTorus
  30.     DC.L    InCube.setSpikey
  31.     DC.L    InCube.setStillTraject
  32.     DC.L    InCube.setZoomTraject
  33.     DC.L    InCube.setPanLRTraject
  34.     DC.L    InCube.setPanRLTraject
  35.     DC.L    InCube.setWildTraject
  36.     DC.L    0
  37.  
  38.     IFND    DEMO_SYSTEM
  39. ; Include the Human Fly engine.
  40.     INCLUDE    SFLY_DSP.S                ; Include the CPU-DSP engine.
  41.     TEXT
  42.     INCLUDE    OBJECT3D.I
  43.     TEXT
  44.     ENDC
  45.  
  46. ;======= RESOLUTION SETTING ROUTINE ========
  47.  
  48. InCube.setRes:
  49.     IFEQ    testmode
  50.     move.w    monitormode,d0
  51.     cmpi.w    #vga60,d0
  52.     beq.s    .vga60
  53.     cmpi.w    #vga100,d0
  54.     beq.s    .vga100
  55.     cmpi.w    #rgb50,d0
  56.     beq.s    .rgb50
  57. ; Unknown monitormode..
  58.     rts
  59.  
  60. .vga60:    bra.l    vga60_16bit_320_200
  61. .vga100:bra.l    vga100_16bit_320_200
  62. .rgb50:    bra.l    rgb50_16bit_320_200
  63.     ENDC
  64.     rts
  65.  
  66. ;======= INIT SUBROUTINE ========
  67.  
  68. * OUTPUT: d0.l: 0   = All clear.
  69. *               neg = Error! Not initialized!
  70. InCube.init:
  71.     move.l    #InCube.BLOCK_SIZE,d0
  72.     bsr.l    Mem.register
  73.  
  74.     lea    sine_tbl,a1
  75.     bsr.l    Matrix.init
  76.  
  77. .success:
  78.     moveq    #0,d0
  79.     rts
  80. .error:    moveq    #-1,d0
  81.     rts
  82.  
  83. ;======= REALTIME INIT SUBROUTINE ========
  84.  
  85. InCube.realtimeInit:
  86.     bsr.l    Mem.getBlock
  87.     move.l    d0,InCube.baseAdr
  88.  
  89.     clr.w    InCube.readyToVblKick
  90.  
  91. ; Set logical screenaddys..
  92.     move.l    d0,d1
  93.     move.l    d0,d2
  94.     lea    InCube.screenAddys,a0
  95.     addi.l    #InCube.screen1,d0
  96.     move.l    d0,(a0)+
  97.     addi.l    #InCube.screen2,d1
  98.     move.l    d0,(a0)+
  99.     addi.l    #InCube.screen3,d2
  100.     move.l    d0,(a0)+
  101.  
  102.     bsr.l    HumanFly.init
  103.  
  104.     bsr    InCube.resetTime
  105.  
  106.     lea    Viewport.settingsTable,a0
  107.     move.w    #160,Viewport.XSCREEN(a0)
  108.     move.w    #100,Viewport.YSCREEN(a0)
  109.     move.w    #0,Viewport.XSTART(a0)
  110.     move.w    #0,Viewport.YSTART(a0)
  111.     move.w    #160,Viewport.XEND(a0)
  112.     move.w    #100,Viewport.YEND(a0)
  113.     move.w    #80,Viewport.XCENTER(a0)
  114.     move.w    #50,Viewport.YCENTER(a0)
  115.     move.w    #256+32,Viewport.ASPECT(a0)
  116.     move.w    #$100,Viewport.FOCAL(a0)
  117.     bsr.l    Viewport.update
  118.  
  119.     lea    InCube.textureTable,a0
  120.     lea    InCube.colorTable,a1
  121.     bsr.l    Polygon.init
  122.  
  123.     bsr.l    ObjectRegistry.clear
  124.  
  125.     movea.l    InCube.baseAdr,a0
  126.     adda.l    #InCube.object,a0
  127.     move.w    #1000,d0
  128.     bsr    InCube.generate
  129. ; d0.l=size
  130.     movea.l    InCube.baseAdr,a0
  131.     adda.l    #InCube.object,a0
  132.     bsr.l    ObjectRegistry.set
  133.     tst.w    d0
  134.     bmi.s    .error
  135.  
  136.     lea    Object3d.spikey,a0
  137.     move.l    #Object3d.spikeyEnd-Object3d.spikey,d0
  138.     bsr.l    ObjectRegistry.set
  139.     tst.w    d0
  140.     bmi.s    .error
  141.  
  142.     clr.w    InCube.objectNum
  143.  
  144.     cmpi.w    #vga100,monitormode
  145.     beq.s    .vga100
  146.     move.l    #InCube.paint,vbl_gfx
  147.     rts
  148.  
  149. .vga100:move.l    #InCube.paintVga100,vbl_gfx
  150. .error:    rts
  151.  
  152. ;======= MAINLOOP SUBROUTINE ========
  153.  
  154. InCube.mainLoop:
  155.     move.w    $0468.w,.old468
  156.  
  157.     move.l    frmcnt,d0
  158.     sub.l    lastframecount,d0
  159.     bne.s    .end_realtime_init
  160.     move.l    d0,-(sp)
  161.     bsr    InCube.realtimeInit
  162.     move.l    (sp)+,d0
  163. .end_realtime_init:
  164.  
  165.     movea.l    InCube.screenAddys,a0
  166.     bsr.l    Primitive.setScreenbuffer
  167.  
  168.     movea.l    InCube.trajectRout,a0
  169.     jsr    (a0)
  170.  
  171.     bsr.l    PrimitiveMesh.new
  172.  
  173.     bsr    InCube.addScene
  174.  
  175.     bsr.l    PrimitiveMesh.complete
  176.  
  177.     lea    Viewport.settingsTable,a0
  178.     movem.w    Viewport.XSTART(a0),d0/d6
  179.     movem.w    Viewport.YSTART(a0),d1/d7
  180.     moveq    #$00000000,d4
  181.     bsr.l    Viewport.paintRectangle
  182.  
  183.     movea.l    InCube.rectAddressTable,a0
  184.     bsr.l    PrimitiveMesh.paint
  185.  
  186.     st    InCube.readyToVblKick
  187.  
  188.     lea    InCube.screenAddys,a0
  189.     IFNE    1
  190.     move.l    (a0),d0
  191.     move.l    8(a0),(a0)
  192.     move.l    d0,8(a0)
  193.     ELSE
  194.     move.l    (a0)+,d0
  195.     move.l    (a0)+,d1
  196.     move.l    (a0),-(a0)
  197.     move.l    d0,4(a0)
  198.     move.l    d1,-(a0)
  199.     ENDC
  200.  
  201. ;    move.w    .old468(pc),d0
  202.     move.w    $0468.w,d0
  203.  
  204. .cmp:    cmp.w    $0468.w,d0
  205.     beq.s    .cmp
  206.  
  207. ; vbl just completed, do shit now! quick quick! hurry hurry!
  208.  
  209.     IFEQ    testmode
  210.     move.l    scr+8,d0                ; physical screen!
  211.     move.l    d0,d1
  212.     lsr.w    #8,d0
  213.     move.l    d0,$ffff8200.w
  214.     move.b    d1,$ffff820d.w
  215.     ENDC
  216.  
  217.     move.l    frmcnt,d0
  218.     sub.l    lastframecount,d0
  219.     bne.s    .res_done
  220.     bra    InCube.setRes
  221. .res_done:
  222.  
  223. .error:    rts
  224.  
  225. .old468:DC.W    0
  226.  
  227. ;======= OBJECT SUBROUTINES ========
  228.  
  229. InCube.setTorus:
  230.     clr.w    InCube.objectNum
  231.     rts
  232.  
  233. InCube.setSpikey:
  234.     move.w    #1,InCube.objectNum
  235.     rts
  236.  
  237. InCube.setStillTraject:
  238.     move.l    #InCube.standStill,InCube.trajectRout
  239.     rts
  240.  
  241. InCube.setZoomTraject:
  242.     move.l    #InCube.zoomIn,InCube.trajectRout
  243.     bsr    InCube.resetTime
  244.     rts
  245.  
  246. InCube.setPanLRTraject:
  247.     move.l    #InCube.panLR,InCube.trajectRout
  248.     bsr    InCube.resetTime
  249.     rts
  250.  
  251. InCube.setPanRLTraject:
  252.     move.l    #InCube.panRL,InCube.trajectRout
  253.     bsr    InCube.resetTime
  254.     rts
  255.  
  256. InCube.setWildTraject:
  257.     move.l    #InCube.moveWildly,InCube.trajectRout
  258.     bsr    InCube.resetTime
  259.     rts
  260.  
  261. InCube.resetTime:
  262.     move.l    $04BA.w,InCube.time
  263.     rts
  264.  
  265. ; OUTPUT:
  266. ; d0.l=time
  267. InCube.getTime:
  268.     move.l    $04BA.w,d0
  269.     sub.l    InCube.time,d0
  270.     rts
  271.  
  272. InCube.standStill:
  273.     clr.w    InCube.x
  274.     clr.w    InCube.y
  275.     move.w    #3000,InCube.z
  276.     rts
  277.  
  278. InCube.zoomIn:
  279.     bsr    InCube.getTime
  280.     cmpi.l    #$7FF,d0
  281.     bcs.s    .end_time
  282.     move.l    #$7FF,d0
  283. .end_time:
  284.     move.w    #$7FF0,d1
  285.     lsl.w    #4,d0
  286.     sub.w    d0,d1
  287.     clr.w    InCube.x
  288.     clr.w    InCube.y
  289.     move.w    d1,InCube.z
  290.     rts
  291.  
  292. InCube.panLR:
  293.     bsr    InCube.getTime
  294.     cmpi.l    #2000,d0
  295.     bcs.s    .end_time
  296.     move.l    #2000,d0
  297. .end_time:
  298.     mulu.w    #2,d0
  299.     move.w    #-2000,d1
  300.     add.w    d0,d1
  301.     move.w    d1,InCube.x
  302.     clr.w    InCube.y
  303.     move.w    #3500,InCube.z
  304.     rts
  305.  
  306. InCube.panRL:
  307.     bsr    InCube.getTime
  308.     cmpi.l    #2000,d0
  309.     bcs.s    .end_time
  310.     move.l    #2000,d0
  311. .end_time:
  312.     mulu.w    #2,d0
  313.     move.w    #+2000,d1
  314.     sub.w    d0,d1
  315.     move.w    d1,InCube.x
  316.     clr.w    InCube.y
  317.     move.w    #3500,InCube.z
  318.     rts
  319.  
  320. InCube.moveWildly:
  321.     lea    sine_tbl,a0
  322.     bsr    InCube.getTime    
  323.     move.w    d0,d1
  324.     move.w    d0,d2
  325.     mulu.w    #4,d0
  326.     lsr.l    #1,d0
  327.     mulu.w    #5,d1
  328.     lsr.l    #2,d1
  329.     mulu.w    #3,d2
  330.     Do_SinModulo    d0
  331.     Do_SinModulo    d1
  332.     Do_SinModulo    d2
  333.     Get_Sin    a0,d0,d0
  334.     Get_Sin    a0,d1,d1
  335.     Get_Sin    a0,d2,d2
  336.     asr.w    #6,d0
  337.     asr.w    #7,d1
  338.     asr.w    #5,d2
  339.     addi.w    #4096,d2
  340.     move.w    d0,InCube.x
  341.     move.w    d1,InCube.y
  342.     move.w    d2,InCube.z
  343.     rts
  344.  
  345. ; 0<=phi<2pi, 0<=theta<2pi
  346. ;
  347. ; x=r(phi)*sin(theta)
  348. ; y=r(phi)*cos(theta)
  349. ; z=RING_R*cos(phi)
  350. ;
  351. ; r(phi)=R+RING_R*sin(phi)
  352. ;
  353. ; INPUT:
  354. ; d0.w=r
  355. ; a0: objectbuffer
  356. ; OUTPUT:
  357. ; d0.l=size
  358. InCube.generate:
  359.     movea.l    a0,a6
  360.  
  361. ; Output vertices..
  362.     lea    sine_tbl,a1
  363.     move.w    d0,.radius
  364.     move.w    #2*InCube.VERTICES,(a0)+        ; #vertices+#normals
  365.     move.w    #InCube.VERTICES,(a0)+            ; #normals
  366.     lea    InCube.VERTICES*Vertex.SIZE(a0),a2
  367.     moveq    #InCube.RINGS-1,d7
  368.  
  369. .ring_loop:
  370.     moveq    #InCube.SLICES-1,d6
  371.     move.w    d7,d0
  372.     mulu.w    #sintbllen/InCube.RINGS,d0
  373. ; d0.w=phi
  374.     Get_Cos    a1,d0,d2
  375.     Get_Cos    a1,d0,d3
  376. ; d2.w=sin(phi), d3.w=cos(phi)
  377.     muls.w    #InCube.RING_R*2,d2
  378.     swap    d2
  379.     add.w    .radius(pc),d2
  380.     asr.w    #7,d3
  381. ; d2.w=r=R+RING_R*sin(phi), d3.w=sin(phi)*..
  382.     Get_Sin    a1,d0,d4
  383.     Get_Sin    a1,d0,d5
  384.     muls.w    #InCube.RING_R*2,d4
  385.     swap    d4
  386. ; d4.w=RING_R*cos(phi)
  387.     asr.w    #8,d5
  388.  
  389. .point_loop:
  390.     move.w    d6,d0
  391.     mulu.w    #sintbllen/InCube.SLICES,d0
  392. ; d0.w=theta
  393.     Get_SinCos    a1,d0,d0,d1
  394. ; d0.w=sin(theta), d1.w=cos(theta)
  395.     muls.w    d2,d0
  396.     muls.w    d2,d1
  397.     swap    d0
  398.     swap    d1
  399.     move.w    d0,(a0)+
  400.     move.w    d1,(a0)+
  401.     move.w    d4,(a0)+
  402.     move.w    d6,d0
  403.     mulu.w    #sintbllen/InCube.SLICES,d0
  404.     Get_SinCos    a1,d0,d0,d1
  405.     muls.w    d3,d0
  406.     muls.w    d3,d1
  407.     swap    d0
  408.     swap    d1
  409.     move.w    d0,(a2)+
  410.     move.w    d1,(a2)+
  411.     move.w    d5,(a2)+
  412.     dbra    d6,.point_loop
  413.  
  414.     dbra    d7,.ring_loop
  415.  
  416.     movea.l    a2,a0
  417.  
  418.     clr.w    (a0)+                ; #texels
  419.  
  420.     move.w    #InCube.POLYS,(a0)+        ; #primitives
  421.     moveq    #InCube.RINGS-1,d7
  422.  
  423. .prim_ring_loop:
  424.     move.w    d7,d2
  425.     mulu.w    #InCube.SLICES,d2
  426.     clr.l    d3
  427.     move.w    d7,d3
  428.     addq.w    #1,d3
  429.     divu.w    #InCube.RINGS,d3
  430.     swap    d3
  431.     mulu.w    #InCube.SLICES,d3
  432.     moveq    #InCube.SLICES-1,d6
  433.     
  434. .primloop:
  435.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  436.  
  437.     move.w    d6,d0
  438.     add.w    d3,d0
  439.     move.w    d0,(a0)+
  440.  
  441.     clr.l    d0
  442.     move.w    d6,d0
  443.     addq.w    #1,d0
  444.     divu.w    #InCube.SLICES,d0
  445.     swap    d0
  446.     move.w    d0,d1
  447.     add.w    d3,d0
  448.     move.w    d0,(a0)+
  449.  
  450.     add.w    d2,d1
  451.     move.w    d1,(a0)+
  452.  
  453.     move.w    d6,d0
  454.     add.w    d2,d0
  455.     move.w    d0,(a0)+
  456.  
  457.     REPT    4
  458.     move.w    -8(a0),d0
  459.     addi.w    #InCube.VERTICES,d0
  460.     move.w    d0,(a0)+
  461.     ENDR
  462.  
  463.     dbra    d6,.primloop
  464.  
  465.     dbra    d7,.prim_ring_loop
  466.  
  467. .end:    suba.l    a6,a0
  468.     move.l    a0,d0
  469.     rts
  470.  
  471. .radius:DC.W    0
  472.  
  473.     IFNE    0
  474. ; Swaps some colors and shit...
  475. ; Let's do g,b := b,g
  476. InCube.initTexture2:
  477. ; Copy header...
  478.     lea    InCube.texture1,a1
  479.     movem.w    12(a1),d6/d7
  480.     lea    InCube.texture2,a0
  481.     moveq    #5-1,d0
  482. .copy_header_loop:
  483.     move.l    (a1)+,(a0)+
  484.     dbra    d0,.copy_header_loop
  485.  
  486. ; Do the pixels.
  487.     mulu.w    d6,d7
  488.     subq.l    #1,d7
  489. .loop:    move.w    (a1)+,d0
  490.     move.w    d0,d1
  491.     move.w    d0,d2
  492.     andi.w    #$F800,d0
  493.     andi.w    #$07C0,d1
  494.     lsr.w    #6,d1
  495.     andi.w    #$001F,d2
  496.     lsl.w    #6,d2
  497.     or.w    d2,d0
  498.     or.w    d1,d0
  499.     move.w    d0,(a0)+
  500.     dbra    d7,.loop
  501.     rts
  502.     ENDC
  503.  
  504. InCube.addScene:
  505.     bsr    InCube.getTime
  506.     move.w    d0,d1
  507.     move.w    d0,d2
  508.     mulu.w    #5,d0
  509.     lsr.w    #1,d0
  510.     mulu.w    #3,d1
  511.     lsr.w    #1,d1
  512.     lsl.w    #2,d2
  513.     bsr.l    Matrix.generate
  514.  
  515.     move.w    InCube.x,d0
  516.     move.w    InCube.y,d1
  517.     move.w    InCube.z,d2
  518.     bsr.l    Matrix.translate
  519.  
  520.     bsr.l    Matrix.push
  521.  
  522.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  523.     move.w    InCube.objectNum,d1
  524.     bsr.l    TransformObject.transform
  525.  
  526.     bsr.l    Matrix.pop
  527.  
  528.     bsr.l    PrimitiveMesh.sortZ
  529.     rts
  530.  
  531. InCube.paintVga100:
  532.     clr.l    d1
  533.     move.w    $0468.w,d1
  534.     lsr.l    d1
  535.     bcs.s    .proceed
  536.     rts
  537. .proceed:
  538.     bra.s    InCube.paintIt
  539.  
  540. InCube.paint:
  541.     tst.w    InCube.readyToVblKick
  542.     bne.s    .go_on
  543.     rts
  544. .go_on:    clr.l    d1
  545.     move.w    $0468.w,d1
  546.  
  547. InCube.paintIt:
  548.     movea.l    scr+8,a0                ; physical screen please!
  549.     movea.l    InCube.screenAddys+8,a1            ; physical viewport
  550.     movea.w    #InCube.SKIP*2,a6
  551.     movea.w    #InCube.SKIP*4,a5
  552.     move.l    d1,d2
  553.     divu.w    #InCube.SKIP,d2
  554.     swap    d2                    ; d2.w=dst lookupoffset
  555.     divu.w    #InCube.SKIP*4,d1
  556.     swap    d1                    ; d1.w=src lookupoffset
  557.     moveq    #100,d7
  558.     adda.w    .table(pc,d1.w*2),a0
  559.     move.w    .htable(pc,d2.w*2),d5            ; d5.w=src offset
  560.     adda.w    d5,a1
  561.     lsr.w    d5
  562.  
  563. .plot00:moveq    #2-1,d6
  564.  
  565. .loop:
  566.     REPT    11
  567.     move.w    (a1),(a0)
  568.     adda.l    a6,a1
  569.     adda.l    a5,a0
  570.     ENDR
  571.     dbra    d6,.loop
  572.  
  573.     subq.w    #1,d7
  574.     beq.s    .main_done
  575.     subq.w    #6,d5
  576.     bpl.s    .next
  577.     addq.w    #7,d5
  578.     move.w    (a1),(a0)
  579.     adda.l    a6,a1
  580.     adda.l    a5,a0
  581. .next:    adda.w    #320*2,a0
  582.     bra.s    .plot00
  583.  
  584. .main_done:
  585. ; Don't forget the final 6. 64000 mod 7 = 6 you know.
  586.     subq.w    #6,d5
  587.     beq.s    .end
  588. ; 0<=d1.w<6 => 0<=#pix<64000
  589.     move.w    (a1),(a0)    
  590. .end:    rts
  591.  
  592. ; offset: 000,001,002,003,004,005,006 (wrap)
  593. ; pixels: 023,023,023,023,023,023,022 (wrap)
  594. .htable:DC.W    000*2,003*2,005*2,002*2,006*2,001*2,004*2
  595. .table:    DC.W    000*2,006*2,010*2,004*2,012*2,002*2,008*2
  596.     DC.W    001*2,007*2,011*2,005*2,013*2,003*2,009*2
  597.     DC.W    320*2,326*2,330*2,324*2,332*2,322*2,328*2
  598.     DC.W    321*2,327*2,331*2,325*2,333*2,323*2,329*2
  599.  
  600. ;======= OBJECT DATA ========
  601.  
  602.     DATA
  603.  
  604. InCube.textureTable:
  605.     DC.L    FlareGen.chromeFogBuffer
  606.     DC.L    0
  607.  
  608. InCube.rectAddressTable:
  609.     DC.L    InCube.rectangleTable
  610.     DC.L    InCube.rectangleTable2
  611.     DC.L    InCube.rectangleTable3
  612.  
  613. InCube.trajectRout:
  614.     DC.L    InCube.standStill
  615.  
  616. ;======= OBJECT RESERVES ========
  617.  
  618.     BSS
  619.  
  620. InCube.time:
  621.     DS.L    1
  622.  
  623. InCube.colorTable:
  624.  
  625. InCube.rectangleTable:
  626.     DS.W    4*10
  627. InCube.rectangleTable2:
  628.     DS.W    4*10
  629. InCube.rectangleTable3:
  630.     DS.W    4*10
  631.  
  632. InCube.x:
  633.     DS.W    1
  634. InCube.y:
  635.     DS.W    1
  636. InCube.z:
  637.     DS.W    1
  638.  
  639. InCube.screenAddys:
  640.     DS.L    3
  641.  
  642. InCube.baseAdr:
  643.     DS.L    1
  644.  
  645. InCube.readyToVblKick:
  646.     DS.W    1
  647. InCube.objectNum:
  648.     DS.W    1
  649.  
  650. ;======= END OF DEMO-EFFECT OBJECT ========