sh2, fix for interpreter crash if drc is compiled in too
authorkub <derkub@gmail.com>
Thu, 9 Jul 2020 06:40:35 +0000 (08:40 +0200)
committerkub <derkub@gmail.com>
Thu, 9 Jul 2020 06:40:35 +0000 (08:40 +0200)
cpu/sh2/compiler.c
cpu/sh2/compiler.h
cpu/sh2/sh2.h

index c894043..085a617 100644 (file)
@@ -5392,7 +5392,10 @@ int sh2_execute_drc(SH2 *sh2c, int cycles)
   // others are usual SH2 flags
   sh2c->sr &= 0x3f3;
   sh2c->sr |= cycles << 12;
+
+  sh2c->state |= SH2_IN_DRC;
   sh2_drc_entry(sh2c);
+  sh2c->state &= ~SH2_IN_DRC;
 
   // TODO: irq cycles
   ret_cycles = (int32_t)sh2c->sr >> 12;
index 76b4455..9642492 100644 (file)
@@ -72,11 +72,11 @@ extern void REGPARM(1) (*sh2_drc_restore_sr)(SH2 *sh2);
 #define        DRC_DECLARE_SR  register long           _sh2_sr asm(DRC_SR_REG)
 #endif
 #define DRC_SAVE_SR(sh2) \
-    if (likely((sh2->state&(SH2_STATE_RUN|SH2_STATE_SLEEP)) == SH2_STATE_RUN)) \
+    if (likely(sh2->state & SH2_IN_DRC)) \
        sh2->sr = (s32)_sh2_sr
 //      sh2_drc_save_sr(sh2)
 #define DRC_RESTORE_SR(sh2) \
-    if (likely((sh2->state&(SH2_STATE_RUN|SH2_STATE_SLEEP)) == SH2_STATE_RUN)) \
+    if (likely(sh2->state & SH2_IN_DRC)) \
        _sh2_sr = (s32)sh2->sr
 //      sh2_drc_restore_sr(sh2)
 #else
index 4b0b338..b9267d7 100644 (file)
@@ -48,7 +48,8 @@ typedef struct SH2_
 #define SH2_STATE_CPOLL (1 << 2)       // polling comm regs\r
 #define SH2_STATE_VPOLL (1 << 3)       // polling VDP\r
 #define SH2_STATE_RPOLL (1 << 4)       // polling address in SDRAM\r
-#define SH2_TIMER_RUN   (1 << 8)       // SOC WDT timer is running\r
+#define SH2_TIMER_RUN   (1 << 7)       // SOC WDT timer is running\r
+#define SH2_IN_DRC      (1 << 8)       // DRC in use\r
        unsigned int    state;\r
        uint32_t        poll_addr;\r
        int             poll_cycles;\r