se3208: Use callbacks for interrupt acknowledgment (nw)

This commit is contained in:
AJR 2020-04-22 19:10:15 -04:00
parent 7610231242
commit 859d4943d6
11 changed files with 38 additions and 57 deletions

View File

@ -51,9 +51,12 @@ DEFINE_DEVICE_TYPE(SE3208, se3208_device, "se3208", "ADChips SE3208")
se3208_device::se3208_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, SE3208, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
, m_machinex_cb(*this)
, m_iackx_cb(*this)
, m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_program(nullptr), m_cache(nullptr), m_IRQ(0), m_NMI(0), m_icount(0)
{
}
device_memory_interface::space_config_vector se3208_device::memory_space_config() const
{
return space_config_vector {
@ -62,6 +65,13 @@ device_memory_interface::space_config_vector se3208_device::memory_space_config(
}
void se3208_device::device_resolve_objects()
{
m_machinex_cb.resolve_safe();
m_iackx_cb.resolve_safe(0);
}
uint32_t se3208_device::read_dword_unaligned(address_space &space, uint32_t address)
{
if (DWORD_ALIGNED(address))
@ -1428,7 +1438,9 @@ INST(SWI)
INST(HALT)
{
// uint32_t Imm=EXTRACT(Opcode,0,3);
uint32_t Imm=EXTRACT(Opcode,0,3);
m_machinex_cb(0x10 | Imm);
// DEBUGMESSAGE("HALT\t0x%x",Imm);
}
@ -1730,6 +1742,9 @@ void se3208_device::device_reset()
void se3208_device::SE3208_NMI()
{
standard_irq_callback(INPUT_LINE_NMI);
m_machinex_cb(0x00);
PushVal(m_PC);
PushVal(m_SR);
@ -1743,16 +1758,18 @@ void se3208_device::SE3208_Interrupt()
if(!TESTFLAG(FLAG_ENI))
return;
standard_irq_callback(0);
m_machinex_cb(0x01);
PushVal(m_PC);
PushVal(m_SR);
CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M);
if(!(TESTFLAG(FLAG_AUT)))
m_PC=SE3208_Read32(8);
else
m_PC=SE3208_Read32(4*standard_irq_callback(0));
m_PC=SE3208_Read32(4*m_iackx_cb());
}

View File

@ -20,8 +20,13 @@ public:
// construction/destruction
se3208_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// callback configuration
auto machinex_cb() { return m_machinex_cb.bind(); }
auto iackx_cb() { return m_iackx_cb.bind(); }
protected:
// device-level overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;
@ -45,6 +50,9 @@ protected:
private:
address_space_config m_program_config;
devcb_write8 m_machinex_cb;
devcb_read8 m_iackx_cb;
//GPR
uint32_t m_R[8];
//SPR

View File

@ -324,7 +324,7 @@ void vrender0soc_device::IntReq( int num )
}
int vrender0soc_device::irq_callback()
uint8_t vrender0soc_device::irq_callback()
{
for (int i = 0; i < 32; ++i)
{

View File

@ -105,7 +105,7 @@ public:
bool crt_is_blanked() { return ((m_crtcregs[0] & 0x0200) == 0x0200); }
bool crt_active_vblank_irq();
void IntReq( int num );
int irq_callback();
uint8_t irq_callback();
bool irq_pending() { return m_intst; }
void write_line_tx(int port, uint8_t value);
template <int Port> auto tx_callback() { return write_tx[Port].bind(); }

View File

@ -76,8 +76,6 @@ private:
DECLARE_WRITE8_MEMBER(FlashCmd_w);
DECLARE_WRITE8_MEMBER(FlashAddr_w);
IRQ_CALLBACK_MEMBER(icallback);
virtual void machine_start() override;
virtual void machine_reset() override;
void crospuzl_mem(address_map &map);
@ -93,11 +91,6 @@ private:
};
IRQ_CALLBACK_MEMBER(crospuzl_state::icallback)
{
return m_vr0soc->irq_callback();
}
READ32_MEMBER(crospuzl_state::PIOedat_r)
{
// TODO: this needs fixing in serflash_device
@ -364,7 +357,7 @@ void crospuzl_state::crospuzl(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // FIXME: 72 MHz-ish
m_maincpu->set_addrmap(AS_PROGRAM, &crospuzl_state::crospuzl_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(crospuzl_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

View File

@ -187,7 +187,6 @@ private:
uint32_t m_maxbank;
uint32_t m_FlashCmd;
IRQ_CALLBACK_MEMBER(icallback);
DECLARE_READ32_MEMBER(system_input_r);
DECLARE_WRITE32_MEMBER(Banksw_w);
DECLARE_READ32_MEMBER(FlashCmd_r);
@ -206,10 +205,6 @@ private:
uint32_t m_PIO;
};
IRQ_CALLBACK_MEMBER(crystal_state::icallback)
{
return m_vr0soc->irq_callback();
}
READ32_MEMBER(crystal_state::system_input_r)
{
@ -553,7 +548,7 @@ void crystal_state::crystal(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // TODO : different between each PCBs
m_maincpu->set_addrmap(AS_PROGRAM, &crystal_state::crystal_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(crystal_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

View File

@ -78,17 +78,11 @@ private:
required_device<se3208_device> m_maincpu;
required_device<vrender0soc_device> m_vr0soc;
IRQ_CALLBACK_MEMBER(icallback);
virtual void machine_start() override;
virtual void machine_reset() override;
void ddz_mem(address_map &map);
};
IRQ_CALLBACK_MEMBER(ddz_state::icallback)
{
return m_vr0soc->irq_callback();
}
void ddz_state::ddz_mem(address_map &map)
{
@ -130,7 +124,7 @@ void ddz_state::ddz(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // TODO : different between each PCBs
m_maincpu->set_addrmap(AS_PROGRAM, &ddz_state::ddz_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(ddz_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
VRENDER0_SOC(config, m_vr0soc, 14318180 * 3);
m_vr0soc->set_host_cpu_tag(m_maincpu);

View File

@ -122,8 +122,6 @@ private:
DECLARE_READ32_MEMBER(crzyddz2_key_r);
IRQ_CALLBACK_MEMBER(icallback);
virtual void machine_start() override;
virtual void machine_reset() override;
void menghong_mem(address_map &map);
@ -145,11 +143,6 @@ private:
IRQ_CALLBACK_MEMBER(menghong_state::icallback)
{
return m_vr0soc->irq_callback();
}
WRITE32_MEMBER(menghong_state::Banksw_w)
{
m_Bank = (data >> 1) & 7;
@ -469,7 +462,7 @@ void menghong_state::menghong(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // TODO : different between each PCBs
m_maincpu->set_addrmap(AS_PROGRAM, &menghong_state::menghong_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(menghong_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
// HY04 running at 8 MHz

View File

@ -159,8 +159,6 @@ private:
required_device<vrender0soc_device> m_vr0soc;
required_device<ata_interface_device> m_ata;
IRQ_CALLBACK_MEMBER(icallback);
virtual void machine_start() override;
virtual void machine_reset() override;
void psattack_mem(address_map &map);
@ -171,11 +169,6 @@ private:
DECLARE_WRITE32_MEMBER(output_w);
};
IRQ_CALLBACK_MEMBER(psattack_state::icallback)
{
return m_vr0soc->irq_callback();
}
// TODO: wrong, likely PIC protected too
READ8_MEMBER( psattack_state::cfcard_regs_r )
{
@ -247,7 +240,7 @@ void psattack_state::psattack(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // TODO : different between each PCBs
m_maincpu->set_addrmap(AS_PROGRAM, &psattack_state::psattack_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(psattack_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
// PIC16C711

View File

@ -64,8 +64,6 @@ private:
DECLARE_WRITE32_MEMBER(FlashCmd_w);
DECLARE_WRITE32_MEMBER(Banksw_w);
IRQ_CALLBACK_MEMBER(icallback);
virtual void machine_start() override;
virtual void machine_reset() override;
void trivrus_mem(address_map &map);
@ -81,10 +79,6 @@ private:
uint8_t m_trivrus_input;
};
IRQ_CALLBACK_MEMBER(trivrus_state::icallback)
{
return m_vr0soc->irq_callback();
}
WRITE32_MEMBER(trivrus_state::FlashCmd_w)
{
@ -295,7 +289,7 @@ void trivrus_state::trivrus(machine_config &config)
{
SE3208(config, m_maincpu, 14318180 * 3); // unknown clock
m_maincpu->set_addrmap(AS_PROGRAM, &trivrus_state::trivrus_mem);
m_maincpu->set_irq_acknowledge_callback(FUNC(trivrus_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

View File

@ -38,16 +38,10 @@ private:
void v0bowl_map(address_map &map);
// devices
required_device<cpu_device> m_maincpu;
required_device<se3208_device> m_maincpu;
required_device<vrender0soc_device> m_vr0soc;
IRQ_CALLBACK_MEMBER(icallback);
};
IRQ_CALLBACK_MEMBER(v0bowl_state::icallback)
{
return m_vr0soc->irq_callback();
}
void v0bowl_state::v0bowl_map(address_map &map)
{
@ -137,7 +131,7 @@ void v0bowl_state::v0bowl(machine_config &config)
// TODO: clock to be tuned up
SE3208(config, m_maincpu, 14318180 * 3);
m_maincpu->set_addrmap(AS_PROGRAM, &v0bowl_state::v0bowl_map);
m_maincpu->set_irq_acknowledge_callback(FUNC(v0bowl_state::icallback));
m_maincpu->iackx_cb().set(m_vr0soc, FUNC(vrender0soc_device::irq_callback));
VRENDER0_SOC(config, m_vr0soc, 14318180 * 3);
m_vr0soc->set_host_cpu_tag(m_maincpu);