home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / INTERPO2.SO < prev    next >
Text File  |  2002-12-30  |  9KB  |  488 lines

  1. ; Picture interpolator.. A screen for the delta demo.
  2.  
  3. ;======= OBJECT EQUATES ====================================================
  4.  
  5. Interpol.NUMSPARKS:    =    6
  6. Interpol.NUMSPLATS:    =    20
  7.  
  8. ;======= OBJECT TABLE ======================================================
  9.  
  10. ; Must be first in object!!
  11. Interpol.table:
  12.     DC.L    Interpol.mainLoop
  13.     DC.L    Interpol.init
  14.     DC.L    rts
  15.     DC.L    Interpol.setSpots
  16.     DC.L    Interpol.setStreaks
  17.     DC.L    Interpol.initGoldRows
  18.     DC.L    Interpol.initGrayRows
  19.     DC.L    Interpol.setSplatter
  20.     DC.L    Interpol.setFadePal
  21.     DC.L    0
  22.  
  23. ;======= INIT SUBROUTINE ===================================================
  24.  
  25. ; OUTPUT:
  26. ; d0.l: 0   = All clear, neg = Error! Not initialized!
  27. Interpol.init:
  28.     lea    Interpol.goldInstTable,a1
  29.     lea    Interpol.goldPal,a0
  30.     bsr.l    Pal.makeGradientTc
  31.  
  32.     lea    Interpol.grayInstTable,a1
  33.     lea    Interpol.grayPal,a0
  34.     bsr.l    Pal.makeGradientTc
  35.  
  36.     bsr    Interpol.genRowTable
  37.  
  38.     moveq    #0,d0
  39.     rts
  40. .error:    moveq    #-1,d0
  41.     rts
  42.  
  43. ;======= REALTIME INIT SUBROUTINE ==========================================
  44.  
  45. Interpol.realtimeInit:
  46.     bsr    Interpol.initGoldRows
  47.  
  48.     move.w    monitormode,d0
  49.     cmpi.w    #vga60,d0
  50.     beq.s    .vga60
  51.     cmpi.w    #vga100,d0
  52.     beq.s    .vga100
  53.     cmpi.w    #rgb50,d0
  54.     beq.s    .rgb50
  55. ; Unknown monitormode..
  56.     rts
  57. .vga60:    move.l    #vga60_8bit_320_200,Interpol.resRout
  58.     rts
  59. .vga100:move.l    #vga100_8bit_320_200,Interpol.resRout
  60.     rts
  61. .rgb50:    move.l    #rgb50_8bit_320_200,Interpol.resRout
  62.     rts
  63.  
  64. ;======= SCREENINIT SUBROUTINE =============================================
  65.  
  66. Interpol.initScreen:
  67.     movea.l    scr,a0
  68.     bsr.l    CLEAR_320100TSCR
  69.     rts
  70.  
  71. ;======= MAINLOOP SUBROUTINE ===============================================
  72.  
  73. Interpol.mainLoop:
  74.     move.w    $0468.w,.old468
  75.  
  76.     move.l    frmcnt,d0
  77.     sub.l    lastframecount,d0
  78.     bne.s    .end_realtime_init
  79.     move.l    d0,-(sp)
  80.     bsr    Interpol.realtimeInit
  81.     move.l    (sp)+,d0
  82. .end_realtime_init:
  83.     cmpi.l    #3,d0
  84.     bhs.s    .end_screeninit
  85.     bsr    Interpol.initScreen
  86. .end_screeninit:
  87.  
  88.     bsr    Interpol.fadeBuffer
  89.  
  90.     move.l    Interpol.bufFillRout,a0
  91.     jsr    (a0)
  92.  
  93.     lea    Interpol.wireBuffer,a2
  94.     bsr    Interpol.paint
  95.  
  96.     move.w    .old468(pc),d0
  97.     moveq    #1,d3
  98.     cmpi.w    #vga100,monitormode
  99.     bne.s    .wait
  100.     moveq    #2,d3
  101. .wait:    move.w    $0468.w,d2
  102.     sub.w    d0,d2
  103.     cmp.w    d3,d2
  104.     blt.s    .wait
  105.  
  106.     lea    scr,a0
  107.     move.l    (a0)+,d0
  108.     move.l    (a0)+,d1
  109.     move.l    (a0),-4(a0)
  110.     move.l    d0,(a0)
  111.     move.l    d1,-8(a0)
  112.  
  113.     movea.l    Interpol.resRout,a0
  114.     movea.l    Interpol.palAdr,a1
  115.     move.l    d0,a2
  116. .again:    bsr.l    Screen.requestUpdate
  117.     tst.l    d0
  118.     bmi.s    .again
  119.     clr.l    Interpol.palAdr
  120.     clr.l    Interpol.resRout
  121.  
  122.     rts
  123.  
  124. .old468:DC.W    0
  125.  
  126. ;======= OBJECT SUBROUTINES ================================================
  127.  
  128. Interpol.setSpots:
  129.     move.l    #Interpol.drawSpots,Interpol.bufFillRout
  130.     rts
  131.  
  132. Interpol.setStreaks:
  133.     move.l    #Interpol.drawStreaks,Interpol.bufFillRout
  134.     rts
  135.  
  136. Interpol.setSplatter:
  137.     move.l    #Interpol.drawSplatter,Interpol.bufFillRout
  138.     clr.w    Interpol.splattered
  139.     rts
  140.  
  141. Interpol.initGoldRows:
  142.     move.l    #Interpol.goldPal,Interpol.palAdr
  143.     rts
  144.  
  145. Interpol.initGrayRows:
  146.     move.l    #Interpol.grayPal,Interpol.palAdr
  147.     rts
  148.  
  149. Interpol.setFadePal:
  150.     move.l    #Interpol.fadePal,vbl_gfx
  151.     rts
  152.  
  153. Interpol.fadePal:
  154.     cmpi.w    #vga100,monitormode
  155.     bne.s    .do_it
  156.     move.w    $0468.w,d0
  157.     lsr.w    d0
  158.     bcc.s    .end
  159. .do_it:    lea    $FFFF9800.w,a0
  160.     moveq    #16-1,d7
  161. .loop:    move.l    (a0),d0
  162.     move.l    d0,d1
  163.     swap    d1
  164.     move.l    d1,d2
  165.     lsr.w    #8,d2
  166.     andi.w    #$FF,d1
  167.     subq.w    #1,d0
  168.     bpl.s    .b_ok
  169.     clr.w    d0
  170. .b_ok:    subq.w    #1,d1
  171.     bpl.s    .g_ok
  172.     clr.w    d1
  173. .g_ok:    subq.w    #1,d2
  174.     bpl.s    .r_ok
  175.     clr.w    d2
  176. .r_ok:    lsl.w    #8,d2
  177.     add.w    d1,d2
  178.     swap    d2
  179.     move.w    d0,d2
  180.     move.l    d2,(a0)+
  181.     dbf    d7,.loop
  182. .end:    rts
  183.  
  184. ; Fade it one step..
  185. Interpol.fadeBuffer:
  186.     lea    Interpol.wireBuffer,a0
  187.     move.w    #21*13-1,d7
  188. .fadeloop:
  189.     move.b    (a0),d0
  190.     subq.b    #1,d0
  191.     bcc.s    .okay
  192.     clr.b    d0
  193. .okay:    move.b    d0,(a0)+
  194.     dbf    d7,.fadeloop
  195.     rts
  196.  
  197. ; Draw streaks (v or h).
  198. Interpol.drawStreaks:
  199.  
  200. ; Update spark position and state.
  201.     lea    .sparkTable,a1
  202.     moveq    #Interpol.NUMSPARKS-1,d7
  203.  
  204. ; todo: add random bending (very low chance!)
  205. .update_loop:    
  206.     tst.b    (a1)
  207.     bne.s    .update_pos
  208. .give_birth:
  209.     move.b    #1,(a1)+                ; Birth.
  210.     Calc_NextRandom
  211.     clr.l    d1
  212.     move.w    d0,d1
  213.     divu.w    #68,d1
  214.     swap    d1
  215.     subi.w    #21,d1
  216.     bpl.s    .not_q1
  217.     addi.w    #21,d1
  218.     move.b    d1,(a1)+
  219.     move.b    #0,(a1)+
  220.     move.b    #%0001,(a1)+                ; down
  221.     bra.s    .q_found
  222. .not_q1:subi.w    #21,d1
  223.     bpl.s    .not_q2
  224.     addi.w    #21,d1
  225.     move.b    d1,(a1)+
  226.     move.b    #12,(a1)+
  227.     move.b    #%0011,(a1)+                ; up
  228.     bra.s    .q_found
  229. .not_q2:subi.w    #13,d1
  230.     bpl.s    .not_q3
  231.     addi.w    #13,d1
  232.     move.b    #0,(a1)+
  233.     move.b    d1,(a1)+
  234.     move.b    #%0100,(a1)+                ; right
  235.     bra.s    .q_found
  236. .not_q3:move.b    #20,(a1)+
  237.     move.b    d1,(a1)+
  238.     move.b    #%1100,(a1)+                ; left
  239. ;    bra.s    .q_found
  240. .q_found:
  241.     bra.s    .next_update
  242.  
  243. .update_pos:
  244.     move.b    3(a1),d0
  245.     move.b    d0,d1
  246.     lsr.b    #2,d1
  247.     lsl.b    #6,d0
  248.     lsl.b    #6,d1
  249.     asr.b    #6,d0
  250.     asr.b    #6,d1
  251.     add.b    d1,1(a1)
  252.     bmi    .give_birth
  253.     add.b    d0,2(a1)
  254.     bmi    .give_birth
  255.     cmpi.b    #21,1(a1)
  256.     beq    .give_birth
  257.     cmpi.b    #13,2(a1)
  258.     beq    .give_birth
  259.     addq    #4,a1
  260. .next_update:
  261.     dbf    d7,.update_loop
  262.  
  263. ; Paint sparks to buffer.
  264.     lea    Interpol.wireBuffer,a0
  265.     lea    .sparkTable,a1
  266.     moveq    #Interpol.NUMSPARKS-1,d7
  267.  
  268. .paint_loop:
  269.     addq    #1,a1
  270.     clr.l    d0
  271.     clr.l    d1
  272.     move.b    (a1)+,d0
  273.     move.b    (a1)+,d1
  274.     addq    #1,a1
  275.     mulu.w    #21,d1
  276.     add.l    d0,d1
  277.     move.b    #$F,(a0,d1.l)
  278.     dbf    d7,.paint_loop
  279.  
  280.     rts
  281.  
  282. ; active,x,y,dir (%hhvv) hh and vv are element of {11,00,01}
  283. .sparkTable:
  284.     DS.B    4*Interpol.NUMSPARKS
  285.  
  286. ; Draw spots.
  287. Interpol.drawSpots:
  288. ; Paint sparks to buffer.
  289.     lea    Interpol.wireBuffer,a0
  290.     moveq    #Interpol.NUMSPARKS-1,d7
  291.  
  292. .loop:    Calc_NextRandom
  293.     move.l    d0,d1
  294.     andi.l    #$FFFF,d0
  295.     clr.w    d1
  296.     swap    d1
  297.     divu.w    #21,d0
  298.     divu.w    #13,d1
  299.     swap    d0
  300.     swap    d1
  301.     mulu.w    #21,d1
  302.     add.w    d0,d1
  303.     move.b    #$F,(a0,d1.w)
  304.     dbf    d7,.loop
  305.     rts
  306.  
  307. ; Draw splatter.
  308. Interpol.drawSplatter:
  309.     tst.w    Interpol.splattered
  310.     bne.s    .end
  311.  
  312. ; Paint splats to buffer.
  313.     lea    Interpol.wireBuffer,a0
  314.     moveq    #Interpol.NUMSPLATS-1,d7
  315.  
  316. .loop:    Calc_NextRandom
  317.     move.l    d0,d1
  318.     andi.l    #$FFFF,d0
  319.     clr.w    d1
  320.     swap    d1
  321.     divu.w    #21,d0
  322.     divu.w    #13,d1
  323.     swap    d0
  324.     swap    d1
  325.     mulu.w    #21,d1
  326.     add.w    d0,d1
  327.     move.b    #$F,(a0,d1.w)
  328.     dbf    d7,.loop
  329.  
  330.     move.w    #1,Interpol.splattered
  331. .end:    rts
  332.  
  333. ; Generates rowtables.
  334. ; INPUT:
  335. Interpol.genRowTable:
  336.     lea    Interpol.rowTable,a0
  337.     clr.b    d0
  338.  
  339. .row_loop:
  340.     clr.l    d1
  341.     clr.l    d2
  342.     move.b    d0,d1
  343.     move.b    d0,d2
  344.     lsr.b    #4,d1
  345.     andi.b    #$0F,d2
  346.     swap    d1
  347.     swap    d2
  348.     sub.l    d1,d2                    ; d2.l=dx (16:16)
  349.     asr.l    #4,d2                    ; d2.l=d_step=dx/16 (16:16)
  350.     move.w    #$8000,d4
  351.     moveq    #16-1,d7
  352.  
  353. .pixloop:
  354.     move.l    d1,d3
  355.     tst.w    d3
  356.     swap    d3
  357.     bpl.s    .round_done
  358.     addq.w    #1,d3
  359. .round_done:
  360. ; 4 bitplane shit!
  361.     REPT    4
  362.     lsr.w    d3
  363.     bcc.s    *+4
  364.     or.w    d4,(a0)
  365.     addq    #2,a0
  366.     ENDR    
  367. ; a0: next chunk
  368.     subq    #4*2,a0                ; a0: current chunk
  369.     add.l    d2,d1
  370.     lsr.w    d4
  371.     dbf    d7,.pixloop
  372.  
  373.     addq    #4*2,a0
  374.     addq.b    #1,d0
  375.     bne.s    .row_loop
  376.     rts
  377.  
  378. ; INPUT:
  379. ; a2: byte buffer (21*13)
  380. Interpol.paint:
  381.     movea.l    scr,a0
  382.     adda.w    #320*4,a0
  383.     lea    Interpol.rowTable,a1
  384.     moveq    #12-1,d7
  385.  
  386. .row_loop:
  387.     moveq    #20-1,d6
  388.  
  389. .block_loop:
  390.     swap    d6
  391.     clr.l    d1
  392.     clr.l    d2
  393.     clr.l    d3
  394.     clr.l    d4
  395.     move.b    21(a2),d1            ; d3.b=btm lx
  396.     move.b    22(a2),d2            ; d4.b=btm rx
  397.     swap    d1
  398.     swap    d2
  399.     move.b    (a2)+,d3            ; d1.b=(top) lx
  400.     move.b    (a2),d4                ; d2.b=(top) rx
  401.     swap    d3
  402.     swap    d4
  403.     sub.l    d3,d1                ; d1.b=blx-tlx=dlx
  404.     sub.l    d4,d2                ; d2.b=trx-trx=drx
  405.     asr.l    #4,d1                ; d1.l=lx_step
  406.     asr.l    #4,d2                ; d2.l=rx_step
  407.     move.w    #16-1,d6
  408.  
  409. .span_loop:
  410.     move.l    d3,d0
  411.     andi.l    #$000F0000,d0
  412.     lsl.l    #4,d0
  413.     move.l    d4,d5
  414.     andi.l    #$000F0000,d5
  415.     or.l    d5,d0
  416.     swap    d0
  417.     lea    (a1,d0.w*8),a3
  418.     move.l    (a3)+,(a0)+
  419.     move.l    (a3)+,(a0)+
  420.     add.l    d1,d3
  421.     add.l    d2,d4
  422.     adda.w    #320-8,a0
  423.     dbf    d6,.span_loop
  424.  
  425.     adda.w    #16-320*16,a0
  426.     swap    d6
  427.     dbf    d6,.block_loop
  428.  
  429.     adda.w    #320*15,a0
  430.     addq    #1,a2
  431.     dbf    d7,.row_loop
  432.     rts
  433.  
  434. ;======= OBJECT DATA =======================================================
  435.  
  436.     DATA
  437.  
  438. Interpol.goldInstTable:
  439.     DC.W    (.end-.start)/4-1
  440.     DC.W    1
  441. .start:    DC.L    $00000000
  442.     DC.L    $5F1F0000
  443.     DC.L    $9F5F0000
  444.     DC.L    $CF9F0000
  445.     DC.L    $FFFF0000
  446.     DC.L    $FFFF00FF
  447.     DC.L    $FFFF00FF
  448.     DC.L    $FFFF00FF
  449.     DC.L    $FFFF00FF
  450. .end:
  451.  
  452. Interpol.grayInstTable:
  453.     DC.W    (.end-.start)/4-1
  454.     DC.W    1
  455. .start:    DC.L    $00000000
  456.     DC.L    $3f44003f
  457.     DC.L    $887f007f
  458.     DC.L    $bfb800bf
  459.     DC.L    $fFf800f8
  460.     DC.L    $FFFF00FF
  461.     DC.L    $FFFF00FF
  462.     DC.L    $FFFF00FF
  463.     DC.L    $FFFF00FF
  464. .end:
  465.  
  466. Interpol.bufFillRout:
  467.     DC.L    Interpol.drawSpots
  468.  
  469. ;======= OBJECT RESERVES ===================================================
  470.  
  471.     BSS
  472.  
  473. Interpol.palAdr:
  474.     DS.L    1
  475. Interpol.resRout:
  476.     DS.L    1
  477.  
  478. Interpol.goldPal:
  479.     DS.L    16
  480. Interpol.grayPal:
  481.     DS.L    16
  482. Interpol.rowTable:
  483.     DS.L    2*256
  484. Interpol.wireBuffer:
  485.     DS.B    21*13
  486.     DS.B    1                ; make it even!
  487. Interpol.splattered:
  488.     DS.W    1