home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1997 #2 / amigaacscoverdisc / games / alienbreed3d2 / source_4000 / newchunky.s < prev    next >
Text File  |  1997-01-31  |  16KB  |  675 lines

  1. CHUNKYTOPLANAR:
  2.  
  3.  tst.b d5
  4.  beq.s .noteleffect
  5.  
  6.  move.w #8,TELVAL
  7.  
  8. .noteleffect
  9.  
  10.  tst.w TELVAL
  11.  beq NEWCHUNKY
  12.  
  13.  sub.w #1,TELVAL
  14.  move.w TELVAL,d5
  15.  
  16.  bra NEWCHUNKYTEL
  17.  
  18. USEDOUG: dc.w 0
  19.  
  20. MODUL: dc.w 0
  21. HTC: dc.w 0
  22. WTC: dc.w 0
  23. SCRMOD: dc.w 0
  24. TELVAL: dc.w 0
  25. BBUFFER: dc.l 0
  26.  
  27. SCREENPTRFLIG: dc.l 0
  28. CHUNKPROGRESS: dc.w 9
  29.  
  30. NEWCHUNKY
  31.         ;a0 = byte pixels , a1 = plane 1
  32.         ;256 colour / 8 bitplane
  33.  
  34.         tst.b d4
  35.         bne DOUBWIDTHCHUNK
  36.  
  37.         move.w d2,MODUL (in fastbuffer)
  38.         move.w d0,WTC (pixels/8)
  39.  
  40.         move.w d1,HTC (lines)
  41.         move.w d3,SCRMOD (bytes)
  42.         
  43.         move.l #10240,PlaneSize
  44.         
  45.         move.w WTC,d6
  46.  
  47.     move.l    #$55555555,a3
  48.     move.l    #$0f0f0f0f,a4
  49.     move.l    #$00ff00ff,a5
  50.  
  51.     move.l    BBuffer,a1
  52.  
  53.     move.l    (a0)+,d0
  54.     move.l    (a0)+,d1
  55.     move.l    a4,d4
  56.     move.l    a4,d5
  57.     and.l    d0,d4
  58.     and.l    d1,d5
  59.     eor.l    d4,d0
  60.     eor.l    d5,d1
  61.     lsl.l    #4,d4
  62.     lsr.l    #4,d1
  63.     or.l    d5,d4
  64.     or.l    d0,d1
  65.  
  66.     move.l    (a0)+,d0
  67.     move.l    (a0)+,d2
  68.     move.l    a4,d3
  69.     move.l    a4,d5
  70.     and.l    d0,d3
  71.     and.l    d2,d5
  72.     eor.l    d3,d0
  73.     eor.l    d5,d2
  74.     lsl.l    #4,d3
  75.     lsr.l    #4,d2
  76.     or.l    d5,d3
  77.     or.l    d0,d2
  78.  
  79.     move.l    a5,d0
  80.     move.l    a5,d5
  81.     and.l    d4,d0
  82.     and.l    d3,d5
  83.     eor.l    d0,d4
  84.     eor.l    d5,d3
  85.     lsl.l    #8,d0
  86.     lsr.l    #8,d3
  87.     or.l    d3,d4
  88.     or.l    d5,d0
  89.     move.l    a3,d3
  90.     move.l    a3,d5
  91.     and.l    d4,d3
  92.     and.l    d0,d5
  93.     eor.l    d3,d4
  94.     eor.l    d5,d0
  95.     add.l    d3,d3
  96.     lsr.l    #1,d0
  97.     or.l    d5,d3
  98.     or.l    d4,d0
  99.     move.l    d3,(a1)+
  100.     move.l    a5,d7
  101.     move.l    a5,d5
  102.     and.l    d1,d7
  103.     and.l    d2,d5
  104.     eor.l    d7,d1
  105.     eor.l    d5,d2
  106.     lsl.l    #8,d7
  107.     lsr.l    #8,d2
  108.     or.l    d2,d1
  109.     or.l    d5,d7
  110.     move.l    a3,d3
  111.     move.l    a3,d5
  112.     and.l    d1,d3
  113.     and.l    d7,d5
  114.     eor.l    d3,d1
  115.     move.l    d0,(a1)+
  116.     eor.l    d5,d7
  117.     add.l    d3,d3
  118.     lsr.l    #1,d7
  119.     or.l    d5,d3
  120.     or.l    d1,d7
  121.     subq.w    #2,d6
  122.     bmi    .x2
  123.  
  124. .x    move.l    (a0)+,d0
  125.     move.l    (a0)+,d1
  126.  
  127.     move.l    a4,d4
  128.     move.l    a4,d5
  129.     and.l    d0,d4
  130.     and.l    d1,d5
  131.     eor.l    d4,d0
  132.     eor.l    d5,d1
  133.     lsl.l    #4,d4
  134.     lsr.l    #4,d1
  135.     or.l    d5,d4
  136.     or.l    d0,d1
  137.  
  138.     move.l    (a0)+,d0
  139.     move.l    (a0)+,d2
  140.     move.l    d3,(a1)+
  141.     move.l    a4,d3
  142.     move.l    a4,d5
  143.     and.l    d0,d3
  144.     and.l    d2,d5
  145.     eor.l    d3,d0
  146.     eor.l    d5,d2
  147.     lsl.l    #4,d3
  148.     lsr.l    #4,d2
  149.     or.l    d5,d3
  150.     or.l    d0,d2
  151.  
  152.     move.l    a5,d0
  153.     move.l    a5,d5
  154.     and.l    d4,d0
  155.     and.l    d3,d5
  156.     eor.l    d0,d4
  157.     move.l    d7,(a1)+
  158.     eor.l    d5,d3
  159.     lsl.l    #8,d0
  160.     lsr.l    #8,d3
  161.     or.l    d3,d4
  162.     or.l    d5,d0
  163.     move.l    a3,d3
  164.     move.l    a3,d5
  165.     and.l    d4,d3
  166.     and.l    d0,d5
  167.     eor.l    d3,d4
  168.     eor.l    d5,d0
  169.     add.l    d3,d3
  170.     lsr.l    #1,d0
  171.     or.l    d5,d3
  172.     or.l    d4,d0
  173.     move.l    d3,(a1)+
  174.  
  175.     move.l    a5,d7            ;2
  176.     move.l    a5,d5            ;2
  177.     and.l    d1,d7            ;2
  178.     and.l    d2,d5            ;2
  179.     eor.l    d7,d1            ;2
  180.     eor.l    d5,d2            ;2
  181.     lsl.l    #8,d7            ;4
  182.     lsr.l    #8,d2            ;4
  183.     or.l    d2,d1            ;2
  184.     or.l    d5,d7            ;2 = 24
  185.     move.l    d0,(a1)+        ;-
  186.     move.l    a3,d3            ;2
  187.     move.l    a3,d5            ;2
  188.     and.l    d1,d3            ;2
  189.     and.l    d7,d5            ;2
  190.     eor.l    d3,d1            ;2
  191.     eor.l    d5,d7            ;2
  192.     add.l    d3,d3            ;2
  193.     lsr.l    #1,d7            ;4
  194.     or.l    d5,d3            ;2
  195.     or.l    d1,d7            ;2 = 22
  196.     dbra    d6,.x            ;6
  197. .x2
  198.     move.l    d2,(a1)+
  199.     move.l    d7,(a1)+
  200.         
  201.     move.w #0,CHUNKPROGRESS
  202.         
  203.         rts
  204.  
  205. DOUBWIDTHCHUNK:
  206.         move.w d2,MODUL
  207.         move.w d0,WTC
  208.  
  209.         move.w d1,HTC
  210.         move.w d3,SCRMOD
  211.         
  212.         Movem.l    d2-d7/a2-a6,-(a7)
  213.         Movem.l    .Const(pc),d5-d7
  214.         
  215.         move.l a1,a2
  216.         adda.w WTC,a2
  217.         addq #1,a2        ; end of line to convert
  218.         
  219.         Lea    40*256(a1),a3            Plane2 
  220.         Lea    2*40*256(a1),a4            Plane3
  221.         Lea    2*40*256(a4),a5            Plane5
  222.         Lea    2*40*256(a5),a6            Plane7
  223.     Bra.s    .BPPLoop
  224. .Const        Dc.l    $0f0f0f0f,$55555555,$3333cccc
  225.         Cnop    0,4
  226.  
  227.  
  228. .BPPLoop    Move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  229.  
  230.         and.l #$ff00ff00,d0
  231.         move.l d0,d2
  232.         lsr.l #8,d2
  233.         or.l d2,d0
  234.  
  235.         Move.l    d0,d2        ;  4
  236.         And.l    d5,d2        ;  8 d5=$0f0f0f0f
  237.         Eor.l    d2,d0        ;  8
  238.         Move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  239.         and.l #$ff00ff00,d1
  240.         move.l d1,d3
  241.         lsr.l #8,d3
  242.         or.l d3,d1
  243. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  244. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  245.  
  246.         Move.l    d1,d3        ;  4
  247.         And.l    d5,d3        ;  8 d5=$0f0f0f0f
  248.         Eor.l    d3,d1        ;  8
  249. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  250. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  251. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  252. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  253.  
  254.         Lsl.l    #4,d2        ; 16
  255.         Lsr.l    #4,d1        ; 16
  256.         Or.l    d3,d2        ;  8
  257.         Or.l    d1,d0        ;  8
  258. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  259. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  260.  
  261.         Move.l    d0,d1        ;  4
  262.         Move.l    d2,d3        ;  4
  263.         And.l    d7,d1        ;  8    ;128
  264.         And.l    d7,d3        ;  8
  265.         Eor.l    d1,d0        ;  8
  266.         Eor.l    d3,d2        ;  8
  267.         Lsr.w    #2,d1        ; 10    
  268.         Lsr.w    #2,d3        ; 10
  269.         Swap    d1        ;  4
  270.         Swap    d3        ;  4
  271.         Lsl.w    #2,d1        ; 10
  272.         Lsl.w    #2,d3        ; 10
  273. ; d0 = a7a6....e7e6.... b7b6....f7f6.... ....c5c4....g5g4 ....d5d4....h5h4
  274. ; d1 = ....c7c6....g7g6 ....d7d6....h7h6 a5a4....e5e4.... b5b4....f5f4.... 
  275.  
  276.         Or.l    d1,d0        ;  8
  277.         Or.l    d3,d2        ;  8
  278. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 , d2=32/10
  279.  
  280.         Move.l    d0,d1        ;  4
  281.         Lsr.l    #7,d1        ; 22
  282. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 
  283. ; d1 = ..............a7 a6c7c6e7e6g7g6b7 b6d7d6f7f6h7h6a5 a4c5c4e5e4g5g4b5
  284.  
  285.         Move.l    d0,d3        ;  4
  286.         Move.l    d1,d4        ;  4
  287.         And.l    d6,d0        ;  8    ;258
  288.         And.l    d6,d1        ;  8
  289.         Eor.l    d0,d3        ;  8
  290.         Eor.l    d1,d4        ;  8
  291. ; d0 = ..a6..c6..e6..g6 ..b6..d6..f6..h6 ..a4..c4..e4..g4 ..b4..d4..f4..h4 
  292. ; d3 = a7..c7..e7..g7.. b7..d7..f7..h7.. a5..c5..e5..g5.. b5..d5..f5..h5.. 
  293. ; d1 = ..............a7 ..c7..e7..g7..b7 ..d7..f7..h7..a5 ..c5..e5..g5..b5
  294. ; d4 = ................ a6..c6..e6..g6.. b6..d6..f6..h6.. a4..c4..e4..g4..
  295.  
  296.         Or.l    d4,d0        ;  8
  297.         Or.l    d3,d1        ;  8
  298.         Lsr.l    #1,d1        ; 10
  299. ; d0 = ..a6..c6..e6..g6 a6b6c6d6e6f6g6h6 b6a4d6c4f6e4h6g4 a4b4c4d4e4f4g4h4
  300. ; d1 = ..a7..c7..e7..g7 a7b7c7d7e7f7g7h7 b7a5d7c5f7e5h7g5 a5b5c5d5e5f5g5h5
  301.  
  302.         move.b    d1,40*256(a5)    ; 12 plane 6
  303.         swap    d1        ;  4
  304.         move.b    d1,40*256(a6)    ; 12 plane 8
  305.         move.b    d0,(a5)+    ;  8 plane 5
  306.         swap    d0        ;  4
  307.         move.b    d0,(a6)+    ;  8 plane 7
  308.  
  309.         Move.l    d2,d1        ;  4
  310.         Lsr.l    #7,d1        ; 22
  311. ; d2 = a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2 a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 
  312. ; d1 = ..............a3 a2c3c2e3e2g3g2b3 b2d3d2f3f2h3h2a1 a0c1c0e1e0g1g0b1
  313.  
  314.         Move.l    d2,d3        ;  4
  315.         Move.l    d1,d4        ;  4
  316.         And.l    d6,d2        ;  8
  317.         And.l    d6,d1        ;  8
  318.         Eor.l    d2,d3        ;  8
  319.         Eor.l    d1,d4        ;  8
  320. ; d2 = ..a2..c2..e2..g2 ..b2..d2..f2..h2 ..a0..c0..e0..g0 ..b0..d0..f0..h0 
  321. ; d3 = a3..c3..e3..g3.. b3..d3..f3..h3.. a1..c1..e1..g1.. b1..d1..f1..h1.. 
  322. ; d1 = ..............a3 ..c3..e3..g3..b3 ..d3..f3..h3..a1 ..c1..e1..g1..b1
  323. ; d4 = ................ a2..c2..e2..g2.. b2..d2..f2..h2.. a0..c0..e0..g0..        
  324.  
  325.         Or.l    d4,d2        ;  8
  326.         Or.l    d3,d1        ;  8
  327.         Lsr.l    #1,d1        ; 10    ;448
  328. ; d2 = ..a2..c2..e2..g2 a2b2c2d2e2f2g2h2 b2a0d2c0f2e0h2g0 a0b0c0d0e0f0g0h0
  329. ; d1 = ..a3..c3..e3..g3 a3b3c3d3e3f3g3h3 b3a1d3c1f3e1h3g1 a1b1c1d1e1f1g1h1
  330.         move.b    d1,(a3)+    ; 12 plane 2
  331.         swap    d1        ;  4
  332.         move.b    d1,40*256(a4)    ;  8 plane 4
  333.         move.b    d2,(a1)+    ;  8 plane 1
  334.         swap    d2        ;  4
  335.         move.b    d2,(a4)+    ;  8 plane 3 ;126 bytws
  336.         cmpa.l    a1,a2        ;  6    
  337.     bne    .BPPLoop        ; 10
  338.     
  339.     move.w SCRMOD,d0
  340.     add.w d0,a1
  341.     add.w d0,a3
  342.     add.w d0,a4
  343.     add.w d0,a5
  344.     add.w d0,a6
  345.     move.w WTC,d0
  346.     lea 1(a1,d0.w),a2
  347.     add.w MODUL,a0    
  348.     subq.w #1,HTC
  349.     bge .BPPLoop
  350.     
  351.         movem.l    (a7)+,d2-d7/a2-a6
  352.         rts
  353.  
  354.  
  355. *        Length    Cycles    Cyc/pix.
  356. *MainLoop    132     508    63.5 
  357. *Double Main    258     1000    62.5    
  358.  
  359. *Seeing as we will probably be averaging at least 50000 pixels per "frame" any 
  360. *cycle saving is significant
  361.  
  362.  
  363. NEWCHUNKYTEL
  364.         ;a0 = byte pixels , a1 = plane 1
  365.         ;256 colour / 8 bitplane
  366.  
  367.         tst.b d4
  368.         bne DOUBWIDTHCHUNKTEL
  369.  
  370.         move.w d2,MODUL
  371.         move.w d0,WTC
  372.  
  373.         move.w d1,HTC
  374.         move.w d3,SCRMOD
  375.         
  376.         Movem.l    d2-d7/a2-a6,-(a7)
  377.         move.l #SHIMMER,a6
  378.         asl.w #8,d5
  379.         asl.w #2,d5
  380.         add.w d5,a6
  381.         move.l a6,STARTSHIM
  382.         
  383.         Movem.l    .Const(pc),d5-d7
  384.         
  385.         move.l a1,a2
  386.         adda.w WTC,a2
  387.         addq #1,a2        ; end of line to convert
  388.         
  389.         Lea    2*40*256(a1),a3    Plane3 
  390.         Lea    2*40*256(a3),a4    Plane5
  391.         Lea    2*40*256(a4),a5    Plane7
  392.         
  393.         
  394.     Bra.s    .BPPLoop
  395. .Const        Dc.l    $0f0f0f0f,$55555555,$3333cccc
  396.         Cnop    0,4
  397.  
  398.  
  399. .BPPLoop    
  400.         move.w (a6)+,d0
  401.         Move.l    (a0,d0.w),d0    ; 12 get next 4 chunky pixels in d0
  402.         Move.l    d0,d2        ;  4
  403.         move.l (a6)+,d1
  404.         And.l    d5,d2        ;  8 d5=$0f0f0f0f
  405.         Eor.l    d2,d0        ;  8
  406.         Move.l    4(a0,d1.w),d1    ; 12 get next 4 chunky pixels in d1
  407.         addq #8,a0
  408. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  409. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  410.  
  411.         Move.l    d1,d3        ;  4
  412.         And.l    d5,d3        ;  8 d5=$0f0f0f0f
  413.         Eor.l    d3,d1        ;  8
  414. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  415. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  416. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  417. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  418.  
  419.         Lsl.l    #4,d2        ; 16
  420.         Lsr.l    #4,d1        ; 16
  421.         Or.l    d3,d2        ;  8
  422.         Or.l    d1,d0        ;  8
  423. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  424. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  425.  
  426.         Move.l    d0,d1        ;  4
  427.         Move.l    d2,d3        ;  4
  428.         And.l    d7,d1        ;  8    ;128
  429.         And.l    d7,d3        ;  8
  430.         Eor.l    d1,d0        ;  8
  431.         Eor.l    d3,d2        ;  8
  432.         Lsr.w    #2,d1        ; 10    
  433.         Lsr.w    #2,d3        ; 10
  434.         Swap    d1        ;  4
  435.         Swap    d3        ;  4
  436.         Lsl.w    #2,d1        ; 10
  437.         Lsl.w    #2,d3        ; 10
  438. ; d0 = a7a6....e7e6.... b7b6....f7f6.... ....c5c4....g5g4 ....d5d4....h5h4
  439. ; d1 = ....c7c6....g7g6 ....d7d6....h7h6 a5a4....e5e4.... b5b4....f5f4.... 
  440.  
  441.         Or.l    d1,d0        ;  8
  442.         Or.l    d3,d2        ;  8
  443. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 , d2=32/10
  444.  
  445.         Move.l    d0,d1        ;  4
  446.         Lsr.l    #7,d1        ; 22
  447. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 
  448. ; d1 = ..............a7 a6c7c6e7e6g7g6b7 b6d7d6f7f6h7h6a5 a4c5c4e5e4g5g4b5
  449.  
  450.         Move.l    d0,d3        ;  4
  451.         Move.l    d1,d4        ;  4
  452.         And.l    d6,d0        ;  8    ;258
  453.         And.l    d6,d1        ;  8
  454.         Eor.l    d0,d3        ;  8
  455.         Eor.l    d1,d4        ;  8
  456. ; d0 = ..a6..c6..e6..g6 ..b6..d6..f6..h6 ..a4..c4..e4..g4 ..b4..d4..f4..h4 
  457. ; d3 = a7..c7..e7..g7.. b7..d7..f7..h7.. a5..c5..e5..g5.. b5..d5..f5..h5.. 
  458. ; d1 = ..............a7 ..c7..e7..g7..b7 ..d7..f7..h7..a5 ..c5..e5..g5..b5
  459. ; d4 = ................ a6..c6..e6..g6.. b6..d6..f6..h6.. a4..c4..e4..g4..
  460.  
  461.         Or.l    d4,d0        ;  8
  462.         Or.l    d3,d1        ;  8
  463.         Lsr.l    #1,d1        ; 10
  464. ; d0 = ..a6..c6..e6..g6 a6b6c6d6e6f6g6h6 b6a4d6c4f6e4h6g4 a4b4c4d4e4f4g4h4
  465. ; d1 = ..a7..c7..e7..g7 a7b7c7d7e7f7g7h7 b7a5d7c5f7e5h7g5 a5b5c5d5e5f5g5h5
  466.  
  467.         move.b    d1,40*256(a4)    ; 12 plane 6
  468.         swap    d1        ;  4
  469.         move.b    d1,40*256(a5)    ; 12 plane 8
  470.         move.b    d0,(a4)+    ;  8 plane 5
  471.         swap    d0        ;  4
  472.         move.b    d0,(a5)+    ;  8 plane 7
  473.  
  474.         Move.l    d2,d1        ;  4
  475.         Lsr.l    #7,d1        ; 22
  476. ; d2 = a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2 a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 
  477. ; d1 = ..............a3 a2c3c2e3e2g3g2b3 b2d3d2f3f2h3h2a1 a0c1c0e1e0g1g0b1
  478.  
  479.         Move.l    d2,d3        ;  4
  480.         Move.l    d1,d4        ;  4
  481.         And.l    d6,d2        ;  8
  482.         And.l    d6,d1        ;  8
  483.         Eor.l    d2,d3        ;  8
  484.         Eor.l    d1,d4        ;  8
  485. ; d2 = ..a2..c2..e2..g2 ..b2..d2..f2..h2 ..a0..c0..e0..g0 ..b0..d0..f0..h0 
  486. ; d3 = a3..c3..e3..g3.. b3..d3..f3..h3.. a1..c1..e1..g1.. b1..d1..f1..h1.. 
  487. ; d1 = ..............a3 ..c3..e3..g3..b3 ..d3..f3..h3..a1 ..c1..e1..g1..b1
  488. ; d4 = ................ a2..c2..e2..g2.. b2..d2..f2..h2.. a0..c0..e0..g0..        
  489.  
  490.         Or.l    d4,d2        ;  8
  491.         Or.l    d3,d1        ;  8
  492.         Lsr.l    #1,d1        ; 10    ;448
  493. ; d2 = ..a2..c2..e2..g2 a2b2c2d2e2f2g2h2 b2a0d2c0f2e0h2g0 a0b0c0d0e0f0g0h0
  494. ; d1 = ..a3..c3..e3..g3 a3b3c3d3e3f3g3h3 b3a1d3c1f3e1h3g1 a1b1c1d1e1f1g1h1
  495.         move.b    d1,40*256(a1)    ; 12 plane 2
  496.         swap    d1        ;  4
  497.         move.b    d1,40*256(a3)    ;  8 plane 4
  498.         move.b    d2,(a1)+    ;  8 plane 1
  499.         swap    d2        ;  4
  500.         move.b    d2,(a3)+    ;  8 plane 3 ;126 bytws
  501.         cmpa.l    a1,a2        ;  6    
  502.     bne    .BPPLoop        ; 10
  503.     
  504.     move.l a6,d0
  505.     sub.l STARTSHIM,d0
  506.     and.l #255*2,d0
  507.     add.l STARTSHIM,d0
  508.     move.l d0,a6
  509.     
  510.     move.w SCRMOD,d0
  511.     add.w d0,a1
  512.     add.w d0,a3
  513.     add.w d0,a4
  514.     add.w d0,a5
  515.     move.w WTC,d0
  516.     lea 1(a1,d0.w),a2
  517.     add.w MODUL,a0    
  518.     subq.w #1,HTC
  519.     bge .BPPLoop
  520.     
  521.         movem.l    (a7)+,d2-d7/a2-a6
  522.         rts
  523.  
  524. DOUBWIDTHCHUNKTEL:
  525.         move.w d2,MODUL
  526.         move.w d0,WTC
  527.  
  528.         move.w d1,HTC
  529.         move.w d3,SCRMOD
  530.         
  531.         Movem.l    d2-d7/a2-a6,-(a7)
  532.         Movem.l    .Const(pc),d5-d7
  533.         
  534.         move.l a1,a2
  535.         adda.w WTC,a2
  536.         addq #1,a2        ; end of line to convert
  537.         
  538.         Lea    40*256(a1),a3            Plane2 
  539.         Lea    2*40*256(a1),a4            Plane3
  540.         Lea    2*40*256(a4),a5            Plane5
  541.         Lea    2*40*256(a5),a6            Plane7
  542.     Bra.s    .BPPLoop
  543. .Const        Dc.l    $0f0f0f0f,$55555555,$3333cccc
  544.         Cnop    0,4
  545.  
  546.  
  547. .BPPLoop    Move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  548.  
  549.         and.l #$ff00ff00,d0
  550.         move.l d0,d2
  551.         lsr.l #8,d2
  552.         or.l d2,d0
  553.  
  554.         Move.l    d0,d2        ;  4
  555.         And.l    d5,d2        ;  8 d5=$0f0f0f0f
  556.         Eor.l    d2,d0        ;  8
  557.         Move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  558.         and.l #$ff00ff00,d1
  559.         move.l d1,d3
  560.         lsr.l #8,d3
  561.         or.l d3,d1
  562. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  563. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  564.  
  565.         Move.l    d1,d3        ;  4
  566.         And.l    d5,d3        ;  8 d5=$0f0f0f0f
  567.         Eor.l    d3,d1        ;  8
  568. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  569. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  570. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  571. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  572.  
  573.         Lsl.l    #4,d2        ; 16
  574.         Lsr.l    #4,d1        ; 16
  575.         Or.l    d3,d2        ;  8
  576.         Or.l    d1,d0        ;  8
  577. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  578. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  579.  
  580.         Move.l    d0,d1        ;  4
  581.         Move.l    d2,d3        ;  4
  582.         And.l    d7,d1        ;  8    ;128
  583.         And.l    d7,d3        ;  8
  584.         Eor.l    d1,d0        ;  8
  585.         Eor.l    d3,d2        ;  8
  586.         Lsr.w    #2,d1        ; 10    
  587.         Lsr.w    #2,d3        ; 10
  588.         Swap    d1        ;  4
  589.         Swap    d3        ;  4
  590.         Lsl.w    #2,d1        ; 10
  591.         Lsl.w    #2,d3        ; 10
  592. ; d0 = a7a6....e7e6.... b7b6....f7f6.... ....c5c4....g5g4 ....d5d4....h5h4
  593. ; d1 = ....c7c6....g7g6 ....d7d6....h7h6 a5a4....e5e4.... b5b4....f5f4.... 
  594.  
  595.         Or.l    d1,d0        ;  8
  596.         Or.l    d3,d2        ;  8
  597. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 , d2=32/10
  598.  
  599.         Move.l    d0,d1        ;  4
  600.         Lsr.l    #7,d1        ; 22
  601. ; d0 = a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6 a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 
  602. ; d1 = ..............a7 a6c7c6e7e6g7g6b7 b6d7d6f7f6h7h6a5 a4c5c4e5e4g5g4b5
  603.  
  604.         Move.l    d0,d3        ;  4
  605.         Move.l    d1,d4        ;  4
  606.         And.l    d6,d0        ;  8    ;258
  607.         And.l    d6,d1        ;  8
  608.         Eor.l    d0,d3        ;  8
  609.         Eor.l    d1,d4        ;  8
  610. ; d0 = ..a6..c6..e6..g6 ..b6..d6..f6..h6 ..a4..c4..e4..g4 ..b4..d4..f4..h4 
  611. ; d3 = a7..c7..e7..g7.. b7..d7..f7..h7.. a5..c5..e5..g5.. b5..d5..f5..h5.. 
  612. ; d1 = ..............a7 ..c7..e7..g7..b7 ..d7..f7..h7..a5 ..c5..e5..g5..b5
  613. ; d4 = ................ a6..c6..e6..g6.. b6..d6..f6..h6.. a4..c4..e4..g4..
  614.  
  615.         Or.l    d4,d0        ;  8
  616.         Or.l    d3,d1        ;  8
  617.         Lsr.l    #1,d1        ; 10
  618. ; d0 = ..a6..c6..e6..g6 a6b6c6d6e6f6g6h6 b6a4d6c4f6e4h6g4 a4b4c4d4e4f4g4h4
  619. ; d1 = ..a7..c7..e7..g7 a7b7c7d7e7f7g7h7 b7a5d7c5f7e5h7g5 a5b5c5d5e5f5g5h5
  620.  
  621.         move.b    d1,40*256(a5)    ; 12 plane 6
  622.         swap    d1        ;  4
  623.         move.b    d1,40*256(a6)    ; 12 plane 8
  624.         move.b    d0,(a5)+    ;  8 plane 5
  625.         swap    d0        ;  4
  626.         move.b    d0,(a6)+    ;  8 plane 7
  627.  
  628.         Move.l    d2,d1        ;  4
  629.         Lsr.l    #7,d1        ; 22
  630. ; d2 = a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2 a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 
  631. ; d1 = ..............a3 a2c3c2e3e2g3g2b3 b2d3d2f3f2h3h2a1 a0c1c0e1e0g1g0b1
  632.  
  633.         Move.l    d2,d3        ;  4
  634.         Move.l    d1,d4        ;  4
  635.         And.l    d6,d2        ;  8
  636.         And.l    d6,d1        ;  8
  637.         Eor.l    d2,d3        ;  8
  638.         Eor.l    d1,d4        ;  8
  639. ; d2 = ..a2..c2..e2..g2 ..b2..d2..f2..h2 ..a0..c0..e0..g0 ..b0..d0..f0..h0 
  640. ; d3 = a3..c3..e3..g3.. b3..d3..f3..h3.. a1..c1..e1..g1.. b1..d1..f1..h1.. 
  641. ; d1 = ..............a3 ..c3..e3..g3..b3 ..d3..f3..h3..a1 ..c1..e1..g1..b1
  642. ; d4 = ................ a2..c2..e2..g2.. b2..d2..f2..h2.. a0..c0..e0..g0..        
  643.  
  644.         Or.l    d4,d2        ;  8
  645.         Or.l    d3,d1        ;  8
  646.         Lsr.l    #1,d1        ; 10    ;448
  647. ; d2 = ..a2..c2..e2..g2 a2b2c2d2e2f2g2h2 b2a0d2c0f2e0h2g0 a0b0c0d0e0f0g0h0
  648. ; d1 = ..a3..c3..e3..g3 a3b3c3d3e3f3g3h3 b3a1d3c1f3e1h3g1 a1b1c1d1e1f1g1h1
  649.         move.b    d1,(a3)+    ; 12 plane 2
  650.         swap    d1        ;  4
  651.         move.b    d1,40*256(a4)    ;  8 plane 4
  652.         move.b    d2,(a1)+    ;  8 plane 1
  653.         swap    d2        ;  4
  654.         move.b    d2,(a4)+    ;  8 plane 3 ;126 bytws
  655.         cmpa.l    a1,a2        ;  6    
  656.     bne    .BPPLoop        ; 10
  657.     
  658.     move.w SCRMOD,d0
  659.     add.w d0,a1
  660.     add.w d0,a3
  661.     add.w d0,a4
  662.     add.w d0,a5
  663.     add.w d0,a6
  664.     move.w WTC,d0
  665.     lea 1(a1,d0.w),a2
  666.     add.w MODUL,a0    
  667.     subq.w #1,HTC
  668.     bge .BPPLoop
  669.     
  670.         movem.l    (a7)+,d2-d7/a2-a6
  671.         rts
  672.  
  673. STARTSHIM: dc.l 0
  674. SHIMMER: incbin "ab3:includes/shimmerfile"
  675.