gsm_explode.c 11 KB

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