5 * This work is licensed under the terms of MAME license.
6 * See COPYING file in the top-level directory.
17 int sh2_init(SH2 *sh2, int is_slave)
21 memset(sh2, 0, offsetof(SH2, mult_m68k_to_sh2));
22 sh2->is_slave = is_slave;
23 pdb_register_cpu(sh2, PDBCT_SH2, is_slave ? "ssh2" : "msh2");
25 ret = sh2_drc_init(sh2);
30 void sh2_finish(SH2 *sh2)
37 void sh2_reset(SH2 *sh2)
39 sh2->pc = p32x_sh2_read32(0, sh2);
40 sh2->r[15] = p32x_sh2_read32(4, sh2);
43 sh2->pending_int_irq = 0;
46 void sh2_do_irq(SH2 *sh2, int level, int vector)
51 p32x_sh2_write32(sh2->r[15], sh2->sr, sh2); /* push SR onto stack */
53 p32x_sh2_write32(sh2->r[15], sh2->pc, sh2); /* push PC onto stack */
55 /* set I flags in SR */
56 sh2->sr = (sh2->sr & ~I) | (level << 4);
59 sh2->pc = p32x_sh2_read32(sh2->vbr + vector * 4, sh2);
61 /* 13 cycles at best */
65 int sh2_irl_irq(SH2 *sh2, int level, int nested_call)
69 sh2->pending_irl = level;
70 if (level < sh2->pending_int_irq)
71 level = sh2->pending_int_irq;
72 sh2->pending_level = level;
74 taken = (level > ((sh2->sr >> 4) & 0x0f));
77 // not in memhandler, so handle this now (recompiler friendly)
78 // do this to avoid missing irqs that other SH2 might clear
79 int vector = sh2->irq_callback(sh2, level);
80 sh2_do_irq(sh2, level, vector);
81 sh2->m68krcycles_done += C_SH2_TO_M68K(*sh2, 13);
89 void sh2_internal_irq(SH2 *sh2, int level, int vector)
91 // FIXME: multiple internal irqs not handled..
92 // assuming internal irqs never clear until accepted
93 sh2->pending_int_irq = level;
94 sh2->pending_int_vector = vector;
95 if (level > sh2->pending_level)
96 sh2->pending_level = level;
101 #define SH2_REG_SIZE (offsetof(SH2, macl) + sizeof(sh2->macl))
103 void sh2_pack(const SH2 *sh2, unsigned char *buff)
107 memcpy(buff, sh2, SH2_REG_SIZE);
108 p = (void *)(buff + SH2_REG_SIZE);
110 p[0] = sh2->pending_int_irq;
111 p[1] = sh2->pending_int_vector;
114 void sh2_unpack(SH2 *sh2, const unsigned char *buff)
118 memcpy(sh2, buff, SH2_REG_SIZE);
119 p = (void *)(buff + SH2_REG_SIZE);
121 sh2->pending_int_irq = p[0];
122 sh2->pending_int_vector = p[1];
131 #include <pico/memory.h>
132 #include <pico/debug.h>
134 static SH2 sh2ref[2];
135 static int current_slave = -1;
136 static unsigned int mem_val;
139 #define SH2MAP_ADDR2OFFS_R(a) \
140 ((((a) >> 25) & 3) | (((a) >> 27) & 0x1c))
142 static unsigned int local_read32(SH2 *sh2, u32 a)
144 const sh2_memmap *sh2_map = sh2->read16_map;
147 sh2_map += SH2MAP_ADDR2OFFS_R(a);
149 if (!map_flag_set(p)) {
150 u16 *pd = (u16 *)((p << 1) + ((a & sh2_map->mask) & ~3));
151 return (pd[0] << 16) | pd[1];
157 static void write_uint(unsigned char ctl, unsigned int v)
159 fwrite(&ctl, 1, 1, f);
160 fwrite(&v, sizeof(v), 1, f);
163 void do_sh2_trace(SH2 *current, int cycles)
165 SH2 *sh2o = &sh2ref[current->is_slave];
166 u32 *regs_a = (void *)current;
167 u32 *regs_o = (void *)sh2o;
173 f = fopen("tracelog", "wb");
175 if (current->is_slave != current_slave) {
176 current_slave = current->is_slave;
177 v = 0x80 | current->is_slave;
181 for (i = 0; i < offsetof(SH2, read8_map) / 4; i++) {
184 if (regs_a[i] != regs_o[i]) {
185 write_uint(i, regs_a[i]);
186 regs_o[i] = regs_a[i];
190 if (current->ea != sh2o->ea) {
191 write_uint(0x82, current->ea);
192 sh2o->ea = current->ea;
194 val = local_read32(current, current->ea);
195 if (mem_val != val) {
196 write_uint(0x83, val);
199 write_uint(0x84, cycles);
202 static const char *regnames[] = {
203 "r0", "r1", "r2", "r3",
204 "r4", "r5", "r6", "r7",
205 "r8", "r9", "r10", "r11",
206 "r12", "r13", "r14", "r15",
207 "pc", "ppc", "pr", "sr",
208 "gbr", "vbr", "mach","macl",
211 void do_sh2_cmp(SH2 *current)
213 static int current_slave;
214 static u32 current_val;
215 SH2 *sh2o = &sh2ref[current->is_slave];
216 u32 *regs_a = (void *)current;
217 u32 *regs_o = (void *)sh2o;
227 f = fopen("tracelog", "rb");
230 ret = fread(&code, 1, 1, f);
234 fread(&cycles_o, 1, 4, f);
241 current_slave = code & 1;
244 fread(&sh2o->ea, 4, 1, f);
247 fread(¤t_val, 4, 1, f);
250 if (code < offsetof(SH2, read8_map) / 4)
251 fread(regs_o + code, 4, 1, f);
253 printf("invalid code: %02x\n", code);
265 if (current->is_slave != current_slave) {
266 printf("bad slave: %d %d\n", current->is_slave,
271 for (i = 0; i < offsetof(SH2, read8_map) / 4; i++) {
272 if (i == 17 || i == 19) // ppc, sr
274 if (regs_a[i] != regs_o[i]) {
275 printf("bad %4s: %08x %08x\n",
276 regnames[i], regs_a[i], regs_o[i]);
281 sr = current->sr & 0x3f3;
282 cycles = (signed int)current->sr >> 12;
284 if (sr != sh2o->sr) {
285 printf("bad SR: %03x %03x\n", sr, sh2o->sr);
289 if (cycles != cycles_o) {
290 printf("bad cycles: %d %d\n", cycles, cycles_o);
294 val = local_read32(current, sh2o->ea);
295 if (val != current_val) {
296 printf("bad val @%08x: %08x %08x\n", sh2o->ea, val, current_val);
301 sh2o->ppc = current->pc;
307 csh2 = current->is_slave ? 's' : 'm';
308 for (i = 0; i < 16/2; i++)
309 printf("%csh2 r%d: %08x r%02d: %08x\n", csh2,
310 i, sh2o->r[i], i+8, sh2o->r[i+8]);
311 printf("%csh2 PC: %08x , %08x\n", csh2, sh2o->pc, sh2o->ppc);
312 printf("%csh2 SR: %03x PR: %08x\n", csh2, sh2o->sr, sh2o->pr);