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",
--- 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,