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