home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / emulation / frodo / src / c2p4.asm < prev    next >
Assembly Source File  |  1995-10-18  |  15KB  |  641 lines

  1.         XDEF    _c2p4
  2.         XDEF    _Initc2p4
  3.         XDEF    _Exitc2p4
  4.  
  5. ; ---------------------------------------------------------------------
  6. ; void c2p4 (UBYTE *fBUFFER,
  7. ;            UBYTE *fBUFFER_CMP,
  8. ;            PLANEPTR *planes,
  9. ;            struct Task *task,
  10. ;            ULONG signals);
  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);
  49. ;        safe = FALSE;
  50. ;    }
  51. ;    if (!safe)
  52. ;        Wait (1<<sigbit);  // wait for last c2p4 to finish
  53. ;    FreeSignal(sigbit);
  54. ;
  55. ; <20.Jan.95: Angepaßt für den Frodo C64-Emulator und an OCS
  56. ;             von Christian Bauer>
  57.  
  58.  
  59. width        equ    $180    ; must be a multiple of 32
  60. height        equ    $110
  61. toplinestoskip    equ    0
  62.  
  63. plsiz         equ    (width/8)*height
  64. pixels        equ    width*height
  65. offset        equ    (width/8)*toplinestoskip
  66.  
  67. cleanup        equ    $40
  68.  
  69.         INCLUDE    "exec/types.i"
  70.         INCLUDE    "exec/macros.i"
  71.         INCLUDE    "exec/memory.i"
  72.         INCLUDE    "graphics/gfxbase.i"
  73.         INCLUDE    "hardware/custom.i"
  74.  
  75.         XREF    _SysBase
  76.         XREF    _GfxBase
  77.  
  78.         SECTION    "text",CODE
  79.  
  80. ; Installierte Chips ermitteln (OCS/ECS) und buff2 belegen
  81. ; RÜckgabe: d0#0: OK
  82. _Initc2p4    move.l    _GfxBase,a0
  83.         btst    #GFXB_BIG_BLITS,gb_ChipRevBits0(a0)
  84.         bne    1$
  85.  
  86.         move.l    #blit43,qblitfunc
  87.         move.l    #blit43,initblitfunc
  88.         move.w    #-1,wehaveocs
  89.  
  90.         move.l    a6,-(sp)
  91.         move.l    _SysBase,a6
  92.         move.l    #pixels/2,d0
  93.         move.l    #MEMF_ANY,d1
  94.         JSRLIB    AllocVec
  95.         move.l    d0,buff2ptr
  96.         move.l    (sp)+,a6
  97.         rts
  98.  
  99. 1$        move.l    #blit31,qblitfunc
  100.         move.l    #blit31,initblitfunc
  101.         clr.w    wehaveocs
  102.  
  103.         move.l    a6,-(sp)
  104.         move.l    _SysBase,a6
  105.         move.l    #pixels/2,d0
  106.         move.l    #MEMF_CHIP,d1
  107.         JSRLIB    AllocVec
  108.         move.l    d0,buff2ptr
  109.         move.l    (sp)+,a6
  110.         rts
  111.  
  112. _Exitc2p4    move.l    a6,-(sp)
  113.         move.l    _SysBase,a6
  114.         move.l    buff2ptr,d0
  115.         beq    1$
  116.         move.l    d0,a1
  117.         JSRLIB    FreeVec
  118. 1$        move.l    (sp)+,a6
  119.         rts
  120.  
  121. _c2p4        movem.l    d2-d7/a2-a6,-(sp)
  122.  
  123.         movem.l    4+44(sp),a2-a5
  124.         move.l    20+44(sp),d0
  125.  
  126. ; save arguments
  127.  
  128.         move.l    #mybltnode,a0
  129.         move.l    a2,(chunky-mybltnode,a0)
  130.         move.l    a4,(planes-mybltnode,a0)
  131.         move.l    a5,(task-mybltnode,a0)
  132.         move.l    d0,(signals-mybltnode,a0)
  133.  
  134. ;-------------------------------------------------
  135. ;original chunky data
  136. ;0        ........a3a2a1a0 ........b3b2b1b0
  137. ;2        ........c3c2c1c0 ........d3d2d1d0
  138. ;4        ........e3e2e1e0 ........f3f2f1f0
  139. ;6        ........g3g2g1g0 ........h3h2h1h0
  140. ;8        ........i3i2i1i0 ........j3j2j1j0
  141. ;10        ........k3k2k1k0 ........l3l2l1l0
  142. ;12        ........m3m2m1m0 ........n3n2n1n0
  143. ;14        ........o3o2o1o0 ........p3p2p1p0
  144. ;16        ........q3q2q1q0 ........r3r2r1r0
  145. ;18        ........s3s2s1s0 ........t3t2t1t0
  146. ;20        ........u3u2u1u0 ........v3v2v1v0
  147. ;22        ........w3w2w1w0 ........x3x2x1x0
  148. ;24        ........y3y2y1y0 ........z3z2z1z0
  149. ;26        ........A3A2A1A0 ........B3B2B1B0
  150. ;28        ........C3C2C1C0 ........D3D2D1D0
  151. ;30        ........E3E2E1E0 ........F3F2F1F0
  152. ;-------------------------------------------------
  153.  
  154.         move.l    buff2ptr,a4    ; a4 -> buff2
  155.         move.l    #$00ff00ff,d7    ; constant
  156.         move.w    #pixels/32,d6    ; loop counter
  157.  
  158.         bra.b    end_pass1loop
  159.  
  160.         CNOP    0,4
  161.  
  162. ; main loop (starts here) processes 32 chunky pixels at a time
  163. ; compare next 32 pixels with compare page, looking for differences
  164.  
  165. initpass1loop:    cmpm.l    (a2)+,(a3)+
  166.         bne.w    fix1
  167.         cmpm.l    (a2)+,(a3)+
  168.         bne.w    fix2
  169.         cmpm.l    (a2)+,(a3)+
  170.         bne.b    fix3
  171.         cmpm.l    (a2)+,(a3)+
  172.         bne.b    fix4
  173.         cmpm.l    (a2)+,(a3)+
  174.         bne.b    fix5
  175.         cmpm.l    (a2)+,(a3)+
  176.         bne.b    fix6
  177.         cmpm.l    (a2)+,(a3)+
  178.         bne.b    fix7
  179.         cmpm.l    (a2)+,(a3)+
  180.         bne.b    fix8
  181.  
  182.         addq.l    #8,a4        ; skip 8 bytes in output
  183.  
  184. end_pass1loop:    dbra    d6,initpass1loop
  185.  
  186. ; If we get to here then no difference was found.
  187. ; Signal the task and return.
  188.  
  189.         move.l    (task-mybltnode,a0),a1
  190.         move.l    (signals-mybltnode,a0),d0
  191.         move.l    (4).w,a6
  192.         JSRLIB    Signal
  193.  
  194.         movem.l    (sp)+,d2-d7/a2-a6
  195.         rts
  196.  
  197. ; This becomes the main loop after the first difference is found
  198.  
  199. pass1loop:    cmpm.l    (a2)+,(a3)+
  200.         bne.b    fix1
  201.         cmpm.l    (a2)+,(a3)+
  202.         bne.b    fix2
  203.         cmpm.l    (a2)+,(a3)+
  204.         bne.b    fix3
  205.         cmpm.l    (a2)+,(a3)+
  206.         bne.b    fix4
  207.         cmpm.l    (a2)+,(a3)+
  208.         bne.b    fix5
  209.         cmpm.l    (a2)+,(a3)+
  210.         bne.b    fix6
  211.         cmpm.l    (a2)+,(a3)+
  212.         bne.b    fix7
  213.         cmpm.l    (a2)+,(a3)+
  214.         bne.b    fix8
  215.  
  216.         addq.l    #8,a4        ; skip 8 bytes in output
  217.  
  218.         dbra    d6,pass1loop
  219.  
  220.         bra.w    done
  221.  
  222. ; difference found, restore a2 and a3
  223.  
  224. fix8:        subq.l    #4,a2
  225.         subq.l    #4,a3
  226. fix7:        sub.w    #28,a2
  227.         sub.w    #28,a3
  228.         bra.b    go_c2p
  229.  
  230. fix6:        subq.l    #4,a2
  231.         subq.l    #4,a3
  232. fix5:        sub.w    #20,a2
  233.         sub.w    #20,a3
  234.         bra.b    go_c2p
  235.  
  236. fix4:        subq.l    #4,a2
  237.         subq.l    #4,a3
  238. fix3:        sub.w    #12,a2
  239.         sub.w    #12,a3
  240.         bra.b    go_c2p
  241.  
  242. fix2:        subq.l    #4,a2
  243.         subq.l    #4,a3
  244. fix1:        subq.l    #4,a2
  245.         subq.l    #4,a3
  246.  
  247. ; convert 32 pixels (passes 1 and 2 combined)
  248.  
  249. go_c2p:        movem.l    (a2)+,d0-d3/a0/a1/a5/a6    ; ABCD EFGH IJKL MNOP QRST UVWX YZ01 2345
  250.  
  251.         move.l    #$0f0f0f0f,d4    ;<Obere Nibbles löschen>
  252.         and.l    d4,d0
  253.         and.l    d4,d1
  254.         and.l    d4,d2
  255.         and.l    d4,d3
  256.  
  257.         movem.l    d0-d3/a0/a1/a5/a6,(a3)    ; update compare buffer
  258.         adda.w    #32,a3
  259.  
  260.         lsl.l    #4,d0        ; A.B.C.D.
  261.         move.l    d0,d4        ; A.B.C.D.
  262.         and.l    d7,d4        ; ..B...D.
  263.         eor.l    d4,d0        ; A...C...
  264.  
  265.         move.l    d1,d5        ; .E.F.G.H
  266.         and.l    d7,d5        ; ...F...H
  267.         eor.l    d5,d1        ; .E...G..
  268.  
  269.         or.l    d1,d0        ; AE..CG..
  270.         or.l    d5,d4        ; ..BF..DH
  271.  
  272.         move.l    d2,d1        ; .I.J.K.L
  273.         and.l    d7,d1        ; ...J...L
  274.  
  275.         move.l    d3,d5        ; .M.N.O.P
  276.         and.l    d7,d5        ; ...N...P
  277.  
  278.         lsl.l    #4,d4        ; .BF..DH.
  279.         or.l    d1,d4        ; .BFJ.DHL
  280.         lsl.l    #4,d4        ; BFJ.DHL.
  281.         or.l    d5,d4        ; BFJNDHLP
  282.  
  283.         move.l    d4,(pixels/4,a4)
  284.  
  285.         eor.l    d5,d3        ; .M...O..
  286.         lsr.l    #4,d3        ; ..M...O.
  287.         eor.l    d1,d2        ; .I...K..
  288.         or.l    d3,d2        ; .IM..KO.
  289.         lsr.l    #4,d2        ; ..IM..KO
  290.         or.l    d2,d0        ; AEIMCGKO
  291.  
  292.         move.l    a6,d3
  293.         move.l    a5,d2
  294.         move.l    a1,d1
  295.  
  296.         move.l    d0,(a4)+
  297.  
  298.         move.l    a0,d0
  299.  
  300.         move.l    #$0f0f0f0f,d4    ;<Obere Nibbles löschen>
  301.         and.l    d4,d0
  302.         and.l    d4,d1
  303.         and.l    d4,d2
  304.         and.l    d4,d3
  305.  
  306.         lsl.l    #4,d0        ; Q.R.S.T.
  307.         move.l    d0,d4        ; Q.R.S.T.
  308.         and.l    d7,d4        ; ..R...T.
  309.         eor.l    d4,d0        ; Q...S...
  310.  
  311.         move.l    d1,d5        ; .U.V.W.X
  312.         and.l    d7,d5        ; ...V...X
  313.         eor.l    d5,d1        ; .U...W..
  314.  
  315.         or.l    d1,d0        ; QU..SW..
  316.         or.l    d5,d4        ; ..RV..TX
  317.  
  318.         move.l    d2,d1        ; .Y.Z.0.1
  319.         and.l    d7,d1        ; ...Z...1
  320.  
  321.         move.l    d3,d5        ; .2.3.4.5
  322.         and.l    d7,d5        ; ...3...5
  323.  
  324.         lsl.l    #4,d4        ; .RV..TX.
  325.         or.l    d1,d4        ; .RVZ.TX1
  326.         lsl.l    #4,d4        ; RVZ.TX1.
  327.         or.l    d5,d4        ; RVZ3TX15
  328.  
  329.         move.l    d4,(pixels/4,a4)
  330.  
  331.         eor.l    d5,d3        ; .2...4..
  332.         lsr.l    #4,d3        ; ..2...4.
  333.         eor.l    d1,d2        ; .Y...0..
  334.         or.l    d3,d2        ; .Y2..04.
  335.         lsr.l    #4,d2        ; ..Y2..04
  336.         or.l    d2,d0        ; QUY2SW04
  337.  
  338.         move.l    d0,(a4)+
  339.  
  340.         dbra    d6,pass1loop
  341.  
  342. ; start the blitter in the background for passes 3 & 4
  343. ; <OCS: pass 4 only, pass 3 is done by CPU>
  344.  
  345. done:        tst.w    wehaveocs
  346.         beq    3$
  347.  
  348.         move.w    #pixels/8-1,d7        ;blit31
  349.         move.l    buff2ptr,a0
  350.         move.l    buff2ptr,a1
  351.         addq.l    #2,a1
  352.         lea    buff3,a2
  353.         move.w    #$cccc,d2
  354. 1$        move.w    (a0)+,d0
  355.         addq.l    #2,a0
  356.         and.w    d2,d0
  357.         move.w    (a1)+,d1
  358.         addq.l    #2,a1
  359.         and.w    d2,d1
  360.         lsr.w    #2,d1
  361.         or.w    d1,d0
  362.         move.w    d0,(a2)+
  363.         dbra    d7,1$
  364.  
  365.         move.w    #pixels/8-1,d7        ;blit32
  366.         move.l    buff2ptr,a0
  367.         add.l    #pixels/2-2,a0
  368.         move.l    buff2ptr,a1
  369.         add.l    #pixels/2,a1
  370.         lea    buff3+pixels/2,a2
  371.         move.w    #$3333,d2
  372. 2$        move.w    -(a0),d0
  373.         subq.l    #2,a0
  374.         and.w    d2,d0
  375.         lsl.w    #2,d0
  376.         move.w    -(a1),d1
  377.         subq.l    #2,a1
  378.         and.w    d2,d1
  379.         or.w    d1,d0
  380.         move.w    d0,-(a2)
  381.         dbra    d7,2$
  382.  
  383. 3$        lea    mybltnode,a1
  384.         move.l    _GfxBase,a6
  385.         JSRLIB    QBlit
  386.  
  387.         movem.l    (sp)+,d2-d7/a2-a6
  388.         rts
  389.  
  390. ;-----------------------------------------------------------------------------
  391. ; QBlit functions (called asynchronously)
  392.  
  393. ;-------------------------------------------------
  394. ;after pass 2
  395. ;0        a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  396. ;2        c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  397. ;4        q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  398. ;6        s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  399. ;
  400. ;pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  401. ;pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  402. ;pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  403. ;pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  404. ;-------------------------------------------------
  405.  
  406. ;Pass 3, subpass 1
  407. ;    apt        buff2
  408. ;    bpt        buff2+2
  409. ;    dpt        buff3
  410. ;    amod        2
  411. ;    bmod        2
  412. ;    dmod        0
  413. ;    cdat        $cccc
  414. ;    sizv        pixels/8
  415. ;    sizh        1 word
  416. ;    con        D=AC+(B>>2)~C, ascending
  417.  
  418. blit31:        moveq    #-1,d0
  419.         move.l    d0,(bltafwm,a0)
  420.         move.w    #0,(bltdmod,a0)
  421.         move.l    (buff2ptr-mybltnode,a1),d0
  422.         move.l    d0,(bltapt,a0)
  423.         addq.l    #2,d0
  424.         move.l    d0,(bltbpt,a0)
  425.         move.l    #buff3,(bltdpt,a0)
  426.         move.w    #2,(bltamod,a0)
  427.         move.w    #2,(bltbmod,a0)
  428.         move.w    #pixels/8,(bltsizv,a0)
  429.         move.w    #$cccc,(bltcdat,a0)
  430.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  431.         move.w    #1,(bltsizh,a0)        ;do blit
  432.         lea    (blit32,pc),a0
  433.         move.l    a0,(qblitfunc-mybltnode,a1)
  434.         rts
  435.  
  436. ;Pass 3, subpass 2
  437. ;    apt        buff2+pixels/2-2-2
  438. ;    bpt        buff2+pixels/2-2
  439. ;    dpt        buff3+pixels/2-2
  440. ;    amod        2
  441. ;    bmod        2
  442. ;    dmod        0
  443. ;    cdat        $cccc
  444. ;    sizv        pixels/8
  445. ;    sizh        1 word
  446. ;    con        D=(A<<2)C+B~C, descending
  447.  
  448. blit32:        move.l    (buff2ptr-mybltnode,a1),d0
  449.         add.l    #pixels/2-2,d0
  450.         move.l    d0,(bltbpt,a0)
  451.         subq.l    #2,d0
  452.         move.l    d0,(bltapt,a0)
  453.         move.l    #buff3+pixels/2-2,(bltdpt,a0)
  454.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  455.         move.w    #1,(bltsizh,a0)        ;do blit
  456.         lea    (blit43,pc),a0
  457.         move.l    a0,(qblitfunc-mybltnode,a1)
  458.         rts
  459.  
  460. ;-------------------------------------------------
  461. ;after pass 3
  462. ;0        a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  463. ;2        q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  464. ;
  465. ;pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  466. ;pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  467. ;
  468. ;pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  469. ;pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  470. ;
  471. ;3*pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  472. ;3*pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  473. ;-------------------------------------------------
  474.  
  475. ;Pass 4, plane 3
  476. ;    apt        buff3+0*pixels/8
  477. ;    bpt        buff3+1*pixels/8
  478. ;    dpt        Planes+3*plsiz+offset
  479. ;    amod        0
  480. ;    bmod        0
  481. ;    dmod        0
  482. ;    cdat        $aaaa
  483. ;    sizv        pixels/16
  484. ;    sizh        1 word
  485. ;    con        D=AC+(B>>1)~C, ascending
  486.  
  487. blit43:        movem.l    a2,-(sp)
  488.         moveq    #-1,d0
  489.         move.l    d0,(bltafwm,a0)
  490.         move.w    #0,(bltdmod,a0)
  491.         move.l    #buff3+0*pixels/8,(bltapt,a0)
  492.         move.l    #buff3+1*pixels/8,(bltbpt,a0)
  493.         move.l    (planes-mybltnode,a1),a2
  494.         move.l    (3*4,a2),a2
  495.         add.w    #offset,a2
  496.         move.l    a2,(bltdpt,a0)        ; Plane3
  497.         move.w    #0,(bltamod,a0)
  498.         move.w    #0,(bltbmod,a0)
  499.         move.w    #$aaaa,(bltcdat,a0)
  500.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  501.         move.w    #height*64+width/16,(bltsize,a0)
  502.         lea    (blit41,pc),a0
  503.         move.l    a0,(qblitfunc-mybltnode,a1)
  504.         movem.l    (sp)+,a2
  505.         rts
  506.  
  507. ;-------------------------------------------------
  508. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  509. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  510. ;-------------------------------------------------
  511.  
  512. ;Pass 4, plane 1
  513. ;    apt        buff3+2*pixels/8
  514. ;    bpt        buff3+3*pixels/8
  515. ;    dpt        Planes+1*plsiz+offset
  516. ;    amod        0
  517. ;    bmod        0
  518. ;    dmod        0
  519. ;    cdat        $aaaa
  520. ;    sizv        pixels/16
  521. ;    sizh        1 word
  522. ;    con        D=AC+(B>>1)~C, ascending
  523.  
  524. blit41:        movem.l    a2,-(sp)
  525.         move.l    #buff3+2*pixels/8,(bltapt,a0)
  526.         move.l    #buff3+3*pixels/8,(bltbpt,a0)
  527.         move.l    (planes-mybltnode,a1),a2
  528.         move.l    (1*4,a2),a2
  529.         add.w    #offset,a2
  530.         move.l    a2,(bltdpt,a0)        ; Plane1
  531.         move.w    #height*64+width/16,(bltsize,a0)
  532.         lea    (blit42,pc),a0
  533.         move.l    a0,(qblitfunc-mybltnode,a1)
  534.         movem.l    (sp)+,a2
  535.         rts
  536.  
  537. ;-------------------------------------------------
  538. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  539. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  540. ;-------------------------------------------------
  541.  
  542. ;Pass 4, plane 2
  543. ;    apt        buff3+1*pixels/8-2
  544. ;    bpt        buff3+2*pixels/8-2
  545. ;    dpt        Planes+3*plsiz-2+offset
  546. ;    amod        0
  547. ;    bmod        0
  548. ;    dmod        0
  549. ;    cdat        $aaaa
  550. ;    sizv        pixels/16
  551. ;    sizh        1 word
  552. ;    con        D=(A<<1)C+B~C, descending
  553.  
  554. blit42:        movem.l    a2,-(sp)
  555.         move.l    #buff3+1*pixels/8-2,(bltapt,a0)
  556.         move.l    #buff3+2*pixels/8-2,(bltbpt,a0)
  557.         move.l    (planes-mybltnode,a1),a2
  558.         move.l    (2*4,a2),d0
  559.         add.l    #plsiz-2+offset,d0
  560.         move.l    d0,(bltdpt,a0)        ; Plane2+plsiz-2
  561.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  562.         move.w    #height*64+width/16,(bltsize,a0)
  563.         lea    (blit40,pc),a0
  564.         move.l    a0,(qblitfunc-mybltnode,a1)
  565.         movem.l    (sp)+,a2
  566.         rts
  567.  
  568. ;-------------------------------------------------
  569. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  570. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  571. ;-------------------------------------------------
  572.  
  573. ;Pass 4, plane 0
  574. ;    apt        buff3+3*pixels/8-2
  575. ;    bpt        buff3+4*pixels/8-2
  576. ;    dpt        Planes+1*plsiz-2+offset
  577. ;    amod        0
  578. ;    bmod        0
  579. ;    dmod        0
  580. ;    cdat        $aaaa
  581. ;    sizv        pixels/16
  582. ;    sizh        1 word
  583. ;    con        D=(A<<1)C+B~C, descending
  584.  
  585. blit40:        movem.l    a2,-(sp)
  586.         move.l    #buff3+3*pixels/8-2,(bltapt,a0)
  587.         move.l    #buff3+4*pixels/8-2,(bltbpt,a0)
  588.         move.l    (planes-mybltnode,a1),a2
  589.         move.l    (a2),d0
  590.         add.l    #plsiz-2+offset,d0
  591.         move.l    d0,(bltdpt,a0)        ; Plane0+plsiz-2
  592.         move.w    #height*64+width/16,(bltsize,a0)
  593.         move.l    (initblitfunc-mybltnode,a1),a0
  594.         move.l    a0,(qblitfunc-mybltnode,a1)
  595.         moveq    #0,d0            ; set Z flag
  596.         movem.l    (sp)+,a2
  597.         rts
  598.  
  599. ;-------------------------------------------------
  600. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  601. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  602. ;-------------------------------------------------
  603.  
  604. qblitcleanup:    movem.l    a2/a6,-(sp)
  605.         lea    mybltnode,a2
  606.         move.l    (task-mybltnode,a2),a1    ; signal the task
  607.         move.l    (signals-mybltnode,a2),d0
  608.         move.l    (4).w,a6
  609.         JSRLIB    Signal            ; may be called from interrupts
  610.         movem.l    (sp)+,a2/a6
  611.         rts
  612.  
  613. ;-----------------------------------------------------------------------------
  614.         SECTION    "DATA",DATA
  615.  
  616. mybltnode:    dc.l    0        ; next bltnode
  617. qblitfunc:    dc.l    0        ; ptr to qblitfunc()
  618.         dc.b    cleanup        ; stat
  619.         dc.b    0        ; filler
  620.         dc.w    0        ; blitsize
  621.         dc.w    0        ; beamsync
  622.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  623.  
  624.         CNOP    0,4
  625. chunky:        dc.l    0        ; ptr to original chunky data
  626. planes:        dc.l    0        ; ptr to list of output plane ptrs
  627. task:        dc.l    0        ; ptr to this task
  628. signals:    dc.l    0        ; signals to Signal() at cleanup
  629. initblitfunc    dc.l    0        ; first qblit function
  630. buff2ptr    dc.l    0        ; intermediate buffer 2
  631. wehaveocs    dc.w    0        ; OCS installed?
  632.  
  633. ;-----------------------------------------------------------------------------
  634.         SECTION    "CHIPBSS",BSS,CHIP    ; MUST BE IN CHIP !!!!!
  635.  
  636. buff3        ds.b pixels/2    ;Intermediate buffer 3
  637.  
  638. ;-----------------------------------------------------------------------------
  639.  
  640.         end
  641.