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

  1. ; Rotozoom (bending). Lame old shit for delta.
  2.  
  3. ;======= OBJECT EQUATES ========
  4.  
  5.             RSRESET
  6. VectorTable.AX:        RS.W    1
  7. VectorTable.AY:        RS.W    1
  8. VectorTable.BX:        RS.W    1
  9. VectorTable.BY:        RS.W    1
  10. VectorTable.SIZE:    RS.B    0
  11.  
  12. ;======= OBJECT TABLE ========
  13.  
  14. * Must be first in object!!
  15. RotoZoomer.table:
  16.     DC.L    RotoZoomerMAINLOOP
  17.     DC.L    INIT_RotoZoomer
  18.     DC.L    SET_RotoZoomerRES
  19.     DC.L    RotoZoomer.startTrajectory
  20.     DC.L    RotoZoomer.triggerDistoMode
  21.     DC.L    RotoZoomer.increaseDisto
  22.     DC.L    RotoZoomer.decreaseDisto
  23. * Add more addresses here..
  24.     DC.L    0
  25.  
  26. ;======= RESOLUTION SETTING ROUTINE ========
  27.  
  28. SET_RotoZoomerRES:
  29.     bsr    RotoZoomer.startTrajectory
  30.  
  31.     IFEQ    testmode
  32.     move.l    #rts,vbl_gfx
  33.  
  34.     move.w    $0468.w,d0
  35. .ck468:    cmp.w    $0468.w,d0
  36.     beq.s    .ck468
  37.     move.w    monitormode,d0
  38.     cmpi.w    #vga60,d0
  39.     beq.s    .vga60
  40.     cmpi.w    #vga100,d0
  41.     beq.s    .vga100
  42.     cmpi.w    #rgb50,d0
  43.     beq.s    .rgb50
  44. * Unknown monitormode..
  45.     rts
  46. .vga60:    bra.l    vga60_16bit_160_200
  47.     rts
  48. .vga100:
  49.     bra.l    vga100_16bit_160_100
  50.     rts
  51. .rgb50:    bra.l    rgb50_16bit_320_100
  52.     ENDC
  53.     rts
  54.  
  55. ;======= INIT SUBROUTINE ========
  56.  
  57. * OUTPUT: d0.l: 0   = All clear.
  58. *               neg = Error! Not initialized!
  59. INIT_RotoZoomer:
  60.     moveq    #0,d0
  61.     rts
  62.  
  63. RotoZoomer.initRealtime
  64.     clr.w    RotoZoomer.distoStrength
  65.     clr.w    RotoZoomer.distMode
  66.     rts
  67.  
  68. ;======= MAINLOOP SUBROUTINE ========
  69.  
  70. RotoZoomerMAINLOOP:
  71.     move.w    $468.w,.old468
  72.  
  73.     move.l    frmcnt,d0
  74.     sub.l    lastframecount,d0
  75.     bne.s    .end_init
  76.     bsr    RotoZoomer.initRealtime
  77. .end_init:
  78.  
  79.     bsr    RotoZoomer.calcPosition
  80.  
  81.     IFNE    0
  82.     movec    cacr,d0
  83.     move.l    d0,-(sp)
  84.     bclr    #13,d0                    ; no write alloc
  85.     bclr    #12,d0                    ; d burst off
  86.     bset    #11,d0                    ; clear d cache
  87.     bclr    #8,d0                    ; d cache off
  88.     bset    #4,d0                    ; i burst on
  89.     bset    #0,d0                    ; i cache on
  90.     movec    d0,cacr
  91.     ENDC
  92.  
  93.     bsr    RotoZoomer.paint
  94.  
  95.     IFNE    0
  96.     move.l    (sp)+,d0
  97.     movec    d0,cacr
  98.     ENDC
  99.  
  100.     move.l    frmcnt,d0
  101.     sub.l    lastframecount,d0
  102.     bne.s    .res_done
  103.     bsr    SET_RotoZoomerRES
  104. .res_done:
  105.  
  106.     IFEQ    testmode
  107.     lea    scr,a0
  108.     move.l    (a0)+,d0
  109.     move.l    (a0)+,d1
  110.     move.l    (a0),-4(a0)
  111.     move.l    d0,(a0)
  112.     move.l    d1,-8(a0)
  113.     move.l    d0,d1
  114.     lsr.w    #8,d0
  115.     move.l    d0,$ffff8200.w
  116.     move.b    d1,$ffff820d.w
  117.     ENDC
  118.  
  119.     move.w    .old468(pc),d0
  120. .wait468:
  121.     cmp.w    $468.w,d0
  122. ;    beq.s    .wait468
  123.     rts
  124.  
  125. .old468:
  126.     DC.W    0
  127.  
  128. ;======= OBJECT SUBROUTINES ========
  129.  
  130.     TEXT
  131.  
  132. RotoZoomer.startTrajectory:
  133.     move.l    $4ba.w,RotoZoomer.startTime
  134.     rts
  135.  
  136. RotoZoomer.triggerDistoMode:
  137.     not.w    RotoZoomer.distMode
  138.     rts
  139.  
  140. RotoZoomer.increaseDisto:
  141.     addq.w    #6,RotoZoomer.distoStrength
  142.     rts
  143.  
  144. RotoZoomer.decreaseDisto:
  145.     subq.w    #6,RotoZoomer.distoStrength
  146.     rts
  147.  
  148. RotoZoomer.calcPosition:
  149. * First we calculate the current time.
  150.     move.l    $4ba.w,d0
  151.     sub.l    RotoZoomer.startTime,d0
  152.     move.l    d0,d1
  153.     move.l    d0,d6
  154.     lea    sine_tbl,a0
  155.  
  156. * Now we calculate our center position.
  157.     mulu.w    #5,d1
  158.     lsr.l    #2,d1
  159.     Do_SinModulo    d1
  160.     Get_SinCos    a0,d1,d2,d3
  161.     asl.l    #1,d2
  162.     asl.l    #1,d3
  163. ;    moveq    #0,d2
  164. ;    moveq    #0,d3
  165.     movem.w    d2/d3,RotoZoomer.center
  166.  
  167. * And now we calculate the current position in the trajectory.
  168.     Do_SinModulo    d0
  169.     Get_SinCos    a0,d0,d0,d1
  170. * d0.w: +sin(fi)
  171. * d1.w: +cos(fi)
  172.  
  173. * a'.x = +cos(fi)*a.x +sin(fi)*a.y
  174. * a'.y = -sin(fi)*a.x +cos(fi)*a.y
  175.     move.w    d1,d2
  176.     move.w    d0,d3
  177.     muls.w    #256,d2
  178.     muls.w    #-256,d3
  179.     add.l    d2,d2
  180.     add.l    d3,d3
  181.     swap    d2
  182.     swap    d3
  183. * d2.w: a'.x, d3.w: a'.y
  184. * b'.x = +cos(fi)*b.x +sin(fi)*b.y
  185. * b'.y = -sin(fi)*b.x +cos(fi)*b.y
  186.     move.w    d0,d4
  187.     move.w    d1,d5
  188.     muls.w    #256,d4
  189.     muls.w    #256,d5
  190.     add.l    d4,d4
  191.     add.l    d5,d5
  192.     swap    d4
  193.     swap    d5
  194. * d4.w: b'.x, d5.w: b'.y
  195.     movem.w    d2-d5,RotoZoomer.vectorTable
  196.  
  197. * And we calculate the amount of zoom...
  198.     Do_SinModulo    d6
  199.     Get_Sin    a0,d6,d6
  200.     addi.w    #$8000,d6
  201.     andi.l    #$ffff,d6
  202.     divu.w    #230,d6
  203.     addi.w    #$20,d6
  204. * And zoom the damn thing!
  205.     muls.w    d6,d2
  206.     muls.w    d6,d3
  207.     muls.w    d6,d4
  208.     muls.w    d6,d5
  209.     asr.l    #8,d2
  210.     asr.l    #8,d3
  211.     asr.l    #8,d4
  212.     asr.l    #8,d5
  213.     movem.w    d2-d5,RotoZoomer.scaledVectorTable
  214.  
  215.     rts
  216.  
  217. RotoZoomer.paint:
  218.     IFNE    1
  219.     movem.w    RotoZoomer.scaledVectorTable,d0-d3
  220. * d0.w: a.x, d1.w: a.y, d2.w: b.x, d3.w: b.y
  221.     movem.w    RotoZoomer.center,d6/d7
  222.     move.w    d0,d4
  223.     move.w    d1,d5
  224.     muls.w    #50,d4
  225.     muls.w    #50,d5
  226.     sub.w    d4,d6
  227.     sub.w    d5,d7
  228.     move.w    d2,d4
  229.     move.w    d3,d5
  230.     muls.w    #80,d4
  231.     muls.w    #80,d5
  232.     sub.w    d4,d6
  233.     sub.w    d5,d7
  234. * a
  235.     ror.l    #8,d1
  236.     move.w    d1,d5
  237.     move.w    d0,d1
  238.     movea.l    d1,a4
  239. * b
  240.     ror.l    #8,d3
  241.     move.w    d3,d4
  242.     move.w    d2,d3
  243.  
  244. * top-left
  245.     ror.l    #8,d7
  246.     movea.w    d7,a3
  247.     move.w    d6,d7
  248.     movea.l    d7,a2
  249.     ELSE
  250. * top-left
  251.     movea.l    #$00000000,a2
  252.     movea.l    #$00000000,a3
  253. * a
  254.     movea.l    #$70000000,a4
  255.     move.l    #$00000001,d5
  256. * b
  257.     move.l    #$60000100,d3
  258.     move.l    #$00000003,d4
  259.     ENDC
  260.  
  261.     movea.l    scr,a0
  262.     lea    Texture.16bTexture2,a1
  263.     moveq    #100-1,d7
  264.     moveq    #0,d2
  265.  
  266.     move.w    monitormode,d0
  267.     tst.w    RotoZoomer.distMode
  268.     bne.s    .dist_it
  269. * Branch to the undistorted painters.
  270.     cmpi.w    #vga60,d0
  271.     beq    RotoZoomer.paintVga60
  272.     cmpi.w    #vga100,d0
  273.     beq    RotoZoomer.paintVga100
  274.     cmpi.w    #rgb50,d0
  275.     beq    RotoZoomer.paintRgb50
  276. * Unknown monitormode..
  277.     rts
  278.  
  279. * Branch to the distorted painters. (the nausea special!)
  280. .dist_it:
  281.     cmpi.w    #vga60,d0
  282.     beq    RotoZoomer.distoPaintVga60
  283.     cmpi.w    #vga100,d0
  284.     beq    RotoZoomer.distoPaintVga100
  285.     cmpi.w    #rgb50,d0
  286.     beq    RotoZoomer.distoPaintRgb50
  287. * Unknown monitormode..
  288.     rts
  289.  
  290. RotoZoomer.paintVga60:
  291.     lea    160*2(a0),a5
  292.  
  293. .yloop:    moveq    #16-1,d6
  294.     move.l    a2,d0
  295.     move.l    a3,d1
  296.  
  297. .chunkloop:
  298.     REPT    10
  299.     move.w    d0,d2
  300.     move.b    d1,d2
  301.  
  302. ;    move.w    (a1,d2.l*2),(a0)+
  303. ;    move.w    (a1,d2.l*2),(a5)+
  304.     move.w    (a1,d2.l*2),d2
  305.     move.w    d2,(a5)+
  306.     move.w    d2,(a0)+
  307.  
  308.     add.l    d3,d0
  309.     addx.b    d4,d1
  310.     ENDR
  311.     dbra    d6,.chunkloop
  312.  
  313.     move.l    a2,d0
  314.     move.l    a3,d1
  315.     add.l    a4,d0
  316.     addx.b    d5,d1
  317.     movea.l    d0,a2
  318.     movea.l    d1,a3
  319.     lea    160*2(a0),a0
  320.     lea    160*2(a5),a5
  321.     dbra    d7,.yloop
  322.     rts
  323.  
  324. RotoZoomer.paintVga100:
  325.  
  326. .yloop:    moveq    #16-1,d6
  327.     move.l    a2,d0
  328.     move.l    a3,d1
  329.  
  330. .chunkloop:
  331.     REPT    10
  332.     move.w    d0,d2
  333.     move.b    d1,d2
  334.     move.w    (a1,d2.l*2),(a0)+
  335.     add.l    d3,d0
  336.     addx.b    d4,d1
  337.     ENDR
  338.     dbra    d6,.chunkloop
  339.  
  340.     move.l    a2,d0
  341.     move.l    a3,d1
  342.     add.l    a4,d0
  343.     addx.b    d5,d1
  344.     movea.l    d0,a2
  345.     movea.l    d1,a3
  346.     dbra    d7,.yloop
  347.     rts
  348.  
  349. RotoZoomer.paintRgb50:
  350.  
  351. .yloop:    moveq    #16-1,d6
  352.     move.l    a2,d0
  353.     move.l    a3,d1
  354.  
  355. .chunkloop:
  356.     REPT    10
  357.     move.w    d0,d2
  358.     move.b    d1,d2
  359.  
  360.     move.w    (a1,d2.l*2),d2
  361.     move.w    d2,(a0)+
  362.     move.w    d2,(a0)+
  363. ;    move.w    (a1,d2.l*2),(a0)+
  364. ;    move.w    (a1,d2.l*2),(a0)+
  365.  
  366.     add.l    d3,d0
  367.     addx.b    d4,d1
  368.     ENDR
  369.     dbra    d6,.chunkloop
  370.  
  371.     move.l    a2,d0
  372.     move.l    a3,d1
  373.     add.l    a4,d0
  374.     addx.b    d5,d1
  375.     movea.l    d0,a2
  376.     movea.l    d1,a3
  377.     dbra    d7,.yloop
  378.     rts
  379.  
  380. RotoZoomer.distoPaintVga60:
  381.     lea    160*2(a0),a5
  382.     movea.l    d3,a6
  383.  
  384. .yloop:    moveq    #16-1,d6
  385.     move.l    a2,d0
  386.     move.l    a3,d1
  387.     move.l    a6,d3
  388.  
  389. .chunkloop:
  390.     REPT    10
  391.     move.w    d0,d2
  392.     move.b    d1,d2
  393.     move.w    (a1,d2.l*2),(a0)+
  394.     move.w    (a1,d2.l*2),(a5)+
  395.     add.l    d3,d0
  396.     addx.b    d4,d1
  397.     ENDR
  398.     add.w    RotoZoomer.distoStrength,d3
  399.     dbra    d6,.chunkloop
  400.  
  401.     move.l    a2,d0
  402.     move.l    a3,d1
  403.     add.l    a4,d0
  404.     addx.b    d5,d1
  405.     movea.l    d0,a2
  406.     movea.l    d1,a3
  407.     lea    160*2(a0),a0
  408.     lea    160*2(a5),a5
  409.     dbra    d7,.yloop
  410.     rts
  411.  
  412. RotoZoomer.distoPaintVga100:
  413.     movea.l    d3,a6
  414.  
  415. .yloop:    moveq    #16-1,d6
  416.     move.l    a2,d0
  417.     move.l    a3,d1
  418.     move.l    a6,d3
  419.  
  420. .chunkloop:
  421.     REPT    10
  422.     move.w    d0,d2
  423.     move.b    d1,d2
  424.     move.w    (a1,d2.l*2),(a0)+
  425.     add.l    d3,d0
  426.     addx.b    d4,d1
  427.     ENDR
  428.     add.w    RotoZoomer.distoStrength,d3
  429.     dbra    d6,.chunkloop
  430.  
  431.     move.l    a2,d0
  432.     move.l    a3,d1
  433.     add.l    a4,d0
  434.     addx.b    d5,d1
  435.     movea.l    d0,a2
  436.     movea.l    d1,a3
  437.     dbra    d7,.yloop
  438.     rts
  439.  
  440. RotoZoomer.distoPaintRgb50:
  441.     movea.l    d3,a6
  442.  
  443. .yloop:    moveq    #16-1,d6
  444.     move.l    a2,d0
  445.     move.l    a3,d1
  446.     move.l    a6,d3
  447.  
  448. .chunkloop:
  449.     REPT    10
  450.     move.w    d0,d2
  451.     move.b    d1,d2
  452.     move.w    (a1,d2.l*2),(a0)+
  453.     move.w    (a1,d2.l*2),(a0)+
  454.     add.l    d3,d0
  455.     addx.b    d4,d1
  456.     ENDR
  457.     add.w    RotoZoomer.distoStrength,d3
  458.     dbra    d6,.chunkloop
  459.  
  460.     move.l    a2,d0
  461.     move.l    a3,d1
  462.     add.l    a4,d0
  463.     addx.b    d5,d1
  464.     movea.l    d0,a2
  465.     movea.l    d1,a3
  466.     dbra    d7,.yloop
  467.     rts
  468.  
  469. ;======= OBJECT RESERVES ========
  470.  
  471.     BSS
  472.  
  473. RotoZoomer.startTime:
  474.     DS.L    1
  475. RotoZoomer.vectorTable:
  476.     DS.B    VectorTable.SIZE
  477. RotoZoomer.scaledVectorTable:
  478.     DS.B    VectorTable.SIZE
  479. RotoZoomer.center:
  480.     DS.W    2
  481. RotoZoomer.distMode:
  482.     DS.W    1
  483. RotoZoomer.distoStrength:
  484.     DS.W    1
  485.  
  486. ;======= END OF DEMO-EFFECT OBJECT ========