summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess
diff options
context:
space:
mode:
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
commitab02ed5e2d53f007be1ea38095760063cb0dc7eb (patch)
treef83594a869b72a2eeed070abb72b0b8cc56677ed /src/mess
parentc386707cc7c4e08d79dd7442968c7402ce58e818 (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]
Diffstat (limited to 'src/mess')
-rw-r--r--src/mess/drivers/68ksbc.c39
-rw-r--r--src/mess/drivers/alphatro.c25
-rw-r--r--src/mess/drivers/altair.c54
-rw-r--r--src/mess/drivers/atarist.c152
-rw-r--r--src/mess/drivers/bbc.c42
-rw-r--r--src/mess/drivers/bml3.c52
-rw-r--r--src/mess/drivers/c64.c2
-rw-r--r--src/mess/drivers/cat.c30
-rw-r--r--src/mess/drivers/ec65.c16
-rw-r--r--src/mess/drivers/h8.c20
-rw-r--r--src/mess/drivers/kaypro.c5
-rw-r--r--src/mess/drivers/mekd2.c26
-rw-r--r--src/mess/drivers/mirage.c23
-rw-r--r--src/mess/drivers/mx2178.c55
-rw-r--r--src/mess/drivers/nc.c42
-rw-r--r--src/mess/drivers/newbrain.c35
-rw-r--r--src/mess/drivers/ob68k1a.c63
-rw-r--r--src/mess/drivers/osi.c81
-rw-r--r--src/mess/drivers/poly.c44
-rw-r--r--src/mess/drivers/pulsar.c27
-rw-r--r--src/mess/drivers/rainbow.c109
-rw-r--r--src/mess/drivers/sbrain.c34
-rw-r--r--src/mess/drivers/sdk86.c27
-rw-r--r--src/mess/drivers/softbox.c4
-rw-r--r--src/mess/drivers/super6.c9
-rw-r--r--src/mess/drivers/superslave.c11
-rw-r--r--src/mess/drivers/tavernie.c66
-rw-r--r--src/mess/drivers/tek405x.c32
-rw-r--r--src/mess/drivers/thomson.c8
-rw-r--r--src/mess/drivers/v1050.c80
-rw-r--r--src/mess/drivers/v6809.c45
-rw-r--r--src/mess/drivers/vk100.c8
-rw-r--r--src/mess/drivers/votrpss.c32
-rw-r--r--src/mess/drivers/votrtnt.c45
-rw-r--r--src/mess/drivers/vt100.c9
-rw-r--r--src/mess/drivers/xerox820.c21
-rw-r--r--src/mess/drivers/xor100.c5
-rw-r--r--src/mess/includes/atarist.h2
-rw-r--r--src/mess/includes/bbc.h228
-rw-r--r--src/mess/includes/nc.h89
-rw-r--r--src/mess/includes/newbrain.h133
-rw-r--r--src/mess/includes/osi.h98
-rw-r--r--src/mess/includes/tek405x.h33
-rw-r--r--src/mess/includes/thomson.h12
-rw-r--r--src/mess/includes/v1050.h96
-rw-r--r--src/mess/machine/bbc.c47
-rw-r--r--src/mess/machine/isa_gus.c108
-rw-r--r--src/mess/machine/isa_gus.h350
-rw-r--r--src/mess/machine/isa_ibm_mfc.c19
-rw-r--r--src/mess/machine/isa_ibm_mfc.h90
-rw-r--r--src/mess/machine/thomson.c46
51 files changed, 1416 insertions, 1313 deletions
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;
}
}
}