diff options
author | smf- <smf-@users.noreply.github.com> | 2014-02-21 09:51:59 +0000 |
---|---|---|
committer | smf- <smf-@users.noreply.github.com> | 2014-02-21 09:51:59 +0000 |
commit | ab02ed5e2d53f007be1ea38095760063cb0dc7eb (patch) | |
tree | f83594a869b72a2eeed070abb72b0b8cc56677ed | |
parent | c386707cc7c4e08d79dd7442968c7402ce58e818 (diff) |
Rewritten 6850 based on datasheet using external CLOCK & removed MIDI clock hacks. Standardised COM8116 DEVCB2 callbacks. GUS gf1_device device derives from acia6850_device to gain access to the tx & rx irq state, rather than exposing it with a public method. [smf]
82 files changed, 2351 insertions, 2419 deletions
diff --git a/.gitattributes b/.gitattributes index 36d254ebbe6..d97d886fb84 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1867,6 +1867,8 @@ src/emu/machine/cdp1871.c svneol=native#text/plain src/emu/machine/cdp1871.h svneol=native#text/plain src/emu/machine/cdu76s.c svneol=native#text/plain src/emu/machine/cdu76s.h svneol=native#text/plain +src/emu/machine/clock.c svneol=native#text/plain +src/emu/machine/clock.h svneol=native#text/plain src/emu/machine/com8116.c svneol=native#text/plain src/emu/machine/com8116.h svneol=native#text/plain src/emu/machine/cr589.c svneol=native#text/plain diff --git a/src/emu/bus/a2bus/a2midi.c b/src/emu/bus/a2bus/a2midi.c index 3b026667acd..199f10c6441 100644 --- a/src/emu/bus/a2bus/a2midi.c +++ b/src/emu/bus/a2bus/a2midi.c @@ -7,6 +7,7 @@ *********************************************************************/ #include "a2midi.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -33,15 +34,6 @@ static struct ptm6840_interface ptm_interface = DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_midi_device, ptm_irq_w) }; -static ACIA6850_INTERFACE( acia_interface ) -{ - 31250*16, // tx clock - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), // tx out - DEVCB_NULL, // rts out - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_midi_device, acia_irq_w) -}; - static SLOT_INTERFACE_START(midiin_slot) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END @@ -52,12 +44,18 @@ SLOT_INTERFACE_END MACHINE_CONFIG_FRAGMENT( midi ) MCFG_PTM6840_ADD(MIDI_PTM_TAG, ptm_interface) - MCFG_ACIA6850_ADD(MIDI_ACIA_TAG, acia_interface) + + MCFG_DEVICE_ADD(MIDI_ACIA_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(a2bus_midi_device, acia_irq_w)) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, a2bus_midi_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MIDI_ACIA_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(a2bus_midi_device, write_acia_clock)) MACHINE_CONFIG_END //------------------------------------------------- @@ -119,11 +117,11 @@ UINT8 a2bus_midi_device::read_c0nx(address_space &space, UINT8 offset) } else if (offset == 8) { - return m_acia->status_read(space, 0); + return m_acia->status_r(space, 0); } else if (offset == 9) { - UINT8 ret = m_acia->data_read(space, 0); + UINT8 ret = m_acia->data_r(space, 0); return ret; } @@ -142,18 +140,11 @@ void a2bus_midi_device::write_c0nx(address_space &space, UINT8 offset, UINT8 dat } else if (offset == 8) { - // HACK: GS/OS's CARD6850.MIDI driver sets 8-N-2, which is not valid MIDI. - // This works on h/w pretty much by accident; we'll make it right here. - if ((data & 0x1c) == 0x10) - { - data |= 0x04; // change wordbits from 0x10 to 0x14 - } - - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); } else if (offset == 9) { - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); } } @@ -185,12 +176,8 @@ WRITE_LINE_MEMBER( a2bus_midi_device::ptm_irq_w ) } } -WRITE_LINE_MEMBER( a2bus_midi_device::midi_rx_w ) +WRITE_LINE_MEMBER( a2bus_midi_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 16; i++) // divider is set to 16 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } diff --git a/src/emu/bus/a2bus/a2midi.h b/src/emu/bus/a2bus/a2midi.h index c46e2bb8665..2c7073b4c68 100644 --- a/src/emu/bus/a2bus/a2midi.h +++ b/src/emu/bus/a2bus/a2midi.h @@ -31,7 +31,7 @@ public: DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); DECLARE_WRITE_LINE_MEMBER( ptm_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); protected: virtual void device_start(); diff --git a/src/emu/bus/c64/midi_maplin.c b/src/emu/bus/c64/midi_maplin.c index df6830064c2..50887818c39 100644 --- a/src/emu/bus/c64/midi_maplin.c +++ b/src/emu/bus/c64/midi_maplin.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "midi_maplin.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -31,25 +32,11 @@ const device_type C64_MIDI_MAPLIN = &device_creator<c64_maplin_midi_cartridge_device>; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::acia_irq_w ) { m_slot->irq_w(state); } -static ACIA6850_INTERFACE( acia_intf ) -{ - 500000, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_maplin_midi_cartridge_device, acia_irq_w) -}; - - //------------------------------------------------- // SLOT_INTERFACE( midiin_slot ) //------------------------------------------------- @@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::midi_rx_w ) +WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 16; i++) // divider is set to 64 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } @@ -83,12 +66,17 @@ SLOT_INTERFACE_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_maplin_midi ) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_maplin_midi_cartridge_device, acia_irq_w)) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_maplin_midi_cartridge_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_maplin_midi_cartridge_device, write_acia_clock)) MACHINE_CONFIG_END @@ -151,11 +139,11 @@ UINT8 c64_maplin_midi_cartridge_device::c64_cd_r(address_space &space, offs_t of switch (offset & 0xff) { case 0: - data = m_acia->status_read(space, 0); + data = m_acia->status_r(space, 0); break; case 1: - data = m_acia->data_read(space, 0); + data = m_acia->data_r(space, 0); break; } } @@ -175,11 +163,11 @@ void c64_maplin_midi_cartridge_device::c64_cd_w(address_space &space, offs_t off switch (offset & 0xff) { case 0: - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); break; case 1: - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); break; } } diff --git a/src/emu/bus/c64/midi_maplin.h b/src/emu/bus/c64/midi_maplin.h index c9ddf94dbe4..27f7720e08e 100644 --- a/src/emu/bus/c64/midi_maplin.h +++ b/src/emu/bus/c64/midi_maplin.h @@ -26,7 +26,7 @@ // ======================> c64_maplin_midi_cartridge_device class c64_maplin_midi_cartridge_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface { public: // construction/destruction @@ -36,7 +36,7 @@ public: virtual machine_config_constructor device_mconfig_additions() const; DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); protected: // device-level overrides diff --git a/src/emu/bus/c64/midi_namesoft.c b/src/emu/bus/c64/midi_namesoft.c index aea458cbd5a..f594a415882 100644 --- a/src/emu/bus/c64/midi_namesoft.c +++ b/src/emu/bus/c64/midi_namesoft.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "midi_namesoft.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -31,25 +32,11 @@ const device_type C64_MIDI_NAMESOFT = &device_creator<c64_namesoft_midi_cartridge_device>; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::acia_irq_w ) { m_slot->nmi_w(state); } -static ACIA6850_INTERFACE( acia_intf ) -{ - 500000, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_namesoft_midi_cartridge_device, acia_irq_w) -}; - - //------------------------------------------------- // SLOT_INTERFACE( midiin_slot ) //------------------------------------------------- @@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::midi_rx_w ) +WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 16; i++) // divider is set to 16 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } @@ -83,12 +66,17 @@ SLOT_INTERFACE_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_passport_midi ) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_namesoft_midi_cartridge_device, acia_irq_w)) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_namesoft_midi_cartridge_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_namesoft_midi_cartridge_device, write_acia_clock)) MACHINE_CONFIG_END @@ -149,11 +137,11 @@ UINT8 c64_namesoft_midi_cartridge_device::c64_cd_r(address_space &space, offs_t switch (offset & 0xff) { case 2: - data = m_acia->status_read(space, 0); + data = m_acia->status_r(space, 0); break; case 3: - data = m_acia->data_read(space, 0); + data = m_acia->data_r(space, 0); break; } } @@ -173,11 +161,11 @@ void c64_namesoft_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o switch (offset & 0xff) { case 0: - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); break; case 1: - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); break; } } diff --git a/src/emu/bus/c64/midi_namesoft.h b/src/emu/bus/c64/midi_namesoft.h index 547fee0140a..65c42385b9a 100644 --- a/src/emu/bus/c64/midi_namesoft.h +++ b/src/emu/bus/c64/midi_namesoft.h @@ -26,7 +26,7 @@ // ======================> c64_namesoft_midi_cartridge_device class c64_namesoft_midi_cartridge_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface { public: // construction/destruction @@ -36,7 +36,8 @@ public: virtual machine_config_constructor device_mconfig_additions() const; DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); + protected: // device-level overrides virtual void device_start(); diff --git a/src/emu/bus/c64/midi_passport.c b/src/emu/bus/c64/midi_passport.c index e28b0182553..e31203093d7 100644 --- a/src/emu/bus/c64/midi_passport.c +++ b/src/emu/bus/c64/midi_passport.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "midi_passport.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -52,10 +53,6 @@ static const ptm6840_interface ptm_intf = }; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::acia_irq_w ) { m_acia_irq = state; @@ -63,16 +60,6 @@ WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::acia_irq_w ) m_slot->irq_w(m_ptm_irq || m_acia_irq); } -static ACIA6850_INTERFACE( acia_intf ) -{ - 500000, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_passport_midi_cartridge_device, acia_irq_w) -}; - - //------------------------------------------------- // SLOT_INTERFACE( midiin_slot ) //------------------------------------------------- @@ -81,14 +68,10 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::midi_rx_w ) +WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 16; i++) // divider is set to 16 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } @@ -106,13 +89,19 @@ SLOT_INTERFACE_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_passport_midi ) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_passport_midi_cartridge_device, acia_irq_w)) + MCFG_PTM6840_ADD(MC6840_TAG, ptm_intf) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_passport_midi_cartridge_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) /// TODO: work out if the clock should come from the 6840 + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_passport_midi_cartridge_device, write_acia_clock)) MACHINE_CONFIG_END @@ -186,11 +175,11 @@ UINT8 c64_passport_midi_cartridge_device::c64_cd_r(address_space &space, offs_t break; case 8: - data = m_acia->status_read(space, 0); + data = m_acia->status_r(space, 0); break; case 9: - data = m_acia->data_read(space, 0); + data = m_acia->data_r(space, 0); break; } } @@ -215,11 +204,11 @@ void c64_passport_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o break; case 8: - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); break; case 9: - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); break; case 0x30: diff --git a/src/emu/bus/c64/midi_passport.h b/src/emu/bus/c64/midi_passport.h index a126e97d56d..80dcc48d493 100644 --- a/src/emu/bus/c64/midi_passport.h +++ b/src/emu/bus/c64/midi_passport.h @@ -27,7 +27,7 @@ // ======================> c64_passport_midi_cartridge_device class c64_passport_midi_cartridge_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface { public: // construction/destruction @@ -38,7 +38,7 @@ public: DECLARE_WRITE_LINE_MEMBER( ptm_irq_w ); DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); protected: // device-level overrides diff --git a/src/emu/bus/c64/midi_sci.c b/src/emu/bus/c64/midi_sci.c index ef39829bfb7..b1fc4021496 100644 --- a/src/emu/bus/c64/midi_sci.c +++ b/src/emu/bus/c64/midi_sci.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "midi_sci.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -31,25 +32,11 @@ const device_type C64_MIDI_SCI = &device_creator<c64_sequential_midi_cartridge_device>; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::acia_irq_w ) { m_slot->irq_w(state); } -static ACIA6850_INTERFACE( acia_intf ) -{ - 500000, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_sequential_midi_cartridge_device, acia_irq_w) -}; - - //------------------------------------------------- // SLOT_INTERFACE( midiin_slot ) //------------------------------------------------- @@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::midi_rx_w ) +WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 16; i++) // divider is set to 16 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } @@ -83,12 +66,17 @@ SLOT_INTERFACE_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_sequential_midi ) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_sequential_midi_cartridge_device, acia_irq_w)) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_sequential_midi_cartridge_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_sequential_midi_cartridge_device, write_acia_clock)) MACHINE_CONFIG_END @@ -150,11 +138,11 @@ UINT8 c64_sequential_midi_cartridge_device::c64_cd_r(address_space &space, offs_ switch (offset & 0xff) { case 2: - data = m_acia->status_read(space, 0); + data = m_acia->status_r(space, 0); break; case 3: - data = m_acia->data_read(space, 0); + data = m_acia->data_r(space, 0); break; } } @@ -174,11 +162,11 @@ void c64_sequential_midi_cartridge_device::c64_cd_w(address_space &space, offs_t switch (offset & 0xff) { case 0: - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); break; case 1: - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); break; } } diff --git a/src/emu/bus/c64/midi_sci.h b/src/emu/bus/c64/midi_sci.h index 1f5010ff3c6..e284cf61097 100644 --- a/src/emu/bus/c64/midi_sci.h +++ b/src/emu/bus/c64/midi_sci.h @@ -26,7 +26,7 @@ // ======================> c64_sequential_midi_cartridge_device class c64_sequential_midi_cartridge_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface { public: // construction/destruction @@ -36,7 +36,7 @@ public: virtual machine_config_constructor device_mconfig_additions() const; DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); protected: // device-level overrides diff --git a/src/emu/bus/c64/midi_siel.c b/src/emu/bus/c64/midi_siel.c index 7acda555651..61af7677ded 100644 --- a/src/emu/bus/c64/midi_siel.c +++ b/src/emu/bus/c64/midi_siel.c @@ -10,6 +10,7 @@ **********************************************************************/ #include "midi_siel.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -31,25 +32,11 @@ const device_type C64_MIDI_SIEL = &device_creator<c64_siel_midi_cartridge_device>; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::acia_irq_w ) { m_slot->irq_w(state); } -static ACIA6850_INTERFACE( acia_intf ) -{ - XTAL_2MHz, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_siel_midi_cartridge_device, acia_irq_w) -}; - - //------------------------------------------------- // SLOT_INTERFACE( midiin_slot ) //------------------------------------------------- @@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::midi_rx_w ) +WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::write_acia_clock ) { - m_acia->write_rx(state); - - for (int i = 0; i < 64; i++) // divider is set to 64 - { - m_acia->rx_clock_in(); - } + m_acia->write_txc(state); + m_acia->write_rxc(state); } @@ -83,12 +66,17 @@ SLOT_INTERFACE_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_siel_midi ) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_siel_midi_cartridge_device, acia_irq_w)) MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_siel_midi_cartridge_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_siel_midi_cartridge_device, write_acia_clock)) MACHINE_CONFIG_END @@ -151,11 +139,11 @@ UINT8 c64_siel_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offs switch (offset & 0xff) { case 6: - data = m_acia->status_read(space, 0); + data = m_acia->status_r(space, 0); break; case 7: - data = m_acia->data_read(space, 0); + data = m_acia->data_r(space, 0); break; } } @@ -175,11 +163,11 @@ void c64_siel_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offse switch (offset & 0xff) { case 4: - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); break; case 5: - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); break; } } diff --git a/src/emu/bus/c64/midi_siel.h b/src/emu/bus/c64/midi_siel.h index a4682c488b9..fde6c048afd 100644 --- a/src/emu/bus/c64/midi_siel.h +++ b/src/emu/bus/c64/midi_siel.h @@ -26,7 +26,7 @@ // ======================> c64_siel_midi_cartridge_device class c64_siel_midi_cartridge_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface { public: // construction/destruction @@ -36,7 +36,7 @@ public: virtual machine_config_constructor device_mconfig_additions() const; DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); protected: // device-level overrides diff --git a/src/emu/bus/cbmiec/interpod.c b/src/emu/bus/cbmiec/interpod.c index 21cc334939c..a41770e8588 100644 --- a/src/emu/bus/cbmiec/interpod.c +++ b/src/emu/bus/cbmiec/interpod.c @@ -114,8 +114,8 @@ const rom_entry *interpod_device::device_rom_region() const static ADDRESS_MAP_START( interpod_mem, AS_PROGRAM, 8, interpod_device ) AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x3b80) AM_RAM // 6532 AM_RANGE(0x0400, 0x041f) AM_MIRROR(0x3be0) AM_DEVREADWRITE(R6532_TAG, riot6532_device, read, write) - AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_read, control_write) - AM_RANGE(0x2001, 0x2001) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_read, data_write) + AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_r, control_w) + AM_RANGE(0x2001, 0x2001) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_r, data_w) AM_RANGE(0x4000, 0x47ff) AM_MIRROR(0xb800) AM_ROM AM_REGION(R6502_TAG, 0) AM_RANGE(0x8000, 0x800f) AM_MIRROR(0x5ff0) AM_DEVREADWRITE(R6522_TAG, via6522_device, read, write) ADDRESS_MAP_END @@ -136,20 +136,6 @@ static const riot6532_interface riot_intf = //------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - -static ACIA6850_INTERFACE( acia_intf ) -{ - 0, - 0, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - - -//------------------------------------------------- // MACHINE_DRIVER( interpod ) //------------------------------------------------- @@ -159,7 +145,7 @@ static MACHINE_CONFIG_FRAGMENT( interpod ) MCFG_DEVICE_ADD(R6522_TAG, VIA6522, 1000000) MCFG_RIOT6532_ADD(R6532_TAG, 1000000, riot_intf) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) MCFG_CBM_IEEE488_ADD(NULL) MACHINE_CONFIG_END diff --git a/src/emu/bus/ieee488/softbox.c b/src/emu/bus/ieee488/softbox.c index e71b3cd16fa..f2d419e2e9a 100644 --- a/src/emu/bus/ieee488/softbox.c +++ b/src/emu/bus/ieee488/softbox.c @@ -277,7 +277,11 @@ static MACHINE_CONFIG_FRAGMENT( softbox ) MCFG_I8255A_ADD(I8255_0_TAG, ppi0_intf) MCFG_I8255A_ADD(I8255_1_TAG, ppi1_intf) - MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE(I8251_TAG, i8251_device, write_rxc), DEVWRITELINE(I8251_TAG, i8251_device, write_txc)) + + MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_rxc)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_txc)) + MCFG_HARDDISK_ADD("harddisk1") MCFG_HARDDISK_ADD("harddisk2") MCFG_HARDDISK_ADD("harddisk3") diff --git a/src/emu/bus/s100/dj2db.c b/src/emu/bus/s100/dj2db.c index 508b4bfda96..1109457cefc 100644 --- a/src/emu/bus/s100/dj2db.c +++ b/src/emu/bus/s100/dj2db.c @@ -109,7 +109,9 @@ void s100_dj2db_device::fdc_drq_w(bool state) //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( s100_dj2db ) - MCFG_COM8116_ADD(BR1941_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE(DEVICE_SELF, s100_dj2db_device, fr_w), NULL) + MCFG_DEVICE_ADD(BR1941_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(s100_dj2db_device, fr_w)) + MCFG_MB8866x_ADD(MB8866_TAG, XTAL_10MHz/5) MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":0", s100_dj2db_floppies, "8dsdd", floppy_image_device::default_floppy_formats) diff --git a/src/emu/emu.mak b/src/emu/emu.mak index 8b2abe052b3..8f147ce06c7 100644 --- a/src/emu/emu.mak +++ b/src/emu/emu.mak @@ -192,6 +192,7 @@ EMUDRIVEROBJS = \ EMUMACHINEOBJS = \ $(EMUMACHINE)/bcreader.o \ $(EMUMACHINE)/buffer.o \ + $(EMUMACHINE)/clock.o \ $(EMUMACHINE)/generic.o \ $(EMUMACHINE)/keyboard.o \ $(EMUMACHINE)/laserdsc.o \ diff --git a/src/emu/machine/6850acia.c b/src/emu/machine/6850acia.c index 24dd36b7cb0..f38bcb90a0e 100644 --- a/src/emu/machine/6850acia.c +++ b/src/emu/machine/6850acia.c @@ -16,35 +16,39 @@ #define LOG 0 -#define CR1_0 0x03 -#define CR4_2 0x1C -#define CR6_5 0x60 -#define CR7 0x80 - -#define TXD(_data) \ - m_out_tx_func(_data) - -#define RTS(_data) \ - m_out_rts_func(_data) - /*************************************************************************** LOCAL VARIABLES ***************************************************************************/ -const int acia6850_device::ACIA6850_DIVIDE[3] = { 1, 16, 64 }; +const int acia6850_device::counter_divide_select[4] = +{ + 1, + 16, + 64, + 0 +}; -const int acia6850_device::ACIA6850_WORD[8][3] = +const int acia6850_device::word_select[8][3] = { - { 7, EVEN, 2 }, - { 7, ODD, 2 }, - { 7, EVEN, 1 }, - { 7, ODD, 1 }, - { 8, NONE, 2 }, - { 8, NONE, 1 }, - { 8, EVEN, 1 }, - { 8, ODD, 1 } + // word length, parity, stop bits + { 7+1, EVEN, 2 }, + { 7+1, ODD, 2 }, + { 7+1, EVEN, 1 }, + { 7+1, ODD, 1 }, + { 8, NONE, 2 }, + { 8, NONE, 1 }, + { 8+1, EVEN, 1 }, + { 8+1, ODD, 1 } }; +const int acia6850_device::transmitter_control[4][3] = +{ + // rts, brk, tx irq + { 0, 0, 0 }, + { 0, 0, 1 }, + { 1, 0, 0 }, + { 0, 1, 0 } +}; /*************************************************************************** @@ -60,26 +64,48 @@ const device_type ACIA6850 = &device_creator<acia6850_device>; acia6850_device::acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, ACIA6850, "6850 ACIA", tag, owner, clock, "acia6850", __FILE__), - m_rxd(0), + m_txd_handler(*this), + m_rts_handler(*this), + m_irq_handler(*this), + m_status(ACIA6850_STATUS_TDRE), + m_first_master_reset(true), + m_dcd_irq_pending(false), + m_overrun_pending(false), + m_divide(0), + m_rts(0), m_dcd(0), - m_cts(0) + m_irq(0), + m_txc(0), + m_txd(0), + m_tx_irq_enable(false), + m_rxc(0), + m_rxd(1), + m_rx_irq_enable(false) { - memset(static_cast<acia6850_interface *>(this), 0, sizeof(acia6850_interface)); } - -//------------------------------------------------- -// static_set_interface - set the interface -// struct -//------------------------------------------------- - -void acia6850_device::static_set_interface(device_t &device, const acia6850_interface &interface) +acia6850_device::acia6850_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source), + m_txd_handler(*this), + m_rts_handler(*this), + m_irq_handler(*this), + m_status(ACIA6850_STATUS_TDRE), + m_first_master_reset(true), + m_dcd_irq_pending(false), + m_overrun_pending(false), + m_divide(0), + m_rts(0), + m_dcd(0), + m_irq(0), + m_txc(0), + m_txd(0), + m_tx_irq_enable(false), + m_rxc(0), + m_rxd(1), + m_rx_irq_enable(false) { - acia6850_device &ptm = downcast<acia6850_device &>(device); - static_cast<acia6850_interface &>(ptm) = interface; } - //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -87,681 +113,476 @@ void acia6850_device::static_set_interface(device_t &device, const acia6850_inte void acia6850_device::device_start() { // resolve callbacks - m_out_tx_func.resolve(m_out_tx_cb, *this); - m_out_rts_func.resolve(m_out_rts_cb, *this); - m_out_irq_func.resolve(m_out_irq_cb, *this); - - m_tx_counter = 0; - m_rx_counter = 0; - m_rx_timer = timer_alloc(TIMER_ID_RECEIVE); - m_tx_timer = timer_alloc(TIMER_ID_TRANSMIT); - m_first_reset = 1; - m_status_read = 0; - m_brk = 0; - - m_rx_timer->reset(); - m_tx_timer->reset(); - - save_item(NAME(m_ctrl)); + m_txd_handler.resolve_safe(); + m_rts_handler.resolve_safe(); + m_irq_handler.resolve_safe(); + save_item(NAME(m_status)); - save_item(NAME(m_rx_clock)); - save_item(NAME(m_tx_clock)); - save_item(NAME(m_rx_counter)); - save_item(NAME(m_tx_counter)); - save_item(NAME(m_rx_shift)); - save_item(NAME(m_tx_shift)); - save_item(NAME(m_rdr)); save_item(NAME(m_tdr)); - save_item(NAME(m_rx_bits)); - save_item(NAME(m_tx_bits)); - save_item(NAME(m_rx_parity)); - save_item(NAME(m_tx_parity)); - save_item(NAME(m_tx_int)); + save_item(NAME(m_rdr)); + + save_item(NAME(m_first_master_reset)); + save_item(NAME(m_dcd_irq_pending)); + save_item(NAME(m_overrun_pending)); save_item(NAME(m_divide)); - save_item(NAME(m_overrun)); - save_item(NAME(m_reset)); - save_item(NAME(m_first_reset)); - save_item(NAME(m_rts)); + save_item(NAME(m_bits)); + save_item(NAME(m_stopbits)); + save_item(NAME(m_parity)); save_item(NAME(m_brk)); - save_item(NAME(m_rxd)); - save_item(NAME(m_dcd)); - save_item(NAME(m_cts)); - save_item(NAME(m_status_read)); - save_item(NAME(m_dcd_triggered)); -} - - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void acia6850_device::device_reset() -{ - m_status = (m_cts << 3) | (m_dcd << 2) | ACIA6850_STATUS_TDRE; - m_tdr = 0; - m_rdr = 0; - m_tx_shift = 0; - m_rx_shift = 0; - m_tx_counter = 0; - m_rx_counter = 0; - - m_divide = 0; - - TXD(1); - m_overrun = 0; - m_reset = 0; - m_status_read = 0; - m_brk = 0; - - m_rx_state = START; - m_tx_state = START; - m_irq = 0; - m_rts = 0; - m_ctrl = 0; - - m_bits = 0; - m_tx_int = 0; - m_dcd_triggered = false; - - m_out_irq_func(CLEAR_LINE); - - if (m_first_reset) - { - m_first_reset = 0; - RTS(1); - } - else - { - RTS(m_rts); - } -} - -DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_rx ) -{ - m_rxd = state; -} - -DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_dcd ) -{ - m_dcd = state; -} + save_item(NAME(m_rts)); + save_item(NAME(m_dcd)); + save_item(NAME(m_irq)); -DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_cts ) -{ - m_cts = state; -} + save_item(NAME(m_txc)); + save_item(NAME(m_txd)); + save_item(NAME(m_tx_state)); + save_item(NAME(m_tx_bits)); + save_item(NAME(m_tx_shift)); + save_item(NAME(m_tx_parity)); + save_item(NAME(m_tx_counter)); + save_item(NAME(m_tx_irq_enable)); -//------------------------------------------------- -// device_timer - handle timer callbacks -//------------------------------------------------- + save_item(NAME(m_rxc)); + save_item(NAME(m_rxd)); + save_item(NAME(m_rx_state)); + save_item(NAME(m_rx_bits)); + save_item(NAME(m_rx_shift)); + save_item(NAME(m_rx_parity)); + save_item(NAME(m_rx_counter)); + save_item(NAME(m_rx_irq_enable)); -void acia6850_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_ID_TRANSMIT: - tx_tick(); - m_tx_counter = 0; - break; - - case TIMER_ID_RECEIVE: - rx_tick(); - m_rx_counter = 0; - break; - } + output_txd(1); + output_rts(1); + output_irq(1); } - -//------------------------------------------------- -// acia6850_stat_r - Read Status Register -//------------------------------------------------- - -READ8_MEMBER( acia6850_device::status_read ) +READ8_MEMBER( acia6850_device::status_r ) { - UINT8 status; - - m_status_read = 1; - status = m_status; + UINT8 status = m_status; if (status & ACIA6850_STATUS_CTS) { status &= ~ACIA6850_STATUS_TDRE; } - return status; -} - - -//------------------------------------------------- -// Handle DCD input changes -//------------------------------------------------- - -void acia6850_device::check_dcd_input() -{ - if (m_dcd) - { - // IRQ from DCD is edge triggered - if ( ! ( m_status & ACIA6850_STATUS_DCD ) ) - { - m_status |= ACIA6850_STATUS_DCD; - m_dcd_triggered = true; - - // Asserting DCD clears RDRF - m_status &= ~ACIA6850_STATUS_RDRF; - - check_interrupts(); - } - } - else if ((m_status & (ACIA6850_STATUS_DCD | ACIA6850_STATUS_IRQ)) == ACIA6850_STATUS_DCD) + if (m_dcd_irq_pending == DCD_IRQ_READ_STATUS) { - m_status &= ~ACIA6850_STATUS_DCD; + m_dcd_irq_pending = DCD_IRQ_READ_DATA; } -} - -//------------------------------------------------- -// control_write - Write Control Register -//------------------------------------------------- + return status; +} -WRITE8_MEMBER( acia6850_device::control_write ) +WRITE8_MEMBER( acia6850_device::control_w ) { if (LOG) logerror("MC6850 '%s' Control: %02x\n", tag(), data); - // Counter Divide Select Bits + // CR0 and CR1 + int counter_divide_select_bits = (data >> 0) & 3; + m_divide = counter_divide_select[counter_divide_select_bits]; - int divide = data & CR1_0; - - if (divide == 3) - { - m_reset = 1; - device_reset(); - } - else - { - m_reset = 0; - m_divide = ACIA6850_DIVIDE[divide]; - } + // CR2, CR3 and CR4 + int word_select_bits = (data >> 2) & 7; + m_bits = word_select[word_select_bits][0]; + m_parity = word_select[word_select_bits][1]; + m_stopbits = word_select[word_select_bits][2]; - // Word Select Bits + // CR5 & CR6 + int transmitter_control_bits = (data >> 5) & 3; + int rts = transmitter_control[transmitter_control_bits][0]; + m_brk = transmitter_control[transmitter_control_bits][1]; + m_tx_irq_enable = transmitter_control[transmitter_control_bits][2]; - int wordsel = (data & CR4_2) >> 2; + // Receive Interrupt Enable Bit (CR7) + m_rx_irq_enable = (data >> 7) & 1; - m_bits = ACIA6850_WORD[wordsel][0]; - m_parity = (parity_type)ACIA6850_WORD[wordsel][1]; - m_stopbits = ACIA6850_WORD[wordsel][2]; - - // Transmitter Control Bits - - switch ((data & CR6_5) >> 5) + if (m_divide == 0) { - case 0: - m_rts = 0; - RTS(m_rts); - - m_tx_int = 0; - m_brk = 0; - break; - - case 1: - m_rts = 0; - RTS(m_rts); - - m_tx_int = 1; - m_brk = 0; - break; - - case 2: - m_rts = 1; - RTS(m_rts); + if (m_first_master_reset) + { + /// TODO: find out whether you need to leave master reset before it stops counting as the first + rts = 1; + m_first_master_reset = false; + } - m_tx_int = 0; - m_brk = 0; - break; + m_dcd_irq_pending = DCD_IRQ_NONE; + m_overrun_pending = false; - case 3: - m_rts = 0; - RTS(m_rts); + m_rx_state = START; + m_rx_counter = 0; - m_tx_int = 0; - m_brk = 1; - break; - } + m_tx_state = START; + output_txd(1); - check_interrupts(); + m_status &= ACIA6850_STATUS_CTS; - // After writing the word type, set the rx/tx clocks (provided the divide values have changed) + /// TODO: find out if this should be set as data sheet says status is cleared apart from cts & dcd + m_status |= ACIA6850_STATUS_TDRE; - if ((m_ctrl ^ data) & CR1_0) - { - if (!m_reset) + if (m_dcd) { - if (m_rx_clock) - { - attotime rx_period = attotime::from_hz(m_rx_clock) * m_divide; - m_rx_timer->adjust(rx_period, 0, rx_period); - } - - if (m_tx_clock) - { - attotime tx_period = attotime::from_hz(m_tx_clock) * m_divide; - m_tx_timer->adjust(tx_period, 0, tx_period); - } + m_status |= ACIA6850_STATUS_DCD; } } - m_ctrl = data; -} - -//------------------------------------------------- -// check_interrupts -//------------------------------------------------- + output_rts(rts); -void acia6850_device::check_interrupts() -{ - int irq = (m_tx_int && (m_status & ACIA6850_STATUS_TDRE) && (~m_status & ACIA6850_STATUS_CTS)) || - ((m_ctrl & 0x80) && (((m_status & ACIA6850_STATUS_RDRF) || m_dcd_triggered) || m_overrun)); + update_irq(); +} - if (irq != m_irq) - { - m_irq = irq; - if (irq) - { - m_status |= ACIA6850_STATUS_IRQ; - m_out_irq_func(ASSERT_LINE); - } - else - { - m_status &= ~ACIA6850_STATUS_IRQ; - m_out_irq_func(CLEAR_LINE); - } - } - m_dcd_triggered = false; +int acia6850_device::calculate_txirq() +{ + return !(m_tx_irq_enable && ((m_status & ACIA6850_STATUS_TDRE) && !(m_status & ACIA6850_STATUS_CTS))); } +int acia6850_device::calculate_rxirq() +{ + return !(m_rx_irq_enable && ((m_status & ACIA6850_STATUS_RDRF) || m_dcd_irq_pending != DCD_IRQ_NONE)); +} -//------------------------------------------------- -// data_write - Write transmit register -//------------------------------------------------- +void acia6850_device::update_irq() +{ + output_irq(calculate_txirq() && calculate_rxirq()); +} -WRITE8_MEMBER( acia6850_device::data_write ) +WRITE8_MEMBER( acia6850_device::data_w ) { if (LOG) logerror("MC6850 '%s' Data: %02x\n", tag(), data); - if (!m_reset) - { - m_tdr = data; - m_status &= ~ACIA6850_STATUS_TDRE; - check_interrupts(); - } - else + /// TODO: find out if data stored during master reset is sent after divider is set + if (m_divide == 0) { logerror("%s:ACIA %p: Data write while in reset!\n", machine().describe_context(), this); } -} + /// TODO: find out what happens if TDRE is already clear when you write + m_tdr = data; + m_status &= ~ACIA6850_STATUS_TDRE; -//------------------------------------------------- -// data_r - Read character -//------------------------------------------------- + update_irq(); +} -READ8_MEMBER( acia6850_device::data_read ) +READ8_MEMBER( acia6850_device::data_r ) { - m_status &= ~(ACIA6850_STATUS_RDRF | ACIA6850_STATUS_IRQ | ACIA6850_STATUS_PE); - - if (m_status_read) + if (m_overrun_pending) + { + m_status |= ACIA6850_STATUS_OVRN; + m_overrun_pending = false; + } + else { - m_status_read = 0; - m_status &= ~ACIA6850_STATUS_OVRN; - - check_dcd_input(); + m_status &= ~ACIA6850_STATUS_RDRF; } - if (m_overrun == 1) + if (m_dcd_irq_pending == DCD_IRQ_READ_DATA) { - m_status |= ACIA6850_STATUS_OVRN; - m_overrun = 0; + m_dcd_irq_pending = DCD_IRQ_NONE; } - check_interrupts(); + update_irq(); return m_rdr; } +DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_cts ) +{ + if (state) + { + m_status |= ACIA6850_STATUS_CTS; + } + else + { + m_status &= ~ACIA6850_STATUS_CTS; + } +} -//------------------------------------------------- -// tx_tick - Transmit a bit -//------------------------------------------------- +DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_dcd ) +{ + m_dcd = state; +} -void acia6850_device::tx_tick() +WRITE_LINE_MEMBER( acia6850_device::write_rxc ) { - switch (m_tx_state) + if (m_rxc != state) { - case START: + m_rxc = state; + + if (state && m_divide > 0) { - if (m_brk) + if (m_dcd) { - // transmit break + if (!(m_status & ACIA6850_STATUS_DCD)) + { + m_status |= ACIA6850_STATUS_DCD; + m_dcd_irq_pending = DCD_IRQ_READ_STATUS; + } - TXD(0); + m_rx_state = START; + m_rx_counter = 0; } else { - if (m_cts) + if (m_dcd_irq_pending == DCD_IRQ_NONE) { - m_status |= ACIA6850_STATUS_CTS; + m_status &= ~ACIA6850_STATUS_DCD; } - else - { - m_status &= ~ACIA6850_STATUS_CTS; - } - - check_interrupts(); + + m_rx_counter++; - if (m_status & ACIA6850_STATUS_TDRE) - { - // transmitter idle - TXD(1); - } - else + switch (m_rx_state) { - // transmit character + case START: + if (m_rxd == 0) + { + if (m_rx_counter == 1) + { + if (LOG) logerror("MC6850 '%s': RX START BIT\n", tag()); + } - if (LOG) logerror("MC6850 '%s': TX DATA %x\n", tag(), m_tdr); - if (LOG) logerror("MC6850 '%s': TX START BIT\n", tag()); + if (m_rx_counter >= m_divide / 2) + { + m_rx_state = DATA; + m_rx_counter = 0; + m_rx_shift = 0; + m_rx_parity = 0; + m_rx_bits = 0; + } + } + else + { + m_rx_counter = 0; - TXD(0); + if (LOG) logerror("MC6850 '%s': RX FALSE START BIT\n", tag()); + } + break; - m_tx_bits = m_bits; - m_tx_shift = m_tdr; - m_tx_parity = 0; - m_tx_state = DATA; - } - } - break; - } - case DATA: - { - int val = m_tx_shift & 1; - if (LOG) logerror("MC6850 '%s': TX DATA BIT %x\n", tag(), val); + case DATA: + if (m_rx_counter == m_divide) + { + m_rx_counter = 0; + m_rx_bits++; - TXD(val); - m_tx_parity ^= val; - m_tx_shift >>= 1; + if (m_rx_bits != m_bits || m_parity == NONE) + { + if (LOG) logerror("MC6850 '%s': RX DATA BIT %d %d\n", tag(), m_rx_bits - 1, m_rxd); + } + else + { + if (LOG) logerror("MC6850 '%s': RX PARITY BIT %x\n", tag(), m_rxd); + } - if (--(m_tx_bits) == 0) - { - m_tx_state = (m_parity == NONE) ? STOP : PARITY; - } + if (m_rxd) + { + m_rx_shift |= 1 << m_bits; + } - break; - } - case PARITY: - { - int parity = 0; + m_rx_shift >>= 1; - if (m_parity == EVEN) - { - parity = (m_tx_parity & 1) ? 1 : 0; - } - else - { - parity = (m_tx_parity & 1) ? 0 : 1; - } + m_rx_parity ^= m_rxd; - TXD(parity); + if (m_rx_bits == m_bits) + { + if (m_status & ACIA6850_STATUS_RDRF) + { + m_overrun_pending = true; + } + else + { + /// TODO: find out if this is the correct place to calculate parity + if (m_parity == ODD) + { + m_rx_parity = !m_rx_parity; + } + + if (m_parity != NONE && !m_rx_parity) + { + m_status |= ACIA6850_STATUS_PE; + } + else + { + m_status &= ~ACIA6850_STATUS_PE; + } + + m_rdr = m_rx_shift; + + if (m_bits == 8 && m_parity != NONE) + { + m_rdr &= 0x7f; + } + + m_status |= ACIA6850_STATUS_RDRF; + } + + m_rx_state = STOP; + } + } + break; - if (LOG) logerror("MC6850 '%s': TX PARITY BIT %x\n", tag(), parity); - m_tx_state = STOP; - break; - } - case STOP: - { - if (LOG) logerror("MC6850 '%s': TX STOP BIT\n", tag()); - TXD(1); + case STOP: + if (m_rx_counter == m_divide) + { + m_rx_counter = 0; - if (m_stopbits == 1) - { - m_tx_state = START; - m_status |= ACIA6850_STATUS_TDRE; - } - else - { - m_tx_state = STOP2; + if (LOG) logerror("MC6850 '%s': RX STOP BIT\n", tag()); + + if (m_rxd != 0) + { + m_status |= ACIA6850_STATUS_FE; + } + else + { + m_status &= ~ACIA6850_STATUS_FE; + } + + /// TODO: find out if 6850 only waits for 1 STOP bit when receiving + m_rx_state = START; + } + break; + } } - break; - } - case STOP2: - { - if (LOG) logerror("MC6850 '%s': TX STOP BIT\n", tag()); - TXD(1); - m_tx_state = START; - m_status |= ACIA6850_STATUS_TDRE; - break; + + update_irq(); } } } - -//------------------------------------------------- -// tx_clock_in - As above, but using the tx pin -//------------------------------------------------- - -void acia6850_device::tx_clock_in() +DECLARE_WRITE_LINE_MEMBER( acia6850_device::write_rxd ) { - if (m_cts) - { - m_status |= ACIA6850_STATUS_CTS; - } - else - { - m_status &= ~ACIA6850_STATUS_CTS; - } - - m_tx_counter ++; - - if ( m_tx_counter > m_divide - 1) - { - tx_tick(); - m_tx_counter = 0; - } - + m_rxd = state; } - -//------------------------------------------------- -// rx_tick - Receive a bit -//------------------------------------------------- - -void acia6850_device::rx_tick() +WRITE_LINE_MEMBER( acia6850_device::write_txc ) { - check_dcd_input(); - - if (m_status & ACIA6850_STATUS_DCD) + if (m_txc != state) { - m_rx_state = START; - } - else - { - switch (m_rx_state) + m_txc = state; + + if (!state && m_divide > 0) { - case START: - { - if (m_rxd == 0) - { - if (LOG) logerror("MC6850 '%s': RX START BIT\n", tag()); - m_rx_shift = 0; - m_rx_parity = 0; - m_rx_bits = m_bits; - m_rx_state = DATA; - } - break; - } - case DATA: + m_tx_counter++; + + /// TODO: check txd is correctly generated, check atarist mcu is reading data, start checking receive data. + switch (m_tx_state) { - if (LOG) logerror("MC6850 '%s': RX DATA BIT %x\n", tag(), m_rxd); - m_rx_shift |= m_rxd ? 0x80 : 0; - m_rx_parity ^= m_rxd; + case START: + m_tx_counter = 0; - if (--m_rx_bits == 0) + if (!(m_status & ACIA6850_STATUS_TDRE) && !(m_status & ACIA6850_STATUS_CTS)) { - if (m_status & ACIA6850_STATUS_RDRF) - { - m_overrun = 1; - check_interrupts(); - } + if (LOG) logerror("MC6850 '%s': TX DATA %x\n", tag(), m_tdr); - m_rx_state = m_parity == NONE ? STOP : PARITY; + m_tx_state = DATA; + m_tx_shift = m_tdr; + m_tx_bits = 0; + m_tx_parity = 0; + m_status |= ACIA6850_STATUS_TDRE; + + if (LOG) logerror("MC6850 '%s': TX START BIT\n", tag()); + + output_txd(0); } else { - m_rx_shift >>= 1; + /// TODO: find out if break stops transmitter + output_txd(!m_brk); } break; - } - case PARITY: - { - if (LOG) logerror("MC6850 '%s': RX PARITY BIT %x\n", tag(), m_rxd); - m_rx_parity ^= m_rxd; - if (m_parity == EVEN) - { - if (m_rx_parity) - { - m_status |= ACIA6850_STATUS_PE; - } - } - else + case DATA: + if (m_tx_counter == m_divide) { - if (!m_rx_parity) - { - m_status |= ACIA6850_STATUS_PE; - } - } + m_tx_counter = 0; + m_tx_bits++; - m_rx_state = STOP; - break; - } - case STOP: - { - if (m_rxd == 1) - { - if (LOG) logerror("MC6850 '%s': RX STOP BIT\n", tag()); - if (m_stopbits == 1) + if (m_tx_bits != m_bits || m_parity == NONE) { - m_status &= ~ACIA6850_STATUS_FE; + output_txd(m_tx_shift & 1); + m_tx_parity ^= m_txd; + m_tx_shift >>= 1; - if (!(m_status & ACIA6850_STATUS_RDRF)) + if (LOG) logerror("MC6850 '%s': TX DATA BIT %d %d\n", tag(), m_tx_bits, m_txd); + } + else + { + /// TODO: find out if this is the correct place to calculate parity + if (m_parity == ODD) { - if (LOG) logerror("MC6850 '%s': RX DATA %x\n", tag(), m_rx_shift); - m_rdr = m_rx_shift; - m_status |= ACIA6850_STATUS_RDRF; - check_interrupts(); + m_tx_parity = !m_tx_parity; } - m_rx_state = START; + output_txd(m_tx_parity); + + if (LOG) logerror("MC6850 '%s': TX PARITY BIT %d\n", tag(), m_txd); } - else + + if (m_tx_bits == m_bits) { - m_rx_state = STOP2; + m_tx_state = STOP; + m_tx_bits = 0; } } - else - { - m_status |= ACIA6850_STATUS_FE; - m_rx_state = START; - } break; - } - case STOP2: - { - if (m_rxd == 1) + + case STOP: + if (m_tx_counter == m_divide) { - if (LOG) logerror("MC6850 '%s': RX STOP BIT\n", tag()); - m_status &= ~ACIA6850_STATUS_FE; + m_tx_bits++; - if (!(m_status & ACIA6850_STATUS_RDRF)) + if (LOG) logerror("MC6850 '%s': TX STOP BIT %d\n", tag(), m_tx_bits); + + output_txd(1); + + if (m_tx_bits == m_stopbits) { - if (LOG) logerror("MC6850 '%s': RX DATA %x\n", tag(), m_rx_shift); - m_rdr = m_rx_shift; - m_status |= ACIA6850_STATUS_RDRF; - check_interrupts(); + m_tx_state = START; } - - m_rx_state = START; - } - else - { - m_status |= ACIA6850_STATUS_FE; - m_rx_state = START; } break; } } + + update_irq(); } } - -//------------------------------------------------- -// rx_clock_in - As above, but using the rx pin -//------------------------------------------------- - -void acia6850_device::rx_clock_in() +void acia6850_device::output_txd(int txd) { - check_dcd_input(); - - m_rx_counter ++; - - if ( m_rx_counter > m_divide - 1) + if (m_txd != txd) { - rx_tick(); - m_rx_counter = 0; + m_txd = txd; + + m_txd_handler(m_txd); } } - -//------------------------------------------------- -// set_rx_clock - set receiver clock -//------------------------------------------------- - -void acia6850_device::set_rx_clock(int clock) +void acia6850_device::output_rts(int rts) { - m_rx_clock = clock; - - if (m_rx_clock) + if (m_rts != rts) { - attotime rx_period = attotime::from_hz(m_rx_clock) * m_divide; - m_rx_timer->adjust(rx_period, 0, rx_period); + m_rts = rts; + m_rts_handler(m_rts); } } - -//------------------------------------------------- -// set_tx_clock - set receiver clock -//------------------------------------------------- - -void acia6850_device::set_tx_clock(int clock) +void acia6850_device::output_irq(int irq) { - m_tx_clock = clock; - - if (m_tx_clock) + if (m_irq != irq) { - attotime tx_period = attotime::from_hz(m_tx_clock) * m_divide; - m_tx_timer->adjust(tx_period, 0, tx_period); - } -} - + m_irq = irq; -//------------------------------------------------- -// receive_data - receive data byte -//------------------------------------------------- + if (irq) + { + m_status &= ~ACIA6850_STATUS_IRQ; + } + else + { + m_status |= ACIA6850_STATUS_IRQ; + } -void acia6850_device::receive_data(UINT8 data) -{ - m_rdr = data; - m_status |= ACIA6850_STATUS_RDRF; - check_interrupts(); + m_irq_handler(!m_irq); + } } diff --git a/src/emu/machine/6850acia.h b/src/emu/machine/6850acia.h index 07853c13972..14e19da647d 100644 --- a/src/emu/machine/6850acia.h +++ b/src/emu/machine/6850acia.h @@ -13,114 +13,70 @@ #include "emu.h" +#define MCFG_ACIA6850_TXD_HANDLER(_devcb) \ + devcb = &acia6850_device::set_txd_handler(*device, DEVCB2_##_devcb); +#define MCFG_ACIA6850_RTS_HANDLER(_devcb) \ + devcb = &acia6850_device::set_rts_handler(*device, DEVCB2_##_devcb); -/*************************************************************************** - EXTERNAL MACROS -***************************************************************************/ +#define MCFG_ACIA6850_IRQ_HANDLER(_devcb) \ + devcb = &acia6850_device::set_irq_handler(*device, DEVCB2_##_devcb); -#define ACIA6850_STATUS_RDRF 0x01 -#define ACIA6850_STATUS_TDRE 0x02 -#define ACIA6850_STATUS_DCD 0x04 -#define ACIA6850_STATUS_CTS 0x08 -#define ACIA6850_STATUS_FE 0x10 -#define ACIA6850_STATUS_OVRN 0x20 -#define ACIA6850_STATUS_PE 0x40 -#define ACIA6850_STATUS_IRQ 0x80 - - - -/*************************************************************************** - DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_ACIA6850_ADD(_tag, _interface) \ - MCFG_DEVICE_ADD(_tag, ACIA6850, 0) \ - acia6850_device::static_set_interface(*device, _interface); - -#define ACIA6850_INTERFACE(_name) \ - const acia6850_interface(_name) = - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - - -// ======================> acia6850_interface - -struct acia6850_interface -{ - int m_tx_clock; - int m_rx_clock; - - devcb_write_line m_out_tx_cb; - devcb_write_line m_out_rts_cb; - devcb_write_line m_out_irq_cb; -}; - - - -// ======================> acia6850_device - -class acia6850_device : public device_t, - public acia6850_interface +class acia6850_device : public device_t { public: // construction/destruction acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // static configuration helpers - static void static_set_interface(device_t &device, const acia6850_interface &interface); + template<class _Object> static devcb2_base &set_txd_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_txd_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_rts_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_rts_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_irq_handler.set_callback(object); } - DECLARE_WRITE8_MEMBER( control_write ); - DECLARE_READ8_MEMBER( status_read ); - DECLARE_WRITE8_MEMBER( data_write ); - DECLARE_READ8_MEMBER( data_read ); + DECLARE_WRITE8_MEMBER( control_w ); + DECLARE_READ8_MEMBER( status_r ); + DECLARE_WRITE8_MEMBER( data_w ); + DECLARE_READ8_MEMBER( data_r ); - DECLARE_WRITE_LINE_MEMBER( write_rx ); - DECLARE_WRITE_LINE_MEMBER( write_dcd ); DECLARE_WRITE_LINE_MEMBER( write_cts ); - - void tx_clock_in(); - void rx_clock_in(); - - void set_rx_clock(int clock); - void set_tx_clock(int clock); - - void receive_data(UINT8 data); - - UINT8 get_status() { return m_status; } // returns current status without mangling it + DECLARE_WRITE_LINE_MEMBER( write_dcd ); + DECLARE_WRITE_LINE_MEMBER( write_rxd ); + DECLARE_WRITE_LINE_MEMBER( write_rxc ); + DECLARE_WRITE_LINE_MEMBER( write_txc ); protected: + acia6850_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + // device-level overrides virtual void device_start(); - virtual void device_reset(); - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + virtual void update_irq(); + int calculate_txirq(); + int calculate_rxirq(); private: + void output_txd(int txd); + void output_rts(int txd); + void output_irq(int irq); + enum { - TIMER_ID_TRANSMIT, - TIMER_ID_RECEIVE + ACIA6850_STATUS_RDRF = 0x01, + ACIA6850_STATUS_TDRE = 0x02, + ACIA6850_STATUS_DCD = 0x04, + ACIA6850_STATUS_CTS = 0x08, + ACIA6850_STATUS_FE = 0x10, + ACIA6850_STATUS_OVRN = 0x20, + ACIA6850_STATUS_PE = 0x40, + ACIA6850_STATUS_IRQ = 0x80 }; - void check_interrupts(); - void check_dcd_input(); - - void tx_tick(); - void transmit_event(); - - void rx_tick(); - void receive_event(); - enum serial_state { START, DATA, PARITY, - STOP, - STOP2, + STOP }; enum parity_type @@ -130,61 +86,59 @@ private: EVEN }; - devcb_resolved_write_line m_out_tx_func; - devcb_resolved_write_line m_out_rts_func; - devcb_resolved_write_line m_out_irq_func; - - UINT8 m_ctrl; - UINT8 m_status; - - UINT8 m_tdr; - UINT8 m_rdr; - UINT8 m_rx_shift; - UINT8 m_tx_shift; - - UINT8 m_rx_counter; - UINT8 m_tx_counter; - - int m_divide; - - // Counters - int m_tx_bits; - int m_rx_bits; - int m_tx_parity; - int m_rx_parity; - - // TX/RX state - int m_bits; - parity_type m_parity; - int m_stopbits; - int m_tx_int; - - // Signals - int m_overrun; - int m_reset; - int m_rts; - int m_brk; - int m_first_reset; - int m_status_read; - serial_state m_rx_state; - serial_state m_tx_state; - int m_irq; - bool m_dcd_triggered; - int m_rxd; - int m_dcd; - int m_cts; - - emu_timer *m_rx_timer; - emu_timer *m_tx_timer; - - static const int ACIA6850_DIVIDE[3]; - static const int ACIA6850_WORD[8][3]; -}; + enum dcd_irq_state + { + DCD_IRQ_NONE = 0, + DCD_IRQ_READ_DATA, + DCD_IRQ_READ_STATUS, + }; + devcb2_write_line m_txd_handler; + devcb2_write_line m_rts_handler; + devcb2_write_line m_irq_handler; + + UINT8 m_status; + UINT8 m_tdr; + UINT8 m_rdr; + + bool m_first_master_reset; + int m_dcd_irq_pending; + bool m_overrun_pending; + + int m_divide; + int m_bits; + int m_stopbits; + int m_parity; + int m_brk; + + int m_rts; + int m_dcd; + int m_irq; + + int m_txc; + int m_txd; + int m_tx_state; + int m_tx_bits; + int m_tx_shift; + int m_tx_parity; + int m_tx_counter; + int m_tx_irq_enable; + + int m_rxc; + int m_rxd; + int m_rx_state; + int m_rx_bits; + int m_rx_shift; + int m_rx_parity; + int m_rx_counter; + int m_rx_irq_enable; + + static const int counter_divide_select[4]; + static const int word_select[8][3]; + static const int transmitter_control[4][3]; +}; // device type definition extern const device_type ACIA6850; - - #endif /* __ACIA6850_H__ */ diff --git a/src/emu/machine/clock.c b/src/emu/machine/clock.c new file mode 100644 index 00000000000..31be95aa52e --- /dev/null +++ b/src/emu/machine/clock.c @@ -0,0 +1,63 @@ +#include "clock.h" + +const device_type CLOCK = &device_creator<clock_device>; + +clock_device::clock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CLOCK, "Clock", tag, owner, clock, "clock", __FILE__), + m_signal(0), + m_timer(NULL), + m_signal_handler(*this) +{ +} + +void clock_device::device_start() +{ + m_signal_handler.resolve(); + + save_item(NAME(m_signal)); +} + +void clock_device::device_clock_changed() +{ + update_timer(); +} + +attotime clock_device::period() +{ + return attotime::from_hz(m_clock * 2); +} + +void clock_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + m_signal = !m_signal; + m_signal_handler(m_signal); + + m_timer->adjust(period()); +} + +void clock_device::update_timer() +{ + if (!m_signal_handler.isnull() && m_clock > 0) + { + if (m_timer == NULL) + { + m_timer = timer_alloc(0); + m_timer->adjust(period()); + } + else + { + attotime next = period() - m_timer->elapsed(); + + if (next < attotime::zero) + { + next = attotime::zero; + } + + m_timer->adjust(next); + } + } + else if (m_timer != NULL) + { + m_timer->adjust(attotime::never); + } +} diff --git a/src/emu/machine/clock.h b/src/emu/machine/clock.h new file mode 100644 index 00000000000..5352eb106ba --- /dev/null +++ b/src/emu/machine/clock.h @@ -0,0 +1,35 @@ +#ifndef __CLOCK_H__ +#define __CLOCK_H__ + +#pragma once + +#include "emu.h" + +#define MCFG_CLOCK_SIGNAL_HANDLER(_devcb) \ + devcb = &clock_device::set_signal_handler(*device, DEVCB2_##_devcb); + +class clock_device : public device_t +{ +public: + clock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template<class _Object> static devcb2_base &set_signal_handler(device_t &device, _Object object) { return downcast<clock_device &>(device).m_signal_handler.set_callback(object); } + +protected: + virtual void device_start(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void device_clock_changed(); + +private: + void update_timer(); + attotime period(); + + int m_signal; + emu_timer *m_timer; + + devcb2_write_line m_signal_handler; +}; + +extern const device_type CLOCK; + +#endif diff --git a/src/emu/machine/com8116.c b/src/emu/machine/com8116.c index 4e876975460..c60569ceb40 100644 --- a/src/emu/machine/com8116.c +++ b/src/emu/machine/com8116.c @@ -48,11 +48,11 @@ const int com8116_device::divisors_32X_5_0688MHz[] = // com8116_device - constructor //------------------------------------------------- -com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, COM8116, "COM8116", tag, owner, clock, "com8116", __FILE__), - m_write_fx4(*this), - m_write_fr(*this), - m_write_ft(*this) +com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, COM8116, "COM8116", tag, owner, clock, "com8116", __FILE__), + m_fx4_handler(*this), + m_fr_handler(*this), + m_ft_handler(*this) { } @@ -64,13 +64,13 @@ com8116_device::com8116_device(const machine_config &mconfig, const char *tag, d void com8116_device::device_start() { // resolve callbacks - m_write_fx4.resolve_safe(); - m_write_fr.resolve_safe(); - m_write_ft.resolve_safe(); + m_fx4_handler.resolve_safe(); + m_fr_handler.resolve_safe(); + m_ft_handler.resolve_safe(); // allocate timers m_fx4_timer = timer_alloc(TIMER_FX4); - m_fx4_timer->adjust(attotime::from_hz(clock() / 4), 0, attotime::from_hz(clock() / 4)); + m_fx4_timer->adjust(attotime::from_hz((clock() / 4) * 2), 0, attotime::from_hz((clock() / 4)) * 2); m_fr_timer = timer_alloc(TIMER_FR); m_ft_timer = timer_alloc(TIMER_FT); @@ -78,6 +78,7 @@ void com8116_device::device_start() m_ft_divisors = divisors_16X_5_0688MHz; // register for state saving + save_item(NAME(m_fx4)); save_item(NAME(m_fr)); save_item(NAME(m_ft)); } @@ -89,6 +90,7 @@ void com8116_device::device_start() void com8116_device::device_reset() { + m_fx4 = 0; m_fr = 0; m_ft = 0; } @@ -103,15 +105,18 @@ void com8116_device::device_timer(emu_timer &timer, device_timer_id id, int para switch (id) { case TIMER_FX4: - m_write_fx4(1); + m_fx4 = !m_fx4; + m_fx4_handler(m_fx4); break; case TIMER_FR: - m_write_fr(1); + m_fr = !m_fr; + m_fr_handler(m_fr); break; case TIMER_FT: - m_write_ft(1); + m_ft = !m_ft; + m_ft_handler(m_ft); break; } } @@ -123,12 +128,12 @@ void com8116_device::device_timer(emu_timer &timer, device_timer_id id, int para void com8116_device::str_w(UINT8 data) { - m_fr = data & 0x0f; - int fr_clock = clock() / m_fr_divisors[m_fr]; + int fr_divider = data & 0x0f; + int fr_clock = clock() / m_fr_divisors[fr_divider]; - if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[m_fr], fr_clock); + if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[fr_divider], fr_clock); - m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock)); + m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock * 2)); } WRITE8_MEMBER( com8116_device::str_w ) @@ -143,12 +148,12 @@ WRITE8_MEMBER( com8116_device::str_w ) void com8116_device::stt_w(UINT8 data) { - m_ft = data & 0x0f; - int ft_clock = clock() / m_ft_divisors[m_ft]; + int ft_divider = data & 0x0f; + int ft_clock = clock() / m_ft_divisors[ft_divider]; - if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[m_ft], ft_clock); + if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[ft_divider], ft_clock); - m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock)); + m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock * 2)); } WRITE8_MEMBER( com8116_device::stt_w ) diff --git a/src/emu/machine/com8116.h b/src/emu/machine/com8116.h index ae0da14edd9..92ee089ae3f 100644 --- a/src/emu/machine/com8116.h +++ b/src/emu/machine/com8116.h @@ -34,12 +34,14 @@ // INTERFACE CONFIGURATION MACROS ///************************************************************************* -#define MCFG_COM8116_ADD(_tag, _clock, _fx4, _fr, _ft) \ - MCFG_DEVICE_ADD(_tag, COM8116, _clock) \ - downcast<com8116_device *>(device)->set_fx4_callback(DEVCB2_##_fx4); \ - downcast<com8116_device *>(device)->set_fr_callback(DEVCB2_##_fr); \ - downcast<com8116_device *>(device)->set_ft_callback(DEVCB2_##_ft); +#define MCFG_COM8116_FX4_HANDLER(_devcb) \ + devcb = &com8116_device::set_fx4_handler(*device, DEVCB2_##_devcb); +#define MCFG_COM8116_FR_HANDLER(_devcb) \ + devcb = &com8116_device::set_ft_handler(*device, DEVCB2_##_devcb); + +#define MCFG_COM8116_FT_HANDLER(_devcb) \ + devcb = &com8116_device::set_ft_handler(*device, DEVCB2_##_devcb); ///************************************************************************* @@ -54,9 +56,9 @@ public: // construction/destruction com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - template<class _fx4> void set_fx4_callback(_fx4 fx4) { m_write_fx4.set_callback(fx4); } - template<class _fr> void set_fr_callback(_fr fr) { m_write_fr.set_callback(fr); } - template<class _ft> void set_ft_callback(_ft ft) { m_write_ft.set_callback(ft); } + template<class _Object> static devcb2_base &set_fx4_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_fx4_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_fr_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_fr_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_ft_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_ft_handler.set_callback(object); } void str_w(UINT8 data); DECLARE_WRITE8_MEMBER( str_w ); @@ -81,13 +83,14 @@ private: TIMER_FT }; - devcb2_write_line m_write_fx4; - devcb2_write_line m_write_fr; - devcb2_write_line m_write_ft; - - int m_fr; // receiver frequency - int m_ft; // transmitter frequency + devcb2_write_line m_fx4_handler; + devcb2_write_line m_fr_handler; + devcb2_write_line m_ft_handler; + int m_fx4; + int m_fr; + int m_ft; + const int *m_fr_divisors; const int *m_ft_divisors; @@ -101,6 +104,4 @@ private: // device type definition extern const device_type COM8116; - - #endif diff --git a/src/emu/machine/mc68901.c b/src/emu/machine/mc68901.c index e65ffdd0d07..fe185c303d4 100644 --- a/src/emu/machine/mc68901.c +++ b/src/emu/machine/mc68901.c @@ -338,6 +338,8 @@ void mc68901_device::gpio_output() mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, MC68901, "Motorola MC68901", tag, owner, clock, "mc68901", __FILE__), device_serial_interface(mconfig, *this), + m_aer(0), + m_ier(0), m_gpio_input(0), m_gpio_output(0xff) { diff --git a/src/mame/drivers/bfcobra.c b/src/mame/drivers/bfcobra.c index 610964a7a4f..68768d122bc 100644 --- a/src/mame/drivers/bfcobra.c +++ b/src/mame/drivers/bfcobra.c @@ -73,6 +73,7 @@ ******************************************************************************/ #include "emu.h" +#include "machine/clock.h" #include "machine/6850acia.h" #include "machine/meters.h" #include "cpu/z80/z80.h" @@ -234,12 +235,16 @@ struct fdc_t class bfcobra_state : public driver_device { public: - bfcobra_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + bfcobra_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_acia6850_0(*this, "acia6850_2"), + m_acia6850_1(*this, "acia6850_2"), m_acia6850_2(*this, "acia6850_2"), - m_upd7759(*this, "upd") { } + m_upd7759(*this, "upd") + { + } UINT8 m_bank_data[4]; UINT8 *m_work_ram; @@ -288,6 +293,7 @@ public: DECLARE_WRITE_LINE_MEMBER(z80_acia_irq); DECLARE_WRITE_LINE_MEMBER(m6809_data_irq); DECLARE_WRITE_LINE_MEMBER(data_acia_tx_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_DRIVER_INIT(bfcobra); virtual void machine_reset(); virtual void video_start(); @@ -306,6 +312,8 @@ public: UINT8 results_phase(void); required_device<cpu_device> m_maincpu; required_device<cpu_device> m_audiocpu; + required_device<acia6850_device> m_acia6850_0; + required_device<acia6850_device> m_acia6850_1; required_device<acia6850_device> m_acia6850_2; required_device<upd7759_device> m_upd7759; }; @@ -1352,10 +1360,10 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( z80_io_map, AS_IO, 8, bfcobra_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x23) AM_READWRITE(chipset_r, chipset_w) - AM_RANGE(0x24, 0x24) AM_DEVWRITE("acia6850_0", acia6850_device, control_write) - AM_RANGE(0x25, 0x25) AM_DEVWRITE("acia6850_0", acia6850_device, data_write) - AM_RANGE(0x26, 0x26) AM_DEVREAD("acia6850_0", acia6850_device, status_read) - AM_RANGE(0x27, 0x27) AM_DEVREAD("acia6850_0", acia6850_device, data_read) + AM_RANGE(0x24, 0x24) AM_DEVWRITE("acia6850_0", acia6850_device, control_w) + AM_RANGE(0x25, 0x25) AM_DEVWRITE("acia6850_0", acia6850_device, data_w) + AM_RANGE(0x26, 0x26) AM_DEVREAD("acia6850_0", acia6850_device, status_r) + AM_RANGE(0x27, 0x27) AM_DEVREAD("acia6850_0", acia6850_device, data_r) AM_RANGE(0x30, 0x30) AM_READ(fdctrl_r) AM_RANGE(0x31, 0x31) AM_READWRITE(fddata_r, fdctrl_w) AM_RANGE(0x40, 0x40) AM_WRITE(rombank_w) @@ -1482,10 +1490,10 @@ static ADDRESS_MAP_START( m6809_prog_map, AS_PROGRAM, 8, bfcobra_state ) AM_RANGE(0x2E00, 0x2E00) AM_READ(int_latch_r) AM_RANGE(0x3001, 0x3001) AM_DEVWRITE("aysnd", ay8910_device, data_w) AM_RANGE(0x3201, 0x3201) AM_DEVWRITE("aysnd", ay8910_device, address_w) - AM_RANGE(0x3404, 0x3404) AM_DEVREADWRITE("acia6850_1", acia6850_device, status_read, control_write) - AM_RANGE(0x3405, 0x3405) AM_DEVREADWRITE("acia6850_1", acia6850_device, data_read, data_write) - AM_RANGE(0x3406, 0x3406) AM_DEVREADWRITE("acia6850_2", acia6850_device, status_read, control_write) - AM_RANGE(0x3407, 0x3407) AM_DEVREADWRITE("acia6850_2", acia6850_device, data_read, data_write) + AM_RANGE(0x3404, 0x3404) AM_DEVREADWRITE("acia6850_1", acia6850_device, status_r, control_w) + AM_RANGE(0x3405, 0x3405) AM_DEVREADWRITE("acia6850_1", acia6850_device, data_r, data_w) + AM_RANGE(0x3406, 0x3406) AM_DEVREADWRITE("acia6850_2", acia6850_device, status_r, control_w) + AM_RANGE(0x3407, 0x3407) AM_DEVREADWRITE("acia6850_2", acia6850_device, data_r, data_w) // AM_RANGE(0x3408, 0x3408) AM_NOP // AM_RANGE(0x340A, 0x340A) AM_NOP // AM_RANGE(0x3600, 0x3600) AM_NOP @@ -1609,9 +1617,6 @@ void bfcobra_state::init_ram() m_video_ram = auto_alloc_array_clear(machine(), UINT8, 0x20000); } -/* - What are the correct ACIA clocks ? -*/ WRITE_LINE_MEMBER(bfcobra_state::z80_acia_irq) { @@ -1619,28 +1624,12 @@ WRITE_LINE_MEMBER(bfcobra_state::z80_acia_irq) update_irqs(); } -static ACIA6850_INTERFACE( z80_acia_if ) -{ - 500000, - 500000, - DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_rx), - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,z80_acia_irq) -}; WRITE_LINE_MEMBER(bfcobra_state::m6809_data_irq) { m_audiocpu->set_input_line(M6809_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); } -static ACIA6850_INTERFACE( m6809_acia_if ) -{ - 500000, - 500000, - DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_rx), - DEVCB_NULL, - DEVCB_NULL -}; WRITE_LINE_MEMBER(bfcobra_state::data_acia_tx_w) { @@ -1648,14 +1637,15 @@ WRITE_LINE_MEMBER(bfcobra_state::data_acia_tx_w) } -static ACIA6850_INTERFACE( data_acia_if ) +WRITE_LINE_MEMBER(bfcobra_state::write_acia_clock) { - 500000, - 500000, - DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,data_acia_tx_w),/*data_t,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,m6809_data_irq) -}; + m_acia6850_0->write_txc(state); + m_acia6850_0->write_rxc(state); + m_acia6850_1->write_txc(state); + m_acia6850_1->write_rxc(state); + m_acia6850_2->write_txc(state); + m_acia6850_2->write_rxc(state); +} /* TODO: Driver vs Machine Init */ @@ -1705,7 +1695,7 @@ DRIVER_INIT_MEMBER(bfcobra_state,bfcobra) membank("bank4")->set_base(memregion("user1")->base()); /* TODO: Properly sort out the data ACIA */ - m_acia6850_2->write_rx(1); + m_acia6850_2->write_rxd(1); /* Finish this */ save_item(NAME(m_data_r)); @@ -1765,11 +1755,20 @@ static MACHINE_CONFIG_START( bfcobra, bfcobra_state ) MCFG_SOUND_ADD("upd", UPD7759, UPD7759_STANDARD_CLOCK) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) - /* ACIAs */ - MCFG_ACIA6850_ADD("acia6850_0", z80_acia_if) - MCFG_ACIA6850_ADD("acia6850_1", m6809_acia_if) - MCFG_ACIA6850_ADD("acia6850_2", data_acia_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_rxd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bfcobra_state, z80_acia_irq)) + + MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_rxd)) + + MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bfcobra_state, data_acia_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bfcobra_state, m6809_data_irq)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ? + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bfcobra_state, write_acia_clock)) MACHINE_CONFIG_END /*************************************************************************** diff --git a/src/mame/drivers/bfmsys85.c b/src/mame/drivers/bfmsys85.c index d28a88d26ed..7aab86396d6 100644 --- a/src/mame/drivers/bfmsys85.c +++ b/src/mame/drivers/bfmsys85.c @@ -58,6 +58,7 @@ ___________________________________________________________________________ #include "cpu/m6809/m6809.h" #include "video/awpvid.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/meters.h" #include "machine/roc10937.h" // vfd #include "machine/steppers.h" // stepper motor @@ -70,10 +71,12 @@ ___________________________________________________________________________ class bfmsys85_state : public driver_device { public: - bfmsys85_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_vfd(*this, "vfd"), - m_maincpu(*this, "maincpu") { } + bfmsys85_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_vfd(*this, "vfd"), + m_maincpu(*this, "maincpu"), + m_acia6850_0(*this, "acia6850_0") + { + } optional_device<roc10937_t> m_vfd; int m_mmtr_latch; @@ -107,6 +110,7 @@ public: DECLARE_READ8_MEMBER(triac_r); DECLARE_READ_LINE_MEMBER(sys85_data_r); DECLARE_WRITE_LINE_MEMBER(sys85_data_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_DRIVER_INIT(decode); DECLARE_DRIVER_INIT(nodecode); virtual void machine_start(); @@ -114,6 +118,7 @@ public: INTERRUPT_GEN_MEMBER(timer_irq); int b85_find_project_string( ); required_device<cpu_device> m_maincpu; + required_device<acia6850_device> m_acia6850_0; }; #define MASTER_CLOCK (XTAL_4MHz) @@ -128,14 +133,13 @@ WRITE_LINE_MEMBER(bfmsys85_state::sys85_data_w) m_sys85_data_line_t = state; } -static ACIA6850_INTERFACE( m6809_acia_if ) + +WRITE_LINE_MEMBER(bfmsys85_state::write_acia_clock) { - 500000, - 500000, - DEVCB_DRIVER_LINE_MEMBER(bfmsys85_state,sys85_data_w), - DEVCB_NULL, - DEVCB_NULL -}; + m_acia6850_0->write_txc(state); + m_acia6850_0->write_rxc(state); +} + /////////////////////////////////////////////////////////////////////////// // called if board is reset /////////////////////////////////////////////// @@ -392,11 +396,11 @@ static ADDRESS_MAP_START( memmap, AS_PROGRAM, 8, bfmsys85_state ) AM_RANGE(0x3001, 0x3001) AM_READNOP //sound latch AM_RANGE(0x3200, 0x3200) AM_DEVWRITE("aysnd", ay8910_device, address_w) - AM_RANGE(0x3402, 0x3402) AM_DEVWRITE("acia6850_0", acia6850_device, control_write) - AM_RANGE(0x3403, 0x3403) AM_DEVWRITE("acia6850_0", acia6850_device, data_write) + AM_RANGE(0x3402, 0x3402) AM_DEVWRITE("acia6850_0", acia6850_device, control_w) + AM_RANGE(0x3403, 0x3403) AM_DEVWRITE("acia6850_0", acia6850_device, data_w) - AM_RANGE(0x3406, 0x3406) AM_DEVREAD("acia6850_0", acia6850_device, status_read) - AM_RANGE(0x3407, 0x3407) AM_DEVREAD("acia6850_0", acia6850_device, data_read) + AM_RANGE(0x3406, 0x3406) AM_DEVREAD("acia6850_0", acia6850_device, status_r) + AM_RANGE(0x3407, 0x3407) AM_DEVREAD("acia6850_0", acia6850_device, data_r) AM_RANGE(0x3600, 0x3600) AM_WRITE(mux_enable_w) // mux enable @@ -413,7 +417,11 @@ static MACHINE_CONFIG_START( bfmsys85, bfmsys85_state ) MCFG_CPU_PERIODIC_INT_DRIVER(bfmsys85_state, timer_irq, 1000) // generate 1000 IRQ's per second MCFG_MSC1937_ADD("vfd",0,RIGHT_TO_LEFT) - MCFG_ACIA6850_ADD("acia6850_0", m6809_acia_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bfmsys85_state,sys85_data_w)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ? + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bfmsys85_state, write_acia_clock)) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("aysnd",AY8912, MASTER_CLOCK/4) // add AY8912 soundchip diff --git a/src/mame/drivers/calomega.c b/src/mame/drivers/calomega.c index 7e48b23a224..d0ae423af26 100644 --- a/src/mame/drivers/calomega.c +++ b/src/mame/drivers/calomega.c @@ -648,7 +648,6 @@ #include "cpu/m6502/m65c02.h" #include "video/mc6845.h" #include "machine/6821pia.h" -#include "machine/6850acia.h" #include "machine/nvram.h" #include "sound/ay8910.h" #include "includes/calomega.h" @@ -658,16 +657,12 @@ * Read/Write Handlers * **************************************************/ -WRITE_LINE_MEMBER(calomega_state::tx_rx_clk) +WRITE_LINE_MEMBER(calomega_state::update_aciabaud_scale) { - int trx_clk; UINT8 dsw2 = ioport("SW2")->read(); - trx_clk = UART_CLOCK * dsw2 / 128; - acia6850_device *acia = machine().device<acia6850_device>("acia6850_0"); - acia->set_rx_clock(trx_clk); - acia->set_tx_clock(trx_clk); -} + m_aciabaud->set_clock_scale((double)dsw2 / 128); +} READ8_MEMBER(calomega_state::s903_mux_port_r) { @@ -840,8 +835,8 @@ static ADDRESS_MAP_START( sys903_map, AS_PROGRAM, 8, calomega_state ) AM_RANGE(0x0881, 0x0881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w) AM_RANGE(0x08c4, 0x08c7) AM_DEVREADWRITE("pia0", pia6821_device, read, write) AM_RANGE(0x08c8, 0x08cb) AM_DEVREADWRITE("pia1", pia6821_device, read, write) - AM_RANGE(0x08d0, 0x08d0) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_read, control_write) - AM_RANGE(0x08d1, 0x08d1) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_read, data_write) + AM_RANGE(0x08d0, 0x08d0) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_r, control_w) + AM_RANGE(0x08d1, 0x08d1) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_r, data_w) AM_RANGE(0x1000, 0x13ff) AM_RAM_WRITE(calomega_videoram_w) AM_SHARE("videoram") AM_RANGE(0x1400, 0x17ff) AM_RAM_WRITE(calomega_colorram_w) AM_SHARE("colorram") AM_RANGE(0x1800, 0x3fff) AM_ROM @@ -2556,20 +2551,18 @@ GFXDECODE_END * ACIA Interface * *************************************************/ -WRITE_LINE_MEMBER(calomega_state::acia_tx_w) +WRITE_LINE_MEMBER(calomega_state::write_acia_tx) { m_tx_line = state; } -static ACIA6850_INTERFACE( acia6850_intf ) +WRITE_LINE_MEMBER(calomega_state::write_acia_clock) { - UART_CLOCK, - UART_CLOCK, - DEVCB_DRIVER_LINE_MEMBER(calomega_state,acia_tx_w), /*&tx_line,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(calomega_state,tx_rx_clk) -}; + m_acia6850_0->write_txc(state); + m_acia6850_0->write_rxc(state); + update_aciabaud_scale(0); +} /************************************************* * Sound Interfaces * @@ -2668,7 +2661,11 @@ static MACHINE_CONFIG_START( sys903, calomega_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) /* acia */ - MCFG_ACIA6850_ADD("acia6850_0", acia6850_intf) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(calomega_state, write_acia_tx)) + + MCFG_DEVICE_ADD("4024", CLOCK, UART_CLOCK) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(calomega_state, write_acia_clock)) MACHINE_CONFIG_END diff --git a/src/mame/drivers/jpmsys5.c b/src/mame/drivers/jpmsys5.c index 5805975dbb7..24489cb308c 100644 --- a/src/mame/drivers/jpmsys5.c +++ b/src/mame/drivers/jpmsys5.c @@ -31,6 +31,7 @@ #include "emu.h" #include "includes/jpmsys5.h" +#include "machine/clock.h" #include "sound/saa1099.h" #include "jpmsys5.lh" @@ -295,14 +296,14 @@ READ16_MEMBER(jpmsys5_state::jpm_upd7759_r) AM_RANGE(0x000000, 0x01ffff) AM_ROM \ AM_RANGE(0x040000, 0x043fff) AM_RAM AM_SHARE("nvram") \ AM_RANGE(0x046000, 0x046001) AM_WRITENOP \ - AM_RANGE(0x046020, 0x046021) AM_DEVREADWRITE8("acia6850_0", acia6850_device, status_read, control_write, 0xff) \ - AM_RANGE(0x046022, 0x046023) AM_DEVREADWRITE8("acia6850_0", acia6850_device, data_read, data_write, 0xff) \ + AM_RANGE(0x046020, 0x046021) AM_DEVREADWRITE8("acia6850_0", acia6850_device, status_r, control_w, 0xff) \ + AM_RANGE(0x046022, 0x046023) AM_DEVREADWRITE8("acia6850_0", acia6850_device, data_r, data_w, 0xff) \ AM_RANGE(0x046040, 0x04604f) AM_DEVREADWRITE8("6840ptm", ptm6840_device, read, write, 0xff) \ AM_RANGE(0x046060, 0x046067) AM_DEVREADWRITE8("6821pia", pia6821_device, read, write,0xff) \ - AM_RANGE(0x046080, 0x046081) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) \ - AM_RANGE(0x046082, 0x046083) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) \ - AM_RANGE(0x04608c, 0x04608d) AM_DEVREADWRITE8("acia6850_2", acia6850_device, status_read, control_write, 0xff) \ - AM_RANGE(0x04608e, 0x04608f) AM_DEVREADWRITE8("acia6850_2", acia6850_device, data_read, data_write, 0xff) \ + AM_RANGE(0x046080, 0x046081) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) \ + AM_RANGE(0x046082, 0x046083) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) \ + AM_RANGE(0x04608c, 0x04608d) AM_DEVREADWRITE8("acia6850_2", acia6850_device, status_r, control_w, 0xff) \ + AM_RANGE(0x04608e, 0x04608f) AM_DEVREADWRITE8("acia6850_2", acia6850_device, data_r, data_w, 0xff) \ AM_RANGE(0x0460c0, 0x0460c1) AM_WRITENOP \ AM_RANGE(0x048000, 0x04801f) AM_READWRITE(coins_r, coins_w) \ AM_RANGE(0x04c000, 0x04c0ff) AM_READ(mux_r) AM_WRITE(mux_w) @@ -352,13 +353,13 @@ TIMER_CALLBACK_MEMBER(jpmsys5_state::touch_cb) case START: { m_touch_shift_cnt = 0; - acia6850_2->write_rx(0); + m_acia6850_2->write_rxd(0); m_touch_state = DATA; break; } case DATA: { - acia6850_2->write_rx((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1); + m_acia6850_2->write_rxd((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1); if (++m_touch_shift_cnt == 8) m_touch_state = STOP1; @@ -367,13 +368,13 @@ TIMER_CALLBACK_MEMBER(jpmsys5_state::touch_cb) } case STOP1: { - acia6850_2->write_rx(1); + m_acia6850_2->write_rxd(1); m_touch_state = STOP2; break; } case STOP2: { - acia6850_2->write_rx(1); + m_acia6850_2->write_rxd(1); if (++m_touch_data_count == 3) { @@ -578,50 +579,30 @@ WRITE_LINE_MEMBER(jpmsys5_state::acia_irq) m_maincpu->set_input_line(INT_6850ACIA, state ? ASSERT_LINE : CLEAR_LINE); } -/* Clocks are incorrect */ - WRITE_LINE_MEMBER(jpmsys5_state::a0_tx_w) { m_a0_data_out = state; } -static ACIA6850_INTERFACE( acia0_if ) -{ - 10000, - 10000, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a0_tx_w), /*&a0_data_out,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq) -}; - WRITE_LINE_MEMBER(jpmsys5_state::a1_tx_w) { m_a1_data_out = state; } -static ACIA6850_INTERFACE( acia1_if ) -{ - 10000, - 10000, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a1_tx_w), /*&state->m_a1_data_out,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq) -}; - WRITE_LINE_MEMBER(jpmsys5_state::a2_tx_w) { m_a2_data_out = state; } -static ACIA6850_INTERFACE( acia2_if ) +WRITE_LINE_MEMBER(jpmsys5_state::write_acia_clock) { - 10000, - 10000, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a2_tx_w), /*&state->m_a2_data_out,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq) -}; - + m_acia6850_0->write_txc(state); + m_acia6850_0->write_rxc(state); + m_acia6850_1->write_txc(state); + m_acia6850_1->write_rxc(state); + m_acia6850_2->write_txc(state); + m_acia6850_2->write_rxc(state); +} /************************************* * @@ -639,8 +620,8 @@ MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5v) { m_touch_timer->reset(); m_touch_state = IDLE; - acia6850_2->write_rx(1); - acia6850_2->write_dcd(0); + m_acia6850_2->write_rxd(1); + m_acia6850_2->write_dcd(0); m_vfd->reset(); } @@ -656,9 +637,20 @@ static MACHINE_CONFIG_START( jpmsys5v, jpmsys5_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz) MCFG_CPU_PROGRAM_MAP(68000_map) - MCFG_ACIA6850_ADD("acia6850_0", acia0_if) - MCFG_ACIA6850_ADD("acia6850_1", acia1_if) - MCFG_ACIA6850_ADD("acia6850_2", acia2_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ? + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock)) MCFG_NVRAM_ADD_0FILL("nvram") @@ -843,8 +835,8 @@ MACHINE_START_MEMBER(jpmsys5_state,jpmsys5) MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5) { - acia6850_2->write_rx(1); - acia6850_2->write_dcd(0); + m_acia6850_2->write_rxd(1); + m_acia6850_2->write_dcd(0); m_vfd->reset(); } @@ -861,9 +853,20 @@ MACHINE_CONFIG_START( jpmsys5_ym, jpmsys5_state ) MCFG_CPU_PROGRAM_MAP(68000_awp_map) - MCFG_ACIA6850_ADD("acia6850_0", acia0_if) - MCFG_ACIA6850_ADD("acia6850_1", acia1_if) - MCFG_ACIA6850_ADD("acia6850_2", acia2_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ? + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock)) MCFG_NVRAM_ADD_0FILL("nvram") MCFG_ROC10937_ADD("vfd",0,RIGHT_TO_LEFT) @@ -897,9 +900,20 @@ MACHINE_CONFIG_START( jpmsys5, jpmsys5_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz) MCFG_CPU_PROGRAM_MAP(68000_awp_map_saa) - MCFG_ACIA6850_ADD("acia6850_0", acia0_if) - MCFG_ACIA6850_ADD("acia6850_1", acia1_if) - MCFG_ACIA6850_ADD("acia6850_2", acia2_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ? + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock)) MCFG_NVRAM_ADD_0FILL("nvram") MCFG_ROC10937_ADD("vfd",0,RIGHT_TO_LEFT) diff --git a/src/mame/drivers/mpu4vid.c b/src/mame/drivers/mpu4vid.c index 6ffa38a906d..99e6a337f08 100644 --- a/src/mame/drivers/mpu4vid.c +++ b/src/mame/drivers/mpu4vid.c @@ -335,15 +335,6 @@ WRITE_LINE_MEMBER(mpu4vid_state::m6809_acia_irq) m_maincpu->set_input_line(M6809_IRQ_LINE, state); } -static ACIA6850_INTERFACE( m6809_acia_if ) -{ - 0, - 0, - DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_rx), - DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_dcd), - DEVCB_DRIVER_LINE_MEMBER(mpu4vid_state, m6809_acia_irq) -}; - WRITE_LINE_MEMBER(mpu4vid_state::m68k_acia_irq) { m_acia_0->write_cts(state); @@ -351,15 +342,6 @@ WRITE_LINE_MEMBER(mpu4vid_state::m68k_acia_irq) update_mpu68_interrupts(1); } -static ACIA6850_INTERFACE( m68k_acia_if ) -{ - 0, - 0, - DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_rx), - DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_dcd), - DEVCB_DRIVER_LINE_MEMBER(mpu4vid_state, m68k_acia_irq) -}; - WRITE_LINE_MEMBER(mpu4vid_state::cpu1_ptm_irq) { @@ -372,13 +354,10 @@ WRITE8_MEMBER(mpu4vid_state::vid_o1_callback) { m_ptm->set_c2(data); /* this output is the clock for timer2 */ - if (data) - { - m_acia_0->tx_clock_in(); - m_acia_0->rx_clock_in(); - m_acia_1->tx_clock_in(); - m_acia_1->rx_clock_in(); - } + m_acia_0->write_txc(data); + m_acia_0->write_rxc(data); + m_acia_1->write_txc(data); + m_acia_1->write_rxc(data); } @@ -1330,8 +1309,8 @@ static ADDRESS_MAP_START( mpu4_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") - AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) - AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) + AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) + AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) AM_RANGE(0xff9000, 0xff900f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff) AM_RANGE(0xffd000, 0xffd00f) AM_READWRITE(characteriser16_r, characteriser16_w) ADDRESS_MAP_END @@ -1348,8 +1327,8 @@ static ADDRESS_MAP_START( mpu4oki_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") - AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) - AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) + AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) + AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) AM_RANGE(0xff9000, 0xff900f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff) AM_RANGE(0xffa040, 0xffa04f) AM_DEVREAD8("ptm_ic3ss", ptm6840_device, read,0xff) // 6840PTM on sampled sound board AM_RANGE(0xffa040, 0xffa04f) AM_WRITE8(ic3ss_w,0x00ff) // 6840PTM on sampled sound board @@ -1371,8 +1350,8 @@ static ADDRESS_MAP_START( bwbvid_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") - AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) - AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) + AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) + AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff) //AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(bwb_characteriser16_r, bwb_characteriser16_w)//AM_READWRITE(adpcm_r, adpcm_w) CHR ? ADDRESS_MAP_END @@ -1389,8 +1368,8 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16, mpu4vid_state ) AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram") - AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) - AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) + AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) + AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0x00ff) AM_RANGE(0xe02000, 0xe02007) AM_DEVREADWRITE8("pia_ic4ss", pia6821_device, read, write, 0xff00) AM_RANGE(0xe03000, 0xe0300f) AM_DEVREAD8("ptm_ic3ss", ptm6840_device, read,0xff00) // 6840PTM on sampled sound board @@ -1403,8 +1382,8 @@ ADDRESS_MAP_END /* TODO: Fix up MPU4 map*/ static ADDRESS_MAP_START( mpu4_6809_map, AS_PROGRAM, 8, mpu4_state ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram") - AM_RANGE(0x0800, 0x0800) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_read, control_write) - AM_RANGE(0x0801, 0x0801) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_read, data_write) + AM_RANGE(0x0800, 0x0800) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_r, control_w) + AM_RANGE(0x0801, 0x0801) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_r, data_w) AM_RANGE(0x0880, 0x0881) AM_NOP //Read/write here AM_RANGE(0x0900, 0x0907) AM_DEVREADWRITE("ptm_ic2", ptm6840_device, read, write) AM_RANGE(0x0a00, 0x0a03) AM_DEVREADWRITE("pia_ic3", pia6821_device, read, write) @@ -1466,8 +1445,15 @@ static MACHINE_CONFIG_START( mpu4_vid, mpu4vid_state ) MCFG_SOUND_ROUTE(0, "lspeaker", 0.5) MCFG_SOUND_ROUTE(1, "rspeaker", 0.5) - MCFG_ACIA6850_ADD("acia6850_0", m6809_acia_if) - MCFG_ACIA6850_ADD("acia6850_1", m68k_acia_if) + MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_rxd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_dcd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(mpu4vid_state, m6809_acia_irq)) + + MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_rxd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_dcd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(mpu4vid_state, m68k_acia_irq)) // for the video timing MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", mpu4vid_state, scanline_timer_callback, "screen", 0, 1) diff --git a/src/mame/includes/calomega.h b/src/mame/includes/calomega.h index bc1a8eda7b0..82572641cbb 100644 --- a/src/mame/includes/calomega.h +++ b/src/mame/includes/calomega.h @@ -1,22 +1,22 @@ +#include "machine/6850acia.h" +#include "machine/clock.h" + class calomega_state : public driver_device { public: - calomega_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + calomega_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_acia6850_0(*this, "acia6850_0"), + m_aciabaud(*this, "aciabaud"), m_videoram(*this, "videoram"), m_colorram(*this, "colorram"), - m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode") { } + m_gfxdecode(*this, "gfxdecode") + { + } - UINT8 m_tx_line; - int m_s903_mux_data; - int m_s905_mux_data; - required_shared_ptr<UINT8> m_videoram; - required_shared_ptr<UINT8> m_colorram; - tilemap_t *m_bg_tilemap; DECLARE_WRITE8_MEMBER(calomega_videoram_w); DECLARE_WRITE8_MEMBER(calomega_colorram_w); - DECLARE_WRITE_LINE_MEMBER(tx_rx_clk); DECLARE_READ8_MEMBER(s903_mux_port_r); DECLARE_WRITE8_MEMBER(s903_mux_w); DECLARE_READ8_MEMBER(s905_mux_port_r); @@ -35,15 +35,30 @@ public: DECLARE_WRITE8_MEMBER(lamps_903a_w); DECLARE_WRITE8_MEMBER(lamps_903b_w); DECLARE_WRITE8_MEMBER(lamps_905_w); - DECLARE_WRITE_LINE_MEMBER(acia_tx_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_tx); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + DECLARE_WRITE_LINE_MEMBER(update_aciabaud_scale); DECLARE_DRIVER_INIT(elgrande); DECLARE_DRIVER_INIT(standard); DECLARE_DRIVER_INIT(comg080); DECLARE_DRIVER_INIT(jjpoker); TILE_GET_INFO_MEMBER(get_bg_tile_info); + UINT32 screen_update_calomega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: virtual void video_start(); virtual void palette_init(); - UINT32 screen_update_calomega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +private: + DECLARE_WRITE_LINE_MEMBER(update_aciabaud); required_device<cpu_device> m_maincpu; + optional_device<acia6850_device> m_acia6850_0; + optional_device<clock_device> m_aciabaud; + required_shared_ptr<UINT8> m_videoram; + required_shared_ptr<UINT8> m_colorram; required_device<gfxdecode_device> m_gfxdecode; + UINT8 m_tx_line; + int m_s903_mux_data; + int m_s905_mux_data; + tilemap_t *m_bg_tilemap; }; diff --git a/src/mame/includes/jpmsys5.h b/src/mame/includes/jpmsys5.h index 04da2f55f6e..d35aeb60808 100644 --- a/src/mame/includes/jpmsys5.h +++ b/src/mame/includes/jpmsys5.h @@ -15,17 +15,21 @@ class jpmsys5_state : public driver_device { public: - jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - acia6850_2(*this, "acia6850_2"), + m_acia6850_0(*this, "acia6850_0"), + m_acia6850_1(*this, "acia6850_1"), + m_acia6850_2(*this, "acia6850_2"), m_upd7759(*this, "upd7759"), m_tms34061(*this, "tms34061"), m_vfd(*this, "vfd"), m_direct_port(*this, "DIRECT") { } required_device<cpu_device> m_maincpu; - required_device<acia6850_device> acia6850_2; + required_device<acia6850_device> m_acia6850_0; + required_device<acia6850_device> m_acia6850_1; + required_device<acia6850_device> m_acia6850_2; required_device<upd7759_device> m_upd7759; optional_device<tms34061_device> m_tms34061; optional_device<roc10937_t> m_vfd; @@ -70,6 +74,7 @@ public: DECLARE_WRITE_LINE_MEMBER(a0_tx_w); DECLARE_WRITE_LINE_MEMBER(a1_tx_w); DECLARE_WRITE_LINE_MEMBER(a2_tx_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_READ16_MEMBER(mux_awp_r); DECLARE_READ16_MEMBER(coins_awp_r); void sys5_draw_lamps(); diff --git a/src/mess/drivers/68ksbc.c b/src/mess/drivers/68ksbc.c index 13081d40b0e..3a29ece498e 100644 --- a/src/mess/drivers/68ksbc.c +++ b/src/mess/drivers/68ksbc.c @@ -29,27 +29,32 @@ #include "bus/rs232/rs232.h" #include "cpu/m68000/m68000.h" #include "machine/6850acia.h" +#include "machine/clock.h" class c68ksbc_state : public driver_device { public: - c68ksbc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") + c68ksbc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_acia(*this, "acia") { } + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + +private: required_device<cpu_device> m_maincpu; - virtual void machine_reset(); + required_device<acia6850_device> m_acia; }; static ADDRESS_MAP_START(c68ksbc_mem, AS_PROGRAM, 16, c68ksbc_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x000000, 0x002fff) AM_ROM AM_RANGE(0x003000, 0x5fffff) AM_RAM - AM_RANGE(0x600000, 0x600001) AM_DEVREADWRITE8("acia", acia6850_device, status_read, control_write, 0x00ff) - AM_RANGE(0x600002, 0x600003) AM_DEVREADWRITE8("acia", acia6850_device, data_read, data_write, 0x00ff) + AM_RANGE(0x600000, 0x600001) AM_DEVREADWRITE8("acia", acia6850_device, status_r, control_w, 0x00ff) + AM_RANGE(0x600002, 0x600003) AM_DEVREADWRITE8("acia", acia6850_device, data_r, data_w, 0x00ff) ADDRESS_MAP_END @@ -58,29 +63,27 @@ static INPUT_PORTS_START( c68ksbc ) INPUT_PORTS_END -void c68ksbc_state::machine_reset() +WRITE_LINE_MEMBER(c68ksbc_state::write_acia_clock) { + m_acia->write_txc(state); + m_acia->write_rxc(state); } -static ACIA6850_INTERFACE( acia_intf ) -{ - 153600, - 153600, - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_NULL -}; - static MACHINE_CONFIG_START( c68ksbc, c68ksbc_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) // text says 8MHz, schematic says 10MHz MCFG_CPU_PROGRAM_MAP(c68ksbc_mem) - MCFG_ACIA6850_ADD("acia", acia_intf) + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rx)) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c68ksbc_state, write_acia_clock)) MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mess/drivers/alphatro.c b/src/mess/drivers/alphatro.c index a50af5ea56a..8a668f7c8f3 100644 --- a/src/mess/drivers/alphatro.c +++ b/src/mess/drivers/alphatro.c @@ -30,6 +30,7 @@ #include "cpu/z80/z80.h" #include "video/mc6845.h" #include "machine/i8251.h" +#include "machine/clock.h" #include "imagedev/cassette.h" #include "sound/beep.h" #include "sound/wave.h" @@ -44,7 +45,6 @@ public: enum { TIMER_SYSTEM, - TIMER_SERIAL, TIMER_ALPHATRO_BEEP_OFF }; @@ -68,13 +68,13 @@ public: DECLARE_WRITE8_MEMBER(port10_w); DECLARE_INPUT_CHANGED_MEMBER(alphatro_break); DECLARE_WRITE_LINE_MEMBER(txdata_callback); + DECLARE_WRITE_LINE_MEMBER(write_usart_clock); TIMER_DEVICE_CALLBACK_MEMBER(alphatro_c); TIMER_DEVICE_CALLBACK_MEMBER(alphatro_p); required_shared_ptr<UINT8> m_p_ram; required_shared_ptr<UINT8> m_p_videoram; emu_timer* m_sys_timer; - emu_timer* m_serial_timer; // for the usart UINT8 *m_p_chargen; virtual void video_start(); virtual void machine_start(); @@ -127,14 +127,6 @@ void alphatro_state::device_timer(emu_timer &timer, device_timer_id id, int para case TIMER_SYSTEM: m_timer_bit ^= 0x80; break; - case TIMER_SERIAL: - /// TODO: double timer frequency for correct duty cycle - m_usart->write_txc(1); - m_usart->write_rxc(1); - - m_usart->write_txc(0); - m_usart->write_rxc(0); - break; case TIMER_ALPHATRO_BEEP_OFF: m_beep->set_state(0); break; @@ -148,6 +140,12 @@ WRITE_LINE_MEMBER( alphatro_state::txdata_callback ) m_cass_state = state; } +WRITE_LINE_MEMBER( alphatro_state::write_usart_clock ) +{ + m_usart->write_txc(state); + m_usart->write_rxc(state); +} + void alphatro_state::video_start() { m_p_chargen = memregion("chargen")->base(); @@ -359,7 +357,6 @@ GFXDECODE_END void alphatro_state::machine_start() { m_sys_timer = timer_alloc(TIMER_SYSTEM); - m_serial_timer = timer_alloc(TIMER_SERIAL); } void alphatro_state::machine_reset() @@ -372,7 +369,6 @@ void alphatro_state::machine_reset() // probably not correct, exact meaning of port is unknown, vblank/vsync is too slow. m_sys_timer->adjust(attotime::from_usec(10),0,attotime::from_usec(10)); - m_serial_timer->adjust(attotime::from_hz(19225),0,attotime::from_hz(19225)); // USART clock - this value loads a real tape m_timer_bit = 0; m_cass_state = 1; m_cass_data[0] = 0; @@ -475,7 +471,10 @@ static MACHINE_CONFIG_START( alphatro, alphatro_state ) MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8, alphatro_crtc6845_interface) // clk unknown MCFG_DEVICE_ADD("usart", I8251, 0) - MCFG_I8251_TXD_HANDLER(WRITELINE(alphatro_state,txdata_callback)) + MCFG_I8251_TXD_HANDLER(WRITELINE(alphatro_state, txdata_callback)) + + MCFG_DEVICE_ADD("usart_clock", CLOCK, 19225) // USART clock - this value loads a real tape + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(alphatro_state, write_usart_clock)) MCFG_CASSETTE_ADD("cassette", alphatro_cassette_interface) MCFG_TIMER_DRIVER_ADD_PERIODIC("alphatro_c", alphatro_state, alphatro_c, attotime::from_hz(4800)) diff --git a/src/mess/drivers/altair.c b/src/mess/drivers/altair.c index a2e96cd63c0..b70c3f7dbd7 100644 --- a/src/mess/drivers/altair.c +++ b/src/mess/drivers/altair.c @@ -21,21 +21,31 @@ #include "bus/rs232/rs232.h" #include "cpu/i8085/i8085.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "imagedev/snapquik.h" class altair_state : public driver_device { public: - altair_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_ram(*this, "ram"){ } + altair_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mc6850(*this, "mc6850"), + m_ram(*this, "ram") + { + } + DECLARE_QUICKLOAD_LOAD_MEMBER(altair); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + +protected: + virtual void machine_reset(); + +private: required_device<cpu_device> m_maincpu; + required_device<acia6850_device> m_mc6850; required_shared_ptr<UINT8> m_ram; - virtual void machine_reset(); - DECLARE_QUICKLOAD_LOAD_MEMBER(altair); }; @@ -51,8 +61,8 @@ static ADDRESS_MAP_START(altair_io, AS_IO, 8, altair_state) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) // TODO: Remove AM_MIRROR() and use SIO address S0-S7 - AM_RANGE( 0x00, 0x00 ) AM_MIRROR(0x10) AM_DEVREADWRITE("mc6850", acia6850_device, status_read, control_write) - AM_RANGE( 0x01, 0x01 ) AM_MIRROR(0x10) AM_DEVREADWRITE("mc6850", acia6850_device, data_read, data_write) + AM_RANGE( 0x00, 0x00 ) AM_MIRROR(0x10) AM_DEVREADWRITE("mc6850", acia6850_device, status_r, control_w) + AM_RANGE( 0x01, 0x01 ) AM_MIRROR(0x10) AM_DEVREADWRITE("mc6850", acia6850_device, data_r, data_w) ADDRESS_MAP_END /* Input ports */ @@ -74,6 +84,11 @@ QUICKLOAD_LOAD_MEMBER( altair_state,altair) return IMAGE_INIT_PASS; } +WRITE_LINE_MEMBER(altair_state::write_acia_clock) +{ + m_mc6850->write_txc(state); + m_mc6850->write_rxc(state); +} void altair_state::machine_reset() { @@ -81,20 +96,6 @@ void altair_state::machine_reset() m_maincpu->set_state_int(I8085_PC, 0xFD00); } -//------------------------------------------------- -// ACIA6850_INTERFACE( acia0_intf ) -//------------------------------------------------- - -static ACIA6850_INTERFACE( acia0_intf ) -{ - 153600, // TODO: these are set using jumpers S3/S2/S1/S0 - 153600, - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_NULL -}; - - static MACHINE_CONFIG_START( altair, altair_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8080, XTAL_2MHz) @@ -102,13 +103,18 @@ static MACHINE_CONFIG_START( altair, altair_state ) MCFG_CPU_IO_MAP(altair_io) /* video hardware */ - MCFG_ACIA6850_ADD("mc6850", acia0_intf) + MCFG_DEVICE_ADD("mc6850", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE("mc6850", acia6850_device, write_rx)) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("mc6850", acia6850_device, write_rxd)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE("mc6850", acia6850_device, write_dcd)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("mc6850", acia6850_device, write_cts)) + MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600) // TODO: this is set using jumpers S3/S2/S1/S0 + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(altair_state, write_acia_clock)) + /* quickload */ MCFG_QUICKLOAD_ADD("quickload", altair_state, altair, "bin", 0) MACHINE_CONFIG_END diff --git a/src/mess/drivers/atarist.c b/src/mess/drivers/atarist.c index ae7865e3541..88a77aa23a1 100644 --- a/src/mess/drivers/atarist.c +++ b/src/mess/drivers/atarist.c @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Curt Coder, Olivier Galibert #include "includes/atarist.h" +#include "machine/clock.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" @@ -597,7 +598,7 @@ WRITE8_MEMBER( st_state::ikbd_port2_w ) m_ikbd_joy = BIT(data, 0); // serial transmit - m_acia0->write_rx(BIT(data, 4)); + m_acia0->write_rxd(BIT(data, 4)); } @@ -1257,10 +1258,10 @@ static ADDRESS_MAP_START( st_map, AS_PROGRAM, 16, st_state ) AM_RANGE(0xff8a3c, 0xff8a3d) AM_READWRITE(blitter_ctrl_r, blitter_ctrl_w) #endif AM_RANGE(0xfffa00, 0xfffa3f) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff) - AM_RANGE(0xfffc00, 0xfffc01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_read, control_write, 0xff00) - AM_RANGE(0xfffc02, 0xfffc03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_read, data_write, 0xff00) - AM_RANGE(0xfffc04, 0xfffc05) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_read, control_write, 0xff00) - AM_RANGE(0xfffc06, 0xfffc07) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_read, data_write, 0xff00) + AM_RANGE(0xfffc00, 0xfffc01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_r, control_w, 0xff00) + AM_RANGE(0xfffc02, 0xfffc03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_r, data_w, 0xff00) + AM_RANGE(0xfffc04, 0xfffc05) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_r, control_w, 0xff00) + AM_RANGE(0xfffc06, 0xfffc07) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_r, data_w, 0xff00) ADDRESS_MAP_END @@ -1301,10 +1302,10 @@ static ADDRESS_MAP_START( megast_map, AS_PROGRAM, 16, megast_state ) AM_RANGE(0xff8a3c, 0xff8a3d) AM_READWRITE(blitter_ctrl_r, blitter_ctrl_w) AM_RANGE(0xfffa00, 0xfffa3f) AM_DEVREADWRITE8(MC68901_TAG, mc68901_device, read, write, 0x00ff) AM_RANGE(0xfffa40, 0xfffa57) AM_READWRITE(fpu_r, fpu_w) - AM_RANGE(0xfffc00, 0xfffc01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_read, control_write, 0xff00) - AM_RANGE(0xfffc02, 0xfffc03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_read, data_write, 0xff00) - AM_RANGE(0xfffc04, 0xfffc05) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_read, control_write, 0xff00) - AM_RANGE(0xfffc06, 0xfffc07) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_read, data_write, 0xff00) + AM_RANGE(0xfffc00, 0xfffc01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_r, control_w, 0xff00) + AM_RANGE(0xfffc02, 0xfffc03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_r, data_w, 0xff00) + AM_RANGE(0xfffc04, 0xfffc05) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_r, control_w, 0xff00) + AM_RANGE(0xfffc06, 0xfffc07) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_r, data_w, 0xff00) AM_RANGE(0xfffc20, 0xfffc3f) AM_DEVREADWRITE8(RP5C15_TAG, rp5c15_device, read, write, 0x00ff) ADDRESS_MAP_END @@ -1836,10 +1837,6 @@ static const ay8910_interface stbook_psg_intf = #endif -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_ikbd_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( st_state::ikbd_tx_w ) { m_ikbd_tx = state; @@ -1852,35 +1849,6 @@ WRITE_LINE_MEMBER( st_state::acia_ikbd_irq_w ) m_mfp->i4_w(!(m_acia_ikbd_irq || m_acia_midi_irq)); } -static ACIA6850_INTERFACE( acia_ikbd_intf ) -{ - Y2/64, - Y2/64, - DEVCB_DRIVER_LINE_MEMBER(st_state, ikbd_tx_w), - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(st_state, acia_ikbd_irq_w) -}; - - -#if 0 -//------------------------------------------------- -// ACIA6850_INTERFACE( stbook_acia_ikbd_intf ) -//------------------------------------------------- - -static ACIA6850_INTERFACE( stbook_acia_ikbd_intf ) -{ - U517/2/16, // 500kHz - U517/2/2, // 1MHZ - DEVCB_DRIVER_LINE_MEMBER(st_state, ikbd_tx_w), - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(st_state, acia_ikbd_irq_w) -}; -#endif - - -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_midi_intf ) -//------------------------------------------------- WRITE_LINE_MEMBER( st_state::acia_midi_irq_w ) { @@ -1889,14 +1857,13 @@ WRITE_LINE_MEMBER( st_state::acia_midi_irq_w ) m_mfp->i4_w(!(m_acia_ikbd_irq || m_acia_midi_irq)); } -static ACIA6850_INTERFACE( acia_midi_intf ) +WRITE_LINE_MEMBER(st_state::write_acia_clock) { - Y2/64, - 0, // rx clock (we manually clock rx) - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(st_state, acia_midi_irq_w) -}; + m_acia0->write_txc(state); + m_acia0->write_rxc(state); + m_acia1->write_txc(state); + m_acia1->write_rxc(state); +} //------------------------------------------------- @@ -1996,16 +1963,6 @@ static SLOT_INTERFACE_START( midiin_slot ) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END -WRITE_LINE_MEMBER( st_state::midi_rx_w ) -{ - m_acia1->write_rx(state); - - for (int i = 0; i < 64; i++) // divider is set to 64 - { - m_acia1->rx_clock_in(); - } -} - //------------------------------------------------- // SLOT_INTERFACE( midiout_slot ) @@ -2263,11 +2220,8 @@ static MACHINE_CONFIG_START( st, st_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) // devices - MCFG_ACIA6850_ADD(MC6850_0_TAG, acia_ikbd_intf) - MCFG_ACIA6850_ADD(MC6850_1_TAG, acia_midi_intf) - MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf) - MCFG_WD1772x_ADD(WD1772_TAG, Y2/4) + MCFG_WD1772x_ADD(WD1772_TAG, Y2/4) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", st_state::floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats) @@ -2276,17 +2230,30 @@ static MACHINE_CONFIG_START( st, st_state ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf) + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i1_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i2_w)) MCFG_RS232_RI_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i6_w)) + MCFG_DEVICE_ADD(MC6850_0_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(st_state, ikbd_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_ikbd_irq_w)) + + MCFG_DEVICE_ADD(MC6850_1_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_midi_irq_w)) + MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(WRITELINE(st_state, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + MCFG_DEVICE_ADD("acia_clock", CLOCK, Y2/64) // 500kHz + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(st_state, write_acia_clock)) + // cartridge MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") @@ -2331,9 +2298,8 @@ static MACHINE_CONFIG_START( megast, megast_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) // devices - MCFG_ACIA6850_ADD(MC6850_0_TAG, acia_ikbd_intf) - MCFG_ACIA6850_ADD(MC6850_1_TAG, acia_midi_intf) - MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf) + MCFG_RP5C15_ADD(RP5C15_TAG, XTAL_32_768kHz, rtc_intf) + MCFG_WD1772x_ADD(WD1772_TAG, Y2/4) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", st_state::floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats) @@ -2343,17 +2309,29 @@ static MACHINE_CONFIG_START( megast, megast_state ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf) + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i1_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i2_w)) MCFG_RS232_RI_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i6_w)) + MCFG_DEVICE_ADD(MC6850_0_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(st_state, ikbd_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_ikbd_irq_w)) + + MCFG_DEVICE_ADD(MC6850_1_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_midi_irq_w)) + MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(WRITELINE(st_state, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") - MCFG_RP5C15_ADD(RP5C15_TAG, XTAL_32_768kHz, rtc_intf) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, Y2/64) // 500kHz + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(st_state, write_acia_clock)) // cartridge MCFG_CARTSLOT_ADD("cart") @@ -2407,9 +2385,7 @@ static MACHINE_CONFIG_START( ste, ste_state ) MCFG_LMC1992_ADD(LMC1992_TAG /* ,atariste_lmc1992_intf */) // devices - MCFG_ACIA6850_ADD(MC6850_0_TAG, acia_ikbd_intf) - MCFG_ACIA6850_ADD(MC6850_1_TAG, acia_midi_intf) - MCFG_MC68901_ADD(MC68901_TAG, Y2/8, atariste_mfp_intf) + MCFG_WD1772x_ADD(WD1772_TAG, Y2/4) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", st_state::floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats) @@ -2419,17 +2395,30 @@ static MACHINE_CONFIG_START( ste, ste_state ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + MCFG_MC68901_ADD(MC68901_TAG, Y2/8, atariste_mfp_intf) + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i1_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i2_w)) MCFG_RS232_RI_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i6_w)) + MCFG_DEVICE_ADD(MC6850_0_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(st_state, ikbd_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_ikbd_irq_w)) + + MCFG_DEVICE_ADD(MC6850_1_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_midi_irq_w)) + MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(WRITELINE(st_state, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + MCFG_DEVICE_ADD("acia_clock", CLOCK, Y2/64) // 500kHz + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(st_state, write_acia_clock)) + // cartridge MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") @@ -2492,9 +2481,6 @@ static MACHINE_CONFIG_START( stbook, stbook_state ) MCFG_SOUND_CONFIG(stbook_psg_intf) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - // device hardware - MCFG_ACIA6850_ADD(MC6850_0_TAG, stbook_acia_ikbd_intf) - MCFG_ACIA6850_ADD(MC6850_1_TAG, acia_midi_intf) MCFG_MC68901_ADD(MC68901_TAG, U517/8, stbook_mfp_intf) MCFG_WD1772x_ADD(WD1772_TAG, U517/2) MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", 0, st_state::floppy_formats) @@ -2511,11 +2497,23 @@ static MACHINE_CONFIG_START( stbook, stbook_state ) MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i2_w)) MCFG_RS232_OUT_RI_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, i6_w)) + // device hardware + MCFG_DEVICE_ADD(MC6850_0_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(st_state, ikbd_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_ikbd_irq_w)) + + MCFG_DEVICE_ADD(MC6850_1_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(st_state, acia_midi_irq_w)) + MCFG_SERIAL_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_SERIAL_OUT_RX_HANDLER(WRITELINE(st_state, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rxd)) MCFG_SERIAL_PORT_ADD("mdout", midiout_slot, "midiout") + MCFG_DEVICE_ADD("acia_clock", CLOCK, U517/2/16) // 500kHz + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(st_state, write_acia_clock)) + // cartridge MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c index 7020dd1e9f1..373e04a69df 100644 --- a/src/mess/drivers/bbc.c +++ b/src/mess/drivers/bbc.c @@ -145,8 +145,8 @@ static ADDRESS_MAP_START( bbca_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ - AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON # ECONET Interrupt On */ @@ -173,8 +173,8 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0xfc00, 0xfdff) AM_READWRITE(bbc_opus_read, bbc_opus_write) /* fc00-fdff OPUS Disc Controller */ /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ - AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */ @@ -202,8 +202,8 @@ static ADDRESS_MAP_START( bbcbp_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ - AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */ @@ -231,8 +231,8 @@ static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ - AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe10, 0xfe17) AM_NOP /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ @@ -595,15 +595,6 @@ WRITE_LINE_MEMBER(bbc_state::bbcb_acia6850_irq_w) check_interrupts(); } -static ACIA6850_INTERFACE( bbc_acia6850_interface ) -{ - 0, - 0, - DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_txd_w), - DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_rts_w), - DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbcb_acia6850_irq_w) -}; - static LEGACY_FLOPPY_OPTIONS_START(bbc) LEGACY_FLOPPY_OPTION( ssd80, "bbc,img,ssd", "BBC SSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, HEADS([1]) @@ -730,12 +721,19 @@ static MACHINE_CONFIG_START( bbca, bbc_state ) MCFG_SOFTWARE_LIST_ADD("cass_ls_a", "bbca_cass") /* acia */ - MCFG_ACIA6850_ADD("acia6850", bbc_acia6850_interface) + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w)) + MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w)) + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial)) MCFG_RS232_DCD_HANDLER(WRITELINE(bbc_state, write_dcd_serial)) MCFG_RS232_CTS_HANDLER(WRITELINE(bbc_state, write_cts_serial)) + MCFG_DEVICE_ADD("acia_clock", CLOCK, XTAL_16MHz / 13) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bbc_state, write_acia_clock)) + /* system via */ MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) MCFG_VIA6522_READPA_HANDLER(READ8(bbc_state, bbcb_via_system_read_porta)) @@ -952,13 +950,19 @@ static MACHINE_CONFIG_START( bbcm, bbc_state ) MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart") /* acia */ - MCFG_ACIA6850_ADD("acia6850", bbc_acia6850_interface) + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w)) + MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w)) MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial)) MCFG_RS232_DCD_HANDLER(WRITELINE(bbc_state, write_dcd_serial)) MCFG_RS232_CTS_HANDLER(WRITELINE(bbc_state, write_cts_serial)) + MCFG_DEVICE_ADD("acia_clock", CLOCK, XTAL_16MHz / 13) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bbc_state, write_acia_clock)) + /* adc */ MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) diff --git a/src/mess/drivers/bml3.c b/src/mess/drivers/bml3.c index a49d257e27d..5a3cd4814e2 100644 --- a/src/mess/drivers/bml3.c +++ b/src/mess/drivers/bml3.c @@ -18,6 +18,7 @@ #include "video/mc6845.h" #include "machine/6821pia.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "sound/2203intf.h" #include "sound/speaker.h" #include "sound/wave.h" @@ -65,16 +66,17 @@ class bml3_state : public driver_device { public: - bml3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_bml3bus(*this, "bml3bus") - , m_crtc(*this, "crtc") - , m_cass(*this, "cassette") - , m_speaker(*this, "speaker") - , m_ym2203(*this, "ym2203") - , m_uart(*this, "acia6850") - { } + bml3_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_bml3bus(*this, "bml3bus"), + m_crtc(*this, "crtc"), + m_cass(*this, "cassette"), + m_speaker(*this, "speaker"), + m_ym2203(*this, "ym2203"), + m_acia6850(*this, "acia6850") + { + } DECLARE_READ8_MEMBER(bml3_6845_r); DECLARE_WRITE8_MEMBER(bml3_6845_w); @@ -101,6 +103,7 @@ public: DECLARE_WRITE_LINE_MEMBER(bml3_acia_tx_w); DECLARE_WRITE_LINE_MEMBER(bml3_acia_rts_w); DECLARE_WRITE_LINE_MEMBER(bml3_acia_irq_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_READ8_MEMBER(bml3_a000_r); DECLARE_WRITE8_MEMBER(bml3_a000_w); DECLARE_READ8_MEMBER(bml3_c000_r); DECLARE_WRITE8_MEMBER(bml3_c000_w); @@ -148,7 +151,7 @@ private: required_device<cassette_image_device> m_cass; required_device<speaker_sound_device> m_speaker; optional_device<ym2203_device> m_ym2203; - required_device<acia6850_device> m_uart; + required_device<acia6850_device> m_acia6850; }; #define mc6845_h_char_total (m_crtc_vreg[0]) @@ -387,8 +390,8 @@ static ADDRESS_MAP_START(bml3_mem, AS_PROGRAM, 8, bml3_state) AM_RANGE(0x4400, 0x9fff) AM_RAM AM_RANGE(0xff40, 0xff46) AM_NOP // lots of unknown reads and writes AM_RANGE(0xffc0, 0xffc3) AM_DEVREADWRITE("pia6821", pia6821_device, read, write) - AM_RANGE(0xffc4, 0xffc4) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xffc5, 0xffc5) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xffc4, 0xffc4) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xffc5, 0xffc5) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xffc6, 0xffc7) AM_READWRITE(bml3_6845_r,bml3_6845_w) // KBNMI - Keyboard "Break" key non-maskable interrupt AM_RANGE(0xffc8, 0xffc8) AM_READ(bml3_keyb_nmi_r) // keyboard nmi @@ -745,7 +748,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( bml3_state::bml3_p ) if (cass_ws != m_cass_data[0]) { m_cass_data[0] = cass_ws; - m_uart->write_rx((m_cass_data[1] < 12) ? 1 : 0); + m_acia6850->write_rxd((m_cass_data[1] < 12) ? 1 : 0); m_cass_data[1] = 0; } } @@ -933,15 +936,11 @@ WRITE_LINE_MEMBER( bml3_state::bml3_acia_irq_w ) logerror("%02x TAPE IRQ\n",state); } -// 600 baud x 16(divider) = 9600 -static ACIA6850_INTERFACE( bml3_acia_if ) +WRITE_LINE_MEMBER( bml3_state::write_acia_clock ) { - 9600, - 9600, - DEVCB_DRIVER_LINE_MEMBER(bml3_state, bml3_acia_tx_w), - DEVCB_DRIVER_LINE_MEMBER(bml3_state, bml3_acia_rts_w), - DEVCB_DRIVER_LINE_MEMBER(bml3_state, bml3_acia_irq_w) -}; + m_acia6850->write_txc(state); + m_acia6850->write_rxc(state); +} TIMER_DEVICE_CALLBACK_MEMBER( bml3_state::bml3_c ) { @@ -1015,7 +1014,14 @@ static MACHINE_CONFIG_START( bml3_common, bml3_state ) MCFG_DEVICE_ADD("pia6821", PIA6821, 0) MCFG_PIA_WRITEPA_HANDLER(WRITE8(bml3_state, bml3_piaA_w)) - MCFG_ACIA6850_ADD("acia6850", bml3_acia_if) + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bml3_state, bml3_acia_tx_w)) + MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bml3_state, bml3_acia_rts_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bml3_state, bml3_acia_irq_w)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 9600) // 600 baud x 16(divider) = 9600 + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bml3_state, write_acia_clock)) + MCFG_CASSETTE_ADD( "cassette", default_cassette_interface ) /* Audio */ diff --git a/src/mess/drivers/c64.c b/src/mess/drivers/c64.c index 8080abfbaec..82690bcedcc 100644 --- a/src/mess/drivers/c64.c +++ b/src/mess/drivers/c64.c @@ -48,7 +48,7 @@ QUICKLOAD_LOAD_MEMBER( c64_state, cbm_c64 ) void c64_state::check_interrupts() { - int restore = m_restore ? !BIT(m_restore->read(), 0) : CLEAR_LINE; + int restore = 0; // TODO: push restore m_restore ? !BIT(m_restore->read(), 0) : CLEAR_LINE; int irq = m_cia1_irq || m_vic_irq || m_exp_irq; int nmi = m_cia2_irq || restore || m_exp_nmi; diff --git a/src/mess/drivers/cat.c b/src/mess/drivers/cat.c index 6057345f9c4..66b8513551c 100644 --- a/src/mess/drivers/cat.c +++ b/src/mess/drivers/cat.c @@ -360,6 +360,7 @@ ToDo: // Includes #include "emu.h" #include "cpu/m68000/m68000.h" +#include "machine/clock.h" #include "machine/n68681.h" #include "machine/6850acia.h" #include "machine/6522via.h" @@ -379,7 +380,7 @@ public: m_maincpu(*this, "maincpu"), //m_nvram(*this, "nvram"), // merge with svram? m_duart(*this, "duartn68681"), - m_acia(*this, "acia6850"), + m_acia6850(*this, "acia6850"), m_via0(*this, "via6522_0"), m_via1(*this, "via6522_1"), //m_speaker(*this, "speaker"), @@ -400,7 +401,7 @@ public: required_device<cpu_device> m_maincpu; //optional_device<nvram_device> m_nvram; optional_device<duartn68681_device> m_duart; // only cat uses this - optional_device<acia6850_device> m_acia; // only swyft uses this + optional_device<acia6850_device> m_acia6850; // only swyft uses this optional_device<via6522_device> m_via0; // only swyft uses this optional_device<via6522_device> m_via1; // only swyft uses this DECLARE_WRITE_LINE_MEMBER(cat_duart_irq_handler); @@ -478,6 +479,8 @@ public: DECLARE_WRITE_LINE_MEMBER(via1_cb2_w); DECLARE_WRITE_LINE_MEMBER(via1_int_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + UINT8 m_duart_inp; /* gate array 2 has a 16-bit counter inside which counts at 10mhz and rolls over at FFFF->0000; on roll-over (or maybe at FFFF terminal count) @@ -1246,7 +1249,7 @@ static ADDRESS_MAP_START(swyft_mem, AS_PROGRAM, 8, cat_state) AM_RANGE(0x000000, 0x00ffff) AM_ROM AM_MIRROR(0xF00000) // 64 KB ROM AM_RANGE(0x040000, 0x07ffff) AM_RAM AM_MIRROR(0xF00000) AM_SHARE("p_swyft_vram") // 256 KB RAM AM_RANGE(0x0d0000, 0x0d000f) AM_READ(swyft_d0000) AM_MIRROR(0xF00000) // status of something? reads from d0000, d0004, d0008, d000a, d000e - AM_RANGE(0x0e1000, 0x0e1000) AM_DEVWRITE("acia6850", acia6850_device, control_write) AM_MIRROR(0xF00000) // 6850 ACIA lives here + AM_RANGE(0x0e1000, 0x0e1000) AM_DEVWRITE("acia6850", acia6850_device, control_w) AM_MIRROR(0xF00000) // 6850 ACIA lives here AM_RANGE(0x0e2000, 0x0e2fff) AM_READWRITE(swyft_via0_r, swyft_via0_w) AM_MIRROR(0xF00000)// io area with selector on a9 a8 a7 a6? AM_RANGE(0x0e4000, 0x0e4fff) AM_READWRITE(swyft_via1_r, swyft_via1_w) AM_MIRROR(0xF00000) ADDRESS_MAP_END @@ -1297,15 +1300,6 @@ UINT32 cat_state::screen_update_swyft(screen_device &screen, bitmap_ind16 &bitma return 0; } -static const acia6850_interface swyft_acia_config = -{ - 3579545, // guess - 3579545, // guess - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - READ8_MEMBER( cat_state::swyft_d0000 ) { // wtf is this supposed to be? @@ -1447,6 +1441,12 @@ WRITE_LINE_MEMBER ( cat_state::via1_int_w ) logerror(" VIA1: INT output set to %d!\n", state); } +WRITE_LINE_MEMBER( cat_state::write_acia_clock ) +{ + m_acia6850->write_txc(state); + m_acia6850->write_rxc(state); +} + static MACHINE_CONFIG_START( swyft, cat_state ) /* basic machine hardware */ @@ -1469,7 +1469,11 @@ static MACHINE_CONFIG_START( swyft, cat_state ) MCFG_VIDEO_START_OVERRIDE(cat_state,swyft) - MCFG_ACIA6850_ADD("acia6850", swyft_acia_config) // unknown clock + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 3579545) // guess + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(cat_state, write_acia_clock)) + MCFG_DEVICE_ADD("via6522_0", VIA6522, XTAL_15_8976MHz/16) // unknown clock, GUESSED MCFG_VIA6522_READPA_HANDLER(READ8(cat_state, via0_pa_r)) MCFG_VIA6522_READPB_HANDLER(READ8(cat_state, via0_pb_r)) diff --git a/src/mess/drivers/ec65.c b/src/mess/drivers/ec65.c index 2065e1b2931..84a2b4b5241 100644 --- a/src/mess/drivers/ec65.c +++ b/src/mess/drivers/ec65.c @@ -59,8 +59,8 @@ static ADDRESS_MAP_START(ec65_mem, AS_PROGRAM, 8, ec65_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0xdfff) AM_RAM AM_RANGE(0xe000, 0xe003) AM_DEVREADWRITE(PIA6821_TAG, pia6821_device, read, write) - AM_RANGE(0xe010, 0xe010) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_device, status_read, control_write) - AM_RANGE(0xe011, 0xe011) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_device, data_read, data_write) + AM_RANGE(0xe010, 0xe010) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_device, status_r, control_w) + AM_RANGE(0xe011, 0xe011) AM_DEVREADWRITE(ACIA6850_TAG, acia6850_device, data_r, data_w) AM_RANGE(0xe100, 0xe10f) AM_DEVREADWRITE(VIA6522_0_TAG, via6522_device, read, write) AM_RANGE(0xe110, 0xe11f) AM_DEVREADWRITE(VIA6522_1_TAG, via6522_device, read, write) AM_RANGE(0xe130, 0xe133) AM_DEVREADWRITE(ACIA6551_TAG, mos6551_device, read, write) @@ -78,15 +78,6 @@ static ADDRESS_MAP_START(ec65k_mem, AS_PROGRAM, 8, ec65_state) AM_RANGE(0xf000, 0xffff) AM_ROM ADDRESS_MAP_END -static ACIA6850_INTERFACE( ec65_acia_intf ) -{ - 0, - 0, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - /* Input ports */ static INPUT_PORTS_START( ec65 ) INPUT_PORTS_END @@ -219,7 +210,8 @@ static MACHINE_CONFIG_START( ec65, ec65_state ) /* devices */ MCFG_DEVICE_ADD(PIA6821_TAG, PIA6821, 0) - MCFG_ACIA6850_ADD(ACIA6850_TAG, ec65_acia_intf) + + MCFG_DEVICE_ADD(ACIA6850_TAG, ACIA6850, 0) MCFG_DEVICE_ADD(VIA6522_0_TAG, VIA6522, XTAL_4MHz / 4) diff --git a/src/mess/drivers/h8.c b/src/mess/drivers/h8.c index 08c1795aa3b..ab75b43250b 100644 --- a/src/mess/drivers/h8.c +++ b/src/mess/drivers/h8.c @@ -49,6 +49,7 @@ TODO: #include "emu.h" #include "cpu/i8085/i8085.h" #include "machine/i8251.h" +#include "machine/clock.h" #include "imagedev/cassette.h" #include "sound/beep.h" #include "sound/wave.h" @@ -72,6 +73,7 @@ public: DECLARE_WRITE8_MEMBER(h8_status_callback); DECLARE_WRITE_LINE_MEMBER(h8_inte_callback); DECLARE_WRITE_LINE_MEMBER(txdata_callback); + DECLARE_WRITE_LINE_MEMBER(write_cassette_clock); TIMER_DEVICE_CALLBACK_MEMBER(h8_irq_pulse); TIMER_DEVICE_CALLBACK_MEMBER(h8_c); TIMER_DEVICE_CALLBACK_MEMBER(h8_p); @@ -266,15 +268,14 @@ WRITE_LINE_MEMBER( h8_state::txdata_callback ) m_cass_state = state; } -TIMER_DEVICE_CALLBACK_MEMBER(h8_state::h8_c) +WRITE_LINE_MEMBER( h8_state::write_cassette_clock ) { - /// TODO: double timer rate to get correct duty cycle - m_uart->write_rxc(1); - m_uart->write_txc(1); - - m_uart->write_rxc(0); - m_uart->write_rxc(0); + m_uart->write_txc(state); + m_uart->write_rxc(state); +} +TIMER_DEVICE_CALLBACK_MEMBER(h8_state::h8_c) +{ m_cass_data[3]++; if (m_cass_state) @@ -327,7 +328,10 @@ static MACHINE_CONFIG_START( h8, h8_state ) /* Devices */ MCFG_DEVICE_ADD("uart", I8251, 0) - MCFG_I8251_TXD_HANDLER(WRITELINE(h8_state,txdata_callback)) + MCFG_I8251_TXD_HANDLER(WRITELINE(h8_state, txdata_callback)) + + MCFG_DEVICE_ADD("cassette_clock", CLOCK, 4800) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(h8_state, write_cassette_clock)) MCFG_CASSETTE_ADD("cassette", h8_cassette_interface) MCFG_TIMER_DRIVER_ADD_PERIODIC("h8_c", h8_state, h8_c, attotime::from_hz(4800)) diff --git a/src/mess/drivers/kaypro.c b/src/mess/drivers/kaypro.c index 7501adf1a4d..40d03eb17cd 100644 --- a/src/mess/drivers/kaypro.c +++ b/src/mess/drivers/kaypro.c @@ -226,7 +226,8 @@ static MACHINE_CONFIG_START( kayproii, kaypro_state ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, NULL, NULL) // WD1943, SMC8116 + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) // WD1943, SMC8116 + MCFG_Z80PIO_ADD( "z80pio_g", 2500000, kayproii_pio_g_intf ) MCFG_Z80PIO_ADD( "z80pio_s", 2500000, kayproii_pio_s_intf ) MCFG_Z80SIO_ADD( "z80sio", 4800, kaypro_sio_intf ) /* start at 300 baud */ @@ -281,7 +282,7 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, NULL, NULL) // WD1943, SMC8116 + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) // WD1943, SMC8116 MCFG_Z80SIO_ADD( "z80sio", 4800, kaypro_sio_intf ) MCFG_Z80SIO_ADD( "z80sio_2x", 4800, kaypro_sio_intf ) /* extra sio for modem and printer */ MCFG_FD1793x_ADD("fdc", XTAL_16MHz / 16) diff --git a/src/mess/drivers/mekd2.c b/src/mess/drivers/mekd2.c index 96ea0a507b6..b0edcda10fc 100644 --- a/src/mess/drivers/mekd2.c +++ b/src/mess/drivers/mekd2.c @@ -76,6 +76,7 @@ TODO #include "cpu/m6800/m6800.h" #include "machine/6821pia.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "imagedev/cassette.h" #include "sound/wave.h" #include "imagedev/cartslot.h" @@ -137,8 +138,8 @@ private: static ADDRESS_MAP_START( mekd2_mem , AS_PROGRAM, 8, mekd2_state) AM_RANGE(0x0000, 0x00ff) AM_RAM // user ram AM_RANGE(0x8004, 0x8007) AM_DEVREADWRITE("pia_u", pia6821_device, read, write) - AM_RANGE(0x8008, 0x8008) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - AM_RANGE(0x8009, 0x8009) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + AM_RANGE(0x8008, 0x8008) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + AM_RANGE(0x8009, 0x8009) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) AM_RANGE(0x8020, 0x8023) AM_DEVREADWRITE("pia_s", pia6821_device, read, write) AM_RANGE(0xa000, 0xa07f) AM_RAM // system ram AM_RANGE(0xe000, 0xe3ff) AM_ROM AM_MIRROR(0x1c00) /* JBUG ROM */ @@ -299,15 +300,6 @@ WRITE_LINE_MEMBER( mekd2_state::cass_w ) m_cass_state = state; } -static ACIA6850_INTERFACE( mekd2_acia_intf ) -{ - XTAL_MEKD2 / 256, /* tx clock 4800Hz */ - 300, /* rx clock line, toggled by cassette circuit */ - DEVCB_DRIVER_LINE_MEMBER(mekd2_state, cass_w), /* out txd func */ - DEVCB_NULL, // cts - DEVCB_NULL /* out irq func NOT USED */ -}; - DEVICE_IMAGE_LOAD_MEMBER( mekd2_state,mekd2_cart ) { static const char magic[] = "MEK6800D2"; @@ -352,7 +344,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mekd2_state::mekd2_p) if (cass_ws != m_cass_data[0]) { m_cass_data[0] = cass_ws; - m_acia->write_rx((m_cass_data[1] < 12) ? 1 : 0); + m_acia->write_rxd((m_cass_data[1] < 12) ? 1 : 0); m_cass_data[1] = 0; } } @@ -397,7 +389,15 @@ static MACHINE_CONFIG_START( mekd2, mekd2_state ) MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line)) MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6800_cpu_device, irq_line)) - MCFG_ACIA6850_ADD("acia", mekd2_acia_intf) + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(mekd2_state, cass_w)) + + MCFG_DEVICE_ADD("acia_tx_clock", CLOCK, XTAL_MEKD2 / 256) // 4800Hz + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia", acia6850_device, write_txc)) + + MCFG_DEVICE_ADD("acia_rx_clock", CLOCK, 300) // toggled by cassette circuit + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxc)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_c", mekd2_state, mekd2_c, attotime::from_hz(4800)) MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_p", mekd2_state, mekd2_p, attotime::from_hz(40000)) MACHINE_CONFIG_END diff --git a/src/mess/drivers/mirage.c b/src/mess/drivers/mirage.c index 4e5797750bd..18b7b02757f 100644 --- a/src/mess/drivers/mirage.c +++ b/src/mess/drivers/mirage.c @@ -80,8 +80,6 @@ public: DECLARE_WRITE8_MEMBER(mirage_via_write_porta); DECLARE_WRITE8_MEMBER(mirage_via_write_portb); - DECLARE_WRITE_LINE_MEMBER(acia_irq_w); - UINT8 m_l_segs, m_r_segs; int m_l_hi, m_r_hi; }; @@ -94,11 +92,6 @@ static SLOT_INTERFACE_START( ensoniq_floppies ) SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) SLOT_INTERFACE_END -WRITE_LINE_MEMBER(mirage_state::acia_irq_w) -{ - m_maincpu->set_input_line(M6809_FIRQ_LINE, state); -} - void mirage_state::fdc_intrq_w(bool state) { m_maincpu->set_input_line(INPUT_LINE_NMI, state); @@ -138,8 +131,8 @@ static ADDRESS_MAP_START( mirage_map, AS_PROGRAM, 8, mirage_state ) AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("sndbank") // 32k window on 128k of wave RAM AM_RANGE(0x8000, 0xbfff) AM_RAM // main RAM AM_RANGE(0xc000, 0xdfff) AM_RAM // expansion RAM - AM_RANGE(0xe100, 0xe100) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) - AM_RANGE(0xe101, 0xe101) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) + AM_RANGE(0xe100, 0xe100) AM_DEVREADWRITE("acia6850", acia6850_device, status_r, control_w) + AM_RANGE(0xe101, 0xe101) AM_DEVREADWRITE("acia6850", acia6850_device, data_r, data_w) AM_RANGE(0xe200, 0xe2ff) AM_DEVREADWRITE("via6522", via6522_device, read, write) AM_RANGE(0xe400, 0xe4ff) AM_NOP AM_RANGE(0xe800, 0xe803) AM_DEVREADWRITE("wd1772", wd1772_t, read, write) @@ -221,15 +214,6 @@ WRITE8_MEMBER(mirage_state::mirage_via_write_portb) } } -static ACIA6850_INTERFACE( mirage_acia6850_interface ) -{ - 0, // tx clock - 0, // rx clock - DEVCB_NULL, // rx out - DEVCB_NULL, // rts out - DEVCB_DRIVER_LINE_MEMBER(mirage_state, acia_irq_w) -}; - static MACHINE_CONFIG_START( mirage, mirage_state ) MCFG_CPU_ADD("maincpu", M6809E, 4000000) MCFG_CPU_PROGRAM_MAP(mirage_map) @@ -246,7 +230,8 @@ static MACHINE_CONFIG_START( mirage, mirage_state ) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(mirage_state, mirage_via_write_portb)) MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line)) - MCFG_ACIA6850_ADD("acia6850", mirage_acia6850_interface) + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("maincpu", m6809e_device, firq_line)) MCFG_WD1772x_ADD("wd1772", 8000000) MCFG_FLOPPY_DRIVE_ADD("wd1772:0", ensoniq_floppies, "35dd", mirage_state::floppy_formats) diff --git a/src/mess/drivers/mx2178.c b/src/mess/drivers/mx2178.c index 18d206a5fca..621029285b0 100644 --- a/src/mess/drivers/mx2178.c +++ b/src/mess/drivers/mx2178.c @@ -21,6 +21,7 @@ #include "cpu/z80/z80.h" #include "video/mc6845.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/keyboard.h" #define KEYBOARD_TAG "keyboard" @@ -28,21 +29,28 @@ class mx2178_state : public driver_device { public: - mx2178_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + mx2178_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_p_videoram(*this, "videoram"), - m_maincpu(*this, "maincpu") + m_maincpu(*this, "maincpu"), + m_acia(*this, "acia") { } DECLARE_READ8_MEMBER(keyin_r); DECLARE_WRITE8_MEMBER(kbd_put); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + const UINT8 *m_p_chargen; required_shared_ptr<UINT8> m_p_videoram; + +protected: + virtual void machine_reset(); + private: UINT8 m_term_data; - virtual void machine_reset(); required_device<z80_device> m_maincpu; + required_device<acia6850_device> m_acia; }; static ADDRESS_MAP_START(mx2178_mem, AS_PROGRAM, 8, mx2178_state) @@ -57,8 +65,8 @@ static ADDRESS_MAP_START(mx2178_io, AS_IO, 8, mx2178_state) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_DEVWRITE("crtc", mc6845_device, address_w) AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w) - //AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - //AM_RANGE(0xa1, 0xa1) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + //AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + //AM_RANGE(0xa1, 0xa1) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) AM_RANGE(0xa0, 0xa1) AM_READ(keyin_r) ADDRESS_MAP_END @@ -90,21 +98,6 @@ static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) DEVCB_DRIVER_MEMBER(mx2178_state, kbd_put) }; -//------------------------------------------------- -// ACIA6850_INTERFACE( acia0_intf ) -//------------------------------------------------- - -#if 0 -static ACIA6850_INTERFACE( acia_intf ) -{ - 614400, - 614400, - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0) -}; -#endif - static MC6845_UPDATE_ROW( update_row ) { mx2178_state *state = device->machine().driver_data<mx2178_state>(); @@ -171,6 +164,12 @@ void mx2178_state::machine_reset() m_p_chargen = memregion("chargen")->base(); } +WRITE_LINE_MEMBER(mx2178_state::write_acia_clock) +{ + m_acia->write_txc(state); + m_acia->write_rxc(state); +} + static MACHINE_CONFIG_START( mx2178, mx2178_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 18869600/5) // guess @@ -190,12 +189,16 @@ static MACHINE_CONFIG_START( mx2178, mx2178_state ) /* Devices */ MCFG_MC6845_ADD("crtc", MC6845, "screen", 18869600 / 8, crtc_interface) // clk unknown + + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + + /// TODO: hook up acia to keyboard and memory map + MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) - //MCFG_ACIA6850_ADD("acia", acia_intf) - //MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - //MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rx)) - //MCFG_RS232_OUT_DCD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_dcd)) - //MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 614400) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(mx2178_state, write_acia_clock)) + MACHINE_CONFIG_END /* ROM definition */ diff --git a/src/mess/drivers/nc.c b/src/mess/drivers/nc.c index 8c9d6e08496..612e6da176b 100644 --- a/src/mess/drivers/nc.c +++ b/src/mess/drivers/nc.c @@ -97,7 +97,6 @@ #include "emuopts.h" #include "cpu/z80/z80.h" #include "includes/nc.h" -#include "machine/i8251.h" /* for NC100 uart */ #include "machine/mc146818.h" /* for NC200 real time clock */ #include "machine/rp5c01.h" /* for NC100 real time clock */ #include "machine/upd765.h" /* for NC200 disk drive interface */ @@ -683,28 +682,22 @@ WRITE8_MEMBER(nc_state::nc_sound_w) } } -static const unsigned long baud_rate_table[]= +static const int baud_rate_table[]= { - 150, - 300, - 600, - 1200, - 2400, - 4800, - 9600, - 19200 + 128, //150 + 64, //300 + 32, //600 + 16, //1200 + 8, //2400 + 4, //4800 + 2, //9600 + 1, //19200 }; -TIMER_CALLBACK_MEMBER(nc_state::nc_serial_timer_callback) +WRITE_LINE_MEMBER(nc_state::write_uart_clock) { - i8251_device *uart = machine().device<i8251_device>("uart"); - - /// TODO: double timer rate to provide correct duty cycle - uart->write_txc(1); - uart->write_rxc(1); - - uart->write_txc(0); - uart->write_rxc(0); + m_uart->write_txc(state); + m_uart->write_rxc(state); } WRITE8_MEMBER(nc_state::nc_uart_control_w) @@ -722,7 +715,7 @@ WRITE8_MEMBER(nc_state::nc_uart_control_w) } } - m_serial_timer->adjust(attotime::zero, 0, attotime::from_hz(baud_rate_table[(data & 0x07)])); + m_uart_clock->set_clock_scale((double)1 / baud_rate_table[(data & 0x07)]); m_uart_control = data; } @@ -849,9 +842,6 @@ void nc_state::machine_start() /* keyboard timer */ m_keyboard_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(nc_state::nc_keyboard_timer_callback),this)); m_keyboard_timer->adjust(attotime::from_msec(10)); - - /* serial timer */ - m_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(nc_state::nc_serial_timer_callback),this)); } @@ -1190,7 +1180,6 @@ MACHINE_START_MEMBER(nc_state,nc200) m_keyboard_timer->adjust(attotime::from_msec(10)); /* serial timer */ - m_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(nc_state::nc_serial_timer_callback),this)); machine().device<upd765a_device>("upd765")->setup_intrq_cb(upd765a_device::line_cb(FUNC(nc_state::nc200_fdc_interrupt), this)); } @@ -1442,7 +1431,6 @@ static MACHINE_CONFIG_START( nc100, nc_state ) MCFG_CPU_IO_MAP(nc100_io) MCFG_QUANTUM_TIME(attotime::from_hz(60)) - /* video hardware */ MCFG_SCREEN_ADD("screen", LCD) MCFG_SCREEN_REFRESH_RATE(50) @@ -1454,7 +1442,6 @@ static MACHINE_CONFIG_START( nc100, nc_state ) MCFG_PALETTE_LENGTH(NC_NUM_COLOURS) MCFG_DEFAULT_LAYOUT(layout_lcd) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("beep.1", BEEP, 0) @@ -1474,6 +1461,9 @@ static MACHINE_CONFIG_START( nc100, nc_state ) MCFG_I8251_RXRDY_HANDLER(WRITELINE(nc_state,nc100_rxrdy_callback)) MCFG_I8251_TXRDY_HANDLER(WRITELINE(nc_state,nc100_txrdy_callback)) + MCFG_DEVICE_ADD("uart_clock", CLOCK, 19200) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(nc_state, write_uart_clock)) + /* rtc */ MCFG_RP5C01_ADD("rtc", XTAL_32_768kHz, rtc_intf) diff --git a/src/mess/drivers/newbrain.c b/src/mess/drivers/newbrain.c index 5ee1244eff8..cd404d86671 100644 --- a/src/mess/drivers/newbrain.c +++ b/src/mess/drivers/newbrain.c @@ -1009,8 +1009,8 @@ static ADDRESS_MAP_START( newbrain_ei_io_map, AS_IO, 8, newbrain_eim_state ) AM_RANGE(0x15, 0x15) AM_MIRROR(0xff00) AM_READ(st1_r) AM_RANGE(0x16, 0x16) AM_MIRROR(0xff00) AM_READ(st2_r) AM_RANGE(0x17, 0x17) AM_MIRROR(0xff00) AM_READWRITE(usbs_r, usbs_w) - AM_RANGE(0x18, 0x18) AM_MIRROR(0xff00) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_read, control_write) - AM_RANGE(0x19, 0x19) AM_MIRROR(0xff00) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_read, data_write) + AM_RANGE(0x18, 0x18) AM_MIRROR(0xff00) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_r, control_w) + AM_RANGE(0x19, 0x19) AM_MIRROR(0xff00) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_r, data_w) AM_RANGE(0x1c, 0x1f) AM_MIRROR(0xff00) AM_DEVREADWRITE(Z80CTC_TAG, z80ctc_device, read, write) AM_RANGE(0xff, 0xff) AM_MIRROR(0xff00) AM_MASK(0xff00) AM_WRITE(paging_w) ADDRESS_MAP_END @@ -1163,32 +1163,11 @@ WRITE_LINE_MEMBER( newbrain_eim_state::acia_interrupt ) m_aciaint = state; } -static ACIA6850_INTERFACE( acia_intf ) -{ - 0, - 0, - DEVCB_DRIVER_LINE_MEMBER(newbrain_eim_state, acia_tx), - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(newbrain_eim_state, acia_interrupt) -}; - WRITE_LINE_MEMBER( newbrain_eim_state::fdc_interrupt ) { m_fdc_int = state; } -WRITE_LINE_MEMBER( newbrain_eim_state::ctc_z0_w ) -{ - /* connected to the ACIA receive clock */ - if (state) m_acia->rx_clock_in(); -} - -WRITE_LINE_MEMBER( newbrain_eim_state::ctc_z1_w ) -{ - /* connected to the ACIA transmit clock */ - if (state) m_acia->tx_clock_in(); -} - WRITE_LINE_MEMBER( newbrain_eim_state::ctc_z2_w ) { /* connected to CTC channel 0/1 clock inputs */ @@ -1199,8 +1178,8 @@ WRITE_LINE_MEMBER( newbrain_eim_state::ctc_z2_w ) static Z80CTC_INTERFACE( newbrain_ctc_intf ) { DEVCB_NULL, /* interrupt handler */ - DEVCB_DRIVER_LINE_MEMBER(newbrain_eim_state, ctc_z0_w), /* ZC/TO0 callback */ - DEVCB_DRIVER_LINE_MEMBER(newbrain_eim_state, ctc_z1_w), /* ZC/TO1 callback */ + DEVCB_DEVICE_LINE_MEMBER(MC6850_TAG, acia6850_device, write_rxc), /* ZC/TO0 callback */ + DEVCB_DEVICE_LINE_MEMBER(MC6850_TAG, acia6850_device, write_txc), /* ZC/TO1 callback */ DEVCB_DRIVER_LINE_MEMBER(newbrain_eim_state, ctc_z2_w) /* ZC/TO2 callback */ }; @@ -1404,7 +1383,11 @@ static MACHINE_CONFIG_DERIVED_CLASS( newbrain_eim, newbrain_a, newbrain_eim_stat MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_16MHz/8, newbrain_ctc_intf) MCFG_TIMER_DRIVER_ADD_PERIODIC("z80ctc_c2", newbrain_eim_state, ctc_c2_tick, attotime::from_hz(XTAL_16MHz/4/13)) MCFG_ADC0808_ADD(ADC0809_TAG, 500000, adc_intf) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(newbrain_eim_state, acia_tx)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(newbrain_eim_state, acia_interrupt)) + MCFG_UPD765A_ADD(UPD765_TAG, false, true) MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", newbrain_floppies, "525dd", floppy_image_device::default_floppy_formats) diff --git a/src/mess/drivers/ob68k1a.c b/src/mess/drivers/ob68k1a.c index 44a276cff01..65acc7784e1 100644 --- a/src/mess/drivers/ob68k1a.c +++ b/src/mess/drivers/ob68k1a.c @@ -120,11 +120,11 @@ static ADDRESS_MAP_START( ob68k1a_mem, AS_PROGRAM, 16, ob68k1a_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x000000, 0x01ffff) AM_RAM AM_RANGE(0xfe0000, 0xfeffff) AM_ROM AM_REGION(MC68000L10_TAG, 0) - AM_RANGE(0xffff00, 0xffff01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_read, control_write, 0x00ff) - AM_RANGE(0xffff02, 0xffff03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_read, data_write, 0x00ff) + AM_RANGE(0xffff00, 0xffff01) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, status_r, control_w, 0x00ff) + AM_RANGE(0xffff02, 0xffff03) AM_DEVREADWRITE8(MC6850_0_TAG, acia6850_device, data_r, data_w, 0x00ff) AM_RANGE(0xffff10, 0xffff11) AM_WRITE8(com8116_w, 0xff00) - AM_RANGE(0xffff20, 0xffff21) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_read, control_write, 0x00ff) - AM_RANGE(0xffff22, 0xffff23) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_read, data_write, 0x00ff) + AM_RANGE(0xffff20, 0xffff21) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, status_r, control_w, 0x00ff) + AM_RANGE(0xffff22, 0xffff23) AM_DEVREADWRITE8(MC6850_1_TAG, acia6850_device, data_r, data_w, 0x00ff) // AM_RANGE(0xffff40, 0xffff47) AM_DEVREADWRITE8(MC6821_0_TAG, pia6821_device, read, write, 0x00ff) // AM_RANGE(0xffff40, 0xffff47) AM_DEVREADWRITE8(MC6821_1_TAG, pia6821_device, read, write, 0xff00) AM_RANGE(0xffff40, 0xffff47) AM_READWRITE8(pia_r, pia_w, 0xffff) @@ -166,47 +166,19 @@ static const ptm6840_interface ptm_intf = //------------------------------------------------- -// ACIA6850_INTERFACE( acia0_intf ) -//------------------------------------------------- - -static ACIA6850_INTERFACE( acia0_intf ) -{ - 0, - 0, - DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, rs232_port_device, write_rts), - DEVCB_NULL -}; - - -//------------------------------------------------- -// ACIA6850_INTERFACE( acia1_intf ) -//------------------------------------------------- - -static ACIA6850_INTERFACE( acia1_intf ) -{ - 0, - 0, - DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, write_rts), - DEVCB_NULL, -}; - - -//------------------------------------------------- // COM8116_INTERFACE( dbrg_intf ) //------------------------------------------------- WRITE_LINE_MEMBER( ob68k1a_state::rx_tx_0_w ) { - m_acia0->rx_clock_in(); - m_acia0->tx_clock_in(); + m_acia0->write_rxc(state); + m_acia0->write_txc(state); } WRITE_LINE_MEMBER( ob68k1a_state::rx_tx_1_w ) { - m_acia1->rx_clock_in(); - m_acia1->tx_clock_in(); + m_acia1->write_rxc(state); + m_acia1->write_txc(state); } @@ -267,20 +239,29 @@ static MACHINE_CONFIG_START( ob68k1a, ob68k1a_state ) MCFG_DEVICE_ADD(MC6821_0_TAG, PIA6821, 0) MCFG_DEVICE_ADD(MC6821_1_TAG, PIA6821, 0) MCFG_PTM6840_ADD(MC6840_TAG, ptm_intf) - MCFG_ACIA6850_ADD(MC6850_0_TAG, acia0_intf) - MCFG_ACIA6850_ADD(MC6850_1_TAG, acia1_intf) - MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, WRITELINE(ob68k1a_state, rx_tx_0_w), WRITELINE(ob68k1a_state, rx_tx_1_w)) + + MCFG_DEVICE_ADD(MC6850_0_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE(RS232_A_TAG, rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE(RS232_A_TAG, rs232_port_device, write_rts)) MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, "serial_terminal") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC6850_0_TAG, acia6850_device, write_rx)) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC6850_0_TAG, acia6850_device, write_rxd)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(MC6850_0_TAG, acia6850_device, write_dcd)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(MC6850_0_TAG, acia6850_device, write_cts)) + MCFG_DEVICE_ADD(MC6850_1_TAG, ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE(RS232_B_TAG, rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE(RS232_B_TAG, rs232_port_device, write_rts)) + MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) - MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rx)) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_rxd)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_dcd)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(MC6850_1_TAG, acia6850_device, write_cts)) + MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(ob68k1a_state, rx_tx_0_w)) + MCFG_COM8116_FT_HANDLER(WRITELINE(ob68k1a_state, rx_tx_1_w)) + // internal ram MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("32K") diff --git a/src/mess/drivers/osi.c b/src/mess/drivers/osi.c index 7ef0691178b..6944321bb71 100644 --- a/src/mess/drivers/osi.c +++ b/src/mess/drivers/osi.c @@ -215,6 +215,7 @@ PRINT FRE(0) #include "includes/osi.h" +#include "machine/clock.h" /* Sound */ @@ -457,8 +458,8 @@ static ADDRESS_MAP_START( osi600_mem, AS_PROGRAM, 8, sb2m600_state ) AM_RANGE(0xa000, 0xbfff) AM_ROM AM_RANGE(0xd000, 0xd3ff) AM_RAM AM_SHARE("video_ram") AM_RANGE(0xdf00, 0xdf00) AM_READWRITE(keyboard_r, keyboard_w) - AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_read, control_write) - AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_read, data_write) + AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_r, control_w) + AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_r, data_w) AM_RANGE(0xf800, 0xffff) AM_ROM ADDRESS_MAP_END @@ -468,8 +469,8 @@ static ADDRESS_MAP_START( uk101_mem, AS_PROGRAM, 8, uk101_state ) AM_RANGE(0xd000, 0xd3ff) AM_RAM AM_SHARE("video_ram") AM_RANGE(0xd400, 0xd7ff) AM_NOP // bios sets this to spaces at boot AM_RANGE(0xdc00, 0xdfff) AM_READ(keyboard_r) AM_WRITE(keyboard_w) - AM_RANGE(0xf000, 0xf000) AM_MIRROR(0x00fe) AM_DEVREADWRITE("acia_0", acia6850_device, status_read, control_write) - AM_RANGE(0xf001, 0xf001) AM_MIRROR(0x00fe) AM_DEVREADWRITE("acia_0", acia6850_device, data_read, data_write) + AM_RANGE(0xf000, 0xf000) AM_MIRROR(0x00fe) AM_DEVREADWRITE("acia_0", acia6850_device, status_r, control_w) + AM_RANGE(0xf001, 0xf001) AM_MIRROR(0x00fe) AM_DEVREADWRITE("acia_0", acia6850_device, data_r, data_w) AM_RANGE(0xf800, 0xffff) AM_ROM ADDRESS_MAP_END @@ -483,8 +484,8 @@ static ADDRESS_MAP_START( c1p_mem, AS_PROGRAM, 8, c1p_state ) AM_RANGE(0xd400, 0xd7ff) AM_RAM AM_SHARE("color_ram") AM_RANGE(0xd800, 0xd800) AM_WRITE(ctrl_w) AM_RANGE(0xdf00, 0xdf00) AM_READWRITE(keyboard_r, keyboard_w) - AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_read, control_write) - AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_read, data_write) + AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_r, control_w) + AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_r, data_w) AM_RANGE(0xf7c0, 0xf7c0) AM_WRITE(osi630_sound_w) AM_RANGE(0xf7e0, 0xf7e0) AM_WRITE(osi630_ctrl_w) AM_RANGE(0xf800, 0xffff) AM_ROM @@ -494,8 +495,8 @@ static ADDRESS_MAP_START( c1pmf_mem, AS_PROGRAM, 8, c1pmf_state ) AM_RANGE(0x0000, 0x4fff) AM_RAMBANK("bank1") AM_RANGE(0xa000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("pia_0", pia6821_device, read, write) // FDC - AM_RANGE(0xc010, 0xc010) AM_DEVREADWRITE("acia_1", acia6850_device, status_read, control_write) - AM_RANGE(0xc011, 0xc011) AM_DEVREADWRITE("acia_1", acia6850_device, data_read, data_write) + AM_RANGE(0xc010, 0xc010) AM_DEVREADWRITE("acia_1", acia6850_device, status_r, control_w) + AM_RANGE(0xc011, 0xc011) AM_DEVREADWRITE("acia_1", acia6850_device, data_r, data_w) AM_RANGE(0xc704, 0xc707) AM_DEVREADWRITE("pia_1", pia6821_device, read, write) AM_RANGE(0xc708, 0xc70b) AM_DEVREADWRITE("pia_2", pia6821_device, read, write) AM_RANGE(0xc70c, 0xc70f) AM_DEVREADWRITE("pia_3", pia6821_device, read, write) @@ -503,8 +504,8 @@ static ADDRESS_MAP_START( c1pmf_mem, AS_PROGRAM, 8, c1pmf_state ) AM_RANGE(0xd400, 0xd7ff) AM_RAM AM_SHARE("color_ram") AM_RANGE(0xd800, 0xd800) AM_WRITE(ctrl_w) AM_RANGE(0xdf00, 0xdf00) AM_READWRITE(keyboard_r, keyboard_w) - AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_read, control_write) - AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_read, data_write) + AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("acia_0", acia6850_device, status_r, control_w) + AM_RANGE(0xf001, 0xf001) AM_DEVREADWRITE("acia_0", acia6850_device, data_r, data_w) AM_RANGE(0xf7c0, 0xf7c0) AM_WRITE(osi630_sound_w) AM_RANGE(0xf7e0, 0xf7e0) AM_WRITE(osi630_ctrl_w) AM_RANGE(0xf800, 0xffff) AM_ROM @@ -614,9 +615,12 @@ INPUT_PORTS_END /* Machine Start */ -TIMER_DEVICE_CALLBACK_MEMBER( sb2m600_state::tape_tick ) +WRITE_LINE_MEMBER( sb2m600_state::write_cassette_clock ) { - m_acia_0->write_rx((m_cassette->input() > 0.0) ? 1 : 0); + m_acia_0->write_rxd((m_cassette->input() > 0.0) ? 1 : 0); + + m_acia_0->write_txc(state); + m_acia_0->write_rxc(state); } WRITE_LINE_MEMBER( sb2m600_state::cassette_tx ) @@ -624,33 +628,6 @@ WRITE_LINE_MEMBER( sb2m600_state::cassette_tx ) m_cassette->output(state ? +1.0 : -1.0); } -static ACIA6850_INTERFACE( osi600_acia_intf ) -{ - X1/32, - X1/32, - DEVCB_DRIVER_LINE_MEMBER(sb2m600_state, cassette_tx), - DEVCB_NULL, - DEVCB_NULL -}; - -static ACIA6850_INTERFACE( uk101_acia_intf ) -{ - 500000, // - 500000, // - DEVCB_DRIVER_LINE_MEMBER(sb2m600_state, cassette_tx), - DEVCB_NULL, - DEVCB_NULL -}; - -static ACIA6850_INTERFACE( osi470_acia_intf ) -{ - 0, // clocked in from the floppy drive - XTAL_4MHz/8, // 250 kHz - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - void sb2m600_state::machine_start() { address_space &program = m_maincpu->space(AS_PROGRAM); @@ -767,11 +744,14 @@ static MACHINE_CONFIG_START( osi600, sb2m600_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) /* cassette ACIA */ - MCFG_ACIA6850_ADD("acia_0", osi600_acia_intf) + MCFG_DEVICE_ADD("acia_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(sb2m600_state, cassette_tx)) + + MCFG_DEVICE_ADD("cassette_clock", CLOCK, X1/32) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(sb2m600_state, write_cassette_clock)) /* cassette */ MCFG_CASSETTE_ADD("cassette", default_cassette_interface) - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", sb2m600_state, tape_tick, attotime::from_hz(44100)) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -789,11 +769,14 @@ static MACHINE_CONFIG_START( uk101, uk101_state ) MCFG_GFXDECODE_ADD("gfxdecode", osi) /* cassette ACIA */ - MCFG_ACIA6850_ADD("acia_0", uk101_acia_intf) + MCFG_DEVICE_ADD("acia_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(sb2m600_state, cassette_tx)) + + MCFG_DEVICE_ADD("cassette_clock", CLOCK, 500000) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(sb2m600_state, write_cassette_clock)) /* cassette */ MCFG_CASSETTE_ADD("cassette", default_cassette_interface) - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", sb2m600_state, tape_tick, attotime::from_hz(44100)) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -823,11 +806,14 @@ static MACHINE_CONFIG_START( c1p, c1p_state ) MCFG_DEVICE_ADD("pia_3", PIA6821, 0) /* cassette ACIA */ - MCFG_ACIA6850_ADD("acia_0", osi600_acia_intf) + MCFG_DEVICE_ADD("acia_0", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(sb2m600_state, cassette_tx)) + + MCFG_DEVICE_ADD("cassette_clock", CLOCK, X1/32) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(sb2m600_state, write_cassette_clock)) /* cassette */ MCFG_CASSETTE_ADD("cassette", default_cassette_interface) - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", sb2m600_state, tape_tick, attotime::from_hz(44100)) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -846,7 +832,10 @@ static MACHINE_CONFIG_DERIVED_CLASS( c1pmf, c1p, c1pmf_state ) MCFG_PIA_CB2_HANDLER(WRITELINE(c1pmf_state, osi470_pia_cb2_w)) /* floppy ACIA */ - MCFG_ACIA6850_ADD("acia_1", osi470_acia_intf) + MCFG_DEVICE_ADD("acia_1", ACIA6850, 0) + + MCFG_DEVICE_ADD("floppy_clock", CLOCK, XTAL_4MHz/8) // 250 kHz + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia_1", acia6850_device, write_txc)) MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, osi_floppy_interface) diff --git a/src/mess/drivers/poly.c b/src/mess/drivers/poly.c index 38d18f6e2f1..4731d369773 100644 --- a/src/mess/drivers/poly.c +++ b/src/mess/drivers/poly.c @@ -35,6 +35,7 @@ #include "machine/6821pia.h" #include "machine/6840ptm.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/mc6854.h" #include "video/saa5050.h" #include "machine/keyboard.h" @@ -50,20 +51,27 @@ public: m_maincpu(*this, "maincpu"), m_pia0(*this, "pia0"), m_pia1(*this, "pia1"), + m_acia(*this, "acia"), m_videoram(*this, "videoram") { } + DECLARE_WRITE8_MEMBER(kbd_put); + DECLARE_READ8_MEMBER(pia1_b_in); + DECLARE_READ8_MEMBER(videoram_r); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + +protected: + virtual void machine_reset(); + +private: required_device<cpu_device> m_maincpu; required_device<pia6821_device> m_pia0; required_device<pia6821_device> m_pia1; + required_device<acia6850_device> m_acia; required_shared_ptr<UINT8> m_videoram; - DECLARE_WRITE8_MEMBER(kbd_put); - DECLARE_READ8_MEMBER(pia1_b_in); - DECLARE_READ8_MEMBER(videoram_r); UINT8 m_term_data; bool m_term_key; - virtual void machine_reset(); }; @@ -73,8 +81,8 @@ static ADDRESS_MAP_START(poly_mem, AS_PROGRAM, 8, poly_state) AM_RANGE(0xa000,0xcfff) AM_ROM AM_RANGE(0xd000,0xdfff) AM_RAM AM_RANGE(0xe000,0xe003) AM_DEVREADWRITE("pia0", pia6821_device, read, write) //video control PIA 6821 - AM_RANGE(0xe004,0xe004) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - AM_RANGE(0xe005,0xe005) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + AM_RANGE(0xe004,0xe004) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + AM_RANGE(0xe005,0xe005) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) //AM_RANGE(0xe006, 0xe006) // baud rate controller (0=9600,2=4800,4=2400,6=1200,8=600,A=300) AM_RANGE(0xe00c,0xe00f) AM_DEVREADWRITE("pia1", pia6821_device, read, write) //keyboard PIA 6821 AM_RANGE(0xe020,0xe027) AM_DEVREADWRITE("ptm", ptm6840_device, read, write) //timer 6840 @@ -119,15 +127,6 @@ static const ptm6840_interface poly_ptm_intf = DEVCB_CPU_INPUT_LINE("maincpu", M6809_IRQ_LINE) }; -static ACIA6850_INTERFACE( acia_intf ) -{ - 1, - 1, - DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, tx), - DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_NULL -}; - static const mc6854_interface adlc_intf = { DEVCB_NULL, @@ -156,6 +155,12 @@ WRITE8_MEMBER( poly_state::kbd_put ) m_pia1->cb1_w(0); } +WRITE_LINE_MEMBER( poly_state::write_acia_clock ) +{ + m_acia->write_txc(state); + m_acia->write_rxc(state); +} + static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) { DEVCB_DRIVER_MEMBER(poly_state, kbd_put) @@ -193,7 +198,14 @@ static MACHINE_CONFIG_START( poly, poly_state ) MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line)) MCFG_PTM6840_ADD("ptm", poly_ptm_intf) - MCFG_ACIA6850_ADD("acia", acia_intf) + + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + //MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + //MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + //MCFG_DEVICE_ADD("acia_clock", CLOCK, 1) + //MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(poly_state, write_acia_clock)) + MCFG_MC6854_ADD("adlc", adlc_intf) MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) diff --git a/src/mess/drivers/pulsar.c b/src/mess/drivers/pulsar.c index 3c8c318e1b5..34831f88abe 100644 --- a/src/mess/drivers/pulsar.c +++ b/src/mess/drivers/pulsar.c @@ -48,15 +48,16 @@ X - Test off-board memory banks class pulsar_state : public driver_device { public: - pulsar_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_dart(*this, "z80dart") - , m_brg(*this, "brg") - , m_fdc (*this, "fdc") - , m_floppy0(*this, "fdc:0") - , m_rtc(*this, "rtc") - { } + pulsar_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_dart(*this, "z80dart"), + m_brg(*this, "brg"), + m_fdc (*this, "fdc"), + m_floppy0(*this, "fdc:0"), + m_rtc(*this, "rtc") + { + } DECLARE_DRIVER_INIT(pulsar); DECLARE_MACHINE_RESET(pulsar); @@ -258,14 +259,18 @@ static MACHINE_CONFIG_START( pulsar, pulsar_state ) /* Devices */ MCFG_I8255_ADD( "ppi", ppi_intf ) MCFG_MSM5832_ADD("rtc", XTAL_32_768kHz) - MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, WRITELINE(pulsar_state, fr_w), WRITELINE(pulsar_state, ft_w)) + MCFG_Z80DART_ADD("z80dart", XTAL_4MHz, dart_intf ) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") MCFG_RS232_RXD_HANDLER(DEVWRITELINE("z80dart", z80dart_device, rxa_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("z80dart", z80dart_device, ctsa_w)) - MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("serial_terminal", terminal) + + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(pulsar_state, fr_w)) + MCFG_COM8116_FT_HANDLER(WRITELINE(pulsar_state, ft_w)) + MCFG_FD1797x_ADD("fdc", XTAL_4MHz / 2) MCFG_FLOPPY_DRIVE_ADD("fdc:0", pulsar_floppies, "525dd", floppy_image_device::default_floppy_formats) MACHINE_CONFIG_END diff --git a/src/mess/drivers/rainbow.c b/src/mess/drivers/rainbow.c index 92d54855a27..5a0184a4c6d 100644 --- a/src/mess/drivers/rainbow.c +++ b/src/mess/drivers/rainbow.c @@ -173,6 +173,7 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND). #include "formats/basicdsk.h" #include "machine/i8251.h" +#include "machine/clock.h" #include "machine/dec_lk201.h" #include "machine/nvram.h" @@ -183,17 +184,17 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND). class rainbow_state : public driver_device { public: - rainbow_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_inp1(*this, "W13"), - m_inp2(*this, "W14"), - m_inp3(*this, "W15"), - m_inp4(*this, "W18"), - m_inp5(*this, "BUNDLE OPTION"), - m_inp6(*this, "FLOPPY CONTROLLER"), - m_inp7(*this, "GRAPHICS OPTION"), - m_inp8(*this, "MEMORY PRESENT"), - m_inp9(*this, "MONITOR TYPE"), + rainbow_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_inp1(*this, "W13"), + m_inp2(*this, "W14"), + m_inp3(*this, "W15"), + m_inp4(*this, "W18"), + m_inp5(*this, "BUNDLE OPTION"), + m_inp6(*this, "FLOPPY CONTROLLER"), + m_inp7(*this, "GRAPHICS OPTION"), + m_inp8(*this, "MEMORY PRESENT"), + m_inp9(*this, "MONITOR TYPE"), m_crtc(*this, "vt100_video"), m_i8088(*this, "maincpu"), @@ -207,31 +208,9 @@ public: m_p_nvram(*this, "nvram"), m_shared(*this, "sh_ram"), - m_maincpu(*this, "maincpu") { } - - required_ioport m_inp1; - required_ioport m_inp2; - required_ioport m_inp3; - required_ioport m_inp4; - required_ioport m_inp5; - required_ioport m_inp6; - required_ioport m_inp7; - required_ioport m_inp8; - required_ioport m_inp9; - - required_device<rainbow_video_device> m_crtc; - required_device<cpu_device> m_i8088; - required_device<cpu_device> m_z80; - required_device<fd1793_device> m_fdc; - required_device<i8251_device> m_kbd8251; - required_device<lk201_device> m_lk201; - required_shared_ptr<UINT8> m_p_ram; - required_shared_ptr<UINT8> m_p_vol_ram; - required_shared_ptr<UINT8> m_p_nvram; - required_shared_ptr<UINT8> m_shared; - UINT8 m_diagnostic; - - virtual void machine_start(); + m_maincpu(*this, "maincpu") + { + } DECLARE_READ8_MEMBER(read_video_ram_r); DECLARE_WRITE8_MEMBER(clear_video_interrupt); @@ -269,6 +248,37 @@ public: DECLARE_WRITE_LINE_MEMBER(kbd_rxready_w); DECLARE_WRITE_LINE_MEMBER(kbd_txready_w); + UINT32 screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(vblank_irq); + DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); + TIMER_DEVICE_CALLBACK_MEMBER(motor_tick); + +protected: + virtual void machine_start(); + +private: + required_ioport m_inp1; + required_ioport m_inp2; + required_ioport m_inp3; + required_ioport m_inp4; + required_ioport m_inp5; + required_ioport m_inp6; + required_ioport m_inp7; + required_ioport m_inp8; + required_ioport m_inp9; + + required_device<rainbow_video_device> m_crtc; + required_device<cpu_device> m_i8088; + required_device<cpu_device> m_z80; + required_device<fd1793_device> m_fdc; + required_device<i8251_device> m_kbd8251; + required_device<lk201_device> m_lk201; + required_shared_ptr<UINT8> m_p_ram; + required_shared_ptr<UINT8> m_p_vol_ram; + required_shared_ptr<UINT8> m_p_nvram; + required_shared_ptr<UINT8> m_shared; + required_device<cpu_device> m_maincpu; + bool m_SCREEN_BLANK; int INT88, INTZ80; @@ -284,7 +294,8 @@ public: int MOTOR_DISABLE_counter; int COLD_BOOT; -private: + UINT8 m_diagnostic; + UINT8 m_z80_private[0x800]; // Z80 private 2K UINT8 m_z80_mailbox, m_8088_mailbox; @@ -293,12 +304,6 @@ private: int m_unit; device_t *m_image[4]; - -public: - UINT32 screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(vblank_irq); - TIMER_DEVICE_CALLBACK_MEMBER(keyboard_tick); - required_device<cpu_device> m_maincpu; }; @@ -1031,15 +1036,14 @@ WRITE_LINE_MEMBER(rainbow_state::kbd_txready_w) update_kbd_irq(); } -TIMER_DEVICE_CALLBACK_MEMBER(rainbow_state::keyboard_tick) +DECLARE_WRITE_LINE_MEMBER(rainbow_state::write_keyboard_clock) { - /// TODO: double clock speed to get correct duty cycle - m_kbd8251->write_txc(1); - m_kbd8251->write_rxc(1); - - m_kbd8251->write_txc(0); - m_kbd8251->write_rxc(0); + m_kbd8251->write_txc(state); + m_kbd8251->write_rxc(state); +} +TIMER_DEVICE_CALLBACK_MEMBER(rainbow_state::motor_tick) +{ if (MOTOR_DISABLE_counter) MOTOR_DISABLE_counter--; @@ -1148,7 +1152,10 @@ static MACHINE_CONFIG_START( rainbow, rainbow_state ) MCFG_DEVICE_ADD(LK201_TAG, LK201, 0) MCFG_LK201_TX_HANDLER(DEVWRITELINE("kbdser", i8251_device, write_rxd)) - MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", rainbow_state, keyboard_tick, attotime::from_hz(4800*16)) // 8251 is set to /16 on the clock input + MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4800*16) // 8251 is set to /16 on the clock input + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(rainbow_state, write_keyboard_clock)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", rainbow_state, motor_tick, attotime::from_hz(4800*16)) MCFG_NVRAM_ADD_0FILL("nvram") MACHINE_CONFIG_END diff --git a/src/mess/drivers/sbrain.c b/src/mess/drivers/sbrain.c index 44e43e7b177..b48cc21ef2c 100644 --- a/src/mess/drivers/sbrain.c +++ b/src/mess/drivers/sbrain.c @@ -45,20 +45,21 @@ To Do: class sbrain_state : public driver_device { public: - sbrain_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_p_videoram(*this, "videoram") - , m_maincpu(*this, "maincpu") - , m_subcpu(*this, "subcpu") - , m_beep(*this, "beeper") - , m_brg(*this, "brg") - , m_u0(*this, "uart0") - , m_u1(*this, "uart1") - , m_ppi(*this, "ppi") - , m_fdc (*this, "fdc") - , m_floppy0(*this, "fdc:0") - , m_floppy1(*this, "fdc:1") - { } + sbrain_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_p_videoram(*this, "videoram"), + m_maincpu(*this, "maincpu"), + m_subcpu(*this, "subcpu"), + m_beep(*this, "beeper"), + m_brg(*this, "brg"), + m_u0(*this, "uart0"), + m_u1(*this, "uart1"), + m_ppi(*this, "ppi"), + m_fdc (*this, "fdc"), + m_floppy0(*this, "fdc:0"), + m_floppy1(*this, "fdc:1") + { + } public: const UINT8 *m_p_chargen; @@ -347,7 +348,10 @@ static MACHINE_CONFIG_START( sbrain, sbrain_state ) MCFG_DEVICE_ADD("uart1", I8251, 0) - MCFG_COM8116_ADD("brg", XTAL_5_0688MHz, NULL, WRITELINE(sbrain_state, fr_w), WRITELINE(sbrain_state, ft_w)) + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(sbrain_state, fr_w)) + MCFG_COM8116_FT_HANDLER(WRITELINE(sbrain_state, ft_w)) + MCFG_FD1791x_ADD("fdc", XTAL_16MHz / 16) MCFG_FLOPPY_DRIVE_ADD("fdc:0", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", sbrain_floppies, "525dd", floppy_image_device::default_floppy_formats) diff --git a/src/mess/drivers/sdk86.c b/src/mess/drivers/sdk86.c index a09b0fd1c34..a364bc4b5f4 100644 --- a/src/mess/drivers/sdk86.c +++ b/src/mess/drivers/sdk86.c @@ -28,6 +28,7 @@ ToDo: #include "bus/rs232/rs232.h" #include "cpu/i86/i86.h" +#include "machine/clock.h" #include "machine/i8251.h" #include "machine/i8279.h" #include "sdk86.lh" @@ -39,11 +40,12 @@ ToDo: class sdk86_state : public driver_device { public: - sdk86_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) , - m_maincpu(*this, "maincpu"), - m_usart(*this, I8251_TAG) - { } + sdk86_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag) , + m_maincpu(*this, "maincpu"), + m_usart(*this, I8251_TAG) + { + } required_device<cpu_device> m_maincpu; required_device<i8251_device> m_usart; @@ -52,7 +54,7 @@ public: DECLARE_WRITE8_MEMBER(digit_w); DECLARE_READ8_MEMBER(kbd_r); - TIMER_DEVICE_CALLBACK_MEMBER( serial_tick ); + DECLARE_WRITE_LINE_MEMBER( write_usart_clock ); UINT8 m_digit; }; @@ -129,14 +131,10 @@ READ8_MEMBER( sdk86_state::kbd_r ) return data; } -TIMER_DEVICE_CALLBACK_MEMBER( sdk86_state::serial_tick ) +WRITE_LINE_MEMBER( sdk86_state::write_usart_clock ) { - /// TODO: double timer frequency to get correct duty cycle - m_usart->write_rxc(1); - m_usart->write_txc(1); - - m_usart->write_rxc(0); - m_usart->write_txc(0); + m_usart->write_txc(state); + m_usart->write_rxc(state); } static I8279_INTERFACE( sdk86_intf ) @@ -179,7 +177,8 @@ static MACHINE_CONFIG_START( sdk86, sdk86_state ) MCFG_RS232_DSR_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_dsr)) MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("serial_terminal", terminal) - MCFG_TIMER_DRIVER_ADD_PERIODIC("serial", sdk86_state, serial_tick, attotime::from_hz(307200)) + MCFG_DEVICE_ADD("usart_clock", CLOCK, 307200) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(sdk86_state, write_usart_clock)) MCFG_I8279_ADD("i8279", 2500000, sdk86_intf) // based on divider diff --git a/src/mess/drivers/softbox.c b/src/mess/drivers/softbox.c index 68e18f1aa82..a92bd7f317a 100644 --- a/src/mess/drivers/softbox.c +++ b/src/mess/drivers/softbox.c @@ -409,7 +409,9 @@ static MACHINE_CONFIG_START( softbox, softbox_state ) MCFG_I8255A_ADD(I8255_0_TAG, ppi0_intf) MCFG_I8255A_ADD(I8255_1_TAG, ppi1_intf) - MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE(I8251_TAG, i8251_device, write_rxc), DEVWRITELINE(I8251_TAG, i8251_device, write_txc)) + MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_rxc)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_txc)) MCFG_CBM_IEEE488_ADD("c8050") MCFG_HARDDISK_ADD("harddisk1") diff --git a/src/mess/drivers/super6.c b/src/mess/drivers/super6.c index 8f7b686d708..009d662263c 100644 --- a/src/mess/drivers/super6.c +++ b/src/mess/drivers/super6.c @@ -561,14 +561,15 @@ static MACHINE_CONFIG_START( super6, super6_state ) // devices MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_24MHz/4, ctc_intf) MCFG_TIMER_DRIVER_ADD_PERIODIC("ctc", super6_state, ctc_tick, attotime::from_hz(XTAL_24MHz/16)) - MCFG_Z80DART_ADD(Z80DART_TAG, XTAL_24MHz/4, dart_intf) MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_24MHz/6, dma_intf) MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_24MHz/4, pio_intf) MCFG_WD2793x_ADD(WD2793_TAG, 1000000) - MCFG_COM8116_ADD(BR1945_TAG, XTAL_5_0688MHz, NULL, WRITELINE(super6_state, fr_w), DEVWRITELINE(Z80DART_TAG, z80dart_device, rxtxcb_w)) + MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":0", super6_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":1", super6_floppies, NULL, floppy_image_device::default_floppy_formats) + MCFG_Z80DART_ADD(Z80DART_TAG, XTAL_24MHz/4, dart_intf) + MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, "serial_terminal") MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80DART_TAG, z80dart_device, rxa_w)) MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("serial_terminal", terminal) @@ -576,6 +577,10 @@ static MACHINE_CONFIG_START( super6, super6_state ) MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80DART_TAG, z80dart_device, rxb_w)) + MCFG_DEVICE_ADD(BR1945_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(super6_state, fr_w)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE(Z80DART_TAG, z80dart_device, rxtxcb_w)) + // internal ram MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("128K") diff --git a/src/mess/drivers/superslave.c b/src/mess/drivers/superslave.c index 5350125a2b0..68853d585f9 100644 --- a/src/mess/drivers/superslave.c +++ b/src/mess/drivers/superslave.c @@ -405,10 +405,9 @@ static MACHINE_CONFIG_START( superslave, superslave_state ) // devices MCFG_PIC8259_ADD(AM9519_TAG, INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0), VCC, NULL) - MCFG_Z80DART_ADD(Z80DART_0_TAG, XTAL_8MHz/2, dart0_intf) - MCFG_Z80DART_ADD(Z80DART_1_TAG, XTAL_8MHz/2, dart1_intf) MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_8MHz/2, pio_intf) - MCFG_COM8116_ADD(BR1941_TAG, XTAL_5_0688MHz, NULL, WRITELINE(superslave_state, fr_w), WRITELINE(superslave_state, ft_w)) + + MCFG_Z80DART_ADD(Z80DART_0_TAG, XTAL_8MHz/2, dart0_intf) MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, "serial_terminal") MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80DART_0_TAG, z80dart_device, rxa_w)) @@ -421,6 +420,8 @@ static MACHINE_CONFIG_START( superslave, superslave_state ) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(Z80DART_0_TAG, z80dart_device, dcdb_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(Z80DART_0_TAG, z80dart_device, ctsb_w)) + MCFG_Z80DART_ADD(Z80DART_1_TAG, XTAL_8MHz/2, dart1_intf) + MCFG_RS232_PORT_ADD(RS232_C_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80DART_1_TAG, z80dart_device, rxa_w)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(Z80DART_1_TAG, z80dart_device, dcda_w)) @@ -431,6 +432,10 @@ static MACHINE_CONFIG_START( superslave, superslave_state ) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(Z80DART_1_TAG, z80dart_device, dcdb_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE(Z80DART_1_TAG, z80dart_device, ctsb_w)) + MCFG_DEVICE_ADD(BR1941_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(superslave_state, fr_w)) + MCFG_COM8116_FT_HANDLER(WRITELINE(superslave_state, ft_w)) + // internal ram MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("64K") diff --git a/src/mess/drivers/tavernie.c b/src/mess/drivers/tavernie.c index d754d87d6af..7ee46db6947 100644 --- a/src/mess/drivers/tavernie.c +++ b/src/mess/drivers/tavernie.c @@ -53,6 +53,7 @@ Z - more scan lines per row (cursor is bigger) #include "machine/6821pia.h" #include "machine/6840ptm.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "video/mc6845.h" #include "machine/keyboard.h" #include "imagedev/cassette.h" @@ -66,16 +67,18 @@ Z - more scan lines per row (cursor is bigger) class tavernie_state : public driver_device { public: - tavernie_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_p_videoram(*this, "videoram") - , m_cass(*this, "cassette") - , m_pia_ivg(*this, "pia_ivg") - , m_fdc(*this, "fdc") - , m_floppy0(*this, "fdc:0") - , m_beep(*this, "beeper") - , m_maincpu(*this, "maincpu") - { } + tavernie_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_p_videoram(*this, "videoram"), + m_cass(*this, "cassette"), + m_pia_ivg(*this, "pia_ivg"), + m_fdc(*this, "fdc"), + m_floppy0(*this, "fdc:0"), + m_beep(*this, "beeper"), + m_maincpu(*this, "maincpu"), + m_acia(*this, "acia") + { + } DECLARE_READ_LINE_MEMBER(ca1_r); DECLARE_READ8_MEMBER(pa_r); @@ -87,8 +90,11 @@ public: DECLARE_WRITE8_MEMBER(ds_w); DECLARE_MACHINE_RESET(cpu09); DECLARE_MACHINE_RESET(ivg09); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + const UINT8 *m_p_chargen; optional_shared_ptr<UINT8> m_p_videoram; + private: UINT8 m_term_data; UINT8 m_pa; @@ -98,6 +104,7 @@ private: optional_device<floppy_connector> m_floppy0; optional_device<beep_device> m_beep; required_device<cpu_device> m_maincpu; + required_device<acia6850_device> m_acia; }; @@ -105,8 +112,8 @@ static ADDRESS_MAP_START(cpu09_mem, AS_PROGRAM, 8, tavernie_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x1000, 0x1fff) AM_NOP AM_RANGE(0xeb00, 0xeb03) AM_DEVREADWRITE("pia", pia6821_device, read, write) - AM_RANGE(0xeb04, 0xeb04) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - AM_RANGE(0xeb05, 0xeb05) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + AM_RANGE(0xeb04, 0xeb04) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + AM_RANGE(0xeb05, 0xeb05) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) AM_RANGE(0xeb08, 0xeb0f) AM_DEVREADWRITE("ptm", ptm6840_device, read, write) AM_RANGE(0xec00, 0xefff) AM_RAM // 1Kx8 RAM MK4118 AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION("roms", 0) @@ -121,8 +128,8 @@ static ADDRESS_MAP_START(ivg09_mem, AS_PROGRAM, 8, tavernie_state) AM_RANGE(0xe000, 0xe003) AM_DEVREADWRITE("fdc", fd1795_t, read, write) AM_RANGE(0xe080, 0xe080) AM_WRITE(ds_w) AM_RANGE(0xeb00, 0xeb03) AM_DEVREADWRITE("pia", pia6821_device, read, write) - AM_RANGE(0xeb04, 0xeb04) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - AM_RANGE(0xeb05, 0xeb05) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + AM_RANGE(0xeb04, 0xeb04) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + AM_RANGE(0xeb05, 0xeb05) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) AM_RANGE(0xeb08, 0xeb0f) AM_DEVREADWRITE("ptm", ptm6840_device, read, write) AM_RANGE(0xec00, 0xefff) AM_RAM // 1Kx8 RAM MK4118 AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION("roms", 0) @@ -299,15 +306,6 @@ static const ptm6840_interface mc6840_intf = DEVCB_CPU_INPUT_LINE("maincpu", M6809_IRQ_LINE) }; -static ACIA6850_INTERFACE( mc6850_intf ) -{ - 153600, - 153600, - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_NULL -}; - WRITE8_MEMBER( tavernie_state::kbd_put ) { m_term_data = data; @@ -320,6 +318,12 @@ static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) DEVCB_DRIVER_MEMBER(tavernie_state, kbd_put) }; +WRITE_LINE_MEMBER( tavernie_state::write_acia_clock ) +{ + m_acia->write_txc(state); + m_acia->write_rxc(state); +} + static MACHINE_CONFIG_START( cpu09, tavernie_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",M6809E, XTAL_4MHz) @@ -334,10 +338,6 @@ static MACHINE_CONFIG_START( cpu09, tavernie_state ) /* Devices */ MCFG_CASSETTE_ADD( "cassette", default_cassette_interface ) - MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rx)) - MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) - MCFG_DEVICE_ADD("pia", PIA6821, 0) MCFG_PIA_READPA_HANDLER(READ8(tavernie_state, pa_r)) MCFG_PIA_READCA1_HANDLER(READLINE(tavernie_state, ca1_r)) @@ -347,7 +347,17 @@ static MACHINE_CONFIG_START( cpu09, tavernie_state ) MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line)) MCFG_PTM6840_ADD("ptm", mc6840_intf) - MCFG_ACIA6850_ADD("acia", mc6850_intf) + + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(tavernie_state, write_acia_clock)) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( ivg09, cpu09 ) diff --git a/src/mess/drivers/tek405x.c b/src/mess/drivers/tek405x.c index d983c43ac7a..3b3c1337e92 100644 --- a/src/mess/drivers/tek405x.c +++ b/src/mess/drivers/tek405x.c @@ -176,8 +176,8 @@ static ADDRESS_MAP_START( tek4051_mem, AS_PROGRAM, 8, tek4051_state ) AM_RANGE(0x87b0, 0x87b3) AM_DEVREADWRITE(MC6820_GPIB_TAG, pia6821_device, read, write) AM_RANGE(0x87c0, 0x87c0) AM_MIRROR(0x03) AM_WRITE(lbs_w) // AM_RANGE(0x87c0, 0x87c3) AM_DEVREADWRITE(MC6820_COM_TAG, pia6821_device, read, write) -// AM_RANGE(0x87c4, 0x87c4) AM_MIRROR(0x02) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_read, control_write) -// AM_RANGE(0x87c5, 0x87c5) AM_MIRROR(0x02) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_read, data_write) +// AM_RANGE(0x87c4, 0x87c4) AM_MIRROR(0x02) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_r, control_w) +// AM_RANGE(0x87c5, 0x87c5) AM_MIRROR(0x02) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_r, data_w) // AM_RANGE(0x87c8, 0x87cb) XPC2 // AM_RANGE(0x87cc, 0x87cf) XPC3 // AM_RANGE(0x87d0, 0x87d3) XPC4 @@ -913,10 +913,8 @@ WRITE8_MEMBER( tek4051_state::com_pia_pb_w ) case 3: div = 2; break; } - int clock = osc / div; - - m_acia->set_tx_clock(clock); - m_acia->set_rx_clock(clock); + m_acia_clock->set_unscaled_clock(osc); + m_acia_clock->set_clock_scale((double) 1 / div); } WRITE_LINE_MEMBER( tek4051_state::com_pia_irqa_w ) @@ -932,25 +930,17 @@ WRITE_LINE_MEMBER( tek4051_state::com_pia_irqb_w ) } -//------------------------------------------------- -// ACIA6850_INTERFACE( acia_intf ) -//------------------------------------------------- - WRITE_LINE_MEMBER( tek4051_state::acia_irq_w ) { m_acia_irq = state; update_irq(); } -static ACIA6850_INTERFACE( acia_intf ) +WRITE_LINE_MEMBER( tek4051_state::write_acia_clock ) { - 0, - 0, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(tek4051_state, acia_irq_w) -}; - + m_acia->write_txc(state); + m_acia->write_rxc(state); +} //************************************************************************** @@ -1086,7 +1076,11 @@ static MACHINE_CONFIG_START( tek4051, tek4051_state ) MCFG_PIA_IRQA_HANDLER(WRITELINE(tek4051_state, com_pia_irqa_w)) MCFG_PIA_IRQB_HANDLER(WRITELINE(tek4051_state, com_pia_irqb_w)) - MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf) + MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(tek4051_state, acia_irq_w)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 38400) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(tek4051_state, write_acia_clock)) MCFG_IEEE488_BUS_ADD() MCFG_IEEE488_EOI_CALLBACK(DEVWRITELINE(MC6820_GPIB_TAG, pia6821_device, ca1_w)) diff --git a/src/mess/drivers/thomson.c b/src/mess/drivers/thomson.c index 3cb260ebf10..4ab16b96ef2 100644 --- a/src/mess/drivers/thomson.c +++ b/src/mess/drivers/thomson.c @@ -71,6 +71,7 @@ #include "includes/thomson.h" #include "machine/6821pia.h" #include "machine/wd17xx.h" +#include "machine/clock.h" #include "bus/centronics/ctronics.h" #include "imagedev/flopdrv.h" #include "imagedev/serial.h" @@ -711,7 +712,12 @@ static MACHINE_CONFIG_START( to7, thomson_state ) MCFG_TO7_IO_LINE_ADD("to7_io") /* modem */ - MCFG_ACIA6850_ADD( "acia6850", to7_modem ) + MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(WRITELINE(thomson_state, to7_modem_tx_w)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(thomson_state, to7_modem_cb)) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 1200) /* 1200 bauds, might be divided by 16 */ + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(thomson_state, write_acia_clock)) /* cartridge */ MCFG_CARTSLOT_ADD("cart") diff --git a/src/mess/drivers/v1050.c b/src/mess/drivers/v1050.c index 87c2c908097..63c6ee3b9c5 100644 --- a/src/mess/drivers/v1050.c +++ b/src/mess/drivers/v1050.c @@ -786,6 +786,37 @@ READ8_MEMBER(v1050_state::misc_ppi_pc_r) return data; } +void v1050_state::set_baud_sel(int baud_sel) +{ + if (baud_sel != m_baud_sel) + { + int divider = 1; + + switch (baud_sel) + { + case 0: + divider = 13 * 16; // 19200 + break; + + case 1: + divider = 13 * 8; // 38400 + break; + + case 2: + divider = 8; // 500000 + break; + + case 3: + divider = 13 * 2; // 153600 + break; + } + + m_clock_sio->set_clock_scale((double) 1 / divider); + + m_baud_sel = baud_sel; + } +} + WRITE8_MEMBER( v1050_state::misc_ppi_pc_w ) { /* @@ -811,24 +842,7 @@ WRITE8_MEMBER( v1050_state::misc_ppi_pc_w ) update_fdc(); // baud select - int baud_sel = (data >> 2) & 0x03; - - if (baud_sel != m_baud_sel) - { - attotime period = attotime::never; - - switch (baud_sel) - { - case 0: period = attotime::from_hz((double)XTAL_16MHz/4/13/16); break; - case 1: period = attotime::from_hz((double)XTAL_16MHz/4/13/8); break; - case 2: period = attotime::from_hz((double)XTAL_16MHz/4/8); break; - case 3: period = attotime::from_hz((double)XTAL_16MHz/4/13/2); break; - } - - m_timer_sio->adjust(attotime::zero, 0, period); - - m_baud_sel = baud_sel; - } + set_baud_sel((data >> 2) & 0x03); } static I8255A_INTERFACE( misc_ppi_intf ) @@ -931,14 +945,10 @@ static I8255A_INTERFACE( rtc_ppi_intf ) // Keyboard 8251A Interface -TIMER_DEVICE_CALLBACK_MEMBER(v1050_state::kb_8251_tick) +WRITE_LINE_MEMBER(v1050_state::write_keyboard_clock) { - /// TODO: double timer frequency for correct duty cycle - m_uart_kb->write_txc(1); - m_uart_kb->write_rxc(1); - - m_uart_kb->write_txc(0); - m_uart_kb->write_rxc(0); + m_uart_kb->write_txc(state); + m_uart_kb->write_rxc(state); } WRITE_LINE_MEMBER( v1050_state::kb_rxrdy_w ) @@ -948,14 +958,10 @@ WRITE_LINE_MEMBER( v1050_state::kb_rxrdy_w ) // Serial 8251A Interface -TIMER_DEVICE_CALLBACK_MEMBER(v1050_state::sio_8251_tick) +WRITE_LINE_MEMBER(v1050_state::write_sio_clock) { - /// TODO: double timer frequency for correct duty cycle - m_uart_sio->write_txc(1); - m_uart_sio->write_rxc(1); - - m_uart_sio->write_txc(0); - m_uart_sio->write_rxc(0); + m_uart_sio->write_txc(state); + m_uart_sio->write_rxc(state); } WRITE_LINE_MEMBER( v1050_state::sio_rxrdy_w ) @@ -1093,7 +1099,7 @@ void v1050_state::machine_reset() m_bank = 0; bankswitch(); - m_timer_sio->adjust(attotime::zero, 0, attotime::from_hz((double)XTAL_16MHz/4/13/16)); + set_baud_sel(0); m_fdc->reset(); } @@ -1136,6 +1142,9 @@ static MACHINE_CONFIG_START( v1050, v1050_state ) MCFG_I8251_TXD_HANDLER(DEVWRITELINE(V1050_KEYBOARD_TAG, v1050_keyboard_device, si_w)) MCFG_I8251_RXRDY_HANDLER(WRITELINE(v1050_state, kb_rxrdy_w)) + MCFG_DEVICE_ADD(CLOCK_KB_TAG, CLOCK, XTAL_16MHz/4/13/8) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(v1050_state, write_keyboard_clock)) + // keyboard MCFG_DEVICE_ADD(V1050_KEYBOARD_TAG, V1050_KEYBOARD, 0) MCFG_V1050_KEYBOARD_OUT_TX_HANDLER(DEVWRITELINE(I8251A_KB_TAG, i8251_device, write_rxd)) @@ -1151,13 +1160,14 @@ static MACHINE_CONFIG_START( v1050, v1050_state ) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(I8251A_SIO_TAG, i8251_device, write_rxd)) MCFG_RS232_DSR_HANDLER(DEVWRITELINE(I8251A_SIO_TAG, i8251_device, write_dsr)) + MCFG_DEVICE_ADD(CLOCK_SIO_TAG, CLOCK, XTAL_16MHz/4) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(v1050_state, write_sio_clock)) + MCFG_MB8877x_ADD(MB8877_TAG, XTAL_16MHz/16) MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":0", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":1", v1050_floppies, "525qd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":2", v1050_floppies, NULL, floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(MB8877_TAG":3", v1050_floppies, NULL, floppy_image_device::default_floppy_formats) - MCFG_TIMER_DRIVER_ADD_PERIODIC(TIMER_KB_TAG, v1050_state, kb_8251_tick, attotime::from_hz((double)XTAL_16MHz/4/13/8)) - MCFG_TIMER_DRIVER_ADD(TIMER_SIO_TAG, v1050_state, sio_8251_tick) // SASI bus MCFG_SCSIBUS_ADD(SASIBUS_TAG) diff --git a/src/mess/drivers/v6809.c b/src/mess/drivers/v6809.c index afbb78d63a3..c0560759954 100644 --- a/src/mess/drivers/v6809.c +++ b/src/mess/drivers/v6809.c @@ -52,6 +52,7 @@ ToDo: #include "cpu/m6809/m6809.h" #include "machine/6821pia.h" #include "machine/6840ptm.h" +#include "machine/clock.h" #include "video/mc6845.h" #include "machine/6850acia.h" #include "machine/mm58274c.h" @@ -72,7 +73,9 @@ public: m_crtc(*this, "crtc"), m_fdc(*this, "fdc"), m_floppy0(*this, "fdc:0"), - m_speaker(*this, "speaker") + m_speaker(*this, "speaker"), + m_acia0(*this, "acia0"), + m_acia1(*this, "acia1") { } @@ -84,10 +87,13 @@ public: DECLARE_WRITE8_MEMBER(v6809_address_w); DECLARE_WRITE8_MEMBER(v6809_register_w); DECLARE_WRITE8_MEMBER(kbd_put); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_MACHINE_RESET(v6809); + UINT8 *m_p_videoram; const UINT8 *m_p_chargen; UINT16 m_video_address; + private: bool m_speaker_en; UINT8 m_video_index; @@ -99,6 +105,8 @@ private: required_device<mb8876_t> m_fdc; required_device<floppy_connector> m_floppy0; required_device<speaker_sound_device> m_speaker; + required_device<acia6850_device> m_acia0; + required_device<acia6850_device> m_acia1; }; @@ -108,10 +116,10 @@ static ADDRESS_MAP_START(v6809_mem, AS_PROGRAM, 8, v6809_state) AM_RANGE(0xf000, 0xf000) AM_MIRROR(0xfe) AM_DEVREAD("crtc", mc6845_device, status_r) AM_WRITE(v6809_address_w) AM_RANGE(0xf001, 0xf001) AM_MIRROR(0xfe) AM_DEVREAD("crtc", mc6845_device, register_r) AM_WRITE(v6809_register_w) AM_RANGE(0xf200, 0xf200) AM_MIRROR(0xff) AM_WRITE(videoram_w) - AM_RANGE(0xf504, 0xf504) AM_MIRROR(0x36) AM_DEVREADWRITE("acia0", acia6850_device, status_read, control_write) // modem - AM_RANGE(0xf505, 0xf505) AM_MIRROR(0x36) AM_DEVREADWRITE("acia0", acia6850_device, data_read, data_write) - AM_RANGE(0xf50c, 0xf50c) AM_MIRROR(0x36) AM_DEVREADWRITE("acia1", acia6850_device, status_read, control_write) // printer - AM_RANGE(0xf50d, 0xf50d) AM_MIRROR(0x36) AM_DEVREADWRITE("acia1", acia6850_device, data_read, data_write) + AM_RANGE(0xf504, 0xf504) AM_MIRROR(0x36) AM_DEVREADWRITE("acia0", acia6850_device, status_r, control_w) // modem + AM_RANGE(0xf505, 0xf505) AM_MIRROR(0x36) AM_DEVREADWRITE("acia0", acia6850_device, data_r, data_w) + AM_RANGE(0xf50c, 0xf50c) AM_MIRROR(0x36) AM_DEVREADWRITE("acia1", acia6850_device, status_r, control_w) // printer + AM_RANGE(0xf50d, 0xf50d) AM_MIRROR(0x36) AM_DEVREADWRITE("acia1", acia6850_device, data_r, data_w) AM_RANGE(0xf600, 0xf603) AM_MIRROR(0x3c) AM_DEVREADWRITE("fdc", mb8876_t, read, write) AM_RANGE(0xf640, 0xf64f) AM_MIRROR(0x30) AM_DEVREADWRITE("rtc", mm58274c_device, read, write) AM_RANGE(0xf680, 0xf683) AM_MIRROR(0x3c) AM_DEVREADWRITE("pia0", pia6821_device, read, write) @@ -248,6 +256,14 @@ static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) DEVCB_DRIVER_MEMBER(v6809_state, kbd_put) }; +WRITE_LINE_MEMBER( v6809_state::write_acia_clock ) +{ + m_acia0->write_txc(state); + m_acia0->write_rxc(state); + m_acia1->write_txc(state); + m_acia1->write_rxc(state); +} + READ8_MEMBER( v6809_state::pb_r ) { UINT8 ret = m_term_data; @@ -298,15 +314,6 @@ static const ptm6840_interface mc6840_intf = DEVCB_CPU_INPUT_LINE("maincpu", M6809_IRQ_LINE) }; -static ACIA6850_INTERFACE( mc6850_intf ) -{ - 10, - 10, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - static SLOT_INTERFACE_START( v6809_floppies ) SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) SLOT_INTERFACE_END @@ -366,8 +373,14 @@ static MACHINE_CONFIG_START( v6809, v6809_state ) MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6809_device, irq_line)) MCFG_PTM6840_ADD("ptm", mc6840_intf) - MCFG_ACIA6850_ADD("acia0", mc6850_intf) - MCFG_ACIA6850_ADD("acia1", mc6850_intf) + + MCFG_DEVICE_ADD("acia0", ACIA6850, 0) + + MCFG_DEVICE_ADD("acia1", ACIA6850, 0) + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 10) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(v6809_state, write_acia_clock)) + MCFG_MM58274C_ADD("rtc", rtc_intf) MCFG_MB8876x_ADD("fdc", XTAL_16MHz / 16) MCFG_FLOPPY_DRIVE_ADD("fdc:0", v6809_floppies, "525dd", floppy_image_device::default_floppy_formats) diff --git a/src/mess/drivers/vk100.c b/src/mess/drivers/vk100.c index f9f6d486805..ad573f8e1c2 100644 --- a/src/mess/drivers/vk100.c +++ b/src/mess/drivers/vk100.c @@ -165,8 +165,8 @@ public: TIMER_EXECUTE_VG }; - vk100_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + vk100_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_crtc(*this, "crtc"), m_speaker(*this, "beeper"), @@ -1034,7 +1034,9 @@ static MACHINE_CONFIG_START( vk100, vk100_state ) MCFG_RS232_RXD_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd)) MCFG_RS232_DSR_HANDLER(DEVWRITELINE("i8251", i8251_device, write_dsr)) - MCFG_COM8116_ADD(COM5016T_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE("i8251", i8251_device, write_rxc), DEVWRITELINE("i8251", i8251_device, write_txc)) + MCFG_DEVICE_ADD(COM5016T_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxc)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE("i8251", i8251_device, write_txc)) MCFG_DEFAULT_LAYOUT( layout_vk100 ) diff --git a/src/mess/drivers/votrpss.c b/src/mess/drivers/votrpss.c index c756ee1827b..4bf4a973ed4 100644 --- a/src/mess/drivers/votrpss.c +++ b/src/mess/drivers/votrpss.c @@ -75,6 +75,7 @@ Things to be looked at: /* Components */ #include "sound/ay8910.h" #include "sound/votrax.h" +#include "machine/clock.h" #include "machine/i8255.h" #include "machine/pit8253.h" #include "machine/i8251.h" @@ -104,7 +105,7 @@ public: DECLARE_WRITE8_MEMBER(ppi_pb_w); DECLARE_WRITE8_MEMBER(ppi_pc_w); TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); - TIMER_DEVICE_CALLBACK_MEMBER(serial_tick); + DECLARE_WRITE_LINE_MEMBER(write_uart_clock); IRQ_CALLBACK_MEMBER(irq_ack); private: UINT8 m_term_data; @@ -288,14 +289,10 @@ static GENERIC_TERMINAL_INTERFACE( terminal_intf ) DEVCB_DRIVER_MEMBER(votrpss_state, kbd_put) }; -TIMER_DEVICE_CALLBACK_MEMBER( votrpss_state::serial_tick ) +DECLARE_WRITE_LINE_MEMBER( votrpss_state::write_uart_clock ) { - /// TODO: double timer frequency for correct duty cycle - m_uart->write_rxc(1); - m_uart->write_txc(1); - - m_uart->write_rxc(0); - m_uart->write_txc(0); + m_uart->write_txc(state); + m_uart->write_rxc(state); } /****************************************************************************** @@ -323,19 +320,20 @@ static MACHINE_CONFIG_START( votrpss, votrpss_state ) MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) MCFG_DEVICE_ADD("uart", I8251, 0) - //MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", serial_port_device, tx)) - //MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) - //MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart", i8251_device, write_dsr)) + + MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(votrpss_state, write_uart_clock)) MCFG_PIT8253_ADD( "pit", pit_intf) MCFG_I8255_ADD("ppi", ppi_intf) MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", votrpss_state, irq_timer, attotime::from_msec(10)) - - /* Serial components - comment out if not needed */ - //MCFG_TIMER_DRIVER_ADD_PERIODIC("serial", votrpss_state, serial_tick, attotime::from_hz(153600)) - //MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - //MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE("uart", i8251_device, write_rx)) - //MCFG_RS232_OUT_DSR_HANDLER(DEVWRITELINE("uart", i8251_device, write_dsr)) MACHINE_CONFIG_END diff --git a/src/mess/drivers/votrtnt.c b/src/mess/drivers/votrtnt.c index 98ffc192412..aa6cd522fe5 100644 --- a/src/mess/drivers/votrtnt.c +++ b/src/mess/drivers/votrtnt.c @@ -33,6 +33,7 @@ #include "bus/rs232/rs232.h" #include "cpu/m6800/m6800.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "sound/votrax.h" #include "votrtnt.lh" @@ -40,15 +41,20 @@ class votrtnt_state : public driver_device { public: - votrtnt_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_votrax(*this, "votrax") - { } + votrtnt_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_votrax(*this, "votrax"), + m_acia(*this, "acia") + { + } + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + +private: required_device<cpu_device> m_maincpu; required_device<votrax_sc01_device> m_votrax; - virtual void machine_reset(); + required_device<acia6850_device> m_acia; }; @@ -60,8 +66,8 @@ static ADDRESS_MAP_START(6802_mem, AS_PROGRAM, 8, votrtnt_state) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0x6fff) AM_RANGE(0x0000, 0x03ff) AM_RAM AM_MIRROR(0xc00)/* RAM, 2114*2 (0x400 bytes) mirrored 4x */ - AM_RANGE(0x2000, 0x2000) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, status_read, control_write) - AM_RANGE(0x2001, 0x2001) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, data_read, data_write) + AM_RANGE(0x2000, 0x2000) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w) + AM_RANGE(0x2001, 0x2001) AM_MIRROR(0xffe) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w) AM_RANGE(0x4000, 0x5fff) AM_DEVWRITE("votrax", votrax_sc01_device, write) /* low 6 bits write to 6 bit input of sc-01-a; high 2 bits are ignored (but by adding a buffer chip could be made to control the inflection bits of the sc-01-a which are normally grounded on the tnt) */ AM_RANGE(0x6000, 0x6fff) AM_ROM /* ROM in potted block */ ADDRESS_MAP_END @@ -84,18 +90,12 @@ static INPUT_PORTS_START(votrtnt) PORT_DIPSETTING( 0x80, "9600" ) INPUT_PORTS_END -void votrtnt_state::machine_reset() -{ -} -static ACIA6850_INTERFACE( acia_intf ) +WRITE_LINE_MEMBER(votrtnt_state::write_acia_clock) { - 153600, - 153600, - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_txd), - DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, write_rts), - DEVCB_NULL -}; + m_acia->write_txc(state); + m_acia->write_rxc(state); +} static struct votrax_sc01_interface votrtnt_votrax_interface = { @@ -115,12 +115,17 @@ static MACHINE_CONFIG_START( votrtnt, votrtnt_state ) //MCFG_DEFAULT_LAYOUT(layout_votrtnt) /* serial hardware */ - MCFG_ACIA6850_ADD("acia", acia_intf) + MCFG_DEVICE_ADD("acia", ACIA6850, 0) + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "serial_terminal") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rx)) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts)) + MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(votrtnt_state, write_acia_clock)) + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_VOTRAX_SC01_ADD("votrax", 720000, votrtnt_votrax_interface ) /* 720kHz? needs verify */ diff --git a/src/mess/drivers/vt100.c b/src/mess/drivers/vt100.c index c3f4b463dca..2eaa8a3b70b 100644 --- a/src/mess/drivers/vt100.c +++ b/src/mess/drivers/vt100.c @@ -32,8 +32,8 @@ class vt100_state : public driver_device { public: - vt100_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + vt100_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_crtc(*this, "vt100_video"), m_speaker(*this, "beeper"), @@ -438,8 +438,9 @@ static MACHINE_CONFIG_START( vt100, vt100_state ) MCFG_RS232_RXD_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd)) MCFG_RS232_DSR_HANDLER(DEVWRITELINE("i8251", i8251_device, write_dsr)) - MCFG_COM8116_ADD(COM5016T_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE("i8251", i8251_device, write_rxc), DEVWRITELINE("i8251", i8251_device, write_txc)) - + MCFG_DEVICE_ADD(COM5016T_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxc)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE("i8251", i8251_device, write_txc)) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mess/drivers/xerox820.c b/src/mess/drivers/xerox820.c index 816e5926640..e80885d550b 100644 --- a/src/mess/drivers/xerox820.c +++ b/src/mess/drivers/xerox820.c @@ -698,7 +698,6 @@ static MACHINE_CONFIG_START( xerox820, xerox820_state ) MCFG_GFXDECODE_ADD("gfxdecode", xerox820) /* devices */ - MCFG_Z80SIO0_ADD(Z80SIO_TAG, XTAL_20MHz/8, sio_intf) MCFG_Z80PIO_ADD(Z80PIO_KB_TAG, XTAL_20MHz/8, xerox820_kbpio_intf) MCFG_Z80PIO_ADD(Z80PIO_GP_TAG, XTAL_20MHz/8, gppio_intf) MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_20MHz/8, ctc_intf) @@ -706,7 +705,8 @@ static MACHINE_CONFIG_START( xerox820, xerox820_state ) MCFG_FD1771x_ADD(FD1771_TAG, XTAL_20MHz/20) MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":0", xerox820_floppies, "sa400", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":1", xerox820_floppies, "sa400", floppy_image_device::default_floppy_formats) - MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, WRITELINE(xerox820_state, fr_w), DEVWRITELINE(Z80SIO_TAG, z80dart_device, rxtxcb_w)) + + MCFG_Z80SIO0_ADD(Z80SIO_TAG, XTAL_20MHz/8, sio_intf) MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio0_device, rxa_w)) @@ -714,6 +714,10 @@ static MACHINE_CONFIG_START( xerox820, xerox820_state ) MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio0_device, rxb_w)) + MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(xerox820_state, fr_w)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80dart_device, rxtxcb_w)) + MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) /* internal ram */ @@ -750,7 +754,6 @@ static MACHINE_CONFIG_START( xerox820ii, xerox820ii_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) /* devices */ - MCFG_Z80SIO0_ADD(Z80SIO_TAG, XTAL_16MHz/4, sio_intf) MCFG_Z80PIO_ADD(Z80PIO_KB_TAG, XTAL_16MHz/4, xerox820ii_kbpio_intf) MCFG_Z80PIO_ADD(Z80PIO_GP_TAG, XTAL_16MHz/4, gppio_intf) MCFG_Z80PIO_ADD(Z80PIO_RD_TAG, XTAL_20MHz/8, rdpio_intf) @@ -759,9 +762,19 @@ static MACHINE_CONFIG_START( xerox820ii, xerox820ii_state ) MCFG_FD1797x_ADD(FD1797_TAG, XTAL_16MHz/8) MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":0", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(FD1797_TAG":1", xerox820_floppies, "sa450", floppy_image_device::default_floppy_formats) - MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, WRITELINE(xerox820_state, fr_w), DEVWRITELINE(Z80SIO_TAG, z80dart_device, rxtxcb_w)) + + MCFG_Z80SIO0_ADD(Z80SIO_TAG, XTAL_16MHz/4, sio_intf) + MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio0_device, rxa_w)) + MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80sio0_device, rxb_w)) + + MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(xerox820_state, fr_w)) + MCFG_COM8116_FT_HANDLER(DEVWRITELINE(Z80SIO_TAG, z80dart_device, rxtxcb_w)) + MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) // SASI bus diff --git a/src/mess/drivers/xor100.c b/src/mess/drivers/xor100.c index 8bae8409133..3cc41f3250f 100644 --- a/src/mess/drivers/xor100.c +++ b/src/mess/drivers/xor100.c @@ -566,9 +566,12 @@ static MACHINE_CONFIG_START( xor100, xor100_state ) MCFG_RS232_DSR_HANDLER(DEVWRITELINE(I8251_B_TAG, i8251_device, write_dsr)) MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("serial_terminal", terminal) + MCFG_DEVICE_ADD(COM5016_TAG, COM8116, XTAL_5_0688MHz) + MCFG_COM8116_FR_HANDLER(WRITELINE(xor100_state, com5016_fr_w)) + MCFG_COM8116_FT_HANDLER(WRITELINE(xor100_state, com5016_ft_w)) + MCFG_I8255A_ADD(I8255A_TAG, printer_8255_intf) MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_8MHz/2, ctc_intf) - MCFG_COM8116_ADD(COM5016_TAG, XTAL_5_0688MHz, NULL, WRITELINE(xor100_state, com5016_fr_w), WRITELINE(xor100_state, com5016_ft_w)) MCFG_FD1795x_ADD(WD1795_TAG, XTAL_8MHz/4) MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":0", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":1", xor100_floppies, "8ssdd", floppy_image_device::default_floppy_formats) diff --git a/src/mess/includes/atarist.h b/src/mess/includes/atarist.h index 52e3717059e..1a2dcfcaaa2 100644 --- a/src/mess/includes/atarist.h +++ b/src/mess/includes/atarist.h @@ -236,7 +236,7 @@ public: DECLARE_READ8_MEMBER( mfp_gpio_r ); DECLARE_WRITE_LINE_MEMBER( mfp_tdo_w ); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); void toggle_dma_fifo(); void flush_dma_fifo(); diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h index 2eabe335a33..3a23cb90d15 100644 --- a/src/mess/includes/bbc.h +++ b/src/mess/includes/bbc.h @@ -14,6 +14,7 @@ #include "bus/rs232/rs232.h" #include "machine/6522via.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/mc6854.h" #include "machine/ram.h" #include "machine/i8271.h" @@ -30,8 +31,8 @@ class bbc_state : public driver_device { public: - bbc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + bbc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ram(*this, RAM_TAG), m_mc6845(*this, "mc6845"), @@ -41,15 +42,12 @@ public: m_tms(*this, "tms5220"), m_cassette(*this, "cassette"), m_acia(*this, "acia6850"), + m_acia_clock(*this, "acia_clock"), m_rs232(*this, RS232_TAG), m_via6522_0(*this, "via6522_0"), m_via6522_1(*this, "via6522_1"), m_upd7002(*this, "upd7002"), m_i8271(*this, "i8271"), - m_ACCCON_IRR(CLEAR_LINE), - m_via_system_irq(CLEAR_LINE), - m_via_user_irq(CLEAR_LINE), - m_acia_irq(CLEAR_LINE), m_region_maincpu(*this, "maincpu"), m_region_user1(*this, "user1"), m_region_user2(*this, "user2"), @@ -60,23 +58,134 @@ public: m_bank5(*this, "bank5"), m_bank6(*this, "bank6"), m_bank7(*this, "bank7"), - m_bank8(*this, "bank8") { } + m_bank8(*this, "bank8"), + m_ACCCON_IRR(CLEAR_LINE), + m_via_system_irq(CLEAR_LINE), + m_via_user_irq(CLEAR_LINE), + m_acia_irq(CLEAR_LINE) + { + } + DECLARE_WRITE8_MEMBER(bbc_page_selecta_w); + DECLARE_WRITE8_MEMBER(bbc_memorya1_w); + DECLARE_WRITE8_MEMBER(bbc_page_selectb_w); + DECLARE_WRITE8_MEMBER(bbc_memoryb3_w); + DECLARE_WRITE8_MEMBER(bbc_memoryb4_w); + DECLARE_WRITE8_MEMBER(bbc_page_selectbp_w); + DECLARE_WRITE8_MEMBER(bbc_memorybp1_w); + DECLARE_WRITE8_MEMBER(bbc_memorybp2_w); + DECLARE_WRITE8_MEMBER(bbc_memorybp4_w); + DECLARE_WRITE8_MEMBER(bbc_memorybp4_128_w); + DECLARE_WRITE8_MEMBER(bbc_memorybp6_128_w); + DECLARE_READ8_MEMBER(bbcm_ACCCON_read); + DECLARE_WRITE8_MEMBER(bbcm_ACCCON_write); + DECLARE_WRITE8_MEMBER(page_selectbm_w); + DECLARE_WRITE8_MEMBER(bbc_memorybm1_w); + DECLARE_WRITE8_MEMBER(bbc_memorybm2_w); + DECLARE_WRITE8_MEMBER(bbc_memorybm4_w); + DECLARE_WRITE8_MEMBER(bbc_memorybm5_w); + DECLARE_WRITE8_MEMBER(bbc_memorybm7_w); + DECLARE_READ8_MEMBER(bbcm_r); + DECLARE_WRITE8_MEMBER(bbcm_w); + DECLARE_WRITE8_MEMBER(bbc_SerialULA_w); + DECLARE_READ8_MEMBER(bbc_i8271_read); + DECLARE_WRITE8_MEMBER(bbc_i8271_write); + DECLARE_WRITE8_MEMBER(bbc_wd177x_status_w); + DECLARE_READ8_MEMBER(bbc_wd1770_read); + DECLARE_WRITE8_MEMBER(bbc_wd1770_write); + DECLARE_WRITE8_MEMBER(bbc_opus_status_w); + DECLARE_READ8_MEMBER(bbc_opus_read); + DECLARE_WRITE8_MEMBER(bbc_opus_write); + DECLARE_READ8_MEMBER(bbcm_wd1770_read); + DECLARE_WRITE8_MEMBER(bbcm_wd1770_write); + DECLARE_READ8_MEMBER(bbcm_wd1770l_read); + DECLARE_WRITE8_MEMBER(bbcm_wd1770l_write); + DECLARE_READ8_MEMBER(bbc_disc_r); + DECLARE_WRITE8_MEMBER(bbc_disc_w); + DECLARE_WRITE8_MEMBER(bbc_videoULA_w); + DECLARE_WRITE8_MEMBER(bbc_6845_w); + DECLARE_READ8_MEMBER(bbc_6845_r); + DECLARE_READ8_MEMBER(bbc_fe_r); + DECLARE_DIRECT_UPDATE_MEMBER(bbcbp_direct_handler); + DECLARE_DIRECT_UPDATE_MEMBER(bbcm_direct_handler); + DECLARE_DRIVER_INIT(bbc); + DECLARE_DRIVER_INIT(bbcm); + DECLARE_MACHINE_START(bbca); + DECLARE_MACHINE_RESET(bbca); + DECLARE_VIDEO_START(bbca); + DECLARE_MACHINE_START(bbcb); + DECLARE_MACHINE_RESET(bbcb); + DECLARE_VIDEO_START(bbcb); + DECLARE_MACHINE_START(bbcbp); + DECLARE_MACHINE_RESET(bbcbp); + DECLARE_VIDEO_START(bbcbp); + DECLARE_MACHINE_START(bbcm); + DECLARE_MACHINE_RESET(bbcm); + DECLARE_VIDEO_START(bbcm); + DECLARE_PALETTE_INIT(bbc); + UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(bbcb_vsync); + INTERRUPT_GEN_MEMBER(bbcb_keyscan); + INTERRUPT_GEN_MEMBER(bbcm_keyscan); + TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + DECLARE_WRITE_LINE_MEMBER(bbcb_acia6850_irq_w); + DECLARE_WRITE_LINE_MEMBER(econet_clk_w); + DECLARE_WRITE8_MEMBER(bbcb_via_system_write_porta); + DECLARE_WRITE8_MEMBER(bbcb_via_system_write_portb); + DECLARE_READ8_MEMBER(bbcb_via_system_read_porta); + DECLARE_READ8_MEMBER(bbcb_via_system_read_portb); + DECLARE_WRITE_LINE_MEMBER(bbcb_via_system_irq_w); + DECLARE_READ8_MEMBER(bbcb_via_user_read_portb); + DECLARE_WRITE8_MEMBER(bbcb_via_user_write_portb); + DECLARE_WRITE_LINE_MEMBER(bbcb_via_user_irq_w); + DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_intrq_w); + DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_drq_w); + DECLARE_WRITE_LINE_MEMBER(bbc_vsync); + void update_acia_rxd(); + void update_acia_dcd(); + void update_acia_cts(); + DECLARE_WRITE_LINE_MEMBER(bbc_rts_w); + DECLARE_WRITE_LINE_MEMBER(bbc_txd_w); + DECLARE_WRITE_LINE_MEMBER(write_rxd_serial); + DECLARE_WRITE_LINE_MEMBER(write_dcd_serial); + DECLARE_WRITE_LINE_MEMBER(write_cts_serial); + DECLARE_INPUT_CHANGED_MEMBER( trigger_reset ); + + DECLARE_WRITE_LINE_MEMBER(bbc_i8271_interrupt); + + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart ); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart ); + +private: required_device<cpu_device> m_maincpu; required_device<ram_device> m_ram; required_device<mc6845_device> m_mc6845; optional_device<mc6854_device> m_adlc; optional_device<sn76489_device> m_sn; +public: // HACK FOR MC6845 required_device<saa5050_device> m_trom; optional_device<tms5220_device> m_tms; optional_device<cassette_image_device> m_cassette; - optional_device<acia6850_device> m_acia; + required_device<acia6850_device> m_acia; + required_device<clock_device> m_acia_clock; optional_device<rs232_port_device> m_rs232; required_device<via6522_device> m_via6522_0; optional_device<via6522_device> m_via6522_1; optional_device<upd7002_device> m_upd7002; optional_device<i8271_device> m_i8271; + required_memory_region m_region_maincpu; + required_memory_region m_region_user1; + optional_memory_region m_region_user2; + required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm + optional_memory_bank m_bank3; // bbca bbcb + required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank5; // bbcm + optional_memory_bank m_bank6; // bbcbp bbcbp128 + required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank8; // bbcm void check_interrupts(); @@ -272,108 +381,6 @@ public: int *m_videoULA_pallet_lookup; void (*m_draw_function)(running_machine &machine); - DECLARE_WRITE8_MEMBER(bbc_page_selecta_w); - DECLARE_WRITE8_MEMBER(bbc_memorya1_w); - DECLARE_WRITE8_MEMBER(bbc_page_selectb_w); - DECLARE_WRITE8_MEMBER(bbc_memoryb3_w); - DECLARE_WRITE8_MEMBER(bbc_memoryb4_w); - DECLARE_WRITE8_MEMBER(bbc_page_selectbp_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp1_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp2_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp4_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp4_128_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp6_128_w); - DECLARE_READ8_MEMBER(bbcm_ACCCON_read); - DECLARE_WRITE8_MEMBER(bbcm_ACCCON_write); - DECLARE_WRITE8_MEMBER(page_selectbm_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm1_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm2_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm4_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm5_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm7_w); - DECLARE_READ8_MEMBER(bbcm_r); - DECLARE_WRITE8_MEMBER(bbcm_w); - DECLARE_WRITE8_MEMBER(bbc_SerialULA_w); - DECLARE_READ8_MEMBER(bbc_i8271_read); - DECLARE_WRITE8_MEMBER(bbc_i8271_write); - DECLARE_WRITE8_MEMBER(bbc_wd177x_status_w); - DECLARE_READ8_MEMBER(bbc_wd1770_read); - DECLARE_WRITE8_MEMBER(bbc_wd1770_write); - DECLARE_WRITE8_MEMBER(bbc_opus_status_w); - DECLARE_READ8_MEMBER(bbc_opus_read); - DECLARE_WRITE8_MEMBER(bbc_opus_write); - DECLARE_READ8_MEMBER(bbcm_wd1770_read); - DECLARE_WRITE8_MEMBER(bbcm_wd1770_write); - DECLARE_READ8_MEMBER(bbcm_wd1770l_read); - DECLARE_WRITE8_MEMBER(bbcm_wd1770l_write); - DECLARE_READ8_MEMBER(bbc_disc_r); - DECLARE_WRITE8_MEMBER(bbc_disc_w); - DECLARE_WRITE8_MEMBER(bbc_videoULA_w); - DECLARE_WRITE8_MEMBER(bbc_6845_w); - DECLARE_READ8_MEMBER(bbc_6845_r); - DECLARE_READ8_MEMBER(bbc_fe_r); - DECLARE_DIRECT_UPDATE_MEMBER(bbcbp_direct_handler); - DECLARE_DIRECT_UPDATE_MEMBER(bbcm_direct_handler); - DECLARE_DRIVER_INIT(bbc); - DECLARE_DRIVER_INIT(bbcm); - DECLARE_MACHINE_START(bbca); - DECLARE_MACHINE_RESET(bbca); - DECLARE_VIDEO_START(bbca); - DECLARE_MACHINE_START(bbcb); - DECLARE_MACHINE_RESET(bbcb); - DECLARE_VIDEO_START(bbcb); - DECLARE_MACHINE_START(bbcbp); - DECLARE_MACHINE_RESET(bbcbp); - DECLARE_VIDEO_START(bbcbp); - DECLARE_MACHINE_START(bbcm); - DECLARE_MACHINE_RESET(bbcm); - DECLARE_VIDEO_START(bbcm); - DECLARE_PALETTE_INIT(bbc); - UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(bbcb_vsync); - INTERRUPT_GEN_MEMBER(bbcb_keyscan); - INTERRUPT_GEN_MEMBER(bbcm_keyscan); - TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb); - DECLARE_WRITE_LINE_MEMBER(bbcb_acia6850_irq_w); - DECLARE_WRITE_LINE_MEMBER(econet_clk_w); - DECLARE_WRITE8_MEMBER(bbcb_via_system_write_porta); - DECLARE_WRITE8_MEMBER(bbcb_via_system_write_portb); - DECLARE_READ8_MEMBER(bbcb_via_system_read_porta); - DECLARE_READ8_MEMBER(bbcb_via_system_read_portb); - DECLARE_WRITE_LINE_MEMBER(bbcb_via_system_irq_w); - DECLARE_READ8_MEMBER(bbcb_via_user_read_portb); - DECLARE_WRITE8_MEMBER(bbcb_via_user_write_portb); - DECLARE_WRITE_LINE_MEMBER(bbcb_via_user_irq_w); - DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_intrq_w); - DECLARE_WRITE_LINE_MEMBER(bbc_wd177x_drq_w); - DECLARE_WRITE_LINE_MEMBER(bbc_vsync); - void update_acia_rxd(); - void update_acia_dcd(); - void update_acia_cts(); - DECLARE_WRITE_LINE_MEMBER(bbc_rts_w); - DECLARE_WRITE_LINE_MEMBER(bbc_txd_w); - DECLARE_WRITE_LINE_MEMBER(write_rxd_serial); - DECLARE_WRITE_LINE_MEMBER(write_dcd_serial); - DECLARE_WRITE_LINE_MEMBER(write_cts_serial); - DECLARE_INPUT_CHANGED_MEMBER( trigger_reset ); - - DECLARE_WRITE_LINE_MEMBER(bbc_i8271_interrupt); - - DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart ); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart ); - -protected: - required_memory_region m_region_maincpu; - required_memory_region m_region_user1; - optional_memory_region m_region_user2; - required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm - optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm - optional_memory_bank m_bank3; // bbca bbcb - required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm - optional_memory_bank m_bank5; // bbcm - optional_memory_bank m_bank6; // bbcbp bbcbp128 - required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm - optional_memory_bank m_bank8; // bbcm void bbcbp_setvideoshadow(int vdusel); void common_init(int memorySize); @@ -396,7 +403,6 @@ protected: void MC6850_Receive_Clock(int new_clock); void BBC_Cassette_motor(unsigned char status); void bbc_update_fdq_int(int state); -public: unsigned int calculate_video_address(int ma,int ra); }; diff --git a/src/mess/includes/nc.h b/src/mess/includes/nc.h index 7d41e567a93..fcbb68c352f 100644 --- a/src/mess/includes/nc.h +++ b/src/mess/includes/nc.h @@ -8,6 +8,8 @@ #define NC_H_ #include "bus/centronics/ctronics.h" +#include "machine/i8251.h" +#include "machine/clock.h" #include "machine/ram.h" #include "sound/beep.h" @@ -31,42 +33,18 @@ enum class nc_state : public driver_device { public: - nc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + nc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ram(*this, RAM_TAG), m_beeper1(*this, "beep.1"), m_beeper2(*this, "beep.2"), - m_centronics(*this, "centronics") + m_centronics(*this, "centronics"), + m_uart(*this, "uart"), + m_uart_clock(*this, "uart_clock") { } - emu_timer *m_serial_timer; - char m_memory_config[4]; - emu_timer *m_keyboard_timer; - int m_membank_rom_mask; - int m_membank_internal_ram_mask; - UINT8 m_poweroff_control; - int m_card_status; - unsigned char m_uart_control; - int m_irq_mask; - int m_irq_status; - int m_irq_latch; - int m_irq_latch_mask; - int m_sound_channel_periods[2]; - int m_previous_inputport_10_state; - int m_previous_alarm_state; - UINT8 m_nc200_uart_interrupt_irq; - unsigned char *m_card_ram; - int m_membank_card_ram_mask; - unsigned long m_display_memory_start; - UINT8 m_type; - int m_card_size; - int m_nc200_backlight; - - int m_centronics_ack; - int m_centronics_busy; - DECLARE_READ8_MEMBER(nc_memory_management_r); DECLARE_WRITE8_MEMBER(nc_memory_management_w); DECLARE_WRITE8_MEMBER(nc_irq_mask_w); @@ -87,10 +65,6 @@ public: DECLARE_WRITE8_MEMBER(nc200_memory_card_wait_state_w); DECLARE_WRITE8_MEMBER(nc200_poweroff_control_w); - virtual void machine_start(); - virtual void machine_reset(); - virtual void video_start(); - virtual void palette_init(); DECLARE_MACHINE_START(nc200); DECLARE_MACHINE_RESET(nc200); UINT32 screen_update_nc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -100,6 +74,7 @@ public: DECLARE_WRITE_LINE_MEMBER(nc100_tc8521_alarm_callback); DECLARE_WRITE_LINE_MEMBER(nc100_txrdy_callback); DECLARE_WRITE_LINE_MEMBER(nc100_rxrdy_callback); + DECLARE_WRITE_LINE_MEMBER(write_uart_clock); DECLARE_WRITE_LINE_MEMBER(write_nc100_centronics_ack); DECLARE_WRITE_LINE_MEMBER(write_nc200_centronics_ack); DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); @@ -107,18 +82,18 @@ public: DECLARE_WRITE_LINE_MEMBER(nc200_rxrdy_callback); DECLARE_WRITE_LINE_MEMBER(nc200_fdc_interrupt); - void nc200_fdc_interrupt(bool state); - DECLARE_DRIVER_INIT( nc ); DECLARE_DEVICE_IMAGE_LOAD_MEMBER( nc_pcmcia_card ); DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( nc_pcmcia_card ); - required_device<cpu_device> m_maincpu; - required_device<ram_device> m_ram; - required_device<beep_device> m_beeper1; - required_device<beep_device> m_beeper2; - required_device<centronics_device> m_centronics; +protected: + virtual void machine_start(); + virtual void machine_reset(); + virtual void video_start(); + virtual void palette_init(); +private: + void nc200_fdc_interrupt(bool state); void nc200_video_set_backlight(int state); void nc_card_save(device_image_interface &image); int nc_card_calculate_mask(int size); @@ -132,6 +107,40 @@ public: void nc150_init_machine(); void nc200_refresh_uart_interrupt(); void nc200_floppy_drive_index_callback(int drive_id); + +public: // HACK FOR MC6845 + required_device<cpu_device> m_maincpu; + required_device<ram_device> m_ram; + required_device<beep_device> m_beeper1; + required_device<beep_device> m_beeper2; + required_device<centronics_device> m_centronics; + required_device<i8251_device> m_uart; + required_device<clock_device> m_uart_clock; + + char m_memory_config[4]; + emu_timer *m_keyboard_timer; + int m_membank_rom_mask; + int m_membank_internal_ram_mask; + UINT8 m_poweroff_control; + int m_card_status; + unsigned char m_uart_control; + int m_irq_mask; + int m_irq_status; + int m_irq_latch; + int m_irq_latch_mask; + int m_sound_channel_periods[2]; + int m_previous_inputport_10_state; + int m_previous_alarm_state; + UINT8 m_nc200_uart_interrupt_irq; + unsigned char *m_card_ram; + int m_membank_card_ram_mask; + unsigned long m_display_memory_start; + UINT8 m_type; + int m_card_size; + int m_nc200_backlight; + + int m_centronics_ack; + int m_centronics_busy; }; diff --git a/src/mess/includes/newbrain.h b/src/mess/includes/newbrain.h index 0a9906baf86..309ab0638a1 100644 --- a/src/mess/includes/newbrain.h +++ b/src/mess/includes/newbrain.h @@ -57,70 +57,36 @@ class newbrain_state : public driver_device { public: - newbrain_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, Z80_TAG), - m_copcpu(*this, COP420_TAG), - m_cassette1(*this, "cassette"), - m_cassette2(*this, "cassette2"), - m_rom(*this, Z80_TAG), - m_eim_rom(*this, "eim"), - m_char_rom(*this, "chargen"), - m_y0(*this, "Y0"), - m_y1(*this, "Y1"), - m_y2(*this, "Y2"), - m_y3(*this, "Y3"), - m_y4(*this, "Y4"), - m_y5(*this, "Y5"), - m_y6(*this, "Y6"), - m_y7(*this, "Y7"), - m_y8(*this, "Y8"), - m_y9(*this, "Y9"), - m_y10(*this, "Y10"), - m_y11(*this, "Y11"), - m_y12(*this, "Y12"), - m_y13(*this, "Y13"), - m_y14(*this, "Y14"), - m_y15(*this, "Y15") - { } - - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_copcpu; - required_device<cassette_image_device> m_cassette1; - required_device<cassette_image_device> m_cassette2; - required_memory_region m_rom; - optional_memory_region m_eim_rom; - required_memory_region m_char_rom; - required_ioport m_y0; - required_ioport m_y1; - required_ioport m_y2; - required_ioport m_y3; - required_ioport m_y4; - required_ioport m_y5; - required_ioport m_y6; - required_ioport m_y7; - required_ioport m_y8; - required_ioport m_y9; - required_ioport m_y10; - required_ioport m_y11; - required_ioport m_y12; - required_ioport m_y13; - required_ioport m_y14; - required_ioport m_y15; - - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - virtual void machine_start(); - virtual void machine_reset(); + newbrain_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, Z80_TAG), + m_copcpu(*this, COP420_TAG), + m_cassette1(*this, "cassette"), + m_cassette2(*this, "cassette2"), + m_rom(*this, Z80_TAG), + m_eim_rom(*this, "eim"), + m_char_rom(*this, "chargen"), + m_y0(*this, "Y0"), + m_y1(*this, "Y1"), + m_y2(*this, "Y2"), + m_y3(*this, "Y3"), + m_y4(*this, "Y4"), + m_y5(*this, "Y5"), + m_y6(*this, "Y6"), + m_y7(*this, "Y7"), + m_y8(*this, "Y8"), + m_y9(*this, "Y9"), + m_y10(*this, "Y10"), + m_y11(*this, "Y11"), + m_y12(*this, "Y12"), + m_y13(*this, "Y13"), + m_y14(*this, "Y14"), + m_y15(*this, "Y15") + { + } - virtual void video_start(); UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - enum - { - TIMER_ID_RESET, - TIMER_ID_PWRUP - }; - DECLARE_WRITE8_MEMBER( enrg1_w ); DECLARE_WRITE8_MEMBER( a_enrg1_w ); DECLARE_READ8_MEMBER( ust_r ); @@ -146,6 +112,22 @@ public: DECLARE_READ8_MEMBER( cop_r ); DECLARE_WRITE8_MEMBER( cop_w ); + INTERRUPT_GEN_MEMBER(newbrain_interrupt); + TIMER_DEVICE_CALLBACK_MEMBER(cop_regint_tick); + +protected: + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void machine_start(); + virtual void machine_reset(); + + virtual void video_start(); + + enum + { + TIMER_ID_RESET, + TIMER_ID_PWRUP + }; + void check_interrupt(); void bankswitch(); void tvram_w(UINT8 data, int a6); @@ -153,6 +135,30 @@ public: inline int get_pwrup_t(); void screen_update(bitmap_rgb32 &bitmap, const rectangle &cliprect); + required_device<cpu_device> m_maincpu; + required_device<cpu_device> m_copcpu; + required_device<cassette_image_device> m_cassette1; + required_device<cassette_image_device> m_cassette2; + required_memory_region m_rom; + optional_memory_region m_eim_rom; + required_memory_region m_char_rom; + required_ioport m_y0; + required_ioport m_y1; + required_ioport m_y2; + required_ioport m_y3; + required_ioport m_y4; + required_ioport m_y5; + required_ioport m_y6; + required_ioport m_y7; + required_ioport m_y8; + required_ioport m_y9; + required_ioport m_y10; + required_ioport m_y11; + required_ioport m_y12; + required_ioport m_y13; + required_ioport m_y14; + required_ioport m_y15; + // processor state int m_pwrup; // power up int m_userint; // user interrupt @@ -194,9 +200,6 @@ public: int m_copstate; int m_copbytes; int m_copregint; - - INTERRUPT_GEN_MEMBER(newbrain_interrupt); - TIMER_DEVICE_CALLBACK_MEMBER(cop_regint_tick); }; class newbrain_eim_state : public newbrain_state @@ -241,8 +244,6 @@ public: DECLARE_WRITE_LINE_MEMBER( acia_tx ); DECLARE_WRITE_LINE_MEMBER( acia_interrupt ); DECLARE_WRITE_LINE_MEMBER( fdc_interrupt ); - DECLARE_WRITE_LINE_MEMBER( ctc_z0_w ); - DECLARE_WRITE_LINE_MEMBER( ctc_z1_w ); DECLARE_WRITE_LINE_MEMBER( ctc_z2_w ); DECLARE_WRITE_LINE_MEMBER( adc_eoc_w ); diff --git a/src/mess/includes/osi.h b/src/mess/includes/osi.h index 8e7475021f2..e0cdae9b058 100644 --- a/src/mess/includes/osi.h +++ b/src/mess/includes/osi.h @@ -28,56 +28,50 @@ class sb2m600_state : public driver_device { public: - enum + sb2m600_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, M6502_TAG), + m_acia_0(*this, "acia_0"), + m_cassette(*this, "cassette"), + m_discrete(*this, DISCRETE_TAG), + m_ram(*this, RAM_TAG), + m_video_ram(*this, "video_ram"), + m_color_ram(*this, "color_ram"), + m_io_row0(*this, "ROW0"), + m_io_row1(*this, "ROW1"), + m_io_row2(*this, "ROW2"), + m_io_row3(*this, "ROW3"), + m_io_row4(*this, "ROW4"), + m_io_row5(*this, "ROW5"), + m_io_row6(*this, "ROW6"), + m_io_row7(*this, "ROW7"), + m_io_sound(*this, "Sound"), + m_io_reset(*this, "Reset"), + m_beeper(*this, "beeper") { - TIMER_SETUP_BEEP - }; + } - sb2m600_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, M6502_TAG), - m_acia_0(*this, "acia_0"), - m_cassette(*this, "cassette"), - m_discrete(*this, DISCRETE_TAG), - m_ram(*this, RAM_TAG), - m_video_ram(*this, "video_ram"), - m_color_ram(*this, "color_ram"), - m_io_row0(*this, "ROW0"), - m_io_row1(*this, "ROW1"), - m_io_row2(*this, "ROW2"), - m_io_row3(*this, "ROW3"), - m_io_row4(*this, "ROW4"), - m_io_row5(*this, "ROW5"), - m_io_row6(*this, "ROW6"), - m_io_row7(*this, "ROW7"), - m_io_sound(*this, "Sound"), - m_io_reset(*this, "Reset"), - m_beeper(*this, "beeper") - { } - - virtual void machine_start(); - virtual void video_start(); UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_READ8_MEMBER( keyboard_r ); DECLARE_WRITE8_MEMBER( keyboard_w ); DECLARE_WRITE8_MEMBER( ctrl_w ); DECLARE_WRITE_LINE_MEMBER( cassette_tx ); - TIMER_DEVICE_CALLBACK_MEMBER( tape_tick ); - - /* keyboard state */ - UINT8 m_keylatch; - - /* video state */ - int m_32; - int m_coloren; - UINT8 *m_p_chargen; + DECLARE_WRITE_LINE_MEMBER( write_cassette_clock ); - /* floppy state */ - int m_fdc_index; DECLARE_WRITE_LINE_MEMBER(osi470_index_callback); DECLARE_PALETTE_INIT(osi630); +protected: + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void machine_start(); + virtual void video_start(); + + enum + { + TIMER_SETUP_BEEP + }; + required_device<cpu_device> m_maincpu; required_device<acia6850_device> m_acia_0; required_device<cassette_image_device> m_cassette; @@ -97,17 +91,26 @@ public: required_ioport m_io_reset; optional_device<beep_device> m_beeper; -protected: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + /* floppy state */ + int m_fdc_index; + + /* keyboard state */ + UINT8 m_keylatch; + + /* video state */ + int m_32; + int m_coloren; + UINT8 *m_p_chargen; }; class c1p_state : public sb2m600_state { public: - c1p_state(const machine_config &mconfig, device_type type, const char *tag) - : sb2m600_state(mconfig, type, tag), - m_beep(*this, "beeper") - { } + c1p_state(const machine_config &mconfig, device_type type, const char *tag) : + sb2m600_state(mconfig, type, tag), + m_beep(*this, "beeper") + { + } required_device<beep_device> m_beep; @@ -139,9 +142,10 @@ public: class uk101_state : public sb2m600_state { public: - uk101_state(const machine_config &mconfig, device_type type, const char *tag) - : sb2m600_state(mconfig, type, tag) - { } + uk101_state(const machine_config &mconfig, device_type type, const char *tag) : + sb2m600_state(mconfig, type, tag) + { + } UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); diff --git a/src/mess/includes/tek405x.h b/src/mess/includes/tek405x.h index 09985b75e5e..b6914621cf0 100644 --- a/src/mess/includes/tek405x.h +++ b/src/mess/includes/tek405x.h @@ -11,6 +11,7 @@ #include "machine/ram.h" #include "machine/6821pia.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "bus/ieee488/ieee488.h" #include "machine/ram.h" #include "sound/speaker.h" @@ -32,25 +33,28 @@ class tek4051_state : public driver_device { public: - tek4051_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, MC6800_TAG), - m_gpib_pia(*this, MC6820_GPIB_TAG), - m_com_pia(*this, MC6820_COM_TAG), - m_acia(*this, MC6850_TAG), - m_gpib(*this, IEEE488_TAG), - m_speaker(*this, "speaker"), - m_ram(*this, RAM_TAG), - m_rom(*this, MC6800_TAG), - m_bsofl_rom(*this, "020_0147_00"), - m_bscom_rom(*this, "021_0188_00"), - m_special(*this, "SPECIAL") - { } + tek4051_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, MC6800_TAG), + m_gpib_pia(*this, MC6820_GPIB_TAG), + m_com_pia(*this, MC6820_COM_TAG), + m_acia(*this, MC6850_TAG), + m_acia_clock(*this, "acia_clock"), + m_gpib(*this, IEEE488_TAG), + m_speaker(*this, "speaker"), + m_ram(*this, RAM_TAG), + m_rom(*this, MC6800_TAG), + m_bsofl_rom(*this, "020_0147_00"), + m_bscom_rom(*this, "021_0188_00"), + m_special(*this, "SPECIAL") + { + } required_device<cpu_device> m_maincpu; required_device<pia6821_device> m_gpib_pia; required_device<pia6821_device> m_com_pia; required_device<acia6850_device> m_acia; + required_device<clock_device> m_acia_clock; required_device<ieee488_device> m_gpib; required_device<speaker_sound_device> m_speaker; required_device<ram_device> m_ram; @@ -111,6 +115,7 @@ public: DECLARE_WRITE_LINE_MEMBER( com_pia_irqa_w ); DECLARE_WRITE_LINE_MEMBER( com_pia_irqb_w ); DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); // interrupts int m_x_pia_irqa; diff --git a/src/mess/includes/thomson.h b/src/mess/includes/thomson.h index cfcdee46e49..ccadaf45460 100644 --- a/src/mess/includes/thomson.h +++ b/src/mess/includes/thomson.h @@ -96,8 +96,8 @@ enum to7_io_dev class thomson_state : public driver_device { public: - thomson_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), + thomson_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), m_mc6854(*this, "mc6854"), m_maincpu(*this, "maincpu"), m_cassette(*this, "cassette"), @@ -113,7 +113,10 @@ public: m_mea8000(*this, "mea8000"), m_ram(*this, RAM_TAG), m_mc6846(*this, "mc6846"), - m_mc6843(*this, "mc6843") { } + m_mc6843(*this, "mc6843"), + m_acia6850(*this, "acia6850") + { + } DECLARE_DEVICE_IMAGE_LOAD_MEMBER( to7_cartridge ); DECLARE_DEVICE_IMAGE_LOAD_MEMBER( mo5_cartridge ); @@ -138,6 +141,7 @@ public: DECLARE_WRITE_LINE_MEMBER( to7_io_cb2_out ); DECLARE_WRITE_LINE_MEMBER( to7_modem_cb ); DECLARE_WRITE_LINE_MEMBER( to7_modem_tx_w ); + DECLARE_WRITE_LINE_MEMBER( write_acia_clock ); DECLARE_READ8_MEMBER( to7_modem_mea8000_r ); DECLARE_WRITE8_MEMBER( to7_modem_mea8000_w ); DECLARE_READ8_MEMBER( to7_game_porta_in ); @@ -331,6 +335,7 @@ protected: required_device<ram_device> m_ram; optional_device<mc6846_device> m_mc6846; optional_device<mc6843_device> m_mc6843; + optional_device<acia6850_device> m_acia6850; /* bank logging and optimisations */ int m_old_cart_bank; @@ -562,7 +567,6 @@ protected: extern const mc6846_interface to7_timer; extern const mea8000_interface to7_speech; -extern const acia6850_interface to7_modem; extern const mc6846_interface to770_timer; extern const mc6846_interface to9_timer; diff --git a/src/mess/includes/v1050.h b/src/mess/includes/v1050.h index 421d24ab18a..400fe7f8a65 100644 --- a/src/mess/includes/v1050.h +++ b/src/mess/includes/v1050.h @@ -10,6 +10,7 @@ #include "cpu/z80/z80.h" #include "cpu/m6502/m6502.h" #include "bus/centronics/ctronics.h" +#include "machine/clock.h" #include "machine/i8214.h" #include "machine/i8251.h" #include "machine/i8255.h" @@ -39,8 +40,8 @@ #define I8255A_M6502_TAG "u101" #define H46505_TAG "u75" #define CENTRONICS_TAG "centronics" -#define TIMER_KB_TAG "timer_kb" -#define TIMER_SIO_TAG "timer_sio" +#define CLOCK_KB_TAG "keyboard_clock" +#define CLOCK_SIO_TAG "sio_clock" #define TIMER_ACK_TAG "timer_ack" #define TIMER_RST_TAG "timer_rst" #define SASIBUS_TAG "sasi" @@ -78,7 +79,7 @@ public: m_floppy1(*this, MB8877_TAG":1"), m_floppy2(*this, MB8877_TAG":2"), m_floppy3(*this, MB8877_TAG":3"), - m_timer_sio(*this, TIMER_SIO_TAG), + m_clock_sio(*this, CLOCK_SIO_TAG), m_timer_ack(*this, TIMER_ACK_TAG), m_timer_rst(*this, TIMER_RST_TAG), m_sasibus(*this, SASIBUS_TAG ":host"), @@ -90,33 +91,6 @@ public: { } - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_subcpu; - required_device<i8214_device> m_pic; - required_device<msm58321_device> m_rtc; - required_device<i8251_device> m_uart_kb; - required_device<i8251_device> m_uart_sio; - required_device<mb8877_t> m_fdc; - required_device<mc6845_device> m_crtc; - required_device<centronics_device> m_centronics; - required_device<ram_device> m_ram; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; - required_device<floppy_connector> m_floppy2; - required_device<floppy_connector> m_floppy3; - required_device<timer_device> m_timer_sio; - required_device<timer_device> m_timer_ack; - required_device<timer_device> m_timer_rst; - required_device<scsicb_device> m_sasibus; - required_memory_region m_rom; - required_shared_ptr<UINT8> m_video_ram; - optional_shared_ptr<UINT8> m_attr_ram; - - virtual void machine_start(); - virtual void machine_reset(); - - virtual void video_start(); - DECLARE_READ8_MEMBER( kb_data_r ); DECLARE_READ8_MEMBER( kb_status_r ); DECLARE_WRITE8_MEMBER( v1050_i8214_w ); @@ -156,14 +130,57 @@ public: WRITE_LINE_MEMBER( rtc_ppi_pa_1_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 1)) | ((state & 1) << 1); } WRITE_LINE_MEMBER( rtc_ppi_pa_2_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 2)) | ((state & 1) << 2); } WRITE_LINE_MEMBER( rtc_ppi_pa_3_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 3)) | ((state & 1) << 3); } - UINT8 m_rtc_ppi_pa; WRITE_LINE_MEMBER( rtc_ppi_pc_3_w ){ m_rtc_ppi_pc = (m_rtc_ppi_pc & ~(1 << 3)) | ((state & 1) << 3); } - UINT8 m_rtc_ppi_pc; + TIMER_DEVICE_CALLBACK_MEMBER(v1050_keyboard_tick); + TIMER_DEVICE_CALLBACK_MEMBER(sasi_ack_tick); + TIMER_DEVICE_CALLBACK_MEMBER(sasi_rst_tick); + DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); + DECLARE_WRITE_LINE_MEMBER(write_sio_clock); + DECLARE_WRITE_LINE_MEMBER(pic_int_w); + DECLARE_WRITE8_MEMBER(disp_ppi_pc_w); + DECLARE_WRITE8_MEMBER(m6502_ppi_pc_w); + DECLARE_READ8_MEMBER(misc_ppi_pc_r); + IRQ_CALLBACK_MEMBER(v1050_int_ack); + + DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); + DECLARE_WRITE_LINE_MEMBER(write_centronics_perror); + +protected: + virtual void machine_start(); + virtual void machine_reset(); + + virtual void video_start(); + +private: void bankswitch(); void update_fdc(); void set_interrupt(UINT8 mask, int state); void scan_keyboard(); + void set_baud_sel(int sel); + +public: // HACK for MC6845 + required_device<cpu_device> m_maincpu; + required_device<cpu_device> m_subcpu; + required_device<i8214_device> m_pic; + required_device<msm58321_device> m_rtc; + required_device<i8251_device> m_uart_kb; + required_device<i8251_device> m_uart_sio; + required_device<mb8877_t> m_fdc; + required_device<mc6845_device> m_crtc; + required_device<centronics_device> m_centronics; + required_device<ram_device> m_ram; + required_device<floppy_connector> m_floppy0; + required_device<floppy_connector> m_floppy1; + required_device<floppy_connector> m_floppy2; + required_device<floppy_connector> m_floppy3; + required_device<clock_device> m_clock_sio; + required_device<timer_device> m_timer_ack; + required_device<timer_device> m_timer_rst; + required_device<scsicb_device> m_sasibus; + required_memory_region m_rom; + required_shared_ptr<UINT8> m_video_ram; + optional_shared_ptr<UINT8> m_attr_ram; // interrupt state UINT8 m_int_mask; // interrupt mask @@ -191,19 +208,8 @@ public: // sasi state UINT8 data_out; - TIMER_DEVICE_CALLBACK_MEMBER(v1050_keyboard_tick); - TIMER_DEVICE_CALLBACK_MEMBER(sasi_ack_tick); - TIMER_DEVICE_CALLBACK_MEMBER(sasi_rst_tick); - TIMER_DEVICE_CALLBACK_MEMBER(kb_8251_tick); - TIMER_DEVICE_CALLBACK_MEMBER(sio_8251_tick); - DECLARE_WRITE_LINE_MEMBER(pic_int_w); - DECLARE_WRITE8_MEMBER(disp_ppi_pc_w); - DECLARE_WRITE8_MEMBER(m6502_ppi_pc_w); - DECLARE_READ8_MEMBER(misc_ppi_pc_r); - IRQ_CALLBACK_MEMBER(v1050_int_ack); - - DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); - DECLARE_WRITE_LINE_MEMBER(write_centronics_perror); + UINT8 m_rtc_ppi_pa; + UINT8 m_rtc_ppi_pc; int m_centronics_busy; int m_centronics_perror; diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c index 0a8f8e5029a..d64230d5e83 100644 --- a/src/mess/machine/bbc.c +++ b/src/mess/machine/bbc.c @@ -575,9 +575,9 @@ READ8_MEMBER(bbc_state::bbcm_r) if ((myo>=0x08) && (myo<=0x0f)) { if ((myo - 0x08) & 1) - return m_acia->status_read(space,0); + return m_acia->status_r(space,0); else - return m_acia->data_read(space,0); + return m_acia->data_r(space,0); } if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */ if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002->read(space, myo-0x18); /* A to D converter */ @@ -609,9 +609,9 @@ WRITE8_MEMBER(bbc_state::bbcm_w) if ((myo>=0x08) && (myo<=0x0f)) { if ((myo - 0x08) & 1) - m_acia->control_write(space, 0, data); + m_acia->control_w(space, 0, data); else - m_acia->data_write(space, 0, data); + m_acia->data_w(space, 0, data); } if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10, data); /* Serial System Chip */ if ((myo>=0x18) && (myo<=0x1f)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */ @@ -1200,7 +1200,8 @@ void bbc_state::MC6850_Receive_Clock(int new_clock) // for (int i = 0; i < 16; i++ ) { - m_acia->rx_clock_in(); + m_acia->write_rxc(1); + m_acia->write_rxc(0); } } @@ -1322,7 +1323,7 @@ WRITE_LINE_MEMBER( bbc_state::write_rxd_serial ) void bbc_state::update_acia_rxd() { - m_acia->write_rx(( m_serproc_data & 0x40 ) ? m_rxd_serial : m_rxd_cass); + m_acia->write_rxd(( m_serproc_data & 0x40 ) ? m_rxd_serial : m_rxd_cass); } @@ -1421,14 +1422,14 @@ WRITE8_MEMBER(bbc_state::bbc_SerialULA_w) { static const int serial_clocks[8] = { - XTAL_16MHz / 13 / 1, // 000 - XTAL_16MHz / 13 / 16, // 001 - XTAL_16MHz / 13 / 4, // 010 - XTAL_16MHz / 13 / 128, // 011 - XTAL_16MHz / 13 / 2, // 100 - XTAL_16MHz / 13 / 64, // 101 - XTAL_16MHz / 13 / 8, // 110 - XTAL_16MHz / 13 / 256 // 111 + 1, // 000 + 16, // 001 + 4, // 010 + 128, // 011 + 2, // 100 + 64, // 101 + 8, // 110 + 256 // 111 }; m_serproc_data = data; @@ -1438,17 +1439,15 @@ WRITE8_MEMBER(bbc_state::bbc_SerialULA_w) BBC_Cassette_motor(m_serproc_data & 0x80); // Set transmit clock rate - m_acia->set_tx_clock( serial_clocks[ data & 0x07 ] ); + m_acia_clock->set_clock_scale( (double) 1 / serial_clocks[ data & 0x07 ] ); +} - if ( data & 0x40 ) - { - // Set receive clock rate - m_acia->set_rx_clock( serial_clocks[ ( data >> 3 ) & 0x07 ] ); - } - else - { - m_acia->set_rx_clock( 0 ); - } +WRITE_LINE_MEMBER(bbc_state::write_acia_clock) +{ + m_acia->write_txc(state); + + if (m_serproc_data & 0x40) + m_acia->write_rxc(state); } /************************************** diff --git a/src/mess/machine/isa_gus.c b/src/mess/machine/isa_gus.c index d3a88999250..588f054ba3b 100644 --- a/src/mess/machine/isa_gus.c +++ b/src/mess/machine/isa_gus.c @@ -5,12 +5,11 @@ */ +#include "isa_gus.h" #include "bus/midi/midi.h" #include "bus/midi/midiinport.h" #include "bus/midi/midioutport.h" -#include "isa_gus.h" -#include "sound/speaker.h" -#include "machine/6850acia.h" +#include "machine/clock.h" //************************************************************************** @@ -41,6 +40,25 @@ const device_type ISA16_GUS = &device_creator<isa16_gus_device>; FILE* f; #endif +void gf1_device::update_irq() +{ + int txirq = calculate_txirq(); + + if (m_txirq != txirq) + { + m_txirq = txirq; + m_txirq_handler(!m_txirq); + } + + int rxirq = calculate_rxirq(); + + if (m_rxirq != rxirq) + { + m_rxirq = rxirq; + m_rxirq_handler(!m_rxirq); + } +} + /* only the Adlib timers are implemented in hardware */ READ8_MEMBER( gf1_device::adlib_r ) { @@ -332,9 +350,11 @@ void gf1_device::sound_stream_update(sound_stream &stream, stream_sample_t **inp // gf1_device - constructor //------------------------------------------------- -gf1_device::gf1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, GGF1, "Gravis GF1", tag, owner, clock, "gf1", __FILE__), - device_sound_interface( mconfig, *this ) +gf1_device::gf1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + acia6850_device(mconfig, GGF1, "Gravis GF1", tag, owner, clock, "gf1", __FILE__), + device_sound_interface( mconfig, *this ), + m_txirq_handler(*this), + m_rxirq_handler(*this) { } @@ -369,6 +389,9 @@ void gf1_device::device_start() int i; double out = (double)(1 << 13); + m_txirq_handler.resolve_safe(); + m_rxirq_handler.resolve_safe(); + // TODO: make DRAM size configurable. Can be 256k, 512k, 768k, or 1024k m_wave_ram = auto_alloc_array(machine(),UINT8,1024*1024); memset(m_wave_ram,0,1024*1024); @@ -1202,15 +1225,6 @@ void gf1_device::eop_w(int state) /* 16-bit ISA card device implementation */ -static ACIA6850_INTERFACE(gus_midi_interface) -{ - 31250 * 16, - 0, - DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,midi_irq) -}; - static SLOT_INTERFACE_START(midiin_slot) SLOT_INTERFACE("midiin", MIDIIN_PORT) SLOT_INTERFACE_END @@ -1238,11 +1252,18 @@ static MACHINE_CONFIG_FRAGMENT( gus_config ) MCFG_SOUND_CONFIG(gus_gf1_config) MCFG_SOUND_ROUTE(0,"lspeaker",0.50) MCFG_SOUND_ROUTE(1,"rspeaker",0.50) - MCFG_ACIA6850_ADD("midi",gus_midi_interface) + + MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) + MCFG_GF1_TXIRQ_HANDLER(WRITELINE(isa16_gus_device, midi_txirq)) + MCFG_GF1_RXIRQ_HANDLER(WRITELINE(isa16_gus_device, midi_txirq)) + MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") - MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, isa16_gus_device, midi_rx_w)) + MCFG_MIDI_RX_HANDLER(DEVWRITELINE("gf1", acia6850_device, write_rxd)) MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout") + + MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(isa16_gus_device, write_acia_clock)) MACHINE_CONFIG_END static INPUT_PORTS_START( gus_joy ) @@ -1276,16 +1297,15 @@ ioport_constructor isa16_gus_device::device_input_ports() const } -isa16_gus_device::isa16_gus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, ISA16_GUS, "Gravis Ultrasound", tag, owner, clock, "isa_gus", __FILE__), - device_isa16_card_interface( mconfig, *this ) +isa16_gus_device::isa16_gus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, ISA16_GUS, "Gravis Ultrasound", tag, owner, clock, "isa_gus", __FILE__), + device_isa16_card_interface( mconfig, *this ), + m_gf1(*this, "gf1") { } void isa16_gus_device::device_start() { - m_gf1 = subdevice<gf1_device>("gf1"); - m_midi = subdevice<acia6850_device>("midi"); set_isa_device(); m_isa->install_device(0x0200, 0x0201, 0, 0, read8_delegate(FUNC(isa16_gus_device::joy_r),this), write8_delegate(FUNC(isa16_gus_device::joy_w),this) ); m_isa->install_device(0x0220, 0x022f, 0, 0, read8_delegate(FUNC(isa16_gus_device::board_r),this), write8_delegate(FUNC(isa16_gus_device::board_w),this) ); @@ -1376,9 +1396,9 @@ READ8_MEMBER(isa16_gus_device::synth_r) switch(offset) { case 0x00: - return m_midi->status_read(space,0); + return m_gf1->status_r(space,0); case 0x01: - return m_midi->data_read(space,0); + return m_gf1->data_r(space,0); case 0x02: case 0x03: return m_gf1->global_reg_select_r(space,offset-2); @@ -1400,10 +1420,10 @@ WRITE8_MEMBER(isa16_gus_device::synth_w) switch(offset) { case 0x00: - m_midi->control_write(space,0,data); + m_gf1->control_w(space,0,data); break; case 0x01: - m_midi->data_write(space,0,data); + m_gf1->data_w(space,0,data); break; case 0x02: case 0x03: @@ -1682,36 +1702,26 @@ void isa16_gus_device::reset_midi_irq(UINT8 source) logerror("GUS: Reset MIDI IRQ %02x\n",source); } -WRITE_LINE_MEMBER( isa16_gus_device::midi_irq ) +WRITE_LINE_MEMBER( isa16_gus_device::midi_txirq ) { - UINT8 irq_type; - UINT8 st = m_midi->get_status(); + if (state) + set_midi_irq(IRQ_MIDI_TRANSMIT); + else + reset_midi_irq(IRQ_MIDI_TRANSMIT | IRQ_MIDI_RECEIVE); +} - if(state == ASSERT_LINE) - { - if(st & 0x01) // receive - irq_type = IRQ_MIDI_RECEIVE; - else - if(st & 0x02) // transmit - irq_type = IRQ_MIDI_TRANSMIT; - else - { - logerror("GUS: MIDI IRQ unknown: %02x\n",st); - return; // Should never reach here... - } - set_midi_irq(irq_type); - } +WRITE_LINE_MEMBER( isa16_gus_device::midi_rxirq ) +{ + if (state) + set_midi_irq(IRQ_MIDI_RECEIVE); else reset_midi_irq(IRQ_MIDI_TRANSMIT | IRQ_MIDI_RECEIVE); } -WRITE_LINE_MEMBER( isa16_gus_device::midi_rx_w ) +WRITE_LINE_MEMBER( isa16_gus_device::write_acia_clock ) { - m_midi->write_rx(state); - for (int i = 0; i < 16; i++) // divider is set to 16 - { - m_midi->rx_clock_in(); - } + m_gf1->write_txc(state); + m_gf1->write_rxc(state); } WRITE_LINE_MEMBER( isa16_gus_device::nmi_w) diff --git a/src/mess/machine/isa_gus.h b/src/mess/machine/isa_gus.h index 82ef33012ae..d9ffaf1f64d 100644 --- a/src/mess/machine/isa_gus.h +++ b/src/mess/machine/isa_gus.h @@ -44,6 +44,12 @@ #include "machine/isa.h" #include "machine/6850acia.h" +#define MCFG_GF1_TXIRQ_HANDLER(_devcb) \ + devcb = &gf1_device::set_txirq_handler(*device, DEVCB2_##_devcb); + +#define MCFG_GF1_RXIRQ_HANDLER(_devcb) \ + devcb = &gf1_device::set_rxirq_handler(*device, DEVCB2_##_devcb); + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -79,6 +85,7 @@ struct gus_voice bool rollover; INT16 sample; // current sample data }; + struct gf1_interface { devcb_write_line wave_irq_cb; @@ -93,185 +100,198 @@ struct gf1_interface }; class gf1_device : - public device_t, - public device_sound_interface, - public gf1_interface + public acia6850_device, + public device_sound_interface, + public gf1_interface { public: - // construction/destruction - gf1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // current IRQ/DMA channel getters - UINT8 gf1_irq() { if(m_gf1_irq != 0) return m_gf1_irq; else return m_midi_irq; } // workaround for win95 loading dumb values - UINT8 midi_irq() { if(m_irq_combine == 0) return m_midi_irq; else return m_gf1_irq; } - UINT8 dma_channel1() { return m_dma_channel1; } - UINT8 dma_channel2() { if(m_dma_combine == 0) return m_dma_channel2; else return m_dma_channel1; } - - DECLARE_READ8_MEMBER(global_reg_select_r); - DECLARE_WRITE8_MEMBER(global_reg_select_w); - DECLARE_READ8_MEMBER(global_reg_data_r); - DECLARE_WRITE8_MEMBER(global_reg_data_w); - DECLARE_READ8_MEMBER(dram_r); - DECLARE_WRITE8_MEMBER(dram_w); - DECLARE_READ8_MEMBER(adlib_r); - DECLARE_WRITE8_MEMBER(adlib_w); - DECLARE_READ8_MEMBER(adlib_cmd_r); - DECLARE_WRITE8_MEMBER(adlib_cmd_w); - DECLARE_READ8_MEMBER(mix_ctrl_r); - DECLARE_WRITE8_MEMBER(mix_ctrl_w); - DECLARE_READ8_MEMBER(stat_r); - DECLARE_WRITE8_MEMBER(stat_w); - DECLARE_READ8_MEMBER(sb_r); - DECLARE_WRITE8_MEMBER(sb_w); - DECLARE_WRITE8_MEMBER(sb2x6_w); - - // DMA signals - UINT8 dack_r(int line); - void dack_w(int line,UINT8 data); - void eop_w(int state); - - // optional information overrides - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); - virtual void device_config_complete(); - - // voice-specific registers - gus_voice m_voice[32]; - - // global registers (not voice-specific) - UINT8 m_dma_dram_ctrl; - UINT16 m_dma_start_addr; - UINT32 m_dram_addr; - UINT8 m_timer_ctrl; - UINT8 m_timer1_count; - UINT8 m_timer2_count; - UINT8 m_timer1_value; - UINT8 m_timer2_value; - UINT16 m_sampling_freq; - UINT8 m_sampling_ctrl; - UINT8 m_joy_trim_dac; - UINT8 m_reset; - UINT8 m_active_voices; - UINT8 m_irq_source; - - void set_irq(UINT8 source, UINT8 voice); - void reset_irq(UINT8 source); - void update_volume_ramps(); - - UINT8* m_wave_ram; + // construction/destruction + gf1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template<class _Object> static devcb2_base &set_txirq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_txirq_handler.set_callback(object); } + template<class _Object> static devcb2_base &set_rxirq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_rxirq_handler.set_callback(object); } + + // current IRQ/DMA channel getters + UINT8 gf1_irq() { if(m_gf1_irq != 0) return m_gf1_irq; else return m_midi_irq; } // workaround for win95 loading dumb values + UINT8 midi_irq() { if(m_irq_combine == 0) return m_midi_irq; else return m_gf1_irq; } + UINT8 dma_channel1() { return m_dma_channel1; } + UINT8 dma_channel2() { if(m_dma_combine == 0) return m_dma_channel2; else return m_dma_channel1; } + + DECLARE_READ8_MEMBER(global_reg_select_r); + DECLARE_WRITE8_MEMBER(global_reg_select_w); + DECLARE_READ8_MEMBER(global_reg_data_r); + DECLARE_WRITE8_MEMBER(global_reg_data_w); + DECLARE_READ8_MEMBER(dram_r); + DECLARE_WRITE8_MEMBER(dram_w); + DECLARE_READ8_MEMBER(adlib_r); + DECLARE_WRITE8_MEMBER(adlib_w); + DECLARE_READ8_MEMBER(adlib_cmd_r); + DECLARE_WRITE8_MEMBER(adlib_cmd_w); + DECLARE_READ8_MEMBER(mix_ctrl_r); + DECLARE_WRITE8_MEMBER(mix_ctrl_w); + DECLARE_READ8_MEMBER(stat_r); + DECLARE_WRITE8_MEMBER(stat_w); + DECLARE_READ8_MEMBER(sb_r); + DECLARE_WRITE8_MEMBER(sb_w); + DECLARE_WRITE8_MEMBER(sb2x6_w); + + // DMA signals + UINT8 dack_r(int line); + void dack_w(int line,UINT8 data); + void eop_w(int state); + + // optional information overrides + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); + virtual void device_config_complete(); + + // voice-specific registers + gus_voice m_voice[32]; + + // global registers (not voice-specific) + UINT8 m_dma_dram_ctrl; + UINT16 m_dma_start_addr; + UINT32 m_dram_addr; + UINT8 m_timer_ctrl; + UINT8 m_timer1_count; + UINT8 m_timer2_count; + UINT8 m_timer1_value; + UINT8 m_timer2_value; + UINT16 m_sampling_freq; + UINT8 m_sampling_ctrl; + UINT8 m_joy_trim_dac; + UINT8 m_reset; + UINT8 m_active_voices; + UINT8 m_irq_source; + + void set_irq(UINT8 source, UINT8 voice); + void reset_irq(UINT8 source); + void update_volume_ramps(); + + UINT8* m_wave_ram; protected: - // device-level overrides - virtual void device_start(); - virtual void device_reset(); - virtual void device_stop(); - - devcb_resolved_write_line m_wave_irq_func; - devcb_resolved_write_line m_ramp_irq_func; - devcb_resolved_write_line m_timer1_irq_func; - devcb_resolved_write_line m_timer2_irq_func; - devcb_resolved_write_line m_sb_irq_func; - devcb_resolved_write_line m_dma_irq_func; - devcb_resolved_write_line m_drq1; - devcb_resolved_write_line m_drq2; - devcb_resolved_write_line m_nmi_func; + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_stop(); + + virtual void update_irq(); + + devcb_resolved_write_line m_wave_irq_func; + devcb_resolved_write_line m_ramp_irq_func; + devcb_resolved_write_line m_timer1_irq_func; + devcb_resolved_write_line m_timer2_irq_func; + devcb_resolved_write_line m_sb_irq_func; + devcb_resolved_write_line m_dma_irq_func; + devcb_resolved_write_line m_drq1; + devcb_resolved_write_line m_drq2; + devcb_resolved_write_line m_nmi_func; private: - // internal state - sound_stream* m_stream; - - emu_timer* m_timer1; - emu_timer* m_timer2; - emu_timer* m_dmatimer; - emu_timer* m_voltimer; - - UINT8 m_current_voice; - UINT8 m_current_reg; - //UINT8 m_port; - //UINT8 m_irq; - //UINT8 m_dma; - - UINT8 m_adlib_cmd; - UINT8 m_mix_ctrl; - UINT8 m_gf1_irq; - UINT8 m_midi_irq; - UINT8 m_dma_channel1; - UINT8 m_dma_channel2; - UINT8 m_irq_combine; - UINT8 m_dma_combine; - UINT8 m_adlib_timer_cmd; - UINT8 m_adlib_timer1_enable; - UINT8 m_adlib_timer2_enable; - UINT8 m_adlib_status; - UINT8 m_adlib_data; - UINT8 m_voice_irq_fifo[32]; - UINT8 m_voice_irq_ptr; - UINT8 m_voice_irq_current; - UINT8 m_dma_16bit; // set by bit 6 of the DMA DRAM control reg - UINT8 m_statread; - UINT8 m_sb_data_2xc; - UINT8 m_sb_data_2xe; - UINT8 m_reg_ctrl; - UINT8 m_fake_adlib_status; - UINT32 m_dma_current; - UINT16 m_volume_table[4096]; - - static const device_timer_id ADLIB_TIMER1 = 0; - static const device_timer_id ADLIB_TIMER2 = 1; - static const device_timer_id DMA_TIMER = 2; - static const device_timer_id VOL_RAMP_TIMER = 3; + // internal state + sound_stream* m_stream; + + emu_timer* m_timer1; + emu_timer* m_timer2; + emu_timer* m_dmatimer; + emu_timer* m_voltimer; + + UINT8 m_current_voice; + UINT8 m_current_reg; + //UINT8 m_port; + //UINT8 m_irq; + //UINT8 m_dma; + + UINT8 m_adlib_cmd; + UINT8 m_mix_ctrl; + UINT8 m_gf1_irq; + UINT8 m_midi_irq; + UINT8 m_dma_channel1; + UINT8 m_dma_channel2; + UINT8 m_irq_combine; + UINT8 m_dma_combine; + UINT8 m_adlib_timer_cmd; + UINT8 m_adlib_timer1_enable; + UINT8 m_adlib_timer2_enable; + UINT8 m_adlib_status; + UINT8 m_adlib_data; + UINT8 m_voice_irq_fifo[32]; + UINT8 m_voice_irq_ptr; + UINT8 m_voice_irq_current; + UINT8 m_dma_16bit; // set by bit 6 of the DMA DRAM control reg + UINT8 m_statread; + UINT8 m_sb_data_2xc; + UINT8 m_sb_data_2xe; + UINT8 m_reg_ctrl; + UINT8 m_fake_adlib_status; + UINT32 m_dma_current; + UINT16 m_volume_table[4096]; + + static const device_timer_id ADLIB_TIMER1 = 0; + static const device_timer_id ADLIB_TIMER2 = 1; + static const device_timer_id DMA_TIMER = 2; + static const device_timer_id VOL_RAMP_TIMER = 3; + + int m_txirq; + int m_rxirq; + + devcb2_write_line m_txirq_handler; + devcb2_write_line m_rxirq_handler; }; class isa16_gus_device : - public device_t, - public device_isa16_card_interface + public device_t, + public device_isa16_card_interface { public: - isa16_gus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void set_irq(UINT8 source); - void reset_irq(UINT8 source); - void set_midi_irq(UINT8 source); - void reset_midi_irq(UINT8 source); - - DECLARE_READ8_MEMBER(board_r); - DECLARE_READ8_MEMBER(synth_r); - DECLARE_WRITE8_MEMBER(board_w); - DECLARE_WRITE8_MEMBER(synth_w); - DECLARE_READ8_MEMBER(adlib_r); - DECLARE_WRITE8_MEMBER(adlib_w); - DECLARE_READ8_MEMBER(joy_r); - DECLARE_WRITE8_MEMBER(joy_w); - DECLARE_WRITE_LINE_MEMBER(midi_irq); - DECLARE_WRITE_LINE_MEMBER(wavetable_irq); - DECLARE_WRITE_LINE_MEMBER(volumeramp_irq); - DECLARE_WRITE_LINE_MEMBER(timer1_irq); - DECLARE_WRITE_LINE_MEMBER(timer2_irq); - DECLARE_WRITE_LINE_MEMBER(sb_irq); - DECLARE_WRITE_LINE_MEMBER(dma_irq); - DECLARE_WRITE_LINE_MEMBER(drq1_w); - DECLARE_WRITE_LINE_MEMBER(drq2_w); - DECLARE_WRITE_LINE_MEMBER(nmi_w); - DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); - - // DMA overrides - virtual UINT8 dack_r(int line); - virtual void dack_w(int line,UINT8 data); - virtual void eop_w(int state); - - // optional information overrides - virtual machine_config_constructor device_mconfig_additions() const; - virtual ioport_constructor device_input_ports() const; + isa16_gus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + void set_irq(UINT8 source); + void reset_irq(UINT8 source); + void set_midi_irq(UINT8 source); + void reset_midi_irq(UINT8 source); + + DECLARE_READ8_MEMBER(board_r); + DECLARE_READ8_MEMBER(synth_r); + DECLARE_WRITE8_MEMBER(board_w); + DECLARE_WRITE8_MEMBER(synth_w); + DECLARE_READ8_MEMBER(adlib_r); + DECLARE_WRITE8_MEMBER(adlib_w); + DECLARE_READ8_MEMBER(joy_r); + DECLARE_WRITE8_MEMBER(joy_w); + DECLARE_WRITE_LINE_MEMBER(midi_txirq); + DECLARE_WRITE_LINE_MEMBER(midi_rxirq); + DECLARE_WRITE_LINE_MEMBER(wavetable_irq); + DECLARE_WRITE_LINE_MEMBER(volumeramp_irq); + DECLARE_WRITE_LINE_MEMBER(timer1_irq); + DECLARE_WRITE_LINE_MEMBER(timer2_irq); + DECLARE_WRITE_LINE_MEMBER(sb_irq); + DECLARE_WRITE_LINE_MEMBER(dma_irq); + DECLARE_WRITE_LINE_MEMBER(drq1_w); + DECLARE_WRITE_LINE_MEMBER(drq2_w); + DECLARE_WRITE_LINE_MEMBER(nmi_w); + DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + + // DMA overrides + virtual UINT8 dack_r(int line); + virtual void dack_w(int line,UINT8 data); + virtual void eop_w(int state); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + protected: - // device-level overrides - virtual void device_start(); - virtual void device_reset(); - virtual void device_stop(); + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_stop(); + private: - gf1_device* m_gf1; - acia6850_device* m_midi; + required_device<gf1_device> m_gf1; - UINT8 m_irq_status; - attotime m_joy_time; + UINT8 m_irq_status; + attotime m_joy_time; }; // device type definition diff --git a/src/mess/machine/isa_ibm_mfc.c b/src/mess/machine/isa_ibm_mfc.c index 848b708374d..caa18538942 100644 --- a/src/mess/machine/isa_ibm_mfc.c +++ b/src/mess/machine/isa_ibm_mfc.c @@ -17,8 +17,8 @@ #include "emu.h" #include "isa_ibm_mfc.h" #include "cpu/z80/z80.h" +#include "machine/clock.h" #include "machine/pit8253.h" -#include "sound/speaker.h" //------------------------------------------------- @@ -295,14 +295,10 @@ static const struct pit8253_interface d8253_intf = // uPD71051 USART //------------------------------------------------- -void isa8_ibm_mfc_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +WRITE_LINE_MEMBER( isa8_ibm_mfc_device::write_usart_clock ) { - /// TODO: double timer frequency to get correct duty cycle - m_d71051->write_txc(1); - m_d71051->write_rxc(1); - - m_d71051->write_txc(0); - m_d71051->write_rxc(0); + m_d71051->write_txc(state); + m_d71051->write_rxc(state); } //------------------------------------------------- @@ -330,6 +326,9 @@ static MACHINE_CONFIG_FRAGMENT( ibm_mfc ) MCFG_DEVICE_ADD("d71051", I8251, 0) + MCFG_DEVICE_ADD("usart_clock", CLOCK, XTAL_4MHz / 8) // 500KHz + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(isa8_ibm_mfc_device, write_usart_clock)) + MCFG_PIT8253_ADD("d8253", d8253_intf) MCFG_SPEAKER_STANDARD_STEREO("ymleft", "ymright") @@ -501,10 +500,6 @@ void isa8_ibm_mfc_device::device_start() { set_isa_device(); m_isa->install_device(0x2a20, 0x2a20 + 15, 0, 0, read8_delegate(FUNC(isa8_ibm_mfc_device::ibm_mfc_r), this), write8_delegate(FUNC(isa8_ibm_mfc_device::ibm_mfc_w), this)); - - // Create a 500KHz timer for the USART - m_serial_timer = timer_alloc(); - m_serial_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_4MHz / 8)); } diff --git a/src/mess/machine/isa_ibm_mfc.h b/src/mess/machine/isa_ibm_mfc.h index 8fa3cce5857..774746c3146 100644 --- a/src/mess/machine/isa_ibm_mfc.h +++ b/src/mess/machine/isa_ibm_mfc.h @@ -23,69 +23,63 @@ // ======================> isa8_ibm_mfc_device -class isa8_ibm_mfc_device : - public device_t, - public device_isa8_card_interface +class isa8_ibm_mfc_device : public device_t, + public device_isa8_card_interface { public: + // Construction/destruction + isa8_ibm_mfc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - // Construction/destruction - isa8_ibm_mfc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + DECLARE_READ8_MEMBER( ppi0_i_a ); + DECLARE_WRITE8_MEMBER( ppi0_o_b ); + DECLARE_READ8_MEMBER( ppi0_i_c ); + DECLARE_WRITE8_MEMBER( ppi0_o_c ); - // Optional information overrides - virtual machine_config_constructor device_mconfig_additions() const; - virtual ioport_constructor device_input_ports() const; + DECLARE_WRITE8_MEMBER( ppi1_o_a ); + DECLARE_READ8_MEMBER( ppi1_i_b ); - DECLARE_READ8_MEMBER( ppi0_i_a ); - DECLARE_WRITE8_MEMBER( ppi0_o_b ); - DECLARE_READ8_MEMBER( ppi0_i_c ); - DECLARE_WRITE8_MEMBER( ppi0_o_c ); + DECLARE_WRITE8_MEMBER( ppi1_o_c ); - DECLARE_WRITE8_MEMBER( ppi1_o_a ); - DECLARE_READ8_MEMBER( ppi1_i_b ); + DECLARE_READ8_MEMBER( ibm_mfc_r ); + DECLARE_WRITE8_MEMBER( ibm_mfc_w ); - DECLARE_WRITE8_MEMBER( ppi1_o_c ); + DECLARE_WRITE_LINE_MEMBER( d8253_clk0_out ); + DECLARE_WRITE_LINE_MEMBER( d8253_clk1_out ); + DECLARE_WRITE_LINE_MEMBER( d8253_clk2_out ); - DECLARE_READ8_MEMBER( ibm_mfc_r ); - DECLARE_WRITE8_MEMBER( ibm_mfc_w ); + DECLARE_WRITE_LINE_MEMBER( write_usart_clock ); - DECLARE_WRITE_LINE_MEMBER( d8253_clk0_out ); - DECLARE_WRITE_LINE_MEMBER( d8253_clk1_out ); - DECLARE_WRITE_LINE_MEMBER( d8253_clk2_out ); - - DECLARE_WRITE_LINE_MEMBER( ibm_mfc_ym_irq ); - - void set_z80_interrupt(int src, int state); + DECLARE_WRITE_LINE_MEMBER( ibm_mfc_ym_irq ); protected: + // Device-level overrides + virtual void device_start(); + virtual void device_reset(); - // Device-level overrides - virtual void device_start(); - virtual void device_reset(); - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; - virtual const rom_entry* device_rom_region() const; + virtual const rom_entry* device_rom_region() const; private: - void set_pc_interrupt(int src, int state); - void update_pc_interrupts(void); - void update_z80_interrupts(void); - - UINT8 m_tcr; - UINT8 m_pc_ppi_c; - UINT8 m_z80_ppi_c; - - UINT8 m_pc_irq_state; - UINT8 m_z80_irq_state; - - emu_timer *m_serial_timer; - - required_device<cpu_device> m_cpu; - required_device<ym2151_device> m_ym2151; - required_device<pit8253_device> m_d8253; - required_device<i8251_device> m_d71051; - required_device<i8255_device> m_d71055c_0; - required_device<i8255_device> m_d71055c_1; + void set_z80_interrupt(int src, int state); + void set_pc_interrupt(int src, int state); + void update_pc_interrupts(void); + void update_z80_interrupts(void); + + UINT8 m_tcr; + UINT8 m_pc_ppi_c; + UINT8 m_z80_ppi_c; + + UINT8 m_pc_irq_state; + UINT8 m_z80_irq_state; + + required_device<cpu_device> m_cpu; + required_device<ym2151_device> m_ym2151; + required_device<pit8253_device> m_d8253; + required_device<i8251_device> m_d71051; + required_device<i8255_device> m_d71055c_0; + required_device<i8255_device> m_d71055c_1; }; diff --git a/src/mess/machine/thomson.c b/src/mess/machine/thomson.c index 035fce49dfd..526929df3e2 100644 --- a/src/mess/machine/thomson.c +++ b/src/mess/machine/thomson.c @@ -774,21 +774,17 @@ WRITE_LINE_MEMBER( thomson_state::to7_modem_tx_w ) m_to7_modem_tx = state; } -ACIA6850_INTERFACE( to7_modem ) -{ - 1200, - 1200, /* 1200 bauds, might be divided by 16 */ - DEVCB_DRIVER_LINE_MEMBER(thomson_state, to7_modem_tx_w), /*&to7_modem_tx,*/ - DEVCB_NULL, - DEVCB_DRIVER_LINE_MEMBER(thomson_state, to7_modem_cb) -}; - +WRITE_LINE_MEMBER( thomson_state::write_acia_clock ) +{ + m_acia6850->write_txc(state); + m_acia6850->write_rxc(state); +} void thomson_state::to7_modem_reset() { LOG (( "to7_modem_reset called\n" )); - m_acia->write_rx(0); + m_acia->write_rxd(0); m_to7_modem_tx = 0; /* pia_reset() is called in machine_reset */ /* acia_6850 has no reset (?) */ @@ -813,9 +809,9 @@ const mea8000_interface to7_speech = { "speech", DEVCB_NULL }; READ8_MEMBER( thomson_state::to7_modem_mea8000_r ) { if ( space.debugger_access() ) - { + { return 0; - } + } if ( ioport("mconfig")->read() & 1 ) { @@ -823,10 +819,16 @@ READ8_MEMBER( thomson_state::to7_modem_mea8000_r ) } else { - switch (offset) { - case 0: return m_acia->status_read(space, offset ); - case 1: return m_acia->data_read(space, offset ); - default: return 0; + switch (offset) + { + case 0: + return m_acia->status_r(space, offset ); + + case 1: + return m_acia->data_r(space, offset ); + + default: + return 0; } } } @@ -841,9 +843,15 @@ WRITE8_MEMBER( thomson_state::to7_modem_mea8000_w ) } else { - switch (offset) { - case 0: m_acia->control_write( space, offset, data ); - case 1: m_acia->data_write( space, offset, data ); + switch (offset) + { + case 0: + m_acia->control_w( space, offset, data ); + break; + + case 1: + m_acia->data_w( space, offset, data ); + break; } } } |