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)
49 p32x_sh2_write32(sh2->r[15], sh2->sr, sh2); /* push SR onto stack */
51 p32x_sh2_write32(sh2->r[15], sh2->pc, sh2); /* push PC onto stack */
53 /* set I flags in SR */
54 sh2->sr = (sh2->sr & ~I) | (level << 4);
57 sh2->pc = p32x_sh2_read32(sh2->vbr + vector * 4, sh2);
59 /* 13 cycles at best */
63 int sh2_irl_irq(SH2 *sh2, int level, int nested_call)
67 sh2->pending_irl = level;
68 if (level < sh2->pending_int_irq)
69 level = sh2->pending_int_irq;
70 sh2->pending_level = level;
72 taken = (level > ((sh2->sr >> 4) & 0x0f));
75 // not in memhandler, so handle this now (recompiler friendly)
76 // do this to avoid missing irqs that other SH2 might clear
77 int vector = sh2->irq_callback(sh2, level);
78 sh2_do_irq(sh2, level, vector);
79 sh2->m68krcycles_done += C_SH2_TO_M68K(*sh2, 13);
87 void sh2_internal_irq(SH2 *sh2, int level, int vector)
89 // FIXME: multiple internal irqs not handled..
90 // assuming internal irqs never clear until accepted
91 sh2->pending_int_irq = level;
92 sh2->pending_int_vector = vector;
93 if (level > sh2->pending_level)
94 sh2->pending_level = level;
99 #define SH2_REG_SIZE (offsetof(SH2, macl) + sizeof(sh2->macl))
101 void sh2_pack(const SH2 *sh2, unsigned char *buff)
105 memcpy(buff, sh2, SH2_REG_SIZE);
106 p = (void *)(buff + SH2_REG_SIZE);
108 p[0] = sh2->pending_int_irq;
109 p[1] = sh2->pending_int_vector;
112 void sh2_unpack(SH2 *sh2, const unsigned char *buff)
116 memcpy(sh2, buff, SH2_REG_SIZE);
117 p = (void *)(buff + SH2_REG_SIZE);
119 sh2->pending_int_irq = p[0];
120 sh2->pending_int_vector = p[1];
128 #include <pico/memory.h>
130 static SH2 sh2ref[2];
131 static int current_slave = -1;
132 static unsigned int mem_val;
135 #define SH2MAP_ADDR2OFFS_R(a) \
136 ((((a) >> 25) & 3) | (((a) >> 27) & 0x1c))
138 static unsigned int local_read32(SH2 *sh2, u32 a)
140 const sh2_memmap *sh2_map = sh2->read16_map;
143 sh2_map += SH2MAP_ADDR2OFFS_R(a);
145 if (!map_flag_set(p)) {
146 u16 *pd = (u16 *)((p << 1) + ((a & sh2_map->mask) & ~3));
147 return (pd[0] << 16) | pd[1];
153 static void write_uint(unsigned char ctl, unsigned int v)
155 fwrite(&ctl, 1, 1, f);
156 fwrite(&v, sizeof(v), 1, f);
159 void do_sh2_trace(SH2 *current, int cycles)
161 SH2 *sh2o = &sh2ref[current->is_slave];
162 u32 *regs_a = (void *)current;
163 u32 *regs_o = (void *)sh2o;
169 f = fopen("tracelog", "wb");
171 if (current->is_slave != current_slave) {
172 current_slave = current->is_slave;
173 v = 0x80 | current->is_slave;
177 for (i = 0; i < offsetof(SH2, read8_map) / 4; i++) {
180 if (regs_a[i] != regs_o[i]) {
181 write_uint(i, regs_a[i]);
182 regs_o[i] = regs_a[i];
186 if (current->ea != sh2o->ea) {
187 write_uint(0x82, current->ea);
188 sh2o->ea = current->ea;
190 val = local_read32(current, current->ea);
191 if (mem_val != val) {
192 write_uint(0x83, val);
195 write_uint(0x84, cycles);
198 static const char *regnames[] = {
199 "r0", "r1", "r2", "r3",
200 "r4", "r5", "r6", "r7",
201 "r8", "r9", "r10", "r11",
202 "r12", "r13", "r14", "r15",
203 "pc", "ppc", "pr", "sr",
204 "gbr", "vbr", "mach","macl",
207 void do_sh2_cmp(SH2 *current)
209 static int current_slave;
210 static u32 current_val;
211 SH2 *sh2o = &sh2ref[current->is_slave];
212 u32 *regs_a = (void *)current;
213 u32 *regs_o = (void *)sh2o;
223 f = fopen("tracelog", "rb");
226 ret = fread(&code, 1, 1, f);
230 fread(&cycles_o, 1, 4, f);
237 current_slave = code & 1;
240 fread(&sh2o->ea, 4, 1, f);
243 fread(¤t_val, 4, 1, f);
246 if (code < offsetof(SH2, read8_map) / 4)
247 fread(regs_o + code, 4, 1, f);
249 printf("invalid code: %02x\n", code);
261 if (current->is_slave != current_slave) {
262 printf("bad slave: %d %d\n", current->is_slave,
267 for (i = 0; i < offsetof(SH2, read8_map) / 4; i++) {
268 if (i == 17 || i == 19) // ppc, sr
270 if (regs_a[i] != regs_o[i]) {
271 printf("bad %4s: %08x %08x\n",
272 regnames[i], regs_a[i], regs_o[i]);
277 sr = current->sr & 0x3f3;
278 cycles = (signed int)current->sr >> 12;
280 if (sr != sh2o->sr) {
281 printf("bad SR: %03x %03x\n", sr, sh2o->sr);
285 if (cycles != cycles_o) {
286 printf("bad cycles: %d %d\n", cycles, cycles_o);
290 val = local_read32(current, sh2o->ea);
291 if (val != current_val) {
292 printf("bad val @%08x: %08x %08x\n", sh2o->ea, val, current_val);
297 sh2o->ppc = current->pc;
303 csh2 = current->is_slave ? 's' : 'm';
304 for (i = 0; i < 16/2; i++)
305 printf("%csh2 r%d: %08x r%02d: %08x\n", csh2,
306 i, sh2o->r[i], i+8, sh2o->r[i+8]);
307 printf("%csh2 PC: %08x , %08x\n", csh2, sh2o->pc, sh2o->ppc);
308 printf("%csh2 SR: %03x PR: %08x\n", csh2, sh2o->sr, sh2o->pr);