STM32G0 MCAL 0.0.1
Tiny MCAL for educational purpose.
Loading...
Searching...
No Matches
Bfx_8bits.h
Go to the documentation of this file.
1
10
11#include "Std_Types.h"
12
23static inline void Bfx_SetBit_u8u8( uint8 *Data, uint8 BitPn )
24{
25 *Data |= ( 0x01 << BitPn );
26}
27
39static inline void Bfx_ClrBit_u8u8( uint8 *Data, uint8 BitPn )
40{
41 *Data &= ~( 0x01 << BitPn );
42}
43
56static inline boolean Bfx_GetBit_u8u8_u8( uint8 Data, uint8 BitPn )
57{
58 boolean Result;
59
60 Result = ( Data >> BitPn ) & 1u;
61
62 return Result;
63}
64
78static inline void Bfx_SetBits_u8u8u8u8( uint8 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status )
79{
80 uint8 Mask = ( ( 1u << BitLn ) - 1u ) << BitStartPn;
81
82 if( Status == 0 )
83 {
84 *Data = *Data & ~Mask;
85 }
86 else if( Status == 1 )
87 {
88 *Data = *Data | Mask;
89 }
90}
91
106static inline uint8 Bfx_GetBits_u8u8u8_u8( uint8 Data, uint8 BitStartPn, uint8 BitLn )
107{
108 uint8 Result;
109
110 uint8 Mask = ( ( 1u << BitLn ) - 1u );
111
112 Result = ( Data >> BitStartPn ) & Mask;
113
114 return Result;
115}
116
128static inline void Bfx_SetBitMask_u8u8( uint8 *Data, uint8 Mask )
129{
130 *Data |= Mask;
131}
132
144static inline void Bfx_ClrBitMask_u8u8( uint8 *Data, uint8 Mask )
145{
146 *Data &= ~Mask;
147}
148
162static inline boolean Bfx_TstBitMask_u8u8_u8( uint8 Data, uint8 Mask )
163{
164 boolean Result;
165
166 Result = ( Data & Mask ) == Mask;
167
168 return Result;
169}
170
184static inline boolean Bfx_TstBitLnMask_u8u8_u8( uint8 Data, uint8 Mask )
185{
186 boolean Result;
187
188 Result = ( Data & Mask ) > 0;
189
190 return Result;
191}
192
205static inline boolean Bfx_TstParityEven_u8_u8( uint8 Data )
206{
207 boolean Parity = FALSE;
208 boolean Result;
209
210 while( Data > 0 )
211 {
212 Parity = !Parity;
213 Data = Data & ( Data - 1 );
214 }
215
216 Result = !Parity;
217 return Result;
218}
219
229static inline void Bfx_ToggleBits_u8( uint8 *Data )
230{
231 *Data = ~*Data;
232}
233
245static inline void Bfx_ToggleBitMask_u8u8( uint8 *Data, uint8 Mask )
246{
247 *Data ^= Mask;
248}
249
262static inline void Bfx_ShiftBitRt_u8u8( uint8 *Data, uint8 ShiftCnt )
263{
264 *Data >>= ShiftCnt;
265}
266
279static inline void Bfx_ShiftBitLt_u8u8( uint8 *Data, uint8 ShiftCnt )
280{
281 *Data <<= ShiftCnt;
282}
283
295static inline void Bfx_RotBitRt_u8u8( uint8 *Data, uint8 ShiftCnt )
296{
297 *Data = ( *Data >> ShiftCnt ) | ( *Data << ( 8 - ShiftCnt ) );
298}
299
311static inline void Bfx_RotBitLt_u8u8( uint8 *Data, uint8 ShiftCnt )
312{
313 *Data = ( *Data << ShiftCnt ) | ( *Data >> ( 8 - ShiftCnt ) );
314}
315
329static inline void Bfx_CopyBit_u8u8u8u8( uint8 *DestinationData, uint8 DestinationPosition, uint8 SourceData, uint8 SourcePosition )
330{
331 boolean Buffer;
332
333 Buffer = ( ( SourceData & ( 0x01 << SourcePosition ) ) != 0 ) ? TRUE : FALSE;
334
335 if( Buffer == FALSE )
336 {
337 *DestinationData = ( *DestinationData & ~( 0x01 << DestinationPosition ) );
338 }
339 else
340 {
341 *DestinationData = *DestinationData | ( 0x01 << DestinationPosition );
342 }
343}
344
358static inline void Bfx_PutBits_u8u8u8u8( uint8 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Pattern )
359{
360 uint8 Mask = ( ( 1u << BitLn ) - 1u ) << BitStartPn;
361 *Data = ( *Data & ~Mask ) | ( ( Pattern << BitStartPn ) & Mask );
362}
363
376static inline void Bfx_PutBitsMask_u8u8u8( uint8 *Data, uint8 Pattern, uint8 Mask )
377{
378 *Data = ( *Data & ~Mask ) | ( Pattern & Mask );
379}
380
393static inline void Bfx_PutBit_u8u8u8( uint8 *Data, uint8 BitPn, boolean Status )
394{
395 if( Status == FALSE )
396 {
397 *Data = ( *Data & ~( 0x01 << BitPn ) );
398 }
399 else
400 {
401 *Data = *Data | ( 0x01 << BitPn );
402 }
403}
404
418{
419 uint8 Counter = 0;
420 for( uint8 i = 8; i > 0; i-- )
421 {
422 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
423 {
424 Counter++;
425 }
426 else
427 {
428 i = 1;
429 }
430 }
431 return Counter;
432}
433
448{
449 uint8 Count = 0;
450 uint8 Mask = 0x80;
451
452 if( Data >= 0 )
453 {
454 while( ( Data & Mask ) == 0 )
455 {
456 Count++;
457 Mask >>= 1;
458 }
459 }
460 else
461 {
462 while( ( Data & Mask ) == Mask )
463 {
464 Count++;
465 Mask >>= 1;
466 }
467 }
468
469 Data = Count - 1;
470 return Data;
471}
472
486{
487 uint8 Counter = 0;
488 for( uint8 i = 8; i > 0; i-- )
489 {
490 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
491 {
492 i = 1;
493 }
494 else
495 {
496 Counter++;
497 }
498 }
499 return Counter;
500}
501
522static inline sint8 Bfx_ShiftBitSat_s8s8_s8( sint8 ShiftCnt, sint8 Data )
523{
524 uint8 Mask = 0x80;
525 boolean DataIsNegative = ( Data < 0 );
526
527 // Perform shift left if ShiftCnt >= 0
528 if( ShiftCnt >= 0 )
529 {
530 Data <<= ShiftCnt;
531
532 // Saturation when Data was originally positive and had a sign change after the shift
533 if( ( DataIsNegative == FALSE ) && ( Data < 0 ) )
534 {
535 Data = 127;
536 }
537 // Saturation when Data was originally negative and had a sign change after the shift
538 else if( ( DataIsNegative == TRUE ) && ( Data >= 0 ) )
539 {
540 Data = -128;
541 }
542 }
543 // Perform right shift if ShiftCnt < 0
544 else
545 {
546 // Absolute value of ShiftCnt
547 ShiftCnt *= -1;
548
549 // Fill with 0's when Data is positive
550 if( Data > 0 )
551 {
552 Data >>= ShiftCnt;
553 }
554 // Fill with 1's when Data is negative
555 else
556 {
557 Data >>= ShiftCnt;
558
559 for( uint8 i = 0; i < ShiftCnt; i++ )
560 {
561 Data |= Mask;
562 Mask >>= 1;
563 }
564 }
565 }
566
567 return Data;
568}
569
590static inline uint8 Bfx_ShiftBitSat_u8s8_u8( sint8 ShiftCnt, uint8 Data )
591{
592 uint8 Mask = 0x80;
593 uint8 MaxShiftLeft = 0;
594
595 // Loop to check the maximum left shifts before the leading one is shifted out
596 while( ( Data & Mask ) == 0 )
597 {
598 MaxShiftLeft++;
599 Mask >>= 1;
600 }
601
602 // Perform shift left if ShiftCnt >= 0
603 if( ShiftCnt >= 0 )
604 {
605 // Saturate if the maximum shift range is exceeded
606 if( ShiftCnt > MaxShiftLeft )
607 {
608 Data = 0xFF;
609 }
610 else
611 {
612 Data <<= ShiftCnt;
613 }
614 }
615 // Perform right shift if ShiftCnt < 0
616 else
617 {
618 // Absolute value of ShiftCnt
619 ShiftCnt *= -1;
620
621 Data >>= ShiftCnt;
622 }
623
624 return Data;
625}
static uint8 Bfx_ShiftBitSat_u8s8_u8(sint8 ShiftCnt, uint8 Data)
Arithmetic shift with saturation
Definition Bfx_8bits.h:590
static boolean Bfx_TstBitLnMask_u8u8_u8(uint8 Data, uint8 Mask)
Compare any bit of a mask with a seccion of an unsigned integer
Definition Bfx_8bits.h:184
static void Bfx_PutBitsMask_u8u8u8(uint8 *Data, uint8 Pattern, uint8 Mask)
Takes a pattern and a mask and puts it in an unsigned integer
Definition Bfx_8bits.h:376
static void Bfx_PutBit_u8u8u8(uint8 *Data, uint8 BitPn, boolean Status)
Sets the bit of an unsigned integer according to Status
Definition Bfx_8bits.h:393
static void Bfx_PutBits_u8u8u8u8(uint8 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Pattern)
Takes a pattern and puts it in an unsigned integer
Definition Bfx_8bits.h:358
static boolean Bfx_TstBitMask_u8u8_u8(uint8 Data, uint8 Mask)
Compare a mask with a seccion of an unsigned integer
Definition Bfx_8bits.h:162
static uint8 Bfx_CountLeadingOnes_u8(uint8 Data)
Counts consecutive ones
Definition Bfx_8bits.h:417
static uint8 Bfx_CountLeadingZeros_u8(uint8 Data)
Counts consecutive zeros
Definition Bfx_8bits.h:485
static boolean Bfx_GetBit_u8u8_u8(uint8 Data, uint8 BitPn)
Obtain one bit especified
Definition Bfx_8bits.h:56
static void Bfx_ToggleBitMask_u8u8(uint8 *Data, uint8 Mask)
Using a mask to toggle bits
Definition Bfx_8bits.h:245
static uint8 Bfx_CountLeadingSigns_s8(sint8 Data)
Count consecutive bits which have the same value as the MSB
Definition Bfx_8bits.h:447
static void Bfx_SetBit_u8u8(uint8 *Data, uint8 BitPn)
Set a single bit in Data pointer
Definition Bfx_8bits.h:23
static uint8 Bfx_GetBits_u8u8u8_u8(uint8 Data, uint8 BitStartPn, uint8 BitLn)
Obtains consecutive bits from an unsigned integer
Definition Bfx_8bits.h:106
static void Bfx_RotBitLt_u8u8(uint8 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_8bits.h:311
static boolean Bfx_TstParityEven_u8_u8(uint8 Data)
Determines if an unsigned integer has even parity
Definition Bfx_8bits.h:205
static void Bfx_SetBitMask_u8u8(uint8 *Data, uint8 Mask)
Using a mask to set bits
Definition Bfx_8bits.h:128
static void Bfx_ShiftBitRt_u8u8(uint8 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_8bits.h:262
static void Bfx_SetBits_u8u8u8u8(uint8 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status)
Modifies consecutive bits acording to status
Definition Bfx_8bits.h:78
static void Bfx_ToggleBits_u8(uint8 *Data)
Changes the value of every bit of an unsigned integer
Definition Bfx_8bits.h:229
static void Bfx_RotBitRt_u8u8(uint8 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_8bits.h:295
static sint8 Bfx_ShiftBitSat_s8s8_s8(sint8 ShiftCnt, sint8 Data)
Arithmetic shift with saturation
Definition Bfx_8bits.h:522
static void Bfx_ClrBit_u8u8(uint8 *Data, uint8 BitPn)
Clears a single bit in Data pointer
Definition Bfx_8bits.h:39
static void Bfx_CopyBit_u8u8u8u8(uint8 *DestinationData, uint8 DestinationPosition, uint8 SourceData, uint8 SourcePosition)
Copies a bit from an integer to another
Definition Bfx_8bits.h:329
static void Bfx_ShiftBitLt_u8u8(uint8 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_8bits.h:279
static void Bfx_ClrBitMask_u8u8(uint8 *Data, uint8 Mask)
Using a mask to clear bits
Definition Bfx_8bits.h:144
signed char sint8
Definition Platform_Types.h:112
#define TRUE
Definition Platform_Types.h:76
#define FALSE
Definition Platform_Types.h:80
unsigned char uint8
Definition Platform_Types.h:94
Specification of Standard Types