runtime enable for sharcdrc (nw)
This commit is contained in:
parent
758aaa496a
commit
728e18f768
@ -11,7 +11,6 @@
|
|||||||
#include "sharcfe.h"
|
#include "sharcfe.h"
|
||||||
|
|
||||||
|
|
||||||
#define ENABLE_DRC 0
|
|
||||||
#define DISABLE_FAST_REGISTERS 1
|
#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_cache(CACHE_SIZE + sizeof(sharc_internal_state))
|
||||||
, m_drcuml(nullptr)
|
, m_drcuml(nullptr)
|
||||||
, m_drcfe(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);
|
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)
|
void adsp21062_device::CHANGE_PC(UINT32 newpc)
|
||||||
{
|
{
|
||||||
@ -892,45 +897,48 @@ void adsp21062_device::check_interrupts()
|
|||||||
|
|
||||||
void adsp21062_device::execute_run()
|
void adsp21062_device::execute_run()
|
||||||
{
|
{
|
||||||
#if ENABLE_DRC
|
if (m_enable_drc)
|
||||||
if (m_core->irq_pending != 0)
|
|
||||||
{
|
{
|
||||||
m_core->idle = 0;
|
if (m_core->irq_pending != 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)
|
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
|
case 0: // arithmetic condition-based
|
||||||
{
|
{
|
||||||
int condition = m_core->laddr.code;
|
int condition = m_core->laddr.code;
|
||||||
@ -980,27 +988,27 @@ void adsp21062_device::execute_run()
|
|||||||
CHANGE_PC(TOP_PC());
|
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
|
// System register latency effect
|
||||||
if (m_core->systemreg_latency_cycles > 0)
|
if (m_core->systemreg_latency_cycles > 0)
|
||||||
{
|
|
||||||
--m_core->systemreg_latency_cycles;
|
|
||||||
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;
|
--m_core->icount;
|
||||||
};
|
};
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool adsp21062_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value)
|
bool adsp21062_device::memory_read(address_spacenum spacenum, offs_t offset, int size, UINT64 &value)
|
||||||
|
@ -168,6 +168,8 @@ public:
|
|||||||
void sharc_cfunc_unimplemented_shiftimm();
|
void sharc_cfunc_unimplemented_shiftimm();
|
||||||
void sharc_cfunc_write_snoop();
|
void sharc_cfunc_write_snoop();
|
||||||
|
|
||||||
|
void enable_recompiler();
|
||||||
|
|
||||||
enum ASTAT_FLAGS
|
enum ASTAT_FLAGS
|
||||||
{
|
{
|
||||||
// ASTAT flags
|
// ASTAT flags
|
||||||
@ -452,6 +454,8 @@ private:
|
|||||||
|
|
||||||
UINT16 m_internal_ram[2 * 0x10000]; // 2x 128KB
|
UINT16 m_internal_ram[2 * 0x10000]; // 2x 128KB
|
||||||
|
|
||||||
|
bool m_enable_drc;
|
||||||
|
|
||||||
inline void CHANGE_PC(UINT32 newpc);
|
inline void CHANGE_PC(UINT32 newpc);
|
||||||
inline void CHANGE_PC_DELAYED(UINT32 newpc);
|
inline void CHANGE_PC_DELAYED(UINT32 newpc);
|
||||||
void sharc_iop_delayed_w(UINT32 reg, UINT32 data, int cycles);
|
void sharc_iop_delayed_w(UINT32 reg, UINT32 data, int cycles);
|
||||||
|
@ -272,7 +272,7 @@ public:
|
|||||||
required_device<ppc_device> m_maincpu;
|
required_device<ppc_device> m_maincpu;
|
||||||
required_device<cpu_device> m_audiocpu;
|
required_device<cpu_device> m_audiocpu;
|
||||||
required_device<adsp21062_device> m_dsp;
|
required_device<adsp21062_device> m_dsp;
|
||||||
optional_device<cpu_device> m_dsp2;
|
optional_device<adsp21062_device> m_dsp2;
|
||||||
required_device<k056800_device> m_k056800;
|
required_device<k056800_device> m_k056800;
|
||||||
required_device<adc1038_device> m_adc1038;
|
required_device<adc1038_device> m_adc1038;
|
||||||
required_device<eeprom_serial_93cxx_device> m_eeprom;
|
required_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||||
@ -1402,6 +1402,8 @@ ROM_END
|
|||||||
DRIVER_INIT_MEMBER(gticlub_state,gticlub)
|
DRIVER_INIT_MEMBER(gticlub_state,gticlub)
|
||||||
{
|
{
|
||||||
m_sharc_dataram_0 = std::make_unique<UINT32[]>(0x100000/4);
|
m_sharc_dataram_0 = std::make_unique<UINT32[]>(0x100000/4);
|
||||||
|
|
||||||
|
m_dsp->enable_recompiler();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gticlub_state::init_hangplt_common()
|
void gticlub_state::init_hangplt_common()
|
||||||
|
@ -369,8 +369,8 @@ public:
|
|||||||
required_device<cpu_device> m_audiocpu;
|
required_device<cpu_device> m_audiocpu;
|
||||||
required_device<k056800_device> m_k056800;
|
required_device<k056800_device> m_k056800;
|
||||||
optional_device<cpu_device> m_gn680;
|
optional_device<cpu_device> m_gn680;
|
||||||
required_device<cpu_device> m_dsp;
|
required_device<adsp21062_device> m_dsp;
|
||||||
optional_device<cpu_device> m_dsp2;
|
optional_device<adsp21062_device> m_dsp2;
|
||||||
optional_device<k037122_device> m_k037122_1;
|
optional_device<k037122_device> m_k037122_1;
|
||||||
optional_device<k037122_device> m_k037122_2;
|
optional_device<k037122_device> m_k037122_2;
|
||||||
required_device<adc12138_device> m_adc12138;
|
required_device<adc12138_device> m_adc12138;
|
||||||
@ -423,6 +423,9 @@ public:
|
|||||||
|
|
||||||
DECLARE_DRIVER_INIT(hornet);
|
DECLARE_DRIVER_INIT(hornet);
|
||||||
DECLARE_DRIVER_INIT(hornet_2board);
|
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_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
DECLARE_MACHINE_RESET(hornet_2board);
|
DECLARE_MACHINE_RESET(hornet_2board);
|
||||||
@ -1118,7 +1121,7 @@ static MACHINE_CONFIG_DERIVED( hornet_2board, hornet )
|
|||||||
MCFG_KONPPC_CGBOARD_TYPE(CGBOARD_TYPE_HORNET)
|
MCFG_KONPPC_CGBOARD_TYPE(CGBOARD_TYPE_HORNET)
|
||||||
MACHINE_CONFIG_END
|
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_ADD("gn680", M68000, XTAL_32MHz/2) /* 16MHz */
|
||||||
MCFG_CPU_PROGRAM_MAP(gn680_memmap)
|
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));
|
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)
|
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, 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, hornet, ROT0, "Konami", "NBA Play By Play", 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 )
|
||||||
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 )
|
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 )
|
||||||
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, 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
|
// 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.
|
// version, and thus can't be booted. If you copy the NVRAM from another already initialized set, it will boot as UAD.
|
||||||
|
@ -216,7 +216,7 @@ public:
|
|||||||
|
|
||||||
required_device<ppc_device> m_maincpu;
|
required_device<ppc_device> m_maincpu;
|
||||||
required_device<cpu_device> m_audiocpu;
|
required_device<cpu_device> m_audiocpu;
|
||||||
required_device<cpu_device> m_dsp;
|
required_device<adsp21062_device> m_dsp;
|
||||||
required_device<watchdog_timer_device> m_watchdog;
|
required_device<watchdog_timer_device> m_watchdog;
|
||||||
optional_device<k001604_device> m_k001604;
|
optional_device<k001604_device> m_k001604;
|
||||||
required_device<k056800_device> m_k056800;
|
required_device<k056800_device> m_k056800;
|
||||||
@ -911,6 +911,8 @@ DRIVER_INIT_MEMBER(zr107_state,common)
|
|||||||
m_sharc_dataram = std::make_unique<UINT32[]>(0x100000/4);
|
m_sharc_dataram = std::make_unique<UINT32[]>(0x100000/4);
|
||||||
m_led_reg0 = m_led_reg1 = 0x7f;
|
m_led_reg0 = m_led_reg1 = 0x7f;
|
||||||
m_ccu_vcth = m_ccu_vctl = 0;
|
m_ccu_vcth = m_ccu_vctl = 0;
|
||||||
|
|
||||||
|
m_dsp->enable_recompiler();
|
||||||
}
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(zr107_state,zr107)
|
DRIVER_INIT_MEMBER(zr107_state,zr107)
|
||||||
|
Loading…
Reference in New Issue
Block a user