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

  1. ; Lenses screen for delta. Ultra lame thusfar, needs dsp
  2. ; (and maybe some alpha?). Already a 2 in 1 fx, but still stupid looking,
  3. ; bah...
  4. ; Again by earx. What do you expect then, there are no other 68k coders in
  5. ; direct vicinity of Culemborg.
  6. ;
  7. ; Divine inspiration: let's make lens-blobs.
  8.  
  9. ;======= OBJECT EQUATES ====================================================
  10.  
  11. Lenses.BLOBMODE:    =    1                ; blobs or 1 lousy lens
  12. Lenses.NUM_BLOBS:    =    4
  13. Lenses.RADIUS:        =    26                ; must be even and <32 (for speed)
  14. Lenses.BLOBRAD:        =    Lenses.RADIUS
  15. Lenses.ZOOM_OUT:    =    4                ; -2log of zoom (z>0)
  16.  
  17. Lenses.BLOBSHIFT:    =    10                ; shi(f)t
  18.  
  19. ; Don't change.
  20. Lenses.R_SQUARE:    =    Lenses.RADIUS*Lenses.RADIUS
  21. Lenses.B_SQUARE:    =    Lenses.BLOBRAD*Lenses.BLOBRAD
  22. Lenses.DIAM:        =    Lenses.RADIUS*2            ; d=2r
  23. Lenses.AREA:        =    Lenses.DIAM*Lenses.DIAM        ; A=d*d
  24.  
  25.             RSRESET
  26. Lenses.offsetMap:    RS.W    Lenses.AREA
  27. Lenses.heightMap:    RS.W    Lenses.AREA
  28. Lenses.hiTexture:    RS.W    128*256
  29. Lenses.texture:        RS.W    (256+128)*256
  30. Lenses.blobBuffer:    RS.W    160*100
  31. Lenses.divTable:    RS.W    65536
  32. Lenses.BLOCK_SIZE:    RS.B    0
  33.  
  34. ;======= OBJECT TABLE ======================================================
  35.  
  36. ; Must be first in object!!
  37. Lenses.table:
  38.     DC.L    Lenses.mainLoop
  39.     DC.L    Lenses.init
  40.     DC.L    Lenses.setRes
  41.     DC.L    Lenses.addOne
  42.     DC.L    Lenses.subOne
  43.     DC.L    Lenses.setTraject
  44.     DC.L    0
  45.  
  46. ;======= RESOLUTION SETTING ROUTINE ========================================
  47.  
  48. Lenses.setRes:
  49.     IFEQ    testmode
  50.     move.l    frmcnt,d0
  51.     sub.l    lastframecount,d0
  52.     beq.s    .end
  53.  
  54.     move.l    #rts,vbl_gfx
  55.  
  56.     move.w    monitormode,d0
  57.     cmpi.w    #vga60,d0
  58.     beq.l    vga60_16bit_160_200
  59.     cmpi.w    #vga100,d0
  60.     beq.l    vga100_16bit_160_100
  61.     cmpi.w    #rgb50,d0
  62.     beq.l    rgb50_16bit_320_100
  63. ; Unknown monitormode..
  64. .end:    rts
  65.     ENDC
  66.     rts
  67.  
  68. ;======= INIT SUBROUTINE ===================================================
  69.  
  70. ; OUTPUT:
  71. ; d0.l: 0   = All clear, neg = Error! Not initialized!
  72. Lenses.init:
  73.     move.l    #Lenses.BLOCK_SIZE,d0
  74.     bsr.l    Mem.register
  75.  
  76. .success:
  77.     moveq    #0,d0
  78.     rts
  79. .error:    moveq    #-1,d0
  80.     rts
  81.  
  82. ;======= REALTIME INIT SUBROUTINE ==========================================
  83.  
  84. Lenses.realtimeInit:
  85.     move.l    #Lenses.setRes,vbl_gfx
  86.  
  87.     bsr.l    Mem.getBlock
  88.     move.l    d0,d1
  89.     addi.l    #Lenses.offsetMap,d1
  90.     move.l    d1,Lenses.offsetMapAdr
  91.     move.l    d0,d1
  92.     addi.l    #Lenses.heightMap,d1
  93.     move.l    d1,Lenses.heightMapAdr
  94.     move.l    d0,d1
  95.     addi.l    #Lenses.hiTexture,d1
  96.     move.l    d1,Lenses.hiTextureAdr
  97.     move.l    d0,d1
  98.     addi.l    #Lenses.texture,d1
  99.     move.l    d1,Lenses.textureAdr
  100.     move.l    d0,d1
  101.     addi.l    #Lenses.blobBuffer,d1
  102.     move.l    d1,Lenses.blobAdr
  103.     move.l    d0,d1
  104.     addi.l    #Lenses.divTable,d1
  105.     move.l    d1,Lenses.divTableAdr
  106.  
  107. ; mid
  108.     movea.l    Lenses.textureAdr,a0
  109.     lea    Texture.8bTexture1,a1
  110.     lea    Texture.crapPal,a2
  111.     clr.w    d7
  112.     clr.l    d0
  113. .conv_loop:
  114.     move.b    (a1)+,d0
  115.     move.w    (a2,d0.l*2),(a0)+
  116.     addq.w    #1,d7
  117.     bne.s    .conv_loop
  118.  
  119. ; lower
  120.     lea    Texture.8bTexture1,a1
  121.     clr.w    d7
  122.     clr.l    d0
  123. .conv_loop_l:
  124.     move.b    (a1)+,d0
  125.     move.w    (a2,d0.l*2),(a0)+
  126.     addq.w    #1,d7
  127.     bpl.s    .conv_loop_l
  128.  
  129. ; upper
  130.     movea.l    Lenses.hiTextureAdr,a0
  131.     lea    Texture.8bTexture1+128*256,a1
  132.     clr.w    d7
  133.     clr.l    d0
  134. .conv_loop_u:
  135.     move.b    (a1)+,d0
  136.     move.w    (a2,d0.l*2),(a0)+
  137.     addq.w    #1,d7
  138.     bpl.s    .conv_loop_u
  139.  
  140.     IFEQ    Lenses.BLOBMODE
  141.     bsr.w    Lenses.calcOffsetMap
  142.     ELSE
  143.     bsr.w    Lenses.calcBump
  144.     bsr.w    Lenses.calcDivTable
  145.     ENDC
  146.  
  147.     clr.w    Lenses.backMoving
  148.     move.w    #1,Lenses.numLenses
  149.  
  150.     rts
  151.  
  152. ;======= SCREENINIT SUBROUTINE =============================================
  153.  
  154. Lenses.initScreen:
  155. ; Insert screenarea initialising, etc. in here!
  156.     rts
  157.  
  158. ;======= MAINLOOP SUBROUTINE ===============================================
  159.  
  160. Lenses.mainLoop:
  161.     move.w    $0468.w,old468
  162.  
  163.     move.l    frmcnt,d0
  164.     sub.l    lastframecount,d0
  165.     bne.s    .end_realtime_init
  166.     move.l    d0,-(sp)
  167.     bsr    Lenses.realtimeInit
  168.     move.l    (sp)+,d0
  169. .end_realtime_init:
  170.     cmpi.l    #3,d0
  171.     bhs.s    .end_screeninit
  172.     bsr    Lenses.initScreen
  173. .end_screeninit:
  174.  
  175.     IFNE    Lenses.BLOBMODE
  176.  
  177.     bsr.w    Lenses.clearBlobBuffer
  178.     move.w    Lenses.numLenses,-(sp)
  179.  
  180.     subq.w    #1,(sp)
  181.     bmi    .end_add
  182.     move.w    $04BC.w,d0
  183.     move.w    d0,d1
  184.     mulu.w    #11,d0
  185.     lsr.l    #2,d0
  186.     mulu.w    #7,d1
  187.     lsr.l    #1,d1
  188.     Do_SinModulo    d0
  189.     Do_SinModulo    d1
  190.     lea    sine_tbl,a1
  191.     Get_Sin    a1,d0,d0
  192.     Get_Cos    a1,d1,d1
  193.     muls.w    #160-Lenses.DIAM,d0
  194.     muls.w    #100-Lenses.DIAM,d1
  195.     swap    d0
  196.     swap    d1
  197.     bsr.w    Lenses.addBlob
  198.  
  199.     subq.w    #1,(sp)
  200.     bmi    .end_add
  201.     move.w    $04BC.w,d0
  202.     move.w    d0,d1
  203.     mulu.w    #13,d0
  204.     lsr.l    #2,d0
  205.     mulu.w    #5,d1
  206.     lsr.l    #1,d1
  207.     Do_SinModulo    d0
  208.     Do_SinModulo    d1
  209.     lea    sine_tbl,a1
  210.     Get_Sin    a1,d0,d0
  211.     Get_Cos    a1,d1,d1
  212.     muls.w    #160-Lenses.DIAM,d0
  213.     muls.w    #100-Lenses.DIAM,d1
  214.     swap    d0
  215.     swap    d1
  216.     bsr.w    Lenses.addBlob
  217.  
  218.     subq.w    #1,(sp)
  219.     bmi    .end_add
  220.     move.w    $04BC.w,d0
  221.     move.w    d0,d1
  222.     mulu.w    #17,d0
  223.     lsr.l    #2,d0
  224.     mulu.w    #27,d1
  225.     lsr.l    #4,d1
  226.     Do_SinModulo    d0
  227.     Do_SinModulo    d1
  228.     lea    sine_tbl,a1
  229.     Get_Sin    a1,d0,d0
  230.     Get_Cos    a1,d1,d1
  231.     muls.w    #160-Lenses.DIAM,d0
  232.     muls.w    #100-Lenses.DIAM,d1
  233.     swap    d0
  234.     swap    d1
  235.     bsr.w    Lenses.addBlob
  236.  
  237.     subq.w    #1,(sp)
  238.     bmi    .end_add
  239.     move.w    $04BC.w,d0
  240.     move.w    d0,d1
  241.     mulu.w    #19,d0
  242.     lsr.l    #2,d0
  243.     mulu.w    #3,d1
  244.     Do_SinModulo    d0
  245.     Do_SinModulo    d1
  246.     lea    sine_tbl,a1
  247.     Get_Sin    a1,d0,d0
  248.     Get_Cos    a1,d1,d1
  249.     muls.w    #160-Lenses.DIAM,d0
  250.     muls.w    #100-Lenses.DIAM,d1
  251.     swap    d0
  252.     swap    d1
  253.     bsr.w    Lenses.addBlob
  254.  
  255. .end_add:
  256.     addq    #2,sp
  257.     bsr.w    Lenses.paintBlob
  258.  
  259.     ELSE
  260.  
  261.     bsr.w    Lenses.paintBackground
  262.  
  263.     move.w    $04BC.w,d0
  264.     move.w    d0,d1
  265.     mulu.w    #11,d0
  266.     lsr.l    #2,d0
  267.     mulu.w    #7,d1
  268.     lsr.l    #1,d1
  269.     Do_SinModulo    d0
  270.     Do_SinModulo    d1
  271.     lea    sine_tbl,a1
  272.     Get_Sin    a1,d0,d0
  273.     Get_Cos    a1,d1,d1
  274.     muls.w    #160-Lenses.DIAM,d0
  275.     muls.w    #100-Lenses.DIAM,d1
  276.     swap    d0
  277.     swap    d1
  278.     bsr.w    Lenses.paintLens
  279.  
  280.     ENDC
  281.  
  282.     IFEQ    testmode
  283.     lea    scr,a0
  284.     move.l    (a0)+,d0
  285.     move.l    (a0)+,d1
  286.     move.l    (a0),-4(a0)
  287.     move.l    d0,(a0)
  288.     move.l    d1,-8(a0)
  289.     move.l    d0,d1
  290.     lsr.w    #8,d0
  291.     move.l    d0,$ffff8200.w
  292.     move.b    d1,$ffff820d.w
  293.     ENDC
  294.  
  295.     move.w    old468,d0
  296. .wait:    cmp.w    $0468.w,d0
  297.     beq.s    .wait
  298.  
  299.     rts
  300.  
  301. ;======= OBJECT SUBROUTINES ================================================
  302.  
  303. Lenses.addOne:
  304.     addq.w    #1,Lenses.numLenses
  305.     rts
  306.  
  307. Lenses.subOne:
  308.     subq.w    #1,Lenses.numLenses
  309.     rts
  310.  
  311. Lenses.setTraject:
  312.     st    Lenses.backMoving
  313.     move.w    $04BC.w,Lenses.trajStart
  314.     rts
  315.  
  316. ; Calculate the blob heightbuffer..
  317. Lenses.calcBump:
  318.     movea.l    Lenses.heightMapAdr,a0
  319.     moveq    #Lenses.DIAM-1,d7
  320.  
  321. .yloop:    moveq    #Lenses.DIAM-1,d6
  322.  
  323. .xloop:    move.w    d6,d0
  324.     move.w    d7,d1
  325.     muls.w    d0,d0
  326.     muls.w    d1,d1
  327.     add.l    d0,d1
  328.     cmpi.l    #Lenses.B_SQUARE*4,d1
  329.     blt.s    .in
  330.     move.l    #$ffff,d0
  331.     bra.s    .calc
  332. .in    moveq    #0,d0
  333.     divu.l    #Lenses.B_SQUARE*4,d1:d0
  334.     clr.w    d0
  335.     swap    d0
  336. .calc    move.l    #$ffff,d2
  337.     sub.l    d0,d2
  338.     mulu.w    d2,d2
  339.     swap    d2
  340.     mulu.w    d2,d2
  341.     clr.w    d2
  342.     swap    d2
  343.     andi.l    #$ffff,d2
  344.     divu.w    #Lenses.NUM_BLOBS*2,d2            ; *2 for signed crap
  345.     move.w    d2,(a0)+
  346.     subq.w    #2,d6
  347.     bpl.s    .xloop
  348.  
  349.     subq.w    #2,d7
  350.     bpl.s    .yloop
  351.     rts
  352.  
  353. Lenses.calcOffsetMap:
  354. ; Fill entire map with (x,y)->(x,y).
  355.     movea.l    Lenses.offsetMapAdr,a0
  356.     moveq    #-Lenses.RADIUS,d7
  357.  
  358. .yloop:    moveq    #-Lenses.RADIUS,d6
  359.  
  360. .xloop:    move.w    d7,d0
  361.     lsl.w    #8,d0
  362.     add.w    d6,d0
  363.     move.w    d0,(a0)+
  364.     addq.w    #1,d6
  365.     cmpi.w    #+Lenses.RADIUS,d6
  366.     blt.s    .xloop
  367.  
  368.     addq.w    #1,d7
  369.     cmpi.w    #+Lenses.RADIUS,d7
  370.     blt.s    .yloop
  371.  
  372. ; Fill lens-part with special sauce.
  373.     movea.l    Lenses.offsetMapAdr,a0        ; a0: upperleft
  374.     lea    Lenses.DIAM*2(a0),a1        ; a1: upperright
  375.     lea    Lenses.AREA*2(a0),a3        ; a3: lowerright
  376.     lea    -Lenses.DIAM*2(a3),a2        ; a2: lowerleft
  377.     movea.w    #Lenses.RADIUS-1,a6
  378.     moveq    #Lenses.RADIUS*2-1,d7
  379.     
  380. .vloop:    moveq    #Lenses.RADIUS*2-1,d6
  381.     movea.w    #Lenses.RADIUS-1,a5
  382.  
  383. .uloop:    move.w    d6,d0
  384.     move.w    d7,d1
  385.     mulu.w    d0,d0
  386.     mulu.w    d1,d1
  387.     add.l    d1,d0
  388.     move.l    #Lenses.R_SQUARE*4,d1
  389.     sub.l    d0,d1
  390.     cmpi.w    #Lenses.R_SQUARE/12,d1        ; Get rid of fester-edge!
  391.     ble.s    .next
  392. .calc:    bsr.l    Math.sqrt            ; d0.l=z*2 (16:16)
  393.     swap    d0                ; d0.w=z*2
  394.     clr.l    d1
  395.     clr.l    d2
  396.     move.w    d6,d1                ; d1.w=x
  397.     lsl.l    #Lenses.ZOOM_OUT,d1        ; d1.w=X=x/zoom
  398.     divu.w    d0,d1                ; d1.w=X/z
  399.     move.w    d1,d3                ; d3.w=X/z
  400.     move.w    d7,d2                ; d2.w=y
  401.     lsl.l    #Lenses.ZOOM_OUT,d2        ; d2.w=Y=y/zoom
  402.     divu.w    d0,d2                ; d2.w=Y/z
  403.     mulu.w    #256,d2                ; d2.w=160(Y/z)
  404.     add.w    d2,d1                ; d1.w=160(Y/z)+X/z
  405.     move.w    d1,-(a3)            ; Store lr offset.
  406.     neg.w    d1
  407.     move.w    d1,(a0)+            ; Store ul offset.
  408.     move.w    d3,d1
  409.     sub.w    d2,d1
  410.     move.w    d1,-(a1)            ; Store ur offset.
  411.     move.w    d2,d1
  412.     sub.w    d3,d1
  413.     move.w    d1,(a2)+            ; Store ll offset.
  414.     subq.w    #2,d6
  415.     bpl.s    .uloop
  416.     bra.s    .end_uloop
  417.  
  418. .next:    subq    #2,a1
  419.     subq    #2,a3
  420.     addq    #2,a0
  421.     addq    #2,a2
  422.     subq.w    #2,d6
  423.     bpl.s    .uloop
  424.  
  425. .end_uloop:
  426.     adda.w    #Lenses.RADIUS*2,a0
  427.     adda.w    #Lenses.RADIUS*6,a1
  428.     suba.w    #Lenses.RADIUS*6,a2
  429.     suba.w    #Lenses.RADIUS*2,a3
  430.     subq.w    #2,d7
  431.     bpl.s    .vloop
  432.     rts
  433.  
  434. Lenses.paintBackground:
  435.     movea.l    scr,a0
  436.     move.l    Lenses.textureAdr,a1
  437.     adda.l    #(78*256+48)*2,a1
  438.     movea.w    #(256-160)*2,a6
  439.     moveq    #100-1,d7
  440.  
  441. .yloop:    moveq    #80-1,d6
  442.  
  443. .xloop:    move.l    (a1)+,(a0)+
  444.     dbf    d6,.xloop
  445.  
  446.     adda.l    a6,a1
  447.     dbf    d7,.yloop
  448.     rts
  449.  
  450. ; No fucking clip yet!
  451. ; INPUT:
  452. ; d0.w=x (center)
  453. ; d1.w=y (center)
  454. Lenses.paintLens:
  455.     move.w    d0,d2
  456.     move.w    d1,d3
  457.  
  458.     movea.l    scr,a0
  459.     subi.w    #Lenses.RADIUS,d2
  460.     subi.w    #Lenses.RADIUS,d3
  461.     addi.w    #80,d2
  462.     addi.w    #50,d3
  463.     mulu.w    #160,d3
  464.     add.w    d2,d3
  465.     lea    (a0,d3.w*2),a0
  466.  
  467.     addi.w    #128,d0
  468.     addi.w    #128,d1
  469.     mulu.w    #256,d1
  470.     add.w    d0,d1
  471.     movea.l    Lenses.textureAdr,a1
  472.     lea    (a1,d1.l*2),a1
  473.  
  474.     movea.l    Lenses.offsetMapAdr,a2
  475.     movea.w    #(160-Lenses.DIAM)*2,a6
  476.     moveq    #Lenses.DIAM-1,d7
  477.  
  478. .yloop:    moveq    #Lenses.DIAM-1,d6
  479.  
  480. .xloop:    move.w    (a2)+,d0
  481.     move.w    (a1,d0.w*2),(a0)+
  482.     dbf    d6,.xloop
  483.  
  484.     adda.l    a6,a0
  485.     dbf    d7,.yloop
  486.     rts
  487.  
  488. Lenses.clearBlobBuffer:
  489.     movea.l    Lenses.blobAdr,a0
  490.     move.w    #160*100/16-1,d7
  491.     clr.l    d0
  492. .loop:
  493.     REPT    8
  494.     move.l    d0,(a0)+
  495.     ENDR
  496.     dbf    d7,.loop
  497.     rts
  498.  
  499. ; No fucking clip yet!
  500. ; INPUT:
  501. ; d0.w=x (center)
  502. ; d1.w=y (center)
  503. Lenses.addBlob:
  504.     move.w    d0,d2
  505.     move.w    d1,d3
  506.     addi.w    #80-Lenses.RADIUS,d2
  507.     addi.w    #50-Lenses.RADIUS,d3
  508.     mulu.w    #160,d3
  509.     add.w    d2,d3
  510.     addi.w    #80+Lenses.RADIUS,d0
  511.     addi.w    #50+Lenses.RADIUS-1,d1
  512.     mulu.w    #160,d1
  513.     add.w    d0,d1
  514.     movea.l    Lenses.blobAdr,a0
  515.     lea    (a0,d1.w*2),a1
  516.     lea    (a0,d3.w*2),a0
  517.     lea    Lenses.DIAM*2(a0),a3
  518.     lea    -Lenses.DIAM*2(a1),a4
  519.     movea.l    Lenses.heightMapAdr,a2
  520.     movea.w    #(160-Lenses.RADIUS)*2,a5
  521.     movea.w    #(160+Lenses.RADIUS)*2,a6
  522.     moveq    #Lenses.RADIUS*2,d1
  523.     moveq    #Lenses.RADIUS-1,d7
  524.  
  525.     IFNE    1
  526.  
  527. .yloop:
  528.     REPT    Lenses.RADIUS/2
  529.     move.l    (a2)+,d0
  530.     move.l    d0,d2
  531.     swap    d2
  532.     add.l    d0,(a0)+
  533.     add.l    d2,-(a1)
  534.     add.l    d0,(a4)+
  535.     add.l    d2,-(a3)
  536.     ENDR
  537.  
  538.     ELSE
  539.  
  540. .yloop:    moveq    #Lenses.RADIUS/2-1,d6
  541.  
  542. .xloop:    move.l    (a2)+,d0
  543.     move.l    d0,d2
  544.     swap    d2
  545.     add.l    d0,(a0)+
  546.     add.l    d2,-(a1)
  547.     add.l    d0,(a4)+
  548.     add.l    d2,-(a3)
  549.     dbf    d6,.xloop
  550.  
  551.     ENDC
  552.  
  553.     adda.l    a5,a0
  554.     suba.l    a5,a1
  555.     adda.l    a6,a3
  556.     suba.l    a6,a4
  557.     dbf    d7,.yloop
  558.     rts
  559.  
  560. Lenses.paintBlob:
  561.     movea.l    scr,a0
  562.     movea.l    Lenses.textureAdr,a1
  563.     adda.l    #(256*(128-50)+(128-80))*2,a1
  564.  
  565.     tst.w    Lenses.backMoving
  566.     beq.s    .traj_done
  567.     move.w    $04BC.w,d0
  568.     sub.w    Lenses.trajStart,d0
  569.     move.w    d0,d1
  570.     mulu.w    #7,d0
  571.     mulu.w    #3,d1
  572.     lsr.l    #2,d0
  573.     lsr.l    d1
  574.     Do_SinModulo    d0
  575.     Do_SinModulo    d1
  576.     lea    sine_tbl,a2
  577.     Get_Sin    a2,d0,d0
  578.     Get_Sin    a2,d1,d1
  579.     muls.w    #256-160,d0
  580.     muls.w    #256-100,d1
  581.     swap    d0
  582.     swap    d1
  583.     lsl.w    #8,d1
  584.     add.w    d0,d1
  585.     lea    (a1,d1.w*2),a1
  586. .traj_done:
  587.  
  588.     movea.l    Lenses.blobAdr,a2
  589.     movea.l    Lenses.divTableAdr,a3
  590.     movea.w    #(256-160)*2,a6
  591.     move.w    #1<<Lenses.BLOBSHIFT,d3
  592.     moveq    #+80,d5
  593.     moveq    #-50,d7
  594.     move.w    monitormode,d0
  595.     cmpi.w    #vga60,d0
  596.     beq.s    Lenses.paintBlobVga60
  597.     cmpi.w    #vga100,d0
  598.     beq.s    Lenses.paintBlobVga100
  599.     cmpi.w    #rgb50,d0
  600.     beq    Lenses.paintBlobRgb50
  601. ; Unknown monitormode..
  602. .end:    rts
  603.  
  604. Lenses.paintBlobVga100:
  605. .yloop:    moveq    #-80,d6
  606.  
  607. .xloop:    move.w    (a2)+,d2
  608.     cmp.w    d3,d2
  609.     bgt.s    .inside
  610.     move.w    (a1)+,(a0)+
  611.     addq.w    #1,d6
  612.     cmp.w    d5,d6
  613.     blt.s    .xloop
  614.     bra.s    .next_line
  615.  
  616. .inside:move.w    d2,d4
  617.     move.b    d6,d4
  618.     move.b    d7,d2
  619.     move.w    (a3,d2.w*2),d1
  620.     lsl.w    #8,d1
  621.     add.w    (a3,d4.w*2),d1
  622.     move.w    (a1,d1.w*2),(a0)+
  623.     addq    #2,a1
  624.     addq.w    #1,d6
  625.     cmp.w    d5,d6
  626.     blt.s    .xloop
  627.  
  628. .next_line:
  629.     adda.l    a6,a1
  630.     addq.w    #1,d7
  631.     cmpi.w    #+50,d7
  632.     blt.s    .yloop
  633.     rts
  634.  
  635. Lenses.paintBlobVga60:
  636.     movea.w    #160*2,a5
  637.     lea    160*2(a0),a4
  638.  
  639. .yloop:    moveq    #-80,d6
  640.  
  641. .xloop:    move.w    (a2)+,d2
  642.     cmp.w    d3,d2
  643.     bgt.s    .inside
  644.     move.w    (a1),(a0)+
  645.     move.w    (a1)+,(a4)+
  646.     addq.w    #1,d6
  647.     cmp.w    d5,d6
  648.     blt.s    .xloop
  649.     bra.s    .next_line
  650.  
  651. .inside:move.w    d2,d4
  652.     move.b    d6,d4
  653.     move.b    d7,d2
  654.     move.w    (a3,d2.w*2),d1
  655.     lsl.w    #8,d1
  656.     add.w    (a3,d4.w*2),d1
  657.     move.w    (a1,d1.w*2),(a0)+
  658.     move.w    (a1,d1.w*2),(a4)+
  659.     addq    #2,a1
  660.     addq.w    #1,d6
  661.     cmp.w    d5,d6
  662.     blt.s    .xloop
  663.  
  664. .next_line:
  665.     adda.l    a6,a1
  666.     adda.l    a5,a0
  667.     adda.l    a5,a4
  668.     addq.w    #1,d7
  669.     cmpi.w    #+50,d7
  670.     blt.s    .yloop
  671.     rts
  672.  
  673. Lenses.paintBlobRgb50:
  674. .yloop:    moveq    #-80,d6
  675.  
  676. .xloop:    move.w    (a2)+,d2
  677.     cmp.w    d3,d2
  678.     bgt.s    .inside
  679.     move.w    (a1),(a0)+
  680.     move.w    (a1)+,(a0)+
  681.     addq.w    #1,d6
  682.     cmp.w    d5,d6
  683.     blt.s    .xloop
  684.     bra.s    .next_line
  685.  
  686. .inside:move.w    d2,d4
  687.     move.b    d6,d4
  688.     move.b    d7,d2
  689.     move.w    (a3,d2.w*2),d1
  690.     lsl.w    #8,d1
  691.     add.w    (a3,d4.w*2),d1
  692.     move.l    (a1,d1.w*2),(a0)+
  693.     addq    #2,a1
  694.     addq.w    #1,d6
  695.     cmp.w    d5,d6
  696.     blt.s    .xloop
  697.  
  698. .next_line:
  699.     adda.l    a6,a1
  700.     addq.w    #1,d7
  701.     cmpi.w    #+50,d7
  702.     blt.s    .yloop
  703.     rts
  704.  
  705. Lenses.paintBlobTidy:
  706.     movea.l    scr,a0
  707.     movea.l    Lenses.textureAdr,a1
  708.     adda.l    #(256*128+128)*2,a1
  709.     movea.l    Lenses.blobAdr,a2
  710.     movea.w    #(256-160)*2,a6
  711.     move.w    #1<<Lenses.BLOBSHIFT,d3
  712.     moveq    #Lenses.BLOBSHIFT+1,d4
  713.     moveq    #+80,d5
  714.     moveq    #-50,d7
  715.  
  716. .yloop:    moveq    #-80,d6
  717.  
  718. .xloop:    move.w    (a2)+,d2
  719.     cmp.w    d3,d2
  720.     bgt.s    .inside
  721.     move.w    d6,d0
  722.     move.w    d7,d1
  723.     bra.s    .plot
  724. .inside:move.w    d6,d0
  725.     move.w    d7,d1
  726.     ext.l    d0
  727.     ext.l    d1
  728.     lsl.l    d4,d0
  729.     lsl.l    d4,d1
  730.     divs.w    d2,d0
  731.     divs.w    d2,d1
  732.     add.w    d6,d0
  733.     add.w    d7,d1
  734. .plot:    lsl.w    #8,d1
  735.     add.w    d0,d1
  736.     move.w    (a1,d1.w*2),(a0)+
  737.     addq.w    #1,d6
  738.     cmp.w    d5,d6
  739.     blt.s    .xloop
  740.  
  741.     addq.w    #1,d7
  742.     cmpi.w    #+50,d7
  743.     blt.s    .yloop
  744.     rts
  745.  
  746. ; y=denom, x=num
  747. Lenses.calcDivTable:
  748.     movea.l    Lenses.divTableAdr,a0
  749.     adda.w    #256*2,a0
  750.     moveq    #1,d7
  751.  
  752. .yloop:    move.b    d7,d1
  753.     lsl.w    #8,d1
  754.     clr.w    d6
  755.  
  756. .xloop:    clr.l    d0
  757.     move.w    d6,d0
  758.     ext.w    d0
  759.     swap    d0
  760.     divs.w    d1,d0
  761.     asr.w    #5,d0
  762.     move.w    d0,(a0)+
  763.     addq.b    #1,d6
  764.     bcc.s    .xloop
  765.  
  766.     addq.b    #1,d7
  767.     bcc.s    .yloop
  768.     rts
  769.  
  770. ;======= OBJECT RESERVES ===================================================
  771.  
  772.     BSS
  773.  
  774. Lenses.numLenses:
  775.     DS.W    1
  776. Lenses.backMoving:
  777.     DS.W    1
  778. Lenses.trajStart:
  779.     DS.W    1
  780.  
  781. Lenses.offsetMapAdr:
  782.     DS.L    1
  783. Lenses.heightMapAdr:
  784.     DS.L    1
  785. Lenses.hiTextureAdr:
  786.     DS.L    1
  787. Lenses.textureAdr:
  788.     DS.L    1
  789. Lenses.blobAdr:
  790.     DS.L    1
  791. Lenses.divTableAdr:
  792.     DS.L    1