I hit an interesting bug (compiler?) The first line below will cause a proc exception 4, while the second+third lines will work. I have ran into something several times where passing a pointer and post incrementing will cause bugs and expanding/separating it fixes the issue.
uint8_t c = pgm_read_byte(p++); // proc exception code 4
uint8_t c = pgm_read_byte(p);
I found the problem this morning. It was improper handling of macro variables, the variable was referenced more than once, so it would increment the variable at all locations, and the exception happens due to the ROM memory requires 32 bit aligned reads.