First, the manual refers to BIS_SR() etc. but the names actually begin with an underscore (e.g. _BIS_SR()).
Second, the manual gives a prototype of void BIS_SR(const uint16_t x); But the following won't compile: void sleep(const int16_t x) { _BIS_SR(x); } The definition uses an "i" constraint for the input value, so x must be a literal constant. A "const int16_t" value won't work. However, if you change the definition from #define _BIS_SR(x) __asm__ __volatile__( "bis %0, r2" : : "i" ((uint16_t)x) ) to #define _BIS_SR(x) __asm__ __volatile__( "bis %0, r2" : : "ir" ((uint16_t)x) ) Then "const int16_t" is correct and the above example code compiles correctly. Using "ir" as the constraint appears to generate optimal code in all cases. The same fix should probably be made to all of the related macros that set/clear bits. I think. Or is there a reason I can't see why those input constraints are "i" instead of "ir"? -- Grant Edwards grante Yow! I'm a fuschia bowling at ball somewhere in Brittany visi.com