home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #2 / amigaacscoverdisc1998-021998.iso / games / doom / adoom / src / c2p_020.s < prev    next >
Text File  |  1998-01-06  |  21KB  |  811 lines

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