#define CLOBBER_H \ asm volatile ("; clobber \"d\"" ::: \ "16", "17", "18", "19", \ "20", "21", "22", "23", "24", "25", \ "26", "27", "28", "29", "30", "31") #define RELOAD(REGCLASS,VAR) \ asm volatile ("; RELOAD " #VAR " to \"" REGCLASS "\"" \ : "+" REGCLASS (VAR)) #define REG (*(((unsigned char volatile *) 0x20))) typedef union { struct { unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; }; struct { unsigned n0:4; unsigned n1:4; }; unsigned char c; } u_t; u_t s, t; unsigned char i; unsigned short g, h; char z,y; /**************************************/ long or1 (long i) { RELOAD ("l", i); i |= (1l << 20); RELOAD ("l", i); return i; } #if 1 unsigned char extract_sfrbit_1() { unsigned char i = 0; if (REG & 64) i = 1; return i; } void insert_1_bitashift (unsigned char b) { s.b6 = t.b6; } unsigned char shiftrt_and1 (unsigned char c) { i = (c >> 4) & 1; return c; } unsigned char shiftrt_1_bit (unsigned char c) { i = (c >> 4) & 2; return c; } unsigned char ashift_1_bit (unsigned char c) { i = (c << 5) & 64; return c; } void extract_sfrbit_2() { unsigned char j = 0; if (REG & 64) j = 1; i = j; } int extract_gprbit (int i) { return (i & (1 << 14)) ? 1 : 0; } void bar() { if (REG & 64) i = 0; s.b6 = i; if (i & 2) REG |= 64; } void movebit_ashift() { s.b6 = s.b5; s.b7 = s.b3; } void movebit_shiftrt() { s.b3 = s.b7; s.b5 = s.b6; } void movebit_07() { s.b0 = s.b7; } void movebit_71() { s.b7 = s.b1; } void movebit_70() { s.b7 = s.b0; } unsigned char revert (unsigned char n) { u_t u = {.c = n}; u_t v; v.b0 = u.b7; v.b1 = u.b6; v.b2 = u.b5; v.b3 = u.b4; v.b4 = u.b3; v.b5 = u.b2; v.b6 = u.b1; v.b7 = u.b0; return v.c; } void test_sfrbit () { if ((REG >> 6) & 1) y = 1; } void test_gprbit (unsigned char reg) { if (1 & (reg >> 6)) y = 1; } void get_longbit (long x) { i = (x >> 25) & 1; s.b3 = (x & (1ul << 14)) ? 1 : 0; s.b0 = (x & (1ul << 24)) ? 1 : 0; } unsigned char copy (unsigned char n) { u_t u = {.c = n}; u_t v = {.c = i}; v.b0 = u.b0; v.b4 = u.b4; v.b7 = u.b7; return v.c; } unsigned char is_ne0 (unsigned char n) { u_t u = {.c = n}; return u.b0 | u.b1 | u.b2 | u.b3 | u.b4 | u.b5 | u.b6 | u.b7; } #endif