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

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