summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-01-22 20:24:14 -0800
committerMike Pavone <pavone@retrodev.com>2013-01-22 20:24:14 -0800
commit532920c4aa8b2ecbabc0901e2d6fe1c609605f81 (patch)
treecfb71a9aa855694fa91630fcb1aa4fdc76715c1d
parent5b37f044e00102230263c33d0b45b55d0716671b (diff)
Add support for 2-byte IY instructions to decoder
-rw-r--r--z80inst.c283
-rw-r--r--z80inst.h2
2 files changed, 285 insertions, 0 deletions
diff --git a/z80inst.c b/z80inst.c
index 2461736..e92b126 100644
--- a/z80inst.c
+++ b/z80inst.c
@@ -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",
diff --git a/z80inst.h b/z80inst.h
index b5f0e9f..607d68c 100644
--- a/z80inst.h
+++ b/z80inst.h
@@ -81,6 +81,8 @@ enum {
Z80_A=7,
Z80_IXH,
Z80_IXL,
+ Z80_IYH,
+ Z80_IYL,
Z80_I,
Z80_R,
Z80_BC,