diff --git a/src/cpu/x86_ops_fpu.h b/src/cpu/x86_ops_fpu.h index 9ea04b447d..11f603c190 100644 --- a/src/cpu/x86_ops_fpu.h +++ b/src/cpu/x86_ops_fpu.h @@ -4,7 +4,6 @@ static int opESCAPE_d8_a16(uint32_t fetchdat) { - //pclog("D8 A16: fetchdat=%02x.\n", (fetchdat >> 3) & 0x1f); return x86_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int @@ -16,7 +15,6 @@ opESCAPE_d8_a32(uint32_t fetchdat) static int opESCAPE_d9_a16(uint32_t fetchdat) { - //pclog("D9 A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_d9_a16[fetchdat & 0xff](fetchdat); } static int @@ -28,7 +26,6 @@ opESCAPE_d9_a32(uint32_t fetchdat) static int opESCAPE_da_a16(uint32_t fetchdat) { - //pclog("DA A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_da_a16[fetchdat & 0xff](fetchdat); } static int @@ -40,7 +37,6 @@ opESCAPE_da_a32(uint32_t fetchdat) static int opESCAPE_db_a16(uint32_t fetchdat) { - //pclog("DB A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_db_a16[fetchdat & 0xff](fetchdat); } static int @@ -52,7 +48,6 @@ opESCAPE_db_a32(uint32_t fetchdat) static int opESCAPE_dc_a16(uint32_t fetchdat) { - //pclog("DC A16: fetchdat=%02x.\n", (fetchdat >> 3) & 0x1f); return x86_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int @@ -64,7 +59,6 @@ opESCAPE_dc_a32(uint32_t fetchdat) static int opESCAPE_dd_a16(uint32_t fetchdat) { - //pclog("DD A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_dd_a16[fetchdat & 0xff](fetchdat); } static int @@ -76,7 +70,6 @@ opESCAPE_dd_a32(uint32_t fetchdat) static int opESCAPE_de_a16(uint32_t fetchdat) { - //pclog("DE A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_de_a16[fetchdat & 0xff](fetchdat); } static int @@ -88,7 +81,6 @@ opESCAPE_de_a32(uint32_t fetchdat) static int opESCAPE_df_a16(uint32_t fetchdat) { - //pclog("DF A16: fetchdat=%02x.\n", fetchdat & 0xff); return x86_opcodes_df_a16[fetchdat & 0xff](fetchdat); } static int @@ -105,15 +97,13 @@ opWAIT(uint32_t fetchdat) return 1; } -#if 0 - if (!cpu_use_dynarec && fpu_softfloat) { -#endif if (fpu_softfloat) { if (fpu_state.swd & FPU_SW_Summary) { - if (cr0 & 0x20) { + if (is486 && (cr0 & 0x20)) x86_int(16); - return 1; - } + else + picint(1 << 13); + return 1; } } CLOCK_CYCLES(4); diff --git a/src/cpu/x86_ops_fpu_2386.h b/src/cpu/x86_ops_fpu_2386.h index 52c24d9958..d8996d2e12 100644 --- a/src/cpu/x86_ops_fpu_2386.h +++ b/src/cpu/x86_ops_fpu_2386.h @@ -97,15 +97,10 @@ opWAIT(uint32_t fetchdat) return 1; } -#if 0 - if (!cpu_use_dynarec && fpu_softfloat) { -#endif if (fpu_softfloat) { if (fpu_state.swd & FPU_SW_Summary) { - if (cr0 & 0x20) { - x86_int(16); - return 1; - } + picint(1 << 13); + return 1; } } CLOCK_CYCLES(4); diff --git a/src/cpu/x87.c b/src/cpu/x87.c index 390c06dc27..577fa1a408 100644 --- a/src/cpu/x87.c +++ b/src/cpu/x87.c @@ -355,7 +355,10 @@ FPU_exception(uint32_t fetchdat, uint16_t exceptions, int store) nmi = 1; } #else - picint(1 << 13); + if (is486 && (cr0 & 0x20)) + x86_int(16); + else + picint(1 << 13); #endif // FPU_8087 } return unmasked; diff --git a/src/cpu/x87.h b/src/cpu/x87.h index 060f2fe276..2ad0c7b108 100644 --- a/src/cpu/x87.h +++ b/src/cpu/x87.h @@ -228,12 +228,10 @@ FPU_save_regi_tag(extFloat80_t reg, int tag, int stnr) #define FPU_check_pending_exceptions() \ do { \ if (fpu_state.swd & FPU_SW_Summary) { \ - if (cr0 & 0x20) { \ + if (is486 && (cr0 & 0x20)) \ x86_int(16); \ - return 1; \ - } else { \ + else \ picint(1 << 13); \ - return 1; \ - } \ + return 1; \ } \ } while (0) diff --git a/src/cpu/x87_ops.h b/src/cpu/x87_ops.h index 6be9d7648f..e1bc5858a5 100644 --- a/src/cpu/x87_ops.h +++ b/src/cpu/x87_ops.h @@ -99,7 +99,10 @@ typedef union { dst = src1 / (double) src2; \ else { \ fpu_log("FPU : divide by zero\n"); \ - picint(1 << 13); \ + if (is486 && (cr0 & 0x20)) \ + x86_int(16); \ + else \ + picint(1 << 13); \ return 1; \ } \ } else \ diff --git a/src/sound/ymfm/ymfm_fm.ipp b/src/sound/ymfm/ymfm_fm.ipp index 2aa0a216bd..f2ec83945e 100644 --- a/src/sound/ymfm/ymfm_fm.ipp +++ b/src/sound/ymfm/ymfm_fm.ipp @@ -1473,11 +1473,14 @@ void fm_engine_base::assign_operators() template void fm_engine_base::update_timer(uint32_t tnum, uint32_t enable, int32_t delta_clocks) { + uint32_t subtract = !!(tnum >> 15); + tnum &= 0x7fff; + // if the timer is live, but not currently enabled, set the timer if (enable && !m_timer_running[tnum]) { // period comes from the registers, and is different for each - uint32_t period = (tnum == 0) ? (1024 - m_regs.timer_a_value()) : 16 * (256 - m_regs.timer_b_value()); + uint32_t period = (tnum == 0) ? (1024 - subtract - m_regs.timer_a_value()) : 16 * (256 - subtract - m_regs.timer_b_value()); // caller can also specify a delta to account for other effects period += delta_clocks; @@ -1504,8 +1507,6 @@ void fm_engine_base::update_timer(uint32_t tnum, uint32_t enable, template void fm_engine_base::engine_timer_expired(uint32_t tnum) { - assert(tnum == 0 || tnum == 1); - // update status if (tnum == 0 && m_regs.enable_timer_a()) set_reset_status(STATUS_TIMERA, 0); @@ -1521,8 +1522,11 @@ void fm_engine_base::engine_timer_expired(uint32_t tnum) m_modified_channels |= 1 << chnum; } - // reset - m_timer_running[tnum] = false; + // Make sure the array does not go out of bounds to keep gcc happy + if ((tnum < 2) || (sizeof(m_timer_running) > (2 * sizeof(uint8_t)))) { + // reset + m_timer_running[tnum] = false; + } update_timer(tnum, 1, 0); }