summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/g65816
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2012-08-22 20:16:55 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2012-08-22 20:16:55 +0000
commit170b6ae5c2d63e941756f1a5fa6929ece92c0cfa (patch)
treed8bed45c78d6266d0b01e1a792a950273ad4ac82 /src/emu/cpu/g65816
parent6f13297dcfde7e17d21403849bd104d78a43557e (diff)
(SNES) Rewritten cycle steal code from scratch and nailed it directly in the G65816 CPU core [Angelo Salese, byuu]
Diffstat (limited to 'src/emu/cpu/g65816')
-rw-r--r--src/emu/cpu/g65816/g65816.c19
-rw-r--r--src/emu/cpu/g65816/g65816cm.h3
-rw-r--r--src/emu/cpu/g65816/g65816op.h5
3 files changed, 27 insertions, 0 deletions
diff --git a/src/emu/cpu/g65816/g65816.c b/src/emu/cpu/g65816/g65816.c
index 1f71db8c116..d08f28e545a 100644
--- a/src/emu/cpu/g65816/g65816.c
+++ b/src/emu/cpu/g65816/g65816.c
@@ -143,6 +143,9 @@ extern void g65816i_set_reg_E(g65816i_cpu_struct *cpustate, int regnum, uint val
extern void g65816i_set_line_E(g65816i_cpu_struct *cpustate, int line, int state);
extern int g65816i_execute_E(g65816i_cpu_struct *cpustate, int cycles);
+extern int bus_5A22_cycle_burst(g65816i_cpu_struct *cpustate, uint addr);
+
+
void (*const *const g65816i_opcodes[5])(g65816i_cpu_struct *cpustate) =
{
g65816i_opcodes_M0X0,
@@ -525,6 +528,22 @@ CPU_GET_INFO( g65816 )
SNES specific, used to handle master cycles
*/
+int bus_5A22_cycle_burst(g65816i_cpu_struct *cpustate, uint addr)
+{
+ if(cpustate->cpu_type == CPU_TYPE_G65816)
+ return 0;
+
+ if(addr & 0x408000) {
+ if(addr & 0x800000) return (1) ? 6 : 8; // TODO: fastROM setting
+ return 8;
+ }
+ if((addr + 0x6000) & 0x4000) return 8;
+ if((addr - 0x4000) & 0x7e00) return 6;
+
+ return 12;
+}
+
+
static CPU_INIT( 5a22 )
{
g65816i_cpu_struct *cpustate = get_safe_token(device);
diff --git a/src/emu/cpu/g65816/g65816cm.h b/src/emu/cpu/g65816/g65816cm.h
index c9e371046c2..46035817e04 100644
--- a/src/emu/cpu/g65816/g65816cm.h
+++ b/src/emu/cpu/g65816/g65816cm.h
@@ -103,6 +103,7 @@ struct _g65816i_cpu_struct
void (*set_reg)(g65816i_cpu_struct *cpustate, int regnum, uint val);
void (*set_line)(g65816i_cpu_struct *cpustate, int line, int state);
int (*execute)(g65816i_cpu_struct *cpustate, int cycles);
+ int bus_5A22_cycle_burst(g65816i_cpu_struct *cpustate, uint addr);
uint source;
uint destination;
int ICount;
@@ -114,6 +115,7 @@ extern uint (*const g65816i_get_reg[])(g65816i_cpu_struct *cpustate, int regnum)
extern void (*const g65816i_set_reg[])(g65816i_cpu_struct *cpustate, int regnum, uint val);
extern void (*const g65816i_set_line[])(g65816i_cpu_struct *cpustate, int line, int state);
extern int (*const g65816i_execute[])(g65816i_cpu_struct *cpustate, int cycles);
+extern int bus_5A22_cycle_burst(g65816i_cpu_struct *cpustate, uint addr);
#define REGISTER_A cpustate->a /* Accumulator */
#define REGISTER_B cpustate->b /* Accumulator hi byte */
@@ -244,6 +246,7 @@ INLINE void g65816i_set_execution_mode(g65816i_cpu_struct *cpustate, uint mode)
#define CLK_W_SIY 5
#define CLK(A) CLOCKS -= (cpustate->cpu_type == CPU_TYPE_G65816 ? A : A*6)
+#define CLK_BUS(A) CLOCKS -= A
#define USE_ALL_CLKS() CLOCKS = 0
diff --git a/src/emu/cpu/g65816/g65816op.h b/src/emu/cpu/g65816/g65816op.h
index 9495214205f..fb5c70ab238 100644
--- a/src/emu/cpu/g65816/g65816op.h
+++ b/src/emu/cpu/g65816/g65816op.h
@@ -59,12 +59,14 @@
INLINE uint g65816i_read_8_normal(g65816i_cpu_struct *cpustate, uint address)
{
address = ADDRESS_65816(address);
+ CLOCKS -= (bus_5A22_cycle_burst(cpustate,address));
return g65816_read_8(address);
}
INLINE uint g65816i_read_8_immediate(g65816i_cpu_struct *cpustate, uint address)
{
address = ADDRESS_65816(address);
+ CLOCKS -= (bus_5A22_cycle_burst(cpustate,address));
return g65816_read_8_immediate(address);
}
@@ -76,6 +78,7 @@ INLINE uint g65816i_read_8_direct(g65816i_cpu_struct *cpustate, uint address)
#else
address = ADDRESS_65816(address);
#endif
+ CLOCKS -= (bus_5A22_cycle_burst(cpustate,address));
return g65816_read_8(address);
}
@@ -90,6 +93,7 @@ INLINE uint g65816i_read_8_vector(g65816i_cpu_struct *cpustate, uint address)
INLINE void g65816i_write_8_normal(g65816i_cpu_struct *cpustate, uint address, uint value)
{
address = ADDRESS_65816(address);
+ CLOCKS -= (bus_5A22_cycle_burst(cpustate,address));
g65816_write_8(address, MAKE_UINT_8(value));
}
@@ -101,6 +105,7 @@ INLINE void g65816i_write_8_direct(g65816i_cpu_struct *cpustate, uint address, u
#else
address = ADDRESS_65816(address);
#endif
+ CLOCKS -= (bus_5A22_cycle_burst(cpustate,address));
g65816_write_8(address, MAKE_UINT_8(value));
}