home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / PLASMA.SO < prev    next >
Text File  |  2002-09-11  |  10KB  |  607 lines

  1. ; Textured sine plasma. A screen for delta.
  2.  
  3. ;======= OBJECT EQUATES ========
  4.  
  5.             RSRESET
  6. Plasma.TEXTURE:        RS.W    256*256
  7. Plasma.BLOCK_SIZE:    RS.B    0
  8.  
  9. ;======= OBJECT TABLE ========
  10.  
  11. * Must be first in object!!
  12. Plasma.table:
  13.     DC.L    PlasmaMAINLOOP
  14.     DC.L    Plasma.init
  15.     DC.L    Plasma.setRes
  16.     DC.L    Plasma.togglePalletteCycle
  17.     DC.L    Plasma.setPalletteMode
  18.     DC.L    Plasma.setBumpmapMode
  19. * Add more addresses here..
  20.     DC.L    0
  21.  
  22. ;======= RESOLUTION SETTING ROUTINE ========
  23.  
  24. Plasma.setRes:
  25.     IFEQ    testmode
  26.     move.l    frmcnt,d0
  27.     sub.l    lastframecount,d0
  28.     beq.s    .end
  29.  
  30.     move.l    #rts,vbl_gfx
  31.  
  32.     move.w    monitormode,d0
  33.     cmpi.w    #vga60,d0
  34.     beq.s    .vga60
  35.     cmpi.w    #vga100,d0
  36.     beq.s    .vga100
  37.     cmpi.w    #rgb50,d0
  38.     beq.s    .rgb50
  39. ; Unknown monitormode..
  40.     rts
  41. .vga60:    bra.l    vga60_16bit_160_200
  42. .vga100:bra.l    vga100_16bit_160_100
  43. .rgb50:    bra.l    rgb50_16bit_320_100
  44.     ENDC
  45. .end:    rts
  46.  
  47. ;======= INIT SUBROUTINE ========
  48.  
  49. ; OUTPUT: d0.l: 0   = All clear.
  50. ;               neg = Error! Not initialized!
  51. Plasma.init:
  52.     move.l    #Plasma.BLOCK_SIZE,d0
  53.     bsr.l    Mem.register
  54.     
  55.     lea    Plasma.flowTable,a1
  56.     lea    Plasma.pallette,a0
  57.     bsr.l    Pal.makeGradientHc
  58.  
  59.     bsr    Plasma.initSinewaves
  60.  
  61. .success:
  62.     moveq    #0,d0
  63.     rts
  64. .error:    moveq    #-1,d0
  65.     rts
  66.  
  67. Plasma.realtimeInit:
  68.     move.l    #Plasma.setRes,vbl_gfx
  69.  
  70.     bsr.l    Mem.getBlock
  71.     move.l    d0,Plasma.baseAdr
  72.  
  73.     movea.l    Plasma.baseAdr,a0
  74.     adda.l    #Plasma.TEXTURE,a0
  75.     lea    Texture.8bTexture1,a1
  76.     lea    Texture.crapPal,a2
  77.     clr.w    d7
  78.     clr.l    d0
  79. .conv_loop:
  80.     move.b    (a1)+,d0
  81.     move.w    (a2,d0.l*2),(a0)+
  82.     addq.w    #1,d7
  83.     bne.s    .conv_loop
  84.     rts
  85.  
  86. ;======= SCREENINIT SUBROUTINE ========
  87.  
  88. Plasma.initScreen:
  89. ; Insert screenarea initialising, etc. in here!
  90.     rts
  91.  
  92. ;======= MAINLOOP SUBROUTINE ========
  93.  
  94. PlasmaMAINLOOP:
  95.     move.w    $0468.w,.old468
  96.  
  97.     move.l    frmcnt,d0
  98.     sub.l    lastframecount,d0
  99.     bne.s    .end_realtime_init
  100.     move.l    d0,-(sp)
  101.     bsr    Plasma.realtimeInit
  102.     move.l    (sp)+,d0
  103. .end_realtime_init:
  104.     cmpi.l    #3,d0
  105.     bhs.s    .end_screeninit
  106.     bsr    Plasma.initScreen
  107. .end_screeninit:
  108.  
  109.     movea.l    Plasma.routineAddress,a0
  110.     jsr    (a0)
  111.  
  112.     IFEQ    testmode
  113.     lea    scr,a0
  114.     move.l    (a0)+,d0
  115.     move.l    (a0)+,d1
  116.     move.l    (a0),-4(a0)
  117.     move.l    d0,(a0)
  118.     move.l    d1,-8(a0)
  119.     move.l    d0,d1
  120.     lsr.w    #8,d0
  121.     move.l    d0,$ffff8200.w
  122.     move.b    d1,$ffff820d.w
  123.  
  124.     move.w    .old468(pc),d0
  125. .wait:    cmp.w    $0468.w,d0
  126.     beq.s    .wait
  127.     ENDC
  128.  
  129.     rts
  130.  
  131. .old468:DC.W    0
  132.  
  133. ;======= OBJECT SUBROUTINES ========
  134.  
  135. Plasma.togglePalletteCycle:
  136.     not.w    Plasma.cycling
  137.     rts
  138.  
  139. Plasma.setPalletteMode:
  140.     move.l    #Plasma.paint,Plasma.routineAddress
  141.     rts
  142.  
  143. Plasma.setBumpmapMode:
  144.     move.l    #Plasma.paintBumped,Plasma.routineAddress
  145.     rts
  146.  
  147. Plasma.initSinewaves:
  148. * Initialize first cosine table. This one has a short period.
  149.     lea    sine_tbl+2,a1
  150.     lea    Plasma.cosTable1,a0
  151.     move.w    #256-1,d7
  152. .loop1:    move.w    (a1),d0
  153.     addi.w    #$8000,d0
  154.     lsr.w    #8,d0
  155.     add.w    d0,d0
  156.     move.w    d0,(a0)+
  157.     lea    8*4(a1),a1
  158.     dbra    d7,.loop1
  159.  
  160.     lea    Plasma.cosTable1,a1
  161.     move.w    #256-1,d7
  162. .loop1a:move.w    (a1)+,(a0)+
  163.     dbra    d7,.loop1a
  164.  
  165.     lea    Plasma.cosTable1,a1
  166.     move.w    #256-1,d7
  167. .loop1b:move.w    (a1)+,(a0)+
  168.     dbra    d7,.loop1b
  169.  
  170. * Initialize first cosine table. This one has a short period.
  171.     lea    sine_tbl+2,a1
  172.     lea    Plasma.cosTable2,a0
  173.     move.w    #128-1,d7
  174. .loop2:    move.w    (a1),d0
  175.     addi.w    #$8000,d0
  176.     lsr.w    #8,d0
  177.     add.w    d0,d0
  178.     move.w    d0,(a0)+
  179.     lea    16*4(a1),a1
  180.     dbra    d7,.loop2
  181.  
  182.     lea    Plasma.cosTable2,a1
  183.     move.w    #128-1,d7
  184. .loop2a:move.w    (a1)+,(a0)+
  185.     dbra    d7,.loop2a
  186.  
  187.     lea    Plasma.cosTable2,a1
  188.     move.w    #128-1,d7
  189. .loop2b:move.w    (a1)+,(a0)+
  190.     dbra    d7,.loop2b
  191.  
  192.     lea    Plasma.cosTable1,a1
  193.     lea    Plasma.cosTable1a,a0
  194.     move.w    #256*3-1,d7
  195. .scaleloop1:
  196.     move.w    (a1)+,d0
  197.     lsr.w    #2,d0
  198.     andi.w    #$fe,d0
  199.     move.w    d0,(a0)+
  200.     dbra    d7,.scaleloop1
  201.  
  202.     lea    Plasma.cosTable2,a1
  203.     lea    Plasma.cosTable2a,a0
  204.     move.w    #128*3-1,d7
  205. .scaleloop2:
  206.     move.w    (a1)+,d0
  207.     lsr.w    #2,d0
  208.     andi.w    #$fe,d0
  209.     move.w    d0,(a0)+
  210.     dbra    d7,.scaleloop2
  211.  
  212.     rts
  213.  
  214. * Paints a pallette based sinoid plasma on screen.
  215. Plasma.paint:
  216.     movea.l    scr,a0
  217. .handle_cycling:
  218.     move.w    Plasma.cyclePhase,d0
  219.     tst.w    Plasma.cycling
  220.     beq.s    .end_handle_cycling
  221.     addq.w    #8,d0
  222.     andi.w    #1024-1,d0
  223.     move.w    d0,Plasma.cyclePhase
  224. .end_handle_cycling:
  225.     lea    (Plasma.pallette,d0.w*2),a1
  226.     lea    Plasma.cosTable1,a2
  227.     lea    Plasma.cosTable2,a6
  228.     moveq    #100-1,d7
  229.     move.w    $4bc.w,d0
  230.  
  231.     move.w    d0,d3
  232.     mulu.w    #11,d3
  233.     lsr.l    #4,d3
  234.     andi.w    #$00ff,d3
  235.     move.w    (a2,d3.w*2),d3
  236.     lsr.w    #2,d3
  237.     andi.w    #$00ff,d3
  238.  
  239.     move.w    d0,d4
  240.     mulu.w    #5,d4
  241.     lsr.l    #3,d4
  242.     andi.w    #$00ff,d4
  243.     move.w    (a2,d4.w*2),d4
  244.     lsr.w    #1,d4
  245.  
  246.     move.w    d0,d5
  247.     mulu.w    #7,d5
  248.     lsr.l    #4,d5
  249.     andi.w    #$00ff,d5
  250.     move.w    (a2,d5.w*2),d5
  251.     lsr.w    #1,d5
  252.  
  253.     moveq    #0,d2
  254.  
  255.     move.w    monitormode,d0
  256.     cmpi.w    #vga60,d0
  257.     beq    Plasma.paintVga60
  258.     cmpi.w    #vga100,d0
  259.     beq    Plasma.paintVga100
  260.     cmpi.w    #rgb50,d0
  261.     beq    Plasma.paintRgb50
  262. * Unknown monitormode..
  263.     rts
  264.  
  265. Plasma.paintVga60:
  266.     lea    160*2(a0),a5
  267.  
  268. .yloop:    swap    d7
  269.     move.w    #160/8-1,d7
  270.  
  271.     move.w    (a2,d3.l*2),d2
  272.     move.l    a1,d6
  273.     lea    (a1,d2.l),a1
  274.  
  275. * Calculate cosine 1 offset.
  276.     move.b    d4,d0
  277.     andi.w    #$FE,d0
  278.     lea    (a6,d0.w),a4
  279.  
  280. * Calculate cosine 2 offset
  281.     move.w    (a2,d5.l*2),d1
  282.     lea    (a2,d1.w),a3
  283.  
  284. .xloop:    REPT    8
  285.     move.w    (a4)+,d2
  286.     add.w    (a3)+,d2
  287.     move.w    (a1,d2.l),(a0)+
  288.     move.w    (a1,d2.l),(a5)+
  289.     ENDR
  290.     dbra    d7,.xloop
  291.  
  292.     movea.l    d6,a1
  293.     lea    160*2(a0),a0
  294.     lea    160*2(a5),a5
  295.     addq.b    #1,d3
  296.     addq.b    #2,d4
  297.     addq.b    #2,d5
  298.     swap    d7
  299.     dbra    d7,.yloop
  300.  
  301. .end:    rts
  302.  
  303. Plasma.paintVga100:
  304. .yloop:    swap    d7
  305.     move.w    #160/8-1,d7
  306.  
  307.     move.w    (a2,d3.l*2),d2
  308.     lea    (a1,d2.l),a5
  309.  
  310. * Calculate cosine 1 offset.
  311.     move.b    d4,d0
  312.     andi.w    #$FE,d0
  313.     lea    (a6,d0.w),a4
  314.  
  315. * Calculate cosine 2 offset
  316.     move.w    (a2,d5.l*2),d1
  317.     lea    (a2,d1.w),a3
  318.  
  319. .xloop:
  320.     REPT    8
  321.     move.w    (a4)+,d2
  322.     add.w    (a3)+,d2
  323.     move.w    (a5,d2.l),(a0)+
  324.     ENDR
  325.     dbra    d7,.xloop
  326.  
  327.     addq.b    #1,d3
  328.     addq.b    #2,d4
  329.     addq.b    #2,d5
  330.     swap    d7
  331.     dbra    d7,.yloop
  332.  
  333. .end:    rts
  334.  
  335. Plasma.paintRgb50:
  336. .yloop:    swap    d7
  337.     move.w    #160/8-1,d7
  338.  
  339.     move.w    (a2,d3.l*2),d2
  340.     lea    (a1,d2.l),a5
  341.  
  342. * Calculate cosine 1 offset.
  343.     move.b    d4,d0
  344.     andi.w    #$FE,d0
  345.     lea    (a6,d0.w),a4
  346.  
  347. * Calculate cosine 2 offset
  348.     move.w    (a2,d5.l*2),d1
  349.     lea    (a2,d1.w),a3
  350.  
  351. .xloop:
  352.     REPT    8
  353.     move.w    (a4)+,d2
  354.     add.w    (a3)+,d2
  355.     move.l    (a5,d2.l),(a0)+
  356.     ENDR
  357.     dbra    d7,.xloop
  358.  
  359.     addq.b    #1,d3
  360.     addq.b    #2,d4
  361.     addq.b    #2,d5
  362.     swap    d7
  363.     dbra    d7,.yloop
  364.  
  365. .end:    rts
  366.  
  367. * Paints a bumpmapped sinoid plasma on screen.
  368. Plasma.paintBumped:
  369.     movea.l    scr,a0
  370. .calc_position:
  371.     lea    sine_tbl,a1
  372.     move.w    $4bc.w,d0
  373.     move.w    d0,d1
  374.     add.w    d0,d0
  375.     mulu.w    #3,d1
  376.     lsr.l    #1,d1
  377.     Do_SinModulo    d0
  378.     Do_SinModulo    d1
  379.     Get_Sin    a1,d0,d0
  380.     Get_Sin    a1,d1,d1
  381.     addi.w    #$8000,d0
  382.     addi.w    #$8000,d1
  383.     andi.w    #$ff00,d0
  384.     lsr.w    #1,d0
  385.     lsr.w    #8,d1
  386.     lsr.w    #1,d1
  387.     move.b    d1,d0
  388. .end_calc_position:
  389.     movea.l    Plasma.baseAdr,a1
  390.     adda.l    #Plasma.TEXTURE,a1
  391.     lea    (a1,d0.w*2),a1
  392.     lea    Plasma.cosTable1,a2
  393.     lea    Plasma.cosTable2,a6
  394.     moveq    #100-1,d7
  395.     move.w    $4bc.w,d0
  396.  
  397.     move.w    d0,d3
  398.     mulu.w    #11,d3
  399.     lsr.l    #4,d3
  400.     andi.w    #$00ff,d3
  401.     move.w    (a2,d3.w*2),d3
  402.     lsr.w    #2,d3
  403.     andi.w    #$00ff,d3
  404.  
  405.     move.w    d0,d4
  406.     mulu.w    #5,d4
  407.     lsr.l    #3,d4
  408.     andi.w    #$00ff,d4
  409.     move.w    (a2,d4.w*2),d4
  410.     lsr.w    #1,d4
  411.  
  412.     move.w    d0,d5
  413.     mulu.w    #7,d5
  414.     lsr.l    #4,d5
  415.     andi.w    #$00ff,d5
  416.     move.w    (a2,d5.w*2),d5
  417.     lsr.w    #1,d5
  418.  
  419.     moveq    #0,d2
  420.  
  421.     lea    Plasma.cosTable1a,a2
  422.     lea    Plasma.cosTable2a,a6
  423.  
  424.     move.w    monitormode,d0
  425.     cmpi.w    #vga60,d0
  426.     beq    Plasma.paintBumpedVga60
  427.     cmpi.w    #vga100,d0
  428.     beq    Plasma.paintBumpedVga100
  429.     cmpi.w    #rgb50,d0
  430.     beq    Plasma.paintBumpedRgb50
  431. * Unknown monitormode..
  432.     rts
  433.  
  434. Plasma.paintBumpedVga100:
  435. .yloop:    swap    d7
  436.     move.w    #160/8-1,d7
  437.  
  438.     move.w    (a2,d3.l*2),d2
  439.     lea    (a1,d2.l),a5
  440.  
  441. * Calculate cosine 1 offset.
  442.     move.w    d4,d0
  443.     andi.w    #$fe,d0
  444.     lea    (a6,d0.w),a4
  445.  
  446. * Calculate cosine 2 offset
  447.     move.w    (a2,d5.l*2),d1
  448.     lea    (a2,d1.w),a3
  449.  
  450. .xloop:    REPT    8
  451.     move.w    (a4)+,d2
  452.     add.w    (a3)+,d2
  453.     move.w    (a5,d2.l),(a0)+
  454.     addq    #2,a5
  455.     ENDR
  456.     dbra    d7,.xloop
  457.  
  458.     lea    256*2(a1),a1
  459.     addq.b    #2,d3
  460.     addq.b    #1,d4
  461.     addq.b    #3,d5
  462.     swap    d7
  463.     dbra    d7,.yloop
  464.  
  465. .end:    rts
  466.  
  467. Plasma.paintBumpedVga60:
  468.     lea    160*2(a0),a5
  469.  
  470. .yloop:    swap    d7
  471.     move.w    #160/8-1,d7
  472.  
  473.     move.w    (a2,d3.l*2),d2
  474.     move.l    a1,d6
  475.     lea    (a1,d2.l),a1
  476.  
  477. * Calculate cosine 1 offset.
  478.     move.w    d4,d0
  479.     andi.w    #$fe,d0
  480.     lea    (a6,d0.w),a4
  481.  
  482. * Calculate cosine 2 offset
  483.     move.w    (a2,d5.l*2),d1
  484.     lea    (a2,d1.w),a3
  485.  
  486. .xloop:    REPT    8
  487.     move.w    (a4)+,d2
  488.     add.w    (a3)+,d2
  489.     move.w    (a1,d2.l),(a0)+
  490.     move.w    (a1,d2.l),(a5)+
  491.     addq    #2,a1
  492.     ENDR
  493.     dbra    d7,.xloop
  494.  
  495.     movea.l    d6,a1
  496.     lea    256*2(a1),a1
  497.     lea    160*2(a0),a0
  498.     lea    160*2(a5),a5
  499.     addq.b    #2,d3
  500.     addq.b    #1,d4
  501.     addq.b    #3,d5
  502.     swap    d7
  503.     dbra    d7,.yloop
  504.  
  505. .end:    rts
  506.  
  507. Plasma.paintBumpedRgb50:
  508. .yloop:    swap    d7
  509.     move.w    #160/8-1,d7
  510.  
  511.     move.w    (a2,d3.l*2),d2
  512.     lea    (a1,d2.l),a5
  513.  
  514. * Calculate cosine 1 offset.
  515.     move.w    d4,d0
  516.     andi.w    #$fe,d0
  517.     lea    (a6,d0.w),a4
  518.  
  519. * Calculate cosine 2 offset
  520.     move.w    (a2,d5.l*2),d1
  521.     lea    (a2,d1.w),a3
  522.  
  523. .xloop:    REPT    8
  524.     move.w    (a4)+,d2
  525.     add.w    (a3)+,d2
  526.     move.l    (a5,d2.l),(a0)+
  527.     addq    #2,a5
  528.     ENDR
  529.     dbra    d7,.xloop
  530.  
  531.     lea    256*2(a1),a1
  532.     addq.b    #2,d3
  533.     addq.b    #1,d4
  534.     addq.b    #3,d5
  535.     swap    d7
  536.     dbra    d7,.yloop
  537.  
  538. .end:    rts
  539.  
  540. ;======= OBJECT DATA ========
  541.  
  542.     DATA
  543.  
  544. Plasma.routineAddress:
  545.     DC.L    Plasma.paintBumped
  546.  
  547. Plasma.flowTable:
  548.     DC.W    32    (.end-.start)/4
  549.     DC.W    5
  550. .start:    DC.L    $ff000000    ;DC.L    $00000000
  551.     DC.L    $bf00001f    ;DC.L    $003f0000
  552.     DC.L    $7f00003f    ;DC.L    $007f0000
  553.     DC.L    $3f00005f    ;DC.L    $3fdf0000
  554.     DC.L    $0000007f    ;DC.L    $7fff0000
  555.     DC.L    $0000009f    ;DC.L    $dfff0000
  556.     DC.L    $000000bf    ;DC.L    $ffff0000
  557.     DC.L    $000000df    ;DC.L    $ffff003f
  558.     DC.L    $000000ff    ;DC.L    $ffff007f
  559.     DC.L    $001f00ff    ;DC.L    $ffff00bf
  560.     DC.L    $003f00ff    ;DC.L    $ffff00ff
  561.     DC.L    $005f00ff    ;DC.L    $ffff00ff
  562.     DC.L    $007f00ff    ;DC.L    $ffff00ff
  563.     DC.L    $009f00ff    ;DC.L    $ffff00ff
  564.     DC.L    $00bf00ff    ;DC.L    $ffff00ff
  565.     DC.L    $00df00ff    ;DC.L    $ffff00ff
  566.     DC.L    $00ff00ff    ;DC.L    $ffff00ff
  567.     DC.L    $1fff00ff
  568.     DC.L    $3fff00ff
  569.     DC.L    $5fff00ff
  570.     DC.L    $7fff00ff
  571.     DC.L    $9fff00ff
  572.     DC.L    $bfff00ff
  573.     DC.L    $dfff00ff
  574.     DC.L    $ffff00ff
  575.     DC.L    $ffdf00df
  576.     DC.L    $ffbf00bf
  577.     DC.L    $ff9f009f
  578.     DC.L    $ff7f007f
  579.     DC.L    $ff5f005f
  580.     DC.L    $ff3f003f
  581.     DC.L    $ff1f001f
  582.     DC.L    $ff000000
  583. .end:
  584.  
  585. ;======= OBJECT RESERVES ========
  586.  
  587.     BSS
  588.  
  589. Plasma.cyclePhase:
  590.     DS.W    1
  591. Plasma.cycling:
  592.     DS.W    1
  593. Plasma.pallette:
  594.     DS.W    1024*2
  595. Plasma.cosTable1:
  596.     DS.W    256*3
  597. Plasma.cosTable2:
  598.     DS.W    128*3
  599. Plasma.cosTable1a:
  600.     DS.W    256*3
  601. Plasma.cosTable2a:
  602.     DS.W    128*3
  603.  
  604. Plasma.baseAdr:
  605.     DS.L    1
  606.  
  607. ;======= END OF DEMO-EFFECT OBJECT ========