From 2ea2cbfe8ba1607505f4fa7a4b4e9074c6337066 Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 30 Sep 2009 15:38:57 +0000 Subject: [PATCH] 32x: sh2mame: critical bugfix (irqs on delay slot) + global cycle counter git-svn-id: file:///home/notaz/opt/svn/PicoDrive@796 be3aeb3a-fb24-0410-a615-afba39da0efa --- cpu/sh2mame/sh2.h | 4 ++-- cpu/sh2mame/sh2pico.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cpu/sh2mame/sh2.h b/cpu/sh2mame/sh2.h index b83a9c4..1fab412 100644 --- a/cpu/sh2mame/sh2.h +++ b/cpu/sh2mame/sh2.h @@ -48,10 +48,10 @@ typedef struct void (*irq_callback)(int id, int level); int is_slave; - // XXX: unused, will we ever use? - int internal_irq_level; + UINT32 cycles_aim; // subtract sh2_icount to get global counter } SH2; +SH2 *sh2; // active sh2 extern int sh2_icount; void sh2_init(SH2 *sh2, int is_slave); diff --git a/cpu/sh2mame/sh2pico.c b/cpu/sh2mame/sh2pico.c index 463261e..fb4bea6 100644 --- a/cpu/sh2mame/sh2pico.c +++ b/cpu/sh2mame/sh2pico.c @@ -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; } -- 2.39.2