# HG changeset patch # User Mike Pavone # Date 1358915054 28800 # Node ID 02dfa5962522eb787801194748405b6e28d5cebb # Parent 0ae589d4c3f9b2701eb1c0a8ae4d2a04cafaa60b Add support for 2-byte IY instructions to decoder diff -r 0ae589d4c3f9 -r 02dfa5962522 z80inst.c --- 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", diff -r 0ae589d4c3f9 -r 02dfa5962522 z80inst.h --- a/z80inst.h Tue Jan 22 20:21:05 2013 -0800 +++ b/z80inst.h Tue Jan 22 20:24:14 2013 -0800 @@ -81,6 +81,8 @@ Z80_A=7, Z80_IXH, Z80_IXL, + Z80_IYH, + Z80_IYL, Z80_I, Z80_R, Z80_BC,