diff options
author | smf- <smf-@users.noreply.github.com> | 2014-02-21 09:51:59 +0000 |
---|---|---|
committer | smf- <smf-@users.noreply.github.com> | 2014-02-21 09:51:59 +0000 |
commit | ab02ed5e2d53f007be1ea38095760063cb0dc7eb (patch) | |
tree | f83594a869b72a2eeed070abb72b0b8cc56677ed /src/mess | |
parent | c386707cc7c4e08d79dd7442968c7402ce58e818 (diff) |
Rewritten 6850 based on datasheet using external CLOCK & removed MIDI clock hacks. Standardised COM8116 DEVCB2 callbacks. GUS gf1_device device derives from acia6850_device to gain access to the tx & rx irq state, rather than exposing it with a public method. [smf]
Diffstat (limited to 'src/mess')
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; } } } |