libsidplayfp 2.15.0
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/*
32Labeling:
330 - LO
341 - HI
352 - HILO
363 - HIHI
37*/
38
40// INT16 FUNCTIONS
43inline void endian_16lo8 (uint_least16_t &word, uint8_t byte)
44{
45 word &= 0xff00;
46 word |= byte;
47}
48
50inline uint8_t endian_16lo8 (uint_least16_t word)
51{
52 return (uint8_t) word;
53}
54
56inline void endian_16hi8 (uint_least16_t &word, uint8_t byte)
57{
58 word &= 0x00ff;
59 word |= (uint_least16_t) byte << 8;
60}
61
63inline uint8_t endian_16hi8 (uint_least16_t word)
64{
65 return (uint8_t) (word >> 8);
66}
67
69inline 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
78inline 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
87inline 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
98inline void endian_16 (char ptr[2], uint_least16_t word)
99{
100 endian_16 ((uint8_t *) ptr, word);
101}
102
104inline uint_least16_t endian_little16 (const uint8_t ptr[2])
105{
106 return endian_16 (ptr[1], ptr[0]);
107}
108
110inline 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
117inline uint_least16_t endian_big16 (const uint8_t ptr[2])
118{
119 return endian_16 (ptr[0], ptr[1]);
120}
121
123inline 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
134inline void endian_32lo16 (uint_least32_t &dword, uint_least16_t word)
135{
136 dword &= (uint_least32_t) 0xffff0000;
137 dword |= word;
138}
139
141inline uint_least16_t endian_32lo16 (uint_least32_t dword)
142{
143 return (uint_least16_t) dword & 0xffff;
144}
145
147inline 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
154inline uint_least16_t endian_32hi16 (uint_least32_t dword)
155{
156 return (uint_least16_t) (dword >> 16);
157}
158
160inline 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
167inline uint8_t endian_32lo8 (uint_least32_t dword)
168{
169 return (uint8_t) dword;
170}
171
173inline 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
180inline uint8_t endian_32hi8 (uint_least32_t dword)
181{
182 return (uint8_t) (dword >> 8);
183}
184
186inline 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
195inline 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
207inline 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
220inline 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
226inline 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
237inline 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
243inline 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