Чтобы не мудрить со всеми свичами, циклами и режимами адресации, я делаю очень просто - двумерный массив структур:
struct OpCode{
void* handler; //Указатель на обработчик
int cycles; //Сколько циклов занимает
AddrType addressing; //Режим адресации
};
Потом беру из массива internalMemory 1 байт, и по этой таблице его обрабатываю. Я думаю, это будет быстрее и надёжнее всяких switch'ей, к тому же, всё в одном месте. Так как массивы хранятся в памяти просто подряд, и поля структур тоже, то проблем с оптимизацией не будет. Плюс, можно сделать фиксированное кол-во бит для каждого поля структуры, не допуская лишних ноликов(такое бывает).