HG51B::HG51B() { #define bind(id, name, ...) { \ if(instructionTable[id]) throw; \ instructionTable[id] = [=] { return instruction##name(__VA_ARGS__); }; \ } #define pattern(s) \ std::integral_constant::value static const uint5 shifts[] = {0, 1, 8, 16}; //NOP for(uint10 null : range(1024)) { auto opcode = pattern("0000 00.. .... ...."); bind(opcode | null << 0, NOP); } //??? for(uint10 null : range(1024)) { auto opcode = pattern("0000 01.. .... ...."); bind(opcode | null << 0, NOP); } //JMP imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0000 10f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JMP, data, far, 1); } //JMP EQ,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0000 11f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JMP, data, far, r.z); } //JMP GE,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0001 00f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JMP, data, far, r.c); } //JMP MI,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0001 01f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JMP, data, far, r.n); } //JMP VS,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0001 10f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JMP, data, far, r.v); } //WAIT for(uint10 null : range(1024)) { auto opcode = pattern("0001 11.. .... ...."); bind(opcode | null << 0, WAIT); } //??? for(uint10 null : range(1024)) { auto opcode = pattern("0010 00.. .... ...."); bind(opcode | null << 0, NOP); } //SKIP V for(uint1 take : range( 2)) for(uint7 null : range(128)) { auto opcode = pattern("0010 0100 .... ...t"); bind(opcode | take << 0 | null << 1, SKIP, take, r.v); } //SKIP C for(uint1 take : range( 2)) for(uint7 null : range(128)) { auto opcode = pattern("0010 0101 .... ...t"); bind(opcode | take << 0 | null << 1, SKIP, take, r.c); } //SKIP Z for(uint1 take : range( 2)) for(uint7 null : range(128)) { auto opcode = pattern("0010 0110 .... ...t"); bind(opcode | take << 0 | null << 1, SKIP, take, r.z); } //SKIP N for(uint1 take : range( 2)) for(uint7 null : range(128)) { auto opcode = pattern("0010 0111 .... ...t"); bind(opcode | take << 0 | null << 1, SKIP, take, r.n); } //JSR for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0010 10f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JSR, data, far, 1); } //JSR EQ,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0010 11f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JSR, data, far, r.z); } //JSR GE,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0011 00f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JSR, data, far, r.c); } //JSR MI,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0011 01f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JSR, data, far, r.n); } //JSR VS,imm for(uint8 data : range(256)) for(uint1 null : range( 2)) for(uint1 far : range( 2)) { auto opcode = pattern("0011 10f. dddd dddd"); bind(opcode | data << 0 | null << 8 | far << 9, JSR, data, far, r.v); } //RTS for(uint10 null : range(1024)) { auto opcode = pattern("0011 11.. .... ...."); bind(opcode | null << 0, RTS); } //INC MAR for(uint10 null : range(1024)) { auto opcode = pattern("0100 00.. .... ...."); bind(opcode | null << 0, INC, r.mar); } //??? for(uint10 null : range(1024)) { auto opcode = pattern("0100 01.. .... ...."); bind(opcode | null << 0, NOP); } //CMPR A<