home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / asm / DemoStartUP.lha / DemoStartUPv1.0 / sources / c2p.asm < prev    next >
Encoding:
Assembly Source File  |  2001-05-02  |  12.7 KB  |  830 lines

  1. ; - [ c2p / Mikael Kalms 1998-1999 / ] -
  2.  
  3.     xdef    _C2P
  4.     xdef    _InitC2P
  5.  
  6.     xref    _CPU
  7.     
  8. ;
  9. ; 1999-01-08
  10. ;
  11. ; c2p1x1_8_c5_030
  12. ;
  13. ; 1.22vbl [all dma off] on Bliz1230-IV@50
  14. ;
  15.  
  16.     IFND    BPLX
  17. BPLX    EQU    320
  18.     ENDC
  19.     IFND    BPLY
  20. BPLY    EQU    256
  21.     ENDC
  22.     IFND    BPLSIZE
  23. BPLSIZE    EQU    BPLX*BPLY/8
  24.     ENDC
  25.     IFND    CHUNKYXMAX
  26. CHUNKYXMAX EQU    BPLX
  27.     ENDC
  28.     IFND    CHUNKYYMAX
  29. CHUNKYYMAX EQU    BPLY
  30.     ENDC
  31.  
  32.     section    code,code
  33.  
  34. ; d0.w    chunkyx [chunky-pixels]
  35. ; d1.w    chunkyy [chunky-pixels]
  36. ; d2.w    (scroffsx) [screen-pixels]
  37. ; d3.w    scroffsy [screen-pixels]
  38. ; d4.w    (rowlen) [bytes] -- offset between one row and the next in a bpl
  39. ; d5.l    (bplsize) [bytes] -- offset between one row in one bpl and the next bpl
  40.  
  41. _InitC2P
  42.     move.w    #CHUNKYXMAX,d0
  43.     move.w    #CHUNKYYMAX,d1
  44.     moveq    #0,d2            ; Not used by this c2p
  45.     moveq    #0,d3            ;         -"-
  46.     move.l    #BPLX/8,d4        ;         -"-
  47.     move.l    #BPLSIZE,d5        ; Only partially used by this c2p
  48.     move.l    #CHUNKYXMAX,d6        ; Not used by this c2p
  49.  
  50.     cmp.l    #68040,_CPU
  51.     blt.s    .030
  52.  
  53.     jsr    c2p1x1_8_c5_040_init
  54.     rts
  55. .030
  56.     jsr    c2p1x1_8_c5_030_init
  57.     rts
  58.  
  59. c2p1x1_8_c5_030_init
  60.     movem.l    d2-d3,-(sp)
  61.     andi.l    #$ffff,d0
  62.     mulu.w    d0,d3
  63.     lsr.l    #3,d3
  64.     move.l    d3,c2p1x1_8_c5_030_scroffs
  65.     mulu.w    d0,d1
  66.     move.l    d1,c2p1x1_8_c5_030_pixels
  67.     movem.l    (sp)+,d2-d3
  68.     rts
  69.  
  70. ; a0    c2pscreen
  71. ; a1    bitplanes
  72.  
  73. _C2P
  74.     cmp.l    #68040,_CPU
  75.     blt.s    c2p1x1_8_c5_030
  76.     bra.s    c2p1x1_8_c5_040
  77.     
  78. c2p1x1_8_c5_030
  79.     movem.l    d2-d7/a2-a6,-(sp)
  80.  
  81.     move.l    #$00ff00ff,a6
  82.  
  83.     add.w    #BPLSIZE,a1
  84.     add.l    c2p1x1_8_c5_030_scroffs,a1
  85.  
  86.     lea    c2p1x1_8_c5_030_fastbuf,a3
  87.  
  88.     move.l    c2p1x1_8_c5_030_pixels,a2
  89.     add.l    a0,a2
  90.     cmp.l    a0,a2
  91.     beq    .none
  92.  
  93.     addq.l    #4,a2
  94.     move.l    a1,-(sp)
  95.  
  96.     move.l    #$f0f0f0f0,d6
  97.  
  98.     move.l    (a0)+,d2
  99.     move.l    d2,d7
  100.     lsl.l    #4,d7
  101.     move.l    (a0)+,d0
  102.     move.l    (a0)+,d3
  103.     move.l    (a0)+,d1
  104.     eor.l    d0,d7
  105.     and.l    d6,d7
  106.     eor.l    d7,d0
  107.     lsr.l    #4,d7
  108.     eor.l    d7,d2
  109.     move.l    d3,d7
  110.     lsl.l    #4,d7
  111.     eor.l    d1,d7
  112.     and.l    d6,d7
  113.     eor.l    d7,d1
  114.     move.l    d2,(a3)+
  115.     lsr.l    #4,d7
  116.     eor.l    d7,d3
  117.     move.l    d3,(a3)+
  118.  
  119.     move.l    (a0)+,d4
  120.     move.l    d4,d7
  121.     lsl.l    #4,d7
  122.     move.l    (a0)+,d2
  123.     move.l    (a0)+,d5
  124.     move.l    (a0)+,d3
  125.     eor.l    d2,d7
  126.     and.l    d6,d7
  127.     eor.l    d7,d2
  128.     lsr.l    #4,d7
  129.     eor.l    d7,d4
  130.     move.l    d5,d7
  131.     lsl.l    #4,d7
  132.     eor.l    d3,d7
  133.     and.l    d6,d7
  134.     eor.l    d7,d3
  135.     move.l    d4,(a3)+
  136.     lsr.l    #4,d7
  137.     eor.l    d7,d5
  138.     move.l    d5,(a3)+
  139.  
  140.     move.w    d2,d7            ; Swap 16x2
  141.     move.w    d0,d2
  142.     swap    d2
  143.     move.w    d2,d0
  144.     move.w    d7,d2
  145.  
  146.     move.w    d3,d7
  147.     move.w    d1,d3
  148.     swap    d3
  149.     move.w    d3,d1
  150.     move.w    d7,d3
  151.  
  152.     bra.s    .start1
  153. .x1
  154.     move.l    (a0)+,d0
  155.     move.l    (a0)+,d3
  156.     move.l    (a0)+,d1
  157.     move.l    d7,BPLSIZE(a1)
  158.     move.l    d2,d7
  159.     lsl.l    #4,d7
  160.     eor.l    d0,d7
  161.     and.l    d6,d7
  162.     eor.l    d7,d0
  163.     lsr.l    #4,d7
  164.     eor.l    d7,d2
  165.     move.l    d3,d7
  166.     lsl.l    #4,d7
  167.     eor.l    d1,d7
  168.     and.l    d6,d7
  169.     eor.l    d7,d1
  170.     move.l    d2,(a3)+
  171.     lsr.l    #4,d7
  172.     eor.l    d7,d3
  173.     move.l    d3,(a3)+
  174.  
  175.     move.l    (a0)+,d4
  176.     move.l    d4,d7
  177.     lsl.l    #4,d7
  178.     move.l    (a0)+,d2
  179.     move.l    (a0)+,d5
  180.     move.l    (a0)+,d3
  181.     move.l    a4,(a1)+
  182.     eor.l    d2,d7
  183.     and.l    d6,d7
  184.     eor.l    d7,d2
  185.     lsr.l    #4,d7
  186.     eor.l    d7,d4
  187.     move.l    d5,d7
  188.     lsl.l    #4,d7
  189.     eor.l    d3,d7
  190.     and.l    d6,d7
  191.     eor.l    d7,d3
  192.     lsr.l    #4,d7
  193.     eor.l    d7,d5
  194.  
  195.     move.w    d2,d7            ; Swap 16x2
  196.     move.w    d0,d2
  197.     swap    d2
  198.     move.w    d2,d0
  199.     move.l    d4,(a3)+
  200.     move.w    d7,d2
  201.  
  202.     move.w    d3,d7
  203.     move.w    d1,d3
  204.     move.l    d5,(a3)+
  205.     swap    d3
  206.     move.w    d3,d1
  207.     move.w    d7,d3
  208.  
  209.     move.l    a5,-BPLSIZE-4(a1)
  210. .start1
  211.     move.l    #$33333333,d5
  212.  
  213.     move.l    d2,d7            ; Swap 2x2
  214.     lsr.l    #2,d7
  215.     eor.l    d0,d7
  216.     and.l    d5,d7
  217.     eor.l    d7,d0
  218.     lsl.l    #2,d7
  219.     eor.l    d7,d2
  220.  
  221.     move.l    d3,d7
  222.     lsr.l    #2,d7
  223.     eor.l    d1,d7
  224.     and.l    d5,d7
  225.     eor.l    d7,d1
  226.     lsl.l    #2,d7
  227.     eor.l    d7,d3
  228.  
  229.     move.l    a6,d4
  230.     move.l    #$55555555,d5
  231.  
  232.     move.l    d1,d7
  233.     lsr.l    #8,d7
  234.     eor.l    d0,d7
  235.     and.l    d4,d7
  236.     eor.l    d7,d0
  237.     lsl.l    #8,d7
  238.     eor.l    d7,d1
  239.  
  240.     move.l    d1,d7
  241.     lsr.l    #1,d7
  242.     eor.l    d0,d7
  243.     and.l    d5,d7
  244.     eor.l    d7,d0
  245.     move.l    d0,BPLSIZE*2(a1)
  246.     add.l    d7,d7
  247.     eor.l    d1,d7
  248.  
  249.     move.l    d3,d1
  250.     lsr.l    #8,d1
  251.     eor.l    d2,d1
  252.     and.l    d4,d1
  253.     eor.l    d1,d2
  254.     lsl.l    #8,d1
  255.     eor.l    d1,d3
  256.  
  257.     move.l    d3,d1
  258.     lsr.l    #1,d1
  259.     eor.l    d2,d1
  260.     and.l    d5,d1
  261.     eor.l    d1,d2
  262.     move.l    d2,a4
  263.     move.l    (a0)+,d2
  264.     add.l    d1,d1
  265.     eor.l    d1,d3
  266.     move.l    d3,a5
  267.  
  268.     cmpa.l    a0,a2
  269.     bne    .x1
  270. .x1end
  271.     move.l    d7,BPLSIZE(a1)    ;
  272.     move.l    a4,(a1)+
  273.     move.l    a5,-BPLSIZE-4(a1)    ;
  274.         addq.l  #4,a1   ;;;;;;;;;;
  275.  
  276.     move.l    (sp)+,a1
  277.     add.l    #BPLSIZE*4,a1
  278.  
  279.     move.l    c2p1x1_8_c5_030_pixels,d0
  280.     lsr.l    #1,d0
  281.     lea    c2p1x1_8_c5_030_fastbuf,a0
  282.     lea    4(a0,d0.l),a2
  283.  
  284.     move.l    (a0)+,d0
  285.     move.l    #$55555555,d4
  286.     move.l    #$33333333,d5
  287.     move.l    #$00ff00ff,d6
  288.     move.l    (a0)+,d1
  289.     move.l    (a0)+,d2
  290.     move.l    (a0)+,d3
  291.  
  292.     move.w    d2,d7            ; Swap 16x2
  293.     move.w    d0,d2
  294.     swap    d2
  295.     move.w    d2,d0
  296.     move.w    d7,d2
  297.  
  298.     move.w    d3,d7
  299.     move.w    d1,d3
  300.     swap    d3
  301.     move.w    d3,d1
  302.     move.w    d7,d3
  303.  
  304.     move.l    d2,d7            ; Swap 2x2
  305.     lsr.l    #2,d7
  306.     eor.l    d0,d7
  307.     and.l    d5,d7
  308.     eor.l    d7,d0
  309.     lsl.l    #2,d7
  310.     eor.l    d7,d2
  311.  
  312.     move.l    d3,d7
  313.     lsr.l    #2,d7
  314.     eor.l    d1,d7
  315.     and.l    d5,d7
  316.     eor.l    d7,d1
  317.     lsl.l    #2,d7
  318.     eor.l    d7,d3
  319.  
  320.     move.l    d1,d7
  321.     lsr.l    #8,d7
  322.     bra.s    .start2
  323. .x2
  324.     move.l    (a0)+,d1
  325.     move.l    (a0)+,d2
  326.     move.l    (a0)+,d3
  327.     move.l    d7,BPLSIZE(a1)
  328.     move.w    d2,d7            ; Swap 16x2
  329.     move.w    d0,d2
  330.     swap    d2
  331.     move.w    d2,d0
  332.     move.w    d7,d2
  333.  
  334.     move.w    d3,d7
  335.     move.w    d1,d3
  336.     swap    d3
  337.     move.w    d3,d1
  338.     move.w    d7,d3
  339.  
  340.     move.l    d2,d7            ; Swap 2x2
  341.     lsr.l    #2,d7
  342.     eor.l    d0,d7
  343.     move.l    a4,(a1)+
  344.     and.l    d5,d7
  345.     eor.l    d7,d0
  346.     lsl.l    #2,d7
  347.     eor.l    d7,d2
  348.  
  349.     move.l    d3,d7
  350.     lsr.l    #2,d7
  351.     eor.l    d1,d7
  352.     and.l    d5,d7
  353.     eor.l    d7,d1
  354.     lsl.l    #2,d7
  355.     eor.l    d7,d3
  356.  
  357.     move.l    d1,d7
  358.     lsr.l    #8,d7
  359.     move.l    a5,-BPLSIZE-4(a1)
  360. .start2
  361.  
  362.     eor.l    d0,d7
  363.     and.l    d6,d7
  364.     eor.l    d7,d0
  365.     lsl.l    #8,d7
  366.     eor.l    d7,d1
  367.  
  368.     move.l    d1,d7
  369.     lsr.l    #1,d7
  370.     eor.l    d0,d7
  371.     and.l    d4,d7
  372.     eor.l    d7,d0
  373.     add.l    d7,d7
  374.     eor.l    d1,d7
  375.  
  376.     move.l    d3,d1
  377.         move.l  d0,BPLSIZE*2(a1)
  378.     lsr.l    #8,d1
  379.     eor.l    d2,d1
  380.     and.l    d6,d1
  381.     eor.l    d1,d2
  382.     lsl.l    #8,d1
  383.     eor.l    d1,d3
  384.  
  385.     move.l    d3,d1
  386.     lsr.l    #1,d1
  387.     eor.l    d2,d1
  388.     and.l    d4,d1
  389.     eor.l    d1,d2
  390.     add.l    d1,d1
  391.     eor.l    d1,d3
  392.  
  393.     move.l    (a0)+,d0
  394.     move.l    d2,a4
  395.     move.l    d3,a5
  396.  
  397.     cmpa.l    a0,a2
  398.     bne    .x2
  399.  
  400.     move.l    d7,BPLSIZE(a1)
  401.     move.l    a4,(a1)+
  402.     move.l    a5,-BPLSIZE-4(a1)
  403.  
  404. .none
  405.     movem.l    (sp)+,d2-d7/a2-a6
  406.     rts
  407.  
  408.  
  409. ; - [ c2p for 040/060 ] -
  410.  
  411.  
  412. ;
  413. ; Date: 20-Jan-1998            Mikael Kalms (Scout/C-Lous & more)
  414. ;                    Email: mikael@kalms.org
  415. ;
  416. ; About:
  417. ;   1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo
  418. ;
  419. ;   This routine is intended for use on all 68040 and 68060 based systems.
  420. ;   It is not designed to perform well on 68020-030.
  421. ;
  422. ;   This routine is released into the public domain. It may be freely used
  423. ;   for non-commercial as well as commercial purposes. A short notice via
  424. ;   email is always appreciated, though.
  425. ;
  426. ; Timings:
  427. ;   ~130% on (a1200 Blizzard) 040-25
  428. ;   Estimated to run at copyspeed on 040-40 and 060
  429. ;
  430. ; Features:
  431. ;   Performs CPU-only C2P conversion using rather state-of-the-art (as of
  432. ;   the creation date, anyway) techniques
  433. ;   Handles bitplanes of virtually any size (4GB)
  434. ;
  435. ; Restrictions:
  436. ;   Chunky-buffer must be an even multiple of 32 pixels wide
  437. ;   If incorrect/invalid parameters are specified, the routine will
  438. ;   most probably crash.
  439. ;
  440. ; c2p1x1_8_c5_040_smcinit        changes the bitplane-size &
  441. ;                    chunkybuffer size/pos
  442. ; c2p1x1_8_c5_040_init            sets only the chunkybuffer size/pos
  443. ; c2p1x1_8_c5_040            performs the actual c2p conversion
  444. ;
  445.  
  446.  
  447. ; d0.w    chunkyx [chunky-pixels]
  448. ; d1.w    chunkyy [chunky-pixels]
  449. ; d2.w    (scroffsx) [screen-pixels]
  450. ; d3.w    scroffsy [screen-pixels]
  451. ; d4.w    (rowlen) [bytes] -- offset between one row and the next in a bpl
  452. ; d5.l    bplsize [bytes] -- offset between one row in one bpl and the next bpl
  453.  
  454.  
  455. c2p1x1_8_c5_040_smcinit
  456.     movem.l    d3/a6,-(sp)
  457.     mulu.w    d0,d3
  458.     lsr.l    #3,d3
  459.     move.l    d3,c2p1x1_8_c5_040_scroffs
  460.     mulu.w    d0,d1
  461.     move.l    d1,c2p1x1_8_c5_040_pixels
  462.     move.l    d5,d0
  463.     lsl.l    #3,d0
  464.     sub.l    d5,d0
  465.     move.l    d0,c2p1x1_8_c5_040_smc1-4
  466.     addq.l    #4,d0
  467.     move.l    d0,c2p1x1_8_c5_040_smc5-4
  468.     move.l    d5,d0
  469.     lsl.l    #2,d0
  470.     move.l    d0,c2p1x1_8_c5_040_smc2-4
  471.     move.l    d0,c2p1x1_8_c5_040_smc4-4
  472.     move.l    d0,c2p1x1_8_c5_040_smc6-4
  473.     move.l    d0,c2p1x1_8_c5_040_smc8-4
  474.     move.l    d0,c2p1x1_8_c5_040_smc10-4
  475.     move.l    d0,c2p1x1_8_c5_040_smc12-4
  476.     sub.l    d5,d0
  477.     move.l    d0,c2p1x1_8_c5_040_smc3-4
  478.     move.l    d0,c2p1x1_8_c5_040_smc7-4
  479.     move.l    d0,c2p1x1_8_c5_040_smc9-4
  480.     move.l    d0,c2p1x1_8_c5_040_smc11-4
  481.     move.l    $4.w,a6
  482. ;    jsr    _LVOCacheClearU(a6)
  483.     movem.l    (sp)+,d3/a6
  484.     rts
  485.  
  486. ; d0.w    chunkyx [chunky-pixels]
  487. ; d1.w    chunkyy [chunky-pixels]
  488. ; d2.w    (scroffsx) [screen-pixels]
  489. ; d3.w    scroffsy [screen-pixels]
  490. ; d4.w    (rowlen) [bytes] -- offset between one row and the next in a bpl
  491. ; d5.l    (bplsize) [bytes] -- offset between one row in one bpl and the next bpl
  492.  
  493. _c2p1x1_8_c5_040_init
  494. c2p1x1_8_c5_040_init
  495.     move.l    d3,-(sp)
  496.     mulu.w    d0,d3
  497.     lsr.l    #3,d3
  498.     move.l    d3,c2p1x1_8_c5_040_scroffs
  499.     mulu.w    d0,d1
  500.     move.l    d1,c2p1x1_8_c5_040_pixels
  501.     move.l    (sp)+,d3
  502.     rts
  503.  
  504.  
  505.  
  506. ; a0    c2pscreen
  507. ; a1    bitplanes
  508.  
  509.  
  510. c2p1x1_8_c5_040
  511.     movem.l    d2-d7/a2-a6,-(sp)
  512.  
  513.     add.l    #BPLSIZE*7,a1
  514. c2p1x1_8_c5_040_smc1 EQU *
  515.     add.l    c2p1x1_8_c5_040_scroffs,a1
  516.  
  517.     move.l    c2p1x1_8_c5_040_pixels,a2
  518.     tst.l    a2
  519.     beq    .none
  520.     add.l    a0,a2
  521.  
  522.     move.l    (a0)+,d0
  523.     move.l    (a0)+,d1
  524.     move.l    (a0)+,d2
  525.     move.l    (a0)+,d3
  526.     move.l    (a0)+,d4
  527.     move.l    (a0)+,d5
  528.     move.l    (a0)+,a5
  529.     move.l    (a0)+,a6
  530.  
  531.     swap    d4            ; Swap 16x4, part 1
  532.     swap    d5
  533.     eor.w    d0,d4
  534.     eor.w    d1,d5
  535.     eor.w    d4,d0
  536.     eor.w    d5,d1
  537.     eor.w    d0,d4
  538.     eor.w    d1,d5
  539.     swap    d4
  540.     swap    d5
  541.  
  542.     move.l    d4,d6            ; Swap 2x4, part 1
  543.     move.l    d5,d7
  544.     lsr.l    #2,d6
  545.     lsr.l    #2,d7
  546.     eor.l    d0,d6
  547.     eor.l    d1,d7
  548.     and.l    #$33333333,d6
  549.     and.l    #$33333333,d7
  550.     eor.l    d6,d0
  551.     eor.l    d7,d1
  552.     lsl.l    #2,d6
  553.     lsl.l    #2,d7
  554.     eor.l    d6,d4
  555.     eor.l    d7,d5
  556.  
  557.     exg    d4,a5
  558.     exg    d5,a6
  559.  
  560.     swap    d4            ; Swap 16x4, part 2
  561.     swap    d5
  562.     eor.w    d2,d4
  563.     eor.w    d3,d5
  564.     eor.w    d4,d2
  565.     eor.w    d5,d3
  566.     eor.w    d2,d4
  567.     eor.w    d3,d5
  568.     swap    d4
  569.     swap    d5
  570.  
  571.     move.l    d4,d6            ; Swap 2x4, part 1
  572.     move.l    d5,d7
  573.     lsr.l    #2,d6
  574.     lsr.l    #2,d7
  575.     eor.l    d2,d6
  576.     eor.l    d3,d7
  577.     and.l    #$33333333,d6
  578.     and.l    #$33333333,d7
  579.     eor.l    d6,d2
  580.     eor.l    d7,d3
  581.     lsl.l    #2,d6
  582.     lsl.l    #2,d7
  583.     eor.l    d6,d4
  584.     eor.l    d7,d5
  585.  
  586.     move.l    d1,d6            ; Swap 4x1, part 1
  587.     move.l    d3,d7
  588.     lsr.l    #4,d6
  589.     lsr.l    #4,d7
  590.     eor.l    d0,d6
  591.     eor.l    d2,d7
  592.     and.l    #$0f0f0f0f,d6
  593.     and.l    #$0f0f0f0f,d7
  594.     eor.l    d6,d0
  595.     eor.l    d7,d2
  596.     lsl.l    #4,d6
  597.     lsl.l    #4,d7
  598.     eor.l    d6,d1
  599.     eor.l    d7,d3
  600.  
  601.     bra    .start
  602.  
  603.     cnop    0,16
  604. .x
  605.     move.l    (a0)+,d0
  606.     move.l    (a0)+,d1
  607.     move.l    (a0)+,d2
  608.     move.l    (a0)+,d3
  609.     move.l    (a0)+,d4
  610.     move.l    (a0)+,d5
  611.     move.l    (a0)+,a5
  612.     move.l    (a0)+,a6
  613.  
  614.     move.l    d6,(a1)
  615.     sub.l    #BPLSIZE*4,a1
  616. c2p1x1_8_c5_040_smc2 EQU *
  617.  
  618.     swap    d4            ; Swap 16x4, part 1
  619.     swap    d5
  620.     eor.w    d0,d4
  621.     eor.w    d1,d5
  622.     eor.w    d4,d0
  623.     eor.w    d5,d1
  624.     eor.w    d0,d4
  625.     eor.w    d1,d5
  626.     swap    d4
  627.     swap    d5
  628.  
  629.     move.l    d7,(a1)
  630.     add.l    #BPLSIZE*3,a1
  631. c2p1x1_8_c5_040_smc3 EQU *
  632.  
  633.     move.l    d4,d6            ; Swap 2x4, part 1
  634.     move.l    d5,d7
  635.     lsr.l    #2,d6
  636.     lsr.l    #2,d7
  637.     eor.l    d0,d6
  638.     eor.l    d1,d7
  639.     and.l    #$33333333,d6
  640.     and.l    #$33333333,d7
  641.     eor.l    d6,d0
  642.     eor.l    d7,d1
  643.     lsl.l    #2,d6
  644.     lsl.l    #2,d7
  645.     eor.l    d6,d4
  646.     eor.l    d7,d5
  647.  
  648.     exg    d4,a5
  649.     exg    d5,a6
  650.  
  651.     swap    d4            ; Swap 16x4, part 2
  652.     swap    d5
  653.     eor.w    d2,d4
  654.     eor.w    d3,d5
  655.     eor.w    d4,d2
  656.     eor.w    d5,d3
  657.     eor.w    d2,d4
  658.     eor.w    d3,d5
  659.     swap    d4
  660.     swap    d5
  661.  
  662.     move.l    a3,(a1)
  663.     sub.l    #BPLSIZE*4,a1
  664. c2p1x1_8_c5_040_smc4 EQU *
  665.  
  666.     move.l    d4,d6            ; Swap 2x4, part 1
  667.     move.l    d5,d7
  668.     lsr.l    #2,d6
  669.     lsr.l    #2,d7
  670.     eor.l    d2,d6
  671.     eor.l    d3,d7
  672.     and.l    #$33333333,d6
  673.     and.l    #$33333333,d7
  674.     eor.l    d6,d2
  675.     eor.l    d7,d3
  676.     lsl.l    #2,d6
  677.     lsl.l    #2,d7
  678.     eor.l    d6,d4
  679.     eor.l    d7,d5
  680.  
  681.     move.l    d1,d6            ; Swap 4x1, part 1
  682.     move.l    d3,d7
  683.     lsr.l    #4,d6
  684.     lsr.l    #4,d7
  685.     eor.l    d0,d6
  686.     eor.l    d2,d7
  687.     and.l    #$0f0f0f0f,d6
  688.     and.l    #$0f0f0f0f,d7
  689.     eor.l    d6,d0
  690.     eor.l    d7,d2
  691.     lsl.l    #4,d6
  692.     lsl.l    #4,d7
  693.     eor.l    d6,d1
  694.     eor.l    d7,d3
  695.  
  696.     move.l    a4,(a1)
  697.     add.l    #BPLSIZE*7+4,a1
  698. c2p1x1_8_c5_040_smc5 EQU *
  699.  
  700. .start
  701.     move.l    d2,d6            ; Swap 8x2, part 1
  702.     move.l    d3,d7
  703.     lsr.l    #8,d6
  704.     lsr.l    #8,d7
  705.     eor.l    d0,d6
  706.     eor.l    d1,d7
  707.     and.l    #$00ff00ff,d6
  708.     and.l    #$00ff00ff,d7
  709.     eor.l    d6,d0
  710.     eor.l    d7,d1
  711.     lsl.l    #8,d6
  712.     lsl.l    #8,d7
  713.     eor.l    d6,d2
  714.     eor.l    d7,d3
  715.  
  716.     move.l    d2,d6            ; Swap 1x2, part 1
  717.     move.l    d3,d7
  718.     lsr.l    #1,d6
  719.     lsr.l    #1,d7
  720.     eor.l    d0,d6
  721.     eor.l    d1,d7
  722.     and.l    #$55555555,d6
  723.     and.l    #$55555555,d7
  724.     eor.l    d6,d0
  725.     eor.l    d7,d1
  726.     add.l    d6,d6
  727.     add.l    d7,d7
  728.     eor.l    d6,d2
  729.     eor.l    d7,d3
  730.  
  731.         move.l  d0,(a1)
  732.     sub.l    #BPLSIZE*4,a1
  733. c2p1x1_8_c5_040_smc6 EQU *
  734.  
  735.     move.l    a5,d6
  736.     move.l    a6,d7
  737.     move.l    d2,a3
  738.     move.l    d3,a4
  739.  
  740.     move.l    d5,d2            ; Swap 4x1, part 2
  741.     move.l    d7,d3
  742.     lsr.l    #4,d2
  743.     lsr.l    #4,d3
  744.     eor.l    d4,d2
  745.     eor.l    d6,d3
  746.     and.l    #$0f0f0f0f,d2
  747.     and.l    #$0f0f0f0f,d3
  748.     eor.l    d2,d4
  749.     eor.l    d3,d6
  750.  
  751.     move.l    d1,(a1)
  752.     add.l    #BPLSIZE*3,a1
  753. c2p1x1_8_c5_040_smc7 EQU *
  754.  
  755.     lsl.l    #4,d2
  756.     lsl.l    #4,d3
  757.     eor.l    d2,d5
  758.     eor.l    d3,d7
  759.  
  760.     move.l    d4,d2            ; Swap 8x2, part 2
  761.     move.l    d5,d3
  762.     lsr.l    #8,d2
  763.     lsr.l    #8,d3
  764.     eor.l    d6,d2
  765.     eor.l    d7,d3
  766.     and.l    #$00ff00ff,d2
  767.     and.l    #$00ff00ff,d3
  768.     eor.l    d2,d6
  769.     eor.l    d3,d7
  770.  
  771.     move.l    a3,(a1)
  772.     sub.l    #BPLSIZE*4,a1
  773. c2p1x1_8_c5_040_smc8 EQU *
  774.  
  775.     lsl.l    #8,d2
  776.     lsl.l    #8,d3
  777.     eor.l    d2,d4
  778.     eor.l    d3,d5
  779.  
  780.     move.l    d4,d2            ; Swap 1x2, part 2
  781.     move.l    d5,d3
  782.     lsr.l    #1,d2
  783.     lsr.l    #1,d3
  784.     eor.l    d6,d2
  785.     eor.l    d7,d3
  786.     and.l    #$55555555,d2
  787.     and.l    #$55555555,d3
  788.  
  789.     move.l    a4,(a1)
  790.     add.l    #BPLSIZE*3,a1
  791. c2p1x1_8_c5_040_smc9 EQU *
  792.  
  793.     eor.l    d2,d6
  794.     eor.l    d3,d7
  795.     add.l    d2,d2
  796.     add.l    d3,d3
  797.     eor.l    d2,d4
  798.     eor.l    d3,d5
  799.  
  800.     move.l    d4,a3
  801.     move.l    d5,a4
  802.  
  803.     cmp.l    a0,a2
  804.     bne    .x
  805.  
  806.         move.l  d6,(a1)
  807.     sub.l    #BPLSIZE*4,a1
  808. c2p1x1_8_c5_040_smc10 EQU *
  809.     move.l    d7,(a1)
  810.     add.l    #BPLSIZE*3,a1
  811. c2p1x1_8_c5_040_smc11 EQU *
  812.     move.l    a3,(a1)
  813.     sub.l    #BPLSIZE*4,a1
  814. c2p1x1_8_c5_040_smc12 EQU *
  815.     move.l    a4,(a1)
  816.  
  817. .none    movem.l    (sp)+,d2-d7/a2-a6
  818.     rts
  819.  
  820.  
  821.     section    bss,bss
  822.  
  823. c2p1x1_8_c5_030_scroffs    ds.l    1
  824. c2p1x1_8_c5_030_pixels    ds.l    1
  825.  
  826. c2p1x1_8_c5_030_fastbuf    ds.b    CHUNKYXMAX*CHUNKYYMAX/2
  827.  
  828. c2p1x1_8_c5_040_scroffs    ds.l    1
  829. c2p1x1_8_c5_040_pixels    ds.l    1
  830.