home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / DSPBILIN.SO < prev    next >
Text File  |  2004-01-16  |  19KB  |  1,019 lines

  1. ; bitchkicked dsp bilinear rotozoom.
  2. ;
  3. ; yeah, 25fps in rgb50 on std falc..
  4. ;
  5. ; update: seems faster since handshake is done only once per 2 pixels.
  6. ; update: dsp mem-use optimised, is now much faster.
  7.  
  8. ;======= OBJECT TABLE ======================================================
  9.  
  10.     IFND    DEMO_SYSTEM
  11. testmode:    =    0
  12.     move.l    #Bilerp.table,fxAdr
  13.     INCLUDE    TESTER.S
  14.     TEXT
  15.     INCLUDE    DSP.I
  16.     TEXT
  17.     ENDC    
  18.  
  19. ; Must be first in object!!
  20. Bilerp.table:
  21.     DC.L    Bilerp.mainLoop
  22.     DC.L    Bilerp.init
  23.     DC.L    Bilerp.initRT
  24.     DC.L    Bilerp.deinitRT
  25.     DC.L    Bilerp.setFadeIn
  26.     DC.L    Bilerp.setFadeOut
  27.     DC.L    Bilerp.setZooming2
  28.     DC.L    Bilerp.setCrawling
  29.     DC.L    Bilerp.setCrawling2
  30.     DC.L    Bilerp.setCrawling3
  31.     DC.L    Bilerp.setGlueZoom
  32.     DC.L    Bilerp.setCrawling4
  33.     DC.L    Bilerp.setCrawling5
  34.     DC.L    0
  35.  
  36. ;======= OBJECT EQUATES ====================================================
  37.  
  38. Bilerp.DOUBLE:    =    1
  39.  
  40.             RSRESET
  41. VectorTable.AX:        RS.W    1
  42. VectorTable.AY:        RS.W    1
  43. VectorTable.BX:        RS.W    1
  44. VectorTable.BY:        RS.W    1
  45. VectorTable.SIZE:    RS.B    0
  46.  
  47.             RSRESET
  48. Bilerp.PAL:        RS.L    256
  49. Bilerp.BLOCK_SIZE:    RS.B    0
  50.  
  51. ;======= INIT SUBROUTINE ===================================================
  52.  
  53. ; OUTPUT:
  54. ; d0.l: 0   = All clear, neg = Error! Not initialized!
  55. Bilerp.init:
  56.     move.l    #Bilerp.BLOCK_SIZE,d0
  57.     bsr.l    Mem.register
  58.  
  59. .success:
  60.     moveq    #0,d0
  61.     rts
  62. .error:    moveq    #-1,d0
  63.     rts
  64.  
  65. ;======= REALTIME INIT SUBROUTINE ==========================================
  66.  
  67. Bilerp.initRT:
  68.     move.l    #rts,vbl_gfx
  69.  
  70.     bsr.l    Mem.getBlock
  71.     move.l    d0,Bilerp.palAdr
  72.  
  73.     lea    Bilerp.singlePal,a0
  74.     lea    Bilerp.texture128+20,a1
  75.     move.l    #256,d7
  76.     bsr.l    convertTc2Hc
  77.  
  78.     lea    Bilerp.backedPal+256*2,a2
  79.     lea    Bilerp.singlePal+256*2,a1
  80.     movea.l    Bilerp.palAdr,a0
  81.     adda.w    #256*4,a0
  82.     clr.b    d0
  83. .loop:    move.w    -(a1),-(a0)
  84.     move.w    (a1),-(a0)
  85.     move.w    (a1),-(a2)
  86.     addq.b    #1,d0
  87.     bne.s    .loop
  88.  
  89.     lea    Bilerp.p56,a0
  90.     move.l    #(Bilerp.p56End-Bilerp.p56)/3,d0
  91.     bsr.l    Dsp.loadProgram
  92.  
  93.     lea    Bilerp.texture128+788,a0
  94.     move.w    #128*128-1,d7
  95.     clr.l    d0
  96. .tloop:    move.b    (a0)+,d0
  97.     sendLongToDsp    d0
  98.     dbf    d7,.tloop
  99.  
  100.     bsr    Bilerp.setZooming2
  101.  
  102.     move.w    monitormode,d0
  103.     cmpi.w    #vga60,d0
  104.     beq.s    .vga60
  105.     cmpi.w    #vga100,d0
  106.     beq.s    .vga100
  107.     cmpi.w    #rgb50,d0
  108.     beq.s    .rgb50
  109. ; Unknown monitormode..
  110. .end:    rts
  111. .vga60:    move.l    #vga60_16bit_160_200,resRout
  112.     move.l    resRout,Bilerp.res
  113.     rts
  114. .vga100:move.l    #vga100_16bit_160_100,resRout
  115.     move.l    resRout,Bilerp.res
  116.     rts
  117. .rgb50:    move.l    #rgb50_16bit_320_100,resRout
  118.     move.l    resRout,Bilerp.res
  119.     rts
  120.  
  121. ;======= DEINITIALISATION ROUTINE ==========================================
  122.  
  123. Bilerp.deinitRT:
  124.     rts
  125.  
  126. ;======= SCREENINIT SUBROUTINE =============================================
  127.  
  128. Bilerp.initScreen:
  129.     rts
  130.  
  131. ;======= MAINLOOP SUBROUTINE ===============================================
  132.  
  133. Bilerp.mainLoop:
  134.     move.w    $0468.w,old468
  135.  
  136.     move.l    frmcnt,d0
  137.     sub.l    lastframecount,d0
  138.     cmpi.l    #3,d0
  139.     bhs.s    .end_screeninit
  140.     bsr    Bilerp.initScreen
  141. .end_screeninit:
  142.  
  143. ; fading shit..
  144.     move.w    Bilerp.fadeDir,d0
  145.     beq.s    .end_fade
  146.     move.w    $04BC.w,d1
  147.     sub.w    Bilerp.fadeStart,d1        ; d1.w=fadetime    
  148. ; clip fadetime..
  149.     cmpi.w    #256,d1
  150.     ble.s    .fadetime_ok
  151.     move.w    #256,d1
  152.     clr.w    Bilerp.fadeDir            ; Kill fading..
  153. .fadetime_ok:
  154. ; calculate brightness from fadetime..
  155.     muls.w    d0,d1
  156.     tst.w    d0
  157.     bpl.s    .pos
  158.     addi.w    #256,d1
  159. .pos:
  160. ; d1.w=brightness
  161.     move.w    d1,Bilerp.brightness
  162.     bsr    Bilerp.fade
  163. .end_fade:
  164.  
  165.     movea.l    Bilerp.moveRout,a0
  166.     jsr    (a0)
  167.     bsr    Bilerp.paintTest
  168.  
  169.     lea    scr,a0
  170.     move.l    (a0)+,d0
  171.     move.l    (a0)+,d1
  172.     move.l    (a0),-4(a0)
  173.     move.l    d0,(a0)
  174.     move.l    d1,-8(a0)
  175.     movea.l    resRout,a0
  176.     clr.l    resRout
  177.     lea    Bilerp.black,a1
  178.     movea.l    d0,a2
  179.     
  180.     tst.w    Bilerp.flash
  181.     beq.s    .oki
  182.     bsr    .set_8bit
  183.  
  184.     move.l    Bilerp.res,resRout
  185.     move.l    frmcnt,d7
  186.     sub.l    lastframecount,d7
  187.     beq.s    .first
  188.     move.l    #Bilerp.set16BppMode,resRout
  189. .first:
  190.  
  191. .oki:    bsr.l    Screen.requestUpdate
  192.     clr.w    Bilerp.flash
  193.  
  194. ;    move.w    old468,d0
  195. ;.wait:    move.w    $0468.w,d1
  196. ;    sub.w    d0,d1
  197. ;    cmpi.w    #2,d1
  198. ;    blt.s    .wait
  199.     move.w    $0468.w,d0
  200. .wait:    cmp.w    $0468.w,d0
  201.     beq.s    .wait
  202.     rts
  203.  
  204. .set_8bit:
  205.     lea    empty,a2
  206.     lea    Bilerp.white,a1
  207.     move.l    #Bilerp.set8BplMode,a0
  208.     rts
  209.  
  210. Bilerp.res:
  211.     DC.L    0
  212.  
  213. Bilerp.white:
  214.     REPT    256
  215.     DC.L    $FFFFFFFF
  216.     ENDR
  217. Bilerp.black:
  218.     REPT    256
  219.     DC.L    0
  220.     ENDR
  221.  
  222. ;======= OBJECT SUBROUTINES ================================================
  223.  
  224. Bilerp.set8BplMode:
  225.     move.w    d7,-(sp)
  226.     move.w    $FFFF8266.w,d7
  227.     andi.w    #%1111111011111111,d7        ; tc mode off!
  228.     ori.w    #%0000000000010000,d7        ; 8bpl mode on
  229.     move.w    d7,$FFFF8266.w
  230.     move.w    (sp)+,d7
  231.     rts
  232.  
  233. Bilerp.set16BppMode:
  234.     move.w    d7,-(sp)
  235.     move.w    $FFFF8266.w,d7
  236.     andi.w    #%1111111111101111,d7        ; 8bpl mode off!
  237.     ori.w    #%0000000100000000,d7        ; tc mode on
  238.     move.w    d7,$FFFF8266.w
  239.     move.w    (sp)+,d7
  240.     rts
  241.  
  242. Bilerp.setFlash:
  243.     st    Bilerp.flash
  244.     rts
  245.  
  246. Bilerp.setZooming:
  247.     move.l    #Bilerp.calcPosition,Bilerp.moveRout
  248.     rts
  249.  
  250. Bilerp.setZooming2:
  251.     move.l    #Bilerp.calcPosition2,Bilerp.moveRout
  252.     rts
  253.  
  254. Bilerp.setCrawling:
  255.     move.l    #Bilerp.calcCrawlPosition,Bilerp.moveRout
  256.     bsr    setTime
  257.     bra    Bilerp.setFlash
  258.  
  259. Bilerp.setCrawling2:
  260.     move.l    #Bilerp.calcCrawlPosition2,Bilerp.moveRout
  261.     bsr    setTime
  262.     bra    Bilerp.setFlash
  263.  
  264. Bilerp.setCrawling3:
  265.     move.l    #Bilerp.calcCrawlPosition3,Bilerp.moveRout
  266.     bsr    setTime
  267.     bra    Bilerp.setFlash
  268.  
  269. Bilerp.setCrawling4:
  270.     move.l    #Bilerp.calcCrawlPosition4,Bilerp.moveRout
  271.     bsr    setTime
  272.     bra    Bilerp.setFlash
  273.  
  274. Bilerp.setCrawling5:
  275.     move.l    #Bilerp.calcCrawlPosition5,Bilerp.moveRout
  276.     bsr    setTime
  277.     bra    Bilerp.setFlash
  278.  
  279. Bilerp.setGlueZoom:
  280.     move.l    #Bilerp.calcGluePosition,Bilerp.moveRout
  281.     bra    Bilerp.setFlash
  282.  
  283. Bilerp.setFadeIn:
  284.     move.w    $04BC.w,Bilerp.fadeStart
  285.     move.w    #+1,Bilerp.fadeDir
  286.     rts
  287.  
  288. Bilerp.setFadeOut:
  289.     move.w    $04BC.w,Bilerp.fadeStart
  290.     move.w    #-1,Bilerp.fadeDir
  291.     rts
  292.  
  293. ; d1.w=intensity
  294. Bilerp.fade:
  295.     lea    Bilerp.texture128+20,a2
  296.     lea    Bilerp.singlePal,a1
  297.     movea.l    Bilerp.palAdr,a0
  298.     clr.b    d0
  299. .loop:    clr.l    d2
  300.     move.b    (a2)+,d2
  301.     mulu.w    d1,d2
  302.     andi.w    #$F800,d2
  303.     clr.l    d3
  304.     move.b    (a2)+,d3
  305.     mulu.w    d1,d3
  306.     lsr.w    #5,d3
  307.     andi.w    #$07E0,d3
  308.     clr.l    d4
  309.     move.b    (a2)+,d4
  310.     mulu.w    d1,d4
  311.     lsr.w    #8,d4
  312.     lsr.w    #3,d4
  313.     or.w    d3,d2
  314.     or.w    d4,d2
  315.     move.w    d2,(a1)+
  316.     move.w    d2,(a0)+
  317.     move.w    d2,(a0)+
  318.     addq.b    #1,d0
  319.     bne.s    .loop
  320.     rts
  321.  
  322. Bilerp.calcGluePosition:
  323. ; First we calculate the current time.
  324.     bsr    getTime
  325.     move.l    d0,d1
  326.     move.l    d0,d6
  327.     lea    sine_tbl,a0
  328.  
  329. ; Now we calculate our center position.
  330.     move.w    d1,d3
  331.     mulu.w    #5,d1
  332.     lsr.l    #1,d1
  333.     mulu.w    #7,d3
  334.     lsr.l    #2,d3
  335.     Do_SinModulo    d1
  336.     Do_SinModulo    d3
  337.     Get_Sin    a0,d1,d2
  338.     Get_Sin    a0,d3,d3
  339.     swap    d2
  340.     swap    d3
  341.     clr.w    d2
  342.     clr.w    d3
  343.     asr.l    #6,d2
  344.     asr.l    #6,d3
  345.     move.l    #$40000000,d2
  346.     move.l    #$50000000,d3
  347.     movem.l    d2/d3,Bilerp.center
  348.  
  349. ; And now we calculate the current position in the trajectory.
  350.     mulu.w    #7,d0
  351.     lsr.l    d0
  352.     Do_SinModulo    d0
  353.     Get_SinCos    a0,d0,d0,d1
  354. ; d0.w: +sin(fi)
  355. ; d1.w: +cos(fi)
  356.  
  357. ; a'.x = +cos(fi)
  358. ; a'.y = -sin(fi)
  359.     move.w    d1,d2
  360.     move.w    d0,d3
  361.     neg.w    d3
  362. ; d2.w: a'.x, d3.w: a'.y
  363. ; b'.x = +sin(fi)
  364. ; b'.y = +cos(fi)
  365.     move.w    d0,d4
  366.     move.w    d1,d5
  367. ; d4.w: b'.x, d5.w: b'.y
  368.  
  369. ; And we calculate the amount of zoom...
  370.     mulu.w    #7,d6
  371.     lsr.l    #3,d6
  372.     Do_SinModulo    d6
  373.     Get_Sin    a0,d6,d6
  374.     addi.w    #$8000,d6
  375.     andi.l    #$ffff,d6
  376.     lsr.w    #5,d6
  377.     move.w    #$4000,d6
  378.     bra    Bilerp.sendCoordsToDsp
  379.  
  380. ; "earx"
  381. Bilerp.calcCrawlPosition:
  382. ; First we calculate the current time.
  383.     bsr    getTime
  384.     move.l    d0,d1
  385.     move.l    d0,d6
  386.     lea    sine_tbl,a0
  387.  
  388. ; Now we calculate our center position.
  389.     move.w    d1,d3
  390.     mulu.w    #13,d1
  391.     lsr.l    #1,d1
  392.     mulu.w    #17,d3
  393.     lsr.l    #2,d3
  394.     Do_SinModulo    d1
  395.     Do_SinModulo    d3
  396.     Get_Sin    a0,d1,d2
  397.     Get_Sin    a0,d3,d3
  398.     swap    d2
  399.     swap    d3
  400.     clr.w    d2
  401.     clr.w    d3
  402.     asr.l    #4,d2
  403.     asr.l    #4,d3
  404.     addi.l    #$80000000,d2
  405.     addi.l    #$D6000000,d3
  406.     movem.l    d2/d3,Bilerp.center
  407.  
  408. ; And now we calculate the current position in the trajectory.
  409.     mulu.w    #7,d0
  410.     lsr.l    #3,d0
  411.     subi.w    #$100,d0
  412.     Do_SinModulo    d0
  413.     Get_SinCos    a0,d0,d0,d1
  414. ; d0.w: +sin(fi)
  415. ; d1.w: +cos(fi)
  416.  
  417. ; a'.x = +cos(fi)
  418. ; a'.y = -sin(fi)
  419.     move.w    d1,d2
  420.     move.w    d0,d3
  421.     neg.w    d3
  422. ; d2.w: a'.x, d3.w: a'.y
  423. ; b'.x = +sin(fi)
  424. ; b'.y = +cos(fi)
  425.     move.w    d0,d4
  426.     move.w    d1,d5
  427. ; d4.w: b'.x, d5.w: b'.y
  428.  
  429. ; And we calculate the amount of zoom...
  430.     mulu.w    #7,d6
  431.     lsr.l    #3,d6
  432.     Do_SinModulo    d6
  433.     Get_Sin    a0,d6,d6
  434.     addi.w    #$8000,d6
  435.     andi.l    #$ffff,d6
  436.     lsr.w    #5,d6
  437.     move.w    #$1800,d6
  438.     bra    Bilerp.sendCoordsToDsp
  439.  
  440. Bilerp.sendCoordsToDsp:
  441. ; And zoom the damn thing!
  442.     muls.w    d6,d2
  443.     muls.w    d6,d3
  444.     muls.w    d6,d4
  445.     muls.w    d6,d5
  446.     asr.l    #7,d2
  447.     asr.l    #7,d3
  448.     asr.l    #7,d4
  449.     asr.l    #7,d5
  450.     movea.l    d2,a2
  451.     movea.l    d3,a3
  452.     movea.l    d4,a4
  453.     movea.l    d5,a5
  454.     asr.l    #8,d2
  455.     asr.l    #8,d3
  456.     asr.l    #8,d4
  457.     asr.l    #8,d5
  458.     sendLongToDsp    d2
  459.     sendLongToDsp    d3
  460.     sendLongToDsp    d4
  461.     sendLongToDsp    d5
  462.  
  463.     movem.l    Bilerp.center,d6/d7
  464.     lsr.l    d6
  465.     lsr.l    d7
  466.     move.l    a2,d2
  467.     move.l    a3,d3
  468.     move.l    a4,d4
  469.     move.l    a5,d5
  470.     muls.l    #80,d2
  471.     muls.l    #80,d3
  472.     sub.l    d2,d6
  473.     sub.l    d3,d7
  474.     muls.l    #50,d4
  475.     muls.l    #50,d5
  476.     sub.l    d4,d6                ; d6.w=topleft_u
  477.     sub.l    d5,d7                ; d7.w=topleft_v
  478.     lsr.l    #8,d6
  479.     lsr.l    #8,d7
  480.     andi.l    #$7FFFFF,d6
  481.     andi.l    #$7FFFFF,d7
  482.     sendLongToDsp    d6
  483.     sendLongToDsp    d7
  484.  
  485.     rts
  486.  
  487. ; "crem"
  488. Bilerp.calcCrawlPosition2:
  489. ; First we calculate the current time.
  490.     bsr    getTime
  491.     move.l    d0,d1
  492.     move.l    d0,d6
  493.     lea    sine_tbl,a0
  494.  
  495. ; Now we calculate our center position.
  496.     move.w    d1,d3
  497.     mulu.w    #23,d1
  498.     lsr.l    #2,d1
  499.     mulu.w    #27,d3
  500.     lsr.l    #2,d3
  501.     Do_SinModulo    d1
  502.     Do_SinModulo    d3
  503.     Get_Sin    a0,d1,d2
  504.     Get_Sin    a0,d3,d3
  505.     swap    d2
  506.     swap    d3
  507.     clr.w    d2
  508.     clr.w    d3
  509.     asr.l    #4,d2
  510.     asr.l    #4,d3
  511.     addi.l    #$B0000000,d2
  512.     addi.l    #$E8000000,d3
  513.     movem.l    d2/d3,Bilerp.center
  514.  
  515. ; And now we calculate the current position in the trajectory.
  516.     mulu.w    #5,d0
  517.     lsr.l    #2,d0
  518.     subi.w    #$100,d0
  519.     Do_SinModulo    d0
  520.     Get_SinCos    a0,d0,d0,d1
  521. ; d0.w: +sin(fi)
  522. ; d1.w: +cos(fi)
  523.  
  524. ; a'.x = +cos(fi)
  525. ; a'.y = -sin(fi)
  526.     move.w    d1,d2
  527.     move.w    d0,d3
  528.     neg.w    d3
  529. ; d2.w: a'.x, d3.w: a'.y
  530. ; b'.x = +sin(fi)
  531. ; b'.y = +cos(fi)
  532.     move.w    d0,d4
  533.     move.w    d1,d5
  534. ; d4.w: b'.x, d5.w: b'.y
  535.  
  536. ; And we calculate the amount of zoom...
  537.     mulu.w    #7,d6
  538.     lsr.l    #3,d6
  539.     Do_SinModulo    d6
  540.     Get_Sin    a0,d6,d6
  541.     addi.w    #$8000,d6
  542.     andi.l    #$ffff,d6
  543.     lsr.w    #5,d6
  544.     move.w    #$1000,d6
  545.     bra    Bilerp.sendCoordsToDsp
  546.  
  547. ; "dforce"
  548. Bilerp.calcCrawlPosition3:
  549. ; First we calculate the current time.
  550.     bsr    getTime
  551.     move.l    d0,d1
  552.     move.l    d0,d6
  553.     lea    sine_tbl,a0
  554.  
  555. ; Now we calculate our center position.
  556.     move.w    d1,d3
  557.     mulu.w    #27,d1
  558.     lsr.l    #2,d1
  559.     mulu.w    #23,d3
  560.     lsr.l    #2,d3
  561.     Do_SinModulo    d1
  562.     Do_SinModulo    d3
  563.     Get_Sin    a0,d1,d2
  564.     Get_Sin    a0,d3,d3
  565.     swap    d2
  566.     swap    d3
  567.     clr.w    d2
  568.     clr.w    d3
  569.     asr.l    #3,d2
  570.     asr.l    #5,d3
  571.     addi.l    #$C0000000,d2
  572.     addi.l    #$28000000,d3
  573.     movem.l    d2/d3,Bilerp.center
  574.  
  575. ; And now we calculate the current position in the trajectory.
  576.     mulu.w    #11,d0
  577.     lsr.l    #3,d0
  578.     subi.w    #$100,d0
  579.     Do_SinModulo    d0
  580.     Get_SinCos    a0,d0,d0,d1
  581. ; d0.w: +sin(fi)
  582. ; d1.w: +cos(fi)
  583.  
  584. ; a'.x = +cos(fi)
  585. ; a'.y = -sin(fi)
  586.     move.w    d1,d2
  587.     move.w    d0,d3
  588.     neg.w    d3
  589. ; d2.w: a'.x, d3.w: a'.y
  590. ; b'.x = +sin(fi)
  591. ; b'.y = +cos(fi)
  592.     move.w    d0,d4
  593.     move.w    d1,d5
  594. ; d4.w: b'.x, d5.w: b'.y
  595.  
  596. ; And we calculate the amount of zoom...
  597.     mulu.w    #7,d6
  598.     lsr.l    #3,d6
  599.     Do_SinModulo    d6
  600.     Get_Sin    a0,d6,d6
  601.     addi.w    #$8000,d6
  602.     andi.l    #$ffff,d6
  603.     lsr.w    #5,d6
  604.     move.w    #$1600,d6
  605.     bra    Bilerp.sendCoordsToDsp
  606.  
  607. ; "evl"
  608. Bilerp.calcCrawlPosition4:
  609. ; First we calculate the current time.
  610.     bsr    getTime
  611.     move.l    d0,d1
  612.     move.l    d0,d6
  613.     lea    sine_tbl,a0
  614.  
  615. ; Now we calculate our center position.
  616.     move.w    d1,d3
  617.     mulu.w    #31,d1
  618.     lsr.l    #2,d1
  619.     mulu.w    #17,d3
  620.     lsr.l    #1,d3
  621.     Do_SinModulo    d1
  622.     Do_SinModulo    d3
  623.     Get_Sin    a0,d1,d2
  624.     Get_Sin    a0,d3,d3
  625.     swap    d2
  626.     swap    d3
  627.     clr.w    d2
  628.     clr.w    d3
  629.     asr.l    #4,d2
  630.     asr.l    #4,d3
  631.     addi.l    #$4E000000,d2
  632.     addi.l    #$C4000000,d3
  633.     movem.l    d2/d3,Bilerp.center
  634.  
  635. ; And now we calculate the current position in the trajectory.
  636.     mulu.w    #3,d0
  637.     lsr.l    #2,d0
  638.     subi.w    #$100,d0
  639.     Do_SinModulo    d0
  640.     Get_SinCos    a0,d0,d0,d1
  641. ; d0.w: +sin(fi)
  642. ; d1.w: +cos(fi)
  643.  
  644. ; a'.x = +cos(fi)
  645. ; a'.y = -sin(fi)
  646.     move.w    d1,d2
  647.     move.w    d0,d3
  648.     neg.w    d3
  649. ; d2.w: a'.x, d3.w: a'.y
  650. ; b'.x = +sin(fi)
  651. ; b'.y = +cos(fi)
  652.     move.w    d0,d4
  653.     move.w    d1,d5
  654. ; d4.w: b'.x, d5.w: b'.y
  655.  
  656. ; And we calculate the amount of zoom...
  657.     mulu.w    #7,d6
  658.     lsr.l    #3,d6
  659.     Do_SinModulo    d6
  660.     Get_Sin    a0,d6,d6
  661.     addi.w    #$8000,d6
  662.     andi.l    #$ffff,d6
  663.     lsr.w    #5,d6
  664.     move.w    #$1200,d6
  665.     bra    Bilerp.sendCoordsToDsp
  666.  
  667. ; "havoc"
  668. Bilerp.calcCrawlPosition5:
  669. ; First we calculate the current time.
  670.     bsr    getTime
  671.     move.l    d0,d1
  672.     move.l    d0,d6
  673.     lea    sine_tbl,a0
  674.  
  675. ; Now we calculate our center position.
  676.     move.w    d1,d3
  677.     mulu.w    #17,d1
  678.     lsr.l    #2,d1
  679.     mulu.w    #31,d3
  680.     lsr.l    #2,d3
  681.     Do_SinModulo    d1
  682.     Do_SinModulo    d3
  683.     Get_Sin    a0,d1,d2
  684.     Get_Sin    a0,d3,d3
  685.     swap    d2
  686.     swap    d3
  687.     clr.w    d2
  688.     clr.w    d3
  689.     asr.l    #3,d2
  690.     asr.l    #5,d3
  691.     addi.l    #$48000000,d2
  692.     addi.l    #$18000000,d3
  693.     movem.l    d2/d3,Bilerp.center
  694.  
  695. ; And now we calculate the current position in the trajectory.
  696.     mulu.w    #13,d0
  697.     lsr.l    #4,d0
  698.     subi.w    #$100,d0
  699.     Do_SinModulo    d0
  700.     Get_SinCos    a0,d0,d0,d1
  701. ; d0.w: +sin(fi)
  702. ; d1.w: +cos(fi)
  703.  
  704. ; a'.x = +cos(fi)
  705. ; a'.y = -sin(fi)
  706.     move.w    d1,d2
  707.     move.w    d0,d3
  708.     neg.w    d3
  709. ; d2.w: a'.x, d3.w: a'.y
  710. ; b'.x = +sin(fi)
  711. ; b'.y = +cos(fi)
  712.     move.w    d0,d4
  713.     move.w    d1,d5
  714. ; d4.w: b'.x, d5.w: b'.y
  715.  
  716. ; And we calculate the amount of zoom...
  717.     mulu.w    #7,d6
  718.     lsr.l    #3,d6
  719.     Do_SinModulo    d6
  720.     Get_Sin    a0,d6,d6
  721.     addi.w    #$8000,d6
  722.     andi.l    #$ffff,d6
  723.     lsr.w    #5,d6
  724.     move.w    #$1200,d6
  725.     bra    Bilerp.sendCoordsToDsp
  726.  
  727. Bilerp.calcPosition:
  728. ; First we calculate the current time.
  729.     bsr    getTime
  730.     move.l    d0,d1
  731.     move.l    d0,d6
  732.     lea    sine_tbl,a0
  733.  
  734. ; Now we calculate our center position.
  735.     mulu.w    #5,d1
  736.     lsr.l    #1,d1
  737.     Do_SinModulo    d1
  738.     Get_SinCos    a0,d1,d2,d3
  739.     swap    d2
  740.     swap    d3
  741.     clr.w    d2
  742.     clr.w    d3
  743.     asr.l    #2,d2
  744.     asr.l    #2,d3
  745.     addi.l    #$80000000,d2
  746.     addi.l    #$80000000,d3
  747. ;    move.l    #$80000000,d2
  748. ;    move.l    #$80000000,d3
  749.     movem.l    d2/d3,Bilerp.center
  750.  
  751. ; And now we calculate the current position in the trajectory.
  752.     Do_SinModulo    d0
  753.     Get_SinCos    a0,d0,d0,d1
  754. ; d0.w: +sin(fi)
  755. ; d1.w: +cos(fi)
  756.  
  757. ; a'.x = +cos(fi)
  758. ; a'.y = -sin(fi)
  759.     move.w    d1,d2
  760.     move.w    d0,d3
  761.     neg.w    d3
  762. ; d2.w: a'.x, d3.w: a'.y
  763. ; b'.x = +sin(fi)
  764. ; b'.y = +cos(fi)
  765.     move.w    d0,d4
  766.     move.w    d1,d5
  767. ; d4.w: b'.x, d5.w: b'.y
  768.  
  769. ; And we calculate the amount of zoom...
  770.     mulu.w    #7,d6
  771.     lsr.l    #3,d6
  772.     Do_SinModulo    d6
  773.     Get_Sin    a0,d6,d6
  774.     addi.w    #$8000,d6
  775.     andi.l    #$ffff,d6
  776.     lsr.w    d6
  777.     bra    Bilerp.sendCoordsToDsp
  778.  
  779. Bilerp.calcPosition2:
  780. ; First we calculate the current time.
  781.     bsr    getTime
  782.     move.l    d0,d1
  783.     move.l    d0,d6
  784.     move.l    d0,d5
  785.     lea    sine_tbl,a0
  786.  
  787. ; Now we calculate our center position.
  788.  
  789. ; And we calculate the amount of zoom...
  790.     mulu.w    #7,d5
  791.     lsr.l    #3,d5
  792.     Do_SinModulo    d5
  793.     Get_Sin    a0,d5,d5
  794.     addi.w    #$8000,d5
  795. ;    mulu.w    d5,d5
  796. ;    swap    d5
  797. ;    mulu.w    d5,d5
  798. ;    swap    d5
  799. ;    mulu.w    d5,d5
  800. ;    swap    d5
  801. ;    mulu.w    d5,d5
  802. ;    swap    d5
  803.     andi.l    #$ffff,d5
  804.     lsr.w    #2,d5
  805.     addi.w    #$3000,d5
  806.  
  807.     mulu.w    #5,d1
  808.     lsr.l    #1,d1
  809.     Do_SinModulo    d1
  810.     Get_SinCos    a0,d1,d2,d3
  811.     muls.w    d5,d2
  812.     muls.w    d5,d3
  813.     asr.l    #8,d2
  814.     asr.l    #8,d3
  815.     asr.l    #7,d2
  816.     asr.l    #7,d3
  817.     swap    d2
  818.     swap    d3
  819.     clr.w    d2
  820.     clr.w    d3
  821.     asr.l    #2,d2
  822.     asr.l    #2,d3
  823.     addi.l    #$80000000,d2
  824.     addi.l    #$80000000,d3
  825. ;    move.l    #$80000000,d2
  826. ;    move.l    #$80000000,d3
  827.     movem.l    d2/d3,Bilerp.center
  828.  
  829. ; And now we calculate the current position in the trajectory.
  830. ;    clr.w    d0
  831.     Do_SinModulo    d0
  832.     Get_SinCos    a0,d0,d0,d1
  833. ; d0.w: +sin(fi)
  834. ; d1.w: +cos(fi)
  835.  
  836. ; a'.x = +cos(fi)
  837. ; a'.y = -sin(fi)
  838.     move.w    d1,d2
  839.     move.w    d0,d3
  840.     neg.w    d3
  841. ; d2.w: a'.x, d3.w: a'.y
  842. ; b'.x = +sin(fi)
  843. ; b'.y = +cos(fi)
  844.     move.w    d0,d4
  845.     move.w    d1,d5
  846. ; d4.w: b'.x, d5.w: b'.y
  847.  
  848. ; And we calculate the amount of zoom...
  849.     mulu.w    #7,d6
  850.     lsr.l    #3,d6
  851.     Do_SinModulo    d6
  852.     Get_Sin    a0,d6,d6
  853.     addi.w    #$8000,d6
  854.     andi.l    #$ffff,d6
  855.     lsr.w    #2,d6
  856.     addi.w    #$400,d6
  857.     bra    Bilerp.sendCoordsToDsp
  858.  
  859. Bilerp.paintTest:
  860.     movea.l    scr,a0
  861.     lea    $FFFFA202.w,a2
  862.     lea    $FFFFA207.w,a3
  863.     clr.l    d0                ; for paloffset
  864.  
  865.     move.w    monitormode,d1
  866.     cmpi.w    #vga60,d1
  867.     beq    Bilerp.paintVga60        ; no good vga60 yet
  868.     cmpi.w    #vga100,d1
  869.     beq.s    Bilerp.paintVga100
  870.     cmpi.w    #rgb50,d1
  871.     beq    Bilerp.paintRgb50
  872. ; Unknown monitormode..
  873. ;.end:    rts
  874.  
  875. Bilerp.paintVga100:
  876.     lea    Bilerp.singlePal,a1    
  877.     IFNE    Bilerp.DOUBLE
  878.     lea    -1(a3),a4
  879.     move.w    #16000/(10*2)-1,d7        ; todo: look at size!
  880.     moveq    #1,d1
  881.  
  882. .loop:
  883. ; 250 bytes in instr cache, maximum!!
  884.     REPT    10
  885.     and.b    d1,(a2)                ; btst.b #0,(a2), todo: does this not hamper mixer?
  886.     beq.s    *-2
  887.     move.b    (a4),d0                ; todo: look at size!! this version does 2 in 1!
  888.     move.w    (a1,d0.l*2),(a0)+        ; Lookup color and store. todo: word/long!
  889.     move.b    (a3),d0
  890.     move.w    (a1,d0.l*2),(a0)+        ; Lookup color and store. todo: word/long!
  891.     ENDR
  892.     dbf    d7,.loop
  893.     ELSE
  894.     move.w    #16000/25-1,d7
  895.     moveq    #1,d1
  896.  
  897. .loop:
  898. ; 250 bytes in instr cache, maximum!!
  899.     REPT    25
  900.     and.b    d1,(a2)                ; btst.b #0,(a2), todo: does this not hamper mixer?
  901.     beq.s    *-2
  902.     move.b    (a3),d0
  903.     move.w    (a1,d0.l*2),(a0)+        ; Lookup color and store.
  904.     ENDR
  905.     dbf    d7,.loop
  906.     ENDC
  907.     rts
  908.  
  909. Bilerp.paintVga60:
  910.     lea    -1(a3),a4
  911.     moveq    #1,d1
  912.     lea    Bilerp.singlePal,a1    
  913.     movea.w    #160*2,a6
  914.     moveq    #100-1,d7
  915.  
  916. .yloop:    lea    (a0,a6.l),a5
  917.     moveq    #160/(10*2)-1,d6
  918.  
  919. .xloop:
  920.     REPT    10
  921.     and.b    d1,(a2)                ; btst.b #0,(a2), todo: does this not hamper mixer?
  922.     beq.s    *-2
  923.     move.b    (a4),d0                ; todo: look at size!! this version does 2 in 1!
  924.     move.w    (a1,d0.l*2),(a0)+        ; Lookup color and store. todo: word/long!
  925.     move.b    (a3),d0
  926.     move.w    (a1,d0.l*2),(a0)+        ; Lookup color and store. todo: word/long!
  927.     move.l    -4(a0),(a5)+
  928.     ENDR
  929.     dbf    d6,.xloop
  930.  
  931.     adda.l    a6,a0
  932.     dbf    d7,.yloop
  933.     rts
  934.  
  935. ; this is just about 25fps at the moment. it must get faster (music!).
  936. Bilerp.paintRgb50:
  937.     movea.l    Bilerp.palAdr,a1
  938.     IFNE    Bilerp.DOUBLE
  939.     lea    -1(a3),a4
  940.     move.w    #16000/(10*2)-1,d7        ; todo: look at size!
  941.     moveq    #1,d1
  942.  
  943. .loop:
  944. ; 250 bytes in instr cache, maximum!!
  945.     REPT    10
  946.     and.b    d1,(a2)                ; btst.b #0,(a2), todo: does this not hamper mixer?
  947.     beq.s    *-2
  948.  
  949. ;    move.w    (a4),d0                ; todo: look at size!! this version does 2 in 1!
  950. ;    move.l    (a1,d0.l*8),(a0)+        ; Lookup color and store. todo: word/long!
  951. ;    move.l    4(a1,d0.l*8),(a0)+        ; Lookup color and store. todo: word/long!
  952.     move.b    (a4),d0                ; todo: look at size!! this version does 2 in 1!
  953.     move.l    (a1,d0.l*4),(a0)+        ; Lookup color and store. todo: word/long!
  954.     move.b    (a3),d0
  955.     move.l    (a1,d0.l*4),(a0)+        ; Lookup color and store. todo: word/long!
  956.  
  957.     ENDR
  958.     dbf    d7,.loop
  959.  
  960.     ELSE
  961.     move.w    #16000/25-1,d7
  962.     moveq    #1,d1
  963.     
  964. .loop:
  965. ; 250 bytes in instr cache, maximum!!
  966.     REPT    25
  967.     and.b    d1,(a2)                ; btst.b #0,(a2), todo: does this not hamper mixer?
  968.     beq.s    *-2
  969.     move.b    (a3),d0
  970.     move.l    (a1,d0.l*4),(a0)+        ; Lookup color and store.
  971.     ENDR
  972.     dbf    d7,.loop
  973.     ENDC
  974.     rts
  975.  
  976. ;======= OBJECT DATA =======================================================
  977.  
  978.     DATA
  979.  
  980. Bilerp.texture128:
  981.     INCBIN    TEXTN128.APX    TEXTU128.APX
  982.  
  983. Bilerp.p56:
  984.     INCBIN    BILERP.P56
  985. Bilerp.p56End:
  986.     EVEN
  987.  
  988. Bilerp.moveRout:
  989.     DC.L    Bilerp.calcPosition
  990.  
  991. Bilerp.flash:
  992.     DC.W    0
  993.  
  994. ;======= OBJECT RESERVES ===================================================
  995.  
  996.     BSS
  997.  
  998. Bilerp.startTime:
  999.     DS.L    1
  1000. Bilerp.scaledVectorTable:
  1001.     DS.B    VectorTable.SIZE
  1002. Bilerp.center:
  1003.     DS.L    2
  1004. Bilerp.distoStrength:
  1005.     DS.W    1
  1006. Bilerp.palAdr:
  1007.     DS.L    1
  1008. Bilerp.singlePal:
  1009.     DS.W    256
  1010. Bilerp.brightness:
  1011.     DS.W    1
  1012. Bilerp.fadeStart:
  1013.     DS.W    1
  1014. Bilerp.fadeDir:
  1015.     DS.W    1
  1016. Bilerp.backedPal:
  1017.     DS.W    256*2
  1018.  
  1019.