diff options
author | 2012-09-26 14:11:46 +0000 | |
---|---|---|
committer | 2012-09-26 14:11:46 +0000 | |
commit | fa40275471452144f7b49f08e610abcc8490b630 (patch) | |
tree | 163104d3639b7e2de8988f98ffd8e1070a892f5f /src | |
parent | 037ce8cfc11fcd3dc4cecb5e2aa9965502b4fe96 (diff) |
m6509: Fixed EA zero page indirect + Y (post indexed). [Curt Coder]
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/cpu/m6502/m6509.c | 36 | ||||
-rw-r--r-- | src/emu/cpu/m6502/ops09.h | 23 |
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 ******************************************************** |