diff options
author | 2017-04-15 20:05:32 -0400 | |
---|---|---|
committer | 2017-04-15 20:05:32 -0400 | |
commit | 1e4bfcd40b4cafbf49ca5fdcd8ab55a3e81445f5 (patch) | |
tree | 25289f27e592be2058d11817f6fa4dfe87768265 /src | |
parent | c27cf4867d523fa3e9614363a8b0eb9775d533c6 (diff) |
dsbz80: Not just a one-way street (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/audio/dsbz80.cpp | 14 | ||||
-rw-r--r-- | src/mame/audio/dsbz80.h | 9 | ||||
-rw-r--r-- | src/mame/audio/segam1audio.h | 1 |
3 files changed, 21 insertions, 3 deletions
diff --git a/src/mame/audio/dsbz80.cpp b/src/mame/audio/dsbz80.cpp index 4f05d6cab00..31a8e195541 100644 --- a/src/mame/audio/dsbz80.cpp +++ b/src/mame/audio/dsbz80.cpp @@ -27,7 +27,7 @@ static ADDRESS_MAP_START( dsbz80io_map, AS_IO, 8, dsbz80_device ) AM_RANGE(0xe5, 0xe7) AM_WRITE(mpeg_end_w) AM_RANGE(0xe8, 0xe8) AM_WRITE(mpeg_volume_w) AM_RANGE(0xe9, 0xe9) AM_WRITE(mpeg_stereo_w) - AM_RANGE(0xf0, 0xf0) AM_DEVREAD("uart", i8251_device, data_r) + AM_RANGE(0xf0, 0xf0) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w) AM_RANGE(0xf1, 0xf1) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w) ADDRESS_MAP_END @@ -39,7 +39,7 @@ MACHINE_CONFIG_FRAGMENT( dsbz80 ) MCFG_DEVICE_ADD("uart", I8251, 4000000) MCFG_I8251_RXRDY_HANDLER(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0)) - // no TXD output + MCFG_I8251_TXD_HANDLER(WRITELINE(dsbz80_device, output_txd)) MCFG_CLOCK_ADD("uart_clock", 100000) MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("uart", i8251_device, write_rxc)) @@ -74,7 +74,8 @@ dsbz80_device::dsbz80_device(const machine_config &mconfig, const char *tag, dev device_t(mconfig, DSBZ80, "Sega Z80-based Digital Sound Board", tag, owner, clock, "dsbz80", __FILE__), device_sound_interface(mconfig, *this), m_ourcpu(*this, Z80_TAG), - m_uart(*this, "uart") + m_uart(*this, "uart"), + m_rxd_handler(*this) { } @@ -84,6 +85,7 @@ dsbz80_device::dsbz80_device(const machine_config &mconfig, const char *tag, dev void dsbz80_device::device_start() { + m_rxd_handler.resolve_safe(); uint8_t *rom_base = machine().root_device().memregion("mpeg")->base(); decoder = new mpeg_audio(rom_base, mpeg_audio::L2, false, 0); machine().sound().stream_alloc(*this, 0, 2, 32000); @@ -108,6 +110,12 @@ WRITE_LINE_MEMBER(dsbz80_device::write_txd) m_uart->write_rxd(state); } +WRITE_LINE_MEMBER(dsbz80_device::output_txd) +{ + // not used by swa + m_rxd_handler(state); +} + WRITE8_MEMBER(dsbz80_device::mpeg_trigger_w) { mp_state = data; diff --git a/src/mame/audio/dsbz80.h b/src/mame/audio/dsbz80.h index 69968468f1d..944e494dccc 100644 --- a/src/mame/audio/dsbz80.h +++ b/src/mame/audio/dsbz80.h @@ -14,6 +14,9 @@ #define MCFG_DSBZ80_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, DSBZ80, 0) +#define MCFG_DSBZ80_RXD_HANDLER(_devcb) \ + devcb = &dsbz80_device::set_rxd_handler(*device, DEVCB_##_devcb); + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -27,10 +30,14 @@ public: // optional information overrides virtual machine_config_constructor device_mconfig_additions() const override; + // static configuration + template<class _Object> static devcb_base &set_rxd_handler(device_t &device, _Object &&object) { return downcast<dsbz80_device &>(device).m_rxd_handler.set_callback(std::forward<_Object>(object)); } + required_device<cpu_device> m_ourcpu; required_device<i8251_device> m_uart; DECLARE_WRITE_LINE_MEMBER(write_txd); + DECLARE_WRITE_LINE_MEMBER(output_txd); DECLARE_WRITE8_MEMBER(mpeg_trigger_w); DECLARE_WRITE8_MEMBER(mpeg_start_w); @@ -51,6 +58,8 @@ private: int16_t audio_buf[1152*2]; uint32_t mp_start, mp_end, mp_vol, mp_pan, mp_state, lp_start, lp_end, start, end; int mp_pos, audio_pos, audio_avail; + + devcb_write_line m_rxd_handler; }; diff --git a/src/mame/audio/segam1audio.h b/src/mame/audio/segam1audio.h index 61421bfb62d..e252d86c213 100644 --- a/src/mame/audio/segam1audio.h +++ b/src/mame/audio/segam1audio.h @@ -36,6 +36,7 @@ public: // optional information overrides virtual machine_config_constructor device_mconfig_additions() const override; + // static configuration template<class _Object> static devcb_base &set_rxd_handler(device_t &device, _Object &&object) { return downcast<segam1audio_device &>(device).m_rxd_handler.set_callback(std::forward<_Object>(object)); } DECLARE_WRITE16_MEMBER(m1_snd_mpcm_bnk1_w); |