summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2009-04-04 22:43:56 +0000
committer Aaron Giles <aaron@aarongiles.com>2009-04-04 22:43:56 +0000
commit09aefa137970ec6af54ae7135c8fe2b7d17a56eb (patch)
tree52208b307b02f58c8ed67d2e243004802fab44a4
parentb09944610a2e4c6a646e5a58ba102dfd7d5d6bb6 (diff)
Changed Z80 cycle table definitions to be per-device. Removed
old set_info constants for the tables; they are now set up via the z80_set_cycle_tables function.
-rw-r--r--src/emu/cpu/z80/z80.c87
-rw-r--r--src/emu/cpu/z80/z80.h22
2 files changed, 48 insertions, 61 deletions
diff --git a/src/emu/cpu/z80/z80.c b/src/emu/cpu/z80/z80.c
index 13253ca42bf..5a64b86caa7 100644
--- a/src/emu/cpu/z80/z80.c
+++ b/src/emu/cpu/z80/z80.c
@@ -120,22 +120,28 @@
typedef struct _z80_state z80_state;
struct _z80_state
{
- PAIR prvpc,pc,sp,af,bc,de,hl,ix,iy,memptr;
- PAIR af2,bc2,de2,hl2;
- UINT8 r,r2,iff1,iff2,halt,im,i;
- UINT8 nmi_state; /* nmi line state */
- UINT8 nmi_pending; /* nmi pending */
- UINT8 irq_state; /* irq line state */
- UINT8 after_ei; /* are we in the EI shadow? */
- UINT32 ea;
+ PAIR prvpc,pc,sp,af,bc,de,hl,ix,iy,memptr;
+ PAIR af2,bc2,de2,hl2;
+ UINT8 r,r2,iff1,iff2,halt,im,i;
+ UINT8 nmi_state; /* nmi line state */
+ UINT8 nmi_pending; /* nmi pending */
+ UINT8 irq_state; /* irq line state */
+ UINT8 after_ei; /* are we in the EI shadow? */
+ UINT32 ea;
cpu_irq_callback irq_callback;
const device_config *device;
const address_space *program;
const address_space *io;
- int icount;
+ int icount;
z80_daisy_state *daisy;
cpu_state_table state;
- UINT8 rtemp;
+ UINT8 rtemp;
+ const UINT8 * cc_op;
+ const UINT8 * cc_cb;
+ const UINT8 * cc_ed;
+ const UINT8 * cc_xy;
+ const UINT8 * cc_xycb;
+ const UINT8 * cc_ex;
};
INLINE z80_state *get_safe_token(const device_config *device)
@@ -376,9 +382,8 @@ static const UINT8 cc_ex[0x100] = {
6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2};
-static const UINT8 *cc[6];
-#define Z80_TABLE_dd Z80_TABLE_xy
-#define Z80_TABLE_fd Z80_TABLE_xy
+#define cc_dd cc_xy
+#define cc_fd cc_xy
static void take_interrupt(z80_state *z80);
static CPU_BURN( z80 );
@@ -513,7 +518,7 @@ INLINE void BURNODD(z80_state *z80, int cycles, int opcodes, int cyclesum)
/***************************************************************
* adjust cycle count by n T-states
***************************************************************/
-#define CC(Z,prefix,opcode) do { (Z)->icount -= cc[Z80_TABLE_##prefix][opcode]; } while (0)
+#define CC(Z,prefix,opcode) do { (Z)->icount -= z80->cc_##prefix[opcode]; } while (0)
/***************************************************************
* execute an opcode
@@ -3284,7 +3289,7 @@ static void take_interrupt(z80_state *z80)
RM16(z80, irq_vector, &z80->pc);
LOG(("Z80 '%s' IM2 [$%04x] = $%04x\n", z80->device->tag, irq_vector, z80->PCD));
/* CALL opcode timing */
- z80->icount -= cc[Z80_TABLE_op][0xcd];
+ z80->icount -= z80->cc_op[0xcd];
}
else
/* Interrupt mode 1. RST 38h */
@@ -3294,7 +3299,7 @@ static void take_interrupt(z80_state *z80)
PUSH(z80, pc);
z80->PCD = 0x0038;
/* RST $38 + 'interrupt latency' cycles */
- z80->icount -= cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff];
+ z80->icount -= z80->cc_op[0xff] + cc_ex[0xff];
}
else
{
@@ -3308,18 +3313,18 @@ static void take_interrupt(z80_state *z80)
PUSH(z80, pc);
z80->PCD = irq_vector & 0xffff;
/* CALL $xxxx + 'interrupt latency' cycles */
- z80->icount -= cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff];
+ z80->icount -= z80->cc_op[0xcd] + z80->cc_ex[0xff];
break;
case 0xc30000: /* jump */
z80->PCD = irq_vector & 0xffff;
/* JP $xxxx + 2 cycles */
- z80->icount -= cc[Z80_TABLE_op][0xc3] + cc[Z80_TABLE_ex][0xff];
+ z80->icount -= z80->cc_op[0xc3] + z80->cc_ex[0xff];
break;
default: /* rst (or other opcodes?) */
PUSH(z80, pc);
z80->PCD = irq_vector & 0x0038;
/* RST $xx + 2 cycles */
- z80->icount -= cc[Z80_TABLE_op][z80->PCD] + cc[Z80_TABLE_ex][z80->PCD];
+ z80->icount -= z80->cc_op[z80->PCD] + z80->cc_ex[z80->PCD];
break;
}
}
@@ -3334,14 +3339,6 @@ static CPU_INIT( z80 )
z80_state *z80 = get_safe_token(device);
int i, p;
- /* setup cycle tables */
- cc[Z80_TABLE_op] = cc_op;
- cc[Z80_TABLE_cb] = cc_cb;
- cc[Z80_TABLE_ed] = cc_ed;
- cc[Z80_TABLE_xy] = cc_xy;
- cc[Z80_TABLE_xycb] = cc_xycb;
- cc[Z80_TABLE_ex] = cc_ex;
-
if( !SZHVC_add || !SZHVC_sub )
{
int oldval, newval, val;
@@ -3465,6 +3462,14 @@ static CPU_INIT( z80 )
z80->state = state_table_template;
z80->state.baseptr = z80;
z80->state.subtypemask = 1;
+
+ /* setup cycle tables */
+ z80->cc_op = cc_op;
+ z80->cc_cb = cc_cb;
+ z80->cc_ed = cc_ed;
+ z80->cc_xy = cc_xy;
+ z80->cc_xycb = cc_xycb;
+ z80->cc_ex = cc_ex;
}
/****************************************************************************
@@ -3630,18 +3635,21 @@ static CPU_SET_INFO( z80 )
{
/* --- the following bits of info are set as 64-bit signed integers --- */
case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: set_irq_line(z80, INPUT_LINE_NMI, info->i); break;
- case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(z80, 0, info->i); break;
-
- /* --- the following bits of info are set as pointers to data or functions --- */
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op: cc[Z80_TABLE_op] = (const UINT8 *)info->p; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb: cc[Z80_TABLE_cb] = (const UINT8 *)info->p; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed: cc[Z80_TABLE_ed] = (const UINT8 *)info->p; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy: cc[Z80_TABLE_xy] = (const UINT8 *)info->p; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb: cc[Z80_TABLE_xycb] = (const UINT8 *)info->p; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex: cc[Z80_TABLE_ex] = (const UINT8 *)info->p; break;
+ case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(z80, 0, info->i); break;
}
}
+void z80_set_cycle_tables(const device_config *device, const UINT8 *op, const UINT8 *cb, const UINT8 *ed, const UINT8 *xy, const UINT8 *xycb, const UINT8 *ex)
+{
+ z80_state *z80 = get_safe_token(device);
+
+ z80->cc_op = (op != NULL) ? op : cc_op;
+ z80->cc_cb = (cb != NULL) ? cb : cc_cb;
+ z80->cc_ed = (ed != NULL) ? ed : cc_ed;
+ z80->cc_xy = (xy != NULL) ? xy : cc_xy;
+ z80->cc_xycb = (xycb != NULL) ? xycb : cc_xycb;
+ z80->cc_ex = (ex != NULL) ? ex : cc_ex;
+}
/**************************************************************************
@@ -3689,13 +3697,6 @@ CPU_GET_INFO( z80 )
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &z80->icount; break;
case CPUINFO_PTR_STATE_TABLE: info->state_table = &z80->state; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op: info->p = (void *)cc[Z80_TABLE_op]; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb: info->p = (void *)cc[Z80_TABLE_cb]; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed: info->p = (void *)cc[Z80_TABLE_ed]; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy: info->p = (void *)cc[Z80_TABLE_xy]; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb: info->p = (void *)cc[Z80_TABLE_xycb]; break;
- case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex: info->p = (void *)cc[Z80_TABLE_ex]; break;
-
/* --- the following bits of info are returned as NULL-terminated strings --- */
case CPUINFO_STR_NAME: strcpy(info->s, "Z80"); break;
case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Zilog Z80"); break;
diff --git a/src/emu/cpu/z80/z80.h b/src/emu/cpu/z80/z80.h
index 109fcc9e65b..d6a0aa197e3 100644
--- a/src/emu/cpu/z80/z80.h
+++ b/src/emu/cpu/z80/z80.h
@@ -19,25 +19,11 @@ enum
Z80_GENPCBASE = REG_GENPCBASE
};
-enum
-{
- Z80_TABLE_op,
- Z80_TABLE_cb,
- Z80_TABLE_ed,
- Z80_TABLE_xy,
- Z80_TABLE_xycb,
- Z80_TABLE_ex /* cycles counts for taken jr/jp/call and interrupt latency (rst opcodes) */
-};
-
-enum
-{
- CPUINFO_PTR_Z80_CYCLE_TABLE = CPUINFO_PTR_CPU_SPECIFIC,
- CPUINFO_PTR_Z80_CYCLE_TABLE_LAST = CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex
-};
-
-extern CPU_GET_INFO( z80 );
+CPU_GET_INFO( z80 );
#define CPU_Z80 CPU_GET_INFO_NAME( z80 )
-extern CPU_DISASSEMBLE( z80 );
+CPU_DISASSEMBLE( z80 );
+
+void z80_set_cycle_tables(const device_config *device, const UINT8 *op, const UINT8 *cb, const UINT8 *ed, const UINT8 *xy, const UINT8 *xycb, const UINT8 *ex);
#endif /* __Z80_H__ */