some fix for m4510 core

This commit is contained in:
Roberto Zandona 2008-08-24 11:55:22 +00:00
parent bfc0c6a5b2
commit 65a96e4f7a
4 changed files with 39 additions and 43 deletions

View File

@ -133,6 +133,7 @@ typedef struct {
UINT8 y; /* Y index register */
UINT8 z; /* Z index register */
UINT8 p; /* Processor status */
UINT8 interrupt_inhibit; /* Some instructions, like MAP, inhibit interrupt */
UINT8 pending_irq; /* nonzero if an IRQ is pending */
UINT8 after_cli; /* pending IRQ and last insn cleared I */
UINT8 nmi_state;
@ -172,11 +173,12 @@ INLINE int m4510_cpu_readop_arg(void)
#define M4510
#include "t65ce02.c"
static READ8_HANDLER( default_rdmem_id ) { return program_read_byte_8le(offset); }
static WRITE8_HANDLER( default_wrmem_id ) { program_write_byte_8le(offset, data); }
static READ8_HANDLER( default_rdmem_id ) { return program_read_byte_8le(M4510_MEM(offset)); }
static WRITE8_HANDLER( default_wrmem_id ) { program_write_byte_8le(M4510_MEM(offset), data); }
static void m4510_init(int index, int clock, const void *config, int (*irqcallback)(int))
{
m4510.interrupt_inhibit = 0;
m4510.rdmem_id = default_rdmem_id;
m4510.wrmem_id = default_wrmem_id;
m4510.irq_callback = irqcallback;
@ -197,6 +199,7 @@ static void m4510_reset (void)
m4510.z = 0;
B = 0;
m4510.p = F_E|F_B|F_I|F_Z; /* set E, I and Z flags */
m4510.interrupt_inhibit = 0;
m4510.pending_irq = 0; /* nonzero if an IRQ is pending */
m4510.after_cli = 0; /* pending IRQ and last insn cleared I */
m4510.irq_callback = NULL;
@ -234,7 +237,7 @@ static void m4510_set_context (void *src)
INLINE void m4510_take_irq(void)
{
if( !(P & F_I) )
if(( !(P & F_I) ) && (m4510.interrupt_inhibit == 0))
{
EAD = M4510_IRQ_VEC;
m4510_ICount -= 7;

View File

@ -54,7 +54,7 @@
#define CHANGE_PC change_pc(M4510_MEM(PCD))
#define PEEK_OP() cpu_readop(M4510_MEM(PCD))
#define PEEK_OP() cpu_readop(M4510_MEM(PCW))
#define RDMEM(addr) program_read_byte_8le(M4510_MEM(addr)); m4510_ICount -= 1
#define WRMEM(addr,data) program_write_byte_8le(M4510_MEM(addr),data); m4510_ICount -= 1

View File

@ -31,47 +31,33 @@
#undef TXS
#define TXS \
SPL = X; \
if (PEEK_OP() == 0x2b /*TYS*/ ) { \
if (PEEK_OP() == 0x2b /*TYS*/ ) { \
UINT8 op = RDOP(); \
(*m4510.insn[op])(); \
}
#undef NOP
#define NOP \
m4510.interrupt_inhibit = 0; \
/* SEI */
/* c65 docu says transfer of axyz to the mapper register
so no readback!? */
#define MAP \
if (PEEK_OP() == 0xea /*NOP, in this case end of map*/ )\
{ \
m4510.mem[0]=0; \
m4510.mem[1]=0; \
m4510.mem[2]=0; \
m4510.mem[3]=0; \
m4510.mem[4]=0; \
m4510.mem[5]=0; \
m4510.mem[6]=0; \
m4510.mem[7]=0; \
CHANGE_PC; \
} else { \
/*UINT16 low, high;*/ \
/*low=m4510.low;*/ \
/*high=m4510.high;*/ \
#define MAP \
m4510.interrupt_inhibit = 1; \
m4510.low=m4510.a|(m4510.x<<8); \
m4510.high=m4510.y|(m4510.z<<8); \
/*m4510.a=low&0xff;*/ \
/*m4510.x=low>>8;*/ \
/*m4510.y=high&0xff;*/ \
/*m4510.z=high>>8;*/ \
m4510.mem[0]=(m4510.low&0x1000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[1]=(m4510.low&0x2000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[2]=(m4510.low&0x4000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[3]=(m4510.low&0x8000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[0]=(m4510.low&0x1000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[1]=(m4510.low&0x2000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[2]=(m4510.low&0x4000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[3]=(m4510.low&0x8000) ? (m4510.low&0xfff)<<8:0; \
m4510.mem[4]=(m4510.high&0x1000) ? (m4510.high&0xfff)<<8:0; \
m4510.mem[5]=(m4510.high&0x2000) ? (m4510.high&0xfff)<<8:0; \
m4510.mem[6]=(m4510.high&0x4000) ? (m4510.high&0xfff)<<8:0; \
m4510.mem[7]=(m4510.high&0x8000) ? (m4510.high&0xfff)<<8:0; \
CHANGE_PC; \
} \
m4510_ICount -= 3; \
{ \
m4510_ICount -= 3; \
{ \
UINT8 op = RDOP(); \
(*m4510.insn[op])(); \
}
}

View File

@ -125,7 +125,7 @@
else \
pair.w.l++; \
EAH = RDMEM(pair.d); \
RDMEM(PCW-1); \
/* RDMEM(PCW-1); */ \
EAW += Y; \
}
@ -135,7 +135,7 @@
#define EA_IND \
EA_ABS; \
tmp = RDMEM(EAD); \
EAD++; \
EAL++; \
EAH = RDMEM(EAD); \
EAL = tmp
@ -146,7 +146,7 @@
EA_ABS; \
EAW += X; \
tmp = RDMEM(EAD); \
EAD++; \
EAL++; \
EAH = RDMEM(EAD); \
EAL = tmp
@ -317,27 +317,34 @@
* BRA branch relative
***************************************************************/
#define BRA(cond) \
tmp = RDOPARG(); \
if (cond) \
{ \
EAW = PCW + (signed char)tmp; \
tmp = RDOPARG(); \
EAW = PCW + (signed char)tmp; \
PCD = EAD; \
CHANGE_PC; \
} \
else \
{ \
PCW += 1; \
}
/***************************************************************
* BRA branch relative
***************************************************************/
#define BRA_WORD(cond) \
EAL = RDOPARG(); \
EAH = RDOPARG(); \
#define BRA_WORD(cond) \
if (cond) \
{ \
EAW = PCW + (short)(EAW-1); \
EAL = RDOPARG(); \
EAH = RDOPARG(); \
EAW = PCW + (short)(EAW-1); \
PCD = EAD; \
CHANGE_PC; \
} \
else \
{ \
PCW += 2; \
}
/* 65ce02 ******************************************************
* BRK Break
* increment PC, push PC hi, PC lo, flags (with B bit set),