From 728e18f768df7d530322ae8706c687ae349a566e Mon Sep 17 00:00:00 2001 From: Ville Linde Date: Mon, 6 Jun 2016 23:36:12 +0300 Subject: [PATCH] runtime enable for sharcdrc (nw) --- src/devices/cpu/sharc/sharc.cpp | 106 +++++++++++++++++--------------- src/devices/cpu/sharc/sharc.h | 4 ++ src/mame/drivers/gticlub.cpp | 4 +- src/mame/drivers/hornet.cpp | 35 ++++++++--- src/mame/drivers/zr107.cpp | 4 +- 5 files changed, 95 insertions(+), 58 deletions(-) diff --git a/src/devices/cpu/sharc/sharc.cpp b/src/devices/cpu/sharc/sharc.cpp index 67290164b0c..4123da67594 100644 --- a/src/devices/cpu/sharc/sharc.cpp +++ b/src/devices/cpu/sharc/sharc.cpp @@ -11,7 +11,6 @@ #include "sharcfe.h" -#define ENABLE_DRC 0 #define DISABLE_FAST_REGISTERS 1 @@ -76,6 +75,7 @@ adsp21062_device::adsp21062_device(const machine_config &mconfig, const char *ta , m_cache(CACHE_SIZE + sizeof(sharc_internal_state)) , m_drcuml(nullptr) , m_drcfe(nullptr) + , m_enable_drc(false) { } @@ -86,6 +86,11 @@ offs_t adsp21062_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 return CPU_DISASSEMBLE_NAME(sharc)(this, buffer, pc, oprom, opram, options); } +void adsp21062_device::enable_recompiler() +{ + m_enable_drc = true; +} + void adsp21062_device::CHANGE_PC(UINT32 newpc) { @@ -892,45 +897,48 @@ void adsp21062_device::check_interrupts() void adsp21062_device::execute_run() { -#if ENABLE_DRC - if (m_core->irq_pending != 0) + if (m_enable_drc) { - m_core->idle = 0; - } - execute_run_drc(); - return; -#else - if (m_core->idle && m_core->irq_pending == 0) - { - m_core->icount = 0; - debugger_instruction_hook(this, m_core->daddr); - } - if (m_core->irq_pending != 0) - { - check_interrupts(); - m_core->idle = 0; - } - - while (m_core->icount > 0 && !m_core->idle) - { - m_core->pc = m_core->daddr; - m_core->daddr = m_core->faddr; - m_core->faddr = m_core->nfaddr; - m_core->nfaddr++; - - m_core->astat_old_old_old = m_core->astat_old_old; - m_core->astat_old_old = m_core->astat_old; - m_core->astat_old = m_core->astat; - - debugger_instruction_hook(this, m_core->pc); - - m_core->opcode = ROPCODE(m_core->pc); - - // handle looping - if (m_core->pc == m_core->laddr.addr) + if (m_core->irq_pending != 0) { - switch (m_core->laddr.loop_type) + m_core->idle = 0; + } + execute_run_drc(); + return; + } + else + { + if (m_core->idle && m_core->irq_pending == 0) + { + m_core->icount = 0; + debugger_instruction_hook(this, m_core->daddr); + } + if (m_core->irq_pending != 0) + { + check_interrupts(); + m_core->idle = 0; + } + + while (m_core->icount > 0 && !m_core->idle) + { + m_core->pc = m_core->daddr; + m_core->daddr = m_core->faddr; + m_core->faddr = m_core->nfaddr; + m_core->nfaddr++; + + m_core->astat_old_old_old = m_core->astat_old_old; + m_core->astat_old_old = m_core->astat_old; + m_core->astat_old = m_core->astat; + + debugger_instruction_hook(this, m_core->pc); + + m_core->opcode = ROPCODE(m_core->pc); + + // handle looping + if (m_core->pc == m_core->laddr.addr) { + switch (m_core->laddr.loop_type) + { case 0: // arithmetic condition-based { int condition = m_core->laddr.code; @@ -980,27 +988,27 @@ void adsp21062_device::execute_run() CHANGE_PC(TOP_PC()); } } + } } - } - (this->*m_sharc_op[(m_core->opcode >> 39) & 0x1ff])(); + (this->*m_sharc_op[(m_core->opcode >> 39) & 0x1ff])(); - // System register latency effect - if (m_core->systemreg_latency_cycles > 0) - { - --m_core->systemreg_latency_cycles; - if (m_core->systemreg_latency_cycles <= 0) + // System register latency effect + if (m_core->systemreg_latency_cycles > 0) { - systemreg_write_latency_effect(); + --m_core->systemreg_latency_cycles; + if (m_core->systemreg_latency_cycles <= 0) + { + systemreg_write_latency_effect(); + } } - } - --m_core->icount; - }; -#endif + --m_core->icount; + }; + } } bool adsp21062_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value) diff --git a/src/devices/cpu/sharc/sharc.h b/src/devices/cpu/sharc/sharc.h index 20eeb003ebe..f8718997d4d 100644 --- a/src/devices/cpu/sharc/sharc.h +++ b/src/devices/cpu/sharc/sharc.h @@ -168,6 +168,8 @@ public: void sharc_cfunc_unimplemented_shiftimm(); void sharc_cfunc_write_snoop(); + void enable_recompiler(); + enum ASTAT_FLAGS { // ASTAT flags @@ -452,6 +454,8 @@ private: UINT16 m_internal_ram[2 * 0x10000]; // 2x 128KB + bool m_enable_drc; + inline void CHANGE_PC(UINT32 newpc); inline void CHANGE_PC_DELAYED(UINT32 newpc); void sharc_iop_delayed_w(UINT32 reg, UINT32 data, int cycles); diff --git a/src/mame/drivers/gticlub.cpp b/src/mame/drivers/gticlub.cpp index 91eedfcdf83..f163feedce1 100644 --- a/src/mame/drivers/gticlub.cpp +++ b/src/mame/drivers/gticlub.cpp @@ -272,7 +272,7 @@ public: required_device m_maincpu; required_device m_audiocpu; required_device m_dsp; - optional_device m_dsp2; + optional_device m_dsp2; required_device m_k056800; required_device m_adc1038; required_device m_eeprom; @@ -1402,6 +1402,8 @@ ROM_END DRIVER_INIT_MEMBER(gticlub_state,gticlub) { m_sharc_dataram_0 = std::make_unique(0x100000/4); + + m_dsp->enable_recompiler(); } void gticlub_state::init_hangplt_common() diff --git a/src/mame/drivers/hornet.cpp b/src/mame/drivers/hornet.cpp index 0f070dd2494..2753b3fa849 100644 --- a/src/mame/drivers/hornet.cpp +++ b/src/mame/drivers/hornet.cpp @@ -369,8 +369,8 @@ public: required_device m_audiocpu; required_device m_k056800; optional_device m_gn680; - required_device m_dsp; - optional_device m_dsp2; + required_device m_dsp; + optional_device m_dsp2; optional_device m_k037122_1; optional_device m_k037122_2; required_device m_adc12138; @@ -423,6 +423,9 @@ public: DECLARE_DRIVER_INIT(hornet); DECLARE_DRIVER_INIT(hornet_2board); + DECLARE_DRIVER_INIT(gradius4); + DECLARE_DRIVER_INIT(nbapbp); + DECLARE_DRIVER_INIT(terabrst); virtual void machine_start() override; virtual void machine_reset() override; DECLARE_MACHINE_RESET(hornet_2board); @@ -1118,7 +1121,7 @@ static MACHINE_CONFIG_DERIVED( hornet_2board, hornet ) MCFG_KONPPC_CGBOARD_TYPE(CGBOARD_TYPE_HORNET) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( terabrst, hornet_2board ) +static MACHINE_CONFIG_DERIVED( terabrst, hornet ) MCFG_CPU_ADD("gn680", M68000, XTAL_32MHz/2) /* 16MHz */ MCFG_CPU_PROGRAM_MAP(gn680_memmap) @@ -1307,6 +1310,24 @@ DRIVER_INIT_MEMBER(hornet_state,hornet_2board) m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(hornet_state::jamma_jvs_w), this)); } +DRIVER_INIT_MEMBER(hornet_state, gradius4) +{ + DRIVER_INIT_CALL(hornet); + m_dsp->enable_recompiler(); +} + +DRIVER_INIT_MEMBER(hornet_state, nbapbp) +{ + DRIVER_INIT_CALL(hornet); + m_dsp->enable_recompiler(); +} + +DRIVER_INIT_MEMBER(hornet_state, terabrst) +{ + DRIVER_INIT_CALL(hornet); + m_dsp->enable_recompiler(); +} + /*****************************************************************************/ ROM_START(sscope) @@ -1540,10 +1561,10 @@ ROM_END /*************************************************************************/ -GAME( 1998, gradius4, 0, hornet, hornet, hornet_state, hornet, ROT0, "Konami", "Gradius 4: Fukkatsu", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1998, nbapbp, 0, hornet, hornet, hornet_state, hornet, ROT0, "Konami", "NBA Play By Play", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAMEL( 1998, terabrst, 0, terabrst, hornet, hornet_state, hornet_2board, ROT0, "Konami", "Teraburst (1998/07/17 ver UEL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) -GAMEL( 1998, terabrsta, terabrst, terabrst, hornet, hornet_state, hornet_2board, ROT0, "Konami", "Teraburst (1998/02/25 ver AAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) +GAME( 1998, gradius4, 0, hornet, hornet, hornet_state, gradius4, ROT0, "Konami", "Gradius 4: Fukkatsu", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, nbapbp, 0, hornet, hornet, hornet_state, nbapbp, ROT0, "Konami", "NBA Play By Play", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, terabrst, 0, terabrst, hornet, hornet_state, terabrst, ROT0, "Konami", "Teraburst (1998/07/17 ver UEL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, terabrsta, terabrst, terabrst, hornet, hornet_state, terabrst, ROT0, "Konami", "Teraburst (1998/02/25 ver AAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // The region comes from the Timekeeper NVRAM, without a valid default all sets except 'xxD, Ver 1.33' will init their NVRAM to UAx versions, the xxD set seems to incorrectly init it to JXD, which isn't a valid // version, and thus can't be booted. If you copy the NVRAM from another already initialized set, it will boot as UAD. diff --git a/src/mame/drivers/zr107.cpp b/src/mame/drivers/zr107.cpp index 8f82b41b10e..2b07dbee0d1 100644 --- a/src/mame/drivers/zr107.cpp +++ b/src/mame/drivers/zr107.cpp @@ -216,7 +216,7 @@ public: required_device m_maincpu; required_device m_audiocpu; - required_device m_dsp; + required_device m_dsp; required_device m_watchdog; optional_device m_k001604; required_device m_k056800; @@ -911,6 +911,8 @@ DRIVER_INIT_MEMBER(zr107_state,common) m_sharc_dataram = std::make_unique(0x100000/4); m_led_reg0 = m_led_reg1 = 0x7f; m_ccu_vcth = m_ccu_vctl = 0; + + m_dsp->enable_recompiler(); } DRIVER_INIT_MEMBER(zr107_state,zr107)