diff options
author | 2012-08-22 20:16:55 +0000 | |
---|---|---|
committer | 2012-08-22 20:16:55 +0000 | |
commit | 170b6ae5c2d63e941756f1a5fa6929ece92c0cfa (patch) | |
tree | d8bed45c78d6266d0b01e1a792a950273ad4ac82 /src/emu/cpu/g65816 | |
parent | 6f13297dcfde7e17d21403849bd104d78a43557e (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.c | 19 | ||||
-rw-r--r-- | src/emu/cpu/g65816/g65816cm.h | 3 | ||||
-rw-r--r-- | src/emu/cpu/g65816/g65816op.h | 5 |
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)); } |