mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
se3208: Use callbacks for interrupt acknowledgment (nw)
This commit is contained in:
parent
7610231242
commit
859d4943d6
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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(); }
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user