LC0() macro treats the value as a signed 6-bit integer.
#define PRIMPAR_CONST_SIGN 0x20
#define PRIMPAR_VALUE 0x3F
PRIMPAR_VALUE is where the 6 bits come from.
PRIMPAR_CONST_SIGN means that the 6th bit is the sign. This means it has a range of -32 to 31, inclusive.
We must also keep in mind that computers use the 2's complement for negative integer values, so we can't just use
0x20 | 0x14) and expect it to be -20.
0x20 will be -32, which is the lowest number possible. So, to get -20, we would need -32 + 12 = -20. In 6-bit hex
0x20 + 0x0c = 0x2c. But, you don't actually have to use hex formatted number. We can let the compiler figure it out like this:
(-20 & PRIMPAR_VALUE). This trims the number -20 down to 6 bits. In fact, this is what the
LC0() macro does internally, so we can just write
If you need values larger than this range (e.g. -100 to 100), then you need to use the
LC1() macro, which uses 8-bit signed integers. It has a range of -128 to 127. So, this will work too: