Fixed red build
[kugel-rb.git] / firmware / bitswap.S
blob9a4f7602612fc34db1478eeca2f290c484327487
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2002 by Magnus Holmgren
11  *
12  * All files in this archive are subject to the GNU General Public License.
13  * See the file COPYING in the source tree root for full license agreement.
14  *
15  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16  * KIND, either express or implied.
17  *
18  ****************************************************************************/
20     .section    .icode,"ax",@progbits
21     .global     _bitswap
22     .align      4
23     .type       _bitswap,@function
25 /* Registers used:
26  *
27  * r0   Temporary (required by some instructions)
28  * r1   Low byte
29  * r2   High byte
30  * r3   Result after flip
31  * r4   Data
32  * r5   Length
33  * r6   1
34  * r7   Flip table
35  */
37 _bitswap:
38     mov.l   .fliptable,r7
39     mov #1,r6
40     mov r4,r0
41     and #1,r0               /* odd address? */
42     cmp/eq  #0,r0
43     bt  .init               /* no, address is even */
45     mov.b   @r4,r0          /* swap first byte */
46     extu.b  r0,r0
47     mov.b   @(r0,r7),r0
48     mov.b   r0,@r4
49     add #1,r4
50     add #-1,r5
51     bra .init
52 .loop:
53     mov.w   @r4,r1          /* data to flip */
54     swap.b  r1,r2
55     extu.b  r2,r0           /* high byte */
56     mov.b   @(r0,r7),r2
57     extu.b  r2,r0           /* Zero extend */
58     swap.b  r0,r3           /* put high byte in result */
59     extu.b  r1,r0           /* low byte */
60     mov.b   @(r0,r7),r1
61     extu.b  r1,r0           /* Zero extend */
62     or  r0,r3               /* put low byte in result */
63     mov.w   r3,@r4          /* store result */
64     add #2,r4
65     add #-2,r5
66 .init:
67     cmp/gt  r6,r5           /* while [bytes remaining] > 1 */
68     bt  .loop               /* (at least 2 bytes left) */
70     cmp/eq  r6,r5
71     bf  .exit               /* if not 1 byte left, exit */
73     mov.b   @r4,r0              /* swap last byte */
74     extu.b  r0,r0
75     mov.b   @(r0,r7),r0
76     mov.b   r0,@r4
77 .exit:
78     rts
80     .align  4
82 .fliptable:
83     .long   _fliptable
85 _fliptable:
86     .byte   0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
87     .byte   0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
88     .byte   0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
89     .byte   0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
90     .byte   0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
91     .byte   0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
92     .byte   0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
93     .byte   0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
94     .byte   0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
95     .byte   0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
96     .byte   0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
97     .byte   0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
98     .byte   0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
99     .byte   0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
100     .byte   0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
101     .byte   0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
102     .byte   0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
103     .byte   0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
104     .byte   0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
105     .byte   0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
106     .byte   0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
107     .byte   0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
108     .byte   0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
109     .byte   0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
110     .byte   0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
111     .byte   0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
112     .byte   0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
113     .byte   0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
114     .byte   0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
115     .byte   0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
116     .byte   0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
117     .byte   0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
119 .end:
120     .size   _bitswap,.end-_bitswap