X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fsek.c;h=fe381f29ee741977c832b874afdc5d96986b19b5;hb=697746df021a83dcb556afdb36abc6977780985c;hp=f085f6129a1896f74cc6224e22ea14a67e4e6569;hpb=1cfc5cc4ce06642b9bc45ca3b9d32793718e9455;p=picodrive.git diff --git a/pico/sek.c b/pico/sek.c index f085f61..fe381f2 100644 --- a/pico/sek.c +++ b/pico/sek.c @@ -8,6 +8,7 @@ #include "pico_int.h" +#include "memory.h" int SekCycleCnt=0; // cycles done in this frame @@ -138,13 +139,7 @@ PICO_INTERNAL int SekReset(void) if (Pico.rom==NULL) return 1; #ifdef EMU_C68K - PicoCpuCM68k.state_flags=0; - PicoCpuCM68k.osp=0; - PicoCpuCM68k.srh =0x27; // Supervisor mode - PicoCpuCM68k.irq=0; - PicoCpuCM68k.a[7]=PicoCpuCM68k.read32(0); // Stack Pointer - PicoCpuCM68k.membase=0; - PicoCpuCM68k.pc=PicoCpuCM68k.checkpc(PicoCpuCM68k.read32(4)); // Program Counter + CycloneReset(&PicoCpuCM68k); #endif #ifdef EMU_M68K m68k_set_context(&PicoCpuMM68k); // if we ever reset m68k, we always need it's context to be set @@ -195,7 +190,7 @@ PICO_INTERNAL void SekSetRealTAS(int use_real) #include "cpu/Cyclone/tools/idle.h" #endif -static int *idledet_addrs = NULL; +static unsigned short **idledet_ptrs = NULL; static int idledet_count = 0, idledet_bads = 0; int idledet_start_frame = 0; @@ -220,13 +215,13 @@ void SekRegisterIdleHit(unsigned int pc) void SekInitIdleDet(void) { - void *tmp = realloc(idledet_addrs, 0x200*4); + unsigned short **tmp = realloc(idledet_ptrs, 0x200*4); if (tmp == NULL) { - free(idledet_addrs); - idledet_addrs = NULL; + free(idledet_ptrs); + idledet_ptrs = NULL; } else - idledet_addrs = tmp; + idledet_ptrs = tmp; idledet_count = idledet_bads = 0; idledet_start_frame = Pico.m.frame_count + 360; #ifdef IDLE_STATS @@ -290,6 +285,9 @@ int SekIsIdleCode(unsigned short *dst, int bytes) int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx) { int is_main68k = 1; + u16 *target; + uptr v; + #if defined(EMU_C68K) struct Cyclone *cyc = ctx; is_main68k = cyc == &PicoCpuCM68k; @@ -301,19 +299,24 @@ int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx) elprintf(EL_IDLE, "idle: patch %06x %04x %04x %c %c #%i", pc, oldop, newop, (newop&0x200)?'n':'y', is_main68k?'m':'s', idledet_count); - if (pc > Pico.romsize && !(PicoAHW & PAHW_SVP)) { - if (++idledet_bads > 128) return 2; // remove detector + // XXX: probably shouldn't patch RAM too + v = m68k_read16_map[pc >> M68K_MEM_SHIFT]; + if (!(v & 0x80000000)) + target = (u16 *)((v << 1) + pc); + else { + if (++idledet_bads > 128) + return 2; // remove detector return 1; // don't patch } if (idledet_count >= 0x200 && (idledet_count & 0x1ff) == 0) { - void *tmp = realloc(idledet_addrs, (idledet_count+0x200)*4); - if (tmp == NULL) return 1; - idledet_addrs = tmp; + unsigned short **tmp = realloc(idledet_ptrs, (idledet_count+0x200)*4); + if (tmp == NULL) + return 1; + idledet_ptrs = tmp; } - if (pc < Pico.romsize) - idledet_addrs[idledet_count++] = pc; + idledet_ptrs[idledet_count++] = target; return 0; } @@ -328,7 +331,7 @@ void SekFinishIdleDet(void) #endif while (idledet_count > 0) { - unsigned short *op = (unsigned short *)&Pico.rom[idledet_addrs[--idledet_count]]; + unsigned short *op = idledet_ptrs[--idledet_count]; if ((*op & 0xfd00) == 0x7100) *op &= 0xff, *op |= 0x6600; else if ((*op & 0xfd00) == 0x7500)