diff z80inst.c @ 206:807ca611b561

Add support for IY bit instructions to decoder
author Mike Pavone <pavone@retrodev.com>
date Wed, 23 Jan 2013 21:54:58 -0800
parents 19b323614309
children 4d4559b04c59
line wrap: on
line diff
--- a/z80inst.c	Wed Jan 23 21:50:54 2013 -0800
+++ b/z80inst.c	Wed Jan 23 21:54:58 2013 -0800
@@ -1121,6 +1121,87 @@
 	NOP2
 };
 
+#define SHIFT_BLOCK_IY(op) \
+	{op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_UNUSED, Z80_IY_DISPLACE | Z80_DIR, 0, 0},\
+	{op, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0}
+
+#define BIT_BLOCK_IY(bit) \
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit}
+
+#define BIT_BLOCK_IY_REG(op, bit) \
+	{op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
+	{op, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
+	{op, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, bit}
+
+z80inst z80_tbl_iy_bit[256] = {
+	//0
+	SHIFT_BLOCK_IY(Z80_RLC),
+	SHIFT_BLOCK_IY(Z80_RRC),
+	//1
+	SHIFT_BLOCK_IY(Z80_RL),
+	SHIFT_BLOCK_IY(Z80_RR),
+	//2
+	SHIFT_BLOCK_IY(Z80_SLA),
+	SHIFT_BLOCK_IY(Z80_SRA),
+	//3
+	SHIFT_BLOCK_IY(Z80_SLL),
+	SHIFT_BLOCK_IY(Z80_SRL),
+	//4
+	BIT_BLOCK_IY(0),
+	BIT_BLOCK_IY(1),
+	//5
+	BIT_BLOCK_IY(2),
+	BIT_BLOCK_IY(3),
+	//6
+	BIT_BLOCK_IY(4),
+	BIT_BLOCK_IY(5),
+	//7
+	BIT_BLOCK_IY(6),
+	BIT_BLOCK_IY(7),
+	//8
+	BIT_BLOCK_IY_REG(Z80_RES, 0),
+	BIT_BLOCK_IY_REG(Z80_RES, 1),
+	//9
+	BIT_BLOCK_IY_REG(Z80_RES, 2),
+	BIT_BLOCK_IY_REG(Z80_RES, 3),
+	//A
+	BIT_BLOCK_IY_REG(Z80_RES, 4),
+	BIT_BLOCK_IY_REG(Z80_RES, 5),
+	//B
+	BIT_BLOCK_IY_REG(Z80_RES, 6),
+	BIT_BLOCK_IY_REG(Z80_RES, 7),
+	//C
+	BIT_BLOCK_IY_REG(Z80_SET, 0),
+	BIT_BLOCK_IY_REG(Z80_SET, 1),
+	//D
+	BIT_BLOCK_IY_REG(Z80_SET, 2),
+	BIT_BLOCK_IY_REG(Z80_SET, 3),
+	//E
+	BIT_BLOCK_IY_REG(Z80_SET, 4),
+	BIT_BLOCK_IY_REG(Z80_SET, 5),
+	//F
+	BIT_BLOCK_IY_REG(Z80_SET, 6),
+	BIT_BLOCK_IY_REG(Z80_SET, 7),
+};
+
 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded)
 {
 	uint8_t tmp;
@@ -1150,6 +1231,10 @@
 	} else if (*istream == 0xFD) {
 		istream++;
 		if (*istream == 0xCB) {
+			tmp = *(++istream);
+			istream++;
+			memcpy(decoded, z80_tbl_iy_bit + *istream, sizeof(z80inst));
+			decoded->ea_reg = tmp;
 		} else {
 			memcpy(decoded, z80_tbl_iy + *istream, sizeof(z80inst));
 			if ((decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) {