|
1 /* |
|
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische |
|
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for |
|
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
|
5 */ |
|
6 |
|
7 /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/gsm_explode.c,v 1.2 1996/07/02 14:32:42 jutta Exp jutta $ */ |
|
8 |
|
9 #include "private.h" |
|
10 #include "gsm.h" |
|
11 #include "proto.h" |
|
12 |
|
13 int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) |
|
14 { |
|
15 # define LARc target |
|
16 # define Nc *((gsm_signal (*) [17])(target + 8)) |
|
17 # define bc *((gsm_signal (*) [17])(target + 9)) |
|
18 # define Mc *((gsm_signal (*) [17])(target + 10)) |
|
19 # define xmaxc *((gsm_signal (*) [17])(target + 11)) |
|
20 |
|
21 // Wirlab |
|
22 (void)s; |
|
23 |
|
24 #ifdef WAV49 |
|
25 if (s->wav_fmt) { |
|
26 |
|
27 uword sr = 0; |
|
28 |
|
29 if (s->frame_index == 1) { |
|
30 |
|
31 sr = *c++; |
|
32 LARc[0] = sr & 0x3f; sr >>= 6; |
|
33 sr |= (uword)*c++ << 2; |
|
34 LARc[1] = sr & 0x3f; sr >>= 6; |
|
35 sr |= (uword)*c++ << 4; |
|
36 LARc[2] = sr & 0x1f; sr >>= 5; |
|
37 LARc[3] = sr & 0x1f; sr >>= 5; |
|
38 sr |= (uword)*c++ << 2; |
|
39 LARc[4] = sr & 0xf; sr >>= 4; |
|
40 LARc[5] = sr & 0xf; sr >>= 4; |
|
41 sr |= (uword)*c++ << 2; /* 5 */ |
|
42 LARc[6] = sr & 0x7; sr >>= 3; |
|
43 LARc[7] = sr & 0x7; sr >>= 3; |
|
44 sr |= (uword)*c++ << 4; |
|
45 Nc[0] = sr & 0x7f; sr >>= 7; |
|
46 bc[0] = sr & 0x3; sr >>= 2; |
|
47 Mc[0] = sr & 0x3; sr >>= 2; |
|
48 sr |= (uword)*c++ << 1; |
|
49 xmaxc[0] = sr & 0x3f; sr >>= 6; |
|
50 #undef xmc |
|
51 #define xmc (target + 12) |
|
52 xmc[0] = sr & 0x7; sr >>= 3; |
|
53 sr = *c++; |
|
54 xmc[1] = sr & 0x7; sr >>= 3; |
|
55 xmc[2] = sr & 0x7; sr >>= 3; |
|
56 sr |= (uword)*c++ << 2; |
|
57 xmc[3] = sr & 0x7; sr >>= 3; |
|
58 xmc[4] = sr & 0x7; sr >>= 3; |
|
59 xmc[5] = sr & 0x7; sr >>= 3; |
|
60 sr |= (uword)*c++ << 1; /* 10 */ |
|
61 xmc[6] = sr & 0x7; sr >>= 3; |
|
62 xmc[7] = sr & 0x7; sr >>= 3; |
|
63 xmc[8] = sr & 0x7; sr >>= 3; |
|
64 sr = *c++; |
|
65 xmc[9] = sr & 0x7; sr >>= 3; |
|
66 xmc[10] = sr & 0x7; sr >>= 3; |
|
67 sr |= (uword)*c++ << 2; |
|
68 xmc[11] = sr & 0x7; sr >>= 3; |
|
69 xmc[12] = sr & 0x7; sr >>= 3; |
|
70 sr |= (uword)*c++ << 4; |
|
71 Nc[1] = sr & 0x7f; sr >>= 7; |
|
72 bc[1] = sr & 0x3; sr >>= 2; |
|
73 Mc[1] = sr & 0x3; sr >>= 2; |
|
74 sr |= (uword)*c++ << 1; |
|
75 xmaxc[1] = sr & 0x3f; sr >>= 6; |
|
76 #undef xmc |
|
77 #define xmc (target + 29 - 13) |
|
78 |
|
79 xmc[13] = sr & 0x7; sr >>= 3; |
|
80 sr = *c++; /* 15 */ |
|
81 xmc[14] = sr & 0x7; sr >>= 3; |
|
82 xmc[15] = sr & 0x7; sr >>= 3; |
|
83 sr |= (uword)*c++ << 2; |
|
84 xmc[16] = sr & 0x7; sr >>= 3; |
|
85 xmc[17] = sr & 0x7; sr >>= 3; |
|
86 xmc[18] = sr & 0x7; sr >>= 3; |
|
87 sr |= (uword)*c++ << 1; |
|
88 xmc[19] = sr & 0x7; sr >>= 3; |
|
89 xmc[20] = sr & 0x7; sr >>= 3; |
|
90 xmc[21] = sr & 0x7; sr >>= 3; |
|
91 sr = *c++; |
|
92 xmc[22] = sr & 0x7; sr >>= 3; |
|
93 xmc[23] = sr & 0x7; sr >>= 3; |
|
94 sr |= (uword)*c++ << 2; |
|
95 xmc[24] = sr & 0x7; sr >>= 3; |
|
96 xmc[25] = sr & 0x7; sr >>= 3; |
|
97 sr |= (uword)*c++ << 4; /* 20 */ |
|
98 Nc[2] = sr & 0x7f; sr >>= 7; |
|
99 bc[2] = sr & 0x3; sr >>= 2; |
|
100 Mc[2] = sr & 0x3; sr >>= 2; |
|
101 sr |= (uword)*c++ << 1; |
|
102 xmaxc[2] = sr & 0x3f; sr >>= 6; |
|
103 |
|
104 #undef xmc |
|
105 #define xmc (target + 46 - 26) |
|
106 |
|
107 xmc[26] = sr & 0x7; sr >>= 3; |
|
108 sr = *c++; |
|
109 xmc[27] = sr & 0x7; sr >>= 3; |
|
110 xmc[28] = sr & 0x7; sr >>= 3; |
|
111 sr |= (uword)*c++ << 2; |
|
112 xmc[29] = sr & 0x7; sr >>= 3; |
|
113 xmc[30] = sr & 0x7; sr >>= 3; |
|
114 xmc[31] = sr & 0x7; sr >>= 3; |
|
115 sr |= (uword)*c++ << 1; |
|
116 xmc[32] = sr & 0x7; sr >>= 3; |
|
117 xmc[33] = sr & 0x7; sr >>= 3; |
|
118 xmc[34] = sr & 0x7; sr >>= 3; |
|
119 sr = *c++; /* 25 */ |
|
120 xmc[35] = sr & 0x7; sr >>= 3; |
|
121 xmc[36] = sr & 0x7; sr >>= 3; |
|
122 sr |= (uword)*c++ << 2; |
|
123 xmc[37] = sr & 0x7; sr >>= 3; |
|
124 xmc[38] = sr & 0x7; sr >>= 3; |
|
125 sr |= (uword)*c++ << 4; |
|
126 Nc[3] = sr & 0x7f; sr >>= 7; |
|
127 bc[3] = sr & 0x3; sr >>= 2; |
|
128 Mc[3] = sr & 0x3; sr >>= 2; |
|
129 sr |= (uword)*c++ << 1; |
|
130 xmaxc[3] = sr & 0x3f; sr >>= 6; |
|
131 #undef xmc |
|
132 #define xmc (target + 63 - 39) |
|
133 |
|
134 xmc[39] = sr & 0x7; sr >>= 3; |
|
135 sr = *c++; |
|
136 xmc[40] = sr & 0x7; sr >>= 3; |
|
137 xmc[41] = sr & 0x7; sr >>= 3; |
|
138 sr |= (uword)*c++ << 2; /* 30 */ |
|
139 xmc[42] = sr & 0x7; sr >>= 3; |
|
140 xmc[43] = sr & 0x7; sr >>= 3; |
|
141 xmc[44] = sr & 0x7; sr >>= 3; |
|
142 sr |= (uword)*c++ << 1; |
|
143 xmc[45] = sr & 0x7; sr >>= 3; |
|
144 xmc[46] = sr & 0x7; sr >>= 3; |
|
145 xmc[47] = sr & 0x7; sr >>= 3; |
|
146 sr = *c++; |
|
147 xmc[48] = sr & 0x7; sr >>= 3; |
|
148 xmc[49] = sr & 0x7; sr >>= 3; |
|
149 sr |= (uword)*c++ << 2; |
|
150 xmc[50] = sr & 0x7; sr >>= 3; |
|
151 xmc[51] = sr & 0x7; sr >>= 3; |
|
152 |
|
153 s->frame_chain = sr & 0xf; |
|
154 } |
|
155 else { |
|
156 sr = s->frame_chain; |
|
157 sr |= (uword)*c++ << 4; /* 1 */ |
|
158 LARc[0] = sr & 0x3f; sr >>= 6; |
|
159 LARc[1] = sr & 0x3f; sr >>= 6; |
|
160 sr = *c++; |
|
161 LARc[2] = sr & 0x1f; sr >>= 5; |
|
162 sr |= (uword)*c++ << 3; |
|
163 LARc[3] = sr & 0x1f; sr >>= 5; |
|
164 LARc[4] = sr & 0xf; sr >>= 4; |
|
165 sr |= (uword)*c++ << 2; |
|
166 LARc[5] = sr & 0xf; sr >>= 4; |
|
167 LARc[6] = sr & 0x7; sr >>= 3; |
|
168 LARc[7] = sr & 0x7; sr >>= 3; |
|
169 sr = *c++; /* 5 */ |
|
170 Nc[0] = sr & 0x7f; sr >>= 7; |
|
171 sr |= (uword)*c++ << 1; |
|
172 bc[0] = sr & 0x3; sr >>= 2; |
|
173 Mc[0] = sr & 0x3; sr >>= 2; |
|
174 sr |= (uword)*c++ << 5; |
|
175 xmaxc[0] = sr & 0x3f; sr >>= 6; |
|
176 #undef xmc |
|
177 #define xmc (target + 12) |
|
178 xmc[0] = sr & 0x7; sr >>= 3; |
|
179 xmc[1] = sr & 0x7; sr >>= 3; |
|
180 sr |= (uword)*c++ << 1; |
|
181 xmc[2] = sr & 0x7; sr >>= 3; |
|
182 xmc[3] = sr & 0x7; sr >>= 3; |
|
183 xmc[4] = sr & 0x7; sr >>= 3; |
|
184 sr = *c++; |
|
185 xmc[5] = sr & 0x7; sr >>= 3; |
|
186 xmc[6] = sr & 0x7; sr >>= 3; |
|
187 sr |= (uword)*c++ << 2; /* 10 */ |
|
188 xmc[7] = sr & 0x7; sr >>= 3; |
|
189 xmc[8] = sr & 0x7; sr >>= 3; |
|
190 xmc[9] = sr & 0x7; sr >>= 3; |
|
191 sr |= (uword)*c++ << 1; |
|
192 xmc[10] = sr & 0x7; sr >>= 3; |
|
193 xmc[11] = sr & 0x7; sr >>= 3; |
|
194 xmc[12] = sr & 0x7; sr >>= 3; |
|
195 sr = *c++; |
|
196 Nc[1] = sr & 0x7f; sr >>= 7; |
|
197 sr |= (uword)*c++ << 1; |
|
198 bc[1] = sr & 0x3; sr >>= 2; |
|
199 Mc[1] = sr & 0x3; sr >>= 2; |
|
200 sr |= (uword)*c++ << 5; |
|
201 xmaxc[1] = sr & 0x3f; sr >>= 6; |
|
202 #undef xmc |
|
203 #define xmc (target + 29 - 13) |
|
204 |
|
205 xmc[13] = sr & 0x7; sr >>= 3; |
|
206 xmc[14] = sr & 0x7; sr >>= 3; |
|
207 sr |= (uword)*c++ << 1; /* 15 */ |
|
208 xmc[15] = sr & 0x7; sr >>= 3; |
|
209 xmc[16] = sr & 0x7; sr >>= 3; |
|
210 xmc[17] = sr & 0x7; sr >>= 3; |
|
211 sr = *c++; |
|
212 xmc[18] = sr & 0x7; sr >>= 3; |
|
213 xmc[19] = sr & 0x7; sr >>= 3; |
|
214 sr |= (uword)*c++ << 2; |
|
215 xmc[20] = sr & 0x7; sr >>= 3; |
|
216 xmc[21] = sr & 0x7; sr >>= 3; |
|
217 xmc[22] = sr & 0x7; sr >>= 3; |
|
218 sr |= (uword)*c++ << 1; |
|
219 xmc[23] = sr & 0x7; sr >>= 3; |
|
220 xmc[24] = sr & 0x7; sr >>= 3; |
|
221 xmc[25] = sr & 0x7; sr >>= 3; |
|
222 sr = *c++; |
|
223 Nc[2] = sr & 0x7f; sr >>= 7; |
|
224 sr |= (uword)*c++ << 1; /* 20 */ |
|
225 bc[2] = sr & 0x3; sr >>= 2; |
|
226 Mc[2] = sr & 0x3; sr >>= 2; |
|
227 sr |= (uword)*c++ << 5; |
|
228 xmaxc[2] = sr & 0x3f; sr >>= 6; |
|
229 #undef xmc |
|
230 #define xmc (target + 46 - 26) |
|
231 xmc[26] = sr & 0x7; sr >>= 3; |
|
232 xmc[27] = sr & 0x7; sr >>= 3; |
|
233 sr |= (uword)*c++ << 1; |
|
234 xmc[28] = sr & 0x7; sr >>= 3; |
|
235 xmc[29] = sr & 0x7; sr >>= 3; |
|
236 xmc[30] = sr & 0x7; sr >>= 3; |
|
237 sr = *c++; |
|
238 xmc[31] = sr & 0x7; sr >>= 3; |
|
239 xmc[32] = sr & 0x7; sr >>= 3; |
|
240 sr |= (uword)*c++ << 2; |
|
241 xmc[33] = sr & 0x7; sr >>= 3; |
|
242 xmc[34] = sr & 0x7; sr >>= 3; |
|
243 xmc[35] = sr & 0x7; sr >>= 3; |
|
244 sr |= (uword)*c++ << 1; /* 25 */ |
|
245 xmc[36] = sr & 0x7; sr >>= 3; |
|
246 xmc[37] = sr & 0x7; sr >>= 3; |
|
247 xmc[38] = sr & 0x7; sr >>= 3; |
|
248 sr = *c++; |
|
249 Nc[3] = sr & 0x7f; sr >>= 7; |
|
250 sr |= (uword)*c++ << 1; |
|
251 bc[3] = sr & 0x3; sr >>= 2; |
|
252 Mc[3] = sr & 0x3; sr >>= 2; |
|
253 sr |= (uword)*c++ << 5; |
|
254 xmaxc[3] = sr & 0x3f; sr >>= 6; |
|
255 |
|
256 #undef xmc |
|
257 #define xmc (target + 63 - 39) |
|
258 |
|
259 xmc[39] = sr & 0x7; sr >>= 3; |
|
260 xmc[40] = sr & 0x7; sr >>= 3; |
|
261 sr |= (uword)*c++ << 1; |
|
262 xmc[41] = sr & 0x7; sr >>= 3; |
|
263 xmc[42] = sr & 0x7; sr >>= 3; |
|
264 xmc[43] = sr & 0x7; sr >>= 3; |
|
265 sr = *c++; /* 30 */ |
|
266 xmc[44] = sr & 0x7; sr >>= 3; |
|
267 xmc[45] = sr & 0x7; sr >>= 3; |
|
268 sr |= (uword)*c++ << 2; |
|
269 xmc[46] = sr & 0x7; sr >>= 3; |
|
270 xmc[47] = sr & 0x7; sr >>= 3; |
|
271 xmc[48] = sr & 0x7; sr >>= 3; |
|
272 sr |= (uword)*c++ << 1; |
|
273 xmc[49] = sr & 0x7; sr >>= 3; |
|
274 xmc[50] = sr & 0x7; sr >>= 3; |
|
275 xmc[51] = sr & 0x7; sr >>= 3; |
|
276 } |
|
277 } |
|
278 else |
|
279 #endif |
|
280 { |
|
281 /* GSM_MAGIC = (*c >> 4) & 0xF; */ |
|
282 |
|
283 if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; |
|
284 |
|
285 LARc[0] = (*c++ & 0xF) << 2; /* 1 */ |
|
286 LARc[0] |= (*c >> 6) & 0x3; |
|
287 LARc[1] = *c++ & 0x3F; |
|
288 LARc[2] = (*c >> 3) & 0x1F; |
|
289 LARc[3] = (*c++ & 0x7) << 2; |
|
290 LARc[3] |= (*c >> 6) & 0x3; |
|
291 LARc[4] = (*c >> 2) & 0xF; |
|
292 LARc[5] = (*c++ & 0x3) << 2; |
|
293 LARc[5] |= (*c >> 6) & 0x3; |
|
294 LARc[6] = (*c >> 3) & 0x7; |
|
295 LARc[7] = *c++ & 0x7; |
|
296 |
|
297 Nc[0] = (*c >> 1) & 0x7F; |
|
298 |
|
299 bc[0] = (*c++ & 0x1) << 1; |
|
300 bc[0] |= (*c >> 7) & 0x1; |
|
301 |
|
302 Mc[0] = (*c >> 5) & 0x3; |
|
303 |
|
304 xmaxc[0] = (*c++ & 0x1F) << 1; |
|
305 xmaxc[0] |= (*c >> 7) & 0x1; |
|
306 |
|
307 #undef xmc |
|
308 #define xmc (target + 12) |
|
309 |
|
310 xmc[0] = (*c >> 4) & 0x7; |
|
311 xmc[1] = (*c >> 1) & 0x7; |
|
312 xmc[2] = (*c++ & 0x1) << 2; |
|
313 xmc[2] |= (*c >> 6) & 0x3; |
|
314 xmc[3] = (*c >> 3) & 0x7; |
|
315 xmc[4] = *c++ & 0x7; |
|
316 xmc[5] = (*c >> 5) & 0x7; |
|
317 xmc[6] = (*c >> 2) & 0x7; |
|
318 xmc[7] = (*c++ & 0x3) << 1; /* 10 */ |
|
319 xmc[7] |= (*c >> 7) & 0x1; |
|
320 xmc[8] = (*c >> 4) & 0x7; |
|
321 xmc[9] = (*c >> 1) & 0x7; |
|
322 xmc[10] = (*c++ & 0x1) << 2; |
|
323 xmc[10] |= (*c >> 6) & 0x3; |
|
324 xmc[11] = (*c >> 3) & 0x7; |
|
325 xmc[12] = *c++ & 0x7; |
|
326 |
|
327 Nc[1] = (*c >> 1) & 0x7F; |
|
328 |
|
329 bc[1] = (*c++ & 0x1) << 1; |
|
330 bc[1] |= (*c >> 7) & 0x1; |
|
331 |
|
332 Mc[1] = (*c >> 5) & 0x3; |
|
333 |
|
334 xmaxc[1] = (*c++ & 0x1F) << 1; |
|
335 xmaxc[1] |= (*c >> 7) & 0x1; |
|
336 |
|
337 #undef xmc |
|
338 #define xmc (target + 29 - 13) |
|
339 |
|
340 xmc[13] = (*c >> 4) & 0x7; |
|
341 xmc[14] = (*c >> 1) & 0x7; |
|
342 xmc[15] = (*c++ & 0x1) << 2; |
|
343 xmc[15] |= (*c >> 6) & 0x3; |
|
344 xmc[16] = (*c >> 3) & 0x7; |
|
345 xmc[17] = *c++ & 0x7; |
|
346 xmc[18] = (*c >> 5) & 0x7; |
|
347 xmc[19] = (*c >> 2) & 0x7; |
|
348 xmc[20] = (*c++ & 0x3) << 1; |
|
349 xmc[20] |= (*c >> 7) & 0x1; |
|
350 xmc[21] = (*c >> 4) & 0x7; |
|
351 xmc[22] = (*c >> 1) & 0x7; |
|
352 xmc[23] = (*c++ & 0x1) << 2; |
|
353 xmc[23] |= (*c >> 6) & 0x3; |
|
354 xmc[24] = (*c >> 3) & 0x7; |
|
355 xmc[25] = *c++ & 0x7; |
|
356 |
|
357 Nc[2] = (*c >> 1) & 0x7F; |
|
358 |
|
359 bc[2] = (*c++ & 0x1) << 1; /* 20 */ |
|
360 bc[2] |= (*c >> 7) & 0x1; |
|
361 |
|
362 Mc[2] = (*c >> 5) & 0x3; |
|
363 |
|
364 xmaxc[2] = (*c++ & 0x1F) << 1; |
|
365 xmaxc[2] |= (*c >> 7) & 0x1; |
|
366 |
|
367 #undef xmc |
|
368 #define xmc (target + 46 - 26) |
|
369 |
|
370 xmc[26] = (*c >> 4) & 0x7; |
|
371 xmc[27] = (*c >> 1) & 0x7; |
|
372 xmc[28] = (*c++ & 0x1) << 2; |
|
373 xmc[28] |= (*c >> 6) & 0x3; |
|
374 xmc[29] = (*c >> 3) & 0x7; |
|
375 xmc[30] = *c++ & 0x7; |
|
376 xmc[31] = (*c >> 5) & 0x7; |
|
377 xmc[32] = (*c >> 2) & 0x7; |
|
378 xmc[33] = (*c++ & 0x3) << 1; |
|
379 xmc[33] |= (*c >> 7) & 0x1; |
|
380 xmc[34] = (*c >> 4) & 0x7; |
|
381 xmc[35] = (*c >> 1) & 0x7; |
|
382 xmc[36] = (*c++ & 0x1) << 2; |
|
383 xmc[36] |= (*c >> 6) & 0x3; |
|
384 xmc[37] = (*c >> 3) & 0x7; |
|
385 xmc[38] = *c++ & 0x7; |
|
386 |
|
387 Nc[3] = (*c >> 1) & 0x7F; |
|
388 |
|
389 bc[3] = (*c++ & 0x1) << 1; |
|
390 bc[3] |= (*c >> 7) & 0x1; |
|
391 |
|
392 Mc[3] = (*c >> 5) & 0x3; |
|
393 |
|
394 xmaxc[3] = (*c++ & 0x1F) << 1; |
|
395 xmaxc[3] |= (*c >> 7) & 0x1; |
|
396 |
|
397 #undef xmc |
|
398 #define xmc (target + 63 - 39) |
|
399 |
|
400 xmc[39] = (*c >> 4) & 0x7; |
|
401 xmc[40] = (*c >> 1) & 0x7; |
|
402 xmc[41] = (*c++ & 0x1) << 2; |
|
403 xmc[41] |= (*c >> 6) & 0x3; |
|
404 xmc[42] = (*c >> 3) & 0x7; |
|
405 xmc[43] = *c++ & 0x7; /* 30 */ |
|
406 xmc[44] = (*c >> 5) & 0x7; |
|
407 xmc[45] = (*c >> 2) & 0x7; |
|
408 xmc[46] = (*c++ & 0x3) << 1; |
|
409 xmc[46] |= (*c >> 7) & 0x1; |
|
410 xmc[47] = (*c >> 4) & 0x7; |
|
411 xmc[48] = (*c >> 1) & 0x7; |
|
412 xmc[49] = (*c++ & 0x1) << 2; |
|
413 xmc[49] |= (*c >> 6) & 0x3; |
|
414 xmc[50] = (*c >> 3) & 0x7; |
|
415 xmc[51] = *c & 0x7; /* 33 */ |
|
416 } |
|
417 |
|
418 return 0; |
|
419 } |