home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1997 #5 / amigaacscoverdisc1997-051997.i / games / commercialdemos / gloom3 / src / akiko_1.s < prev   
Text File  |  1996-01-03  |  15KB  |  569 lines

  1.         multipass
  2.         mc68020
  3.  
  4.         bra.w    initc2p        ; offset 0: initialization routines
  5.         bra.w    doc2p_1X8    ; offset 4: one pixel wide version, AGA
  6.         bra.w    doc2p_1X6    ; offset 8: one pixel wide version, EHB
  7.         bra.w    doc2p_2X8    ; offset 12: two pixel wide version, AGA
  8.         bra.w    doc2p_2X6    ; offset 16: two pixel wide version, EHB
  9.         dc.l    string        ; offset 20: address of descr string
  10.  
  11. gfxbase        dc.l    0        ; GfxBase
  12. c2p_ptr        dc.l    0        ; hardware address of Akiko register
  13.  
  14.         dc.b    '$VER: akiko_1 1.0 (4/1/96)',0
  15. string        dc.b    'A chunky to planar routine by Peter McGavin. '
  16.         dc.b    'REQUIRES AKIKO CHIP, e.g, as in CD32. '
  17.         dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  18. gfxname        dc.b    'graphics.library',0
  19.         even
  20.  
  21. gb_ChunkyToPlanarPtr equ 508
  22.  
  23. initc2p
  24.  
  25. ; create 2 tables for Gloom
  26.  
  27. ; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  28. ; a1=columns buffer for 2 wide pixs
  29. ; d0=how many columns (multiple of 32)
  30. ; a2=palette remapping array (do 256)
  31.  
  32.         move.w    #255,d1    ;#colours-1
  33. .loop        move.b    d1,(0,a2,d1.w)
  34.         dbf    d1,.loop
  35.  
  36. ; column offsets for 1 wide pixels
  37.  
  38. ; 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
  39. ; 16,17,18,19,20...
  40.  
  41.         move.w    d0,d1
  42.         ext.l    d1
  43.         subq.l    #1,d1
  44. .loop2        move.l    d1,(0,a0,d1.w*4)
  45.         dbf    d1,.loop2
  46.  
  47. ; column offsets for 2 wide pixels
  48.  
  49. ; 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
  50. ; 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
  51. ; 32,34,36,38,40,...
  52.  
  53.         lsr.w    #5,d0
  54.         subq.w    #1,d0
  55.         moveq    #0,d1
  56. .loop3        moveq    #15,d2
  57. .loop4        move.l    d1,(a1)+
  58.         addq.l    #2,d1
  59.         dbf    d2,.loop4
  60.         sub.l    #31,d1
  61.         moveq    #15,d2
  62. .loop5        move.l    d1,(a1)+
  63.         addq.l    #2,d1
  64.         dbf    d2,.loop5
  65.         subq.l    #1,d1
  66.         dbf    d0,.loop3
  67.  
  68. ; open graphics.library and retrieve gb_ChunkyToPlanarPtr
  69.  
  70.         lea    (gfxname,pc),a1
  71.         moveq    #40,d0
  72.         move.l    (4).w,a6
  73.         jsr    (_LVOOpenLibrary,a6)
  74.         lea    (gfxbase,pc),a0
  75.         move.l    d0,(a0)        ; save gfxbase
  76.         beq    .end
  77.         movea.l    d0,a1        ; a1 = gfxbase
  78.         move.l    (gb_ChunkyToPlanarPtr,a1),(c2p_ptr-gfxbase,a0)
  79.         jsr    (_LVOCloseLibrary,a6)
  80. .end
  81.         rts
  82.  
  83. doc2p_1X8
  84. ; inputs:
  85. ; a0.l=src chunky buffer
  86. ; a1.l=dest chipmem bitmap
  87. ; d0.w=width (in pixels - multiple of 32) to convert
  88. ; d1.w=height (in pixels - even)
  89. ; d2.l=modulo from one bitplane to next (copmod-ish)
  90. ; d3.l=modulo from start of one line to start of next (linemod)
  91.  
  92. ; internal:
  93. ; a2=subtract at end of one loop
  94. ; a3=akiko hardware register ptr
  95. ; a5=bitplane modulo, 1 bp to next
  96. ; d3=add at end of line
  97. ; d5=counter
  98.  
  99.         move.l    (c2p_ptr,pc),d4
  100.         beq    .return
  101.         movea.l    d4,a3    ; a3 -> akiko hardware register
  102.  
  103.         movea.l    d2,a5    ; a5 = bpmod
  104.  
  105.         lsl.l    #3,d2    ; 8 bitplanes
  106.         movea.l    d2,a2    ; 8 * bpmod
  107.         suba.l    a5,a2    ; 7 * bpmod
  108.         subq.l    #4,a2    ; a2 = 7 * bpmod - 4
  109.  
  110.         lsr.w    #5,d0    ; num 32 pixels per row
  111.         move.w    d0,d2
  112.         lsl.w    #2,d2    ; num 8 pixels per row (dest bytesperrow)
  113.         ext.l    d2    ; bytesperrow
  114.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  115.  
  116.         subq.w    #1,d1    ; d1 = height - 1
  117.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  118.  
  119. ;;;        movea.l    (gfxbase,pc),a6        ; gfx lib must be open
  120. ;;;        movem.l    d0/d1/a0/a1,-(sp)    ; but when can I close gfx lib?
  121. ;;;        jsr    (_LVOOwnBlitter,a6)    ; gain exclusive use of Akiko
  122. ;;;        movem.l    (sp)+,d0/d1/a0/a1
  123.  
  124. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  125.  
  126. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  127.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  128.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  129.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  130.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  131.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  132.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  133.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  134.  
  135.         move.l    (a3),(a1)    ; plane 0
  136.         adda.l    a5,a1        ; +bpmod
  137.         move.l    (a3),(a1)    ; plane 1
  138.         adda.l    a5,a1        ; +bpmod
  139.         move.l    (a3),(a1)    ; plane 2
  140.         adda.l    a5,a1        ; +bpmod
  141.         move.l    (a3),(a1)    ; plane 3
  142.         adda.l    a5,a1        ; +bpmod
  143.         move.l    (a3),(a1)    ; plane 4
  144.         adda.l    a5,a1        ; +bpmod
  145.         move.l    (a3),(a1)    ; plane 5
  146.         adda.l    a5,a1        ; +bpmod
  147.         move.l    (a3),(a1)    ; plane 6
  148.         adda.l    a5,a1        ; +bpmod
  149.         move.l    (a3),(a1)    ; plane 7
  150.         suba.l    a2,a1        ; -7*bpmod+4
  151.  
  152.         dbra    d5,.innerloop
  153.  
  154.         adda.l    d3,a1        ; dest skip
  155.  
  156.         dbra    d1,.rowloop    ; next row
  157.  
  158. ;;;        jsr    (_LVODisownBlitter,a6)    ; free Akiko
  159. .return
  160.         rts
  161.  
  162.  
  163. doc2p_1X6
  164. ; inputs:
  165. ; a0.l=src chunky buffer
  166. ; a1.l=dest chipmem bitmap
  167. ; d0.w=width (in pixels - multiple of 32) to convert
  168. ; d1.w=height (in pixels - even)
  169. ; d2.l=modulo from one bitplane to next (copmod-ish)
  170. ; d3.l=modulo from start of one line to start of next (linemod)
  171.  
  172. ; internal:
  173. ; a2=subtract at end of one loop
  174. ; a3=akiko hardware register ptr
  175. ; a5=bitplane modulo, 1 bp to next
  176. ; d3=add at end of line
  177. ; d5=counter
  178.  
  179.         move.l    (c2p_ptr,pc),d4
  180.         beq    .return
  181.         movea.l    d4,a3    ; a3 -> akiko hardware register
  182.  
  183.         movea.l    d2,a5    ; a5 = bpmod
  184.  
  185.         lsl.l    #2,d2    ; 6 bitplanes
  186.         movea.l    d2,a2    ; 4 * bpmod
  187.         adda.l    a5,a2    ; 5 * bpmod
  188.         subq.l    #4,a2    ; a2 = 5 * bpmod - 4
  189.  
  190.         lsr.w    #5,d0    ; num 32 pixels per row
  191.         move.w    d0,d2
  192.         lsl.w    #2,d2    ; num 8 pixels per row (dest bytesperrow)
  193.         ext.l    d2    ; bytesperrow
  194.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  195.  
  196.         subq.w    #1,d1    ; d1 = height - 1
  197.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  198.  
  199. ;;;        movea.l    (gfxbase,pc),a6        ; gfx lib must be open
  200. ;;;        movem.l    d0/d1/a0/a1,-(sp)    ; but when can I close gfx lib?
  201. ;;;        jsr    (_LVOOwnBlitter,a6)    ; gain exclusive use of Akiko
  202. ;;;        movem.l    (sp)+,d0/d1/a0/a1
  203.  
  204. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  205.  
  206. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  207.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  208.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  209.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  210.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  211.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  212.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  213.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  214.  
  215.         move.l    (a3),(a1)    ; plane 0
  216.         adda.l    a5,a1        ; +bpmod
  217.         move.l    (a3),(a1)    ; plane 1
  218.         adda.l    a5,a1        ; +bpmod
  219.         move.l    (a3),(a1)    ; plane 2
  220.         adda.l    a5,a1        ; +bpmod
  221.         move.l    (a3),(a1)    ; plane 3
  222.         adda.l    a5,a1        ; +bpmod
  223.         move.l    (a3),(a1)    ; plane 4
  224.         adda.l    a5,a1        ; +bpmod
  225.         move.l    (a3),(a1)    ; plane 5
  226.         suba.l    a2,a1        ; -5*bpmod+4
  227.  
  228.         dbra    d5,.innerloop
  229.  
  230.         adda.l    d3,a1        ; dest skip
  231.  
  232.         dbra    d1,.rowloop    ; next row
  233.  
  234. ;;;        jsr    (_LVODisownBlitter,a6)    ; free Akiko
  235. .return
  236.         rts
  237.  
  238.  
  239. doc2p_2X8
  240. ; inputs:
  241. ; a0.l=src chunky buffer
  242. ; a1.l=dest chipmem bitmap
  243. ; d0.w=width (in pixels - multiple of 32) to convert
  244. ; d1.w=height (in pixels - even)
  245. ; d2.l=modulo from one bitplane to next (copmod-ish)
  246. ; d3.l=modulo from start of one line to start of next (linemod)
  247.  
  248. ; internal:
  249. ; a2=subtract at end of one loop
  250. ; a3=akiko hardware register ptr
  251. ; a5=bitplane modulo, 1 bp to next
  252. ; d3=add at end of line
  253. ; d5=counter
  254.  
  255.         move.l    (c2p_ptr,pc),d4
  256.         beq    .return
  257.         movea.l    d4,a3    ; a3 -> akiko hardware register
  258.  
  259.         movea.l    d2,a5    ; a5 = bpmod
  260.  
  261.         lsl.l    #3,d2    ; 8 bitplanes
  262.         movea.l    d2,a2    ; 8 * bpmod
  263.         suba.l    a5,a2    ; 7 * bpmod
  264.         subq.l    #4,a2    ; a2 = 7 * bpmod - 4
  265.  
  266.         lsr.w    #5,d0    ; num 32 pixels per row
  267.         move.w    d0,d2
  268.         lsl.w    #3,d2    ; num 4 pixels per row (dest bytesperrow)
  269.         ext.l    d2    ; bytesperrow
  270.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  271.  
  272.         subq.l    #4,a5    ; a5 = bpmod - 4
  273.  
  274.         move.l    #$aaaaaaaa,d7
  275.  
  276.         subq.w    #1,d1    ; d1 = height - 1
  277.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  278.  
  279. ;;;        movea.l    (gfxbase,pc),a6        ; gfx lib must be open
  280. ;;;        movem.l    d0/d1/a0/a1,-(sp)    ; but when can I close gfx lib?
  281. ;;;        jsr    (_LVOOwnBlitter,a6)    ; gain exclusive use of Akiko
  282. ;;;        movem.l    (sp)+,d0/d1/a0/a1
  283.  
  284. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  285.  
  286. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  287.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  288.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  289.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  290.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  291.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  292.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  293.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  294.  
  295.         move.l    (a3),d2        ; plane 0 from Akiko
  296.         move.l    d2,d4
  297.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  298.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  299.         move.l    d2,d6
  300.         lsr.l    #1,d6
  301.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  302.         move.l    d2,(a1)+    ; plane 0
  303.         move.l    d4,d6
  304.         add.l    d6,d6
  305.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  306.         move.l    (a3),d2        ; plane 1 from Akiko
  307.         move.l    d6,(a1)        ; plane 0
  308.         adda.l    a5,a1
  309.  
  310.         move.l    d2,d4
  311.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  312.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  313.         move.l    d2,d6
  314.         lsr.l    #1,d6
  315.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  316.         move.l    d2,(a1)+    ; plane 1
  317.         move.l    d4,d6
  318.         add.l    d6,d6
  319.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  320.         move.l    (a3),d2        ; plane 2 from Akiko
  321.         move.l    d6,(a1)        ; plane 1
  322.         adda.l    a5,a1
  323.  
  324.         move.l    d2,d4
  325.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  326.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  327.         move.l    d2,d6
  328.         lsr.l    #1,d6
  329.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  330.         move.l    d2,(a1)+    ; plane 2
  331.         move.l    d4,d6
  332.         add.l    d6,d6
  333.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  334.         move.l    (a3),d2        ; plane 3 from Akiko
  335.         move.l    d6,(a1)        ; plane 2
  336.         adda.l    a5,a1
  337.  
  338.         move.l    d2,d4
  339.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  340.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  341.         move.l    d2,d6
  342.         lsr.l    #1,d6
  343.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  344.         move.l    d2,(a1)+    ; plane 3
  345.         move.l    d4,d6
  346.         add.l    d6,d6
  347.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  348.         move.l    (a3),d2        ; plane 4 from Akiko
  349.         move.l    d6,(a1)        ; plane 3
  350.         adda.l    a5,a1
  351.  
  352.         move.l    d2,d4
  353.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  354.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  355.         move.l    d2,d6
  356.         lsr.l    #1,d6
  357.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  358.         move.l    d2,(a1)+    ; plane 4
  359.         move.l    d4,d6
  360.         add.l    d6,d6
  361.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  362.         move.l    (a3),d2        ; plane 5 from Akiko
  363.         move.l    d6,(a1)        ; plane 4
  364.         adda.l    a5,a1
  365.  
  366.         move.l    d2,d4
  367.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  368.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  369.         move.l    d2,d6
  370.         lsr.l    #1,d6
  371.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  372.         move.l    d2,(a1)+    ; plane 5
  373.         move.l    d4,d6
  374.         add.l    d6,d6
  375.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  376.         move.l    (a3),d2        ; plane 6 from Akiko
  377.         move.l    d6,(a1)        ; plane 5
  378.         adda.l    a5,a1
  379.  
  380.         move.l    d2,d4
  381.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  382.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  383.         move.l    d2,d6
  384.         lsr.l    #1,d6
  385.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  386.         move.l    d2,(a1)+    ; plane 6
  387.         move.l    d4,d6
  388.         add.l    d6,d6
  389.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  390.         move.l    (a3),d2        ; plane 7 from Akiko
  391.         move.l    d6,(a1)        ; plane 6
  392.         adda.l    a5,a1
  393.  
  394.         move.l    d2,d4
  395.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  396.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  397.         move.l    d2,d6
  398.         lsr.l    #1,d6
  399.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  400.         move.l    d2,(a1)+    ; plane 7
  401.         move.l    d4,d6
  402.         add.l    d6,d6
  403.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  404.         move.l    d6,(a1)        ; plane 7
  405.         suba.l    a2,a1        ; -7*bpmod+4
  406.  
  407.         dbra    d5,.innerloop
  408.  
  409.         adda.l    d3,a1        ; dest skip
  410.  
  411.         dbra    d1,.rowloop    ; next row
  412.  
  413. ;;;        jsr    (_LVODisownBlitter,a6) ; free Akiko
  414. .return
  415.         rts
  416.  
  417.  
  418. doc2p_2X6
  419. ; inputs:
  420. ; a0.l=src chunky buffer
  421. ; a1.l=dest chipmem bitmap
  422. ; d0.w=width (in pixels - multiple of 32) to convert
  423. ; d1.w=height (in pixels - even)
  424. ; d2.l=modulo from one bitplane to next (copmod-ish)
  425. ; d3.l=modulo from start of one line to start of next (linemod)
  426.  
  427. ; internal:
  428. ; a2=subtract at end of one loop
  429. ; a3=akiko hardware register ptr
  430. ; a5=bitplane modulo, 1 bp to next
  431. ; d3=add at end of line
  432. ; d5=counter
  433.  
  434.         move.l    (c2p_ptr,pc),d4
  435.         beq    .return
  436.         movea.l    d4,a3    ; a3 -> akiko hardware register
  437.  
  438.         movea.l    d2,a5    ; a5 = bpmod
  439.  
  440.         lsl.l    #2,d2    ; 6 bitplanes
  441.         movea.l    d2,a2    ; 4 * bpmod
  442.         adda.l    a5,a2    ; 5 * bpmod
  443.         subq.l    #4,a2    ; a2 = 5 * bpmod - 4
  444.  
  445.         lsr.w    #5,d0    ; num 32 pixels per row
  446.         move.w    d0,d2
  447.         lsl.w    #3,d2    ; num 4 pixels per row (dest bytesperrow)
  448.         ext.l    d2    ; bytesperrow
  449.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  450.  
  451.         subq.l    #4,a5    ; a5 = bpmod - 4
  452.  
  453.         move.l    #$aaaaaaaa,d7
  454.  
  455.         subq.w    #1,d1    ; d1 = height - 1
  456.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  457.  
  458. ;;;        movea.l    (gfxbase,pc),a6        ; gfx lib must be open
  459. ;;;        movem.l    d0/d1/a0/a1,-(sp)    ; but when can I close gfx lib?
  460. ;;;        jsr    (_LVOOwnBlitter,a6)    ; gain exclusive use of Akiko
  461. ;;;        movem.l    (sp)+,d0/d1/a0/a1
  462.  
  463. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  464.  
  465. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  466.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  467.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  468.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  469.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  470.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  471.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  472.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  473.  
  474.         move.l    (a3),d2        ; plane 0 from Akiko
  475.         move.l    d2,d4
  476.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  477.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  478.         move.l    d2,d6
  479.         lsr.l    #1,d6
  480.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  481.         move.l    d2,(a1)+    ; plane 0
  482.         move.l    d4,d6
  483.         add.l    d6,d6
  484.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  485.         move.l    (a3),d2        ; plane 1 from Akiko
  486.         move.l    d6,(a1)        ; plane 0
  487.         adda.l    a5,a1
  488.  
  489.         move.l    d2,d4
  490.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  491.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  492.         move.l    d2,d6
  493.         lsr.l    #1,d6
  494.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  495.         move.l    d2,(a1)+    ; plane 1
  496.         move.l    d4,d6
  497.         add.l    d6,d6
  498.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  499.         move.l    (a3),d2        ; plane 2 from Akiko
  500.         move.l    d6,(a1)        ; plane 1
  501.         adda.l    a5,a1
  502.  
  503.         move.l    d2,d4
  504.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  505.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  506.         move.l    d2,d6
  507.         lsr.l    #1,d6
  508.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  509.         move.l    d2,(a1)+    ; plane 2
  510.         move.l    d4,d6
  511.         add.l    d6,d6
  512.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  513.         move.l    (a3),d2        ; plane 3 from Akiko
  514.         move.l    d6,(a1)        ; plane 2
  515.         adda.l    a5,a1
  516.  
  517.         move.l    d2,d4
  518.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  519.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  520.         move.l    d2,d6
  521.         lsr.l    #1,d6
  522.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  523.         move.l    d2,(a1)+    ; plane 3
  524.         move.l    d4,d6
  525.         add.l    d6,d6
  526.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  527.         move.l    (a3),d2        ; plane 4 from Akiko
  528.         move.l    d6,(a1)        ; plane 3
  529.         adda.l    a5,a1
  530.  
  531.         move.l    d2,d4
  532.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  533.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  534.         move.l    d2,d6
  535.         lsr.l    #1,d6
  536.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  537.         move.l    d2,(a1)+    ; plane 4
  538.         move.l    d4,d6
  539.         add.l    d6,d6
  540.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  541.         move.l    (a3),d2        ; plane 5 from Akiko
  542.         move.l    d6,(a1)        ; plane 4
  543.         adda.l    a5,a1
  544.  
  545.         move.l    d2,d4
  546.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  547.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  548.         move.l    d2,d6
  549.         lsr.l    #1,d6
  550.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  551.         move.l    d2,(a1)+    ; plane 5
  552.         move.l    d4,d6
  553.         add.l    d6,d6
  554.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  555.         move.l    d6,(a1)        ; plane 5
  556.         suba.l    a2,a1        ; -5*bpmod+4
  557.  
  558.         dbra    d5,.innerloop
  559.  
  560.         adda.l    d3,a1        ; dest skip
  561.  
  562.         dbra    d1,.rowloop    ; next row
  563.  
  564. ;;;        jsr    (_LVODisownBlitter,a6) ; free Akiko
  565. .return
  566.         rts
  567.  
  568.         end
  569.