summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2012-09-26 14:11:46 +0000
committer Curt Coder <curtcoder@mail.com>2012-09-26 14:11:46 +0000
commitfa40275471452144f7b49f08e610abcc8490b630 (patch)
tree163104d3639b7e2de8988f98ffd8e1070a892f5f /src
parent037ce8cfc11fcd3dc4cecb5e2aa9965502b4fe96 (diff)
m6509: Fixed EA zero page indirect + Y (post indexed). [Curt Coder]
Diffstat (limited to 'src')
-rw-r--r--src/emu/cpu/m6502/m6509.c36
-rw-r--r--src/emu/cpu/m6502/ops09.h23
2 files changed, 49 insertions, 10 deletions
diff --git a/src/emu/cpu/m6502/m6509.c b/src/emu/cpu/m6502/m6509.c
index 1eb652f108b..9e042832bcb 100644
--- a/src/emu/cpu/m6502/m6509.c
+++ b/src/emu/cpu/m6502/m6509.c
@@ -81,6 +81,7 @@ struct m6509_Regs {
address_space *space;
direct_read_data *direct;
+ int int_occured;
int icount;
devcb_resolved_read8 rdmem_id; /* readmem callback for indexed instructions */
@@ -157,6 +158,18 @@ static CPU_INIT( m6509 )
cpustate->rdmem_id.resolve(nullrcb, *device);
cpustate->wrmem_id.resolve(nullwcb, *device);
}
+
+ device->save_item(NAME(cpustate->pc.w.l));
+ device->save_item(NAME(cpustate->sp.w.l));
+ device->save_item(NAME(cpustate->p));
+ device->save_item(NAME(cpustate->a));
+ device->save_item(NAME(cpustate->x));
+ device->save_item(NAME(cpustate->y));
+ device->save_item(NAME(cpustate->pending_irq));
+ device->save_item(NAME(cpustate->after_cli));
+ device->save_item(NAME(cpustate->nmi_state));
+ device->save_item(NAME(cpustate->irq_state));
+ device->save_item(NAME(cpustate->so_state));
}
static CPU_RESET( m6509 )
@@ -177,7 +190,8 @@ static CPU_RESET( m6509 )
cpustate->p = F_T|F_B|F_I|F_Z|(P&F_D); /* set T, I and Z flags */
cpustate->pending_irq = 0; /* nonzero if an IRQ is pending */
cpustate->after_cli = 0; /* pending IRQ and last insn cleared I */
- cpustate->irq_callback = NULL;
+ cpustate->irq_state = 0;
+ cpustate->nmi_state = 0;
}
static CPU_EXIT( m6509 )
@@ -239,9 +253,18 @@ static CPU_EXECUTE( m6509 )
LOG((": irq line is clear\n"));
}
}
- else
- if( cpustate->pending_irq )
- m6509_take_irq(cpustate);
+ else {
+ if ( cpustate->pending_irq == 2 ) {
+ if ( cpustate->int_occured - cpustate->icount > 1 ) {
+ cpustate->pending_irq = 1;
+ }
+ }
+ if( cpustate->pending_irq == 1 )
+ m6509_take_irq(cpustate);
+ if ( cpustate->pending_irq == 2 ) {
+ cpustate->pending_irq = 1;
+ }
+ }
} while (cpustate->icount > 0);
}
@@ -284,6 +307,7 @@ static void m6509_set_irq_line(m6509_Regs *cpustate, int irqline, int state)
{
LOG(( "M6509 '%s' set_irq_line(ASSERT)\n", cpustate->device->tag()));
cpustate->pending_irq = 1;
+ cpustate->int_occured = cpustate->icount;
}
}
}
@@ -401,7 +425,7 @@ CPU_GET_INFO( m6509 )
cpustate->p & 0x01 ? 'C':'.');
break;
- case CPUINFO_STR_REGISTER + M6509_PC: sprintf(info->s, "PC:%04X", cpustate->pc.w.l); break;
+ case CPUINFO_STR_REGISTER + M6509_PC: sprintf(info->s, "PC:%05X", cpustate->pc.d); break;
case CPUINFO_STR_REGISTER + M6509_S: sprintf(info->s, "S:%02X", cpustate->sp.b.l); break;
case CPUINFO_STR_REGISTER + M6509_P: sprintf(info->s, "P:%02X", cpustate->p); break;
case CPUINFO_STR_REGISTER + M6509_A: sprintf(info->s, "A:%02X", cpustate->a); break;
@@ -409,7 +433,7 @@ CPU_GET_INFO( m6509 )
case CPUINFO_STR_REGISTER + M6509_Y: sprintf(info->s, "Y:%02X", cpustate->y); break;
case CPUINFO_STR_REGISTER + M6509_PC_BANK: sprintf(info->s, "M0:%01X", cpustate->pc_bank.b.h2); break;
case CPUINFO_STR_REGISTER + M6509_IND_BANK: sprintf(info->s, "M1:%01X", cpustate->ind_bank.b.h2); break;
- case CPUINFO_STR_REGISTER + M6509_EA: sprintf(info->s, "EA:%04X", cpustate->ea.w.l); break;
+ case CPUINFO_STR_REGISTER + M6509_EA: sprintf(info->s, "EA:%05X", cpustate->ea.d); break;
case CPUINFO_STR_REGISTER + M6509_ZP: sprintf(info->s, "ZP:%03X", cpustate->zp.w.l); break;
}
}
diff --git a/src/emu/cpu/m6502/ops09.h b/src/emu/cpu/m6502/ops09.h
index 16d375f435a..b29e31155d6 100644
--- a/src/emu/cpu/m6502/ops09.h
+++ b/src/emu/cpu/m6502/ops09.h
@@ -128,9 +128,24 @@
EAH = RDMEM(ZPD); \
EAWH = PBWH; \
if (EAL + Y > 0xff) \
- cpustate->icount--; \
+ cpustate->icount--; \
EAW += Y
+/***************************************************************
+ * EA = zero page indirect + Y (post indexed)
+ * subtract 1 cycle if page boundary is crossed
+ ***************************************************************/
+#undef EA_IDY_P
+#define EA_IDY_P \
+ ZPL = RDOPARG(); \
+ EAL = RDMEM(ZPD); \
+ ZPL++; \
+ EAH = RDMEM(ZPD); \
+ EAWH = PBWH; \
+ if (EAL + Y > 0xff) { \
+ RDMEM( ( EAH << 8 ) | ( ( EAL + Y ) & 0xff ) ); \
+ } \
+ EAW += Y;
/***************************************************************
* EA = zero page indirect + Y (post indexed)
@@ -144,7 +159,7 @@
EAH = RDMEM(ZPD); \
EAWH = IBWH; \
if (EAL + Y > 0xff) \
- cpustate->icount--; \
+ cpustate->icount--; \
EAW += Y
/***************************************************************
@@ -172,13 +187,13 @@
{ \
tmp = RDOPARG(); \
EAW = PCW + (signed char)tmp; \
- cpustate->icount -= (PCH == EAH) ? 1 : 2; \
+ cpustate->icount -= (PCH == EAH) ? 1 : 2; \
PCD = EAD|PB; \
} \
else \
{ \
PCW++; \
- cpustate->icount -= 1; \
+ cpustate->icount -= 1; \
}
/* 6502 ********************************************************