diff options
author | Mike Pavone <pavone@retrodev.com> | 2013-01-22 20:24:14 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2013-01-22 20:24:14 -0800 |
commit | 532920c4aa8b2ecbabc0901e2d6fe1c609605f81 (patch) | |
tree | cfb71a9aa855694fa91630fcb1aa4fdc76715c1d | |
parent | 5b37f044e00102230263c33d0b45b55d0716671b (diff) |
Add support for 2-byte IY instructions to decoder
-rw-r--r-- | z80inst.c | 283 | ||||
-rw-r--r-- | z80inst.h | 2 |
2 files changed, 285 insertions, 0 deletions
@@ -765,6 +765,282 @@ z80inst z80_tbl_ix[256] = { NOP2 }; + +z80inst z80_tbl_iy[256] = { + //0 + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_ADD, Z80_IY, Z80_REG, Z80_BC, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //1 + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_ADD, Z80_IY, Z80_REG, Z80_DE, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //2 + NOP2, + {Z80_LD, Z80_IY, Z80_IMMED, Z80_UNUSED, 0}, + {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, + {Z80_INC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_INC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_DEC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_LD, Z80_IYH, Z80_IMMED, Z80_UNUSED, 0}, + NOP2, + NOP2, + {Z80_ADD, Z80_IY, Z80_REG, Z80_IY, 0}, + {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, + {Z80_DEC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_INC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_DEC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0}, + {Z80_LD, Z80_IYL, Z80_IMMED, Z80_UNUSED, 0}, + NOP2, + //3 + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_INC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0}, + {Z80_DEC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0}, + {Z80_LD, Z80_USE_IMMED, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + NOP2, + NOP2, + {Z80_ADD, Z80_IY, Z80_REG, Z80_SP, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //4 + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_B, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_B, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_B, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_C, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_C, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_C, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //5 + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_D, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_D, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_D, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_E, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_E, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_E, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //6 + {Z80_LD, Z80_IYH, Z80_REG, Z80_B, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_C, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_D, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_E, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_H, Z80_IY_DISPLACE, 0, 0}, + {Z80_LD, Z80_IYH, Z80_REG, Z80_A, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_B, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_C, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_D, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_E, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_L, Z80_IY_DISPLACE, 0, 0}, + {Z80_LD, Z80_IYL, Z80_REG, Z80_A, 0}, + //7 + {Z80_LD, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + {Z80_LD, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + {Z80_LD, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + {Z80_LD, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + {Z80_LD, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + {Z80_LD, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + NOP2, + {Z80_LD, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_LD, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_LD, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //8 + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_ADD, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_ADD, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_ADD, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_ADC, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_ADC, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_ADC, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //9 + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_SUB, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_SUB, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_SUB, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_SBC, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_SBC, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_SBC, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //A + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_AND, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_AND, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_AND, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_XOR, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_XOR, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_XOR, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //B + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_OR, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_OR, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_OR, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_CP, Z80_A, Z80_REG, Z80_IYH, 0}, + {Z80_CP, Z80_A, Z80_REG, Z80_IYL, 0}, + {Z80_CP, Z80_A, Z80_IY_DISPLACE, 0, 0}, + NOP2, + //C + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //D + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //E + NOP2, + {Z80_POP, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, + NOP2, + {Z80_EX, Z80_IY, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0}, + NOP2, + {Z80_PUSH, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, + NOP2, + NOP2, + NOP2, + {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IY, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + //F + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + {Z80_LD, Z80_SP, Z80_REG, Z80_IY, 0}, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2, + NOP2 +}; + uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) { if (*istream == 0xCB) { @@ -784,6 +1060,11 @@ uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) memcpy(decoded, z80_tbl_extd + *istream-0x40, sizeof(z80inst)); } } else if (*istream == 0xFD) { + istream++; + if (*istream == 0xCB) { + } else { + memcpy(decoded, z80_tbl_iy + *istream, sizeof(z80inst)); + } } else { memcpy(decoded, z80_tbl_a + *istream, sizeof(z80inst)); @@ -891,6 +1172,8 @@ char * z80_regs[Z80_USE_IMMED] = { "a", "ixh", "ixl", + "iyh", + "iyl", "i", "r", "bc", @@ -81,6 +81,8 @@ enum { Z80_A=7, Z80_IXH, Z80_IXL, + Z80_IYH, + Z80_IYL, Z80_I, Z80_R, Z80_BC, |