D-mo - 2023-09-14

Using some ugly macromancy, I came up with this:

extern byte reg[256];

#define _define_register(name, addr) \
    enum { name = addr }; __sfr __banked __at (name) reg_ ## name; \
    inline void _reg_write_ ## name(byte val) { reg_ ## name = val; reg[name] = val; } \
    inline byte _reg_read_ ## name() { reg[name] = reg_ ## name; return reg[name]; }

#define reg_write(name, val) _reg_write_ ## name(val)
#define reg_read(name) _reg_read_ ## name()

_define_register(gcsr , 0x00)
_define_register(wdtcr, 0x08)
_define_register(wdttr, 0x09)
...

So, now I can do things like:

reg_write(gcsr, reg[gcsr] | 0x03);

If anyone can think of a better solution, please let me know.

 

Last edit: D-mo 2023-09-19