home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 25 / amigaformatcd25.iso / websites / amidoom / adoom_src-0.7.lha / ADoom_src / c2p_020.s < prev    next >
Text File  |  1998-01-16  |  21KB  |  810 lines

  1.         mc68020
  2.         multipass
  3. ;;;        debug    on,lattice4
  4.  
  5. ; ---------------------------------------------------------------------
  6.  
  7. ; void __asm c2p_020 (register __a2 UBYTE *fBUFFER,
  8. ;                     register __a4 PLANEPTR *planes,
  9. ;                     register __d0 ULONG signals1,
  10. ;                     register __d1 ULONG signals2,
  11. ;                     register __d4 ULONG signals3,
  12. ;                     register __d2 ULONG pixels,     // width*height
  13. ;                     register __d3 ULONG offset,     // byte offset into plane
  14. ;                     register __a1 UBYTE *xlate,
  15. ;                     register __a5 struct Task *othertask);
  16. ;
  17. ; Pipelined CPU+blitter 8-plane chunky to planar converter.
  18. ; Optimised for 68020/30 with fastmem.
  19. ;
  20. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 21 April 1994
  21. ; Based on James McCoull's 4-pass blitter algorithm.
  22. ;
  23. ; This code is public domain.
  24. ;
  25. ; Perform first 2 merges (Fast->Chip) with the CPU (in 1 pass).
  26. ; Wait for previous QBlit() to completely finish (signals2).
  27. ; Then launch merge passes 3 & 4 with QBlit().
  28. ; Return immediately after launching passes 3 & 4.
  29. ; Signal this task signals1 (asynchronously) after completion of pass 3.
  30. ; Signal this task signals2 from CleanUp() on completion of QBlit().
  31. ; Also signal othertask signals3 from CleanUp() on completion of QBlit().
  32. ; Calling task must wait for signals1 before next call to c2p_020()
  33. ;
  34. ; (Unimplemented speedup idea: use a "scrambled" chunky buffer.
  35. ; Skip pass 1.)
  36. ;
  37. ; Example usage:
  38. ;
  39. ;    /* clear fBUFFER, fBUFFER_CMP, and planes here */
  40. ;    if ((sigbit1 = AllocSignal(-1)) == -1 ||
  41. ;        (sigbit2 = AllocSignal(-1)) == -1)
  42. ;        die ("Can't allocate signal!\n");
  43. ;    SetSignal ((1<<sigbit1)|(1<<sigbit2),  // initial state is "finished"
  44. ;           (1<<sigbit1)|(1<<sigbit2));
  45. ;    for (;;) {
  46. ;        /* render to fBUFFER here */
  47. ;        Wait (1<<sigbit1);  // wait for prev c2p8() to finish pass 3
  48. ;            c2p8 (fBUFFER, &RASTPORT->BitMap->Planes[0],
  49. ;              1<<sigbit1, 1<<sigbit2, WIDTH*HEIGHT,
  50. ;                     WIDTH/8*LINESTOSKIP, xlate);
  51. ;    }
  52. ;    Wait (1<<sigbit1);  // wait for last c2p8 to finish pass 3
  53. ;    Wait (1<<sigbit2);  // wait for last c2p8 to completely finish
  54. ;    FreeSignal(sigbit1);
  55. ;    FreeSignal(sigbit2);
  56. ;
  57. ; ---------------------------------------------------------------------
  58.  
  59.         xref    _GfxBase
  60.  
  61. maxwidth    equ    320    ; must be a multiple of 32
  62. maxheight    equ    200
  63. maxpixels    equ    maxwidth*maxheight
  64.  
  65. cleanup        equ    $40
  66.  
  67. xload        macro    ; translate 4 8-bit pixels to 6-bit EHB using xlate[]
  68.         move.b    (\1,a2),d4
  69.         move.b    (a6,d4.w),\2
  70.         lsl.w    #8,\2
  71.         move.b    (\1+8,a2),d4
  72.         move.b    (a6,d4.w),\2
  73.         swap    \2
  74.         move.b    (\1+2,a2),d4
  75.         move.b    (a6,d4.w),\2
  76.         lsl.w    #8,\2
  77.         move.b    (\1+10,a2),d4
  78.         move.b    (a6,d4.w),\2
  79.         endm
  80.  
  81. ;        section chunks,code
  82.  
  83.     ifeq    depth-8
  84.         xdef    _c2p_8_020
  85. _c2p_8_020:
  86.     else
  87.     ifeq    depth-6
  88.         xdef    _c2p_6_020
  89. _c2p_6_020:
  90.     else
  91.         fail    "unsupported depth!"
  92.     endc
  93.     endc
  94.         movem.l    d2-d7/a2-a6,-(sp)
  95.  
  96. ; save arguments
  97.  
  98.         move.l    #mybltnode,a0
  99.         move.l    a5,(othertask-mybltnode,a0)
  100.         move.l    a2,(chunky-mybltnode,a0)
  101.         move.l    a4,(planes-mybltnode,a0)
  102.         move.l    d0,(signals1-mybltnode,a0)
  103.         move.l    d1,(signals2-mybltnode,a0)
  104.         move.l    d4,(signals3-mybltnode,a0)
  105.         move.l    d2,(pixels-mybltnode,a0)
  106.         lsr.l    #1,d2
  107.         move.l    d2,(pixels2-mybltnode,a0)
  108.         lsr.l    #1,d2
  109.         move.l    d2,(pixels4-mybltnode,a0)
  110.         lsr.l    #1,d2
  111.         move.l    d2,(pixels8-mybltnode,a0)
  112.         lsr.l    #1,d2
  113.         move.l    d2,(pixels16-mybltnode,a0)
  114.         move.l    d3,(offset-mybltnode,a0)
  115.     IFLE depth-6
  116.         move.l    a1,(xlate-mybltnode,a0)
  117.     ENDC
  118.  
  119. ;-------------------------------------------------
  120. ;original chunky data
  121. ;0        a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0
  122. ;2        c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  123. ;4        e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0
  124. ;6        g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  125. ;8        i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0
  126. ;10        k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0
  127. ;12        m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0
  128. ;14        o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0
  129. ;16        q7q6q5q4q3q2q1q0 r7r6r5r4r3r2r1r0
  130. ;18        s7s6s5s4s3s2s1s0 t7t6t5t4t3t2t1t0
  131. ;20        u7u6u5u4u3u2u1u0 v7v6v5v4v3v2v1v0
  132. ;22        w7w6w5w4w3w2w1w0 x7x6x5x4x3x2x1x0
  133. ;24        y7y6y5y4y3y2y1y0 z7z6z5z4z3z2z1z0
  134. ;26        A7A6A5A4A3A2A1A0 B7B6B5B4B3B2B1B0
  135. ;28        C7C6C5C4C3C2C1C0 D7D6D5D4D3D2D1D0
  136. ;30        E7E6E5E4E3E2E1E0 F7F6F5F4F3F2F1F0
  137. ;-------------------------------------------------
  138.  
  139.         move.l    (pixels16-mybltnode,a0),d6 ; loop count = pixels/16
  140.  
  141.     IFLE depth-6
  142.         move.l    (xlate-mybltnode,a0),a6    ; a6 -> xlate
  143.     ENDC
  144.         move.l    (pixels4-mybltnode,a0),d0
  145.         move.l    #buff2,a0    ; a0 -> buff2 (in Chip)
  146.         lea    (a0,d0.l),a1    ; a1 -> buff2+pixels/4
  147.         lea    (a1,d0.l),a4    ; a4 -> buff2+pixels/2
  148.         lea    (a4,d0.l),a5    ; a5 -> buff2+3*pixels/4
  149.  
  150.         move.l    #$0f0f0f0f,d7    ; constant
  151.         move.l    #$00ff00ff,d5    ; constant
  152.  
  153.     IFGT depth-6            ; 8-plane version
  154.         subq.w    #1,d6
  155.         movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  156.         move.l    d2,d4
  157.         lsr.l    #8,d4
  158.         eor.l    d0,d4
  159.         and.l    d5,d4
  160.         eor.l    d4,d0
  161.         lsl.l    #8,d4
  162.         eor.l    d4,d2
  163.         move.l    d3,d4
  164.         lsr.l    #8,d4
  165.         eor.l    d1,d4
  166.         and.l    d5,d4
  167.         eor.l    d4,d1
  168.         lsl.l    #8,d4
  169.         eor.l    d4,d3
  170.         move.l    d1,d4
  171.         lsr.l    #4,d4
  172.         bra    start8
  173.     ELSE
  174.         bra    end_pass1loop
  175.     ENDC
  176.  
  177.         cnop    0,4
  178.  
  179. ; main loop (starts here) processes 16 chunky pixels at a time
  180. ; convert 16 pixels (passes 1 and 2 combined)
  181.  
  182.     IFGT depth-6            ; 8-plane version
  183.  
  184. mainloop:    movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  185.  
  186.         move.l    d4,(a4)+
  187.  
  188.         move.l    d2,d4
  189.         lsr.l    #8,d4
  190.         eor.l    d0,d4
  191.         and.l    d5,d4
  192.         eor.l    d4,d0
  193.         lsl.l    #8,d4
  194.         eor.l    d4,d2
  195.         move.l    d3,d4
  196.  
  197.         move.l    a6,(a1)+
  198.  
  199.         lsr.l    #8,d4
  200.         eor.l    d1,d4
  201.         and.l    d5,d4
  202.         eor.l    d4,d1
  203.         lsl.l    #8,d4
  204.         eor.l    d4,d3
  205.         move.l    d1,d4
  206.         lsr.l    #4,d4
  207.  
  208.         move.l    a3,(a5)+
  209.  
  210. start8:        eor.l    d0,d4
  211.         and.l    d7,d4
  212.         eor.l    d4,d0        ; d0=AEIMCGKO
  213.         lsl.l    #4,d4
  214.         eor.l    d1,d4        ; d4=aeimcgko
  215.         move.l    d3,d1
  216.         lsr.l    #4,d1
  217.         eor.l    d2,d1
  218.  
  219.         move.l    d0,(a0)+
  220.  
  221.         and.l    d7,d1
  222.         eor.l    d1,d2
  223.         lsl.l    #4,d1
  224.         eor.l    d1,d3
  225.         movea.l    d2,a6        ; a6=BFJNDHLP
  226.         movea.l    d3,a3        ; a3=bfjndhlp
  227.  
  228. end_pass1loop:    dbra    d6,mainloop
  229.  
  230.         move.l    d4,(a4)+
  231.         move.l    a6,(a1)+
  232.         move.l    a3,(a5)+
  233.  
  234.     ELSE                ; 6-plane version with pixel xlate table
  235.  
  236. mainloop:    moveq    #0,d4
  237.         xload    0,d0        ; d0=xlate[AaIiCcKk]
  238.         xload    4,d1        ; d1=xlate[EeMmGgOo]
  239.         xload    1,d2        ; d2=xlate[BbJjDdLl]
  240.         xload    5,d3        ; d3=xlate[FfNnHhPp]
  241.         adda.w    #16,a2
  242.  
  243.         move.l    d1,d4
  244.         lsr.l    #4,d4
  245.         eor.l    d0,d4
  246.         and.l    d7,d4
  247.         eor.l    d4,d0        ; d0=AEIMCGKO
  248.  
  249.         move.l    d0,(a0)+
  250.  
  251.         lsl.l    #4,d4
  252.         eor.l    d4,d1        ; d1=aeimcgko
  253.         move.l    d3,d4
  254.         lsr.l    #4,d4
  255.  
  256.         move.l    d1,(a4)+
  257.  
  258.         eor.l    d2,d4
  259.         and.l    d7,d4
  260.         eor.l    d4,d2        ; d2=BFJNDHLP
  261.  
  262.         move.l    d2,(a1)+
  263.  
  264.         lsl.l    #4,d4
  265.         eor.l    d4,d3        ; d3=bfjndhlp
  266.  
  267.         move.l    d3,(a5)+
  268.  
  269. end_pass1loop:    dbra    d6,mainloop
  270.  
  271.     ENDC
  272.  
  273. ; wait until previous QBlit() has completely finished (signals2)
  274. ; then start the blitter in the background for passes 3 & 4
  275.  
  276. done:        move.l    #mybltnode,a2    ; a2->mybltnode
  277.         move.l    (4).w,a6    ; a6->SysBase
  278.         move.l    (ThisTask,a6),(task-mybltnode,a2) ; save task ptr
  279.         move.l    (signals2-mybltnode,a2),d0
  280.         jsr    (_LVOWait,a6)
  281.  
  282.         move.l    a2,a1
  283.         move.l    (_GfxBase),a6
  284.         jsr    (_LVOQBlit,a6)
  285.  
  286. ret:        movem.l    (sp)+,d2-d7/a2-a6
  287.         rts
  288.  
  289. ;-----------------------------------------------------------------------------
  290. ; QBlit functions (called asynchronously)
  291.  
  292. ;-------------------------------------------------
  293. ;buff2 after pass 2
  294. ;0        a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4
  295. ;2        c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4
  296. ;4        q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  297. ;6        s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  298. ;
  299. ;Pixels/4+0    b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  300. ;Pixels/4+2    d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  301. ;Pixels/4+4    r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  302. ;Pixels/4+6    t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  303. ;
  304. ;Pixels/2+0    a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  305. ;Pixels/2+2    c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  306. ;Pixels/2+4    q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  307. ;Pixels/2+6    s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  308. ;
  309. ;3*Pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  310. ;3*Pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  311. ;3*Pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  312. ;3*Pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  313. ;-------------------------------------------------
  314.  
  315. ;Pass 3, subpass 1
  316. ;    apt        Buff2
  317. ;    bpt        Buff2+2
  318. ;    dpt        Buff3
  319. ;    amod        2
  320. ;    bmod        2
  321. ;    dmod        0
  322. ;    cdat        $cccc
  323. ;    sizv        Pixels/4
  324. ;    sizh        1 word
  325. ;    con        D=AC+(B>>2)~C, ascending
  326.  
  327. blit31:        moveq    #-1,d0
  328.         move.l    d0,(bltafwm,a0)
  329.         move.w    #0,(bltdmod,a0)
  330.         move.l    #buff2,(bltapt,a0)
  331.         move.l    #buff2+2,(bltbpt,a0)
  332.         move.l    #buff3,(bltdpt,a0)
  333.         move.w    #2,(bltamod,a0)        ; 2
  334.         move.w    #2,(bltbmod,a0)        ; 2
  335.         move.w    #$cccc,(bltcdat,a0)
  336.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  337.  
  338. ;        move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  339. ;blit31a:    cmp.l    #32768,d0        ; check for overflow blitter
  340. ;        bls.b    blit31c            ; branch if ok
  341. ;        move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  342. ;        move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  343. ;        move.w    #1,(bltsizh,a0)        ; do blit
  344. ;        lea    (blit31b,pc),a0
  345. ;        move.l    a0,(qblitfunc-mybltnode,a1)
  346. ;        rts
  347. ;
  348. ;blit31b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  349. ;        sub.l    #32768,d0        ; subtract number already done
  350. ;        bra.b    blit31a            ; loop back
  351. ;
  352. ;blit31c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  353.  
  354.         move.w    (pixels4+2-mybltnode,a1),(bltsizv,a0) ; pixels/4
  355.  
  356.         move.w    #1,(bltsizh,a0)        ;do blit
  357.         lea    (blit32,pc),a0
  358.         move.l    a0,(qblitfunc-mybltnode,a1)
  359.         rts
  360.  
  361. ;Pass 3, subpass 2
  362. ;    apt        Buff2+Pixels-2-2
  363. ;    bpt        Buff2+Pixels-2
  364. ;    dpt        Buff3+Pixels-2
  365. ;    amod        2
  366. ;    bmod        2
  367. ;    dmod        0
  368. ;    cdat        $cccc
  369. ;    sizv        Pixels/4
  370. ;    sizh        1 word
  371. ;    con        D=(A<<2)C+B~C, descending
  372.  
  373. blit32:        move.l    #buff2,d0
  374.         add.l    (pixels-mybltnode,a1),d0
  375.         subq.l    #2+2,d0
  376.         move.l    d0,(bltapt,a0)        ; buff2+pixels-2-2
  377.         addq.l    #2,d0
  378.         move.l    d0,(bltbpt,a0)        ; buff2+pixels-2
  379.         add.l    #buff3-buff2,d0
  380.         move.l    d0,(bltdpt,a0)        ; buff3+pixels-2
  381.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  382.  
  383. ;        move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  384. ;blit32a:    cmp.l    #32768,d0        ; check for overflow blitter
  385. ;        bls.b    blit32c            ; branch if ok
  386. ;        move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  387. ;        move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  388. ;        move.w    #1,(bltsizh,a0)        ; do blit
  389. ;        lea    (blit32b,pc),a0
  390. ;        move.l    a0,(qblitfunc-mybltnode,a1)
  391. ;        rts
  392. ;
  393. ;blit32b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  394. ;        sub.l    #32768,d0        ; subtract number already done
  395. ;        bra.b    blit32a            ; loop back
  396. ;
  397. ;blit32c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  398.  
  399.         move.w    #1,(bltsizh,a0)        ;do blit
  400.     IFGT depth-6
  401.         lea    (blit47,pc),a0
  402.     ELSE
  403.         lea    (blit43,pc),a0
  404.     ENDC
  405.         move.l    a0,(qblitfunc-mybltnode,a1)
  406.         rts
  407.  
  408. ;-------------------------------------------------
  409. ;buff3 after pass 3
  410. ;0        a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6
  411. ;2        q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  412. ;
  413. ;Pixels/8+0    b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  414. ;Pixels/8+2    r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  415. ;
  416. ;Pixels/4+0    a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  417. ;Pixels/4+2    q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  418. ;
  419. ;3*Pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  420. ;3*Pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  421. ;
  422. ;Pixels/2+0    a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4
  423. ;Pixels/2+2    q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  424. ;
  425. ;5*Pixels/8+0    b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  426. ;5*Pixels/8+2    r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  427. ;
  428. ;3*Pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  429. ;3*Pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  430. ;
  431. ;7*Pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  432. ;7*Pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  433. ;-------------------------------------------------
  434.  
  435.     IFGT depth-6
  436.  
  437. ;Pass 4, plane 7
  438. ;    apt        Buff3+0*pixels/8
  439. ;    bpt        Buff3+1*pixels/8
  440. ;    dpt        Plane7+offset
  441. ;    amod        0
  442. ;    bmod        0
  443. ;    dmod        0
  444. ;    cdat        $aaaa
  445. ;    sizv        Pixels/16
  446. ;    sizh        1 word
  447. ;    con        D=AC+(B>>1)~C, ascending
  448.  
  449. blit47:        movem.l    a2,-(sp)
  450.  
  451.         move.w    #0,(bltamod,a0)
  452.         move.w    #0,(bltbmod,a0)
  453.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  454.         move.w    #$aaaa,(bltcdat,a0)
  455.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  456.  
  457.         move.l    #buff3,d0
  458.         move.l    d0,(bltapt,a0)        ; buff3+0*pixels/8
  459.         add.l    (pixels8-mybltnode,a1),d0
  460.         move.l    d0,(bltbpt,a0)        ; buff3+1*pixels/8
  461.         move.l    (planes-mybltnode,a1),a2
  462.         move.l    (7*4,a2),d0
  463.         add.l    (offset-mybltnode,a1),d0
  464.         move.l    d0,(bltdpt,a0)        ; Plane7+offset
  465.         move.w    #1,(bltsizh,a0)        ;plane 7
  466.  
  467.         movem.l    a1/a6,-(sp)
  468.         move.l    (signals1-mybltnode,a1),d0
  469.         move.l    (task-mybltnode,a1),a1
  470.         move.l    (4).w,a6        ; a6->SysBase
  471.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  472.         movem.l    (sp)+,a1/a6
  473.  
  474.         lea    (blit43,pc),a0
  475.         move.l    a0,(qblitfunc-mybltnode,a1)
  476.         movem.l    (sp)+,a2
  477.         rts
  478.  
  479. ;-------------------------------------------------
  480. ;Plane7        a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7
  481. ;Plane7+2    q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  482. ;-------------------------------------------------
  483.  
  484.     ENDC
  485.  
  486. ;Pass 4, plane 3
  487. ;    apt        buff3+2*pixels/8
  488. ;    bpt        buff3+3*pixels/8
  489. ;    dpt        Plane3+offset
  490. ;    amod        0
  491. ;    bmod        0
  492. ;    dmod        0
  493. ;    cdat        $aaaa
  494. ;    sizv        pixels/16
  495. ;    sizh        1 word
  496. ;    con        D=AC+(B>>1)~C, ascending
  497.  
  498. blit43:        move.l    a2,-(sp)        ; preserve a2
  499.     IFLE depth-6
  500.         move.w    #0,(bltamod,a0)
  501.         move.w    #0,(bltbmod,a0)
  502.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  503.         move.w    #$aaaa,(bltcdat,a0)
  504.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  505.     ENDC
  506.         move.l    #buff3,d0
  507.         add.l    (pixels4-mybltnode,a1),d0
  508.         move.l    d0,(bltapt,a0)        ; buff3+2*pixels/8
  509.         add.l    (pixels8-mybltnode,a1),d0
  510.         move.l    d0,(bltbpt,a0)        ; buff3+3*pixels/8
  511.         move.l    (planes-mybltnode,a1),a2
  512.         move.l    (3*4,a2),d0
  513.         add.l    (offset-mybltnode,a1),d0
  514.         move.l    d0,(bltdpt,a0)        ; Plane3+offset
  515.         move.w    #1,(bltsizh,a0)        ;plane 3
  516.     IFLE depth-6
  517.         movem.l    a1/a6,-(sp)
  518.         move.l    (signals1-mybltnode,a1),d0
  519.         move.l    (task-mybltnode,a1),a1
  520.         move.l    (4).w,a6        ; a6->SysBase
  521.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  522.         movem.l    (sp)+,a1/a6
  523.     ENDC
  524.         lea    (blit45,pc),a0
  525.         move.l    a0,(qblitfunc-mybltnode,a1)
  526.         move.l    (sp)+,a2        ; restore a2
  527.         rts
  528.  
  529. ;-------------------------------------------------
  530. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  531. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  532. ;-------------------------------------------------
  533.  
  534. ;Pass 4, plane 5
  535. ;    apt        buff3+4*pixels/8
  536. ;    bpt        buff3+5*pixels/8
  537. ;    dpt        Plane5+offset
  538. ;    amod        0
  539. ;    bmod        0
  540. ;    dmod        0
  541. ;    cdat        $aaaa
  542. ;    sizv        pixels/16
  543. ;    sizh        1 word
  544. ;    con        D=AC+(B>>1)~C, ascending
  545.  
  546. blit45:        move.l    a2,d1            ; preserve a2
  547.         move.l    #buff3,d0
  548.         add.l    (pixels2-mybltnode,a1),d0
  549.         move.l    d0,(bltapt,a0)        ; buff3+4*pixels/8
  550.         add.l    (pixels8-mybltnode,a1),d0
  551.         move.l    d0,(bltbpt,a0)        ; buff3+5*pixels/8
  552.         move.l    (planes-mybltnode,a1),a2
  553.         move.l    (5*4,a2),d0
  554.         add.l    (offset-mybltnode,a1),d0
  555.         move.l    d0,(bltdpt,a0)        ; Plane5+offset
  556.         move.w    #1,(bltsizh,a0)        ;plane 5
  557.         lea    (blit41,pc),a0
  558.         move.l    a0,(qblitfunc-mybltnode,a1)
  559.         move.l    d1,a2            ; restore a2
  560.         rts
  561.  
  562. ;-------------------------------------------------
  563. ;Plane5        a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5
  564. ;Plane5+2    q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  565. ;-------------------------------------------------
  566.  
  567. ;Pass 4, plane 1
  568. ;    apt        buff3+6*pixels/8
  569. ;    bpt        buff3+7*pixels/8
  570. ;    dpt        Plane1+offset
  571. ;    amod        0
  572. ;    bmod        0
  573. ;    dmod        0
  574. ;    cdat        $aaaa
  575. ;    sizv        pixels/16
  576. ;    sizh        1 word
  577. ;    con        D=AC+(B>>1)~C, ascending
  578.  
  579. blit41:        move.l    a2,d1            ; preserve a2
  580.         move.l    #buff3,d0
  581.         add.l    (pixels4-mybltnode,a1),d0
  582.         add.l    (pixels2-mybltnode,a1),d0
  583.         move.l    d0,(bltapt,a0)        ; buff3+6*pixels/8
  584.         add.l    (pixels8-mybltnode,a1),d0
  585.         move.l    d0,(bltbpt,a0)        ; buff3+7*pixels/8
  586.         move.l    (planes-mybltnode,a1),a2
  587.         move.l    (1*4,a2),d0
  588.         add.l    (offset-mybltnode,a1),d0
  589.         move.l    d0,(bltdpt,a0)        ; Plane1+offset
  590.         move.w    #1,(bltsizh,a0)        ;plane 1
  591.     IFGT depth-6
  592.         lea    (blit46,pc),a0
  593.     ELSE
  594.         lea    (blit42,pc),a0
  595.     ENDC
  596.         move.l    a0,(qblitfunc-mybltnode,a1)
  597.         move.l    d1,a2            ; restore a2
  598.         rts
  599.  
  600. ;-------------------------------------------------
  601. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  602. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  603. ;-------------------------------------------------
  604.  
  605.     IFGT depth-6
  606.  
  607. ;Pass 4, plane 6
  608. ;    apt        buff3+1*pixels/8-2
  609. ;    bpt        buff3+2*pixels/8-2
  610. ;    dpt        Plane6+plsiz-2+offset
  611. ;    amod        0
  612. ;    bmod        0
  613. ;    dmod        0
  614. ;    cdat        $aaaa
  615. ;    sizv        pixels/16
  616. ;    sizh        1 word
  617. ;    con        D=(A<<1)C+B~C, descending
  618.  
  619. blit46:        move.l    a2,d1            ; preserve a2
  620.         move.l    #buff3,d0
  621.         add.l    (pixels8-mybltnode,a1),d0
  622.         subq.l    #2,d0
  623.         move.l    d0,(bltapt,a0)        ; buff3+1*pixels/8-2
  624.         add.l    (pixels8-mybltnode,a1),d0
  625.         move.l    d0,(bltbpt,a0)        ; buff3+2*pixels/8-2
  626.         move.l    (planes-mybltnode,a1),a2
  627.         move.l    (6*4,a2),d0
  628.         add.l    (offset-mybltnode,a1),d0
  629.         add.l    (pixels8-mybltnode,a1),d0
  630.         subq.l    #2,d0
  631.         move.l    d0,(bltdpt,a0)        ; Plane6+offset+plsiz-2
  632.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  633.         move.w    #1,(bltsizh,a0)        ;plane 6
  634.         lea    (blit42,pc),a0
  635.         move.l    a0,(qblitfunc-mybltnode,a1)
  636.         move.l    d1,a2            ; restore a2
  637.         rts
  638.  
  639. ;-------------------------------------------------
  640. ;Plane6        a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  641. ;Plane6+2    q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  642. ;-------------------------------------------------
  643.  
  644.     ENDC
  645.  
  646. ;Pass 4, plane 2
  647. ;    apt        buff3+3*pixels/8-2
  648. ;    bpt        buff3+4*pixels/8-2
  649. ;    dpt        Plane2+plsiz-2+offset
  650. ;    amod        0
  651. ;    bmod        0
  652. ;    dmod        0
  653. ;    cdat        $aaaa
  654. ;    sizv        pixels/16
  655. ;    sizh        1 word
  656. ;    con        D=(A<<1)C+B~C, descending
  657.  
  658. blit42:        move.l    a2,d1            ; preserve a2
  659.         move.l    #buff3,d0
  660.         add.l    (pixels2-mybltnode,a1),d0
  661.         subq.l    #2,d0
  662.         move.l    d0,(bltbpt,a0)        ; buff3+4*pixels/8-2
  663.         sub.l    (pixels8-mybltnode,a1),d0
  664.         move.l    d0,(bltapt,a0)        ; buff3+3*pixels/8-2
  665.         move.l    (planes-mybltnode,a1),a2
  666.         move.l    (2*4,a2),d0
  667.         add.l    (offset-mybltnode,a1),d0
  668.         add.l    (pixels8-mybltnode,a1),d0
  669.         subq.l    #2,d0
  670.         move.l    d0,(bltdpt,a0)        ; Plane2+offset+plsiz-2
  671.     IFLE depth-6
  672.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  673.     ENDC
  674.         move.w    #1,(bltsizh,a0)        ;plane 2
  675.         lea    (blit44,pc),a0
  676.         move.l    a0,(qblitfunc-mybltnode,a1)
  677.         move.l    d1,a2            ; restore a2
  678.         rts
  679.  
  680. ;-------------------------------------------------
  681. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  682. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  683. ;-------------------------------------------------
  684.  
  685. ;Pass 4, plane 4
  686. ;    apt        buff3+5*pixels/8-2
  687. ;    bpt        buff3+6*pixels/8-2
  688. ;    dpt        Plane4+plsiz-2+offset
  689. ;    amod        0
  690. ;    bmod        0
  691. ;    dmod        0
  692. ;    cdat        $aaaa
  693. ;    sizv        pixels/16
  694. ;    sizh        1 word
  695. ;    con        D=(A<<1)C+B~C, descending
  696.  
  697. blit44:        move.l    a2,d1            ; preserve a2
  698.         move.l    #buff3,d0
  699.         add.l    (pixels2-mybltnode,a1),d0
  700.         add.l    (pixels4-mybltnode,a1),d0
  701.         subq.l    #2,d0
  702.         move.l    d0,(bltbpt,a0)        ; buff3+6*pixels/8-2
  703.         sub.l    (pixels8-mybltnode,a1),d0
  704.         move.l    d0,(bltapt,a0)        ; buff3+5*pixels/8-2
  705.         move.l    (planes-mybltnode,a1),a2
  706.         move.l    (4*4,a2),d0
  707.         add.l    (offset-mybltnode,a1),d0
  708.         add.l    (pixels8-mybltnode,a1),d0
  709.         subq.l    #2,d0
  710.         move.l    d0,(bltdpt,a0)        ; Plane4+offset+plsiz-2
  711.         move.w    #1,(bltsizh,a0)        ;plane 4
  712.         lea    (blit40,pc),a0
  713.         move.l    a0,(qblitfunc-mybltnode,a1)
  714.         move.l    d1,a2            ; restore a2
  715.         rts
  716.  
  717. ;-------------------------------------------------
  718. ;Plane4        a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  719. ;Plane4+2    q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  720. ;-------------------------------------------------
  721.  
  722. ;Pass 4, plane 0
  723. ;    apt        buff3+7*pixels/8-2
  724. ;    bpt        buff3+8*pixels/8-2
  725. ;    dpt        Plane0+plsiz-2+offset
  726. ;    amod        0
  727. ;    bmod        0
  728. ;    dmod        0
  729. ;    cdat        $aaaa
  730. ;    sizv        pixels/16
  731. ;    sizh        1 word
  732. ;    con        D=(A<<1)C+B~C, descending
  733.  
  734. blit40:        move.l    a2,d1            ; preserve a2
  735.         move.l    #buff3,d0
  736.         add.l    (pixels-mybltnode,a1),d0
  737.         subq.l    #2,d0
  738.         move.l    d0,(bltbpt,a0)        ; buff3+8*pixels/8-2
  739.         sub.l    (pixels8-mybltnode,a1),d0
  740.         move.l    d0,(bltapt,a0)        ; buff3+7*pixels/8-2
  741.         move.l    (planes-mybltnode,a1),a2
  742.         move.l    (a2),d0
  743.         add.l    (offset-mybltnode,a1),d0
  744.         add.l    (pixels8-mybltnode,a1),d0
  745.         subq.l    #2,d0
  746.         move.l    d0,(bltdpt,a0)        ; Plane0+offset+plsiz-2
  747.         move.w    #1,(bltsizh,a0)        ;plane 0
  748.         lea    (blit31,pc),a0
  749.         move.l    a0,(qblitfunc-mybltnode,a1)
  750.         move.l    d1,a2            ; restore a2
  751.         moveq    #0,d0            ; set Z flag
  752.         rts
  753.  
  754. ;-------------------------------------------------
  755. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  756. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  757. ;-------------------------------------------------
  758.  
  759. qblitcleanup:    movem.l    a2/a6,-(sp)
  760.         move.l    #mybltnode,a2
  761.         move.l    (task-mybltnode,a2),a1    ; signal QBlit() has finished
  762.         move.l    (signals2-mybltnode,a2),d0
  763.         move.l    (4).w,a6
  764.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  765.         move.l    (othertask-mybltnode,a2),a1
  766.         move.l    (signals3-mybltnode,a2),d0
  767.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  768.         movem.l    (sp)+,a2/a6
  769.         rts
  770.  
  771. ;-----------------------------------------------------------------------------
  772.         section    data,data
  773.  
  774.         quad
  775. mybltnode:    dc.l    0        ; next bltnode
  776. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  777.         dc.b    cleanup        ; stat
  778.         dc.b    0        ; filler
  779.         dc.w    0        ; blitsize
  780.         dc.w    0        ; beamsync
  781.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  782.  
  783.         quad
  784. chunky:        dc.l    0        ; ptr to original chunky data
  785. planes:        dc.l    0        ; ptr to list of output plane ptrs
  786. pixels:        dc.l    0        ; width*height
  787. pixels2:    dc.l    0        ; width*height/2
  788. pixels4:    dc.l    0        ; width*height/4
  789. pixels8:    dc.l    0        ; width*height/8
  790. pixels16:    dc.l    0        ; width*height/16
  791. offset:        dc.l    0        ; byte offset into plane
  792. task:        dc.l    0        ; ptr to this task
  793. othertask:    dc.l    0        ; ptr to other task
  794. signals1:    dc.l    0        ; signals to Signal() task after pass 3
  795. signals2:    dc.l    0        ; signals to Signal() task at cleanup
  796. signals3:    dc.l    0        ; signals to Signal() othertask at cleanup
  797. ;sizv        dc.l    0
  798. xlate:        dc.l    0
  799. force_update:    dc.w    0
  800.  
  801. ;-----------------------------------------------------------------------------
  802.         section    segment1,bss,chip        ; MUST BE IN CHIP !!!!!
  803.  
  804. buff2        ds.b    maxpixels    ;Intermediate buffer 2
  805. buff3        ds.b    maxpixels    ;Intermediate buffer 3
  806.  
  807. ;-----------------------------------------------------------------------------
  808.  
  809.         end
  810.