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

  1. ; Final version of metaballs using dsp. code: 2002 by earx
  2. ;
  3. ; Dsp:
  4. ; - generates field and normals
  5. ; - polygonizes using marching cubes
  6. ; - maps
  7. ; Cpu:
  8. ; - calcs ball trajectories
  9. ; - copies texturepixels
  10.  
  11. ;======= OBJECT EQUATES ====================================================
  12.  
  13. MCubes.SHOW_TRIS:    =    0                ; Shows #tris.
  14. MCubes.GEN_TEXTURE:    =    0                ; Generate envtexture or use from disk?
  15.  
  16. MCubes.DEST_ISOLEVEL:    =    512
  17.  
  18. ;======= OBJECT TABLE ======================================================
  19.  
  20. ; Must be first in object!!
  21. MCubes.table:
  22.     DC.L    MCubes.mainLoop
  23.     DC.L    MCubes.init
  24.     DC.L    MCubes.setRes
  25.     DC.L    MCubes.setIncLevel
  26.     DC.L    MCubes.setDecLevel
  27.     DC.L    MCubes.keepLevel
  28.     DC.L    0
  29.  
  30. ;======= RESOLUTION SETTING ROUTINE ========================================
  31.  
  32. MCubes.setRes:
  33.     IFEQ    testmode
  34.     move.l    #rts,vbl_gfx
  35.  
  36.     move.w    $0468.w,d0
  37. .ck468:    cmp.w    $0468.w,d0
  38.     beq.s    .ck468
  39.     move.w    monitormode,d0
  40.     cmpi.w    #vga60,d0
  41.     beq.s    .vga60
  42.     cmpi.w    #vga100,d0
  43.     beq.s    .vga100
  44.     cmpi.w    #rgb50,d0
  45.     beq.s    .rgb50
  46. ; Unknown monitormode..
  47.     rts
  48. .vga60:    bra.l    vga60_16bit_320_200
  49. .vga100:bra.l    vga100_16bit_320_200
  50. .rgb50:    bra.l    rgb50_16bit_320_200
  51.     ENDC
  52.     rts
  53.  
  54. ;======= INIT SUBROUTINE ===================================================
  55.  
  56. ; OUTPUT:
  57. ; d0.l: 0: All clear, <0: Error! Not initialized!
  58. MCubes.init:
  59.  
  60.     IFNE    MCubes.GEN_TEXTURE
  61.     lea    MCubes.texture+20,a0
  62.     lea    FlareGen.fogPal,a1
  63.     moveq    #6,d0
  64.     moveq    #3,d1
  65.     move.l    #$00027001,d2
  66.     bsr.l    Texture.createWords2
  67.     bsr    MCubes.fadeTexture
  68.     ENDC
  69.  
  70. .success:
  71.     moveq    #0,d0
  72.     rts
  73. .error:    moveq    #-1,d0
  74.     rts
  75.  
  76. ;======= REALTIME INIT SUBROUTINE ==========================================
  77.  
  78. MCubes.realtimeInit:
  79. ; Kicks in P56 DSP-program..
  80.     move.l    #(MCubes.p56End-MCubes.p56)/3,d0
  81.     lea    MCubes.p56,a0
  82.     bsr.l    Dsp.loadProgram
  83.  
  84. ; Send tables over, keep these in exact order!
  85.     receiveWordFromDsp    MCubes.numBalls
  86.     bsr.w    MCubes.sendTexture
  87.     bsr.w    MCubes.sendEdges
  88.     bsr.w    MCubes.sendTriTable
  89.  
  90.     clr.w    MCubes.isolevel
  91.     bsr.w    MCubes.setIncLevel
  92.  
  93.     move.w    $04BC.w,MCubes.startTime
  94.     rts
  95.  
  96. ;======= SCREENINIT SUBROUTINE =============================================
  97.  
  98. MCubes.initScreen:
  99.     movea.l    scr,a0
  100.     bsr.l    CLEAR_320200TSCR
  101.     rts
  102.  
  103. ;======= MAINLOOP SUBROUTINE ===============================================
  104.  
  105. MCubes.mainLoop:
  106.     move.l    frmcnt,d0
  107.     sub.l    lastframecount,d0
  108.     bne.s    .end_realtime_init
  109.     move.l    d0,-(sp)
  110.     bsr.w    MCubes.realtimeInit
  111.     move.l    (sp)+,d0
  112. .end_realtime_init:
  113.     cmpi.l    #3,d0
  114.     bhs.s    .end_screeninit
  115.     bsr.w    MCubes.initScreen
  116. .end_screeninit:
  117.  
  118.     bsr.w    MCubes.calcLevel
  119.     bsr.w    MCubes.sendBallPos            ; Send current grid to dsp.
  120.  
  121. ;- parallel ----------------------------------------------------------------
  122.  
  123.     bsr.w    MCubes.clearRectangle            ; Clear screenarea.
  124.     bsr.w    MCubes.showTriangles            ; Show stats from last frame.
  125.  
  126. ;- back to serial ----------------------------------------------------------
  127.  
  128.     bsr.w    MCubes.paint                ; Paint triangles.
  129.  
  130.     IFEQ    testmode
  131.     lea    scr,a0
  132.     move.l    (a0)+,d0
  133.     move.l    (a0)+,d1
  134.     move.l    (a0),-4(a0)
  135.     move.l    d0,(a0)
  136.     move.l    d1,-8(a0)
  137.     move.l    d0,d1
  138.     lsr.w    #8,d0
  139.     move.l    d0,$ffff8200.w
  140.     move.b    d1,$ffff820d.w
  141.     ENDC
  142.  
  143.     move.l    frmcnt,d0
  144.     sub.l    lastframecount,d0
  145.     bne.s    .res_done
  146.     bsr.w    MCubes.setRes
  147. .res_done:
  148.  
  149.     rts
  150.  
  151. ;======= OBJECT SUBROUTINES ================================================
  152.  
  153. MCubes.setIncLevel:
  154.     move.w    #+1,MCubes.levelDir
  155.     move.w    $04BC.w,MCubes.incStart
  156.     move.w    MCubes.isolevel,MCubes.oldLevel
  157.     rts
  158.  
  159. MCubes.setDecLevel:
  160.     move.w    #-1,MCubes.levelDir
  161.     move.w    $04BC.w,MCubes.incStart
  162.     move.w    MCubes.isolevel,MCubes.oldLevel
  163.     rts
  164.  
  165. MCubes.keepLevel:
  166.     clr.w    MCubes.levelDir
  167.     move.w    MCubes.isolevel,MCubes.oldLevel
  168.     rts
  169.  
  170.     IFNE    MCubes.GEN_TEXTURE
  171. MCubes.fadeTexture:
  172.     lea    MCubes.texture+20,a0
  173.     moveq    #64,d0
  174. ; d0.w=width=height, a0: dst buffer
  175.     move.w    d0,d5
  176.     move.w    d0,d7
  177.     subq.w    #1,d7
  178.  
  179. .yloop:    move.w    d5,d6
  180.     subq.w    #1,d6
  181.  
  182. .xloop:    move.w    d6,d0
  183.     muls.w    d0,d0
  184.     move.w    d7,d1
  185.     muls.w    d1,d1
  186.     add.l    d1,d0
  187.     clr.l    d1
  188.     move.w    (a0),d1
  189.  
  190.     IFNE    1
  191.  
  192.     move.l    d1,d4
  193.     move.l    d0,d1
  194.     bsr.l    Math.sqrt
  195.     swap    d0
  196.     mulu.w    #11314,d0
  197.     divu.w    #850,d0
  198.     cmpi.w    #sintbllen/2,d0
  199.     blt.s    .d_ok
  200.     move.w    #sintbllen/2,d0
  201. .d_ok:    move.l    d4,d1
  202.  
  203.     Get_Sin    sine_tbl+2,d0,d0
  204.     move.w    d0,d2
  205.     REPT    2
  206.     muls.w    d0,d0
  207.     add.l    d0,d0
  208.     swap    d0
  209.     ENDR
  210.     muls.w    d2,d0
  211.     add.l    d0,d0
  212.     swap    d0
  213.     ext.l    d0
  214.  
  215. ; scale up.
  216.     lsl.l    #2,d0
  217. ; add 1.
  218.     addi.l    #$8000,d0
  219. ; no negatives allowed..
  220.     bpl.s    .ok
  221.     clr.l    d0
  222. ; scale down to 8:8..
  223. .ok:    lsr.l    #7,d0
  224.  
  225.     move.l    d1,d2
  226.     move.l    d1,d3
  227.     andi.w    #$F800,d1
  228.     andi.w    #$07E0,d2
  229.     andi.w    #$001F,d3
  230.     mulu.w    d0,d1
  231.     mulu.w    d0,d2
  232.     mulu.w    d0,d3
  233.     lsr.l    #8,d1
  234.     lsr.l    #8,d2
  235.     lsr.l    #8,d3
  236.     cmpi.l    #$F800,d1
  237.     blo.s    .r_ok
  238.     move.w    #$F800,d1
  239. .r_ok:    cmpi.l    #$07E0,d2
  240.     blt.s    .g_ok
  241.     move.w    #$07E0,d2
  242. .g_ok:    cmpi.l    #$001F,d3
  243.     blt.s    .b_ok
  244.     move.w    #$001F,d3
  245. .b_ok:
  246.  
  247.     ELSE
  248.  
  249.     lsr.l    #3,d0
  250.     bne.s    .okay
  251.     moveq    #$FFFFFFFF,d1
  252.     bra.s    .store
  253. .okay:    move.l    d1,d2
  254.     move.l    d1,d3
  255.     andi.w    #$F800,d1
  256.     andi.w    #$07E0,d2
  257.     andi.w    #$001F,d3
  258.     lsl.l    #5,d1
  259.     lsl.l    #5,d2
  260.     lsl.l    #5,d3
  261.     divu.w    d0,d1
  262.     bvc.s    .r_ok
  263.     moveq    #$FFFFFFFF,d1
  264. .r_ok:    divu.w    d0,d2
  265.     cmpi.w    #$07E0,d2
  266.     bls.s    .g_ok
  267.     moveq    #$FFFFFFFF,d2
  268. .g_ok:    divu.w    d0,d3
  269.     cmpi.w    #$001F,d3
  270.     bls.s    .b_ok
  271.     moveq    #$FFFFFFFF,d3
  272. .b_ok:
  273.  
  274.     ENDC
  275.  
  276.     andi.w    #$F800,d1
  277.     andi.w    #$07E0,d2
  278.     andi.w    #$001F,d3
  279.     or.w    d2,d1
  280.     or.w    d3,d1
  281. .store:    move.w    d1,(a0)+
  282.     subq.w    #2,d6
  283.     cmpi.w    #-63,d6
  284.     bge    .xloop
  285.  
  286.     subq.w    #2,d7
  287.     cmpi.w    #-63,d7
  288.     bge    .yloop
  289.  
  290.     rts
  291.     ENDC
  292.  
  293. MCubes.calcLevel:
  294.     move.w    $04BC.w,d0
  295.     sub.w    MCubes.incStart,d0
  296.     muls.w    MCubes.levelDir,d0
  297.     add.w    MCubes.oldLevel,d0
  298.     move.w    d0,MCubes.isolevel
  299.     rts
  300.  
  301. MCubes.sendTexture:
  302.     lea    MCubes.texture+20,a0
  303.     clr.l    d0
  304.     move.w    #4096-1,d7
  305. .loop:    move.w    (a0)+,d0
  306.     sendLongToDsp    d0
  307.     dbf    d7,.loop
  308.     rts
  309.  
  310. MCubes.sendEdges:
  311.     lea    MCubes.edgeTable,a0
  312.     clr.l    d0
  313.     move.w    #256-1,d7
  314. .loop:    move.w    (a0)+,d0
  315.     sendLongToDsp    d0
  316.     dbf    d7,.loop
  317.     rts
  318.  
  319. MCubes.sendTriTable:
  320.     lea    MCubes.triTable,a0
  321.     move.w    #4096-1,d7
  322. .loop:    move.w    (a0)+,d0
  323.     ext.l    d0
  324.     sendLongToDsp    d0
  325.     dbf    d7,.loop
  326.     rts
  327.  
  328. ; Calc ballpositions and send to dsp..
  329. MCubes.sendBallPos:
  330. ; Send isolevel to dsp..
  331.     clr.l    d0
  332.     move.w    MCubes.isolevel,d0
  333.     sendLongToDsp    d0
  334.  
  335. ; Send ballpositions.
  336.     move.w    MCubes.numBalls,d7            ; d7.w=#balls >0 !!
  337.     mulu.w    #3,d7                    ; d7.w=#coords
  338.     subq.w    #1,d7                    ; d7.w=#coords-1
  339.     lea    MCubes.mulTable,a2
  340.     lea    sine_tbl,a1
  341.     move.w    $04BC.w,d0
  342.     sub.w    MCubes.startTime,d0
  343.     clr.l    d2
  344.  
  345. .calc_coord_loop:
  346.     move.w    d0,d1
  347.     mulu.w    (a2)+,d1
  348.     lsr.l    #7,d1
  349.     Do_SinModulo    d1
  350.     Get_Sin    a1,d1,d2
  351.     lsl.l    #8,d2
  352.     sendLongToDsp    d2
  353.     dbf    d7,.calc_coord_loop
  354.     rts
  355.  
  356. MCubes.showTriangles:
  357.     IFNE    MCubes.SHOW_TRIS
  358. ; Paint #triangles (culled & unculled)..
  359.     movea.l    scr,a0
  360.     move.w    MCubes.tris,d7
  361.     beq.s    .end
  362.     subq.w    #1,d7
  363.     moveq    #$FFFFFFFF,d0
  364. .paint_line_loop:
  365.     move.w    d0,(a0)+
  366.     dbf    d7,.paint_line_loop
  367.  
  368.     clr.w    MCubes.tris                ; #tris painted = 0
  369.     ENDC
  370. .end:    rts
  371.  
  372. ; Paints polys provided by dsp.
  373. MCubes.paint:
  374. .loop:    receiveWordFromDsp    d1
  375.     bmi.s    .end
  376.     bsr.s    paintPoly
  377.     IFNE    MCubes.SHOW_TRIS
  378.     addq.w    #1,MCubes.tris
  379.     ENDC
  380.     bra.s    .loop
  381.  
  382. .end:    rts
  383.  
  384. ; Receives incoming scanline data and paints it to the screen.
  385. ; This works for all shadetypes.
  386. ; INPUT:
  387. ; d1.w= top
  388. paintPoly:
  389.     lea    $FFFFA206.w,a1
  390.  
  391.     receiveWordFromDsp    d7            ; Get height.
  392.     ;move.w    (a1),d7
  393.  
  394.     subq.w    #1,d7
  395.     bpl.s    .go_on
  396.     rts
  397.  
  398. ; d1.w=top y, d7.w=height-1
  399. .go_on:    movea.l    scr,a0
  400.     move.l    #320*2,d5
  401.     mulu.w    d5,d1
  402.     adda.l    d1,a0
  403.     movea.l    a0,a6
  404. ; a0=a6=screen pos, d7.w=height-1
  405.  
  406. ; This is fast on a plain falcon. In fact, it kicks every other rout I've
  407. ; seen square in the nuts!!! =)) Speeds of 1.100.000 texels/s including
  408. ; overhead are no exception! Though this unrolled jumptree sucks on ct2.
  409.     moveq    #1<<4-1,d4
  410.     lea    .jmpend(pc),a2
  411.     clr.l    d1
  412.     clr.l    d6
  413.  
  414. .yloop:    move.w    (a1),d1                    ; Get left x.
  415.     lea    (a6,d1.l*2),a0
  416.     move.w    (a1),d6                    ; Get width.
  417.     bgt.s    .go
  418.     adda.l    d5,a6
  419.     dbf    d7,.yloop
  420.     rts
  421. .go:    move.l    d6,d3
  422.     lsr.l    #4,d6
  423.     and.l    d4,d3
  424.     neg.l    d3
  425.     jmp    (a2,d3.l*2)
  426.  
  427.     IFNE    *&2                    ; Put it longeven!
  428.     nop
  429.     ENDC
  430.  
  431. .xloop:    REPT    1<<4
  432.     move.w    (a1),(a0)+
  433.     ENDR
  434. .jmpend:dbf    d6,.xloop
  435.  
  436.     adda.l    d5,a6
  437.     dbf    d7,.yloop
  438.     rts
  439.  
  440. MCubes.clearRectangle:
  441.     movea.l    scr,a0
  442.     adda.w    #60*2,a0
  443.     move.w    #120*2,a6
  444.     clr.l    d0
  445.     move.w    #200-1,d7
  446.  
  447. .yloop:    moveq    #200/40-1,d6
  448.  
  449. .xloop:    REPT    20
  450.     move.l    d0,(a0)+
  451.     ENDR
  452.     dbf    d6,.xloop
  453.  
  454.     adda.l    a6,a0
  455.     dbf    d7,.yloop
  456.     rts
  457.  
  458. ;======= OBJECT DATA =======================================================
  459.  
  460.     DATA
  461.  
  462. MCubes.mulTable:
  463.     DC.W    $0100,$0180,$00CC
  464.     DC.W    $0078,$0113,$0096
  465.     DC.W    $00A8,$01A0,$0150
  466.     DC.W    $0107,$009A,$0114
  467.     DC.W    $005F,$0173,$00FE
  468.     DC.W    $0143,$00E2,$0123
  469.  
  470. MCubes.edgeTable:
  471.     INCBIN    EDGES.DAT            ; moronic..
  472. MCubes.triTable:
  473.     INCBIN    TRIS.DAT            ; ..and idiotic, but it works.
  474.  
  475. MCubes.p56:
  476.     INCBIN    MARCHING.P56
  477. MCubes.p56End:
  478.     EVEN
  479.  
  480.     IFEQ    MCubes.GEN_TEXTURE
  481. MCubes.texture:
  482.     INCBIN    64.APX    ;ENV64.APX
  483.     ENDC
  484.  
  485. ;======= OBJECT RESERVES ===================================================
  486.  
  487.     BSS
  488.  
  489. MCubes.tris:
  490.     DS.W    1                    ; #tris painted
  491. MCubes.startTime:
  492.     DS.W    1
  493. MCubes.numBalls:
  494.     DS.W    1
  495.  
  496.     IFNE    MCubes.GEN_TEXTURE
  497. MCubes.texture:
  498.     DS.W    10+64*64
  499.     ENDC
  500.  
  501. MCubes.isolevel:
  502.     DS.W    1
  503. MCubes.incStart:
  504.     DS.W    1
  505. MCubes.oldLevel:
  506.     DS.W    1
  507. MCubes.levelDir:
  508.     DS.W    1