mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
m6509: Fixed EA zero page indirect + Y (post indexed). [Curt Coder]
This commit is contained in:
parent
037ce8cfc1
commit
fa40275471
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 ********************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user