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