s68k-side Silpheed hack (needed for EU version)

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@748 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2009-08-12 22:46:36 +00:00
parent ef090115c8
commit 07ceafdb04
4 changed files with 22 additions and 5 deletions

View file

@ -119,6 +119,11 @@ int OpBtstImm(int op)
if (type==3) ot(" orr r1,r0,r11 ;@ Set bit\n"); if (type==3) ot(" orr r1,r0,r11 ;@ Set bit\n");
ot("\n"); ot("\n");
EaWrite(8, 1,tea,size,0x003f,0,0); EaWrite(8, 1,tea,size,0x003f,0,0);
#if CYCLONE_FOR_GENESIS && !MEMHANDLERS_CHANGE_CYCLES
// this is a bit hacky (device handlers might modify cycles)
if (tea==0x38||tea==0x39)
ot(" ldr r5,[r7,#0x5c] ;@ Load Cycles\n");
#endif
} }
OpEnd(sea,tea); OpEnd(sea,tea);

View file

@ -149,8 +149,8 @@ int OpMove(int op)
} }
#if CYCLONE_FOR_GENESIS && !MEMHANDLERS_CHANGE_CYCLES #if CYCLONE_FOR_GENESIS && !MEMHANDLERS_CHANGE_CYCLES
// this is a bit hacky // this is a bit hacky (device handlers might modify cycles)
if ((tea==0x39||(tea>=0x10&&tea<0x30))&&size>=1) if (tea==0x39||((0x10<=tea&&tea<0x30)&&size>=1))
ot(" ldr r5,[r7,#0x5c] ;@ Load Cycles\n"); ot(" ldr r5,[r7,#0x5c] ;@ Load Cycles\n");
#endif #endif

View file

@ -315,10 +315,13 @@ void s68k_reg_write8(u32 a, u32 d)
wram_1M_to_2M(Pico_mcd->word_ram2M); wram_1M_to_2M(Pico_mcd->word_ram2M);
PicoMemResetCD(d); PicoMemResetCD(d);
} }
else
d |= dold&1;
// s68k can only set RET, writing 0 has no effect // s68k can only set RET, writing 0 has no effect
if (d&1) d &= ~2; // return word RAM to m68k in 2M mode else if ((dold ^ d) & d & 1) { // RET being set
SekEndRunS68k(20+16+10+12+16); // see DMNA case
} else
d |= dold & 1;
if (d & 1)
d &= ~2; // DMNA clears
} }
break; break;
} }

View file

@ -42,6 +42,7 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;
#define SekCyclesLeftS68k \ #define SekCyclesLeftS68k \
((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles) ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles)
#define SekEndTimeslice(after) PicoCpuCM68k.cycles=after #define SekEndTimeslice(after) PicoCpuCM68k.cycles=after
#define SekEndTimesliceS68k(after) PicoCpuCS68k.cycles=after
#define SekPc (PicoCpuCM68k.pc-PicoCpuCM68k.membase) #define SekPc (PicoCpuCM68k.pc-PicoCpuCM68k.membase)
#define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase) #define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase)
#define SekSetStop(x) { PicoCpuCM68k.state_flags&=~1; if (x) { PicoCpuCM68k.state_flags|=1; PicoCpuCM68k.cycles=0; } } #define SekSetStop(x) { PicoCpuCM68k.state_flags&=~1; if (x) { PicoCpuCM68k.state_flags|=1; PicoCpuCM68k.cycles=0; } }
@ -65,6 +66,7 @@ extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;
#define SekCyclesLeftS68k \ #define SekCyclesLeftS68k \
((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter) ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter)
#define SekEndTimeslice(after) PicoCpuFM68k.io_cycle_counter=after #define SekEndTimeslice(after) PicoCpuFM68k.io_cycle_counter=after
#define SekEndTimesliceS68k(after) PicoCpuFS68k.io_cycle_counter=after
#define SekPc fm68k_get_pc(&PicoCpuFM68k) #define SekPc fm68k_get_pc(&PicoCpuFM68k)
#define SekPcS68k fm68k_get_pc(&PicoCpuFS68k) #define SekPcS68k fm68k_get_pc(&PicoCpuFS68k)
#define SekSetStop(x) { \ #define SekSetStop(x) { \
@ -95,6 +97,7 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
#define SekCyclesLeftS68k \ #define SekCyclesLeftS68k \
((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles) ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles)
#define SekEndTimeslice(after) SET_CYCLES(after) #define SekEndTimeslice(after) SET_CYCLES(after)
#define SekEndTimesliceS68k(after) PicoCpuMS68k.cyc_remaining_cycles=after
#define SekPc m68k_get_reg(&PicoCpuMM68k, M68K_REG_PC) #define SekPc m68k_get_reg(&PicoCpuMM68k, M68K_REG_PC)
#define SekPcS68k m68k_get_reg(&PicoCpuMS68k, M68K_REG_PC) #define SekPcS68k m68k_get_reg(&PicoCpuMS68k, M68K_REG_PC)
#define SekSetStop(x) { \ #define SekSetStop(x) { \
@ -137,6 +140,12 @@ extern unsigned int SekCycleCntT; // total cycle counter, updated once per frame
SekEndTimeslice(after); \ SekEndTimeslice(after); \
} }
#define SekEndRunS68k(after) { \
SekCycleCntS68k -= SekCyclesLeftS68k - (after); \
if (SekCycleCntS68k < 0) SekCycleCntS68k = 0; \
SekEndTimesliceS68k(after); \
}
extern int SekCycleCntS68k; extern int SekCycleCntS68k;
extern int SekCycleAimS68k; extern int SekCycleAimS68k;