From 07ceafdb04502be69d06c3b54437fd4e8b88dfbe Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 12 Aug 2009 22:46:36 +0000 Subject: [PATCH] s68k-side Silpheed hack (needed for EU version) git-svn-id: file:///home/notaz/opt/svn/PicoDrive@748 be3aeb3a-fb24-0410-a615-afba39da0efa --- cpu/Cyclone/OpLogic.cpp | 5 +++++ cpu/Cyclone/OpMove.cpp | 4 ++-- pico/cd/memory.c | 9 ++++++--- pico/pico_int.h | 9 +++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cpu/Cyclone/OpLogic.cpp b/cpu/Cyclone/OpLogic.cpp index b3e14a9..d6b8933 100644 --- a/cpu/Cyclone/OpLogic.cpp +++ b/cpu/Cyclone/OpLogic.cpp @@ -119,6 +119,11 @@ int OpBtstImm(int op) if (type==3) ot(" orr r1,r0,r11 ;@ Set bit\n"); ot("\n"); 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); diff --git a/cpu/Cyclone/OpMove.cpp b/cpu/Cyclone/OpMove.cpp index be91b18..9c0bfa0 100644 --- a/cpu/Cyclone/OpMove.cpp +++ b/cpu/Cyclone/OpMove.cpp @@ -149,8 +149,8 @@ int OpMove(int op) } #if CYCLONE_FOR_GENESIS && !MEMHANDLERS_CHANGE_CYCLES - // this is a bit hacky - if ((tea==0x39||(tea>=0x10&&tea<0x30))&&size>=1) + // this is a bit hacky (device handlers might modify cycles) + if (tea==0x39||((0x10<=tea&&tea<0x30)&&size>=1)) ot(" ldr r5,[r7,#0x5c] ;@ Load Cycles\n"); #endif diff --git a/pico/cd/memory.c b/pico/cd/memory.c index 32c9515..4e56bf7 100644 --- a/pico/cd/memory.c +++ b/pico/cd/memory.c @@ -315,10 +315,13 @@ void s68k_reg_write8(u32 a, u32 d) wram_1M_to_2M(Pico_mcd->word_ram2M); PicoMemResetCD(d); } - else - d |= dold&1; // 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; } diff --git a/pico/pico_int.h b/pico/pico_int.h index 1c95c56..e5bbffd 100644 --- a/pico/pico_int.h +++ b/pico/pico_int.h @@ -42,6 +42,7 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k; #define SekCyclesLeftS68k \ ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles) #define SekEndTimeslice(after) PicoCpuCM68k.cycles=after +#define SekEndTimesliceS68k(after) PicoCpuCS68k.cycles=after #define SekPc (PicoCpuCM68k.pc-PicoCpuCM68k.membase) #define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase) #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 \ ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter) #define SekEndTimeslice(after) PicoCpuFM68k.io_cycle_counter=after +#define SekEndTimesliceS68k(after) PicoCpuFS68k.io_cycle_counter=after #define SekPc fm68k_get_pc(&PicoCpuFM68k) #define SekPcS68k fm68k_get_pc(&PicoCpuFS68k) #define SekSetStop(x) { \ @@ -95,6 +97,7 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k; #define SekCyclesLeftS68k \ ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles) #define SekEndTimeslice(after) SET_CYCLES(after) +#define SekEndTimesliceS68k(after) PicoCpuMS68k.cyc_remaining_cycles=after #define SekPc m68k_get_reg(&PicoCpuMM68k, M68K_REG_PC) #define SekPcS68k m68k_get_reg(&PicoCpuMS68k, M68K_REG_PC) #define SekSetStop(x) { \ @@ -137,6 +140,12 @@ extern unsigned int SekCycleCntT; // total cycle counter, updated once per frame SekEndTimeslice(after); \ } +#define SekEndRunS68k(after) { \ + SekCycleCntS68k -= SekCyclesLeftS68k - (after); \ + if (SekCycleCntS68k < 0) SekCycleCntS68k = 0; \ + SekEndTimesliceS68k(after); \ +} + extern int SekCycleCntS68k; extern int SekCycleAimS68k; -- 2.39.2