summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/cpu/i8085/i8085.c1218
-rw-r--r--src/emu/cpu/i8085/i8085.h154
-rw-r--r--src/emu/cpu/i8085/i8085cpu.h132
-rw-r--r--src/mame/audio/redalert.c12
-rw-r--r--src/mame/drivers/dwarfd.c12
-rw-r--r--src/mame/drivers/n8080.c20
-rw-r--r--src/mame/drivers/phoenix.c10
-rw-r--r--src/mame/video/phoenix.c2
-rw-r--r--src/mess/drivers/bob85.c11
-rw-r--r--src/mess/drivers/exp85.c11
-rw-r--r--src/mess/drivers/fp200.c11
-rw-r--r--src/mess/drivers/h8.c11
-rw-r--r--src/mess/drivers/kyocera.c20
-rw-r--r--src/mess/drivers/mikromik.c15
-rw-r--r--src/mess/drivers/mmd1.c11
-rw-r--r--src/mess/drivers/sitcom.c11
-rw-r--r--src/mess/drivers/tdv2324.c28
-rw-r--r--src/mess/machine/shark.c14
18 files changed, 769 insertions, 934 deletions
diff --git a/src/emu/cpu/i8085/i8085.c b/src/emu/cpu/i8085/i8085.c
index 0ae95b15bcb..02710d90120 100644
--- a/src/emu/cpu/i8085/i8085.c
+++ b/src/emu/cpu/i8085/i8085.c
@@ -151,49 +151,11 @@
/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-struct i8085_state
-{
- i8085_config config;
-
- devcb_resolved_write8 out_status_func;
- devcb_resolved_write_line out_inte_func;
- devcb_resolved_read_line in_sid_func;
- devcb_resolved_write_line out_sod_func;
-
- int cputype; /* 0 8080, 1 8085A */
- PAIR PC,SP,AF,BC,DE,HL,WZ;
- UINT8 HALT;
- UINT8 IM; /* interrupt mask (8085A only) */
- UINT8 STATUS; /* status word */
-
- UINT8 after_ei; /* post-EI processing; starts at 2, check for ints at 0 */
- UINT8 nmi_state; /* raw NMI line state */
- UINT8 irq_state[4]; /* raw IRQ line states */
- UINT8 trap_pending; /* TRAP interrupt latched? */
- UINT8 trap_im_copy; /* copy of IM register when TRAP was taken */
- UINT8 sod_state; /* state of the SOD line */
-
- UINT8 ietemp; /* import/export temp space */
-
- device_irq_acknowledge_callback irq_callback;
- legacy_cpu_device *device;
- address_space *program;
- direct_read_data *direct;
- address_space *io;
- int icount;
-};
-
-
-
-/***************************************************************************
MACROS
***************************************************************************/
-#define IS_8080(c) ((c)->cputype == CPUTYPE_8080)
-#define IS_8085(c) ((c)->cputype == CPUTYPE_8085)
+#define IS_8080() (m_cputype == CPUTYPE_8080)
+#define IS_8085() (m_cputype == CPUTYPE_8085)
@@ -202,7 +164,7 @@ struct i8085_state
***************************************************************************/
/* cycles lookup */
-static const UINT8 lut_cycles_8080[256]={
+const UINT8 i8085a_cpu_device::lut_cycles_8080[256]={
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 4, 10,7, 5, 5, 5, 7, 4, 4, 10,7, 5, 5, 5, 7, 4,
/* 1 */ 4, 10,7, 5, 5, 5, 7, 4, 4, 10,7, 5, 5, 5, 7, 4,
@@ -220,7 +182,7 @@ static const UINT8 lut_cycles_8080[256]={
/* D */ 5, 10,10,10,11,11,7, 11,5, 10,10,10,11,11,7, 11,
/* E */ 5, 10,10,18,11,11,7, 11,5, 5, 10,5, 11,11,7, 11,
/* F */ 5, 10,10,4, 11,11,7, 11,5, 5, 10,4, 11,11,7, 11 };
-static const UINT8 lut_cycles_8085[256]={
+const UINT8 i8085a_cpu_device::lut_cycles_8085[256]={
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 4, 10,7, 6, 4, 4, 7, 4, 10,10,7, 6, 4, 4, 7, 4,
/* 1 */ 7, 10,7, 6, 4, 4, 7, 4, 10,10,7, 6, 4, 4, 7, 4,
@@ -249,83 +211,99 @@ M_CALL 8080 11 +6(17) -0
M_CALL 8085 11 +7(18) -2(9)
*/
-static UINT8 lut_cycles[256];
-/* flags lookup */
-static UINT8 ZS[256];
-static UINT8 ZSP[256];
+const device_type I8080 = &device_creator<i8080_cpu_device>;
+const device_type I8080A = &device_creator<i8080a_cpu_device>;
+const device_type I8085A = &device_creator<i8085a_cpu_device>;
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
+i8085a_cpu_device::i8085a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : cpu_device(mconfig, I8085A, "MCS-85 8085A", tag, owner, clock, "i8085a", __FILE__)
+ , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0)
+ , m_io_config("io", ENDIANNESS_LITTLE, 8, 8, 0)
+ , m_out_status_func(*this)
+ , m_out_inte_func(*this)
+ , m_in_sid_func(*this)
+ , m_out_sod_func(*this)
+ , m_cputype(CPUTYPE_8085)
+{
+}
-static void execute_one(i8085_state *cpustate, int opcode);
+i8085a_cpu_device::i8085a_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int cputype)
+ : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
+ , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0)
+ , m_io_config("io", ENDIANNESS_LITTLE, 8, 8, 0)
+ , m_out_status_func(*this)
+ , m_out_inte_func(*this)
+ , m_in_sid_func(*this)
+ , m_out_sod_func(*this)
+ , m_cputype(cputype)
+{
+}
-/***************************************************************************
- INLINE FUNCTIONS
-***************************************************************************/
+i8080_cpu_device::i8080_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : i8085a_cpu_device(mconfig, I8080, "MCS-80 8080", tag, owner, clock, "i8080", __FILE__, CPUTYPE_8080)
+{
+}
+
-INLINE i8085_state *get_safe_token(device_t *device)
+i8080a_cpu_device::i8080a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : i8085a_cpu_device(mconfig, I8080A, "MCS-80 8080A", tag, owner, clock, "i8080a", __FILE__, CPUTYPE_8080)
{
- assert(device != NULL);
- assert(device->type() == I8080 ||
- device->type() == I8080A||
- device->type() == I8085A);
- return (i8085_state *)downcast<legacy_cpu_device *>(device)->token();
}
-INLINE void set_sod(i8085_state *cpustate, int state)
+
+void i8085a_cpu_device::set_sod(int state)
{
- if (state != 0 && cpustate->sod_state == 0)
+ if (state != 0 && m_sod_state == 0)
{
- cpustate->sod_state = 1;
- cpustate->out_sod_func(cpustate->sod_state);
+ m_sod_state = 1;
+ m_out_sod_func(m_sod_state);
}
- else if (state == 0 && cpustate->sod_state != 0)
+ else if (state == 0 && m_sod_state != 0)
{
- cpustate->sod_state = 0;
- cpustate->out_sod_func(cpustate->sod_state);
+ m_sod_state = 0;
+ m_out_sod_func(m_sod_state);
}
}
-INLINE void set_inte(i8085_state *cpustate, int state)
+void i8085a_cpu_device::set_inte(int state)
{
- if (state != 0 && (cpustate->IM & IM_IE) == 0)
+ if (state != 0 && (m_IM & IM_IE) == 0)
{
- cpustate->IM |= IM_IE;
- cpustate->out_inte_func(1);
+ m_IM |= IM_IE;
+ m_out_inte_func(1);
}
- else if (state == 0 && (cpustate->IM & IM_IE) != 0)
+ else if (state == 0 && (m_IM & IM_IE) != 0)
{
- cpustate->IM &= ~IM_IE;
- cpustate->out_inte_func(0);
+ m_IM &= ~IM_IE;
+ m_out_inte_func(0);
}
}
-INLINE void set_status(i8085_state *cpustate, UINT8 status)
+void i8085a_cpu_device::set_status(UINT8 status)
{
- if (status != cpustate->STATUS)
- cpustate->out_status_func(0, status);
+ if (status != m_STATUS)
+ m_out_status_func(status);
- cpustate->STATUS = status;
+ m_STATUS = status;
}
-INLINE UINT8 get_rim_value(i8085_state *cpustate)
+UINT8 i8085a_cpu_device::get_rim_value()
{
- UINT8 result = cpustate->IM;
- int sid = cpustate->in_sid_func();
+ UINT8 result = m_IM;
+ int sid = m_in_sid_func();
/* copy live RST5.5 and RST6.5 states */
result &= ~(IM_I65 | IM_I55);
- if (cpustate->irq_state[I8085_RST65_LINE]) result |= IM_I65;
- if (cpustate->irq_state[I8085_RST55_LINE]) result |= IM_I55;
+ if (m_irq_state[I8085_RST65_LINE]) result |= IM_I65;
+ if (m_irq_state[I8085_RST55_LINE]) result |= IM_I55;
/* fetch the SID bit if we have a callback */
result = (result & 0x7f) | (sid ? 0x80 : 0);
@@ -334,569 +312,564 @@ INLINE UINT8 get_rim_value(i8085_state *cpustate)
}
-INLINE void break_halt_for_interrupt(i8085_state *cpustate)
+void i8085a_cpu_device::break_halt_for_interrupt()
{
/* de-halt if necessary */
- if (cpustate->HALT)
+ if (m_HALT)
{
- cpustate->PC.w.l++;
- cpustate->HALT = 0;
- set_status(cpustate, 0x26); /* int ack while halt */
+ m_PC.w.l++;
+ m_HALT = 0;
+ set_status(0x26); /* int ack while halt */
}
else
- set_status(cpustate, 0x23); /* int ack */
+ set_status(0x23); /* int ack */
}
-INLINE UINT8 ROP(i8085_state *cpustate)
+UINT8 i8085a_cpu_device::ROP()
{
- set_status(cpustate, 0xa2); // instruction fetch
- return cpustate->direct->read_decrypted_byte(cpustate->PC.w.l++);
+ set_status(0xa2); // instruction fetch
+ return m_direct->read_decrypted_byte(m_PC.w.l++);
}
-INLINE UINT8 ARG(i8085_state *cpustate)
+UINT8 i8085a_cpu_device::ARG()
{
- return cpustate->direct->read_raw_byte(cpustate->PC.w.l++);
+ return m_direct->read_raw_byte(m_PC.w.l++);
}
-INLINE UINT16 ARG16(i8085_state *cpustate)
+UINT16 i8085a_cpu_device::ARG16()
{
UINT16 w;
- w = cpustate->direct->read_raw_byte(cpustate->PC.d);
- cpustate->PC.w.l++;
- w += cpustate->direct->read_raw_byte(cpustate->PC.d) << 8;
- cpustate->PC.w.l++;
+ w = m_direct->read_raw_byte(m_PC.d);
+ m_PC.w.l++;
+ w += m_direct->read_raw_byte(m_PC.d) << 8;
+ m_PC.w.l++;
return w;
}
-INLINE UINT8 RM(i8085_state *cpustate, UINT32 a)
+UINT8 i8085a_cpu_device::RM(UINT32 a)
{
- set_status(cpustate, 0x82); // memory read
- return cpustate->program->read_byte(a);
+ set_status(0x82); // memory read
+ return m_program->read_byte(a);
}
-INLINE void WM(i8085_state *cpustate, UINT32 a, UINT8 v)
+void i8085a_cpu_device::WM(UINT32 a, UINT8 v)
{
- set_status(cpustate, 0x00); // memory write
- cpustate->program->write_byte(a, v);
+ set_status(0x00); // memory write
+ m_program->write_byte(a, v);
}
-static void check_for_interrupts(i8085_state *cpustate)
+void i8085a_cpu_device::check_for_interrupts()
{
/* TRAP is the highest priority */
- if (cpustate->trap_pending)
+ if (m_trap_pending)
{
/* the first RIM after a TRAP reflects the original IE state; remember it here,
setting the high bit to indicate it is valid */
- cpustate->trap_im_copy = cpustate->IM | 0x80;
+ m_trap_im_copy = m_IM | 0x80;
/* reset the pending state */
- cpustate->trap_pending = FALSE;
+ m_trap_pending = FALSE;
/* break out of HALT state and call the IRQ ack callback */
- break_halt_for_interrupt(cpustate);
- if (cpustate->irq_callback != NULL)
- (*cpustate->irq_callback)(cpustate->device, INPUT_LINE_NMI);
+ break_halt_for_interrupt();
+ standard_irq_callback(INPUT_LINE_NMI);
/* push the PC and jump to $0024 */
M_PUSH(PC);
- set_inte(cpustate, 0);
- cpustate->PC.w.l = ADDR_TRAP;
- cpustate->icount -= 11;
+ set_inte(0);
+ m_PC.w.l = ADDR_TRAP;
+ m_icount -= 11;
}
/* followed by RST7.5 */
- else if ((cpustate->IM & IM_I75) && !(cpustate->IM & IM_M75) && (cpustate->IM & IM_IE))
+ else if ((m_IM & IM_I75) && !(m_IM & IM_M75) && (m_IM & IM_IE))
{
/* reset the pending state (which is CPU-visible via the RIM instruction) */
- cpustate->IM &= ~IM_I75;
+ m_IM &= ~IM_I75;
/* break out of HALT state and call the IRQ ack callback */
- break_halt_for_interrupt(cpustate);
- if (cpustate->irq_callback != NULL)
- (*cpustate->irq_callback)(cpustate->device, I8085_RST75_LINE);
+ break_halt_for_interrupt();
+ standard_irq_callback(I8085_RST75_LINE);
/* push the PC and jump to $003C */
M_PUSH(PC);
- set_inte(cpustate, 0);
- cpustate->PC.w.l = ADDR_RST75;
- cpustate->icount -= 11;
+ set_inte(0);
+ m_PC.w.l = ADDR_RST75;
+ m_icount -= 11;
}
/* followed by RST6.5 */
- else if (cpustate->irq_state[I8085_RST65_LINE] && !(cpustate->IM & IM_M65) && (cpustate->IM & IM_IE))
+ else if (m_irq_state[I8085_RST65_LINE] && !(m_IM & IM_M65) && (m_IM & IM_IE))
{
/* break out of HALT state and call the IRQ ack callback */
- break_halt_for_interrupt(cpustate);
- if (cpustate->irq_callback != NULL)
- (*cpustate->irq_callback)(cpustate->device, I8085_RST65_LINE);
+ break_halt_for_interrupt();
+ standard_irq_callback(I8085_RST65_LINE);
/* push the PC and jump to $0034 */
M_PUSH(PC);
- set_inte(cpustate, 0);
- cpustate->PC.w.l = ADDR_RST65;
- cpustate->icount -= 11;
+ set_inte(0);
+ m_PC.w.l = ADDR_RST65;
+ m_icount -= 11;
}
/* followed by RST5.5 */
- else if (cpustate->irq_state[I8085_RST55_LINE] && !(cpustate->IM & IM_M55) && (cpustate->IM & IM_IE))
+ else if (m_irq_state[I8085_RST55_LINE] && !(m_IM & IM_M55) && (m_IM & IM_IE))
{
/* break out of HALT state and call the IRQ ack callback */
- break_halt_for_interrupt(cpustate);
- if (cpustate->irq_callback != NULL)
- (*cpustate->irq_callback)(cpustate->device, I8085_RST55_LINE);
+ break_halt_for_interrupt();
+ standard_irq_callback(I8085_RST55_LINE);
/* push the PC and jump to $002C */
M_PUSH(PC);
- set_inte(cpustate, 0);
- cpustate->PC.w.l = ADDR_RST55;
- cpustate->icount -= 11;
+ set_inte(0);
+ m_PC.w.l = ADDR_RST55;
+ m_icount -= 11;
}
/* followed by classic INTR */
- else if (cpustate->irq_state[I8085_INTR_LINE] && (cpustate->IM & IM_IE))
+ else if (m_irq_state[I8085_INTR_LINE] && (m_IM & IM_IE))
{
UINT32 vector = 0;
/* break out of HALT state and call the IRQ ack callback */
- break_halt_for_interrupt(cpustate);
- if (cpustate->irq_callback != NULL)
- vector = (*cpustate->irq_callback)(cpustate->device, I8085_INTR_LINE);
+ break_halt_for_interrupt();
+ vector = standard_irq_callback(I8085_INTR_LINE);
/* use the resulting vector as an opcode to execute */
- set_inte(cpustate, 0);
+ set_inte(0);
switch (vector & 0xff0000)
{
case 0xcd0000: /* CALL nnnn */
- cpustate->icount -= 7;
+ m_icount -= 7;
M_PUSH(PC);
case 0xc30000: /* JMP nnnn */
- cpustate->icount -= 10;
- cpustate->PC.d = vector & 0xffff;
+ m_icount -= 10;
+ m_PC.d = vector & 0xffff;
break;
default:
LOG(("i8085 take int $%02x\n", vector));
- execute_one(cpustate, vector & 0xff);
+ execute_one(vector & 0xff);
break;
}
}
}
-static void execute_one(i8085_state *cpustate, int opcode)
+void i8085a_cpu_device::execute_one(int opcode)
{
- cpustate->icount -= lut_cycles[opcode];
+ m_icount -= lut_cycles[opcode];
switch (opcode)
{
case 0x00: break; /* NOP */
- case 0x01: cpustate->BC.w.l = ARG16(cpustate); break; /* LXI B,nnnn */
- case 0x02: WM(cpustate, cpustate->BC.d, cpustate->AF.b.h); break; /* STAX B */
- case 0x03: cpustate->BC.w.l++; /* INX B */
- if (IS_8085(cpustate)) { if (cpustate->BC.w.l == 0x0000) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x01: m_BC.w.l = ARG16(); break; /* LXI B,nnnn */
+ case 0x02: WM(m_BC.d, m_AF.b.h); break; /* STAX B */
+ case 0x03: m_BC.w.l++; /* INX B */
+ if (IS_8085()) { if (m_BC.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x04: M_INR(cpustate->BC.b.h); break; /* INR B */
- case 0x05: M_DCR(cpustate->BC.b.h); break; /* DCR B */
- case 0x06: M_MVI(cpustate->BC.b.h); break; /* MVI B,nn */
+ case 0x04: M_INR(m_BC.b.h); break; /* INR B */
+ case 0x05: M_DCR(m_BC.b.h); break; /* DCR B */
+ case 0x06: M_MVI(m_BC.b.h); break; /* MVI B,nn */
case 0x07: M_RLC; break; /* RLC */
- case 0x08: if (IS_8085(cpustate)) { M_DSUB(cpustate); } /* DSUB */
+ case 0x08: if (IS_8085()) { M_DSUB(); } /* DSUB */
/* else { ; } */ /* NOP undocumented */
break;
case 0x09: M_DAD(BC); break; /* DAD B */
- case 0x0a: cpustate->AF.b.h = RM(cpustate, cpustate->BC.d); break; /* LDAX B */
- case 0x0b: cpustate->BC.w.l--; /* DCX B */
- if (IS_8085(cpustate)) { if (cpustate->BC.w.l == 0xffff) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x0a: m_AF.b.h = RM(m_BC.d); break; /* LDAX B */
+ case 0x0b: m_BC.w.l--; /* DCX B */
+ if (IS_8085()) { if (m_BC.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x0c: M_INR(cpustate->BC.b.l); break; /* INR C */
- case 0x0d: M_DCR(cpustate->BC.b.l); break; /* DCR C */
- case 0x0e: M_MVI(cpustate->BC.b.l); break; /* MVI C,nn */
+ case 0x0c: M_INR(m_BC.b.l); break; /* INR C */
+ case 0x0d: M_DCR(m_BC.b.l); break; /* DCR C */
+ case 0x0e: M_MVI(m_BC.b.l); break; /* MVI C,nn */
case 0x0f: M_RRC; break; /* RRC */
- case 0x10: if (IS_8085(cpustate)) { /* ASRH */
- cpustate->AF.b.l = (cpustate->AF.b.l & ~CF) | (cpustate->HL.b.l & CF);
- cpustate->HL.w.l = (cpustate->HL.w.l >> 1);
+ case 0x10: if (IS_8085()) { /* ASRH */
+ m_AF.b.l = (m_AF.b.l & ~CF) | (m_HL.b.l & CF);
+ m_HL.w.l = (m_HL.w.l >> 1);
} /* else { ; } */ /* NOP undocumented */
break;
- case 0x11: cpustate->DE.w.l = ARG16(cpustate); break; /* LXI D,nnnn */
- case 0x12: WM(cpustate, cpustate->DE.d, cpustate->AF.b.h); break; /* STAX D */
- case 0x13: cpustate->DE.w.l++; /* INX D */
- if (IS_8085(cpustate)) { if (cpustate->DE.w.l == 0x0000) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x11: m_DE.w.l = ARG16(); break; /* LXI D,nnnn */
+ case 0x12: WM(m_DE.d, m_AF.b.h); break; /* STAX D */
+ case 0x13: m_DE.w.l++; /* INX D */
+ if (IS_8085()) { if (m_DE.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x14: M_INR(cpustate->DE.b.h); break; /* INR D */
- case 0x15: M_DCR(cpustate->DE.b.h); break; /* DCR D */
- case 0x16: M_MVI(cpustate->DE.b.h); break; /* MVI D,nn */
+ case 0x14: M_INR(m_DE.b.h); break; /* INR D */
+ case 0x15: M_DCR(m_DE.b.h); break; /* DCR D */
+ case 0x16: M_MVI(m_DE.b.h); break; /* MVI D,nn */
case 0x17: M_RAL; break; /* RAL */
- case 0x18: if (IS_8085(cpustate)) { /* RLDE */
- cpustate->AF.b.l = (cpustate->AF.b.l & ~(CF | VF)) | (cpustate->DE.b.h >> 7);
- cpustate->DE.w.l = (cpustate->DE.w.l << 1) | (cpustate->DE.w.l >> 15);
- if (0 != (((cpustate->DE.w.l >> 15) ^ cpustate->AF.b.l) & CF)) cpustate->AF.b.l |= VF;
+ case 0x18: if (IS_8085()) { /* RLDE */
+ m_AF.b.l = (m_AF.b.l & ~(CF | VF)) | (m_DE.b.h >> 7);
+ m_DE.w.l = (m_DE.w.l << 1) | (m_DE.w.l >> 15);
+ if (0 != (((m_DE.w.l >> 15) ^ m_AF.b.l) & CF)) m_AF.b.l |= VF;
} /* else { ; } */ /* NOP undocumented */
break;
case 0x19: M_DAD(DE); break; /* DAD D */
- case 0x1a: cpustate->AF.b.h = RM(cpustate, cpustate->DE.d); break; /* LDAX D */
- case 0x1b: cpustate->DE.w.l--; /* DCX D */
- if (IS_8085(cpustate)) { if (cpustate->DE.w.l == 0xffff) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x1a: m_AF.b.h = RM(m_DE.d); break; /* LDAX D */
+ case 0x1b: m_DE.w.l--; /* DCX D */
+ if (IS_8085()) { if (m_DE.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x1c: M_INR(cpustate->DE.b.l); break; /* INR E */
- case 0x1d: M_DCR(cpustate->DE.b.l); break; /* DCR E */
- case 0x1e: M_MVI(cpustate->DE.b.l); break; /* MVI E,nn */
+ case 0x1c: M_INR(m_DE.b.l); break; /* INR E */
+ case 0x1d: M_DCR(m_DE.b.l); break; /* DCR E */
+ case 0x1e: M_MVI(m_DE.b.l); break; /* MVI E,nn */
case 0x1f: M_RAR; break; /* RAR */
- case 0x20: if (IS_8085(cpustate)) { /* RIM */
- cpustate->AF.b.h = get_rim_value(cpustate);
+ case 0x20: if (IS_8085()) { /* RIM */
+ m_AF.b.h = get_rim_value();
/* if we have remembered state from taking a TRAP, fix up the IE flag here */
- if (cpustate->trap_im_copy & 0x80) cpustate->AF.b.h = (cpustate->AF.b.h & ~IM_IE) | (cpustate->trap_im_copy & IM_IE);
- cpustate->trap_im_copy = 0;
+ if (m_trap_im_copy & 0x80) m_AF.b.h = (m_AF.b.h & ~IM_IE) | (m_trap_im_copy & IM_IE);
+ m_trap_im_copy = 0;
} /* else { ; } */ /* NOP undocumented */
break;
- case 0x21: cpustate->HL.w.l = ARG16(cpustate); break; /* LXI H,nnnn */
- case 0x22: cpustate->WZ.w.l = ARG16(cpustate); /* SHLD nnnn */
- WM(cpustate, cpustate->WZ.d, cpustate->HL.b.l); cpustate->WZ.w.l++;
- WM(cpustate, cpustate->WZ.d, cpustate->HL.b.h);
+ case 0x21: m_HL.w.l = ARG16(); break; /* LXI H,nnnn */
+ case 0x22: m_WZ.w.l = ARG16(); /* SHLD nnnn */
+ WM(m_WZ.d, m_HL.b.l); m_WZ.w.l++;
+ WM(m_WZ.d, m_HL.b.h);
break;
- case 0x23: cpustate->HL.w.l++; /* INX H */
- if (IS_8085(cpustate)) { if (cpustate->HL.w.l == 0x0000) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x23: m_HL.w.l++; /* INX H */
+ if (IS_8085()) { if (m_HL.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x24: M_INR(cpustate->HL.b.h); break; /* INR H */
- case 0x25: M_DCR(cpustate->HL.b.h); break; /* DCR H */
- case 0x26: M_MVI(cpustate->HL.b.h); break; /* MVI H,nn */
- case 0x27: cpustate->WZ.b.h = cpustate->AF.b.h; /* DAA */
- if (IS_8085(cpustate) && cpustate->AF.b.l&VF) {
- if ((cpustate->AF.b.l&HF) | ((cpustate->AF.b.h&0xf)>9)) cpustate->WZ.b.h-=6;
- if ((cpustate->AF.b.l&CF) | (cpustate->AF.b.h>0x99)) cpustate->WZ.b.h-=0x60;
+ case 0x24: M_INR(m_HL.b.h); break; /* INR H */
+ case 0x25: M_DCR(m_HL.b.h); break; /* DCR H */
+ case 0x26: M_MVI(m_HL.b.h); break; /* MVI H,nn */
+ case 0x27: m_WZ.b.h = m_AF.b.h; /* DAA */
+ if (IS_8085() && m_AF.b.l&VF) {
+ if ((m_AF.b.l&HF) | ((m_AF.b.h&0xf)>9)) m_WZ.b.h-=6;
+ if ((m_AF.b.l&CF) | (m_AF.b.h>0x99)) m_WZ.b.h-=0x60;
}
else {
- if ((cpustate->AF.b.l&HF) | ((cpustate->AF.b.h&0xf)>9)) cpustate->WZ.b.h+=6;
- if ((cpustate->AF.b.l&CF) | (cpustate->AF.b.h>0x99)) cpustate->WZ.b.h+=0x60;
+ if ((m_AF.b.l&HF) | ((m_AF.b.h&0xf)>9)) m_WZ.b.h+=6;
+ if ((m_AF.b.l&CF) | (m_AF.b.h>0x99)) m_WZ.b.h+=0x60;
}
- cpustate->AF.b.l=(cpustate->AF.b.l&3) | (cpustate->AF.b.h&0x28) | (cpustate->AF.b.h>0x99) | ((cpustate->AF.b.h^cpustate->WZ.b.h)&0x10) | ZSP[cpustate->WZ.b.h];
- cpustate->AF.b.h=cpustate->WZ.b.h;
+ m_AF.b.l=(m_AF.b.l&3) | (m_AF.b.h&0x28) | (m_AF.b.h>0x99) | ((m_AF.b.h^m_WZ.b.h)&0x10) | ZSP[m_WZ.b.h];
+ m_AF.b.h=m_WZ.b.h;
break;
- case 0x28: if (IS_8085(cpustate)) { /* LDEH nn */
- cpustate->WZ.d = ARG(cpustate);
- cpustate->DE.d = (cpustate->HL.d + cpustate->WZ.d) & 0xffff;
+ case 0x28: if (IS_8085()) { /* LDEH nn */
+ m_WZ.d = ARG();
+ m_DE.d = (m_HL.d + m_WZ.d) & 0xffff;
} /* else { ; } */ /* NOP undocumented */
break;
case 0x29: M_DAD(HL); break; /* DAD H */
- case 0x2a: cpustate->WZ.d = ARG16(cpustate); /* LHLD nnnn */
- cpustate->HL.b.l = RM(cpustate, cpustate->WZ.d); cpustate->WZ.w.l++;
- cpustate->HL.b.h = RM(cpustate, cpustate->WZ.d);
+ case 0x2a: m_WZ.d = ARG16(); /* LHLD nnnn */
+ m_HL.b.l = RM(m_WZ.d); m_WZ.w.l++;
+ m_HL.b.h = RM(m_WZ.d);
break;
- case 0x2b: cpustate->HL.w.l--; /* DCX H */
- if (IS_8085(cpustate)) { if (cpustate->HL.w.l == 0xffff) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x2b: m_HL.w.l--; /* DCX H */
+ if (IS_8085()) { if (m_HL.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x2c: M_INR(cpustate->HL.b.l); break; /* INR L */
- case 0x2d: M_DCR(cpustate->HL.b.l); break; /* DCR L */
- case 0x2e: M_MVI(cpustate->HL.b.l); break; /* MVI L,nn */
- case 0x2f: cpustate->AF.b.h ^= 0xff; /* CMA */
- if (IS_8085(cpustate)) cpustate->AF.b.l |= HF | VF;
+ case 0x2c: M_INR(m_HL.b.l); break; /* INR L */
+ case 0x2d: M_DCR(m_HL.b.l); break; /* DCR L */
+ case 0x2e: M_MVI(m_HL.b.l); break; /* MVI L,nn */
+ case 0x2f: m_AF.b.h ^= 0xff; /* CMA */
+ if (IS_8085()) m_AF.b.l |= HF | VF;
break;
- case 0x30: if (IS_8085(cpustate)) { /* SIM */
+ case 0x30: if (IS_8085()) { /* SIM */
/* if bit 3 is set, bits 0-2 become the new masks */
- if (cpustate->AF.b.h & 0x08) {
- cpustate->IM &= ~(IM_M55 | IM_M65 | IM_M75 | IM_I55 | IM_I65);
- cpustate->IM |= cpustate->AF.b.h & (IM_M55 | IM_M65 | IM_M75);
+ if (m_AF.b.h & 0x08) {
+ m_IM &= ~(IM_M55 | IM_M65 | IM_M75 | IM_I55 | IM_I65);
+ m_IM |= m_AF.b.h & (IM_M55 | IM_M65 | IM_M75);
/* update live state based on the new masks */
- if ((cpustate->IM & IM_M55) == 0 && cpustate->irq_state[I8085_RST55_LINE]) cpustate->IM |= IM_I55;
- if ((cpustate->IM & IM_M65) == 0 && cpustate->irq_state[I8085_RST65_LINE]) cpustate->IM |= IM_I65;
+ if ((m_IM & IM_M55) == 0 && m_irq_state[I8085_RST55_LINE]) m_IM |= IM_I55;
+ if ((m_IM & IM_M65) == 0 && m_irq_state[I8085_RST65_LINE]) m_IM |= IM_I65;
}
/* bit if 4 is set, the 7.5 flip-flop is cleared */
- if (cpustate->AF.b.h & 0x10) cpustate->IM &= ~IM_I75;
+ if (m_AF.b.h & 0x10) m_IM &= ~IM_I75;
/* if bit 6 is set, then bit 7 is the new SOD state */
- if (cpustate->AF.b.h & 0x40) set_sod(cpustate, cpustate->AF.b.h >> 7);
+ if (m_AF.b.h & 0x40) set_sod(m_AF.b.h >> 7);
/* check for revealed interrupts */
- check_for_interrupts(cpustate);
+ check_for_interrupts();
} /* else { ; } */ /* NOP undocumented */
break;
- case 0x31: cpustate->SP.w.l = ARG16(cpustate); break; /* LXI SP,nnnn */
- case 0x32: cpustate->WZ.d = ARG16(cpustate); /* STAX nnnn */
- WM(cpustate, cpustate->WZ.d, cpustate->AF.b.h);
+ case 0x31: m_SP.w.l = ARG16(); break; /* LXI SP,nnnn */
+ case 0x32: m_WZ.d = ARG16(); /* STAX nnnn */
+ WM(m_WZ.d, m_AF.b.h);
break;
- case 0x33: cpustate->SP.w.l++; /* INX SP */
- if (IS_8085(cpustate)) { if (cpustate->SP.w.l == 0x0000) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x33: m_SP.w.l++; /* INX SP */
+ if (IS_8085()) { if (m_SP.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x34: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); /* INR M */
- M_INR(cpustate->WZ.b.l);
- WM(cpustate, cpustate->HL.d, cpustate->WZ.b.l);
+ case 0x34: m_WZ.b.l = RM(m_HL.d); /* INR M */
+ M_INR(m_WZ.b.l);
+ WM(m_HL.d, m_WZ.b.l);
break;
- case 0x35: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); /* DCR M */
- M_DCR(cpustate->WZ.b.l);
- WM(cpustate, cpustate->HL.d, cpustate->WZ.b.l);
+ case 0x35: m_WZ.b.l = RM(m_HL.d); /* DCR M */
+ M_DCR(m_WZ.b.l);
+ WM(m_HL.d, m_WZ.b.l);
break;
- case 0x36: cpustate->WZ.b.l = ARG(cpustate); /* MVI M,nn */
- WM(cpustate, cpustate->HL.d, cpustate->WZ.b.l);
+ case 0x36: m_WZ.b.l = ARG(); /* MVI M,nn */
+ WM(m_HL.d, m_WZ.b.l);
break;
- case 0x37: cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | CF; break; /* STC */
+ case 0x37: m_AF.b.l = (m_AF.b.l & 0xfe) | CF; break; /* STC */
- case 0x38: if (IS_8085(cpustate)) { /* LDES nn */
- cpustate->WZ.d = ARG(cpustate);
- cpustate->DE.d = (cpustate->SP.d + cpustate->WZ.d) & 0xffff;
+ case 0x38: if (IS_8085()) { /* LDES nn */
+ m_WZ.d = ARG();
+ m_DE.d = (m_SP.d + m_WZ.d) & 0xffff;
} /* else { ; } */ /* NOP undocumented */
break;
case 0x39: M_DAD(SP); break; /* DAD SP */
- case 0x3a: cpustate->WZ.d = ARG16(cpustate); /* LDAX nnnn */
- cpustate->AF.b.h = RM(cpustate, cpustate->WZ.d);
+ case 0x3a: m_WZ.d = ARG16(); /* LDAX nnnn */
+ m_AF.b.h = RM(m_WZ.d);
break;
- case 0x3b: cpustate->SP.w.l--; /* DCX SP */
- if (IS_8085(cpustate)) { if (cpustate->SP.w.l == 0xffff) cpustate->AF.b.l |= X5F; else cpustate->AF.b.l &= ~X5F; }
+ case 0x3b: m_SP.w.l--; /* DCX SP */
+ if (IS_8085()) { if (m_SP.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
break;
- case 0x3c: M_INR(cpustate->AF.b.h); break; /* INR A */
- case 0x3d: M_DCR(cpustate->AF.b.h); break; /* DCR A */
- case 0x3e: M_MVI(cpustate->AF.b.h); break; /* MVI A,nn */
- case 0x3f: cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | (~cpustate->AF.b.l & CF); break; /* CMC */
+ case 0x3c: M_INR(m_AF.b.h); break; /* INR A */
+ case 0x3d: M_DCR(m_AF.b.h); break; /* DCR A */
+ case 0x3e: M_MVI(m_AF.b.h); break; /* MVI A,nn */
+ case 0x3f: m_AF.b.l = (m_AF.b.l & 0xfe) | (~m_AF.b.l & CF); break; /* CMC */
case 0x40: break; /* MOV B,B */
- case 0x41: cpustate->BC.b.h = cpustate->BC.b.l; break; /* MOV B,C */
- case 0x42: cpustate->BC.b.h = cpustate->DE.b.h; break; /* MOV B,D */
- case 0x43: cpustate->BC.b.h = cpustate->DE.b.l; break; /* MOV B,E */
- case 0x44: cpustate->BC.b.h = cpustate->HL.b.h; break; /* MOV B,H */
- case 0x45: cpustate->BC.b.h = cpustate->HL.b.l; break; /* MOV B,L */
- case 0x46: cpustate->BC.b.h = RM(cpustate, cpustate->HL.d); break; /* MOV B,M */
- case 0x47: cpustate->BC.b.h = cpustate->AF.b.h; break; /* MOV B,A */
-
- case 0x48: cpustate->BC.b.l = cpustate->BC.b.h; break; /* MOV C,B */
+ case 0x41: m_BC.b.h = m_BC.b.l; break; /* MOV B,C */
+ case 0x42: m_BC.b.h = m_DE.b.h; break; /* MOV B,D */
+ case 0x43: m_BC.b.h = m_DE.b.l; break; /* MOV B,E */
+ case 0x44: m_BC.b.h = m_HL.b.h; break; /* MOV B,H */
+ case 0x45: m_BC.b.h = m_HL.b.l; break; /* MOV B,L */
+ case 0x46: m_BC.b.h = RM(m_HL.d); break; /* MOV B,M */
+ case 0x47: m_BC.b.h = m_AF.b.h; break; /* MOV B,A */
+
+ case 0x48: m_BC.b.l = m_BC.b.h; break; /* MOV C,B */
case 0x49: break; /* MOV C,C */
- case 0x4a: cpustate->BC.b.l = cpustate->DE.b.h; break; /* MOV C,D */
- case 0x4b: cpustate->BC.b.l = cpustate->DE.b.l; break; /* MOV C,E */
- case 0x4c: cpustate->BC.b.l = cpustate->HL.b.h; break; /* MOV C,H */
- case 0x4d: cpustate->BC.b.l = cpustate->HL.b.l; break; /* MOV C,L */
- case 0x4e: cpustate->BC.b.l = RM(cpustate, cpustate->HL.d); break; /* MOV C,M */
- case 0x4f: cpustate->BC.b.l = cpustate->AF.b.h; break; /* MOV C,A */
-
- case 0x50: cpustate->DE.b.h = cpustate->BC.b.h; break; /* MOV D,B */
- case 0x51: cpustate->DE.b.h = cpustate->BC.b.l; break; /* MOV D,C */
+ case 0x4a: m_BC.b.l = m_DE.b.h; break; /* MOV C,D */
+ case 0x4b: m_BC.b.l = m_DE.b.l; break; /* MOV C,E */
+ case 0x4c: m_BC.b.l = m_HL.b.h; break; /* MOV C,H */
+ case 0x4d: m_BC.b.l = m_HL.b.l; break; /* MOV C,L */
+ case 0x4e: m_BC.b.l = RM(m_HL.d); break; /* MOV C,M */
+ case 0x4f: m_BC.b.l = m_AF.b.h; break; /* MOV C,A */
+
+ case 0x50: m_DE.b.h = m_BC.b.h; break; /* MOV D,B */
+ case 0x51: m_DE.b.h = m_BC.b.l; break; /* MOV D,C */
case 0x52: break; /* MOV D,D */
- case 0x53: cpustate->DE.b.h = cpustate->DE.b.l; break; /* MOV D,E */
- case 0x54: cpustate->DE.b.h = cpustate->HL.b.h; break; /* MOV D,H */
- case 0x55: cpustate->DE.b.h = cpustate->HL.b.l; break; /* MOV D,L */
- case 0x56: cpustate->DE.b.h = RM(cpustate, cpustate->HL.d); break; /* MOV D,M */
- case 0x57: cpustate->DE.b.h = cpustate->AF.b.h; break; /* MOV D,A */
-
- case 0x58: cpustate->DE.b.l = cpustate->BC.b.h; break; /* MOV E,B */
- case 0x59: cpustate->DE.b.l = cpustate->BC.b.l; break; /* MOV E,C */
- case 0x5a: cpustate->DE.b.l = cpustate->DE.b.h; break; /* MOV E,D */
+ case 0x53: m_DE.b.h = m_DE.b.l; break; /* MOV D,E */
+ case 0x54: m_DE.b.h = m_HL.b.h; break; /* MOV D,H */
+ case 0x55: m_DE.b.h = m_HL.b.l; break; /* MOV D,L */
+ case 0x56: m_DE.b.h = RM(m_HL.d); break; /* MOV D,M */
+ case 0x57: m_DE.b.h = m_AF.b.h; break; /* MOV D,A */
+
+ case 0x58: m_DE.b.l = m_BC.b.h; break; /* MOV E,B */
+ case 0x59: m_DE.b.l = m_BC.b.l; break; /* MOV E,C */
+ case 0x5a: m_DE.b.l = m_DE.b.h; break; /* MOV E,D */
case 0x5b: break; /* MOV E,E */
- case 0x5c: cpustate->DE.b.l = cpustate->HL.b.h; break; /* MOV E,H */
- case 0x5d: cpustate->DE.b.l = cpustate->HL.b.l; break; /* MOV E,L */
- case 0x5e: cpustate->DE.b.l = RM(cpustate, cpustate->HL.d); break; /* MOV E,M */
- case 0x5f: cpustate->DE.b.l = cpustate->AF.b.h; break; /* MOV E,A */
-
- case 0x60: cpustate->HL.b.h = cpustate->BC.b.h; break; /* MOV H,B */
- case 0x61: cpustate->HL.b.h = cpustate->BC.b.l; break; /* MOV H,C */
- case 0x62: cpustate->HL.b.h = cpustate->DE.b.h; break; /* MOV H,D */
- case 0x63: cpustate->HL.b.h = cpustate->DE.b.l; break; /* MOV H,E */
+ case 0x5c: m_DE.b.l = m_HL.b.h; break; /* MOV E,H */
+ case 0x5d: m_DE.b.l = m_HL.b.l; break; /* MOV E,L */
+ case 0x5e: m_DE.b.l = RM(m_HL.d); break; /* MOV E,M */
+ case 0x5f: m_DE.b.l = m_AF.b.h; break; /* MOV E,A */
+
+ case 0x60: m_HL.b.h = m_BC.b.h; break; /* MOV H,B */
+ case 0x61: m_HL.b.h = m_BC.b.l; break; /* MOV H,C */
+ case 0x62: m_HL.b.h = m_DE.b.h; break; /* MOV H,D */
+ case 0x63: m_HL.b.h = m_DE.b.l; break; /* MOV H,E */
case 0x64: break; /* MOV H,H */
- case 0x65: cpustate->HL.b.h = cpustate->HL.b.l; break; /* MOV H,L */
- case 0x66: cpustate->HL.b.h = RM(cpustate, cpustate->HL.d); break; /* MOV H,M */
- case 0x67: cpustate->HL.b.h = cpustate->AF.b.h; break; /* MOV H,A */
-
- case 0x68: cpustate->HL.b.l = cpustate->BC.b.h; break; /* MOV L,B */
- case 0x69: cpustate->HL.b.l = cpustate->BC.b.l; break; /* MOV L,C */
- case 0x6a: cpustate->HL.b.l = cpustate->DE.b.h; break; /* MOV L,D */
- case 0x6b: cpustate->HL.b.l = cpustate->DE.b.l; break; /* MOV L,E */
- case 0x6c: cpustate->HL.b.l = cpustate->HL.b.h; break; /* MOV L,H */
+ case 0x65: m_HL.b.h = m_HL.b.l; break; /* MOV H,L */
+ case 0x66: m_HL.b.h = RM(m_HL.d); break; /* MOV H,M */
+ case 0x67: m_HL.b.h = m_AF.b.h; break; /* MOV H,A */
+
+ case 0x68: m_HL.b.l = m_BC.b.h; break; /* MOV L,B */
+ case 0x69: m_HL.b.l = m_BC.b.l; break; /* MOV L,C */
+ case 0x6a: m_HL.b.l = m_DE.b.h; break; /* MOV L,D */
+ case 0x6b: m_HL.b.l = m_DE.b.l; break; /* MOV L,E */
+ case 0x6c: m_HL.b.l = m_HL.b.h; break; /* MOV L,H */
case 0x6d: break; /* MOV L,L */
- case 0x6e: cpustate->HL.b.l = RM(cpustate, cpustate->HL.d); break; /* MOV L,M */
- case 0x6f: cpustate->HL.b.l = cpustate->AF.b.h; break; /* MOV L,A */
-
- case 0x70: WM(cpustate, cpustate->HL.d, cpustate->BC.b.h); break; /* MOV M,B */
- case 0x71: WM(cpustate, cpustate->HL.d, cpustate->BC.b.l); break; /* MOV M,C */
- case 0x72: WM(cpustate, cpustate->HL.d, cpustate->DE.b.h); break; /* MOV M,D */
- case 0x73: WM(cpustate, cpustate->HL.d, cpustate->DE.b.l); break; /* MOV M,E */
- case 0x74: WM(cpustate, cpustate->HL.d, cpustate->HL.b.h); break; /* MOV M,H */
- case 0x75: WM(cpustate, cpustate->HL.d, cpustate->HL.b.l); break; /* MOV M,L */
- case 0x76: cpustate->PC.w.l--; cpustate->HALT = 1; /* HLT */
- set_status(cpustate, 0x8a); // halt acknowledge
+ case 0x6e: m_HL.b.l = RM(m_HL.d); break; /* MOV L,M */
+ case 0x6f: m_HL.b.l = m_AF.b.h; break; /* MOV L,A */
+
+ case 0x70: WM(m_HL.d, m_BC.b.h); break; /* MOV M,B */
+ case 0x71: WM(m_HL.d, m_BC.b.l); break; /* MOV M,C */
+ case 0x72: WM(m_HL.d, m_DE.b.h); break; /* MOV M,D */
+ case 0x73: WM(m_HL.d, m_DE.b.l); break; /* MOV M,E */
+ case 0x74: WM(m_HL.d, m_HL.b.h); break; /* MOV M,H */
+ case 0x75: WM(m_HL.d, m_HL.b.l); break; /* MOV M,L */
+ case 0x76: m_PC.w.l--; m_HALT = 1; /* HLT */
+ set_status(0x8a); // halt acknowledge
break;
- case 0x77: WM(cpustate, cpustate->HL.d, cpustate->AF.b.h); break; /* MOV M,A */
-
- case 0x78: cpustate->AF.b.h = cpustate->BC.b.h; break; /* MOV A,B */
- case 0x79: cpustate->AF.b.h = cpustate->BC.b.l; break; /* MOV A,C */
- case 0x7a: cpustate->AF.b.h = cpustate->DE.b.h; break; /* MOV A,D */
- case 0x7b: cpustate->AF.b.h = cpustate->DE.b.l; break; /* MOV A,E */
- case 0x7c: cpustate->AF.b.h = cpustate->HL.b.h; break; /* MOV A,H */
- case 0x7d: cpustate->AF.b.h = cpustate->HL.b.l; break; /* MOV A,L */
- case 0x7e: cpustate->AF.b.h = RM(cpustate, cpustate->HL.d); break; /* MOV A,M */
+ case 0x77: WM(m_HL.d, m_AF.b.h); break; /* MOV M,A */
+
+ case 0x78: m_AF.b.h = m_BC.b.h; break; /* MOV A,B */
+ case 0x79: m_AF.b.h = m_BC.b.l; break; /* MOV A,C */
+ case 0x7a: m_AF.b.h = m_DE.b.h; break; /* MOV A,D */
+ case 0x7b: m_AF.b.h = m_DE.b.l; break; /* MOV A,E */
+ case 0x7c: m_AF.b.h = m_HL.b.h; break; /* MOV A,H */
+ case 0x7d: m_AF.b.h = m_HL.b.l; break; /* MOV A,L */
+ case 0x7e: m_AF.b.h = RM(m_HL.d); break; /* MOV A,M */
case 0x7f: break; /* MOV A,A */
- case 0x80: M_ADD(cpustate->BC.b.h); break; /* ADD B */
- case 0x81: M_ADD(cpustate->BC.b.l); break; /* ADD C */
- case 0x82: M_ADD(cpustate->DE.b.h); break; /* ADD D */
- case 0x83: M_ADD(cpustate->DE.b.l); break; /* ADD E */
- case 0x84: M_ADD(cpustate->HL.b.h); break; /* ADD H */
- case 0x85: M_ADD(cpustate->HL.b.l); break; /* ADD L */
- case 0x86: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_ADD(cpustate->WZ.b.l); break; /* ADD M */
- case 0x87: M_ADD(cpustate->AF.b.h); break; /* ADD A */
-
- case 0x88: M_ADC(cpustate->BC.b.h); break; /* ADC B */
- case 0x89: M_ADC(cpustate->BC.b.l); break; /* ADC C */
- case 0x8a: M_ADC(cpustate->DE.b.h); break; /* ADC D */
- case 0x8b: M_ADC(cpustate->DE.b.l); break; /* ADC E */
- case 0x8c: M_ADC(cpustate->HL.b.h); break; /* ADC H */
- case 0x8d: M_ADC(cpustate->HL.b.l); break; /* ADC L */
- case 0x8e: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_ADC(cpustate->WZ.b.l); break; /* ADC M */
- case 0x8f: M_ADC(cpustate->AF.b.h); break; /* ADC A */
-
- case 0x90: M_SUB(cpustate->BC.b.h); break; /* SUB B */
- case 0x91: M_SUB(cpustate->BC.b.l); break; /* SUB C */
- case 0x92: M_SUB(cpustate->DE.b.h); break; /* SUB D */
- case 0x93: M_SUB(cpustate->DE.b.l); break; /* SUB E */
- case 0x94: M_SUB(cpustate->HL.b.h); break; /* SUB H */
- case 0x95: M_SUB(cpustate->HL.b.l); break; /* SUB L */
- case 0x96: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_SUB(cpustate->WZ.b.l); break; /* SUB M */
- case 0x97: M_SUB(cpustate->AF.b.h); break; /* SUB A */
-
- case 0x98: M_SBB(cpustate->BC.b.h); break; /* SBB B */
- case 0x99: M_SBB(cpustate->BC.b.l); break; /* SBB C */
- case 0x9a: M_SBB(cpustate->DE.b.h); break; /* SBB D */
- case 0x9b: M_SBB(cpustate->DE.b.l); break; /* SBB E */
- case 0x9c: M_SBB(cpustate->HL.b.h); break; /* SBB H */
- case 0x9d: M_SBB(cpustate->HL.b.l); break; /* SBB L */
- case 0x9e: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_SBB(cpustate->WZ.b.l); break; /* SBB M */
- case 0x9f: M_SBB(cpustate->AF.b.h); break; /* SBB A */
-
- case 0xa0: M_ANA(cpustate->BC.b.h); break; /* ANA B */
- case 0xa1: M_ANA(cpustate->BC.b.l); break; /* ANA C */
- case 0xa2: M_ANA(cpustate->DE.b.h); break; /* ANA D */
- case 0xa3: M_ANA(cpustate->DE.b.l); break; /* ANA E */
- case 0xa4: M_ANA(cpustate->HL.b.h); break; /* ANA H */
- case 0xa5: M_ANA(cpustate->HL.b.l); break; /* ANA L */
- case 0xa6: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_ANA(cpustate->WZ.b.l); break; /* ANA M */
- case 0xa7: M_ANA(cpustate->AF.b.h); break; /* ANA A */
-
- case 0xa8: M_XRA(cpustate->BC.b.h); break; /* XRA B */
- case 0xa9: M_XRA(cpustate->BC.b.l); break; /* XRA C */
- case 0xaa: M_XRA(cpustate->DE.b.h); break; /* XRA D */
- case 0xab: M_XRA(cpustate->DE.b.l); break; /* XRA E */
- case 0xac: M_XRA(cpustate->HL.b.h); break; /* XRA H */
- case 0xad: M_XRA(cpustate->HL.b.l); break; /* XRA L */
- case 0xae: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_XRA(cpustate->WZ.b.l); break; /* XRA M */
- case 0xaf: M_XRA(cpustate->AF.b.h); break; /* XRA A */
-
- case 0xb0: M_ORA(cpustate->BC.b.h); break; /* ORA B */
- case 0xb1: M_ORA(cpustate->BC.b.l); break; /* ORA C */
- case 0xb2: M_ORA(cpustate->DE.b.h); break; /* ORA D */
- case 0xb3: M_ORA(cpustate->DE.b.l); break; /* ORA E */
- case 0xb4: M_ORA(cpustate->HL.b.h); break; /* ORA H */
- case 0xb5: M_ORA(cpustate->HL.b.l); break; /* ORA L */
- case 0xb6: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_ORA(cpustate->WZ.b.l); break; /* ORA M */
- case 0xb7: M_ORA(cpustate->AF.b.h); break; /* ORA A */
-
- case 0xb8: M_CMP(cpustate->BC.b.h); break; /* CMP B */
- case 0xb9: M_CMP(cpustate->BC.b.l); break; /* CMP C */
- case 0xba: M_CMP(cpustate->DE.b.h); break; /* CMP D */
- case 0xbb: M_CMP(cpustate->DE.b.l); break; /* CMP E */
- case 0xbc: M_CMP(cpustate->HL.b.h); break; /* CMP H */
- case 0xbd: M_CMP(cpustate->HL.b.l); break; /* CMP L */
- case 0xbe: cpustate->WZ.b.l = RM(cpustate, cpustate->HL.d); M_CMP(cpustate->WZ.b.l); break; /* CMP M */
- case 0xbf: M_CMP(cpustate->AF.b.h); break; /* CMP A */
-
- case 0xc0: M_RET( !(cpustate->AF.b.l & ZF) ); break; /* RNZ */
+ case 0x80: M_ADD(m_BC.b.h); break; /* ADD B */
+ case 0x81: M_ADD(m_BC.b.l); break; /* ADD C */
+ case 0x82: M_ADD(m_DE.b.h); break; /* ADD D */
+ case 0x83: M_ADD(m_DE.b.l); break; /* ADD E */
+ case 0x84: M_ADD(m_HL.b.h); break; /* ADD H */
+ case 0x85: M_ADD(m_HL.b.l); break; /* ADD L */
+ case 0x86: m_WZ.b.l = RM(m_HL.d); M_ADD(m_WZ.b.l); break; /* ADD M */
+ case 0x87: M_ADD(m_AF.b.h); break; /* ADD A */
+
+ case 0x88: M_ADC(m_BC.b.h); break; /* ADC B */
+ case 0x89: M_ADC(m_BC.b.l); break; /* ADC C */
+ case 0x8a: M_ADC(m_DE.b.h); break; /* ADC D */
+ case 0x8b: M_ADC(m_DE.b.l); break; /* ADC E */
+ case 0x8c: M_ADC(m_HL.b.h); break; /* ADC H */
+ case 0x8d: M_ADC(m_HL.b.l); break; /* ADC L */
+ case 0x8e: m_WZ.b.l = RM(m_HL.d); M_ADC(m_WZ.b.l); break; /* ADC M */
+ case 0x8f: M_ADC(m_AF.b.h); break; /* ADC A */
+
+ case 0x90: M_SUB(m_BC.b.h); break; /* SUB B */
+ case 0x91: M_SUB(m_BC.b.l); break; /* SUB C */
+ case 0x92: M_SUB(m_DE.b.h); break; /* SUB D */
+ case 0x93: M_SUB(m_DE.b.l); break; /* SUB E */
+ case 0x94: M_SUB(m_HL.b.h); break; /* SUB H */
+ case 0x95: M_SUB(m_HL.b.l); break; /* SUB L */
+ case 0x96: m_WZ.b.l = RM(m_HL.d); M_SUB(m_WZ.b.l); break; /* SUB M */
+ case 0x97: M_SUB(m_AF.b.h); break; /* SUB A */
+
+ case 0x98: M_SBB(m_BC.b.h); break; /* SBB B */
+ case 0x99: M_SBB(m_BC.b.l); break; /* SBB C */
+ case 0x9a: M_SBB(m_DE.b.h); break; /* SBB D */
+ case 0x9b: M_SBB(m_DE.b.l); break; /* SBB E */
+ case 0x9c: M_SBB(m_HL.b.h); break; /* SBB H */
+ case 0x9d: M_SBB(m_HL.b.l); break; /* SBB L */
+ case 0x9e: m_WZ.b.l = RM(m_HL.d); M_SBB(m_WZ.b.l); break; /* SBB M */
+ case 0x9f: M_SBB(m_AF.b.h); break; /* SBB A */
+
+ case 0xa0: M_ANA(m_BC.b.h); break; /* ANA B */
+ case 0xa1: M_ANA(m_BC.b.l); break; /* ANA C */
+ case 0xa2: M_ANA(m_DE.b.h); break; /* ANA D */
+ case 0xa3: M_ANA(m_DE.b.l); break; /* ANA E */
+ case 0xa4: M_ANA(m_HL.b.h); break; /* ANA H */
+ case 0xa5: M_ANA(m_HL.b.l); break; /* ANA L */
+ case 0xa6: m_WZ.b.l = RM(m_HL.d); M_ANA(m_WZ.b.l); break; /* ANA M */
+ case 0xa7: M_ANA(m_AF.b.h); break; /* ANA A */
+
+ case 0xa8: M_XRA(m_BC.b.h); break; /* XRA B */
+ case 0xa9: M_XRA(m_BC.b.l); break; /* XRA C */
+ case 0xaa: M_XRA(m_DE.b.h); break; /* XRA D */
+ case 0xab: M_XRA(m_DE.b.l); break; /* XRA E */
+ case 0xac: M_XRA(m_HL.b.h); break; /* XRA H */
+ case 0xad: M_XRA(m_HL.b.l); break; /* XRA L */
+ case 0xae: m_WZ.b.l = RM(m_HL.d); M_XRA(m_WZ.b.l); break; /* XRA M */
+ case 0xaf: M_XRA(m_AF.b.h); break; /* XRA A */
+
+ case 0xb0: M_ORA(m_BC.b.h); break; /* ORA B */
+ case 0xb1: M_ORA(m_BC.b.l); break; /* ORA C */
+ case 0xb2: M_ORA(m_DE.b.h); break; /* ORA D */
+ case 0xb3: M_ORA(m_DE.b.l); break; /* ORA E */
+ case 0xb4: M_ORA(m_HL.b.h); break; /* ORA H */
+ case 0xb5: M_ORA(m_HL.b.l); break; /* ORA L */
+ case 0xb6: m_WZ.b.l = RM(m_HL.d); M_ORA(m_WZ.b.l); break; /* ORA M */
+ case 0xb7: M_ORA(m_AF.b.h); break; /* ORA A */
+
+ case 0xb8: M_CMP(m_BC.b.h); break; /* CMP B */
+ case 0xb9: M_CMP(m_BC.b.l); break; /* CMP C */
+ case 0xba: M_CMP(m_DE.b.h); break; /* CMP D */
+ case 0xbb: M_CMP(m_DE.b.l); break; /* CMP E */
+ case 0xbc: M_CMP(m_HL.b.h); break; /* CMP H */
+ case 0xbd: M_CMP(m_HL.b.l); break; /* CMP L */
+ case 0xbe: m_WZ.b.l = RM(m_HL.d); M_CMP(m_WZ.b.l); break; /* CMP M */
+ case 0xbf: M_CMP(m_AF.b.h); break; /* CMP A */
+
+ case 0xc0: M_RET( !(m_AF.b.l & ZF) ); break; /* RNZ */
case 0xc1: M_POP(BC); break; /* POP B */
- case 0xc2: M_JMP( !(cpustate->AF.b.l & ZF) ); break; /* JNZ nnnn */
+ case 0xc2: M_JMP( !(m_AF.b.l & ZF) ); break; /* JNZ nnnn */
case 0xc3: M_JMP(1); break; /* JMP nnnn */
- case 0xc4: M_CALL( !(cpustate->AF.b.l & ZF) ); break; /* CNZ nnnn */
+ case 0xc4: M_CALL( !(m_AF.b.l & ZF) ); break; /* CNZ nnnn */
case 0xc5: M_PUSH(BC); break; /* PUSH B */
- case 0xc6: cpustate->WZ.b.l = ARG(cpustate); M_ADD(cpustate->WZ.b.l); break; /* ADI nn */
+ case 0xc6: m_WZ.b.l = ARG(); M_ADD(m_WZ.b.l); break; /* ADI nn */
case 0xc7: M_RST(0); break; /* RST 0 */
- case 0xc8: M_RET( cpustate->AF.b.l & ZF ); break; /* RZ */
+ case 0xc8: M_RET( m_AF.b.l & ZF ); break; /* RZ */
case 0xc9: M_POP(PC); break; /* RET */
- case 0xca: M_JMP( cpustate->AF.b.l & ZF ); break; /* JZ nnnn */
- case 0xcb: if (IS_8085(cpustate)) { /* RST V */
- if (cpustate->AF.b.l & VF) { M_RST(8); }
- else cpustate->icount += 6; // RST not taken
+ case 0xca: M_JMP( m_AF.b.l & ZF ); break; /* JZ nnnn */
+ case 0xcb: if (IS_8085()) { /* RST V */
+ if (m_AF.b.l & VF) { M_RST(8); }
+ else m_icount += 6; // RST not taken
} else { M_JMP(1); } /* JMP nnnn undocumented */
break;
- case 0xcc: M_CALL( cpustate->AF.b.l & ZF ); break; /* CZ nnnn */
+ case 0xcc: M_CALL( m_AF.b.l & ZF ); break; /* CZ nnnn */
case 0xcd: M_CALL(1); break; /* CALL nnnn */
- case 0xce: cpustate->WZ.b.l = ARG(cpustate); M_ADC(cpustate->WZ.b.l); break; /* ACI nn */
+ case 0xce: m_WZ.b.l = ARG(); M_ADC(m_WZ.b.l); break; /* ACI nn */
case 0xcf: M_RST(1); break; /* RST 1 */
- case 0xd0: M_RET( !(cpustate->AF.b.l & CF) ); break; /* RNC */
+ case 0xd0: M_RET( !(m_AF.b.l & CF) ); break; /* RNC */
case 0xd1: M_POP(DE); break; /* POP D */
- case 0xd2: M_JMP( !(cpustate->AF.b.l & CF) ); break; /* JNC nnnn */
+ case 0xd2: M_JMP( !(m_AF.b.l & CF) ); break; /* JNC nnnn */
case 0xd3: M_OUT; break; /* OUT nn */
- case 0xd4: M_CALL( !(cpustate->AF.b.l & CF) ); break; /* CNC nnnn */
+ case 0xd4: M_CALL( !(m_AF.b.l & CF) ); break; /* CNC nnnn */
case 0xd5: M_PUSH(DE); break; /* PUSH D */
- case 0xd6: cpustate->WZ.b.l = ARG(cpustate); M_SUB(cpustate->WZ.b.l); break; /* SUI nn */
+ case 0xd6: m_WZ.b.l = ARG(); M_SUB(m_WZ.b.l); break; /* SUI nn */
case 0xd7: M_RST(2); break; /* RST 2 */
- case 0xd8: M_RET( cpustate->AF.b.l & CF ); break; /* RC */
- case 0xd9: if (IS_8085(cpustate)) { /* SHLX */
- cpustate->WZ.w.l = cpustate->DE.w.l;
- WM(cpustate, cpustate->WZ.d, cpustate->HL.b.l); cpustate->WZ.w.l++;
- WM(cpustate, cpustate->WZ.d, cpustate->HL.b.h);
+ case 0xd8: M_RET( m_AF.b.l & CF ); break; /* RC */
+ case 0xd9: if (IS_8085()) { /* SHLX */
+ m_WZ.w.l = m_DE.w.l;
+ WM(m_WZ.d, m_HL.b.l); m_WZ.w.l++;
+ WM(m_WZ.d, m_HL.b.h);
} else { M_POP(PC); } /* RET undocumented */
break;
- case 0xda: M_JMP( cpustate->AF.b.l & CF ); break; /* JC nnnn */
+ case 0xda: M_JMP( m_AF.b.l & CF ); break; /* JC nnnn */
case 0xdb: M_IN; break; /* IN nn */
- case 0xdc: M_CALL( cpustate->AF.b.l & CF ); break; /* CC nnnn */
- case 0xdd: if (IS_8085(cpustate)) { M_JMP( !(cpustate->AF.b.l & X5F) ); } /* JNX nnnn */
+ case 0xdc: M_CALL( m_AF.b.l & CF ); break; /* CC nnnn */
+ case 0xdd: if (IS_8085()) { M_JMP( !(m_AF.b.l & X5F) ); } /* JNX nnnn */
else { M_CALL(1); } /* CALL nnnn undocumented */
break;
- case 0xde: cpustate->WZ.b.l = ARG(cpustate); M_SBB(cpustate->WZ.b.l); break; /* SBI nn */
+ case 0xde: m_WZ.b.l = ARG(); M_SBB(m_WZ.b.l); break; /* SBI nn */
case 0xdf: M_RST(3); break; /* RST 3 */
- case 0xe0: M_RET( !(cpustate->AF.b.l & PF) ); break; /* RPO */
+ case 0xe0: M_RET( !(m_AF.b.l & PF) ); break; /* RPO */
case 0xe1: M_POP(HL); break; /* POP H */
- case 0xe2: M_JMP( !(cpustate->AF.b.l & PF) ); break; /* JPO nnnn */
+ case 0xe2: M_JMP( !(m_AF.b.l & PF) ); break; /* JPO nnnn */
case 0xe3: M_POP(WZ); M_PUSH(HL); /* XTHL */
- cpustate->HL.d = cpustate->WZ.d;
+ m_HL.d = m_WZ.d;
break;
- case 0xe4: M_CALL( !(cpustate->AF.b.l & PF) ); break; /* CPO nnnn */
+ case 0xe4: M_CALL( !(m_AF.b.l & PF) ); break; /* CPO nnnn */
case 0xe5: M_PUSH(HL); break; /* PUSH H */
- case 0xe6: cpustate->WZ.b.l = ARG(cpustate); M_ANA(cpustate->WZ.b.l); break; /* ANI nn */
+ case 0xe6: m_WZ.b.l = ARG(); M_ANA(m_WZ.b.l); break; /* ANI nn */
case 0xe7: M_RST(4); break; /* RST 4 */
- case 0xe8: M_RET( cpustate->AF.b.l & PF ); break; /* RPE */
- case 0xe9: cpustate->PC.d = cpustate->HL.w.l; break; /* PCHL */
- case 0xea: M_JMP( cpustate->AF.b.l & PF ); break; /* JPE nnnn */
- case 0xeb: cpustate->WZ.d = cpustate->DE.d; /* XCHG */
- cpustate->DE.d = cpustate->HL.d;
- cpustate->HL.d = cpustate->WZ.d;
+ case 0xe8: M_RET( m_AF.b.l & PF ); break; /* RPE */
+ case 0xe9: m_PC.d = m_HL.w.l; break; /* PCHL */
+ case 0xea: M_JMP( m_AF.b.l & PF ); break; /* JPE nnnn */
+ case 0xeb: m_WZ.d = m_DE.d; /* XCHG */
+ m_DE.d = m_HL.d;
+ m_HL.d = m_WZ.d;
break;
- case 0xec: M_CALL( cpustate->AF.b.l & PF ); break; /* CPE nnnn */
- case 0xed: if (IS_8085(cpustate)) { /* LHLX */
- cpustate->WZ.w.l = cpustate->DE.w.l;
- cpustate->HL.b.l = RM(cpustate, cpustate->WZ.d); cpustate->WZ.w.l++;
- cpustate->HL.b.h = RM(cpustate, cpustate->WZ.d);
+ case 0xec: M_CALL( m_AF.b.l & PF ); break; /* CPE nnnn */
+ case 0xed: if (IS_8085()) { /* LHLX */
+ m_WZ.w.l = m_DE.w.l;
+ m_HL.b.l = RM(m_WZ.d); m_WZ.w.l++;
+ m_HL.b.h = RM(m_WZ.d);
} else { M_CALL(1); } /* CALL nnnn undocumented */
break;
- case 0xee: cpustate->WZ.b.l = ARG(cpustate); M_XRA(cpustate->WZ.b.l); break; /* XRI nn */
+ case 0xee: m_WZ.b.l = ARG(); M_XRA(m_WZ.b.l); break; /* XRI nn */
case 0xef: M_RST(5); break; /* RST 5 */
- case 0xf0: M_RET( !(cpustate->AF.b.l&SF) ); break; /* RP */
+ case 0xf0: M_RET( !(m_AF.b.l&SF) ); break; /* RP */
case 0xf1: M_POP(AF); break; /* POP A */
- case 0xf2: M_JMP( !(cpustate->AF.b.l & SF) ); break; /* JP nnnn */
- case 0xf3: set_inte(cpustate, 0); break; /* DI */
- case 0xf4: M_CALL( !(cpustate->AF.b.l & SF) ); break; /* CP nnnn */
- case 0xf5: if (IS_8080(cpustate)) cpustate->AF.b.l = (cpustate->AF.b.l&~(X3F|X5F))|VF; // on 8080, VF=1 and X3F=0 and X5F=0 always! (we don't have to check for it elsewhere)
+ case 0xf2: M_JMP( !(m_AF.b.l & SF) ); break; /* JP nnnn */
+ case 0xf3: set_inte(0); break; /* DI */
+ case 0xf4: M_CALL( !(m_AF.b.l & SF) ); break; /* CP nnnn */
+ case 0xf5: if (IS_8080()) m_AF.b.l = (m_AF.b.l&~(X3F|X5F))|VF; // on 8080, VF=1 and X3F=0 and X5F=0 always! (we don't have to check for it elsewhere)
M_PUSH(AF); break; /* PUSH A */
- case 0xf6: cpustate->WZ.b.l = ARG(cpustate); M_ORA(cpustate->WZ.b.l); break; /* ORI nn */
+ case 0xf6: m_WZ.b.l = ARG(); M_ORA(m_WZ.b.l); break; /* ORI nn */
case 0xf7: M_RST(6); break; /* RST 6 */
- case 0xf8: M_RET( cpustate->AF.b.l & SF ); break; /* RM */
- case 0xf9: cpustate->SP.d = cpustate->HL.d; break; /* SPHL */
- case 0xfa: M_JMP( cpustate->AF.b.l & SF ); break; /* JM nnnn */
- case 0xfb: set_inte(cpustate, 1); cpustate->after_ei = 2; break; /* EI */
- case 0xfc: M_CALL( cpustate->AF.b.l & SF ); break; /* CM nnnn */
- case 0xfd: if (IS_8085(cpustate)) { M_JMP( cpustate->AF.b.l & X5F ); } /* JX nnnn */
+ case 0xf8: M_RET( m_AF.b.l & SF ); break; /* RM */
+ case 0xf9: m_SP.d = m_HL.d; break; /* SPHL */
+ case 0xfa: M_JMP( m_AF.b.l & SF ); break; /* JM nnnn */
+ case 0xfb: set_inte(1); m_after_ei = 2; break; /* EI */
+ case 0xfc: M_CALL( m_AF.b.l & SF ); break; /* CM nnnn */
+ case 0xfd: if (IS_8085()) { M_JMP( m_AF.b.l & X5F ); } /* JX nnnn */
else { M_CALL(1); } /* CALL nnnn undocumented */
break;
- case 0xfe: cpustate->WZ.b.l = ARG(cpustate); M_CMP(cpustate->WZ.b.l); break; /* CPI nn */
+ case 0xfe: m_WZ.b.l = ARG(); M_CMP(m_WZ.b.l); break; /* CPI nn */
case 0xff: M_RST(7); break; /* RST 7 */
}
}
@@ -906,27 +879,25 @@ static void execute_one(i8085_state *cpustate, int opcode)
COMMON EXECUTION
***************************************************************************/
-static CPU_EXECUTE( i808x )
+void i8085a_cpu_device::execute_run()
{
- i8085_state *cpustate = get_safe_token(device);
-
/* check for TRAPs before diving in (can't do others because of after_ei) */
- if (cpustate->trap_pending || cpustate->after_ei == 0)
- check_for_interrupts(cpustate);
+ if (m_trap_pending || m_after_ei == 0)
+ check_for_interrupts();
do
{
- debugger_instruction_hook(device, cpustate->PC.d);
+ debugger_instruction_hook(this, m_PC.d);
/* the instruction after an EI does not take an interrupt, so
we cannot check immediately; handle post-EI behavior here */
- if (cpustate->after_ei != 0 && --cpustate->after_ei == 0)
- check_for_interrupts(cpustate);
+ if (m_after_ei != 0 && --m_after_ei == 0)
+ check_for_interrupts();
/* here we go... */
- execute_one(cpustate, ROP(cpustate));
+ execute_one(ROP());
- } while (cpustate->icount > 0);
+ } while (m_icount > 0);
}
@@ -935,14 +906,14 @@ static CPU_EXECUTE( i808x )
CORE INITIALIZATION
***************************************************************************/
-static void init_tables (int type)
+void i8085a_cpu_device::init_tables()
{
UINT8 zs;
int i, p;
for (i = 0; i < 256; i++)
{
/* cycles */
- lut_cycles[i] = type?lut_cycles_8085[i]:lut_cycles_8080[i];
+ lut_cycles[i] = m_cputype?lut_cycles_8085[i]:lut_cycles_8080[i];
/* flags */
zs = 0;
@@ -963,102 +934,99 @@ static void init_tables (int type)
}
-static void init_808x_common(legacy_cpu_device *device, device_irq_acknowledge_callback irqcallback, int type)
+void i8085a_cpu_device::device_start()
{
- i8085_state *cpustate = get_safe_token(device);
-
- init_tables(type);
+ m_PC.w.l = 0;
+ m_SP.w.l = 0;
+ m_AF.w.l = 0;
+ m_BC.w.l = 0;
+ m_DE.w.l = 0;
+ m_HL.w.l = 0;
+ m_WZ.w.l = 0;
+ m_HALT = 0;
+ m_IM = 0;
+ m_STATUS = 0;
+ m_after_ei = 0;
+ m_nmi_state = 0;
+ m_irq_state[3] = m_irq_state[2] = m_irq_state[1] = m_irq_state[0] = 0;
+ m_trap_pending = 0;
+ m_trap_im_copy = 0;
+ m_sod_state = 0;
+ m_ietemp = 0;
+
+ init_tables();
/* set up the state table */
{
- device_state_interface *state;
- device->interface(state);
- state->state_add(I8085_PC, "PC", cpustate->PC.w.l);
- state->state_add(STATE_GENPC, "GENPC", cpustate->PC.w.l).noshow();
- state->state_add(I8085_SP, "SP", cpustate->SP.w.l);
- state->state_add(STATE_GENSP, "GENSP", cpustate->SP.w.l).noshow();
- state->state_add(STATE_GENFLAGS, "GENFLAGS", cpustate->AF.b.l).noshow().formatstr("%8s");
- state->state_add(I8085_A, "A", cpustate->AF.b.h).noshow();
- state->state_add(I8085_B, "B", cpustate->BC.b.h).noshow();
- state->state_add(I8085_C, "C", cpustate->BC.b.l).noshow();
- state->state_add(I8085_D, "D", cpustate->DE.b.h).noshow();
- state->state_add(I8085_E, "E", cpustate->DE.b.l).noshow();
- state->state_add(I8085_F, "F", cpustate->AF.b.l).noshow();
- state->state_add(I8085_H, "H", cpustate->HL.b.h).noshow();
- state->state_add(I8085_L, "L", cpustate->HL.b.l).noshow();
- state->state_add(I8085_AF, "AF", cpustate->AF.w.l);
- state->state_add(I8085_BC, "BC", cpustate->BC.w.l);
- state->state_add(I8085_DE, "DE", cpustate->DE.w.l);
- state->state_add(I8085_HL, "HL", cpustate->HL.w.l);
- state->state_add(I8085_STATUS, "STATUS", cpustate->STATUS);
- state->state_add(I8085_SOD, "SOD", cpustate->sod_state).mask(0x1);
- state->state_add(I8085_SID, "SID", cpustate->ietemp).mask(0x1).callimport().callexport();
- state->state_add(I8085_INTE, "INTE", cpustate->ietemp).mask(0x1).callimport().callexport();
+ state_add(I8085_PC, "PC", m_PC.w.l);
+ state_add(STATE_GENPC, "GENPC", m_PC.w.l).noshow();
+ state_add(I8085_SP, "SP", m_SP.w.l);
+ state_add(STATE_GENSP, "GENSP", m_SP.w.l).noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_AF.b.l).noshow().formatstr("%8s");
+ state_add(I8085_A, "A", m_AF.b.h).noshow();
+ state_add(I8085_B, "B", m_BC.b.h).noshow();
+ state_add(I8085_C, "C", m_BC.b.l).noshow();
+ state_add(I8085_D, "D", m_DE.b.h).noshow();
+ state_add(I8085_E, "E", m_DE.b.l).noshow();
+ state_add(I8085_F, "F", m_AF.b.l).noshow();
+ state_add(I8085_H, "H", m_HL.b.h).noshow();
+ state_add(I8085_L, "L", m_HL.b.l).noshow();
+ state_add(I8085_AF, "AF", m_AF.w.l);
+ state_add(I8085_BC, "BC", m_BC.w.l);
+ state_add(I8085_DE, "DE", m_DE.w.l);
+ state_add(I8085_HL, "HL", m_HL.w.l);
+ state_add(I8085_STATUS, "STATUS", m_STATUS);
+ state_add(I8085_SOD, "SOD", m_sod_state).mask(0x1);
+ state_add(I8085_SID, "SID", m_ietemp).mask(0x1).callimport().callexport();
+ state_add(I8085_INTE, "INTE", m_ietemp).mask(0x1).callimport().callexport();
}
- if (device->static_config() != NULL)
- cpustate->config = *(i8085_config *)device->static_config();
- cpustate->cputype = type;
- cpustate->irq_callback = irqcallback;
- cpustate->device = device;
-
- cpustate->program = &device->space(AS_PROGRAM);
- cpustate->direct = &cpustate->program->direct();
- cpustate->io = &device->space(AS_IO);
+ m_program = &space(AS_PROGRAM);
+ m_direct = &m_program->direct();
+ m_io = &space(AS_IO);
/* resolve callbacks */
- cpustate->out_status_func.resolve(cpustate->config.out_status_func, *device);
- cpustate->out_inte_func.resolve(cpustate->config.out_inte_func, *device);
- cpustate->in_sid_func.resolve(cpustate->config.in_sid_func, *device);
- cpustate->out_sod_func.resolve(cpustate->config.out_sod_func, *device);
+ m_out_status_func.resolve_safe();
+ m_out_inte_func.resolve_safe();
+ m_in_sid_func.resolve_safe(0);
+ m_out_sod_func.resolve_safe();
/* register for state saving */
- device->save_item(NAME(cpustate->PC.w.l));
- device->save_item(NAME(cpustate->SP.w.l));
- device->save_item(NAME(cpustate->AF.w.l));
- device->save_item(NAME(cpustate->BC.w.l));
- device->save_item(NAME(cpustate->DE.w.l));
- device->save_item(NAME(cpustate->HL.w.l));
- device->save_item(NAME(cpustate->HALT));
- device->save_item(NAME(cpustate->IM));
- device->save_item(NAME(cpustate->STATUS));
- device->save_item(NAME(cpustate->after_ei));
- device->save_item(NAME(cpustate->nmi_state));
- device->save_item(NAME(cpustate->irq_state));
- device->save_item(NAME(cpustate->trap_pending));
- device->save_item(NAME(cpustate->trap_im_copy));
- device->save_item(NAME(cpustate->sod_state));
+ save_item(NAME(m_PC.w.l));
+ save_item(NAME(m_SP.w.l));
+ save_item(NAME(m_AF.w.l));
+ save_item(NAME(m_BC.w.l));
+ save_item(NAME(m_DE.w.l));
+ save_item(NAME(m_HL.w.l));
+ save_item(NAME(m_HALT));
+ save_item(NAME(m_IM));
+ save_item(NAME(m_STATUS));
+ save_item(NAME(m_after_ei));
+ save_item(NAME(m_nmi_state));
+ save_item(NAME(m_irq_state));
+ save_item(NAME(m_trap_pending));
+ save_item(NAME(m_trap_im_copy));
+ save_item(NAME(m_sod_state));
+
+ m_icountptr = &m_icount;
}
-static CPU_INIT( i8080 )
-{
- init_808x_common(device, irqcallback, CPUTYPE_8080);
-}
-
-static CPU_INIT( i8085 )
-{
- init_808x_common(device, irqcallback, CPUTYPE_8085);
-}
-
-
/***************************************************************************
COMMON RESET
***************************************************************************/
-static CPU_RESET( i808x )
+void i8085a_cpu_device::device_reset()
{
- i8085_state *cpustate = get_safe_token(device);
-
- cpustate->PC.d = 0;
- cpustate->HALT = 0;
- cpustate->IM &= ~IM_I75;
- cpustate->IM |= IM_M55 | IM_M65 | IM_M75;
- cpustate->after_ei = FALSE;
- cpustate->trap_pending = FALSE;
- cpustate->trap_im_copy = 0;
- set_inte(cpustate, 0);
- set_sod(cpustate, 0);
+ m_PC.d = 0;
+ m_HALT = 0;
+ m_IM &= ~IM_I75;
+ m_IM |= IM_M55 | IM_M65 | IM_M75;
+ m_after_ei = FALSE;
+ m_trap_pending = FALSE;
+ m_trap_im_copy = 0;
+ set_inte(0);
+ set_sod(0);
}
@@ -1067,24 +1035,22 @@ static CPU_RESET( i808x )
COMMON STATE IMPORT/EXPORT
***************************************************************************/
-static CPU_IMPORT_STATE( i808x )
+void i8085a_cpu_device::state_import(const device_state_entry &entry)
{
- i8085_state *cpustate = get_safe_token(device);
-
switch (entry.index())
{
case I8085_SID:
- if (cpustate->ietemp)
- cpustate->IM |= IM_SID;
+ if (m_ietemp)
+ m_IM |= IM_SID;
else
- cpustate->IM &= ~IM_SID;
+ m_IM &= ~IM_SID;
break;
case I8085_INTE:
- if (cpustate->ietemp)
- cpustate->IM |= IM_IE;
+ if (m_ietemp)
+ m_IM |= IM_IE;
else
- cpustate->IM &= ~IM_IE;
+ m_IM &= ~IM_IE;
break;
default:
@@ -1094,23 +1060,21 @@ static CPU_IMPORT_STATE( i808x )
}
-static CPU_EXPORT_STATE( i808x )
+void i8085a_cpu_device::state_export(const device_state_entry &entry)
{
- i8085_state *cpustate = get_safe_token(device);
-
switch (entry.index())
{
case I8085_SID:
{
- int sid = cpustate->in_sid_func();
+ int sid = m_in_sid_func();
- cpustate->ietemp = ((cpustate->IM & IM_SID) != 0);
- cpustate->ietemp = (sid != 0);
+ m_ietemp = ((m_IM & IM_SID) != 0);
+ m_ietemp = (sid != 0);
}
break;
case I8085_INTE:
- cpustate->ietemp = ((cpustate->IM & IM_IE) != 0);
+ m_ietemp = ((m_IM & IM_IE) != 0);
break;
default:
@@ -1119,174 +1083,54 @@ static CPU_EXPORT_STATE( i808x )
}
}
-static CPU_EXPORT_STRING( i808x )
+void i8085a_cpu_device::state_string_export(const device_state_entry &entry, astring &string)
{
- i8085_state *cpustate = get_safe_token(device);
-
switch (entry.index())
{
case STATE_GENFLAGS:
string.printf("%c%c%c%c%c%c%c%c",
- cpustate->AF.b.l & 0x80 ? 'S':'.',
- cpustate->AF.b.l & 0x40 ? 'Z':'.',
- cpustate->AF.b.l & 0x20 ? 'X':'.', // X5
- cpustate->AF.b.l & 0x10 ? 'H':'.',
- cpustate->AF.b.l & 0x08 ? '?':'.',
- cpustate->AF.b.l & 0x04 ? 'P':'.',
- cpustate->AF.b.l & 0x02 ? 'V':'.',
- cpustate->AF.b.l & 0x01 ? 'C':'.');
+ m_AF.b.l & 0x80 ? 'S':'.',
+ m_AF.b.l & 0x40 ? 'Z':'.',
+ m_AF.b.l & 0x20 ? 'X':'.', // X5
+ m_AF.b.l & 0x10 ? 'H':'.',
+ m_AF.b.l & 0x08 ? '?':'.',
+ m_AF.b.l & 0x04 ? 'P':'.',
+ m_AF.b.l & 0x02 ? 'V':'.',
+ m_AF.b.l & 0x01 ? 'C':'.');
break;
}
}
-
-/***************************************************************************
- COMMON SET INFO
-***************************************************************************/
-
-static void i808x_set_irq_line(i8085_state *cpustate, int irqline, int state)
+void i8085a_cpu_device::execute_set_input(int irqline, int state)
{
int newstate = (state != CLEAR_LINE);
/* NMI is edge-triggered */
if (irqline == INPUT_LINE_NMI)
{
- if (!cpustate->nmi_state && newstate)
- cpustate->trap_pending = TRUE;
- cpustate->nmi_state = newstate;
+ if (!m_nmi_state && newstate)
+ m_trap_pending = TRUE;
+ m_nmi_state = newstate;
}
/* RST7.5 is edge-triggered */
else if (irqline == I8085_RST75_LINE)
{
- if (!cpustate->irq_state[I8085_RST75_LINE] && newstate)
- cpustate->IM |= IM_I75;
- cpustate->irq_state[I8085_RST75_LINE] = newstate;
+ if (!m_irq_state[I8085_RST75_LINE] && newstate)
+ m_IM |= IM_I75;
+ m_irq_state[I8085_RST75_LINE] = newstate;
}
/* remaining sources are level triggered */
- else if (irqline < ARRAY_LENGTH(cpustate->irq_state))
- cpustate->irq_state[irqline] = state;
-}
-
-
-static CPU_SET_INFO( i808x )
-{
- i8085_state *cpustate = get_safe_token(device);
- switch (state)
- {
- /* --- the following bits of info are set as 64-bit signed integers --- */
- case CPUINFO_INT_INPUT_STATE + I8085_INTR_LINE:
- case CPUINFO_INT_INPUT_STATE + I8085_RST55_LINE:
- case CPUINFO_INT_INPUT_STATE + I8085_RST65_LINE:
- case CPUINFO_INT_INPUT_STATE + I8085_RST75_LINE:
- case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI:
- i808x_set_irq_line(cpustate, state - CPUINFO_INT_INPUT_STATE, info->i);
- break;
- }
+ else if (irqline < ARRAY_LENGTH(m_irq_state))
+ m_irq_state[irqline] = state;
}
-
-/***************************************************************************
- 8085/COMMON GET INFO
-***************************************************************************/
-
-CPU_GET_INFO( i8085 )
+offs_t i8085a_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
{
- i8085_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
- switch (state)
- {
- /* --- the following bits of info are returned as 64-bit signed integers --- */
- case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(i8085_state); break;
- case CPUINFO_INT_INPUT_LINES: info->i = 4; break;
- case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0xff; break;
- case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
- case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
- case CPUINFO_INT_CLOCK_DIVIDER: info->i = 2; break;
- case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break;
- case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 3; break;
- case CPUINFO_INT_MIN_CYCLES: info->i = 4; break;
- case CPUINFO_INT_MAX_CYCLES: info->i = 16; break;
-
- case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16; break;
- case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0; break;
- case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break;
-
- /* --- the following bits of info are returned as pointers to functions --- */
- case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(i808x); break;
- case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(i8085); break;
- case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(i808x); break;
- case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(i808x); break;
- case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(i8085); break;
- case CPUINFO_FCT_IMPORT_STATE: info->import_state = CPU_IMPORT_STATE_NAME(i808x); break;
- case CPUINFO_FCT_EXPORT_STATE: info->export_state = CPU_EXPORT_STATE_NAME(i808x); break;
- case CPUINFO_FCT_EXPORT_STRING: info->export_string = CPU_EXPORT_STRING_NAME(i808x); break;
-
- /* --- the following bits of info are returned as pointers --- */
- case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break;
-
- /* --- the following bits of info are returned as NULL-terminated strings --- */
- case CPUINFO_STR_NAME: strcpy(info->s, "8085A"); break;
- case CPUINFO_STR_FAMILY: strcpy(info->s, "MCS-85"); break;
- case CPUINFO_STR_VERSION: strcpy(info->s, "1.1"); break;
- case CPUINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
- case CPUINFO_STR_CREDITS: strcpy(info->s, "Copyright Juergen Buchmueller, all rights reserved."); break;
- }
-}
-
-
-/***************************************************************************
- 8080-SPECIFIC GET INFO
-***************************************************************************/
-
-CPU_GET_INFO( i8080 )
-{
- switch (state)
- {
- /* --- the following bits of info are returned as 64-bit signed integers --- */
- case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
- case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
-
- /* --- the following bits of info are returned as pointers to functions --- */
- case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(i8080); break;
-
- /* --- the following bits of info are returned as NULL-terminated strings --- */
- case CPUINFO_STR_NAME: strcpy(info->s, "8080"); break;
- case CPUINFO_STR_FAMILY: strcpy(info->s, "MCS-80"); break;
-
- default: CPU_GET_INFO_CALL(i8085); break;
- }
-}
-
-
-/***************************************************************************
- 8080A-SPECIFIC GET INFO
-***************************************************************************/
-
-CPU_GET_INFO( i8080a )
-{
- switch (state)
- {
- /* --- the following bits of info are returned as 64-bit signed integers --- */
- case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
- case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
-
- /* --- the following bits of info are returned as pointers to functions --- */
- case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(i8080); break;
-
- /* --- the following bits of info are returned as NULL-terminated strings --- */
- case CPUINFO_STR_NAME: strcpy(info->s, "8080A"); break;
- case CPUINFO_STR_FAMILY: strcpy(info->s, "MCS-80"); break;
-
- default: CPU_GET_INFO_CALL(i8085); break;
- }
+ extern CPU_DISASSEMBLE( i8085 );
+ return CPU_DISASSEMBLE_NAME(i8085)(this, buffer, pc, oprom, opram, options);
}
-DEFINE_LEGACY_CPU_DEVICE(I8080, i8080);
-DEFINE_LEGACY_CPU_DEVICE(I8080A, i8080a);
-DEFINE_LEGACY_CPU_DEVICE(I8085A, i8085);
diff --git a/src/emu/cpu/i8085/i8085.h b/src/emu/cpu/i8085/i8085.h
index 852df325f9a..4e04e2a1322 100644
--- a/src/emu/cpu/i8085/i8085.h
+++ b/src/emu/cpu/i8085/i8085.h
@@ -32,29 +32,149 @@ enum
#define I8085_STATUS_INP 0x40
#define I8085_STATUS_MEMR 0x80
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-struct i8085_config
+/* STATUS changed callback */
+#define MCFG_I8085A_STATUS(_devcb) \
+ i8085a_cpu_device::set_out_status_func(*device, DEVCB2_##_devcb);
+
+/* INTE changed callback */
+#define MCFG_I8085A_INTE(_devcb) \
+ i8085a_cpu_device::set_out_inte_func(*device, DEVCB2_##_devcb);
+
+/* SID changed callback (8085A only) */
+#define MCFG_I8085A_SID(_devcb) \
+ i8085a_cpu_device::set_in_sid_func(*device, DEVCB2_##_devcb);
+
+/* SOD changed callback (8085A only) */
+#define MCFG_I8085A_SOD(_devcb) \
+ i8085a_cpu_device::set_out_sod_func(*device, DEVCB2_##_devcb);
+
+
+class i8085a_cpu_device : public cpu_device
+{
+public:
+ // construction/destruction
+ i8085a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ i8085a_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int cputype);
+
+ // static configuration helpers
+ template<class _Object> static devcb2_base &set_out_status_func(device_t &device, _Object object) { return downcast<i8085a_cpu_device &>(device).m_out_status_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_inte_func(device_t &device, _Object object) { return downcast<i8085a_cpu_device &>(device).m_out_inte_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_in_sid_func(device_t &device, _Object object) { return downcast<i8085a_cpu_device &>(device).m_in_sid_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_sod_func(device_t &device, _Object object) { return downcast<i8085a_cpu_device &>(device).m_out_sod_func.set_callback(object); }
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_execute_interface overrides
+ virtual UINT32 execute_min_cycles() const { return 4; }
+ virtual UINT32 execute_max_cycles() const { return 16; }
+ virtual UINT32 execute_input_lines() const { return 4; }
+ virtual UINT32 execute_default_irq_vector() const { return 0xff; }
+ virtual void execute_run();
+ virtual void execute_set_input(int inputnum, int state);
+ virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return (clocks + 2 - 1) / 2; }
+ virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return (cycles * 2); }
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); }
+
+ // device_state_interface overrides
+ void state_string_export(const device_state_entry &entry, astring &string);
+ void state_export(const device_state_entry &entry);
+ void state_import(const device_state_entry &entry);
+
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const { return 1; }
+ virtual UINT32 disasm_max_opcode_bytes() const { return 3; }
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
+
+private:
+ address_space_config m_program_config;
+ address_space_config m_io_config;
+
+ devcb2_write8 m_out_status_func;
+ devcb2_write_line m_out_inte_func;
+ devcb2_read_line m_in_sid_func;
+ devcb2_write_line m_out_sod_func;
+
+ int m_cputype; /* 0 8080, 1 8085A */
+ PAIR m_PC,m_SP,m_AF,m_BC,m_DE,m_HL,m_WZ;
+ UINT8 m_HALT;
+ UINT8 m_IM; /* interrupt mask (8085A only) */
+ UINT8 m_STATUS; /* status word */
+
+ UINT8 m_after_ei; /* post-EI processing; starts at 2, check for ints at 0 */
+ UINT8 m_nmi_state; /* raw NMI line state */
+ UINT8 m_irq_state[4]; /* raw IRQ line states */
+ UINT8 m_trap_pending; /* TRAP interrupt latched? */
+ UINT8 m_trap_im_copy; /* copy of IM register when TRAP was taken */
+ UINT8 m_sod_state; /* state of the SOD line */
+
+ UINT8 m_ietemp; /* import/export temp space */
+
+ device_irq_acknowledge_callback m_irq_callback;
+ legacy_cpu_device *m_device;
+ address_space *m_program;
+ direct_read_data *m_direct;
+ address_space *m_io;
+ int m_icount;
+
+ /* cycles lookup */
+ static const UINT8 lut_cycles_8080[256];
+ static const UINT8 lut_cycles_8085[256];
+ UINT8 lut_cycles[256];
+ /* flags lookup */
+ UINT8 ZS[256];
+ UINT8 ZSP[256];
+
+ void set_sod(int state);
+ void set_inte(int state);
+ void set_status(UINT8 status);
+ UINT8 get_rim_value();
+ void break_halt_for_interrupt();
+ UINT8 ROP();
+ UINT8 ARG();
+ UINT16 ARG16();
+ UINT8 RM(UINT32 a);
+ void WM(UINT32 a, UINT8 v);
+ void check_for_interrupts();
+ void execute_one(int opcode);
+ void init_tables();
+
+};
+
+
+class i8080_cpu_device : public i8085a_cpu_device
{
- devcb_write8 out_status_func; /* STATUS changed callback */
- devcb_write_line out_inte_func; /* INTE changed callback */
- devcb_read_line in_sid_func; /* SID changed callback (8085A only) */
- devcb_write_line out_sod_func; /* SOD changed callback (8085A only) */
+public:
+ // construction/destruction
+ i8080_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual UINT32 execute_input_lines() const { return 1; }
+ virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return clocks; }
+ virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return cycles; }
};
-#define I8085_CONFIG(name) const i8085_config (name) =
-/***************************************************************************
- FUNCTION PROTOTYPES
-***************************************************************************/
-DECLARE_LEGACY_CPU_DEVICE(I8080, i8080);
-DECLARE_LEGACY_CPU_DEVICE(I8080A, i8080a);
-DECLARE_LEGACY_CPU_DEVICE(I8085A, i8085);
+class i8080a_cpu_device : public i8085a_cpu_device
+{
+public:
+ // construction/destruction
+ i8080a_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ virtual UINT32 execute_input_lines() const { return 1; }
+ virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return clocks; }
+ virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return cycles; }
+};
-CPU_DISASSEMBLE( i8085 );
-#define i8085_set_sid(cpu, sid) (cpu)->state().set_state_int(I8085_SID, sid)
+extern const device_type I8080;
+extern const device_type I8080A;
+extern const device_type I8085A;
#endif
diff --git a/src/emu/cpu/i8085/i8085cpu.h b/src/emu/cpu/i8085/i8085cpu.h
index f3f776ade46..0c65dd1b82a 100644
--- a/src/emu/cpu/i8085/i8085cpu.h
+++ b/src/emu/cpu/i8085/i8085cpu.h
@@ -36,122 +36,122 @@
#define ADDR_INTR 0x0038
-#define M_MVI(R) R=ARG(cpustate)
+#define M_MVI(R) R=ARG()
/* rotate */
#define M_RLC { \
- cpustate->AF.b.h = (cpustate->AF.b.h << 1) | (cpustate->AF.b.h >> 7); \
- cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | (cpustate->AF.b.h & CF); \
+ m_AF.b.h = (m_AF.b.h << 1) | (m_AF.b.h >> 7); \
+ m_AF.b.l = (m_AF.b.l & 0xfe) | (m_AF.b.h & CF); \
}
#define M_RRC { \
- cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | (cpustate->AF.b.h & CF); \
- cpustate->AF.b.h = (cpustate->AF.b.h >> 1) | (cpustate->AF.b.h << 7); \
+ m_AF.b.l = (m_AF.b.l & 0xfe) | (m_AF.b.h & CF); \
+ m_AF.b.h = (m_AF.b.h >> 1) | (m_AF.b.h << 7); \
}
#define M_RAL { \
- int c = cpustate->AF.b.l&CF; \
- cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | (cpustate->AF.b.h >> 7); \
- cpustate->AF.b.h = (cpustate->AF.b.h << 1) | c; \
+ int c = m_AF.b.l&CF; \
+ m_AF.b.l = (m_AF.b.l & 0xfe) | (m_AF.b.h >> 7); \
+ m_AF.b.h = (m_AF.b.h << 1) | c; \
}
#define M_RAR { \
- int c = (cpustate->AF.b.l&CF) << 7; \
- cpustate->AF.b.l = (cpustate->AF.b.l & 0xfe) | (cpustate->AF.b.h & CF); \
- cpustate->AF.b.h = (cpustate->AF.b.h >> 1) | c; \
+ int c = (m_AF.b.l&CF) << 7; \
+ m_AF.b.l = (m_AF.b.l & 0xfe) | (m_AF.b.h & CF); \
+ m_AF.b.h = (m_AF.b.h >> 1) | c; \
}
/* logical */
-#define M_ORA(R) cpustate->AF.b.h|=R; cpustate->AF.b.l=ZSP[cpustate->AF.b.h]
-#define M_XRA(R) cpustate->AF.b.h^=R; cpustate->AF.b.l=ZSP[cpustate->AF.b.h]
-#define M_ANA(R) {UINT8 hc = ((cpustate->AF.b.h | R)<<1) & HF; cpustate->AF.b.h&=R; cpustate->AF.b.l=ZSP[cpustate->AF.b.h]; if(IS_8085(cpustate)) { cpustate->AF.b.l |= HF; } else {cpustate->AF.b.l |= hc; } }
+#define M_ORA(R) m_AF.b.h|=R; m_AF.b.l=ZSP[m_AF.b.h]
+#define M_XRA(R) m_AF.b.h^=R; m_AF.b.l=ZSP[m_AF.b.h]
+#define M_ANA(R) {UINT8 hc = ((m_AF.b.h | R)<<1) & HF; m_AF.b.h&=R; m_AF.b.l=ZSP[m_AF.b.h]; if(IS_8085()) { m_AF.b.l |= HF; } else {m_AF.b.l |= hc; } }
/* increase / decrease */
-#define M_INR(R) {UINT8 hc = ((R & 0x0f) == 0x0f) ? HF : 0; ++R; cpustate->AF.b.l= (cpustate->AF.b.l & CF ) | ZSP[R] | hc; }
-#define M_DCR(R) {UINT8 hc = ((R & 0x0f) != 0x00) ? HF : 0; --R; cpustate->AF.b.l= (cpustate->AF.b.l & CF ) | ZSP[R] | hc | VF; }
+#define M_INR(R) {UINT8 hc = ((R & 0x0f) == 0x0f) ? HF : 0; ++R; m_AF.b.l= (m_AF.b.l & CF ) | ZSP[R] | hc; }
+#define M_DCR(R) {UINT8 hc = ((R & 0x0f) != 0x00) ? HF : 0; --R; m_AF.b.l= (m_AF.b.l & CF ) | ZSP[R] | hc | VF; }
/* arithmetic */
#define M_ADD(R) { \
- int q = cpustate->AF.b.h+R; \
- cpustate->AF.b.l=ZSP[q&255]|((q>>8)&CF)|((cpustate->AF.b.h^q^R)&HF); \
- cpustate->AF.b.h=q; \
+ int q = m_AF.b.h+R; \
+ m_AF.b.l=ZSP[q&255]|((q>>8)&CF)|((m_AF.b.h^q^R)&HF); \
+ m_AF.b.h=q; \
}
#define M_ADC(R) { \
- int q = cpustate->AF.b.h+R+(cpustate->AF.b.l&CF); \
- cpustate->AF.b.l=ZSP[q&255]|((q>>8)&CF)|((cpustate->AF.b.h^q^R)&HF); \
- cpustate->AF.b.h=q; \
+ int q = m_AF.b.h+R+(m_AF.b.l&CF); \
+ m_AF.b.l=ZSP[q&255]|((q>>8)&CF)|((m_AF.b.h^q^R)&HF); \
+ m_AF.b.h=q; \
}
#define M_SUB(R) { \
- int q = cpustate->AF.b.h-R; \
- cpustate->AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(cpustate->AF.b.h^q^R)&HF)|VF; \
- cpustate->AF.b.h=q; \
+ int q = m_AF.b.h-R; \
+ m_AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(m_AF.b.h^q^R)&HF)|VF; \
+ m_AF.b.h=q; \
}
#define M_SBB(R) { \
- int q = cpustate->AF.b.h-R-(cpustate->AF.b.l&CF); \
- cpustate->AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(cpustate->AF.b.h^q^R)&HF)|VF; \
- cpustate->AF.b.h=q; \
+ int q = m_AF.b.h-R-(m_AF.b.l&CF); \
+ m_AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(m_AF.b.h^q^R)&HF)|VF; \
+ m_AF.b.h=q; \
}
#define M_CMP(R) { \
- int q = cpustate->AF.b.h-R; \
- cpustate->AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(cpustate->AF.b.h^q^R)&HF)|VF; \
+ int q = m_AF.b.h-R; \
+ m_AF.b.l=ZSP[q&255]|((q>>8)&CF)|(~(m_AF.b.h^q^R)&HF)|VF; \
}
#define M_DAD(R) { \
- int q = cpustate->HL.d + cpustate->R.d; \
- cpustate->AF.b.l = (cpustate->AF.b.l & ~CF) | (q>>16 & CF ); \
- cpustate->HL.w.l = q; \
+ int q = m_HL.d + m_##R.d; \
+ m_AF.b.l = (m_AF.b.l & ~CF) | (q>>16 & CF ); \
+ m_HL.w.l = q; \
}
// DSUB is 8085-only, not sure if H flag handling is correct
-#define M_DSUB(cpustate) { \
- int q = cpustate->HL.b.l-cpustate->BC.b.l; \
- cpustate->AF.b.l=ZS[q&255]|((q>>8)&CF)|VF| \
- ((cpustate->HL.b.l^q^cpustate->BC.b.l)&HF)| \
- (((cpustate->BC.b.l^cpustate->HL.b.l)&(cpustate->HL.b.l^q)&SF)>>5); \
- cpustate->HL.b.l=q; \
- q = cpustate->HL.b.h-cpustate->BC.b.h-(cpustate->AF.b.l&CF); \
- cpustate->AF.b.l=ZS[q&255]|((q>>8)&CF)|VF| \
- ((cpustate->HL.b.h^q^cpustate->BC.b.h)&HF)| \
- (((cpustate->BC.b.h^cpustate->HL.b.h)&(cpustate->HL.b.h^q)&SF)>>5); \
- if (cpustate->HL.b.l!=0) cpustate->AF.b.l&=~ZF; \
+#define M_DSUB() { \
+ int q = m_HL.b.l-m_BC.b.l; \
+ m_AF.b.l=ZS[q&255]|((q>>8)&CF)|VF| \
+ ((m_HL.b.l^q^m_BC.b.l)&HF)| \
+ (((m_BC.b.l^m_HL.b.l)&(m_HL.b.l^q)&SF)>>5); \
+ m_HL.b.l=q; \
+ q = m_HL.b.h-m_BC.b.h-(m_AF.b.l&CF); \
+ m_AF.b.l=ZS[q&255]|((q>>8)&CF)|VF| \
+ ((m_HL.b.h^q^m_BC.b.h)&HF)| \
+ (((m_BC.b.h^m_HL.b.h)&(m_HL.b.h^q)&SF)>>5); \
+ if (m_HL.b.l!=0) m_AF.b.l&=~ZF; \
}
/* i/o */
#define M_IN \
- cpustate->STATUS = 0x42; \
- cpustate->WZ.d=ARG(cpustate); \
- cpustate->AF.b.h=cpustate->io->read_byte(cpustate->WZ.d);
+ m_STATUS = 0x42; \
+ m_WZ.d=ARG(); \
+ m_AF.b.h=m_io->read_byte(m_WZ.d);
#define M_OUT \
- cpustate->STATUS = 0x10; \
- cpustate->WZ.d=ARG(cpustate); \
- cpustate->io->write_byte(cpustate->WZ.d,cpustate->AF.b.h)
+ m_STATUS = 0x10; \
+ m_WZ.d=ARG(); \
+ m_io->write_byte(m_WZ.d,m_AF.b.h)
/* stack */
#define M_PUSH(R) { \
- cpustate->STATUS = 0x04; \
- cpustate->program->write_byte(--cpustate->SP.w.l, cpustate->R.b.h); \
- cpustate->program->write_byte(--cpustate->SP.w.l, cpustate->R.b.l); \
+ m_STATUS = 0x04; \
+ m_program->write_byte(--m_SP.w.l, m_##R.b.h); \
+ m_program->write_byte(--m_SP.w.l, m_##R.b.l); \
}
#define M_POP(R) { \
- cpustate->STATUS = 0x86; \
- cpustate->R.b.l = cpustate->program->read_byte(cpustate->SP.w.l++); \
- cpustate->R.b.h = cpustate->program->read_byte(cpustate->SP.w.l++); \
+ m_STATUS = 0x86; \
+ m_##R.b.l = m_program->read_byte(m_SP.w.l++); \
+ m_##R.b.h = m_program->read_byte(m_SP.w.l++); \
}
/* jumps */
// On 8085 jump if condition is not satisfied is shorter
#define M_JMP(cc) { \
if (cc) { \
- cpustate->PC.w.l = ARG16(cpustate); \
+ m_PC.w.l = ARG16(); \
} else { \
- cpustate->PC.w.l += 2; \
- cpustate->icount += (IS_8085(cpustate)) ? 3 : 0; \
+ m_PC.w.l += 2; \
+ m_icount += (IS_8085()) ? 3 : 0; \
} \
}
@@ -160,13 +160,13 @@
{ \
if (cc) \
{ \
- UINT16 a = ARG16(cpustate); \
- cpustate->icount -= (IS_8085(cpustate)) ? 7 : 6 ; \
+ UINT16 a = ARG16(); \
+ m_icount -= (IS_8085()) ? 7 : 6 ; \
M_PUSH(PC); \
- cpustate->PC.d = a; \
+ m_PC.d = a; \
} else { \
- cpustate->PC.w.l += 2; \
- cpustate->icount += (IS_8085(cpustate)) ? 2 : 0; \
+ m_PC.w.l += 2; \
+ m_icount += (IS_8085()) ? 2 : 0; \
} \
}
@@ -175,12 +175,12 @@
{ \
if (cc) \
{ \
- cpustate->icount -= 6; \
+ m_icount -= 6; \
M_POP(PC); \
} \
}
#define M_RST(nn) { \
M_PUSH(PC); \
- cpustate->PC.d = 8 * nn; \
+ m_PC.d = 8 * nn; \
}
diff --git a/src/mame/audio/redalert.c b/src/mame/audio/redalert.c
index 48f64da74b5..65eeffafa2e 100644
--- a/src/mame/audio/redalert.c
+++ b/src/mame/audio/redalert.c
@@ -171,15 +171,6 @@ READ_LINE_MEMBER(redalert_state::sid_callback)
}
-static I8085_CONFIG( redalert_voice_i8085_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(redalert_state,sid_callback), /* SID changed callback (8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(redalert_state,sod_callback) /* SOD changed callback (8085A only) */
-};
-
-
static ADDRESS_MAP_START( redalert_voice_map, AS_PROGRAM, 8, redalert_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x7fff) AM_NOP
@@ -231,8 +222,9 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_FRAGMENT( redalert_audio_voice )
MCFG_CPU_ADD("voice", I8085A, REDALERT_VOICE_CPU_CLOCK)
- MCFG_CPU_CONFIG(redalert_voice_i8085_config)
MCFG_CPU_PROGRAM_MAP(redalert_voice_map)
+ MCFG_I8085A_SID(READLINE(redalert_state,sid_callback))
+ MCFG_I8085A_SOD(WRITELINE(redalert_state,sod_callback))
MCFG_SOUND_ADD("cvsd", HC55516, REDALERT_HC55516_CLOCK)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
diff --git a/src/mame/drivers/dwarfd.c b/src/mame/drivers/dwarfd.c
index 27168a3d928..31e40467d2c 100644
--- a/src/mame/drivers/dwarfd.c
+++ b/src/mame/drivers/dwarfd.c
@@ -856,16 +856,6 @@ WRITE_LINE_MEMBER(dwarfd_state::dwarfd_sod_callback)
m_crt_access = state;
}
-
-static I8085_CONFIG( dwarfd_i8085_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(dwarfd_state,dwarfd_sod_callback) /* SOD changed callback (8085A only) */
-};
-
-
TIMER_DEVICE_CALLBACK_MEMBER(dwarfd_state::dwarfd_interrupt)
{
int scanline = param;
@@ -1062,7 +1052,7 @@ static MACHINE_CONFIG_START( dwarfd, dwarfd_state )
/* basic machine hardware */
/* FIXME: The 8085A had a max clock of 6MHz, internally divided by 2! */
MCFG_CPU_ADD("maincpu", I8085A, 10595000/3*2) /* ? MHz */
- MCFG_CPU_CONFIG(dwarfd_i8085_config)
+ MCFG_I8085A_SOD(WRITELINE(dwarfd_state,dwarfd_sod_callback))
MCFG_CPU_PROGRAM_MAP(mem_map)
MCFG_CPU_IO_MAP(io_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dwarfd_state, dwarfd_interrupt, "screen", 0, 1)
diff --git a/src/mame/drivers/n8080.c b/src/mame/drivers/n8080.c
index 88ca2dcb9ab..78e443ccb6a 100644
--- a/src/mame/drivers/n8080.c
+++ b/src/mame/drivers/n8080.c
@@ -458,14 +458,6 @@ WRITE8_MEMBER(n8080_state::n8080_status_callback)
}
}
-static I8085_CONFIG( n8080_cpu_config )
-{
- DEVCB_DRIVER_MEMBER(n8080_state,n8080_status_callback), /* STATUS changed callback */
- DEVCB_DRIVER_LINE_MEMBER(n8080_state,n8080_inte_callback), /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (8085A only) */
- DEVCB_NULL /* SOD changed callback (8085A only) */
-};
-
MACHINE_START_MEMBER(n8080_state,n8080)
{
save_item(NAME(m_shift_data));
@@ -532,7 +524,8 @@ static MACHINE_CONFIG_START( spacefev, n8080_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8080, MASTER_CLOCK / 10)
- MCFG_CPU_CONFIG(n8080_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(n8080_state,n8080_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(n8080_state,n8080_inte_callback))
MCFG_CPU_PROGRAM_MAP(main_cpu_map)
MCFG_CPU_IO_MAP(main_io_map)
@@ -562,7 +555,8 @@ static MACHINE_CONFIG_START( sheriff, n8080_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8080, MASTER_CLOCK / 10)
- MCFG_CPU_CONFIG(n8080_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(n8080_state,n8080_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(n8080_state,n8080_inte_callback))
MCFG_CPU_PROGRAM_MAP(main_cpu_map)
MCFG_CPU_IO_MAP(main_io_map)
@@ -592,7 +586,8 @@ static MACHINE_CONFIG_DERIVED( westgun2, sheriff )
/* basic machine hardware */
MCFG_CPU_REPLACE("maincpu", I8080, XTAL_19_968MHz / 10)
- MCFG_CPU_CONFIG(n8080_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(n8080_state,n8080_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(n8080_state,n8080_inte_callback))
MCFG_CPU_PROGRAM_MAP(main_cpu_map)
MCFG_CPU_IO_MAP(main_io_map)
@@ -603,7 +598,8 @@ static MACHINE_CONFIG_START( helifire, n8080_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8080, MASTER_CLOCK / 10)
- MCFG_CPU_CONFIG(n8080_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(n8080_state,n8080_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(n8080_state,n8080_inte_callback))
MCFG_CPU_PROGRAM_MAP(helifire_main_cpu_map)
MCFG_CPU_IO_MAP(main_io_map)
diff --git a/src/mame/drivers/phoenix.c b/src/mame/drivers/phoenix.c
index ac3b06bc9bb..6c555986dc9 100644
--- a/src/mame/drivers/phoenix.c
+++ b/src/mame/drivers/phoenix.c
@@ -509,19 +509,11 @@ MACHINE_CONFIG_END
/* Same as Phoenix, but uses an AY8910 and an extra visible line (column) */
-static I8085_CONFIG( survival_i8085_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(phoenix_state, survival_sid_callback), /* SID changed callback (8085A only) */
- DEVCB_NULL /* SOD changed callback (8085A only) */
-};
-
static MACHINE_CONFIG_START( survival, phoenix_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8085A, CPU_CLOCK) /* 5.50 MHz */
- MCFG_CPU_CONFIG(survival_i8085_config)
+ MCFG_I8085A_SID(READLINE(phoenix_state, survival_sid_callback))
MCFG_CPU_PROGRAM_MAP(survival_memory_map)
MCFG_MACHINE_RESET_OVERRIDE(phoenix_state,phoenix)
diff --git a/src/mame/video/phoenix.c b/src/mame/video/phoenix.c
index b550e273e9b..0940018b708 100644
--- a/src/mame/video/phoenix.c
+++ b/src/mame/video/phoenix.c
@@ -431,7 +431,7 @@ READ8_MEMBER(phoenix_state::survival_protection_r)
READ_LINE_MEMBER(phoenix_state::survival_sid_callback)
{
- return m_survival_sid_value;
+ return m_survival_sid_value ? ASSERT_LINE : CLEAR_LINE;
}
diff --git a/src/mess/drivers/bob85.c b/src/mess/drivers/bob85.c
index 075405f152d..028f4ad804d 100644
--- a/src/mess/drivers/bob85.c
+++ b/src/mess/drivers/bob85.c
@@ -205,20 +205,13 @@ READ_LINE_MEMBER( bob85_state::sid_r )
return m_cass->input() > 0.0;
}
-static I8085_CONFIG( cpu_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(bob85_state, sid_r), /* SID changed callback (I8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(bob85_state, sod_w) /* SOD changed callback (I8085A only) */
-};
-
static MACHINE_CONFIG_START( bob85, bob85_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8085A, XTAL_5MHz)
MCFG_CPU_PROGRAM_MAP(bob85_mem)
MCFG_CPU_IO_MAP(bob85_io)
- MCFG_CPU_CONFIG(cpu_config)
+ MCFG_I8085A_SID(READLINE(bob85_state, sid_r))
+ MCFG_I8085A_SOD(WRITELINE(bob85_state, sod_w))
/* video hardware */
MCFG_DEFAULT_LAYOUT(layout_bob85)
diff --git a/src/mess/drivers/exp85.c b/src/mess/drivers/exp85.c
index 655751411f5..45495fae4d7 100644
--- a/src/mess/drivers/exp85.c
+++ b/src/mess/drivers/exp85.c
@@ -171,14 +171,6 @@ WRITE_LINE_MEMBER( exp85_state::sod_w )
}
}
-static I8085_CONFIG( exp85_i8085_config )
-{
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(exp85_state, sid_r),
- DEVCB_DRIVER_LINE_MEMBER(exp85_state, sod_w)
-};
-
/* Terminal Interface */
static DEVICE_INPUT_DEFAULTS_START( terminal )
@@ -221,7 +213,8 @@ static MACHINE_CONFIG_START( exp85, exp85_state )
MCFG_CPU_ADD(I8085A_TAG, I8085A, XTAL_6_144MHz)
MCFG_CPU_PROGRAM_MAP(exp85_mem)
MCFG_CPU_IO_MAP(exp85_io)
- MCFG_CPU_CONFIG(exp85_i8085_config)
+ MCFG_I8085A_SID(READLINE(exp85_state, sid_r))
+ MCFG_I8085A_SOD(WRITELINE(exp85_state, sod_w))
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/fp200.c b/src/mess/drivers/fp200.c
index 42b42ea5b54..be90419b57f 100644
--- a/src/mess/drivers/fp200.c
+++ b/src/mess/drivers/fp200.c
@@ -575,21 +575,14 @@ READ_LINE_MEMBER( fp200_state::sid_r )
return (ioport("KEYMOD")->read() >> m_keyb_mux) & 1;
}
-static I8085_CONFIG( cpu_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(fp200_state, sid_r), /* SID changed callback (I8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(fp200_state, sod_w) /* SOD changed callback (I8085A only) */
-};
-
static MACHINE_CONFIG_START( fp200, fp200_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",I8085A,MAIN_CLOCK)
MCFG_CPU_PROGRAM_MAP(fp200_map)
MCFG_CPU_IO_MAP(fp200_io)
- MCFG_CPU_CONFIG(cpu_config)
+ MCFG_I8085A_SID(READLINE(fp200_state, sid_r))
+ MCFG_I8085A_SOD(WRITELINE(fp200_state, sod_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", LCD)
diff --git a/src/mess/drivers/h8.c b/src/mess/drivers/h8.c
index f0168064d88..113307147d2 100644
--- a/src/mess/drivers/h8.c
+++ b/src/mess/drivers/h8.c
@@ -283,14 +283,6 @@ static const i8251_interface uart_intf =
DEVCB_NULL
};
-static I8085_CONFIG( h8_cpu_config )
-{
- DEVCB_DRIVER_MEMBER(h8_state, h8_status_callback), /* Status changed callback */
- DEVCB_DRIVER_LINE_MEMBER(h8_state, h8_inte_callback), /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (I8085A only) */
- DEVCB_NULL /* SOD changed callback (I8085A only) */
-};
-
TIMER_DEVICE_CALLBACK_MEMBER(h8_state::h8_c)
{
m_uart->receive_clock();
@@ -332,7 +324,8 @@ static MACHINE_CONFIG_START( h8, h8_state )
MCFG_CPU_ADD("maincpu", I8080, H8_CLOCK)
MCFG_CPU_PROGRAM_MAP(h8_mem)
MCFG_CPU_IO_MAP(h8_io)
- MCFG_CPU_CONFIG(h8_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(h8_state, h8_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(h8_state, h8_inte_callback))
/* video hardware */
MCFG_DEFAULT_LAYOUT(layout_h8)
diff --git a/src/mess/drivers/kyocera.c b/src/mess/drivers/kyocera.c
index b984e76776a..cab6583e980 100644
--- a/src/mess/drivers/kyocera.c
+++ b/src/mess/drivers/kyocera.c
@@ -1312,14 +1312,6 @@ READ_LINE_MEMBER( kc85_state::kc85_sid_r )
return m_cassette->input() > 0.0;
}
-static I8085_CONFIG( kc85_i8085_config )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(kc85_state,kc85_sid_r), /* SID changed callback (I8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(kc85_state,kc85_sod_w) /* SOD changed callback (I8085A only) */
-};
-
TIMER_DEVICE_CALLBACK_MEMBER(tandy200_state::tandy200_tp_tick)
{
m_maincpu->set_input_line(I8085_RST75_LINE, m_tp);
@@ -1332,7 +1324,8 @@ static MACHINE_CONFIG_START( kc85, kc85_state )
MCFG_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
MCFG_CPU_PROGRAM_MAP(kc85_mem)
MCFG_CPU_IO_MAP(kc85_io)
- MCFG_CPU_CONFIG(kc85_i8085_config)
+ MCFG_I8085A_SID(READLINE(kc85_state,kc85_sid_r))
+ MCFG_I8085A_SOD(WRITELINE(kc85_state,kc85_sod_w))
/* video hardware */
MCFG_FRAGMENT_ADD(kc85_video)
@@ -1370,7 +1363,8 @@ static MACHINE_CONFIG_START( pc8201, pc8201_state )
MCFG_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
MCFG_CPU_PROGRAM_MAP(pc8201_mem)
MCFG_CPU_IO_MAP(pc8201_io)
- MCFG_CPU_CONFIG(kc85_i8085_config)
+ MCFG_I8085A_SID(READLINE(kc85_state,kc85_sid_r))
+ MCFG_I8085A_SOD(WRITELINE(kc85_state,kc85_sod_w))
/* video hardware */
MCFG_FRAGMENT_ADD(kc85_video)
@@ -1414,7 +1408,8 @@ static MACHINE_CONFIG_START( trsm100, trsm100_state )
MCFG_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
MCFG_CPU_PROGRAM_MAP(kc85_mem)
MCFG_CPU_IO_MAP(trsm100_io)
- MCFG_CPU_CONFIG(kc85_i8085_config)
+ MCFG_I8085A_SID(READLINE(kc85_state,kc85_sid_r))
+ MCFG_I8085A_SOD(WRITELINE(kc85_state,kc85_sod_w))
/* video hardware */
MCFG_FRAGMENT_ADD(kc85_video)
@@ -1459,7 +1454,8 @@ static MACHINE_CONFIG_START( tandy200, tandy200_state )
MCFG_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
MCFG_CPU_PROGRAM_MAP(tandy200_mem)
MCFG_CPU_IO_MAP(tandy200_io)
- MCFG_CPU_CONFIG(kc85_i8085_config)
+ MCFG_I8085A_SID(READLINE(kc85_state,kc85_sid_r))
+ MCFG_I8085A_SOD(WRITELINE(kc85_state,kc85_sod_w))
/* video hardware */
MCFG_FRAGMENT_ADD(tandy200_video)
diff --git a/src/mess/drivers/mikromik.c b/src/mess/drivers/mikromik.c
index 8cd96bbd384..1445e062448 100644
--- a/src/mess/drivers/mikromik.c
+++ b/src/mess/drivers/mikromik.c
@@ -648,23 +648,11 @@ static UPD7201_INTERFACE( mpsc_intf )
};
-//-------------------------------------------------
-// I8085_CONFIG( i8085_intf )
-//-------------------------------------------------
-
READ_LINE_MEMBER( mm1_state::dsra_r )
{
return 1;
}
-static I8085_CONFIG( i8085_intf )
-{
- DEVCB_NULL, // STATUS changed callback
- DEVCB_NULL, // INTE changed callback
- DEVCB_DRIVER_LINE_MEMBER(mm1_state, dsra_r), // SID changed callback (I8085A only)
- DEVCB_DEVICE_LINE_MEMBER("speaker", speaker_sound_device, level_w) // SOD changed callback (I8085A only)
-};
-
//-------------------------------------------------
// upd765_interface fdc_intf
@@ -794,7 +782,8 @@ static MACHINE_CONFIG_START( mm1, mm1_state )
// basic system hardware
MCFG_CPU_ADD(I8085A_TAG, I8085A, XTAL_6_144MHz)
MCFG_CPU_PROGRAM_MAP(mm1_map)
- MCFG_CPU_CONFIG(i8085_intf)
+ MCFG_I8085A_SID(READLINE(mm1_state, dsra_r))
+ MCFG_I8085A_SOD(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MCFG_QUANTUM_PERFECT_CPU(I8085A_TAG)
MCFG_TIMER_DRIVER_ADD_PERIODIC("kbclk", mm1_state, kbclk_tick, attotime::from_hz(2500))
diff --git a/src/mess/drivers/mmd1.c b/src/mess/drivers/mmd1.c
index 36d1a091612..1090ca9d210 100644
--- a/src/mess/drivers/mmd1.c
+++ b/src/mess/drivers/mmd1.c
@@ -435,14 +435,6 @@ WRITE_LINE_MEMBER( mmd1_state::mmd2_inte_callback )
output_set_value("led_inte", state);
}
-static I8085_CONFIG( mmd2_cpu_config )
-{
- DEVCB_DRIVER_MEMBER(mmd1_state, mmd2_status_callback), /* Status changed callback */
- DEVCB_DRIVER_LINE_MEMBER(mmd1_state, mmd2_inte_callback), /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (I8085A only) */
- DEVCB_NULL /* SOD changed callback (I8085A only) */
-};
-
MACHINE_RESET_MEMBER(mmd1_state,mmd1)
{
m_return_code = 0xff;
@@ -510,7 +502,8 @@ static MACHINE_CONFIG_START( mmd2, mmd1_state )
MCFG_CPU_ADD("maincpu",I8080, 6750000 / 9)
MCFG_CPU_PROGRAM_MAP(mmd2_mem)
MCFG_CPU_IO_MAP(mmd2_io)
- MCFG_CPU_CONFIG(mmd2_cpu_config)
+ MCFG_I8085A_STATUS(WRITE8(mmd1_state, mmd2_status_callback))
+ MCFG_I8085A_INTE(WRITELINE(mmd1_state, mmd2_inte_callback))
MCFG_MACHINE_RESET_OVERRIDE(mmd1_state,mmd2)
diff --git a/src/mess/drivers/sitcom.c b/src/mess/drivers/sitcom.c
index 251bbe50706..21b06c3190e 100644
--- a/src/mess/drivers/sitcom.c
+++ b/src/mess/drivers/sitcom.c
@@ -114,20 +114,13 @@ WRITE_LINE_MEMBER( sitcom_state::sod_led )
output_set_value("sod_led", state);
}
-static I8085_CONFIG( sitcom_cpu_config )
-{
- DEVCB_NULL, /* Status changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_DRIVER_LINE_MEMBER(sitcom_state, sid_line), /* SID changed callback (I8085A only) */
- DEVCB_DRIVER_LINE_MEMBER(sitcom_state, sod_led) /* SOD changed callback (I8085A only) */
-};
-
static MACHINE_CONFIG_START( sitcom, sitcom_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8085A, XTAL_6_144MHz) // 3.072MHz can be used for an old slow 8085
MCFG_CPU_PROGRAM_MAP(sitcom_mem)
MCFG_CPU_IO_MAP(sitcom_io)
- MCFG_CPU_CONFIG(sitcom_cpu_config)
+ MCFG_I8085A_SID(READLINE(sitcom_state, sid_line))
+ MCFG_I8085A_SOD(WRITELINE(sitcom_state, sod_led))
/* video hardware */
MCFG_DL1416B_ADD("ds0", sitcom_ds0_intf)
diff --git a/src/mess/drivers/tdv2324.c b/src/mess/drivers/tdv2324.c
index 11580fe8aaa..cbb7d8baa64 100644
--- a/src/mess/drivers/tdv2324.c
+++ b/src/mess/drivers/tdv2324.c
@@ -242,32 +242,6 @@ UINT32 tdv2324_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
//**************************************************************************
//-------------------------------------------------
-// I8085_CONFIG( i8085_intf )
-//-------------------------------------------------
-
-static I8085_CONFIG( i8085_intf )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (I8085A only) */
- DEVCB_NULL /* SOD changed callback (I8085A only) */
-};
-
-
-//-------------------------------------------------
-// I8085_CONFIG( i8085_sub_intf )
-//-------------------------------------------------
-
-static I8085_CONFIG( i8085_sub_intf )
-{
- DEVCB_NULL, /* STATUS changed callback */
- DEVCB_NULL, /* INTE changed callback */
- DEVCB_NULL, /* SID changed callback (I8085A only) */
- DEVCB_NULL /* SOD changed callback (I8085A only) */
-};
-
-
-//-------------------------------------------------
// pit8253_config pit0_intf
//-------------------------------------------------
@@ -375,12 +349,10 @@ static MACHINE_CONFIG_START( tdv2324, tdv2324_state )
MCFG_CPU_ADD(P8085AH_0_TAG, I8085A, 8700000/2) // ???
MCFG_CPU_PROGRAM_MAP(tdv2324_mem)
MCFG_CPU_IO_MAP(tdv2324_io)
- MCFG_CPU_CONFIG(i8085_intf)
MCFG_CPU_ADD(P8085AH_1_TAG, I8085A, 8000000/2) // ???
MCFG_CPU_PROGRAM_MAP(tdv2324_sub_mem)
MCFG_CPU_IO_MAP(tdv2324_sub_io)
- MCFG_CPU_CONFIG(i8085_sub_intf)
MCFG_CPU_ADD(MC68B02P_TAG, M6802, 8000000/2) // ???
MCFG_CPU_PROGRAM_MAP(tdv2324_fdc_mem)
diff --git a/src/mess/machine/shark.c b/src/mess/machine/shark.c
index d82cb5d2f4f..ecd1f514a06 100644
--- a/src/mess/machine/shark.c
+++ b/src/mess/machine/shark.c
@@ -72,19 +72,6 @@ ADDRESS_MAP_END
//-------------------------------------------------
-// I8085_CONFIG( cpu_intf )
-//-------------------------------------------------
-
-static I8085_CONFIG( cpu_intf )
-{
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL
-};
-
-
-//-------------------------------------------------
// rs232_port_interface rs232_intf
//-------------------------------------------------
@@ -105,7 +92,6 @@ static const rs232_port_interface rs232_intf =
static MACHINE_CONFIG_FRAGMENT( shark )
// basic machine hardware
MCFG_CPU_ADD(I8085_TAG, I8085A, 1000000)
- MCFG_CPU_CONFIG(cpu_intf)
MCFG_CPU_PROGRAM_MAP(shark_mem)
MCFG_CPU_IO_MAP(shark_io)