revert between 56095 -> 55830 in arch
[AROS.git] / workbench / devs / diskimage / support / swab2.c
blob29fa4f43f254a0b4be80c2644d7153cd061a3223
1 /* Copyright 2007-2012 Fredrik Wikstrom. All rights reserved.
2 **
3 ** Redistribution and use in source and binary forms, with or without
4 ** modification, are permitted provided that the following conditions
5 ** are met:
6 **
7 ** 1. Redistributions of source code must retain the above copyright
8 ** notice, this list of conditions and the following disclaimer.
9 **
10 ** 2. Redistributions in binary form must reproduce the above copyright
11 ** notice, this list of conditions and the following disclaimer in the
12 ** documentation and/or other materials provided with the distribution.
14 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 ** POSSIBILITY OF SUCH DAMAGE.
27 #include "support.h"
28 #include "endian.h"
30 void swab2 (CONST_APTR source, APTR dest, ULONG bytes) {
31 ULONG longs = (bytes >> 1) >> 2;
32 ULONG words = (bytes >> 1) & 3;
33 const ULONG *l_src;
34 ULONG *l_dst;
35 const UWORD *w_src;
36 UWORD *w_dst;
37 const ULONG m1 = 0xff00ff00;
38 const ULONG m2 = 0x00ff00ff;
39 l_src = (const ULONG *)source;
40 l_dst = (ULONG *)dest;
41 while (longs) {
42 *l_dst++ = ((*l_src << 8) & m1)|((*l_src >> 8) & m2);
43 l_src++;
44 *l_dst++ = ((*l_src << 8) & m1)|((*l_src >> 8) & m2);
45 l_src++;
46 longs--;
48 w_src = (const UWORD *)l_src;
49 w_dst = (UWORD *)l_dst;
50 switch (words) {
51 case 3:
52 wswap16(w_dst++, *w_src); w_src++;
53 case 2:
54 wswap16(w_dst++, *w_src); w_src++;
55 case 1:
56 wswap16(w_dst++, *w_src); w_src++;
57 default:
58 break;