home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / programmers / source / c2p4 / c2p4.a next >
Encoding:
Text File  |  1978-06-29  |  12.5 KB  |  527 lines

  1.         xdef    _c2p4
  2.  
  3. ; ---------------------------------------------------------------------
  4.  
  5. ; void __asm c2p4 (register __a2 UBYTE *fBUFFER,
  6. ;                  register __a3 UBYTE *fBUFFER_CMP,
  7. ;                  register __a4 PLANEPTR *planes,
  8. ;                  register __a5 struct Task *task,
  9. ;                  register __d0 ULONG signals,
  10. ;                  register __a6 struct GfxBase *GfxBase);
  11. ;
  12. ; 4-plane unpacked chunky to planar converter.
  13. ; Optimised for 68020/30 with fastmem.
  14. ;
  15. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 6 April 1994
  16. ; Based on James McCoull's 4-pass blitter algorithm.
  17. ;
  18. ; This code is public domain.
  19. ;
  20. ; Use chunky comparison buffer.  Return immediately if no diffs found.
  21. ; Perform first 2 passes (Fast->Chip) with the CPU (in 1 pass).
  22. ; Update chunky comparison buffer.
  23. ; Perform passes 3 & 4 with QBlit().
  24. ; Return immediately after launching blits.
  25. ; Signal task from CleanUp() on completion.
  26. ; Task should wait for signal before next call to c2p4().
  27. ;
  28. ; (Unimplemented speedup idea: Might be possible to signal task after pass 3,
  29. ; but will probably need another Wait() somewhere.)
  30. ;
  31. ; Approx timing (A4000/030, 320x200x4):
  32. ;    CPU pass max 18ms (then return)
  33. ;    Asynchronous blitter passes add 31ms
  34. ;
  35. ; Example usage:
  36. ;
  37. ;    /* clear fBUFFER, fBUFFER_CMP, and planes here */
  38. ;    if ((sigbit = AllocSignal(-1)) == -1)
  39. ;        die ("Can't allocate signal!\n");
  40. ;    safe = TRUE;
  41. ;    for (;;) {
  42. ;        ... /* render to fBUFFER here */
  43. ;        if (!safe) {
  44. ;            Wait (1<<sigbit);  // wait for previous c2p4 to finish
  45. ;            safe = TRUE;
  46. ;        }
  47. ;            c2p4 (fBUFFER, fBUFFER_CMP, &RASTPORT->BitMap->Planes[0],
  48. ;            FindTask(NULL), 1<<sigbit, GfxBase);
  49. ;        safe = FALSE;
  50. ;    }
  51. ;    if (!safe)
  52. ;        Wait (1<<sigbit);  // wait for last c2p4 to finish
  53. ;    FreeSignal(sigbit);
  54.  
  55. width        equ    256    ; must be a multiple of 32
  56. height        equ    128
  57. toplinestoskip    equ    10
  58.  
  59. plsiz         equ    width/8*height
  60. pixels        equ    width*height
  61. offset        equ    width/8*toplinestoskip
  62.  
  63. cleanup        equ    $40
  64.  
  65. ;        section chunks,code
  66.  
  67. _c2p4:        movem.l    d2-d7/a2-a6,-(sp)
  68.  
  69. ; save arguments
  70.  
  71.         move.l    #mybltnode,a0
  72.         move.l    a2,(chunky-mybltnode,a0)
  73.         move.l    a4,(planes-mybltnode,a0)
  74.         move.l    a5,(task-mybltnode,a0)
  75.         move.l    d0,(signals-mybltnode,a0)
  76.         move.l    a6,(gfxbase-mybltnode,a0)
  77.  
  78. ;-------------------------------------------------
  79. ;original chunky data
  80. ;0        ........a3a2a1a0 ........b3b2b1b0
  81. ;2        ........c3c2c1c0 ........d3d2d1d0
  82. ;4        ........e3e2e1e0 ........f3f2f1f0
  83. ;6        ........g3g2g1g0 ........h3h2h1h0
  84. ;8        ........i3i2i1i0 ........j3j2j1j0
  85. ;10        ........k3k2k1k0 ........l3l2l1l0
  86. ;12        ........m3m2m1m0 ........n3n2n1n0
  87. ;14        ........o3o2o1o0 ........p3p2p1p0
  88. ;16        ........q3q2q1q0 ........r3r2r1r0
  89. ;18        ........s3s2s1s0 ........t3t2t1t0
  90. ;20        ........u3u2u1u0 ........v3v2v1v0
  91. ;22        ........w3w2w1w0 ........x3x2x1x0
  92. ;24        ........y3y2y1y0 ........z3z2z1z0
  93. ;26        ........A3A2A1A0 ........B3B2B1B0
  94. ;28        ........C3C2C1C0 ........D3D2D1D0
  95. ;30        ........E3E2E1E0 ........F3F2F1F0
  96. ;-------------------------------------------------
  97.  
  98.         move.l    #buff2,a4    ; a4 -> buff2 (in Chip)
  99.         move.l    #$00ff00ff,d7    ; constant
  100.         move.w    #pixels/32,d6    ; loop counter
  101.  
  102.         bra.b    end_pass1loop
  103.  
  104.         cnop    0,4
  105.  
  106. ; main loop (starts here) processes 32 chunky pixels at a time
  107. ; compare next 32 pixels with compare page, looking for differences
  108.  
  109. initpass1loop:    cmpm.l    (a2)+,(a3)+
  110.         bne.w    fix1
  111.         cmpm.l    (a2)+,(a3)+
  112.         bne.w    fix2
  113.         cmpm.l    (a2)+,(a3)+
  114.         bne.b    fix3
  115.         cmpm.l    (a2)+,(a3)+
  116.         bne.b    fix4
  117.         cmpm.l    (a2)+,(a3)+
  118.         bne.b    fix5
  119.         cmpm.l    (a2)+,(a3)+
  120.         bne.b    fix6
  121.         cmpm.l    (a2)+,(a3)+
  122.         bne.b    fix7
  123.         cmpm.l    (a2)+,(a3)+
  124.         bne.b    fix8
  125.  
  126.         addq.l    #8,a4        ; skip 8 bytes in output
  127.  
  128. end_pass1loop:    dbra    d6,initpass1loop
  129.  
  130. ; If we get to here then no difference was found.
  131. ; Signal the task and return.
  132.  
  133.         move.l    (task-mybltnode,a0),a1
  134.         move.l    (signals-mybltnode,a0),d0
  135.         move.l    (4).w,a6
  136.         jsr    (_LVOSignal,a6)
  137.  
  138.         movem.l    (sp)+,d2-d7/a2-a6
  139.         rts
  140.  
  141. ; This becomes the main loop after the first difference is found
  142.  
  143. pass1loop:    cmpm.l    (a2)+,(a3)+
  144.         bne.b    fix1
  145.         cmpm.l    (a2)+,(a3)+
  146.         bne.b    fix2
  147.         cmpm.l    (a2)+,(a3)+
  148.         bne.b    fix3
  149.         cmpm.l    (a2)+,(a3)+
  150.         bne.b    fix4
  151.         cmpm.l    (a2)+,(a3)+
  152.         bne.b    fix5
  153.         cmpm.l    (a2)+,(a3)+
  154.         bne.b    fix6
  155.         cmpm.l    (a2)+,(a3)+
  156.         bne.b    fix7
  157.         cmpm.l    (a2)+,(a3)+
  158.         bne.b    fix8
  159.  
  160.         addq.l    #8,a4        ; skip 8 bytes in output
  161.  
  162.         dbra    d6,pass1loop
  163.  
  164.         bra.w    done
  165.  
  166. ; difference found, restore a2 and a3
  167.  
  168. fix8:        subq.l    #4,a2
  169.         subq.l    #4,a3
  170. fix7:        sub.w    #28,a2
  171.         sub.w    #28,a3
  172.         bra.b    go_c2p
  173.  
  174. fix6:        subq.l    #4,a2
  175.         subq.l    #4,a3
  176. fix5:        sub.w    #20,a2
  177.         sub.w    #20,a3
  178.         bra.b    go_c2p
  179.  
  180. fix4:        subq.l    #4,a2
  181.         subq.l    #4,a3
  182. fix3:        sub.w    #12,a2
  183.         sub.w    #12,a3
  184.         bra.b    go_c2p
  185.  
  186. fix2:        subq.l    #4,a2
  187.         subq.l    #4,a3
  188. fix1:        subq.l    #4,a2
  189.         subq.l    #4,a3
  190.  
  191. ; convert 32 pixels (passes 1 and 2 combined)
  192.  
  193. go_c2p:        movem.l    (a2)+,d0-d3/a0/a1/a5/a6    ; ABCD EFGH IJKL MNOP QRST UVWX YZ01 2345
  194.  
  195.         movem.l    d0-d3/a0/a1/a5/a6,(a3)    ; update compare buffer
  196.         adda.w    #32,a3
  197.  
  198.         lsl.l    #4,d0        ; A.B.C.D.
  199.         move.l    d0,d4        ; A.B.C.D.
  200.         and.l    d7,d4        ; ..B...D.
  201.         eor.l    d4,d0        ; A...C...
  202.  
  203.         move.l    d1,d5        ; .E.F.G.H
  204.         and.l    d7,d5        ; ...F...H
  205.         eor.l    d5,d1        ; .E...G..
  206.  
  207.         or.l    d1,d0        ; AE..CG..
  208.         or.l    d5,d4        ; ..BF..DH
  209.  
  210.         move.l    d2,d1        ; .I.J.K.L
  211.         and.l    d7,d1        ; ...J...L
  212.  
  213.         move.l    d3,d5        ; .M.N.O.P
  214.         and.l    d7,d5        ; ...N...P
  215.  
  216.         lsl.l    #4,d4        ; .BF..DH.
  217.         or.l    d1,d4        ; .BFJ.DHL
  218.         lsl.l    #4,d4        ; BFJ.DHL.
  219.         or.l    d5,d4        ; BFJNDHLP
  220.  
  221.         move.l    d4,(pixels/4,a4)
  222.  
  223.         eor.l    d5,d3        ; .M...O..
  224.         lsr.l    #4,d3        ; ..M...O.
  225.         eor.l    d1,d2        ; .I...K..
  226.         or.l    d3,d2        ; .IM..KO.
  227.         lsr.l    #4,d2        ; ..IM..KO
  228.         or.l    d2,d0        ; AEIMCGKO
  229.  
  230.         move.l    a6,d3
  231.         move.l    a5,d2
  232.         move.l    a1,d1
  233.  
  234.         move.l    d0,(a4)+
  235.  
  236.         move.l    a0,d0
  237.  
  238.         lsl.l    #4,d0        ; Q.R.S.T.
  239.         move.l    d0,d4        ; Q.R.S.T.
  240.         and.l    d7,d4        ; ..R...T.
  241.         eor.l    d4,d0        ; Q...S...
  242.  
  243.         move.l    d1,d5        ; .U.V.W.X
  244.         and.l    d7,d5        ; ...V...X
  245.         eor.l    d5,d1        ; .U...W..
  246.  
  247.         or.l    d1,d0        ; QU..SW..
  248.         or.l    d5,d4        ; ..RV..TX
  249.  
  250.         move.l    d2,d1        ; .Y.Z.0.1
  251.         and.l    d7,d1        ; ...Z...1
  252.  
  253.         move.l    d3,d5        ; .2.3.4.5
  254.         and.l    d7,d5        ; ...3...5
  255.  
  256.         lsl.l    #4,d4        ; .RV..TX.
  257.         or.l    d1,d4        ; .RVZ.TX1
  258.         lsl.l    #4,d4        ; RVZ.TX1.
  259.         or.l    d5,d4        ; RVZ3TX15
  260.  
  261.         move.l    d4,(pixels/4,a4)
  262.  
  263.         eor.l    d5,d3        ; .2...4..
  264.         lsr.l    #4,d3        ; ..2...4.
  265.         eor.l    d1,d2        ; .Y...0..
  266.         or.l    d3,d2        ; .Y2..04.
  267.         lsr.l    #4,d2        ; ..Y2..04
  268.         or.l    d2,d0        ; QUY2SW04
  269.  
  270.         move.l    d0,(a4)+
  271.  
  272.         dbra    d6,pass1loop
  273.  
  274. ; start the blitter in the background for passes 3 & 4
  275.  
  276. done:        move.l    #mybltnode,a1
  277.         move.l    (gfxbase-mybltnode,a1),a6
  278.         jsr    (_LVOQBlit,a6)
  279.  
  280.         movem.l    (sp)+,d2-d7/a2-a6
  281.         rts
  282.  
  283. ;-----------------------------------------------------------------------------
  284. ; QBlit functions (called asynchronously)
  285.  
  286. ;-------------------------------------------------
  287. ;after pass 2
  288. ;0        a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  289. ;2        c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  290. ;4        q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  291. ;6        s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  292. ;
  293. ;pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  294. ;pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  295. ;pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  296. ;pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  297. ;-------------------------------------------------
  298.  
  299. ;Pass 3, subpass 1
  300. ;    apt        buff2
  301. ;    bpt        buff2+2
  302. ;    dpt        buff3
  303. ;    amod        2
  304. ;    bmod        2
  305. ;    dmod        0
  306. ;    cdat        $cccc
  307. ;    sizv        pixels/8
  308. ;    sizh        1 word
  309. ;    con        D=AC+(B>>2)~C, ascending
  310.  
  311. blit31:        moveq    #-1,d0
  312.         move.l    d0,(bltafwm,a0)
  313.         move.w    #0,(bltdmod,a0)
  314.         move.l    #buff2,(bltapt,a0)
  315.         move.l    #buff2+2,(bltbpt,a0)
  316.         move.l    #buff3,(bltdpt,a0)
  317.         move.w    #2,(bltamod,a0)
  318.         move.w    #2,(bltbmod,a0)
  319.         move.w    #pixels/8,(bltsizv,a0)
  320.         move.w    #$cccc,(bltcdat,a0)
  321.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  322.         move.w    #1,(bltsizh,a0)        ;do blit
  323.         lea    (blit32,pc),a0
  324.         move.l    a0,(qblitfunc-mybltnode,a1)
  325.         rts
  326.  
  327. ;Pass 3, subpass 2
  328. ;    apt        buff2+pixels/2-2-2
  329. ;    bpt        buff2+pixels/2-2
  330. ;    dpt        buff3+pixels/2-2
  331. ;    amod        2
  332. ;    bmod        2
  333. ;    dmod        0
  334. ;    cdat        $cccc
  335. ;    sizv        pixels/8
  336. ;    sizh        1 word
  337. ;    con        D=(A<<2)C+B~C, descending
  338.  
  339. blit32:        move.l    #buff2+pixels/2-2-2,(bltapt,a0)
  340.         move.l    #buff2+pixels/2-2,(bltbpt,a0)
  341.         move.l    #buff3+pixels/2-2,(bltdpt,a0)
  342.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  343.         move.w    #1,(bltsizh,a0)        ;do blit
  344.         lea    (blit43,pc),a0
  345.         move.l    a0,(qblitfunc-mybltnode,a1)
  346.         rts
  347.  
  348. ;-------------------------------------------------
  349. ;after pass 3
  350. ;0        a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  351. ;2        q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  352. ;
  353. ;pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  354. ;pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  355. ;
  356. ;pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  357. ;pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  358. ;
  359. ;3*pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  360. ;3*pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  361. ;-------------------------------------------------
  362.  
  363. ;Pass 4, plane 3
  364. ;    apt        buff3+0*pixels/8
  365. ;    bpt        buff3+1*pixels/8
  366. ;    dpt        Planes+3*plsiz+offset
  367. ;    amod        0
  368. ;    bmod        0
  369. ;    dmod        0
  370. ;    cdat        $aaaa
  371. ;    sizv        pixels/16
  372. ;    sizh        1 word
  373. ;    con        D=AC+(B>>1)~C, ascending
  374.  
  375. blit43:        movem.l    a2,-(sp)
  376.         move.l    #buff3+0*pixels/8,(bltapt,a0)
  377.         move.l    #buff3+1*pixels/8,(bltbpt,a0)
  378.         move.l    (planes-mybltnode,a1),a2
  379.         move.l    (3*4,a2),a2
  380.         add.w    #offset,a2
  381.         move.l    a2,(bltdpt,a0)        ; Plane3
  382.         move.w    #0,(bltamod,a0)
  383.         move.w    #0,(bltbmod,a0)
  384.         move.w    #pixels/16,(bltsizv,a0)    ;/8???
  385.         move.w    #$aaaa,(bltcdat,a0)
  386.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  387.         move.w    #1,(bltsizh,a0)        ;plane 3
  388.         lea    (blit41,pc),a0
  389.         move.l    a0,(qblitfunc-mybltnode,a1)
  390.         movem.l    (sp)+,a2
  391.         rts
  392.  
  393. ;-------------------------------------------------
  394. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  395. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  396. ;-------------------------------------------------
  397.  
  398. ;Pass 4, plane 1
  399. ;    apt        buff3+2*pixels/8
  400. ;    bpt        buff3+3*pixels/8
  401. ;    dpt        Planes+1*plsiz+offset
  402. ;    amod        0
  403. ;    bmod        0
  404. ;    dmod        0
  405. ;    cdat        $aaaa
  406. ;    sizv        pixels/16
  407. ;    sizh        1 word
  408. ;    con        D=AC+(B>>1)~C, ascending
  409.  
  410. blit41:        movem.l    a2,-(sp)
  411.         move.l    #buff3+2*pixels/8,(bltapt,a0)
  412.         move.l    #buff3+3*pixels/8,(bltbpt,a0)
  413.         move.l    (planes-mybltnode,a1),a2
  414.         move.l    (1*4,a2),a2
  415.         add.w    #offset,a2
  416.         move.l    a2,(bltdpt,a0)        ; Plane1
  417.         move.w    #1,(bltsizh,a0)        ;plane 1
  418.         lea    (blit42,pc),a0
  419.         move.l    a0,(qblitfunc-mybltnode,a1)
  420.         movem.l    (sp)+,a2
  421.         rts
  422.  
  423. ;-------------------------------------------------
  424. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  425. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  426. ;-------------------------------------------------
  427.  
  428. ;Pass 4, plane 2
  429. ;    apt        buff3+1*pixels/8-2
  430. ;    bpt        buff3+2*pixels/8-2
  431. ;    dpt        Planes+3*plsiz-2+offset
  432. ;    amod        0
  433. ;    bmod        0
  434. ;    dmod        0
  435. ;    cdat        $aaaa
  436. ;    sizv        pixels/16
  437. ;    sizh        1 word
  438. ;    con        D=(A<<1)C+B~C, descending
  439.  
  440. blit42:        movem.l    a2,-(sp)
  441.         move.l    #buff3+1*pixels/8-2,(bltapt,a0)
  442.         move.l    #buff3+2*pixels/8-2,(bltbpt,a0)
  443.         move.l    (planes-mybltnode,a1),a2
  444.         move.l    (2*4,a2),d0
  445.         add.l    #plsiz-2+offset,d0
  446.         move.l    d0,(bltdpt,a0)        ; Plane2+plsiz-2
  447.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  448.         move.w    #1,(bltsizh,a0)        ;plane 2
  449.         lea    (blit40,pc),a0
  450.         move.l    a0,(qblitfunc-mybltnode,a1)
  451.         movem.l    (sp)+,a2
  452.         rts
  453.  
  454. ;-------------------------------------------------
  455. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  456. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  457. ;-------------------------------------------------
  458.  
  459. ;Pass 4, plane 0
  460. ;    apt        buff3+3*pixels/8-2
  461. ;    bpt        buff3+4*pixels/8-2
  462. ;    dpt        Planes+1*plsiz-2+offset
  463. ;    amod        0
  464. ;    bmod        0
  465. ;    dmod        0
  466. ;    cdat        $aaaa
  467. ;    sizv        pixels/16
  468. ;    sizh        1 word
  469. ;    con        D=(A<<1)C+B~C, descending
  470.  
  471. blit40:        movem.l    a2,-(sp)
  472.         move.l    #buff3+3*pixels/8-2,(bltapt,a0)
  473.         move.l    #buff3+4*pixels/8-2,(bltbpt,a0)
  474.         move.l    (planes-mybltnode,a1),a2
  475.         move.l    (a2),d0
  476.         add.l    #plsiz-2+offset,d0
  477.         move.l    d0,(bltdpt,a0)        ; Plane0+plsiz-2
  478.         move.w    #1,(bltsizh,a0)        ;plane 0
  479.         lea    (blit31,pc),a0
  480.         move.l    a0,(qblitfunc-mybltnode,a1)
  481.         moveq    #0,d0            ; set Z flag
  482.         movem.l    (sp)+,a2
  483.         rts
  484.  
  485. ;-------------------------------------------------
  486. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  487. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  488. ;-------------------------------------------------
  489.  
  490. qblitcleanup:    movem.l    a2/a6,-(sp)
  491.         move.l    #mybltnode,a2
  492.         move.l    (task-mybltnode,a2),a1    ; signal the task
  493.         move.l    (signals-mybltnode,a2),d0
  494.         move.l    (4).w,a6
  495.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  496.         movem.l    (sp)+,a2/a6
  497.         rts
  498.  
  499. ;-----------------------------------------------------------------------------
  500.         section    data,data
  501.  
  502.         quad
  503. mybltnode:    dc.l    0        ; next bltnode
  504. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  505.         dc.b    cleanup        ; stat
  506.         dc.b    0        ; filler
  507.         dc.w    0        ; blitsize
  508.         dc.w    0        ; beamsync
  509.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  510.  
  511.         quad
  512. chunky:        dc.l    0        ; ptr to original chunky data
  513. planes:        dc.l    0        ; ptr to list of output plane ptrs
  514. task:        dc.l    0        ; ptr to this task
  515. signals:    dc.l    0        ; signals to Signal() at cleanup
  516. gfxbase:    dc.l    0        ; GfxBase
  517.  
  518. ;-----------------------------------------------------------------------------
  519.         section    segment1,bss,chip        ; MUST BE IN CHIP !!!!!
  520.  
  521. buff2        ds.b pixels/2    ;Intermediate buffer 2
  522. buff3        ds.b pixels/2    ;Intermediate buffer 3
  523.  
  524. ;-----------------------------------------------------------------------------
  525.  
  526.         end
  527.