summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/m6809/m6809.c
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2008-11-16 23:07:17 +0000
committer Couriersud <couriersud@users.noreply.github.com>2008-11-16 23:07:17 +0000
commit13f4eec4548d84d9009dd22f469084c4174fc81a (patch)
treee2d7c3a1fc951c5e8c5d154377c66336750042b2 /src/emu/cpu/m6809/m6809.c
parentad3179a0e2babf05850d160895faa1c233d8a0fc (diff)
Fix icount
* m68_icount ==> m68_state->icount * move ea into state struct
Diffstat (limited to 'src/emu/cpu/m6809/m6809.c')
-rw-r--r--src/emu/cpu/m6809/m6809.c84
1 files changed, 41 insertions, 43 deletions
diff --git a/src/emu/cpu/m6809/m6809.c b/src/emu/cpu/m6809/m6809.c
index bb54d625a29..55611c55d27 100644
--- a/src/emu/cpu/m6809/m6809.c
+++ b/src/emu/cpu/m6809/m6809.c
@@ -98,6 +98,8 @@ struct _m68_state_t
int extra_cycles; /* cycles used up by interrupts */
cpu_irq_callback irq_callback;
const device_config *device;
+ int icount;
+ PAIR ea; /* effective address */
const m6809_config *config;
UINT8 int_state; /* SYNC and CWAI flags */
UINT8 nmi_state;
@@ -139,9 +141,9 @@ struct _m68_state_t
#define DPD m68_state->dp.d
#define CC m68_state->cc
-static PAIR ea; /* effective address */
-#define EA ea.w.l
-#define EAD ea.d
+#define EA m68_state->ea.w.l
+#define EAD m68_state->ea.d
+#define EAP m68_state->ea
#define CHANGE_PC change_pc(PCD)
@@ -149,10 +151,6 @@ static PAIR ea; /* effective address */
#define M6809_SYNC 16 /* set when SYNC is waiting for an interrupt */
#define M6809_LDS 32 /* set when LDS occured at least once */
-
-/* public globals */
-static int m68_icount;
-
/* these are re-defined in m68_state->h TO RAM, ROM or functions in cpuintrf.c */
#define RM(Addr) M6809_RDMEM(Addr)
#define WM(Addr,Value) M6809_WRMEM(Addr,Value)
@@ -209,10 +207,10 @@ static int m68_icount;
#define SIGNED(b) ((UINT16)(b&0x80?b|0xff00:b))
/* macros for addressing modes (postbytes have their own code) */
-#define DIRECT EAD = DPD; IMMBYTE(ea.b.l)
+#define DIRECT EAD = DPD; IMMBYTE(m68_state->ea.b.l)
#define IMM8 EAD = PCD; PC++
#define IMM16 EAD = PCD; PC+=2
-#define EXTENDED IMMWORD(ea)
+#define EXTENDED IMMWORD(EAP)
/* macros to set status flags */
#if defined(SEC)
@@ -251,7 +249,7 @@ static int m68_icount;
IMMWORD(t); \
if( f ) \
{ \
- m68_icount -= 1; \
+ m68_state->icount -= 1; \
PC += t.w.l; \
CHANGE_PC; \
} \
@@ -477,13 +475,13 @@ static CPU_EXECUTE( m6809 ) /* NS 970908 */
{
m68_state_t *m68_state = device->token;
- m68_icount = cycles - m68_state->extra_cycles;
+ m68_state->icount = cycles - m68_state->extra_cycles;
m68_state->extra_cycles = 0;
if (m68_state->int_state & (M6809_CWAI | M6809_SYNC))
{
debugger_instruction_hook(device->machine, PCD);
- m68_icount = 0;
+ m68_state->icount = 0;
}
else
{
@@ -758,15 +756,15 @@ static CPU_EXECUTE( m6809 ) /* NS 970908 */
#else
(*m6809_main[m68_state->ireg])(m68_state);
#endif
- m68_icount -= cycles1[m68_state->ireg];
+ m68_state->icount -= cycles1[m68_state->ireg];
- } while( m68_icount > 0 );
+ } while( m68_state->icount > 0 );
- m68_icount -= m68_state->extra_cycles;
+ m68_state->icount -= m68_state->extra_cycles;
m68_state->extra_cycles = 0;
}
- return cycles - m68_icount; /* NS 970908 */
+ return cycles - m68_state->icount; /* NS 970908 */
}
INLINE void fetch_effective_address( m68_state_t *m68_state )
@@ -920,14 +918,14 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0x85: EA=X+SIGNED(B); break;
case 0x86: EA=X+SIGNED(A); break;
case 0x87: EA=0; break; /* ILLEGAL*/
- case 0x88: IMMBYTE(EA); EA=X+SIGNED(EA); break; /* this is a hack to make Vectrex work. It should be m68_icount-=1. Dunno where the cycle was lost :( */
- case 0x89: IMMWORD(ea); EA+=X; break;
+ case 0x88: IMMBYTE(EA); EA=X+SIGNED(EA); break; /* this is a hack to make Vectrex work. It should be m68_state->icount-=1. Dunno where the cycle was lost :( */
+ case 0x89: IMMWORD(EAP); EA+=X; break;
case 0x8a: EA=0; break; /* ILLEGAL*/
case 0x8b: EA=X+D; break;
case 0x8c: IMMBYTE(EA); EA=PC+SIGNED(EA); break;
- case 0x8d: IMMWORD(ea); EA+=PC; break;
+ case 0x8d: IMMWORD(EAP); EA+=PC; break;
case 0x8e: EA=0; break; /* ILLEGAL*/
- case 0x8f: IMMWORD(ea); break;
+ case 0x8f: IMMWORD(EAP); break;
case 0x90: EA=X; X++; EAD=RM16(EAD); break; /* Indirect ,R+ not in my specs */
case 0x91: EA=X; X+=2; EAD=RM16(EAD); break;
@@ -938,13 +936,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0x96: EA=X+SIGNED(A); EAD=RM16(EAD); break;
case 0x97: EA=0; break; /* ILLEGAL*/
case 0x98: IMMBYTE(EA); EA=X+SIGNED(EA); EAD=RM16(EAD); break;
- case 0x99: IMMWORD(ea); EA+=X; EAD=RM16(EAD); break;
+ case 0x99: IMMWORD(EAP); EA+=X; EAD=RM16(EAD); break;
case 0x9a: EA=0; break; /* ILLEGAL*/
case 0x9b: EA=X+D; EAD=RM16(EAD); break;
case 0x9c: IMMBYTE(EA); EA=PC+SIGNED(EA); EAD=RM16(EAD); break;
- case 0x9d: IMMWORD(ea); EA+=PC; EAD=RM16(EAD); break;
+ case 0x9d: IMMWORD(EAP); EA+=PC; EAD=RM16(EAD); break;
case 0x9e: EA=0; break; /* ILLEGAL*/
- case 0x9f: IMMWORD(ea); EAD=RM16(EAD); break;
+ case 0x9f: IMMWORD(EAP); EAD=RM16(EAD); break;
case 0xa0: EA=Y; Y++; break;
case 0xa1: EA=Y; Y+=2; break;
@@ -955,13 +953,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xa6: EA=Y+SIGNED(A); break;
case 0xa7: EA=0; break; /* ILLEGAL*/
case 0xa8: IMMBYTE(EA); EA=Y+SIGNED(EA); break;
- case 0xa9: IMMWORD(ea); EA+=Y; break;
+ case 0xa9: IMMWORD(EAP); EA+=Y; break;
case 0xaa: EA=0; break; /* ILLEGAL*/
case 0xab: EA=Y+D; break;
case 0xac: IMMBYTE(EA); EA=PC+SIGNED(EA); break;
- case 0xad: IMMWORD(ea); EA+=PC; break;
+ case 0xad: IMMWORD(EAP); EA+=PC; break;
case 0xae: EA=0; break; /* ILLEGAL*/
- case 0xaf: IMMWORD(ea); break;
+ case 0xaf: IMMWORD(EAP); break;
case 0xb0: EA=Y; Y++; EAD=RM16(EAD); break;
case 0xb1: EA=Y; Y+=2; EAD=RM16(EAD); break;
@@ -972,13 +970,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xb6: EA=Y+SIGNED(A); EAD=RM16(EAD); break;
case 0xb7: EA=0; break; /* ILLEGAL*/
case 0xb8: IMMBYTE(EA); EA=Y+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xb9: IMMWORD(ea); EA+=Y; EAD=RM16(EAD); break;
+ case 0xb9: IMMWORD(EAP); EA+=Y; EAD=RM16(EAD); break;
case 0xba: EA=0; break; /* ILLEGAL*/
case 0xbb: EA=Y+D; EAD=RM16(EAD); break;
case 0xbc: IMMBYTE(EA); EA=PC+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xbd: IMMWORD(ea); EA+=PC; EAD=RM16(EAD); break;
+ case 0xbd: IMMWORD(EAP); EA+=PC; EAD=RM16(EAD); break;
case 0xbe: EA=0; break; /* ILLEGAL*/
- case 0xbf: IMMWORD(ea); EAD=RM16(EAD); break;
+ case 0xbf: IMMWORD(EAP); EAD=RM16(EAD); break;
case 0xc0: EA=U; U++; break;
case 0xc1: EA=U; U+=2; break;
@@ -989,13 +987,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xc6: EA=U+SIGNED(A); break;
case 0xc7: EA=0; break; /*ILLEGAL*/
case 0xc8: IMMBYTE(EA); EA=U+SIGNED(EA); break;
- case 0xc9: IMMWORD(ea); EA+=U; break;
+ case 0xc9: IMMWORD(EAP); EA+=U; break;
case 0xca: EA=0; break; /*ILLEGAL*/
case 0xcb: EA=U+D; break;
case 0xcc: IMMBYTE(EA); EA=PC+SIGNED(EA); break;
- case 0xcd: IMMWORD(ea); EA+=PC; break;
+ case 0xcd: IMMWORD(EAP); EA+=PC; break;
case 0xce: EA=0; break; /*ILLEGAL*/
- case 0xcf: IMMWORD(ea); break;
+ case 0xcf: IMMWORD(EAP); break;
case 0xd0: EA=U; U++; EAD=RM16(EAD); break;
case 0xd1: EA=U; U+=2; EAD=RM16(EAD); break;
@@ -1006,13 +1004,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xd6: EA=U+SIGNED(A); EAD=RM16(EAD); break;
case 0xd7: EA=0; break; /*ILLEGAL*/
case 0xd8: IMMBYTE(EA); EA=U+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xd9: IMMWORD(ea); EA+=U; EAD=RM16(EAD); break;
+ case 0xd9: IMMWORD(EAP); EA+=U; EAD=RM16(EAD); break;
case 0xda: EA=0; break; /*ILLEGAL*/
case 0xdb: EA=U+D; EAD=RM16(EAD); break;
case 0xdc: IMMBYTE(EA); EA=PC+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xdd: IMMWORD(ea); EA+=PC; EAD=RM16(EAD); break;
+ case 0xdd: IMMWORD(EAP); EA+=PC; EAD=RM16(EAD); break;
case 0xde: EA=0; break; /*ILLEGAL*/
- case 0xdf: IMMWORD(ea); EAD=RM16(EAD); break;
+ case 0xdf: IMMWORD(EAP); EAD=RM16(EAD); break;
case 0xe0: EA=S; S++; break;
case 0xe1: EA=S; S+=2; break;
@@ -1023,13 +1021,13 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xe6: EA=S+SIGNED(A); break;
case 0xe7: EA=0; break; /*ILLEGAL*/
case 0xe8: IMMBYTE(EA); EA=S+SIGNED(EA); break;
- case 0xe9: IMMWORD(ea); EA+=S; break;
+ case 0xe9: IMMWORD(EAP); EA+=S; break;
case 0xea: EA=0; break; /*ILLEGAL*/
case 0xeb: EA=S+D; break;
case 0xec: IMMBYTE(EA); EA=PC+SIGNED(EA); break;
- case 0xed: IMMWORD(ea); EA+=PC; break;
+ case 0xed: IMMWORD(EAP); EA+=PC; break;
case 0xee: EA=0; break; /*ILLEGAL*/
- case 0xef: IMMWORD(ea); break;
+ case 0xef: IMMWORD(EAP); break;
case 0xf0: EA=S; S++; EAD=RM16(EAD); break;
case 0xf1: EA=S; S+=2; EAD=RM16(EAD); break;
@@ -1040,15 +1038,15 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
case 0xf6: EA=S+SIGNED(A); EAD=RM16(EAD); break;
case 0xf7: EA=0; break; /*ILLEGAL*/
case 0xf8: IMMBYTE(EA); EA=S+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xf9: IMMWORD(ea); EA+=S; EAD=RM16(EAD); break;
+ case 0xf9: IMMWORD(EAP); EA+=S; EAD=RM16(EAD); break;
case 0xfa: EA=0; break; /*ILLEGAL*/
case 0xfb: EA=S+D; EAD=RM16(EAD); break;
case 0xfc: IMMBYTE(EA); EA=PC+SIGNED(EA); EAD=RM16(EAD); break;
- case 0xfd: IMMWORD(ea); EA+=PC; EAD=RM16(EAD); break;
+ case 0xfd: IMMWORD(EAP); EA+=PC; EAD=RM16(EAD); break;
case 0xfe: EA=0; break; /*ILLEGAL*/
- case 0xff: IMMWORD(ea); EAD=RM16(EAD); break;
+ case 0xff: IMMWORD(EAP); EAD=RM16(EAD); break;
}
- m68_icount -= index_cycle_em[postbyte];
+ m68_state->icount -= index_cycle_em[postbyte];
}
@@ -1143,7 +1141,7 @@ CPU_GET_INFO( m6809 )
case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(m6809); break;
case CPUINFO_PTR_BURN: info->burn = NULL; break;
case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(m6809); break;
- case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68_icount; break;
+ case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m68_state->icount; break;
/* --- the following bits of info are returned as NULL-terminated strings --- */
case CPUINFO_STR_NAME: strcpy(info->s, "M6809"); break;