libsidplayfp  2.0.2
sidendian.h
1 /*
2  * This file is part of libsidplayfp, a SID player engine.
3  *
4  * Copyright 2000 Simon White
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20 
21 
22 #ifndef SIDENDIAN_H
23 #define SIDENDIAN_H
24 
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28 
29 #include <stdint.h>
30 
31 /*
32 Labeling:
33 0 - LO
34 1 - HI
35 2 - HILO
36 3 - HIHI
37 */
38 
40 // INT16 FUNCTIONS
43 inline void endian_16lo8 (uint_least16_t &word, uint8_t byte)
44 {
45  word &= 0xff00;
46  word |= byte;
47 }
48 
50 inline uint8_t endian_16lo8 (uint_least16_t word)
51 {
52  return (uint8_t) word;
53 }
54 
56 inline void endian_16hi8 (uint_least16_t &word, uint8_t byte)
57 {
58  word &= 0x00ff;
59  word |= (uint_least16_t) byte << 8;
60 }
61 
63 inline uint8_t endian_16hi8 (uint_least16_t word)
64 {
65  return (uint8_t) (word >> 8);
66 }
67 
69 inline void endian_16swap8 (uint_least16_t &word)
70 {
71  uint8_t lo = endian_16lo8 (word);
72  uint8_t hi = endian_16hi8 (word);
73  endian_16lo8 (word, hi);
74  endian_16hi8 (word, lo);
75 }
76 
78 inline uint_least16_t endian_16 (uint8_t hi, uint8_t lo)
79 {
80  uint_least16_t word = 0;
81  endian_16lo8 (word, lo);
82  endian_16hi8 (word, hi);
83  return word;
84 }
85 
87 inline void endian_16 (uint8_t ptr[2], uint_least16_t word)
88 {
89 #if defined(WORDS_BIGENDIAN)
90  ptr[0] = endian_16hi8 (word);
91  ptr[1] = endian_16lo8 (word);
92 #else
93  ptr[0] = endian_16lo8 (word);
94  ptr[1] = endian_16hi8 (word);
95 #endif
96 }
97 
98 inline void endian_16 (char ptr[2], uint_least16_t word)
99 {
100  endian_16 ((uint8_t *) ptr, word);
101 }
102 
104 inline uint_least16_t endian_little16 (const uint8_t ptr[2])
105 {
106  return endian_16 (ptr[1], ptr[0]);
107 }
108 
110 inline void endian_little16 (uint8_t ptr[2], uint_least16_t word)
111 {
112  ptr[0] = endian_16lo8 (word);
113  ptr[1] = endian_16hi8 (word);
114 }
115 
117 inline uint_least16_t endian_big16 (const uint8_t ptr[2])
118 {
119  return endian_16 (ptr[0], ptr[1]);
120 }
121 
123 inline void endian_big16 (uint8_t ptr[2], uint_least16_t word)
124 {
125  ptr[0] = endian_16hi8 (word);
126  ptr[1] = endian_16lo8 (word);
127 }
128 
129 
131 // INT32 FUNCTIONS
134 inline void endian_32lo16 (uint_least32_t &dword, uint_least16_t word)
135 {
136  dword &= (uint_least32_t) 0xffff0000;
137  dword |= word;
138 }
139 
141 inline uint_least16_t endian_32lo16 (uint_least32_t dword)
142 {
143  return (uint_least16_t) dword & 0xffff;
144 }
145 
147 inline void endian_32hi16 (uint_least32_t &dword, uint_least16_t word)
148 {
149  dword &= (uint_least32_t) 0x0000ffff;
150  dword |= (uint_least32_t) word << 16;
151 }
152 
154 inline uint_least16_t endian_32hi16 (uint_least32_t dword)
155 {
156  return (uint_least16_t) (dword >> 16);
157 }
158 
160 inline void endian_32lo8 (uint_least32_t &dword, uint8_t byte)
161 {
162  dword &= (uint_least32_t) 0xffffff00;
163  dword |= (uint_least32_t) byte;
164 }
165 
167 inline uint8_t endian_32lo8 (uint_least32_t dword)
168 {
169  return (uint8_t) dword;
170 }
171 
173 inline void endian_32hi8 (uint_least32_t &dword, uint8_t byte)
174 {
175  dword &= (uint_least32_t) 0xffff00ff;
176  dword |= (uint_least32_t) byte << 8;
177 }
178 
180 inline uint8_t endian_32hi8 (uint_least32_t dword)
181 {
182  return (uint8_t) (dword >> 8);
183 }
184 
186 inline void endian_32swap16 (uint_least32_t &dword)
187 {
188  uint_least16_t lo = endian_32lo16 (dword);
189  uint_least16_t hi = endian_32hi16 (dword);
190  endian_32lo16 (dword, hi);
191  endian_32hi16 (dword, lo);
192 }
193 
195 inline void endian_32swap8 (uint_least32_t &dword)
196 {
197  uint_least16_t lo = 0, hi = 0;
198  lo = endian_32lo16 (dword);
199  hi = endian_32hi16 (dword);
200  endian_16swap8 (lo);
201  endian_16swap8 (hi);
202  endian_32lo16 (dword, hi);
203  endian_32hi16 (dword, lo);
204 }
205 
207 inline uint_least32_t endian_32 (uint8_t hihi, uint8_t hilo, uint8_t hi, uint8_t lo)
208 {
209  uint_least32_t dword = 0;
210  uint_least16_t word = 0;
211  endian_32lo8 (dword, lo);
212  endian_32hi8 (dword, hi);
213  endian_16lo8 (word, hilo);
214  endian_16hi8 (word, hihi);
215  endian_32hi16 (dword, word);
216  return dword;
217 }
218 
220 inline uint_least32_t endian_little32 (const uint8_t ptr[4])
221 {
222  return endian_32 (ptr[3], ptr[2], ptr[1], ptr[0]);
223 }
224 
226 inline void endian_little32 (uint8_t ptr[4], uint_least32_t dword)
227 {
228  uint_least16_t word = 0;
229  ptr[0] = endian_32lo8 (dword);
230  ptr[1] = endian_32hi8 (dword);
231  word = endian_32hi16 (dword);
232  ptr[2] = endian_16lo8 (word);
233  ptr[3] = endian_16hi8 (word);
234 }
235 
237 inline uint_least32_t endian_big32 (const uint8_t ptr[4])
238 {
239  return endian_32 (ptr[0], ptr[1], ptr[2], ptr[3]);
240 }
241 
243 inline void endian_big32 (uint8_t ptr[4], uint_least32_t dword)
244 {
245  uint_least16_t word = 0;
246  word = endian_32hi16 (dword);
247  ptr[1] = endian_16lo8 (word);
248  ptr[0] = endian_16hi8 (word);
249  ptr[2] = endian_32hi8 (dword);
250  ptr[3] = endian_32lo8 (dword);
251 }
252 
253 #endif // SIDENDIAN_H