home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / ZWATER2B.ASM < prev    next >
Assembly Source File  |  2002-12-16  |  7KB  |  345 lines

  1. ; DSP matrix-water + voxel routine, by earx 2001/2002.
  2. ; Accuracy of 'crosshair' filter is high enough for this voxel.
  3. ; Now uses prerendering of column, to parallelise.
  4. ; Correct clipping.
  5.  
  6. HSR:        =    $FFE9
  7. HTX:        =    $FFEB
  8.  
  9. ; basin dimensions: be sure not to make them too big!
  10. ; This might overflow the DSP RAM!
  11. WIDTH:        =    150
  12. HEIGHT:        =    78
  13. TOTALWIDTH:    =    WIDTH+1
  14. TOTALHEIGHT:    =    HEIGHT+1
  15. BASINSIZE:    =    TOTALWIDTH*TOTALHEIGHT
  16.  
  17. get:    MACRO
  18.     jclr    #0,x:<<HSR,*
  19.     movep    x:<<HTX,\1
  20.     ENDM
  21.  
  22. send:    MACRO
  23.     jclr    #1,x:<<HSR,*
  24.     movep    \1,x:<<HTX
  25.     ENDM
  26.  
  27.     ORG    P:$0000
  28.     jmp    <start
  29.  
  30.     ORG    P:$0040
  31. start:    movec    #$FFFF,m0
  32.     movec    #BASINSIZE-1,m3                    ; Use modulo on bottom pointer.
  33.     movec    m0,m1
  34.     movec    m0,m2
  35.     movec    m0,m4
  36.     movec    m0,m6
  37.     jsr    <clearBuffers
  38.     jsr    <receivePal
  39.  
  40. _loop:    jsr    <updateX
  41.     jsr    <dropOnX
  42.     jsr    <sendXVoxel
  43.  
  44.     jsr    <updateY
  45.     jsr    <dropOnY
  46.     jsr    <sendYVoxel
  47.  
  48.     jmp    <_loop
  49.  
  50. clearBuffers:
  51.     move            #>BASINSIZE,x0
  52.     clr    a        #<0,r0
  53.     do    x0,<_end_loop
  54. _loop:    move            a,l:(r0)+
  55. _end_loop:
  56.     rts
  57.  
  58. sendYVoxel:
  59.     move            #>TOTALWIDTH*HEIGHT,r0
  60.     move            #<TOTALWIDTH,n2
  61.     move            #>pal+TOTALHEIGHT,r5
  62.     move            #>100,y0            ; y0=max y
  63.     move            #<$10,x1            ; x1=scalar (anti-noise!)
  64.  
  65.     do    #WIDTH,_columnloop
  66.  
  67. ; We render the column to dsp mem..
  68.     move            #columnTable,r6
  69.     move            r0,r2                ; b=top=0
  70.     move            #<1,r1                ; r1=depth=0
  71.     clr    a                y:(r2)-n2,x0    ; x0=1st raw height
  72.     clr    b        r1,a
  73.  
  74.     do    #HEIGHT,_zloop
  75.     macr    x1,x0,a        (r1)+                ; a=height, y1=depth
  76.     cmp    y0,a        r1,y1                ; Test if height is beyond screen, r1=depth+1
  77.     jlt    <_go_on
  78.     enddo
  79.     move            y0,a
  80. _go_on:    sub    b,a                        ; a=segheight
  81.     jle    <_next
  82.     add    a,b        a,n1
  83.     move            x0,a                ; b=new top, a=raw height
  84.     sub    y1,a                        ; a=shade=raw height - depth, n1=segheight
  85.     asr    a
  86.     asr    a
  87.     rep    n1                        ; Render #segheight pixels.
  88.     move            a,x:(r6)+
  89. _next:    tfr    y1,a                y:(r2)-n2,x0    ; a=depth+1, x0=next raw height
  90. _zloop:    
  91.  
  92. ; We send the column to host.
  93.     move            #columnTable,n6
  94.     move            #columnTable,r4
  95.     move            (r6)-n6                ; r6=columnheight
  96.     send    r6                        ; Send columnheight.
  97.     do    r6,_send_loop
  98.     move            x:(r4)+,n5            ; n5=shade
  99.     send    y:(r5+n5)                    ; Send pixel.
  100. _send_loop:
  101.  
  102.     move            (r0)+                ; Next column..
  103. _columnloop:
  104.  
  105.     rts
  106.  
  107. sendXVoxel:
  108.     move            #>TOTALWIDTH*HEIGHT,r0
  109.     move            #<TOTALWIDTH,n2
  110.     move            #>pal+TOTALHEIGHT,r5
  111.     move            #>100,y0            ; y0=max y
  112.     move            #<$10,x1            ; x1=scalar (anti-noise!)
  113.  
  114.     do    #WIDTH,_columnloop
  115.     move            #columnTable,r6
  116.     move            r0,r2                ; b=top=0
  117.     move            #<1,r1                ; r1=depth=0
  118.     move            x:(r2)-n2,x0            ; x0=1st raw height
  119.     clr    b        r1,a
  120.  
  121.     do    #HEIGHT,_zloop
  122.     macr    x1,x0,a        (r1)+                ; a=height, y1=depth
  123.     cmp    y0,a        r1,y1                ; Test if height is beyond screen, r1=depth+1
  124.     jlt    <_go_on
  125.     enddo
  126.     move            y0,a
  127. _go_on:    sub    b,a                        ; a=segheight
  128.     jle    <_next
  129.     move            a,n1
  130.     add    a,b        x0,a                ; b=new top, a=raw height
  131.     sub    y1,a                        ; a=shade=raw height - depth, n1=segheight
  132.     asr    a
  133.     asr    a
  134.     rep    n1
  135.     move            a,x:(r6)+
  136. _next:    tfr    y1,a        x:(r2)-n2,x0            ; a=depth+1, x0=next raw height
  137. _zloop:    
  138.  
  139. ; We send the column to host.
  140.     move            #columnTable,n6
  141.     move            #columnTable,r4
  142.     move            (r6)-n6                ; r6=columnheight
  143.     send    r6                        ; Send columnheight.
  144.     do    r6,_send_loop
  145.     move            x:(r4)+,n5            ; n5=shade
  146.     send    y:(r5+n5)                    ; Send pixel.
  147. _send_loop:
  148.  
  149.     move            (r0)+                ; Next column..
  150. _columnloop:
  151.     rts
  152.  
  153. updateX:move            #<0,r0                ;top
  154.     move            #<ybuf-1,r1            ;left
  155.     move            #<ybuf+1,r2            ;right
  156.     move            #>ybuf+TOTALWIDTH,r3        ;bottom
  157.     move            #<xbuf,r4            ;current
  158.     move            #<$40,x1
  159.     move            #<$7E,y1
  160.  
  161.     do    #<HEIGHT,_yloop
  162.     move                    y:(r0)+,b    ; get top
  163.     move                    y:(r1)+,y0    ; get left
  164.     add    y0,b                y:(r3)+,y0
  165.     add    y0,b                y:(r2)+,y0
  166.  
  167.     do    #<WIDTH,_xloop
  168.     add    y0,b        x:(r4),a
  169.     move            b,x0        y:(r0)+,b
  170.     mac    -x1,x0,a            y:(r1)+,y0
  171.     add    y0,b        a,x0        y:(r3)+,y0
  172.     mpy    -y1,x0,a
  173.     add    y0,b        a,x:(r4)+    y:(r2)+,y0
  174. _xloop:
  175.  
  176.     move            (r4)+
  177. _yloop:
  178.     rts
  179.  
  180. updateY:move            #<0,r0                ;top
  181.     move            #<xbuf-1,r1            ;left
  182.     move            #<xbuf+1,r2            ;right
  183.     move            #>xbuf+TOTALWIDTH,r3        ;bottom
  184.     move            #<ybuf,r4            ;current
  185.     move            #<$40,x1
  186.     move            #<$7E,y1
  187.  
  188.     do    #<HEIGHT,_yloop
  189.     move            x:(r0)+,b            ; get top
  190.     move            x:(r1)+,x0            ; get left
  191.     add    x0,b        x:(r3)+,x0
  192.     add    x0,b        x:(r2)+,x0
  193.  
  194.     do    #<WIDTH,_xloop
  195.     add    x0,b                y:(r4),a
  196.     move            x:(r0)+,b    b,y0
  197.     mac    -x1,y0,a    x:(r1)+,x0
  198.     add    x0,b        x:(r3)+,x0    a,y0
  199.     mpy    -y1,y0,a
  200.     add    x0,b        x:(r2)+,x0    a,y:(r4)+
  201. _xloop:
  202.  
  203.     move            (r4)+
  204. _yloop:
  205.     rts
  206.  
  207. dropOnX:get    a
  208.     tst    a        #<xbuf,r1
  209.     jeq    <_end
  210.     jmi    <_get_block
  211.     move            a,n0
  212.     do    n0,<_loop
  213.  
  214.     get    n1
  215.     get    x:(r1+n1)
  216. _loop:    rts
  217.  
  218. ; Gets (in sequential order): x, y, width, height, amp, blockdata.
  219. _get_block:
  220.     get    x0                        ; x0=lx
  221.     get    y0                        ; y0=ty
  222.     move            #<xbuf,r0
  223.     move            #>TOTALWIDTH,x1
  224.     mpy    x1,y0,a        #>HTX,r1
  225.     asr    a                        ; a0=ty*TOTALWIDTH
  226.     move            a0,a                ; a=ty*TOTALWIDTH
  227.     add    x0,a                        ; a=ty*TOTALWIDTH+lx=offset
  228.     move            a,n0                ; n0=offset
  229.     move            x1,a                ; a=TOTALWIDTH
  230.     get    x1                        ; x1=width
  231.     get    y1                        ; y1=height
  232.     get    y0                        ; y0=amp
  233.     move            (r0)+n0                ; a=TOTALWIDTH-width=offset to next line, r0=start in buffer
  234.     move            r0,r2
  235.     move            #>TOTALWIDTH,n2            ; n2=offset to next line
  236.  
  237.     do    y1,_yloop
  238.  
  239.     clr    b                        ; b=pixelcount=0
  240.  
  241. _block_loop:
  242.     jclr    #0,x:<<HSR,*
  243.     move            x:(r1),y1
  244.     move            y1,n0
  245.     jset    #15,y1,_masked
  246. ; Receive some void..
  247.     move            (r0)+n0
  248.     jmp    <_next
  249. ; Receive some pixels..
  250. _masked:bclr    #15,y1
  251.  
  252.     do    y1,_pixel_loop
  253.     jclr    #0,x:<<HSR,*
  254.     move            x:(r1),x0
  255.     mpy    x0,y0,a
  256.     move            a,x:(r0)+
  257. _pixel_loop:
  258.  
  259. _next:    add    y1,b
  260.     cmp    x1,b
  261.     jlt    <_block_loop
  262.  
  263.     move            (r2)+n2
  264.     move            r2,r0
  265. _yloop:
  266.  
  267. _end:    rts
  268.  
  269. dropOnY:get    a
  270.     tst    a        #<ybuf,r1
  271.     jeq    <_end
  272.     jmi    <_get_block
  273.     move            a,n0
  274.     do    n0,<_loop
  275.  
  276.     get    n1
  277.     get    y:(r1+n1)
  278. _loop:    rts
  279.  
  280. ; Gets (in sequential order): x, y, width, height, amp, blockdata.
  281. _get_block:
  282.     get    x0                        ; x0=lx
  283.     get    y0                        ; y0=ty
  284.     move            #<xbuf,r0
  285.     move            #>TOTALWIDTH,x1
  286.     mpy    x1,y0,a        #>HTX,r1
  287.     asr    a                        ; a0=ty*TOTALWIDTH
  288.     move            a0,a                ; a=ty*TOTALWIDTH
  289.     add    x0,a                        ; a=ty*TOTALWIDTH+lx=offset
  290.     move            a,n0                ; n0=offset
  291.     get    x1                        ; x1=width
  292.     get    y1                        ; y1=height
  293.     get    y0                        ; y0=amp
  294.     move            (r0)+n0                ; a=TOTALWIDTH-width=offset to next line, r0=start in buffer
  295.     move            r0,r2
  296.     move            #>TOTALWIDTH,n2            ; n2=offset to next line
  297.  
  298.     do    y1,_yloop
  299.  
  300.     clr    b                        ; b=pixelcount=0
  301.  
  302. _block_loop:
  303.     jclr    #0,x:<<HSR,*
  304.     move            x:(r1),y1
  305.     move            y1,n0
  306.     jset    #15,y1,_masked
  307. ; Receive some void..
  308.     move            (r0)+n0
  309.     jmp    <_next
  310. ; Receive some pixels..
  311. _masked:bclr    #15,y1
  312.  
  313.     do    y1,_pixel_loop
  314.     jclr    #0,x:<<HSR,*
  315.     move            x:(r1),x0
  316.     mpy    x0,y0,a
  317.     move                    a,y:(r0)+
  318. _pixel_loop:
  319.  
  320. _next:    add    y1,b
  321.     cmp    x1,b
  322.     jlt    <_block_loop
  323.  
  324.     move            (r2)+n2
  325.     move            r2,r0
  326. _yloop:
  327.  
  328. _end:    rts
  329.  
  330. receivePal:
  331.     move            #pal,r0
  332.     do    #256,_loop
  333.     get    y:(r0)+
  334. _loop:    rts
  335.  
  336.     ORG    X:$0000
  337.     DS    TOTALWIDTH
  338. xbuf:    DS    TOTALWIDTH*HEIGHT
  339. columnTable:
  340.     DS    100
  341.  
  342.     ORG    Y:$0000
  343.     DS    TOTALWIDTH
  344. ybuf:    DS    TOTALWIDTH*HEIGHT
  345. pal:    DS    256