FreeCalypso > hg > freecalypso-sw
view gsm-fw/ccd/bitfun.c @ 1010:658fe6f1880f
rvinterf/lowlevel: handle TCH packet type in rvinterf and rvtdump
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Sun, 20 Mar 2016 20:35:17 +0000 |
parents | 970d6199f2c5 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : | Modul : bitfun.c +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : Definition of constants, types and global variables and bit | stream manipulation functions for CCD +----------------------------------------------------------------------------- */ #define __BITFUN_C__ #ifdef DEBUG_CCD #include <stdio.h> #endif #include "typedefs.h" #include "header.h" #include "string.h" #include "ccd_globs.h" #include "bitfun.h" #include "ccd.h" EXTERN int abs(int); #ifndef RUN_FLASH /* * For each bitlength between 0 and 32 this table contains the * valid masks for right-justificated values */ const ULONG ccd_bitfun_mask[] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; /* * Table of one-bit values (2^X) */ const UBYTE ccd_bitfun_shift[] = { 128, 64, 32, 16, 8, 4, 2, 1 }; #else extern const ULONG ccd_bitfun_mask[]; extern const UBYTE ccd_bitfun_shift[]; #endif /* * maschine-dependent implementation * define M_INTEL or M_MOTOROLA dependend on the target system */ #ifdef M_INTEL #define MSB_POS 1 #define LSB_POS 0 #define MSW_POS 2 #define LSW_POS 0 #else #ifdef M_MOTOROLA #define MSB_POS 0 #define LSB_POS 1 #define MSW_POS 0 #define LSW_POS 2 #endif #endif typedef union { /* Conversion structure */ UBYTE c[2]; /* 2 bytes <-> USHORT */ USHORT s; } t_conv16; typedef union { /* Conversion structure */ UBYTE c[4]; /* 4 Byte <-> ULONG */ ULONG l; } t_conv32; #ifndef RUN_FLASH #ifdef DEBUG_CCD /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : ccd_BITIMAGE | +--------------------------------------------------------------------+ PURPOSE : convert a ULONG value to a ascii-bitstring with the length len. */ char *ccd_BITIMAGE (ULONG val, ULONG len, T_CCD_Globs *globs) { int i; for (i=31; i >= 0; i--) { globs->buf [i] = (char)(val & 1)+'0'; val >>= 1; } globs->buf [32] = '\0'; return globs->buf+(32-len); } #endif #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : fmemcpy | +--------------------------------------------------------------------+ PURPOSE : copies len bytes from source to dest for FAR addresses. */ void fmemcpy (UBYTE * d, UBYTE *s, USHORT len) { while (len--) *d++ = *s++; } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writeBitChunk | +--------------------------------------------------------------------+ PURPOSE : The global pointer globs->pstruct+globs->pstructOffs references a buffer struct containing the len, offset and content of a bitbuffer. This funtions copies the bits to the bitstream buffer at the actual position. */ void bf_writeBitChunk (ULONG len, T_CCD_Globs *globs) { ULONG offs; ULONG bytesToCopy=0; signed char theShift; U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); /* * Read the length of the buffer (the l_buf component) and * compare it with the parameter given. */ len = MINIMUM (len, *((USHORT *)MsgStruct)); if (!len) return; bytesToCopy = (ULONG) ((len + ByteOffs + 7)>> 3); offs = (ULONG)(*(USHORT *)(MsgStruct + 2)); theShift = (signed char) (offs - ByteOffs); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading 2+2+%ld bytes from struct %08X, writing %d bits at byte %d.%d", bytesToCopy, MsgStruct + 4, len, globs->bytepos, globs->byteoffs); #endif if ((abs(theShift) & 7) EQ 0) { MsgStruct += (4+(offs>>3)); /* * the bits in the Buffer are in the right position * -> quick memcopy. */ /* * write the first byte, clean the leading bits */ *MsgBuf |= (*MsgStruct & (UBYTE) ccd_bitfun_mask[8 - (offs&7)]); /* * copy the remaining bytes */ if (bytesToCopy) { memcpy ((UBYTE *) &MsgBuf[1], MsgStruct + 1, (size_t)bytesToCopy-1); } if ((ByteOffs+len)&7) { MsgBuf[bytesToCopy-1] &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)]; } } else { t_conv16 conv; /* * shift every single byte */ MsgStruct += (4+(offs>>3)); if (bytesToCopy > 1) { --bytesToCopy; } if (theShift > 0) { /* * shift all bytes leftwise */ /* * the first byte must be masked */ theShift &= 7; conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)]; conv.c[LSB_POS] = *MsgStruct; conv.s <<= theShift; *MsgBuf++ |= conv.c[MSB_POS]; *MsgBuf = conv.c[LSB_POS]; --bytesToCopy; while (bytesToCopy) { conv.c[MSB_POS] = *MsgStruct++; conv.c[LSB_POS] = *MsgStruct; conv.s <<= theShift; *MsgBuf++ |= conv.c[MSB_POS]; *MsgBuf = conv.c[LSB_POS]; --bytesToCopy; } conv.c[MSB_POS] = *MsgStruct++; conv.c[LSB_POS] = *MsgStruct; conv.s <<= theShift; *MsgBuf |= conv.c[MSB_POS]; if ((ByteOffs+len)&7) { *MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)]; } } else { /* * shift all bytes rightwise */ /* * the first byte must be masked, we dont want to store the * leading garbage before the valid bits */ theShift = (-theShift & 7); conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)]; conv.c[LSB_POS] = *MsgStruct; conv.s >>= theShift; *MsgBuf++ |= conv.c[MSB_POS]; *MsgBuf = conv.c[LSB_POS]; --bytesToCopy; while (bytesToCopy) { conv.c[MSB_POS] = *MsgStruct++; conv.c[LSB_POS] = *MsgStruct; conv.s >>= theShift; *MsgBuf++ |= conv.c[MSB_POS]; *MsgBuf = conv.c[LSB_POS]; --bytesToCopy; } conv.c[MSB_POS] = *MsgStruct++; conv.c[LSB_POS] = *MsgStruct; conv.s >>= theShift; *MsgBuf |= conv.c[MSB_POS]; if ((ByteOffs+len)&7) { *MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)]; } } } bf_incBitpos (len, globs); globs->pstructOffs = MsgStruct - globs->pstruct - 1; } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writeBits | +--------------------------------------------------------------------+ PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to a var in the message C-structure. This function writes the numeric content of the var into the bit stream referenced by globs->bitbuf. According to the required lenght (len) the type of the var is interpreted as BYTE/SHORT or LONG. */ void bf_writeBits (ULONG len, T_CCD_Globs *globs) { /* * Bit field is given by its lenght, offset bit and buffer. */ if (len > 32) { bf_writeBitChunk (len, globs); return; } else { UBYTE *MsgStruct = (UBYTE*)(globs->pstruct + globs->pstructOffs); U8 ByteOffs = globs->byteoffs; UBYTE *MsgBuf = (UBYTE*)(globs->bitbuf + globs->bytepos); U32 wBits; wBits = len + ByteOffs; if (len > 24) { t_conv32 conv32; UBYTE FirstByte; conv32.l = *((ULONG *) MsgStruct); conv32.l &= (ULONG) ccd_bitfun_mask[len]; conv32.l <<= (32-len); FirstByte = conv32.c[MSW_POS + MSB_POS]; FirstByte >>= ByteOffs; FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs]; *MsgBuf++ |= FirstByte; conv32.l <<= (8-ByteOffs); *MsgBuf++ = conv32.c[MSW_POS + MSB_POS] ; *MsgBuf++ = conv32.c[MSW_POS + LSB_POS] ; *MsgBuf++ = conv32.c[LSW_POS + MSB_POS] ; if (wBits > 32) *MsgBuf = conv32.c[LSW_POS + LSB_POS] ; } /* * Bit field given in a C variable is shorter than a USHORT. */ #ifdef DEBUG_CCD TRACE_CCD (globs, "write %d bits at byte %d.%d", len, globs->bytepos, ByteOffs); #endif if (len > 8) { t_conv32 conv; conv.l = (len > 16) ? *(ULONG *) MsgStruct : (ULONG) * (USHORT *) MsgStruct; conv.l &= ccd_bitfun_mask[len]; #ifdef DEBUG_CCD TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, len, globs)); #endif conv.l <<= (32 - wBits); *MsgBuf |= conv.c[MSW_POS + MSB_POS]; MsgBuf[1] |= conv.c[MSW_POS + LSB_POS]; if (wBits > 16) { MsgBuf[2] |= conv.c[LSW_POS + MSB_POS]; if (wBits > 24) { MsgBuf[3] |= conv.c[LSW_POS + LSB_POS]; } } } else { t_conv16 conv; conv.s = (USHORT) (*MsgStruct); conv.s &= (USHORT) ccd_bitfun_mask[len]; #ifdef DEBUG_CCD TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, len, globs)); #endif conv.s <<= (16 - wBits); *MsgBuf |= conv.c[MSB_POS]; if (wBits > 8) { MsgBuf[1] |= conv.c[LSB_POS]; } } bf_incBitpos (len, globs); } } #endif /* !RUN_FLASH */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writeBitStr_PER | +--------------------------------------------------------------------+ PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to a var in the message C-structure. This function writes the numeric content of the var into the bit stream referenced by globs->bitbuf. */ void bf_writeBitStr_PER (USHORT len, T_CCD_Globs *globs) { USHORT bytesToCopy; t_conv16 Last2Bytes; U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); U8 ByteOffs = globs->byteoffs; U8 *MsgBuf; MsgBuf = (U8*)(globs->bitbuf + globs->bytepos + ((ByteOffs + len) >> 3)); /* * Store the data for a later compensation of buffer overwritting. * bytepos is always greater than 1, since the first byte with bytepos=0 * is dedicated to message identifier. */ Last2Bytes.c[MSB_POS] = MsgBuf[0]; Last2Bytes.c[LSB_POS] = MsgBuf[1]; MsgBuf -= (ByteOffs + len) >> 3; bytesToCopy = (len+7) >> 3; #ifdef DEBUG_CCD TRACE_CCD (globs, "copying %d byte(s) from struct 0x%08X, writing %d bits at byte %d.%d", bytesToCopy, MsgStruct, len, globs->bytepos, globs->byteoffs); { int i=0; int j=0; char s[64], c[4]; int leftBytes = bytesToCopy; TRACE_CCD (globs, " Bit string to be encoded:"); s[0] = '\0'; for (i = 0; leftBytes > 0 ; i++) { for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++) { sprintf(c, " %02x", *(MsgStruct+(16*i)+j)); strcat (s, c); } TRACE_CCD (globs, "%s", s); s[0] = '\0'; } } #endif /* * The bits will be appended to the bit buffer at byte boundary. */ if (ByteOffs EQ 0) { /* * CCD assumes that the bits to be copied are left adjusted * int their place in the C-structure. */ memcpy ((UBYTE *) MsgBuf, MsgStruct, (size_t)bytesToCopy); MsgBuf += bytesToCopy; } else { t_conv16 conv; /* * Write byte for byte while compensating non-zero value of globs->byteoffs. */ while (bytesToCopy--) { conv.c[MSB_POS] = *MsgStruct++; conv.c[LSB_POS] = *MsgStruct; conv.s >>= ByteOffs; conv.s &= (USHORT) ccd_bitfun_mask[16-ByteOffs]; *MsgBuf++ |= conv.c[MSB_POS]; *MsgBuf |= conv.c[LSB_POS]; } } bf_incBitpos (len, globs); /* * Undo overwriting of bits which do not belong to the bit string. */ MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); MsgBuf[0] &= ~ccd_bitfun_mask[8-globs->byteoffs]; Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-globs->byteoffs]; MsgBuf[0] |= Last2Bytes.c[MSB_POS]; MsgBuf[1] = Last2Bytes.c[LSB_POS]; } #endif /* !RUN_INT_RAM */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writePadBits | +--------------------------------------------------------------------+ PURPOSE : The global pointer globs->bitbuf points to the bit stream buffer. This function adds 0-7 zero bits to the bit stream from the point globs->byteoffs refer to. */ void bf_writePadBits (T_CCD_Globs *globs) { if (globs->byteoffs NEQ 0) { globs->bitbuf[globs->bytepos] &= (UBYTE) ~ccd_bitfun_mask[8-globs->byteoffs]; #ifdef DEBUG_CCD TRACE_CCD (globs, "writing %d pad bit(s) at byte %d.%d", 8-globs->byteoffs, globs->bytepos, globs->byteoffs); #endif bf_incBitpos (8-globs->byteoffs, globs); } } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_readBit | +--------------------------------------------------------------------+ PURPOSE : The global pointer globs->bitbuf points to the bit stream buffer. This function reads the bit to which the global positioning pointers are pointing to. */ BOOL bf_readBit (T_CCD_Globs *globs) { UBYTE ret; ret = globs->bitbuf[globs->bytepos] & ccd_bitfun_shift[globs->byteoffs]; bf_incBitpos (1, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading 1 bit (%d) at byte %d.%d", (ret>0)?1:0, globs->bytepos, globs->byteoffs); #endif return (ret > 0); } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writeBit | +--------------------------------------------------------------------+ PURPOSE : The global pointer globs->bitbuf points to the bit stream buffer. This function writes a given value into the bit to which the global positioning pointers are pointing to. */ void bf_writeBit (BOOL Bit, T_CCD_Globs *globs) { globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] | ccd_bitfun_shift[globs->byteoffs]) : (globs->bitbuf[globs->bytepos] & ~ccd_bitfun_shift[globs->byteoffs]); #ifdef DEBUG_CCD TRACE_CCD (globs, "writing 1 bit (%d) at byte %d.%d", Bit, globs->bytepos, globs->byteoffs); #endif bf_incBitpos (1, globs); } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_rShift8Bit | +--------------------------------------------------------------------+ PURPOSE : shifts a bitfield in the bitstream by 8 bits rightwise. The function is used only for octet aligned types. Hence offset is not involved in calculation. */ void bf_rShift8Bit ( USHORT srcBitPos, USHORT bitLen, T_CCD_Globs *globs ) { register UBYTE bytesToCopy; USHORT bytepos; /* * destination > source -> start with last byte */ bytepos = srcBitPos >> 3; bytesToCopy = bitLen >> 3; #ifdef DEBUG_CCD TRACE_CCD (globs, "shifting %d bits rightwise for 8 bits", bitLen); #endif while (bytesToCopy) { globs->bitbuf[bytepos+bytesToCopy] = globs->bitbuf[bytepos+bytesToCopy-1]; bytesToCopy--; } globs->bitbuf[bytepos] = 0; } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_readBitChunk | +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and stores them to the T_MSGBUF struct, containig the len the offset and a bitbuffer. */ void bf_readBitChunk (ULONG len, T_CCD_Globs *globs) { ULONG bytesToCopy; U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); *(U16*) (MsgStruct) = (U16) len; MsgStruct += 2; *(U16*) (MsgStruct) = (U16)ByteOffs; MsgStruct += 2; bytesToCopy = (ULONG) ((len >> 3)+(len&7?1:0)+(ByteOffs?1:0)); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %ld bits from byte %d.%d, writing 2+2+%ld bytes to struct %08X", len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct); #endif memcpy ((UBYTE *) MsgStruct, MsgBuf, (size_t)bytesToCopy); #if 0 #ifdef DEBUG_CCD { int i; for (i=0; i<bytesToCopy; i++) { TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]); } } #endif #endif /* * cutoff the leading and trailing bits wich are obsolete */ *MsgStruct &= ccd_bitfun_mask [8-ByteOffs]; if ((len+ByteOffs)&7) { MsgStruct += (bytesToCopy-1); *MsgStruct &= ~ccd_bitfun_mask [8-((len+ByteOffs)&7)]; } #if 0 #ifdef DEBUG_CCD { int i; for (i=0; i<bytesToCopy; i++) { TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]); } } #endif #endif bf_incBitpos (len, globs); } #endif /* !RUN_FLASH */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_readBitStr_PER | +--------------------------------------------------------------------+ PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to a var in the message C-structure. This function reads len bits from the bit stream (globs->bitbuf) and stores them left adjusted to the bytes in the message C-structure. */ void bf_readBitStr_PER (USHORT len, T_CCD_Globs *globs) { USHORT bytesToCopy; t_conv16 Last2Bytes; U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); U8 *MsgStructEnd = (U8*)(globs->pstruct + globs->pstructOffs + (len >> 3)); U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); bytesToCopy = (len+7) >> 3; /* * Store the data for a later compensation of buffer overwritting. */ Last2Bytes.c[MSB_POS] = MsgStructEnd[0]; Last2Bytes.c[LSB_POS] = MsgStructEnd[1]; /* * The bits will be read from the bit buffer at byte boundary. */ if (ByteOffs EQ 0) { #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %d bits from byte %d.%d, copying %d bytes to struct at 0x%08X", len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct); #endif /* * CCD assumes that the caller function needs the bit string to be * left adjusted in the C-structure. */ memcpy ((UBYTE *) MsgStruct,//(globs->pstruct + globs->pstructOffs), MsgBuf, (size_t)bytesToCopy); } else { t_conv16 conv; /* * Read byte for byte while compensating the non-zero globs->byteoffs. */ while (bytesToCopy--) { conv.c[MSB_POS] = *MsgBuf++; conv.c[LSB_POS] = *MsgBuf; conv.s <<= ByteOffs; conv.s &= (USHORT) ~ccd_bitfun_mask[8-(len&7)]; *MsgStruct++ = conv.c[MSB_POS]; *MsgStruct = conv.c[LSB_POS]; } } /* * Undo overwriting in C-Structure. This is specially necessary * for later reading of valid flags for optional elments. */ MsgStructEnd[0] &= (UBYTE) ~ccd_bitfun_mask[8-(len&7)]; Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-(len&7)]; MsgStructEnd[0] |= Last2Bytes.c[MSB_POS]; MsgStructEnd[1] = Last2Bytes.c[LSB_POS]; #ifdef DEBUG_CCD { int i=0; int j=0; char s[64], c[4]; int leftBytes = (len+7) >> 3;; MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); TRACE_CCD (globs, " Decoded bit string:"); s[0] = '\0'; for (i = 0; leftBytes > 0 ; i++) { for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++) { sprintf(c, " %02x", *(MsgStruct+(16*i)+j)); strcat (s, c); } TRACE_CCD (globs, "%s", s); s[0] = '\0'; } } #endif globs->pstructOffs += ((len+7) >> 3); bf_incBitpos (len, globs); } #endif /* !RUN_INT_RAM */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_readBits | +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and stores them typed (dependent on the length) to vars in the C-struct referenced by the global var globs->pstruct+globs->pstructOff. */ void bf_readBits (ULONG len, T_CCD_Globs *globs) { /* * Bit field is given by its lenght, offset bit and buffer. */ if (len > 32) { bf_readBitChunk (len, globs); return; } else { t_conv16 conv16; t_conv32 conv32; U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs); U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs); #endif /* * Bit field is given in a C variable shorter than a USHORT. */ if (len <= 8) { if (globs->lastbytepos16 != globs->bytepos) { conv16.c[MSB_POS] = *MsgBuf++; conv16.c[LSB_POS] = *MsgBuf; globs->lastbytepos16 = globs->bytepos; globs->last16Bit = conv16.s; } else conv16.s = globs->last16Bit; conv16.s >>= (16 - (ByteOffs + len)); conv16.s &= (USHORT) ccd_bitfun_mask[len]; *MsgStruct = (UBYTE) conv16.s; #ifdef DEBUG_CCD TRACE_CCD (globs, "writing 1 bytes (%0X) to struct %08X", *MsgStruct, MsgStruct); #endif } else if (len + ByteOffs <= 32) { if (globs->lastbytepos32 != globs->bytepos) { conv32.c[MSW_POS + MSB_POS] = *MsgBuf++; conv32.c[MSW_POS + LSB_POS] = *MsgBuf++; conv32.c[LSW_POS + MSB_POS] = *MsgBuf++; conv32.c[LSW_POS + LSB_POS] = *MsgBuf; globs->lastbytepos32 = globs->bytepos; globs->last32Bit = conv32.l; } else conv32.l = globs->last32Bit; conv32.l >>= (32 - (ByteOffs + len)); conv32.l &= ccd_bitfun_mask[len]; if (len > 16) { *((ULONG *) MsgStruct) = conv32.l; #ifdef DEBUG_CCD TRACE_CCD (globs, "writing 4 bytes (%08X) to struct %08X", conv32.l, MsgStruct); #endif } else { *((USHORT *) MsgStruct) = (USHORT) conv32.l; #ifdef DEBUG_CCD TRACE_CCD (globs, "writing 2 bytes (%04X) to struct %08X", (USHORT) conv32.l, MsgStruct); #endif } } else { UBYTE FirstByte; FirstByte = *MsgBuf++; FirstByte <<= ByteOffs; FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs]; if (globs->lastbytepos32 != globs->bytepos) { conv32.c[MSW_POS + MSB_POS] = *MsgBuf++; conv32.c[MSW_POS + LSB_POS] = *MsgBuf++; conv32.c[LSW_POS + MSB_POS] = *MsgBuf++; conv32.c[LSW_POS + LSB_POS] = *MsgBuf; globs->lastbytepos32 = globs->bytepos; globs->last32Bit = conv32.l; } else { conv32.l = globs->last32Bit; } if (!ByteOffs) { conv32.l >>= 8; } else { conv32.l >>= (8-ByteOffs); } conv32.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs]; conv32.c[MSW_POS + MSB_POS] |= FirstByte; conv32.l >>= (32-len); conv32.l &= (ULONG) ccd_bitfun_mask[len]; *((ULONG *) MsgStruct) = conv32.l; #ifdef DEBUG_CCD TRACE_CCD ( globs, "writing 4 bytes (%08X) to struct %08X", conv32.l, MsgStruct); #endif } bf_incBitpos (len, globs); return; } } #endif /* !RUN_FLASH */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_writeVal | +--------------------------------------------------------------------+ PURPOSE : writes value into the next (bSize) bits of the air message buffer(globs->bitbuf). This function does not use the data in the C-structure. This is done by the caller function while calculating value. */ void bf_writeVal (ULONG value, ULONG bSize, T_CCD_Globs *globs) { ULONG BitSum; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); U8 ByteOffs = globs->byteoffs; #ifdef DEBUG_CCD TRACE_CCD (globs, "writeVal %d bits at byte %d.%d", bSize, globs->bytepos, ByteOffs); #endif /* * value will be written into a temporary buffer. This buffer will * then be prepared for an ORing with the bit buffer of air message. * BitSum is helpful to find out the right size for temporary buffer. */ BitSum = bSize + (ULONG)ByteOffs; /* * Write in 1 to 8 bits (bSize is 1-8). */ if (BitSum <= 8) { UBYTE TmpBuf; #ifdef DEBUG_CCD TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)(value & ccd_bitfun_mask[bSize]), bSize, globs)); #endif TmpBuf = (UBYTE) value; TmpBuf &= (UBYTE) ccd_bitfun_mask[bSize]; TmpBuf <<= (8 - BitSum); *MsgBuf |= TmpBuf; } else { /* * Write in 9 to 16 bits (bSize is 9-16). */ if (BitSum <= 16) { t_conv16 conv; conv.s = (USHORT) value; conv.s &= (USHORT) ccd_bitfun_mask[bSize]; #ifdef DEBUG_CCD TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, bSize, globs)); #endif conv.s <<= (16 - BitSum); MsgBuf[0] |= conv.c[MSB_POS]; MsgBuf[1] |= conv.c[LSB_POS]; } /* * Write in 17 to 25 bits (bSize is 17-25). */ else if (BitSum <= 32) { t_conv32 conv; conv.l = value; conv.l &= ccd_bitfun_mask[bSize]; #ifdef DEBUG_CCD TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)conv.l, bSize, globs)); #endif conv.l <<= (32 - BitSum); MsgBuf[0] |= conv.c[MSW_POS + MSB_POS]; MsgBuf[1] |= conv.c[MSW_POS + LSB_POS]; MsgBuf[2] |= conv.c[LSW_POS + MSB_POS]; if (BitSum > 24) { MsgBuf[3] |= conv.c[LSW_POS + LSB_POS]; } } /* * Write in 25 to 32 bits (bSize is 25-32). */ else if ( BitSum < 40) { UBYTE FirstByte; t_conv32 conv; conv.l = value; conv.l <<= (32 - bSize); FirstByte = conv.c[MSW_POS + MSB_POS]; FirstByte >>= ByteOffs; FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs]; MsgBuf[0] |= FirstByte; conv.l <<= (8 - ByteOffs); MsgBuf[1] |= conv.c[MSW_POS + MSB_POS]; MsgBuf[2] |= conv.c[MSW_POS + LSB_POS]; MsgBuf[3] |= conv.c[LSW_POS + MSB_POS]; MsgBuf[4] |= conv.c[LSW_POS + LSB_POS]; #ifdef DEBUG_CCD conv.l &= (ULONG) ~ccd_bitfun_mask[24-ByteOffs]; TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) FirstByte, (ULONG)(8-ByteOffs), globs)); TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, (ULONG)(24-ByteOffs), globs)); #endif } /* * This case is currently not supported. * Integer values are written to and read from up to 32 bits. */ else { return; } } bf_incBitpos (bSize, globs); } #endif /* !RUN_INT_RAM */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_getBits | +--------------------------------------------------------------------+ PURPOSE : reads len Bits from the Bitstream (globs->bitbuf) and stores them in a variable. The caller function can now interpret or process the content of the returned variable. */ ULONG bf_getBits (ULONG len, T_CCD_Globs *globs) { U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %ld bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs); #endif /* * Read up to 8 bits from the air message buffer. */ if (len <= 8) { t_conv16 conv16; if (globs->lastbytepos16 != globs->bytepos) { conv16.c[MSB_POS] = *MsgBuf++; conv16.c[LSB_POS] = *MsgBuf; globs->lastbytepos16 = globs->bytepos; globs->last16Bit = conv16.s; } else { conv16.s = globs->last16Bit; } conv16.s >>= (16 - (ByteOffs + len)); conv16.s &= (USHORT) ccd_bitfun_mask[len]; #ifdef DEBUG_CCD TRACE_CCD (globs, "read value: %d", conv16.s); #endif bf_incBitpos (len, globs); return (ULONG) conv16.s; } /* * Read between 8 and 24 bits from the air message buffer. */ else if (len <= 24) { t_conv32 conv32; if (globs->lastbytepos32 != globs->bytepos) { conv32.c[MSW_POS + MSB_POS] = *MsgBuf++; conv32.c[MSW_POS + LSB_POS] = *MsgBuf++; conv32.c[LSW_POS + MSB_POS] = *MsgBuf++; conv32.c[LSW_POS + LSB_POS] = *MsgBuf; globs->lastbytepos32 = globs->bytepos; globs->last32Bit = conv32.l; } else { conv32.l = globs->last32Bit; } conv32.l >>= (32 - (ByteOffs + len)); conv32.l &= ccd_bitfun_mask[len]; #ifdef DEBUG_CCD TRACE_CCD (globs, "read value: %ld", conv32.l); #endif bf_incBitpos (len, globs); return conv32.l; } /* * Read between 24 and 32 bits from the air message buffer. */ else if ( len <= 32) { UBYTE FirstByte; t_conv32 conv; FirstByte = *MsgBuf++; FirstByte <<= ByteOffs; FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs]; if (globs->lastbytepos32 != globs->bytepos) { conv.c[MSW_POS + MSB_POS] = *MsgBuf++; conv.c[MSW_POS + LSB_POS] = *MsgBuf++; conv.c[LSW_POS + MSB_POS] = *MsgBuf++; conv.c[LSW_POS + LSB_POS] = *MsgBuf; globs->lastbytepos32 = globs->bytepos; globs->last32Bit = conv.l; } else { conv.l = globs->last32Bit; } if (!ByteOffs) { conv.l >>= 8; } else { conv.l >>= (8-ByteOffs); } conv.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs]; conv.c[MSW_POS + MSB_POS] |= FirstByte; conv.l >>= (32-len); conv.l &= (ULONG) ccd_bitfun_mask[len]; #ifdef DEBUG_CCD TRACE_CCD (globs, "read value: %ld", conv.l); #endif bf_incBitpos (len, globs); return conv.l; } /* * This case is currently not supported. * Integer values are written to and read from up to 32 bits. */ else { return 0; } } #endif /* !RUN_INT_RAM */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_decodeLongNumber | +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and return this number as a 32 Bit number. The Position of the readpointer of the bitstream is incremented by the len. */ ULONG bf_decodeLongNumber (UBYTE len, T_CCD_Globs *globs) { U32 number; t_conv16 conv16; t_conv32 conv32; U8 ByteOffs = globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs); #endif if (len <= 8) { if (globs->lastbytepos16 != globs->bytepos) { conv16.c[MSB_POS] = *MsgBuf++; conv16.c[LSB_POS] = *MsgBuf; globs->lastbytepos16 = globs->bytepos; globs->last16Bit = conv16.s; } else conv16.s = globs->last16Bit; conv16.s >>= (16 - (ByteOffs + len)); conv16.s &= (USHORT) ccd_bitfun_mask[len]; number = (ULONG) conv16.s; } else { if (globs->lastbytepos32 != globs->bytepos) { conv32.c[MSW_POS + MSB_POS] = *MsgBuf++; conv32.c[MSW_POS + LSB_POS] = *MsgBuf++; conv32.c[LSW_POS + MSB_POS] = *MsgBuf++; conv32.c[LSW_POS + LSB_POS] = *MsgBuf; globs->lastbytepos32 = globs->bytepos; globs->last32Bit = conv32.l; } else conv32.l = globs->last32Bit; conv32.l >>= (32 - (ByteOffs + len)); conv32.l &= ccd_bitfun_mask[len]; number = conv32.l; } bf_incBitpos (len, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, " (%08X)", number); #endif return number; } #endif /* !RUN_INT_RAM */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_decodeShortNumber| +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and returns the resulting value as an ULONG. */ ULONG bf_decodeShortNumber (const ULONG len, T_CCD_Globs *globs) { UBYTE *p; t_conv32 conv32; p = globs->bitbuf + globs->bytepos; conv32.c[MSW_POS + MSB_POS] = *p++; conv32.c[MSW_POS + LSB_POS] = *p++; conv32.c[LSW_POS + MSB_POS] = *p++; conv32.c[LSW_POS + LSB_POS] = *p; conv32.l >>= (32 - (globs->byteoffs + len)); conv32.l &= ccd_bitfun_mask[len]; bf_incBitpos (len, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %d bits as LONG (%d) at byte %d.%d", len, (ULONG) conv32.l, globs->bytepos, globs->byteoffs); #endif return (ULONG) conv32.l; } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_decodeByteNumber | +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and returns the resulting value as an UBYTE. */ UBYTE bf_decodeByteNumber (const ULONG len, T_CCD_Globs *globs) { UBYTE *p; t_conv16 conv16; p = globs->bitbuf + globs->bytepos; conv16.c[MSB_POS] = *p++; conv16.c[LSB_POS] = *p; conv16.s >>= (16 - (globs->byteoffs + len)); conv16.s &= (USHORT) ccd_bitfun_mask[len]; bf_incBitpos (len, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "reading %d bits as BYTE (%d) at byte %d.%d", len, (UBYTE) conv16.s, globs->bytepos, globs->byteoffs); #endif return (UBYTE) conv16.s; } #endif /* !RUN_FLASH */ #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_codeShortNumber | +--------------------------------------------------------------------+ PURPOSE : Converts the value (val) into a MSB/LSB-Bitstring and writes it to the aktual position into the bitstream globs->bitbuf. The maximum value of (len) is 16. If the value of (val) is greater then (2^len)-1 it will be truncated. */ void bf_codeShortNumber (UBYTE len, USHORT val, T_CCD_Globs *globs) { UBYTE *p; t_conv32 conv32; #ifdef DEBUG_CCD TRACE_CCD (globs, "codeShortNumber: writing %d bits (.%s) at byte %d.%d", len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs); #endif p = globs->bitbuf + globs->bytepos; conv32.l = (ULONG) val; conv32.l <<= (32 - len - globs->byteoffs); *p++ |= conv32.c[MSW_POS + MSB_POS]; *p = conv32.c[MSW_POS + LSB_POS]; if ((globs->byteoffs + len) > 16) *++p = conv32.c[LSW_POS + MSB_POS]; bf_incBitpos (len, globs); } #endif /* !RUN_INT_RAM */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_recodeShortNumber| +--------------------------------------------------------------------+ PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and writes it at the position (pos) into the bitstream globs->bitbuf. The rest of the bitstream and the actual position will not changed. The maximum value of (len) is 16. If the value of (val) is greater then (2^len)-1 it will be truncated. */ void bf_recodeShortNumber (USHORT pos, UBYTE len, USHORT val, T_CCD_Globs *globs) { UBYTE *p; USHORT oldbitpos; t_conv32 conv32; USHORT wBits; oldbitpos = globs->bitpos; bf_setBitpos (pos, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "bf_recodeShortNumber:rewriting %d bits (.%s) at byte %d.%d", len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs); #endif wBits = len + globs->byteoffs; p = globs->bitbuf + globs->bytepos; conv32.l = (ULONG) val; conv32.l <<= (32 - wBits); /* * Since the bits to write are cleared (memclr) in the bitstream, * it is ok to perform an OR operation on them. */ *p++ |= conv32.c[MSW_POS + MSB_POS]; if (wBits > 8) { *p++ |= conv32.c[MSW_POS + LSB_POS]; if (wBits > 16) { *p++ |= conv32.c[LSW_POS + MSB_POS]; if (wBits > 24) *p |= conv32.c[LSW_POS + LSB_POS]; } } bf_setBitpos (oldbitpos, globs); } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_recodeByteNumber | +--------------------------------------------------------------------+ PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and writes it at the position (pos) into the bitstream globs->bitbuf. The rest of the bitstream and the actual position will not changed. The maximum value of (len) is 8. If the value of (val) is greater then (2^len)-1 it will be truncated. */ void bf_recodeByteNumber (USHORT pos, UBYTE len, UBYTE val, T_CCD_Globs *globs) { UBYTE *p; USHORT oldbitpos; t_conv16 conv16; oldbitpos = globs->bitpos; bf_setBitpos (pos, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "bf_recodeByteNumber:rewriting %d bits (.%s) at byte %d.%d", len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs); #endif p = globs->bitbuf + globs->bytepos; conv16.s = (USHORT) val; conv16.s <<= (16 - len - globs->byteoffs); /* * if the bits to write are cleared (memclr) in the bitstream * we can perform an OR operation on it */ *p++ |= conv16.c[MSB_POS]; if ((len + globs->byteoffs) > 8) *p |= conv16.c[LSB_POS]; bf_setBitpos (oldbitpos, globs); } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_recodeBit | +--------------------------------------------------------------------+ PURPOSE: Writes the value of (Bit) at the position (pos) into the bitstream globs->bitbuf. The rest of the bitstream and the actual position will not changed. */ void bf_recodeBit (USHORT pos, UBYTE Bit, T_CCD_Globs *globs) { U16 oldbitpos = globs->bitpos;; bf_setBitpos (pos, globs); globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] | ccd_bitfun_shift[globs->byteoffs]) : (globs->bitbuf[globs->bytepos] & ~ccd_bitfun_shift[globs->byteoffs]); bf_setBitpos (oldbitpos, globs); #ifdef DEBUG_CCD TRACE_CCD (globs, "recode 1 bit (.%d) at bitpos %d", Bit, pos); #endif } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_codeByteNumber | +--------------------------------------------------------------------+ PURPOSE: Converts the value (val) into a Bitstring with the length (len) and writes it at the actual position into the bitstream globs->bitbuf. The maximum value of (len) is 8. If the value is greater then (2^len)-1 it will be truncated. */ void bf_codeByteNumber (UBYTE len, UBYTE val, T_CCD_Globs *globs) { UBYTE *p; t_conv16 conv16; #ifdef DEBUG_CCD TRACE_CCD (globs, "codeByteNumber:writing %d bits (.%s) at byte %d.%d", len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs); #endif p = globs->bitbuf + globs->bytepos; conv16.s = (USHORT) val; conv16.s <<= (16 - len - globs->byteoffs); *p++ |= conv16.c[MSB_POS]; if ((globs->byteoffs + len) > 8) *p |= conv16.c[LSB_POS]; bf_incBitpos (len, globs); } #endif /* !RUN_FLASH */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_codeLongNumber | +--------------------------------------------------------------------+ PURPOSE : This funtion writes the numeric content of the var to the aktual position into the bitstream referenced by globs->bitbuf. */ void bf_codeLongNumber (UBYTE len, ULONG val, T_CCD_Globs *globs) { UBYTE wBits = len + globs->byteoffs; U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos); #ifdef DEBUG_CCD TRACE_CCD (globs, "codeLongNumber: writing %d bits (.%s) at byte %d.%d", len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs); #endif if (len > 8) { t_conv32 conv; conv.l = val; conv.l &= ccd_bitfun_mask[len]; conv.l <<= (32 - wBits); MsgBuf[0] |= conv.c[MSW_POS + MSB_POS]; MsgBuf[1] = conv.c[MSW_POS + LSB_POS]; if (wBits > 16) { MsgBuf[2] = conv.c[LSW_POS + MSB_POS]; if (wBits > 24) { MsgBuf[3] = conv.c[LSW_POS + LSB_POS]; } } } else { t_conv16 conv; conv.s = (USHORT) val; conv.s &= (USHORT) ccd_bitfun_mask[len]; conv.s <<= (16 - wBits); MsgBuf[0] |= conv.c[MSB_POS]; if (wBits > 8) { MsgBuf[1] = conv.c[LSB_POS]; } } bf_incBitpos (len, globs); } #endif /* !RUN_FLASH */ #if 0 /* not used - maybe for the future */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : CCD (6144) MODULE : BITFUN | | STATE : code ROUTINE : bf_swapBits | +--------------------------------------------------------------------+ PURPOSE : reads (len) Bits from the Bitsream (1-8) and swap this part with the next (len) bits in the bitstream. The read/write pointer of the bitstream left unchanged. This function is used for swapping the nibbles in some ugly coded GSM messages. */ void bf_swapBits (ULONG len, T_CCD_Globs *globs) { UBYTE s1, s2; USHORT s21; USHORT startpos = globs->bitpos; UBYTE *p; t_conv32 conv32; if (len > 0 AND len <= 8) { #ifdef DEBUG_CCD TRACE_CCD (globs, "swapping %d bits", len); #endif /* * read bitstring#1 */ s1 = bf_decodeByteNumber (len, globs); /* * read bitstring#2 */ s2 = bf_decodeByteNumber (len, globs); /* * concat bitstring#2 and bitstring#1 */ s21 = (USHORT) s2 <<len; s21 |= s1; /* * recode it into the bitstream */ bf_setBitpos (startpos, globs); p = globs->bitbuf + globs->bytepos; conv32.l = (ULONG) s21; conv32.l <<= (32 - len) - globs->byteoffs; *p++ |= conv32.c[MSW_POS + MSB_POS]; *p++ |= conv32.c[MSW_POS + LSB_POS]; *p++ |= conv32.c[LSW_POS + MSB_POS]; *p |= conv32.c[LSW_POS + LSB_POS]; bf_setBitpos (startpos, globs); bf_recodeShortNumber (startpos, (UBYTE) (len<<1), s21, globs); bf_setBitpos (startpos, globs); } } #endif /* !RUN_FLASH */ #endif