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

  1. ; 2d textured water. Accurate. A screen for delta.
  2.  
  3. ;======= OBJECT EQUATES ========
  4.  
  5. ; Basin dimensions: must be small due to dsp mixer!
  6. Water.BASIN_RAW_WIDTH:        =    144
  7. Water.BASIN_RAW_HEIGHT:        =    82
  8. Water.BASIN_TOTAL_WIDTH:    =    Water.BASIN_RAW_WIDTH+2
  9. Water.BASIN_TOTAL_HEIGHT:    =    Water.BASIN_RAW_HEIGHT+2
  10.  
  11. ;======= OBJECT TABLE ========
  12.  
  13. * Must be first in object!!
  14. Water.table:
  15.     DC.L    Water.mainLoop
  16.     DC.L    Water.init
  17.     DC.L    Water.setRes
  18.     DC.L    Water.setCirclePisser
  19.     DC.L    Water.setSinePisser
  20.     DC.L    Water.setBigDrop
  21.     DC.L    Water.setRainDrops
  22.     DC.L    0
  23.  
  24. ;======= RESOLUTION SETTING ROUTINE ========
  25.  
  26. Water.setRes:
  27.     move.l    frmcnt,d0
  28.     sub.l    lastframecount,d0
  29.     beq.s    .end
  30.  
  31.     move.l    #rts,vbl_gfx
  32.  
  33.     move.w    monitormode,d0
  34.     cmpi.w    #vga60,d0
  35.     beq.s    .vga60
  36.     cmpi.w    #vga100,d0
  37.     beq.s    .vga100
  38.     cmpi.w    #rgb50,d0
  39.     beq.s    .rgb50
  40. * Unknown monitormode..
  41. .end:    rts
  42. .vga60:    bra.l    vga60_16bit_160_200
  43. .vga100:bra.l    vga100_16bit_160_100
  44. .rgb50:    bra.l    rgb50_16bit_320_100
  45.  
  46. ;======= INIT SUBROUTINE ========
  47.  
  48. Water.init:
  49.     lea    Water.flowTable,a1
  50.     lea    Water.pal,a0
  51.     bsr.l    Pal.makeGradientHc
  52.  
  53.     moveq    #0,d0
  54.     rts
  55.  
  56. Water.realtimeInit:
  57.     move.l    #Water.setRes,vbl_gfx
  58.  
  59. ; Requires Dsp.loadProgram function!
  60.     move.l    #(Water.p56End-Water.p56)/3,d0
  61.     lea    Water.p56,a0
  62.     bsr    Dsp.loadProgram
  63.  
  64.     move.l    #$278AB156,random
  65.  
  66.     move.l    #Water.pissCircle,Water.dropRout
  67.     rts
  68.  
  69. ;======= SCREENINIT SUBROUTINE ========
  70.  
  71. Water.initScreen:
  72.     IFEQ    testmode
  73.     movea.l    scr,a0
  74.     bsr.l    CLEAR_320100TSCR
  75.     ENDC
  76.     rts
  77.  
  78. ;======= MAINLOOP SUBROUTINE ========
  79.  
  80. Water.mainLoop:
  81.     move.w    $468.w,.old468
  82.  
  83.     move.l    frmcnt,d0
  84.     sub.l    lastframecount,d0
  85.     bne.s    .end_realtime_init
  86.     move.l    d0,-(sp)
  87.     bsr    Water.realtimeInit
  88.     move.l    (sp)+,d0
  89. .end_realtime_init:
  90.     cmpi.l    #3,d0
  91.     bhs.s    .end_screeninit
  92.     bsr    Water.initScreen
  93. .end_screeninit:
  94.  
  95.     IFNE    1
  96.  
  97.     movea.l    Water.dropRout,a0
  98.     jsr    (a0)
  99.  
  100.     ELSE
  101.  
  102.     move.w    $4bc.w,d0
  103.     andi.w    #%0000001000000000,d0
  104.     beq.s    .endfill
  105.     movea.l    Water.frontAdr,a0
  106.     lea    falconheight_dat,a1
  107.     move.w    #Water.BASIN_RAW_HEIGHT-1,d7
  108.     moveq    #0,d0
  109. .yloop:    move.w    #Water.BASIN_RAW_WIDTH-1,d6
  110. .xloop:    move.b    (a1)+,d0
  111.     lsr.b    #4,d0
  112.     add.w    d0,(a0)+
  113.     ;lsr.b    #1,d0
  114.     ;move.w    d0,(a0)+
  115.     dbra    d6,.xloop
  116.     addq    #4,a0
  117.     dbra    d7,.yloop
  118. .endfill:
  119.  
  120.     ENDC
  121.  
  122.     movea.l    Water.paintRout,a0
  123.     jsr    (a0)
  124.  
  125.     IFEQ    testmode
  126.     move.w    .old468(pc),d0
  127.     moveq    #2,d3
  128.     cmpi.w    #vga100,monitormode
  129.     bne.s    .wait
  130.     moveq    #4,d3
  131. .wait:    move.w    $0468.w,d2
  132.     sub.w    d0,d2
  133.     cmp.w    d3,d2
  134.     blt.s    .wait
  135.  
  136.     lea    scr,a0
  137.     move.l    (a0)+,d0
  138.     move.l    (a0)+,d1
  139.     move.l    (a0),-4(a0)
  140.     move.l    d0,(a0)
  141.     move.l    d1,-8(a0)
  142.     move.l    d0,d1
  143.     lsr.w    #8,d0
  144.     move.l    d0,$ffff8200.w
  145.     move.b    d1,$ffff820d.w
  146.     ENDC
  147.     rts
  148.  
  149. .old468:DC.W    0
  150.  
  151. ;======= OBJECT SUBROUTINES ========
  152.  
  153. Water.setCirclePisser:
  154.     move.l    #Water.pissCircle,Water.dropRout
  155.     rts
  156.  
  157. Water.setSinePisser:
  158.     move.l    #Water.pissSine,Water.dropRout
  159.     rts
  160.  
  161. Water.setBigDrop:
  162.     move.l    #Water.dropBigOne,Water.dropRout
  163.     rts
  164.  
  165. Water.setRainDrops:
  166.     move.l    #Water.dropRain,Water.dropRout
  167.     rts
  168.  
  169.     IFNE    0
  170. INSTALL_PALETTEPAINTER:
  171.     move.l    #PAINT_DSPWATER,Water.paintRout
  172.     rts
  173.  
  174. INSTALL_BACKDROPPAINTER:
  175.     move.l    #PAINT_DSPOFFSETWATER,Water.paintRout
  176.     rts
  177.     ENDC
  178.  
  179. Water.pissCircle:
  180.     lea    sine_tbl,a0
  181.     move.w    $4bc.w,d0
  182.     add.w    d0,d0
  183.     Do_SinModulo    d0
  184.     Get_SinCos    a0,d0,d1,d2
  185.     muls.w    #(Water.BASIN_RAW_WIDTH*4)/5,d1
  186.     muls.w    #(Water.BASIN_RAW_HEIGHT*2)/3,d2
  187.     swap    d1
  188.     swap    d2
  189.     addi.w    #Water.BASIN_TOTAL_WIDTH/2,d1
  190.     addi.w    #Water.BASIN_TOTAL_HEIGHT/2,d2
  191.     mulu.w    #Water.BASIN_TOTAL_WIDTH,d2
  192.     ext.l    d1
  193.     add.l    d2,d1
  194.     IFNE    0
  195.     movea.l    Water.frontAdr,a0
  196.     move.w    #$00ff,(a0,d1.l*2)
  197.     ENDC
  198.  
  199.     lea    Water.dropletTable,a0
  200.     move.w    #1,(a0)+
  201.     move.w    d1,(a0)+
  202.     move.w    #200,(a0)+
  203.     subq    #6,a0
  204.     bsr    SEND_DROPS
  205.     rts
  206.  
  207. Water.dropBigOne:
  208.     lea    Water.dropletTable,a0
  209.     move.w    $4bc.w,d0
  210.     andi.w    #$0200,d0
  211.     beq.s    .send_none
  212.  
  213.     move.w    #Water.BASIN_TOTAL_WIDTH*(Water.BASIN_RAW_HEIGHT/2)+Water.BASIN_TOTAL_WIDTH/2,d1
  214.     move.w    #2000,d2
  215.     move.w    #3,(a0)+
  216.     move.w    d1,(a0)+
  217.     move.w    d2,(a0)+
  218.     addq.w    #1,d1
  219.     move.w    d1,(a0)+
  220.     move.w    d2,(a0)+
  221.     addq.w    #1,d1
  222.     move.w    d1,(a0)+
  223.     move.w    d2,(a0)+
  224.     lea    Water.dropletTable,a0
  225.     bsr    SEND_DROPS
  226.     rts
  227. .send_none:
  228.     move.w    #0,(a0)
  229.     bsr    SEND_DROPS
  230.     rts
  231.  
  232. Water.dropRain:
  233.     Calc_NextRandom
  234.     move.l    #$0000ffff,d2
  235.     and.l    d2,d0
  236.     and.l    d2,d1
  237.     divu.w    #Water.BASIN_RAW_WIDTH,d0
  238.     divu.w    #Water.BASIN_RAW_HEIGHT,d1
  239.     swap    d0
  240.     swap    d1
  241.     mulu.w    #Water.BASIN_TOTAL_WIDTH,d1
  242.     add.w    d0,d1
  243.     lea    Water.dropletTable,a0
  244.     move.w    #1,(a0)+
  245.     move.w    d1,(a0)+
  246.     move.w    #200,(a0)+
  247.     subq    #6,a0
  248.     bsr    SEND_DROPS
  249.     rts
  250.  
  251. Water.pissSine:
  252.     lea    sine_tbl,a0
  253.     move.w    $4bc.w,d0
  254.     move.w    d0,d3
  255.     mulu.w    #3,d3
  256.     lsr.w    #1,d3
  257.     add.w    d0,d0
  258.     Do_SinModulo    d0
  259.     Do_SinModulo    d3
  260.     Get_Sin    a0,d0,d1
  261.     Get_Sin    a0,d3,d2
  262.     muls.w    #(Water.BASIN_RAW_WIDTH*4)/5,d1
  263.     muls.w    #(Water.BASIN_RAW_HEIGHT*2)/3,d2
  264.     swap    d1
  265.     swap    d2
  266.     addi.w    #Water.BASIN_TOTAL_WIDTH/2,d1
  267.     addi.w    #Water.BASIN_TOTAL_HEIGHT/2,d2
  268.     mulu.w    #Water.BASIN_TOTAL_WIDTH,d2
  269.     ext.l    d1
  270.     add.l    d2,d1
  271.     IFNE    0
  272.     movea.l    Water.frontAdr,a0
  273.     move.w    #$00ff,(a0,d1.l*2)
  274.     ENDC
  275.  
  276.     lea    Water.dropletTable,a0
  277.     move.w    #1,(a0)+
  278.     move.w    d1,(a0)+
  279.     move.w    #200,(a0)+
  280.     subq    #6,a0
  281.     bsr    SEND_DROPS
  282.     rts
  283.  
  284. Water.PaintPal:
  285.     movea.l    scr,a0
  286.     lea    640*((100-Water.BASIN_RAW_HEIGHT)/2)(a0),a0
  287.     move.l    #(160-Water.BASIN_RAW_WIDTH)*4,d5
  288.     move.l    d5,d0
  289.     lsr.l    #1,d0
  290.     adda.l    d0,a0
  291.     lea    $ffffa206.w,a1
  292.     moveq    #Water.BASIN_RAW_HEIGHT-1,d7
  293.     lea    Water.pal+256*4,a6
  294.  
  295. .wait_recvdsp:
  296.     btst    #0,$ffffa202.w
  297.     beq.s    .wait_recvdsp
  298.  
  299. .yloop:    moveq    #Water.BASIN_RAW_WIDTH/16-1,d6
  300.  
  301. .xloop:    REPT    16
  302.     move.w    (a1),d0
  303.     move.l    (a6,d0.w),(a0)+
  304.     ENDR
  305.     dbra    d6,.xloop
  306.  
  307.     adda.l    d5,a0
  308.     dbra    d7,.yloop
  309.     rts
  310.  
  311. Water.paintDspOffsets:
  312.     movea.l    scr,a0
  313.  
  314.     lea    $ffffa206.w,a1
  315.     moveq    #Water.BASIN_RAW_HEIGHT-1,d7
  316.     lea    Texture.16bTexture2+(256*70+60)*2,a6
  317.  
  318.     move.w    monitormode,d0
  319.     cmpi.w    #vga60,d0
  320.     beq    Water.paintVga60
  321.     cmpi.w    #vga100,d0
  322.     beq    Water.paintVga100
  323.     cmpi.w    #rgb50,d0
  324.     beq    Water.paintRgb50
  325. * Unknown monitormode..
  326.     rts
  327.  
  328. Water.paintVga60:
  329.     move.l    #160-Water.BASIN_RAW_WIDTH,d0
  330.     andi.w    #$fffe,d0
  331.     adda.l    d0,a0
  332.     lea    160*((100-Water.BASIN_RAW_HEIGHT)/2)*2(a0),a0
  333.     move.l    #(160*2-Water.BASIN_RAW_WIDTH)*2,d5
  334.     lea    160*2(a0),a2
  335.  
  336. .wait_recvdsp:
  337.     btst    #0,$ffffa202.w
  338.     beq.s    .wait_recvdsp
  339.  
  340. .yloop:    moveq    #Water.BASIN_RAW_WIDTH/16-1,d6
  341.  
  342. .xloop:
  343.     REPT    16
  344.     move.w    (a1),d0
  345.     move.w    (a6,d0.w),(a0)+
  346.     move.w    (a6,d0.w),(a2)+
  347.     addq    #2,a6
  348.     ENDR
  349.     dbra    d6,.xloop
  350.  
  351.     lea    (256-Water.BASIN_RAW_WIDTH)*2(a6),a6
  352.     adda.l    d5,a0
  353.     adda.l    d5,a2
  354.     dbra    d7,.yloop
  355.     rts
  356.  
  357. Water.paintVga100:
  358.     move.l    #160-Water.BASIN_RAW_WIDTH,d0
  359.     andi.w    #$fffe,d0
  360.     adda.l    d0,a0
  361.     lea    160*((100-Water.BASIN_RAW_HEIGHT)/2)*2(a0),a0
  362.     move.l    #(160-Water.BASIN_RAW_WIDTH)*2,d5
  363.  
  364. .wait_recvdsp:
  365.     btst    #0,$ffffa202.w
  366.     beq.s    .wait_recvdsp
  367.  
  368. .yloop:    moveq    #Water.BASIN_RAW_WIDTH/16-1,d6
  369.  
  370. .xloop:    REPT    16
  371.     move.w    (a1),d0
  372.     move.w    (a6,d0.w),(a0)+
  373.     addq    #2,a6
  374.     ENDR
  375.     dbra    d6,.xloop
  376.  
  377.     lea    (256-Water.BASIN_RAW_WIDTH)*2(a6),a6
  378.     adda.l    d5,a0
  379.     dbra    d7,.yloop
  380.     rts
  381.  
  382. Water.paintRgb50:
  383.     move.l    #(160-Water.BASIN_RAW_WIDTH)*4,d5
  384.     move.l    d5,d0
  385.     lsr.l    #1,d0
  386.     adda.l    d0,a0
  387.     lea    640*((100-Water.BASIN_RAW_HEIGHT)/2)(a0),a0
  388.  
  389. .wait_recvdsp:
  390.     btst    #0,$ffffa202.w
  391.     beq.s    .wait_recvdsp
  392.  
  393. .yloop:    moveq    #Water.BASIN_RAW_WIDTH/16-1,d6
  394.  
  395. .xloop:    REPT    16
  396.     move.w    (a1),d0
  397.     move.l    (a6,d0.w*2),(a0)+
  398.     addq    #2,a6
  399.     ENDR
  400.     dbra    d6,.xloop
  401.  
  402.     lea    (256-Water.BASIN_RAW_WIDTH)*2(a6),a6
  403.     adda.l    d5,a0
  404.     dbra    d7,.yloop
  405.     rts
  406.  
  407. * INPUT: a0: droplet table
  408. SEND_DROPS:
  409.     moveq    #0,d7
  410.     move.w    (a0)+,d7
  411. .wait_dsp:
  412.     btst    #1,$ffffa202.w
  413.     beq.s    .wait_dsp
  414.     move.l    d7,$ffffa204.w
  415.     subq.w    #1,d7
  416.     bmi.s    .end
  417.     moveq    #0,d0
  418.  
  419. .loop:
  420.     move.w    (a0)+,d0
  421. .wait1_dsp:
  422.     btst    #1,$ffffa202.w
  423.     beq.s    .wait1_dsp
  424.     move.l    d0,$ffffa204.w
  425.     move.w    (a0)+,d0
  426. .wait2_dsp:
  427.     btst    #1,$ffffa202.w
  428.     beq.s    .wait2_dsp
  429.     move.l    d0,$ffffa204.w
  430.     dbra    d7,.loop
  431.  
  432. .end:    rts
  433.  
  434.     IFNE    0
  435.  
  436. PLOT_WATER:
  437.     movea.l    scr,a0
  438.     lea    Water.pal+256*4,a6
  439.     movea.l    Water.backAdr,a5
  440.     movea.l    Water.frontAdr,a1
  441.     move.l    a1,Water.backAdr
  442.     move.l    a5,Water.frontAdr
  443.     addq    #2,a1
  444.     addq    #2,a5
  445.  
  446.     lea    -2(a1),a2
  447.     lea    2(a1),a3
  448.     lea    (Water.BASIN_TOTAL_WIDTH-1)*2(a1),a4
  449.     lea    (-Water.BASIN_TOTAL_WIDTH-1)*2(a1),a1
  450.     move.l    #(160-Water.BASIN_RAW_WIDTH)*4,d5
  451.     moveq    #Water.BASIN_RAW_HEIGHT-1,d7
  452.  
  453. .yloop:    move.w    #Water.BASIN_RAW_WIDTH-1,d6
  454.  
  455. .xloop:    move.w    (a1)+,d0
  456.     add.w    (a1),d0
  457.     add.w    2(a1),d0
  458.  
  459.     add.w    (a2)+,d0
  460.     add.w    (a3)+,d0
  461.  
  462.     add.w    (a4)+,d0
  463.     add.w    (a4),d0
  464.     add.w    2(a4),d0
  465.  
  466.     asr.w    #2,d0
  467.  
  468.     sub.w    (a5),d0
  469.     move.w    d0,d1
  470.     asr.w    #5,d1
  471.     sub.w    d1,d0
  472.     move.w    d0,(a5)+
  473.  
  474.     move.l    (a6,d0.w*4),(a0)+
  475.  
  476.     dbra    d6,.xloop
  477.  
  478.     addq    #2*2,a1
  479.     addq    #2*2,a2
  480.     addq    #2*2,a3
  481.     addq    #2*2,a4
  482.     addq    #2*2,a5
  483.     adda.l    d5,a0
  484.     dbra    d7,.yloop
  485.     rts
  486.  
  487.     ENDC
  488.  
  489. ;======= OBJECT DATA ========
  490.  
  491.     DATA
  492.  
  493. Water.p56:
  494.     INCBIN    DSPWATER.P56
  495. Water.p56End:
  496.     EVEN
  497.  
  498.     IFNE    0
  499. Water.frontAdr:
  500.     DC.L    Water.buffer1
  501. Water.backAdr:
  502.     DC.L    Water.buffer2
  503.     ENDC
  504.  
  505. Water.flowTable:
  506.     DC.W    32    (.end-.start)/4
  507.     DC.W    4
  508. .start:    DC.L    $00000000    ;DC.L    $00000000
  509.     DC.L    $0000001f    ;DC.L    $003f0000
  510.     DC.L    $0000003f    ;DC.L    $007f0000
  511.     DC.L    $0000005f    ;DC.L    $3fdf0000
  512.     DC.L    $0000007f    ;DC.L    $7fff0000
  513.     DC.L    $0000009f    ;DC.L    $dfff0000
  514.     DC.L    $000000bf    ;DC.L    $ffff0000
  515.     DC.L    $000000df    ;DC.L    $ffff003f
  516.     DC.L    $000000ff    ;DC.L    $ffff007f
  517.     DC.L    $001f00ff    ;DC.L    $ffff00bf
  518.     DC.L    $003f00ff    ;DC.L    $ffff00ff
  519.     DC.L    $005f00ff    ;DC.L    $ffff00ff
  520.     DC.L    $007f00ff    ;DC.L    $ffff00ff
  521.     DC.L    $009f00ff    ;DC.L    $ffff00ff
  522.     DC.L    $00bf00ff    ;DC.L    $ffff00ff
  523.     DC.L    $00df00ff    ;DC.L    $ffff00ff
  524.     DC.L    $00ff00ff    ;DC.L    $ffff00ff
  525.     DC.L    $1fff00ff
  526.     DC.L    $3fff00ff
  527.     DC.L    $5fff00ff
  528.     DC.L    $7fff00ff
  529.     DC.L    $9fff00ff
  530.     DC.L    $bfff00ff
  531.     DC.L    $dfff00ff
  532.     DC.L    $ffff00ff
  533.     DC.L    $ffdf00df
  534.     DC.L    $ffbf00bf
  535.     DC.L    $ff9f009f
  536.     DC.L    $ff7f007f
  537.     DC.L    $ff5f005f
  538.     DC.L    $ff3f003f
  539.     DC.L    $ff1f001f
  540.     DC.L    $ff000000
  541. .end:
  542.  
  543. Water.paintRout:
  544.     DC.L    Water.paintDspOffsets
  545.  
  546. ;======= OBJECT RESERVES ========
  547.  
  548.     BSS
  549.  
  550. Water.pal:
  551.     DS.W    512
  552.  
  553.     IFNE    0
  554.  
  555.     DS.W    Water.BASIN_TOTAL_WIDTH
  556. Water.buffer1:
  557.     DS.W    Water.BASIN_TOTAL_WIDTH*Water.BASIN_RAW_HEIGHT
  558.     DS.W    Water.BASIN_TOTAL_WIDTH
  559. Water.buffer2:
  560.     DS.W    Water.BASIN_TOTAL_WIDTH*Water.BASIN_RAW_HEIGHT
  561.     DS.W    Water.BASIN_TOTAL_WIDTH
  562.  
  563.     ENDC
  564.  
  565. Water.dropletTable:
  566.     DS.W    1+16                ; 16 drops max each frame!
  567.  
  568. Water.dropRout:
  569.     DS.L    1
  570.  
  571. ;======= END OF DEMO-EFFECT OBJECT ========