A better fix for wacky gcc weirdness.
[uccvend-snackrom.git] / ROM2 / asm.h
index 41e9fe2..0dac1b0 100644 (file)
@@ -12,34 +12,34 @@ extern inline void bset(const void* addr, const u8 mask) {
         * bset/bclr on the same memory address. Sigh. Either turn off optimisation
         * (-O1 without -Os works), or we do it the dumb way.
         */
-       *(u8*)addr |= mask;
-       // asm volatile (
-       //      "ldx %0\n"
-       //      "bset 00,x,%1
-       //      :                          /* outputs */
-       //      : "p" (addr), "g" (mask)   /* inputs */
-       //      : "x"                      /* altered registers */
-       //      );
+       //*(u8*)addr |= mask;
+       asm volatile (
+               "ldx %0\n"
+               "bset 00,x,%1\n
+               : "=m" (addr)              /* outputs */
+               : "g" (mask)               /* inputs */
+               : "x"                      /* altered registers */
+       );
 }
 
 extern inline void bclr(const void* addr, const u8 mask) {
        /* same issue as above */
-       *(u8*)addr &= ~mask;
-       // asm volatile (
-       //      "ldx %0\n"
-       //      "bclr 00,x,%1"
-       //      :                          /* outputs */
-       //      : "p" (addr), "g" (mask)   /* inputs */
-       //      : "x"                      /* altered registers */
-       //      );
+       //*(u8*)addr &= ~mask;
+       asm volatile (
+               "ldx %0\n"
+               "bclr 00,x,%1\n"
+               : "=m" (addr)              /* outputs */
+               : "g" (mask)               /* inputs */
+               : "x"                      /* altered registers */
+       );
 }
 
 extern inline void lock() {
-       asm volatile ("cli");
+       asm volatile ("sei");
 }
 
 extern inline void unlock() {
-       asm volatile ("sei");
+       asm volatile ("cli");
 }
 
 #endif /* _ASM_H_ */

UCC git Repository :: git.ucc.asn.au