pandora: fix readme and pxml version
[picodrive.git] / cpu / sh2 / sh2.c
index 7b83cf2..0229a1f 100644 (file)
 int sh2_init(SH2 *sh2, int is_slave, SH2 *other_sh2)
 {
        int ret = 0;
+       unsigned int mult_m68k_to_sh2 = sh2->mult_m68k_to_sh2;
+       unsigned int mult_sh2_to_m68k = sh2->mult_sh2_to_m68k;
 
-       memset(sh2, 0, offsetof(SH2, mult_m68k_to_sh2));
+       memset(sh2, 0, sizeof(*sh2));
        sh2->is_slave = is_slave;
        sh2->other_sh2 = other_sh2;
+       sh2->mult_m68k_to_sh2 = mult_m68k_to_sh2;
+       sh2->mult_sh2_to_m68k = mult_sh2_to_m68k;
+
        pdb_register_cpu(sh2, PDBCT_SH2, is_slave ? "ssh2" : "msh2");
 #ifdef DRC_SH2
        ret = sh2_drc_init(sh2);
@@ -79,7 +84,7 @@ int sh2_irl_irq(SH2 *sh2, int level, int nested_call)
                        // do this to avoid missing irqs that other SH2 might clear
                        int vector = sh2->irq_callback(sh2, level);
                        sh2_do_irq(sh2, level, vector);
-                       sh2->m68krcycles_done += C_SH2_TO_M68K(*sh2, 13);
+                       sh2->m68krcycles_done += C_SH2_TO_M68K(sh2, 13);
                }
                else
                        sh2->test_irq = 1;
@@ -110,6 +115,7 @@ void sh2_pack(const SH2 *sh2, unsigned char *buff)
 
        p[0] = sh2->pending_int_irq;
        p[1] = sh2->pending_int_vector;
+       p[2] = sh2->m68krcycles_done;
 }
 
 void sh2_unpack(SH2 *sh2, const unsigned char *buff)
@@ -122,6 +128,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;
+       sh2->m68krcycles_done = p[2];
 }
 
 #ifdef DRC_CMP
@@ -232,7 +239,7 @@ static void dump_regs(SH2 *sh2)
        printf("%csh2 SR:      %03x  PR: %08x\n", csh2, sh2->sr, sh2->pr);
 }
 
-void do_sh2_cmp(SH2 *current)
+void REGPARM(1) do_sh2_cmp(SH2 *current)
 {
        static int current_slave;
        static u32 current_val;
@@ -246,6 +253,13 @@ void do_sh2_cmp(SH2 *current)
        int cycles;
        int i, ret;
 
+#if 0
+       sr = current->sr;
+       current->sr &= 0x3f3;
+       do_sh2_trace(current, (signed int)sr >> 12);
+       current->sr = sr;
+       return;
+#endif
        sh2ref[1].is_slave = 1;
 
        while (1) {