Mercurial > repos > blastem
changeset 204:02dfa5962522
Add support for 2-byte IY instructions to decoder
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 22 Jan 2013 20:24:14 -0800 |
parents | 0ae589d4c3f9 |
children | 19b323614309 |
files | z80inst.c z80inst.h |
diffstat | 2 files changed, 285 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/z80inst.c Tue Jan 22 20:21:05 2013 -0800 +++ b/z80inst.c Tue Jan 22 20:24:14 2013 -0800 @@ -765,6 +765,282 @@ 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 @@ 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 @@ "a", "ixh", "ixl", + "iyh", + "iyl", "i", "r", "bc",