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