It's useful for an emulator to at minimum skip the correct number of bytes when encountering unofficial instructions. Perhaps people could share some approaches. I'll start with the shortest code I could come up with. It assumes you've already read the opcode and advanced pc to the next byte.
There's also the table approach
EDIT: fixed JSR/JMP lens
Code:
pc += (0xA280414082444141 >> ((opcode & 0x1F) * 2) & 3) + ((opcode & 0x9F) == 0x82);
There's also the table approach
Code:
static int const instr_lens [256] = { // lengths including opcode
2,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 0
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 1
3,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 2
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 3
2,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 4
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 5
3,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 6
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 7
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// 8
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 9
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// A
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// B
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// C
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// D
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// E
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// F
};
pc += instr_lens [opcode] - 1;
2,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 0
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 1
3,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 2
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 3
2,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 4
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 5
3,2,1,2,2,2,2,2,1,2,1,2,3,3,3,3,// 6
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 7
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// 8
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// 9
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// A
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// B
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// C
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// D
2,2,2,2,2,2,2,2,1,2,1,2,3,3,3,3,// E
2,2,1,2,2,2,2,2,1,3,1,3,3,3,3,3,// F
};
pc += instr_lens [opcode] - 1;
EDIT: fixed JSR/JMP lens