1 struct flag_t {
2   bool n, v, p, b, h, i, z, c;
3 
operator unsignedflag_t4   inline operator unsigned() const {
5     return (n << 7) | (v << 6) | (p << 5) | (b << 4)
6          | (h << 3) | (i << 2) | (z << 1) | (c << 0);
7   }
8 
operator =flag_t9   inline unsigned operator=(uint8_t data) {
10     n = data & 0x80; v = data & 0x40; p = data & 0x20; b = data & 0x10;
11     h = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01;
12     return data;
13   }
14 
operator |=flag_t15   inline unsigned operator|=(uint8_t data) { return operator=(operator unsigned() | data); }
operator ^=flag_t16   inline unsigned operator^=(uint8_t data) { return operator=(operator unsigned() ^ data); }
operator &=flag_t17   inline unsigned operator&=(uint8_t data) { return operator=(operator unsigned() & data); }
18 };
19 
20 struct word_t {
21   union {
22     uint16_t w;
23 #ifdef BLARGG_BIG_ENDIAN
24     struct { uint8_t h, l; };
25 #else
26     struct { uint8_t l, h; };
27 #endif
28   };
29 
operator unsignedword_t30   inline operator unsigned() const { return w; }
operator =word_t31   inline unsigned operator=(unsigned data) { return w = data; }
32 
operator ++word_t33   inline unsigned operator++() { return ++w; }
operator --word_t34   inline unsigned operator--() { return --w; }
35 
operator ++word_t36   inline unsigned operator++(int) { unsigned data = w++; return data; }
operator --word_t37   inline unsigned operator--(int) { unsigned data = w--; return data; }
38 
operator +=word_t39   inline unsigned operator+=(unsigned data) { return w += data;; }
operator -=word_t40   inline unsigned operator-=(unsigned data) { return w -= data;; }
41 
operator |=word_t42   inline unsigned operator|=(unsigned data) { return w |= data; }
operator ^=word_t43   inline unsigned operator^=(unsigned data) { return w ^= data; }
operator &=word_t44   inline unsigned operator&=(unsigned data) { return w &= data; }
45 };
46 
47 struct regs_t {
48   word_t pc;
49   union {
50     uint16_t ya;
51 #ifdef BLARGG_BIG_ENDIAN
52     struct { uint8_t y, a; };
53 #else
54     struct { uint8_t a, y; };
55 #endif
56   };
57   uint8_t x, s;
58   flag_t p;
59 };
60