32x: sh2mame: critical bugfix (irqs on delay slot) + global cycle counter
authornotaz <notasas@gmail.com>
Wed, 30 Sep 2009 15:38:57 +0000 (15:38 +0000)
committernotaz <notasas@gmail.com>
Wed, 30 Sep 2009 15:38:57 +0000 (15:38 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@796 be3aeb3a-fb24-0410-a615-afba39da0efa

cpu/sh2mame/sh2.h
cpu/sh2mame/sh2pico.c

index b83a9c4..1fab412 100644 (file)
@@ -48,10 +48,10 @@ typedef struct
        void    (*irq_callback)(int id, int level);\r
        int     is_slave;\r
 \r
-       // XXX: unused, will we ever use?\r
-       int   internal_irq_level;\r
+       UINT32  cycles_aim;     // subtract sh2_icount to get global counter\r
 } SH2;\r
 \r
+SH2 *sh2; // active sh2\r
 extern int sh2_icount;\r
 \r
 void sh2_init(SH2 *sh2, int is_slave);\r
index 463261e..fb4bea6 100644 (file)
@@ -55,8 +55,6 @@ void sh2_reset(SH2 *sh2)
        sh2->pc = RL(0);
        sh2->r[15] = RL(4);
        sh2->sr = I;
-
-       sh2->internal_irq_level = -1;
 }
 
 /* Execute cycles - returns number of cycles actually run */
@@ -64,6 +62,7 @@ int sh2_execute(SH2 *sh2_, int cycles)
 {
        sh2 = sh2_;
        sh2_icount = cycles;
+       sh2->cycles_aim += cycles;
 
        do
        {
@@ -112,7 +111,7 @@ int sh2_execute(SH2 *sh2_, int cycles)
                }
                sh2_icount--;
        }
-       while (sh2_icount > 0);
+       while (sh2_icount > 0 || sh2->delay);   /* can't interrupt before delay */
 
        return cycles - sh2_icount;
 }