X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fsh2%2Fsh2.c;h=fbf0c6d374d8b0da7a83231b87fc00ad55ae8bc4;hb=6d7979571d08d7b020022fa169a34a29fc20dfdc;hp=d185b3fe0226e803f47529c6a988a1a926c30d28;hpb=00faec9cdbc073199fa984a0450e1a961994b058;p=picodrive.git diff --git a/cpu/sh2/sh2.c b/cpu/sh2/sh2.c index d185b3f..fbf0c6d 100644 --- a/cpu/sh2/sh2.c +++ b/cpu/sh2/sh2.c @@ -45,6 +45,8 @@ void sh2_reset(SH2 *sh2) void sh2_do_irq(SH2 *sh2, int level, int vector) { + sh2->sr &= 0x3f3; + sh2->r[15] -= 4; p32x_sh2_write32(sh2->r[15], sh2->sr, sh2); /* push SR onto stack */ sh2->r[15] -= 4; @@ -118,6 +120,7 @@ void sh2_unpack(SH2 *sh2, const unsigned char *buff) sh2->pending_int_irq = p[0]; sh2->pending_int_vector = p[1]; + sh2->test_irq = 1; } #ifdef DRC_CMP @@ -126,24 +129,50 @@ void sh2_unpack(SH2 *sh2, const unsigned char *buff) #include #include #include +#undef _USE_CZ80 // HACK +#include +#include static SH2 sh2ref[2]; -static int current_slave = -1; static unsigned int mem_val; static FILE *f; +enum ctl_byte { + CTL_MASTERSLAVE = 0x80, + CTL_EA = 0x82, + CTL_EAVAL = 0x83, + CTL_M68KPC = 0x84, + CTL_CYCLES = 0x85, +}; + #define SH2MAP_ADDR2OFFS_R(a) \ ((((a) >> 25) & 3) | (((a) >> 27) & 0x1c)) static unsigned int local_read32(SH2 *sh2, u32 a) { const sh2_memmap *sh2_map = sh2->read16_map; + u16 *pd; uptr p; sh2_map += SH2MAP_ADDR2OFFS_R(a); p = sh2_map->addr; if (!map_flag_set(p)) { - u16 *pd = (u16 *)((p << 1) + ((a & sh2_map->mask) & ~3)); + pd = (u16 *)((p << 1) + ((a & sh2_map->mask) & ~1)); + return (pd[0] << 16) | pd[1]; + } + + if ((a & 0xfffff000) == 0xc0000000) { + // data array + pd = (u16 *)Pico32xMem->data_array[sh2->is_slave] + + (a & 0xfff) / 2; + return (pd[0] << 16) | pd[1]; + } + if ((a & 0xdfffffc0) == 0x4000) { + pd = &Pico32x.regs[(a & 0x3f) / 2]; + return (pd[0] << 16) | pd[1]; + } + if ((a & 0xdffffe00) == 0x4200) { + pd = &Pico32xMem->pal[(a & 0x1ff) / 2]; return (pd[0] << 16) | pd[1]; } @@ -158,6 +187,8 @@ static void write_uint(unsigned char ctl, unsigned int v) void do_sh2_trace(SH2 *current, int cycles) { + static int current_slave = -1; + static u32 current_m68k_pc; SH2 *sh2o = &sh2ref[current->is_slave]; u32 *regs_a = (void *)current; u32 *regs_o = (void *)sh2o; @@ -168,9 +199,14 @@ void do_sh2_trace(SH2 *current, int cycles) if (f == NULL) f = fopen("tracelog", "wb"); + if (SekPc != current_m68k_pc) { + current_m68k_pc = SekPc; + write_uint(CTL_M68KPC, current_m68k_pc); + } + if (current->is_slave != current_slave) { current_slave = current->is_slave; - v = 0x80 | current->is_slave; + v = CTL_MASTERSLAVE | current->is_slave; fwrite(&v, 1, 1, f); } @@ -184,15 +220,15 @@ void do_sh2_trace(SH2 *current, int cycles) } if (current->ea != sh2o->ea) { - write_uint(0x82, current->ea); + write_uint(CTL_EA, current->ea); sh2o->ea = current->ea; } val = local_read32(current, current->ea); if (mem_val != val) { - write_uint(0x83, val); + write_uint(CTL_EAVAL, val); mem_val = val; } - write_uint(0x84, cycles); + write_uint(CTL_CYCLES, cycles); } static const char *regnames[] = { @@ -204,6 +240,19 @@ static const char *regnames[] = { "gbr", "vbr", "mach","macl", }; +static void dump_regs(SH2 *sh2) +{ + char csh2; + int i; + + csh2 = sh2->is_slave ? 's' : 'm'; + for (i = 0; i < 16/2; i++) + printf("%csh2 r%d: %08x r%02d: %08x\n", csh2, + i, sh2->r[i], i+8, sh2->r[i+8]); + printf("%csh2 PC: %08x , %08x\n", csh2, sh2->pc, sh2->ppc); + printf("%csh2 SR: %03x PR: %08x\n", csh2, sh2->sr, sh2->pr); +} + void do_sh2_cmp(SH2 *current) { static int current_slave; @@ -217,31 +266,39 @@ void do_sh2_cmp(SH2 *current) int bad = 0; int cycles; int i, ret; - char csh2; - if (f == NULL) + if (f == NULL) { f = fopen("tracelog", "rb"); + sh2ref[1].is_slave = 1; + } while (1) { ret = fread(&code, 1, 1, f); if (ret <= 0) break; - if (code == 0x84) { + if (code == CTL_CYCLES) { fread(&cycles_o, 1, 4, f); break; } switch (code) { - case 0x80: - case 0x81: + case CTL_MASTERSLAVE: + case CTL_MASTERSLAVE + 1: current_slave = code & 1; break; - case 0x82: + case CTL_EA: fread(&sh2o->ea, 4, 1, f); break; - case 0x83: + case CTL_EAVAL: fread(¤t_val, 4, 1, f); break; + case CTL_M68KPC: + fread(&val, 4, 1, f); + if (SekPc != val) { + printf("m68k: %08x %08x\n", SekPc, val); + bad = 1; + } + break; default: if (code < offsetof(SH2, read8_map) / 4) fread(regs_o + code, 4, 1, f); @@ -300,12 +357,10 @@ void do_sh2_cmp(SH2 *current) end: printf("--\n"); - csh2 = current->is_slave ? 's' : 'm'; - for (i = 0; i < 16/2; i++) - printf("%csh2 r%d: %08x r%02d: %08x\n", csh2, - i, sh2o->r[i], i+8, sh2o->r[i+8]); - printf("%csh2 PC: %08x , %08x\n", csh2, sh2o->pc, sh2o->ppc); - printf("%csh2 SR: %03x PR: %08x\n", csh2, sh2o->sr, sh2o->pr); + dump_regs(sh2o); + if (current->is_slave != current_slave) + dump_regs(&sh2ref[current->is_slave ^ 1]); + PDebugDumpMem(); exit(1); }