diff --git a/src/emu/machine/z80dart.c b/src/emu/machine/z80dart.c index 5acdeee8f78..0a5e4d8878b 100644 --- a/src/emu/machine/z80dart.c +++ b/src/emu/machine/z80dart.c @@ -20,6 +20,7 @@ TODO: + - devcb2 - i8274 DMA scheme - break detection - wr0 reset tx interrupt pending @@ -30,20 +31,7 @@ */ -#include "emu.h" #include "z80dart.h" -#include "cpu/z80/z80.h" -#include "cpu/z80/z80daisy.h" - - - -//************************************************************************** -// DEBUGGING -//************************************************************************** - -#define VERBOSE 0 - -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) @@ -51,13 +39,17 @@ // MACROS / CONSTANTS //************************************************************************** +#define VERBOSE 0 + +#define LOG(x) do { if (VERBOSE) logerror x; } while (0) + #define CHANA_TAG "cha" #define CHANB_TAG "chb" //************************************************************************** -// LIVE DEVICE +// DEVICE DEFINITIONS //************************************************************************** // device type definition @@ -72,6 +64,10 @@ const device_type I8274 = &device_creator; const device_type UPD7201 = &device_creator; +//------------------------------------------------- +// device_mconfig_additions - +//------------------------------------------------- + MACHINE_CONFIG_FRAGMENT( z80dart ) MCFG_DEVICE_ADD(CHANA_TAG, Z80DART_CHANNEL, 0) MCFG_DEVICE_ADD(CHANB_TAG, Z80DART_CHANNEL, 0) @@ -83,6 +79,11 @@ machine_config_constructor z80dart_device::device_mconfig_additions() const } + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + //------------------------------------------------- // z80dart_device - constructor //------------------------------------------------- @@ -238,11 +239,6 @@ void z80dart_device::device_reset() } - -//************************************************************************** -// DAISY CHAIN INTERFACE -//************************************************************************** - //------------------------------------------------- // z80daisy_irq_state - get interrupt status //------------------------------------------------- @@ -334,11 +330,6 @@ void z80dart_device::z80daisy_irq_reti() } - -//************************************************************************** -// IMPLEMENTATION -//************************************************************************** - //------------------------------------------------- // check_interrupts - //------------------------------------------------- @@ -404,6 +395,68 @@ int z80dart_device::m1_r() } +//------------------------------------------------- +// cd_ba_r - +//------------------------------------------------- + +READ8_MEMBER( z80dart_device::cd_ba_r ) +{ + int ba = BIT(offset, 0); + int cd = BIT(offset, 1); + z80dart_channel *channel = ba ? m_chanB : m_chanA; + + return cd ? channel->control_read() : channel->data_read(); +} + + +//------------------------------------------------- +// cd_ba_w - +//------------------------------------------------- + +WRITE8_MEMBER( z80dart_device::cd_ba_w ) +{ + int ba = BIT(offset, 0); + int cd = BIT(offset, 1); + z80dart_channel *channel = ba ? m_chanB : m_chanA; + + if (cd) + channel->control_write(data); + else + channel->data_write(data); +} + + +//------------------------------------------------- +// ba_cd_r - +//------------------------------------------------- + +READ8_MEMBER( z80dart_device::ba_cd_r ) +{ + int ba = BIT(offset, 1); + int cd = BIT(offset, 0); + z80dart_channel *channel = ba ? m_chanB : m_chanA; + + return cd ? channel->control_read() : channel->data_read(); +} + + +//------------------------------------------------- +// ba_cd_w - +//------------------------------------------------- + +WRITE8_MEMBER( z80dart_device::ba_cd_w ) +{ + int ba = BIT(offset, 1); + int cd = BIT(offset, 0); + z80dart_channel *channel = ba ? m_chanB : m_chanA; + + if (cd) + channel->control_write(data); + else + channel->data_write(data); +} + + //************************************************************************** // DART CHANNEL @@ -1020,7 +1073,7 @@ void z80dart_channel::receive_data(UINT8 data) // cts_w - clear to send handler //------------------------------------------------- -void z80dart_channel::cts_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::cts_w ) { LOG(("Z80DART \"%s\" Channel %c : CTS %u\n", m_owner->tag(), 'A' + m_index, state)); @@ -1059,7 +1112,7 @@ void z80dart_channel::cts_w(int state) // dcd_w - data carrier detected handler //------------------------------------------------- -void z80dart_channel::dcd_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::dcd_w ) { LOG(("Z80DART \"%s\" Channel %c : DCD %u\n", m_owner->tag(), 'A' + m_index, state)); @@ -1097,7 +1150,7 @@ void z80dart_channel::dcd_w(int state) // ri_w - ring indicator handler //------------------------------------------------- -void z80dart_channel::ri_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::ri_w ) { LOG(("Z80DART \"%s\" Channel %c : RI %u\n", m_owner->tag(), 'A' + m_index, state)); @@ -1130,7 +1183,7 @@ void z80dart_channel::ri_w(int state) // sync_w - sync handler //------------------------------------------------- -void z80dart_channel::sync_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::sync_w ) { LOG(("Z80DART \"%s\" Channel %c : SYNC %u\n", m_owner->tag(), 'A' + m_index, state)); } @@ -1140,7 +1193,7 @@ void z80dart_channel::sync_w(int state) // rxc_w - receive clock //------------------------------------------------- -void z80dart_channel::rxc_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::rxc_w ) { int clocks = get_clock_mode(); @@ -1160,7 +1213,7 @@ void z80dart_channel::rxc_w(int state) // txc_w - transmit clock //------------------------------------------------- -void z80dart_channel::txc_w(int state) +WRITE_LINE_MEMBER( z80dart_channel::txc_w ) { int clocks = get_clock_mode(); @@ -1244,39 +1297,3 @@ void z80dart_channel::set_rts(int state) serial_connection_out(); } - - - -//************************************************************************** -// GLOBAL STUBS -//************************************************************************** - -READ8_MEMBER( z80dart_device::cd_ba_r ) -{ - return (offset & 2) ? control_read(offset & 1) : data_read(offset & 1); -} - -WRITE8_MEMBER( z80dart_device::cd_ba_w ) -{ - if (offset & 2) - control_write(offset & 1, data); - else - data_write(offset & 1, data); -} - -READ8_MEMBER( z80dart_device::ba_cd_r ) -{ - int channel = BIT(offset, 1); - - return (offset & 1) ? control_read(channel) : data_read(channel); -} - -WRITE8_MEMBER( z80dart_device::ba_cd_w ) -{ - int channel = BIT(offset, 1); - - if (offset & 1) - control_write(channel, data); - else - data_write(channel, data); -} diff --git a/src/emu/machine/z80dart.h b/src/emu/machine/z80dart.h index eae3a9c9612..63dc7665795 100644 --- a/src/emu/machine/z80dart.h +++ b/src/emu/machine/z80dart.h @@ -146,6 +146,7 @@ #ifndef __Z80DART_H__ #define __Z80DART_H__ +#include "emu.h" #include "cpu/z80/z80daisy.h" @@ -268,12 +269,12 @@ public: void receive_data(UINT8 data); - void cts_w(int state); - void dcd_w(int state); - void ri_w(int state); - void rxc_w(int state); - void txc_w(int state); - void sync_w(int state); + DECLARE_WRITE_LINE_MEMBER( cts_w ); + DECLARE_WRITE_LINE_MEMBER( dcd_w ); + DECLARE_WRITE_LINE_MEMBER( ri_w ); + DECLARE_WRITE_LINE_MEMBER( rxc_w ); + DECLARE_WRITE_LINE_MEMBER( txc_w ); + DECLARE_WRITE_LINE_MEMBER( sync_w ); devcb_read_line m_in_rxd_cb; devcb_write_line m_out_txd_cb; @@ -493,19 +494,19 @@ public: // interrupt acknowledge int m1_r(); - DECLARE_WRITE_LINE_MEMBER( ctsa_w ) { cts_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( ctsb_w ) { cts_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( dcda_w ) { dcd_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( dcdb_w ) { dcd_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( ria_w ) { ri_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( rib_w ) { ri_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( rxca_w ) { rxc_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( rxcb_w ) { rxc_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( txca_w ) { txc_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( txcb_w ) { txc_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( rxtxcb_w ) { rxc_w(1, state); txc_w(1, state); } - DECLARE_WRITE_LINE_MEMBER( synca_w ) { sync_w(0, state); } - DECLARE_WRITE_LINE_MEMBER( syncb_w ) { sync_w(1, state); } + DECLARE_WRITE_LINE_MEMBER( ctsa_w ) { m_chanA->cts_w(state); } + DECLARE_WRITE_LINE_MEMBER( ctsb_w ) { m_chanB->cts_w(state); } + DECLARE_WRITE_LINE_MEMBER( dcda_w ) { m_chanA->dcd_w(state); } + DECLARE_WRITE_LINE_MEMBER( dcdb_w ) { m_chanB->dcd_w(state); } + DECLARE_WRITE_LINE_MEMBER( ria_w ) { m_chanA->ri_w(state); } + DECLARE_WRITE_LINE_MEMBER( rib_w ) { m_chanB->ri_w(state); } + DECLARE_WRITE_LINE_MEMBER( rxca_w ) { m_chanA->rxc_w(state); } + DECLARE_WRITE_LINE_MEMBER( rxcb_w ) { m_chanB->rxc_w(state); } + DECLARE_WRITE_LINE_MEMBER( txca_w ) { m_chanA->txc_w(state); } + DECLARE_WRITE_LINE_MEMBER( txcb_w ) { m_chanB->txc_w(state); } + DECLARE_WRITE_LINE_MEMBER( rxtxcb_w ) { m_chanB->rxc_w(state); m_chanB->txc_w(state); } + DECLARE_WRITE_LINE_MEMBER( synca_w ) { m_chanA->sync_w(state); } + DECLARE_WRITE_LINE_MEMBER( syncb_w ) { m_chanB->sync_w(state); } protected: // device-level overrides @@ -523,7 +524,6 @@ protected: void check_interrupts(); void reset_interrupts(); void trigger_interrupt(int index, int state); - z80dart_channel *get_channel(int chan) { return chan == 0 ? m_chanA : m_chanB; } int get_channel_index(z80dart_channel *ch) { return (ch == m_chanA) ? 0 : 1; } enum @@ -544,22 +544,6 @@ protected: CHANNEL_B }; - // control register access - UINT8 control_read(int which) { return get_channel(which)->control_read(); } - void control_write(int which, UINT8 data) { return get_channel(which)->control_write(data); } - - // data register access - UINT8 data_read(int which) { return get_channel(which)->data_read(); } - void data_write(int which, UINT8 data) { return get_channel(which)->data_write(data); } - - // control line access - void cts_w(int which, int state) { get_channel(which)->cts_w(state); } - void dcd_w(int which, int state) { get_channel(which)->dcd_w(state); } - void ri_w(int which, int state) { get_channel(which)->ri_w(state); } - void rxc_w(int which, int state) { get_channel(which)->rxc_w(state); } - void txc_w(int which, int state) { get_channel(which)->txc_w(state); } - void sync_w(int which, int state) { get_channel(which)->sync_w(state); } - required_device m_chanA; required_device m_chanB;