diff --git a/src/emu/cpu/upd7725/upd7725.c b/src/emu/cpu/upd7725/upd7725.c index ebfa62ef730..ab9420619f2 100644 --- a/src/emu/cpu/upd7725/upd7725.c +++ b/src/emu/cpu/upd7725/upd7725.c @@ -26,10 +26,21 @@ necdsp_device::necdsp_device(const machine_config &mconfig, device_type type, co : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source), m_program_config("program", ENDIANNESS_BIG, 32, abits, -2), // data bus width, address bus width, -2 means DWORD-addressable m_data_config("data", ENDIANNESS_BIG, 16, dbits, -1), // -1 for WORD-addressable - m_irq(0), - m_program(NULL), - m_data(NULL), - m_direct(NULL) + m_irq(0), + m_program(NULL), + m_data(NULL), + m_direct(NULL), + m_in_int_cb(*this), + //m_in_si_cb(*this), + //m_in_sck_cb(*this), + //m_in_sien_cb(*this), + //m_in_soen_cb(*this), + //m_in_dack_cb(*this), + m_out_p0_cb(*this), + m_out_p1_cb(*this) + //m_out_so_cb(*this), + //m_out_sorq_cb(*this), + //m_out_drq_cb(*this) { } @@ -44,35 +55,6 @@ upd96050_device::upd96050_device(const machine_config &mconfig, const char *tag, { } -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void necdsp_device::device_config_complete() -{ - // inherit a copy of the static data - const necdsp_interface *intf = reinterpret_cast(static_config()); - if (intf != NULL) - *static_cast(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_in_int_cb, 0, sizeof(m_in_int_cb)); - //memset(&m_in_si_cb, 0, sizeof(m_in_si_cb)); - //memset(&m_in_sck_cb, 0, sizeof(m_in_sck_cb)); - //memset(&m_in_sien_cb, 0, sizeof(m_in_sien_cb)); - //memset(&m_in_soen_cb, 0, sizeof(m_in_soen_cb)); - //memset(&m_in_dack_cb, 0, sizeof(m_in_dack_cb)); - memset(&m_out_p0_cb, 0, sizeof(m_out_p0_cb)); - memset(&m_out_p1_cb, 0, sizeof(m_out_p1_cb)); - //memset(&m_out_so_cb, 0, sizeof(m_out_so_cb)); - //memset(&m_out_sorq_cb, 0, sizeof(m_out_sorq_cb)); - //memset(&m_out_drq_cb, 0, sizeof(m_out_drq_cb)); - } -} //------------------------------------------------- // device_start - start up the device //------------------------------------------------- @@ -105,17 +87,17 @@ void necdsp_device::device_start() state_add(UPD7725_IDB, "IDB", regs.idb); // resolve callbacks - m_in_int_func.resolve(m_in_int_cb, *this); - //m_in_si_func.resolve(m_in_si_cb, *this); - //m_in_sck_func.resolve(m_in_sck_cb, *this); - //m_in_sien_func.resolve(m_in_sien_cb, *this); - //m_in_soen_func.resolve(m_in_soen_cb, *this); - //m_in_dack_func.resolve(m_in_dack_cb, *this); - m_out_p0_func.resolve(m_out_p0_cb, *this); - m_out_p1_func.resolve(m_out_p1_cb, *this); - //m_out_so_func.resolve(m_out_so_cb, *this); - //m_out_sorq_func.resolve(m_out_sorq_cb, *this); - //m_out_drq_func.resolve(m_out_drq_cb, *this); + m_in_int_cb.resolve_safe(0); + //m_in_si_cb.resolve_safe(0); + //m_in_sck_cb.resolve_safe(0); + //m_in_sien_cb.resolve_safe(0); + //m_in_soen_cb.resolve_safe(0); + //m_in_dack_cb.resolve_safe(0); + m_out_p0_cb.resolve_safe(); + m_out_p1_cb.resolve_safe(); + //m_out_so_cb.resolve_safe(); + //m_out_sorq_cb.resolve_safe(); + //m_out_drq_cb.resolve_safe(); // save state registrations save_item(NAME(regs.pc)); @@ -568,8 +550,8 @@ void necdsp_device::exec_ld(UINT32 opcode) { case 5: regs.rp = id; break; case 6: regs.dr = id; regs.sr.rqm = 1; break; case 7: regs.sr = (regs.sr & 0x907c) | (id & ~0x907c); - m_out_p0_func(regs.sr&0x1); - m_out_p1_func((regs.sr&0x2)>>1); + m_out_p0_cb(regs.sr&0x1); + m_out_p1_cb((regs.sr&0x2)>>1); break; case 8: regs.so = id; break; //LSB case 9: regs.so = id; break; //MSB diff --git a/src/emu/cpu/upd7725/upd7725.h b/src/emu/cpu/upd7725/upd7725.h index b5c507fa5c4..bcff3ead299 100644 --- a/src/emu/cpu/upd7725/upd7725.h +++ b/src/emu/cpu/upd7725/upd7725.h @@ -30,41 +30,68 @@ class necdsp_device; class upd7725_device; class upd96050_device; -// ======================> necdsp_interface -struct necdsp_interface -{ - devcb_read_line m_in_int_cb; - //devcb_read8 m_in_si_cb; - //devcb_read_line m_in_sck_cb; - //devcb_read_line m_in_sien_cb; - //devcb_read_line m_in_soen_cb; - //devcb_read_line m_in_dack_cb; - devcb_write_line m_out_p0_cb; - devcb_write_line m_out_p1_cb; - //devcb_write8 m_out_so_cb; - //devcb_write_line m_out_sorq_cb; - //devcb_write_line m_out_drq_cb; -}; +#define MCFG_NECDSP_IN_INT_CB(_devcb) \ + devcb = &necdsp_device::set_in_int_callback(*device, DEVCB2_##_devcb); -#define NECDSP_INTERFACE(name) \ - const necdsp_interface (name) = +#define MCFG_NECDSP_IN_SI_CB(_devcb) \ + devcb = &necdsp_device::set_in_si_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_IN_SCK_CB(_devcb) \ + devcb = &necdsp_device::set_in_sck_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_IN_SIEN_CB(_devcb) \ + devcb = &necdsp_device::set_in_sien_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_IN_SOEN_CB(_devcb) \ + devcb = &necdsp_device::set_in_soen_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_IN_DACK_CB(_devcb) \ + devcb = &necdsp_device::set_in_dack_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_OUT_P0_CB(_devcb) \ + devcb = &necdsp_device::set_out_p0_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_OUT_P1_CB(_devcb) \ + devcb = &necdsp_device::set_out_p1_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_OUT_SO_CB(_devcb) \ + devcb = &necdsp_device::set_out_so_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_OUT_SORQ_CB(_devcb) \ + devcb = &necdsp_device::set_out_sorq_callback(*device, DEVCB2_##_devcb); + +#define MCFG_NECDSP_OUT_DRQ_CB(_devcb) \ + devcb = &necdsp_device::set_out_drq_callback(*device, DEVCB2_##_devcb); + // ======================> necdsp_device -class necdsp_device : public cpu_device, public necdsp_interface +class necdsp_device : public cpu_device { protected: // construction/destruction necdsp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, UINT32 abits, UINT32 dbits, const char *name, const char *shortname, const char *source); public: + + template static devcb2_base &set_in_int_callback(device_t &device, _Object object) { return downcast(device).m_in_int_cb.set_callback(object); } + //template static devcb2_base &set_in_si_callback(device_t &device, _Object object) { return downcast(device).m_in_si_cb.set_callback(object); } + //template static devcb2_base &set_in_sck_callback(device_t &device, _Object object) { return downcast(device).m_in_sck_cb.set_callback(object); } + //template static devcb2_base &set_in_sien_callback(device_t &device, _Object object) { return downcast(device).m_in_sien_cb.set_callback(object); } + //template static devcb2_base &set_in_soen_callback(device_t &device, _Object object) { return downcast(device).m_in_soen_cb.set_callback(object); } + //template static devcb2_base &set_in_dack_callback(device_t &device, _Object object) { return downcast(device).m_in_dack_cb.set_callback(object); } + template static devcb2_base &set_out_p0_callback(device_t &device, _Object object) { return downcast(device).m_out_p0_cb.set_callback(object); } + template static devcb2_base &set_out_p1_callback(device_t &device, _Object object) { return downcast(device).m_out_p1_cb.set_callback(object); } + //template static devcb2_base &set_out_so_callback(device_t &device, _Object object) { return downcast(device).m_out_so_cb.set_callback(object); } + //template static devcb2_base &set_out_sorq_callback(device_t &device, _Object object) { return downcast(device).m_out_sorq_cb.set_callback(object); } + //template static devcb2_base &set_out_drq_callback(device_t &device, _Object object) { return downcast(device).m_out_drq_cb.set_callback(object); } + UINT8 snesdsp_read(bool mode); void snesdsp_write(bool mode, UINT8 data); protected: // device-level overrides - virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -170,17 +197,17 @@ private: protected: // device callbacks - devcb_resolved_read_line m_in_int_func; - //devcb_resolved_read8 m_in_si_func; - //devcb_resolved_read_line m_in_sck_func; - //devcb_resolved_read_line m_in_sien_func; - //devcb_resolved_read_line m_in_soen_func; - //devcb_resolved_read_line m_in_dack_func; - devcb_resolved_write_line m_out_p0_func; - devcb_resolved_write_line m_out_p1_func; - //devcb_resolved_write8 m_out_so_func; - //devcb_resolved_write_line m_out_sorq_func; - //devcb_resolved_write_line m_out_drq_func; + devcb2_read_line m_in_int_cb; + //devcb2_read8 m_in_si_cb; + //devcb2_read_line m_in_sck_cb; + //devcb2_read_line m_in_sien_cb; + //devcb2_read_line m_in_soen_cb; + //devcb2_read_line m_in_dack_cb; + devcb2_write_line m_out_p0_cb; + devcb2_write_line m_out_p1_cb; + //devcb2_write8 m_out_so_cb; + //devcb2_write_line m_out_sorq_cb; + //devcb2_write_line m_out_drq_cb; }; class upd7725_device : public necdsp_device diff --git a/src/emu/machine/i8255.h b/src/emu/machine/i8255.h index d35e52cc405..1cd037ece17 100644 --- a/src/emu/machine/i8255.h +++ b/src/emu/machine/i8255.h @@ -129,9 +129,6 @@ private: devcb2_write8 m_out_pa_cb; devcb2_write8 m_out_pb_cb; devcb2_write8 m_out_pc_cb; - - devcb_resolved_read8 m_in_port_func[3]; - devcb_resolved_write8 m_out_port_func[3]; UINT8 m_control; // mode control word UINT8 m_output[3]; // output latch diff --git a/src/emu/machine/mc68681.h b/src/emu/machine/mc68681.h index f6ca0a470c4..304160304e1 100644 --- a/src/emu/machine/mc68681.h +++ b/src/emu/machine/mc68681.h @@ -170,12 +170,6 @@ private: void update_interrupts(); mc68681_channel *get_channel(int chan); - - devcb_resolved_write_line m_out_irq_func; - devcb_resolved_write_line m_out_a_tx_func; - devcb_resolved_write_line m_out_b_tx_func; - devcb_resolved_read8 m_in_port_func; - devcb_resolved_write8 m_out_port_func; }; extern const device_type MC68681; diff --git a/src/mess/drivers/tsispch.c b/src/mess/drivers/tsispch.c index 718469c1682..93016faf6cd 100644 --- a/src/mess/drivers/tsispch.c +++ b/src/mess/drivers/tsispch.c @@ -137,14 +137,6 @@ /* Devices and handlers */ -//upd7720 (TODO: hook up p0, p1, int) -static NECDSP_INTERFACE( upd7720_config ) -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - /***************************************************************************** USART 8251 and Terminal stuff @@ -409,10 +401,10 @@ static MACHINE_CONFIG_START( prose2k, tsispch_state ) /* TODO: the UPD7720 has a 10KHz clock to its INT pin */ /* TODO: the UPD7720 has a 2MHz clock to its SCK pin */ + /* TODO: hook up p0, p1, int */ MCFG_CPU_ADD("dsp", UPD7725, 8000000) /* VERIFIED clock, unknown divider; correct dsp type is UPD77P20 */ MCFG_CPU_PROGRAM_MAP(dsp_prg_map) MCFG_CPU_DATA_MAP(dsp_data_map) - MCFG_CPU_CONFIG(upd7720_config) /* PIC 8259 */ MCFG_PIC8259_ADD("pic8259", WRITELINE(tsispch_state,pic8259_set_int_line), VCC, NULL)