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]

This commit is contained in:
smf- 2014-02-21 09:51:59 +00:00
parent c386707cc7
commit ab02ed5e2d
82 changed files with 2400 additions and 2468 deletions

2
.gitattributes vendored
View File

@ -1867,6 +1867,8 @@ src/emu/machine/cdp1871.c svneol=native#text/plain
src/emu/machine/cdp1871.h svneol=native#text/plain
src/emu/machine/cdu76s.c svneol=native#text/plain
src/emu/machine/cdu76s.h svneol=native#text/plain
src/emu/machine/clock.c svneol=native#text/plain
src/emu/machine/clock.h svneol=native#text/plain
src/emu/machine/com8116.c svneol=native#text/plain
src/emu/machine/com8116.h svneol=native#text/plain
src/emu/machine/cr589.c svneol=native#text/plain

View File

@ -7,6 +7,7 @@
*********************************************************************/
#include "a2midi.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -33,15 +34,6 @@ static struct ptm6840_interface ptm_interface =
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_midi_device, ptm_irq_w)
};
static ACIA6850_INTERFACE( acia_interface )
{
31250*16, // tx clock
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd), // tx out
DEVCB_NULL, // rts out
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_midi_device, acia_irq_w)
};
static SLOT_INTERFACE_START(midiin_slot)
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
@ -52,12 +44,18 @@ SLOT_INTERFACE_END
MACHINE_CONFIG_FRAGMENT( midi )
MCFG_PTM6840_ADD(MIDI_PTM_TAG, ptm_interface)
MCFG_ACIA6850_ADD(MIDI_ACIA_TAG, acia_interface)
MCFG_DEVICE_ADD(MIDI_ACIA_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(a2bus_midi_device, acia_irq_w))
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, a2bus_midi_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MIDI_ACIA_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(a2bus_midi_device, write_acia_clock))
MACHINE_CONFIG_END
//-------------------------------------------------
@ -119,11 +117,11 @@ UINT8 a2bus_midi_device::read_c0nx(address_space &space, UINT8 offset)
}
else if (offset == 8)
{
return m_acia->status_read(space, 0);
return m_acia->status_r(space, 0);
}
else if (offset == 9)
{
UINT8 ret = m_acia->data_read(space, 0);
UINT8 ret = m_acia->data_r(space, 0);
return ret;
}
@ -142,18 +140,11 @@ void a2bus_midi_device::write_c0nx(address_space &space, UINT8 offset, UINT8 dat
}
else if (offset == 8)
{
// HACK: GS/OS's CARD6850.MIDI driver sets 8-N-2, which is not valid MIDI.
// This works on h/w pretty much by accident; we'll make it right here.
if ((data & 0x1c) == 0x10)
{
data |= 0x04; // change wordbits from 0x10 to 0x14
}
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
}
else if (offset == 9)
{
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
}
}
@ -185,12 +176,8 @@ WRITE_LINE_MEMBER( a2bus_midi_device::ptm_irq_w )
}
}
WRITE_LINE_MEMBER( a2bus_midi_device::midi_rx_w )
WRITE_LINE_MEMBER( a2bus_midi_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 16
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}

View File

@ -31,7 +31,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( ptm_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
virtual void device_start();

View File

@ -10,6 +10,7 @@
**********************************************************************/
#include "midi_maplin.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -31,25 +32,11 @@
const device_type C64_MIDI_MAPLIN = &device_creator<c64_maplin_midi_cartridge_device>;
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::acia_irq_w )
{
m_slot->irq_w(state);
}
static ACIA6850_INTERFACE( acia_intf )
{
500000,
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_maplin_midi_cartridge_device, acia_irq_w)
};
//-------------------------------------------------
// SLOT_INTERFACE( midiin_slot )
//-------------------------------------------------
@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot )
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::midi_rx_w )
WRITE_LINE_MEMBER( c64_maplin_midi_cartridge_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 64
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}
@ -83,12 +66,17 @@ SLOT_INTERFACE_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_maplin_midi )
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_maplin_midi_cartridge_device, acia_irq_w))
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_maplin_midi_cartridge_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_maplin_midi_cartridge_device, write_acia_clock))
MACHINE_CONFIG_END
@ -151,11 +139,11 @@ UINT8 c64_maplin_midi_cartridge_device::c64_cd_r(address_space &space, offs_t of
switch (offset & 0xff)
{
case 0:
data = m_acia->status_read(space, 0);
data = m_acia->status_r(space, 0);
break;
case 1:
data = m_acia->data_read(space, 0);
data = m_acia->data_r(space, 0);
break;
}
}
@ -175,11 +163,11 @@ void c64_maplin_midi_cartridge_device::c64_cd_w(address_space &space, offs_t off
switch (offset & 0xff)
{
case 0:
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
break;
case 1:
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
break;
}
}

View File

@ -26,7 +26,7 @@
// ======================> c64_maplin_midi_cartridge_device
class c64_maplin_midi_cartridge_device : public device_t,
public device_c64_expansion_card_interface
public device_c64_expansion_card_interface
{
public:
// construction/destruction
@ -36,7 +36,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
// device-level overrides

View File

@ -10,6 +10,7 @@
**********************************************************************/
#include "midi_namesoft.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -31,25 +32,11 @@
const device_type C64_MIDI_NAMESOFT = &device_creator<c64_namesoft_midi_cartridge_device>;
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::acia_irq_w )
{
m_slot->nmi_w(state);
}
static ACIA6850_INTERFACE( acia_intf )
{
500000,
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_namesoft_midi_cartridge_device, acia_irq_w)
};
//-------------------------------------------------
// SLOT_INTERFACE( midiin_slot )
//-------------------------------------------------
@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot )
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::midi_rx_w )
WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 16
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}
@ -83,12 +66,17 @@ SLOT_INTERFACE_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_passport_midi )
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_namesoft_midi_cartridge_device, acia_irq_w))
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_namesoft_midi_cartridge_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_namesoft_midi_cartridge_device, write_acia_clock))
MACHINE_CONFIG_END
@ -149,11 +137,11 @@ UINT8 c64_namesoft_midi_cartridge_device::c64_cd_r(address_space &space, offs_t
switch (offset & 0xff)
{
case 2:
data = m_acia->status_read(space, 0);
data = m_acia->status_r(space, 0);
break;
case 3:
data = m_acia->data_read(space, 0);
data = m_acia->data_r(space, 0);
break;
}
}
@ -173,11 +161,11 @@ void c64_namesoft_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o
switch (offset & 0xff)
{
case 0:
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
break;
case 1:
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
break;
}
}

View File

@ -26,7 +26,7 @@
// ======================> c64_namesoft_midi_cartridge_device
class c64_namesoft_midi_cartridge_device : public device_t,
public device_c64_expansion_card_interface
public device_c64_expansion_card_interface
{
public:
// construction/destruction
@ -36,7 +36,8 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
// device-level overrides
virtual void device_start();

View File

@ -10,6 +10,7 @@
**********************************************************************/
#include "midi_passport.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -52,10 +53,6 @@ static const ptm6840_interface ptm_intf =
};
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::acia_irq_w )
{
m_acia_irq = state;
@ -63,16 +60,6 @@ WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::acia_irq_w )
m_slot->irq_w(m_ptm_irq || m_acia_irq);
}
static ACIA6850_INTERFACE( acia_intf )
{
500000,
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_passport_midi_cartridge_device, acia_irq_w)
};
//-------------------------------------------------
// SLOT_INTERFACE( midiin_slot )
//-------------------------------------------------
@ -81,14 +68,10 @@ static SLOT_INTERFACE_START( midiin_slot )
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::midi_rx_w )
WRITE_LINE_MEMBER( c64_passport_midi_cartridge_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 16
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}
@ -106,13 +89,19 @@ SLOT_INTERFACE_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_passport_midi )
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_passport_midi_cartridge_device, acia_irq_w))
MCFG_PTM6840_ADD(MC6840_TAG, ptm_intf)
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_passport_midi_cartridge_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) /// TODO: work out if the clock should come from the 6840
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_passport_midi_cartridge_device, write_acia_clock))
MACHINE_CONFIG_END
@ -186,11 +175,11 @@ UINT8 c64_passport_midi_cartridge_device::c64_cd_r(address_space &space, offs_t
break;
case 8:
data = m_acia->status_read(space, 0);
data = m_acia->status_r(space, 0);
break;
case 9:
data = m_acia->data_read(space, 0);
data = m_acia->data_r(space, 0);
break;
}
}
@ -215,11 +204,11 @@ void c64_passport_midi_cartridge_device::c64_cd_w(address_space &space, offs_t o
break;
case 8:
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
break;
case 9:
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
break;
case 0x30:

View File

@ -27,7 +27,7 @@
// ======================> c64_passport_midi_cartridge_device
class c64_passport_midi_cartridge_device : public device_t,
public device_c64_expansion_card_interface
public device_c64_expansion_card_interface
{
public:
// construction/destruction
@ -38,7 +38,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( ptm_irq_w );
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
// device-level overrides

View File

@ -10,6 +10,7 @@
**********************************************************************/
#include "midi_sci.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -31,25 +32,11 @@
const device_type C64_MIDI_SCI = &device_creator<c64_sequential_midi_cartridge_device>;
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::acia_irq_w )
{
m_slot->irq_w(state);
}
static ACIA6850_INTERFACE( acia_intf )
{
500000,
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_sequential_midi_cartridge_device, acia_irq_w)
};
//-------------------------------------------------
// SLOT_INTERFACE( midiin_slot )
//-------------------------------------------------
@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot )
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::midi_rx_w )
WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 16
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}
@ -83,12 +66,17 @@ SLOT_INTERFACE_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_sequential_midi )
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_sequential_midi_cartridge_device, acia_irq_w))
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_sequential_midi_cartridge_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_sequential_midi_cartridge_device, write_acia_clock))
MACHINE_CONFIG_END
@ -150,11 +138,11 @@ UINT8 c64_sequential_midi_cartridge_device::c64_cd_r(address_space &space, offs_
switch (offset & 0xff)
{
case 2:
data = m_acia->status_read(space, 0);
data = m_acia->status_r(space, 0);
break;
case 3:
data = m_acia->data_read(space, 0);
data = m_acia->data_r(space, 0);
break;
}
}
@ -174,11 +162,11 @@ void c64_sequential_midi_cartridge_device::c64_cd_w(address_space &space, offs_t
switch (offset & 0xff)
{
case 0:
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
break;
case 1:
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
break;
}
}

View File

@ -26,7 +26,7 @@
// ======================> c64_sequential_midi_cartridge_device
class c64_sequential_midi_cartridge_device : public device_t,
public device_c64_expansion_card_interface
public device_c64_expansion_card_interface
{
public:
// construction/destruction
@ -36,7 +36,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
// device-level overrides

View File

@ -10,6 +10,7 @@
**********************************************************************/
#include "midi_siel.h"
#include "machine/clock.h"
#include "bus/midi/midi.h"
#include "bus/midi/midiinport.h"
#include "bus/midi/midioutport.h"
@ -31,25 +32,11 @@
const device_type C64_MIDI_SIEL = &device_creator<c64_siel_midi_cartridge_device>;
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::acia_irq_w )
{
m_slot->irq_w(state);
}
static ACIA6850_INTERFACE( acia_intf )
{
XTAL_2MHz,
0, // rx clock (we manually clock rx)
DEVCB_DEVICE_LINE_MEMBER("mdout", midi_port_device, write_txd),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c64_siel_midi_cartridge_device, acia_irq_w)
};
//-------------------------------------------------
// SLOT_INTERFACE( midiin_slot )
//-------------------------------------------------
@ -58,14 +45,10 @@ static SLOT_INTERFACE_START( midiin_slot )
SLOT_INTERFACE("midiin", MIDIIN_PORT)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::midi_rx_w )
WRITE_LINE_MEMBER( c64_siel_midi_cartridge_device::write_acia_clock )
{
m_acia->write_rx(state);
for (int i = 0; i < 64; i++) // divider is set to 64
{
m_acia->rx_clock_in();
}
m_acia->write_txc(state);
m_acia->write_rxc(state);
}
@ -83,12 +66,17 @@ SLOT_INTERFACE_END
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_siel_midi )
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(c64_siel_midi_cartridge_device, acia_irq_w))
MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(DEVICE_SELF, c64_siel_midi_cartridge_device, midi_rx_w))
MCFG_MIDI_RX_HANDLER(DEVWRITELINE(MC6850_TAG, acia6850_device, write_rxd))
MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(c64_siel_midi_cartridge_device, write_acia_clock))
MACHINE_CONFIG_END
@ -151,11 +139,11 @@ UINT8 c64_siel_midi_cartridge_device::c64_cd_r(address_space &space, offs_t offs
switch (offset & 0xff)
{
case 6:
data = m_acia->status_read(space, 0);
data = m_acia->status_r(space, 0);
break;
case 7:
data = m_acia->data_read(space, 0);
data = m_acia->data_r(space, 0);
break;
}
}
@ -175,11 +163,11 @@ void c64_siel_midi_cartridge_device::c64_cd_w(address_space &space, offs_t offse
switch (offset & 0xff)
{
case 4:
m_acia->control_write(space, 0, data);
m_acia->control_w(space, 0, data);
break;
case 5:
m_acia->data_write(space, 0, data);
m_acia->data_w(space, 0, data);
break;
}
}

View File

@ -26,7 +26,7 @@
// ======================> c64_siel_midi_cartridge_device
class c64_siel_midi_cartridge_device : public device_t,
public device_c64_expansion_card_interface
public device_c64_expansion_card_interface
{
public:
// construction/destruction
@ -36,7 +36,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER( acia_irq_w );
DECLARE_WRITE_LINE_MEMBER( midi_rx_w );
DECLARE_WRITE_LINE_MEMBER( write_acia_clock );
protected:
// device-level overrides

View File

@ -114,8 +114,8 @@ const rom_entry *interpod_device::device_rom_region() const
static ADDRESS_MAP_START( interpod_mem, AS_PROGRAM, 8, interpod_device )
AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x3b80) AM_RAM // 6532
AM_RANGE(0x0400, 0x041f) AM_MIRROR(0x3be0) AM_DEVREADWRITE(R6532_TAG, riot6532_device, read, write)
AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_read, control_write)
AM_RANGE(0x2001, 0x2001) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_read, data_write)
AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, status_r, control_w)
AM_RANGE(0x2001, 0x2001) AM_MIRROR(0x9ffe) AM_DEVREADWRITE(MC6850_TAG, acia6850_device, data_r, data_w)
AM_RANGE(0x4000, 0x47ff) AM_MIRROR(0xb800) AM_ROM AM_REGION(R6502_TAG, 0)
AM_RANGE(0x8000, 0x800f) AM_MIRROR(0x5ff0) AM_DEVREADWRITE(R6522_TAG, via6522_device, read, write)
ADDRESS_MAP_END
@ -135,20 +135,6 @@ static const riot6532_interface riot_intf =
};
//-------------------------------------------------
// ACIA6850_INTERFACE( acia_intf )
//-------------------------------------------------
static ACIA6850_INTERFACE( acia_intf )
{
0,
0,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
//-------------------------------------------------
// MACHINE_DRIVER( interpod )
//-------------------------------------------------
@ -159,7 +145,7 @@ static MACHINE_CONFIG_FRAGMENT( interpod )
MCFG_DEVICE_ADD(R6522_TAG, VIA6522, 1000000)
MCFG_RIOT6532_ADD(R6532_TAG, 1000000, riot_intf)
MCFG_ACIA6850_ADD(MC6850_TAG, acia_intf)
MCFG_DEVICE_ADD(MC6850_TAG, ACIA6850, 0)
MCFG_CBM_IEEE488_ADD(NULL)
MACHINE_CONFIG_END

View File

@ -277,7 +277,11 @@ static MACHINE_CONFIG_FRAGMENT( softbox )
MCFG_I8255A_ADD(I8255_0_TAG, ppi0_intf)
MCFG_I8255A_ADD(I8255_1_TAG, ppi1_intf)
MCFG_COM8116_ADD(COM8116_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE(I8251_TAG, i8251_device, write_rxc), DEVWRITELINE(I8251_TAG, i8251_device, write_txc))
MCFG_DEVICE_ADD(COM8116_TAG, COM8116, XTAL_5_0688MHz)
MCFG_COM8116_FR_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_rxc))
MCFG_COM8116_FT_HANDLER(DEVWRITELINE(I8251_TAG, i8251_device, write_txc))
MCFG_HARDDISK_ADD("harddisk1")
MCFG_HARDDISK_ADD("harddisk2")
MCFG_HARDDISK_ADD("harddisk3")

View File

@ -109,7 +109,9 @@ void s100_dj2db_device::fdc_drq_w(bool state)
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( s100_dj2db )
MCFG_COM8116_ADD(BR1941_TAG, XTAL_5_0688MHz, NULL, DEVWRITELINE(DEVICE_SELF, s100_dj2db_device, fr_w), NULL)
MCFG_DEVICE_ADD(BR1941_TAG, COM8116, XTAL_5_0688MHz)
MCFG_COM8116_FR_HANDLER(WRITELINE(s100_dj2db_device, fr_w))
MCFG_MB8866x_ADD(MB8866_TAG, XTAL_10MHz/5)
MCFG_FLOPPY_DRIVE_ADD(MB8866_TAG":0", s100_dj2db_floppies, "8dsdd", floppy_image_device::default_floppy_formats)

View File

@ -192,6 +192,7 @@ EMUDRIVEROBJS = \
EMUMACHINEOBJS = \
$(EMUMACHINE)/bcreader.o \
$(EMUMACHINE)/buffer.o \
$(EMUMACHINE)/clock.o \
$(EMUMACHINE)/generic.o \
$(EMUMACHINE)/keyboard.o \
$(EMUMACHINE)/laserdsc.o \

File diff suppressed because it is too large Load Diff

View File

@ -13,114 +13,70 @@
#include "emu.h"
#define MCFG_ACIA6850_TXD_HANDLER(_devcb) \
devcb = &acia6850_device::set_txd_handler(*device, DEVCB2_##_devcb);
#define MCFG_ACIA6850_RTS_HANDLER(_devcb) \
devcb = &acia6850_device::set_rts_handler(*device, DEVCB2_##_devcb);
/***************************************************************************
EXTERNAL MACROS
***************************************************************************/
#define MCFG_ACIA6850_IRQ_HANDLER(_devcb) \
devcb = &acia6850_device::set_irq_handler(*device, DEVCB2_##_devcb);
#define ACIA6850_STATUS_RDRF 0x01
#define ACIA6850_STATUS_TDRE 0x02
#define ACIA6850_STATUS_DCD 0x04
#define ACIA6850_STATUS_CTS 0x08
#define ACIA6850_STATUS_FE 0x10
#define ACIA6850_STATUS_OVRN 0x20
#define ACIA6850_STATUS_PE 0x40
#define ACIA6850_STATUS_IRQ 0x80
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_ACIA6850_ADD(_tag, _interface) \
MCFG_DEVICE_ADD(_tag, ACIA6850, 0) \
acia6850_device::static_set_interface(*device, _interface);
#define ACIA6850_INTERFACE(_name) \
const acia6850_interface(_name) =
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
// ======================> acia6850_interface
struct acia6850_interface
{
int m_tx_clock;
int m_rx_clock;
devcb_write_line m_out_tx_cb;
devcb_write_line m_out_rts_cb;
devcb_write_line m_out_irq_cb;
};
// ======================> acia6850_device
class acia6850_device : public device_t,
public acia6850_interface
class acia6850_device : public device_t
{
public:
// construction/destruction
acia6850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_set_interface(device_t &device, const acia6850_interface &interface);
template<class _Object> static devcb2_base &set_txd_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_txd_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_rts_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_rts_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<acia6850_device &>(device).m_irq_handler.set_callback(object); }
DECLARE_WRITE8_MEMBER( control_write );
DECLARE_READ8_MEMBER( status_read );
DECLARE_WRITE8_MEMBER( data_write );
DECLARE_READ8_MEMBER( data_read );
DECLARE_WRITE8_MEMBER( control_w );
DECLARE_READ8_MEMBER( status_r );
DECLARE_WRITE8_MEMBER( data_w );
DECLARE_READ8_MEMBER( data_r );
DECLARE_WRITE_LINE_MEMBER( write_rx );
DECLARE_WRITE_LINE_MEMBER( write_dcd );
DECLARE_WRITE_LINE_MEMBER( write_cts );
void tx_clock_in();
void rx_clock_in();
void set_rx_clock(int clock);
void set_tx_clock(int clock);
void receive_data(UINT8 data);
UINT8 get_status() { return m_status; } // returns current status without mangling it
DECLARE_WRITE_LINE_MEMBER( write_dcd );
DECLARE_WRITE_LINE_MEMBER( write_rxd );
DECLARE_WRITE_LINE_MEMBER( write_rxc );
DECLARE_WRITE_LINE_MEMBER( write_txc );
protected:
acia6850_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
virtual void update_irq();
int calculate_txirq();
int calculate_rxirq();
private:
void output_txd(int txd);
void output_rts(int txd);
void output_irq(int irq);
enum
{
TIMER_ID_TRANSMIT,
TIMER_ID_RECEIVE
ACIA6850_STATUS_RDRF = 0x01,
ACIA6850_STATUS_TDRE = 0x02,
ACIA6850_STATUS_DCD = 0x04,
ACIA6850_STATUS_CTS = 0x08,
ACIA6850_STATUS_FE = 0x10,
ACIA6850_STATUS_OVRN = 0x20,
ACIA6850_STATUS_PE = 0x40,
ACIA6850_STATUS_IRQ = 0x80
};
void check_interrupts();
void check_dcd_input();
void tx_tick();
void transmit_event();
void rx_tick();
void receive_event();
enum serial_state
{
START,
DATA,
PARITY,
STOP,
STOP2,
STOP
};
enum parity_type
@ -130,61 +86,59 @@ private:
EVEN
};
devcb_resolved_write_line m_out_tx_func;
devcb_resolved_write_line m_out_rts_func;
devcb_resolved_write_line m_out_irq_func;
enum dcd_irq_state
{
DCD_IRQ_NONE = 0,
DCD_IRQ_READ_DATA,
DCD_IRQ_READ_STATUS,
};
UINT8 m_ctrl;
UINT8 m_status;
devcb2_write_line m_txd_handler;
devcb2_write_line m_rts_handler;
devcb2_write_line m_irq_handler;
UINT8 m_tdr;
UINT8 m_rdr;
UINT8 m_rx_shift;
UINT8 m_tx_shift;
UINT8 m_status;
UINT8 m_tdr;
UINT8 m_rdr;
UINT8 m_rx_counter;
UINT8 m_tx_counter;
bool m_first_master_reset;
int m_dcd_irq_pending;
bool m_overrun_pending;
int m_divide;
int m_divide;
int m_bits;
int m_stopbits;
int m_parity;
int m_brk;
// Counters
int m_tx_bits;
int m_rx_bits;
int m_tx_parity;
int m_rx_parity;
int m_rts;
int m_dcd;
int m_irq;
// TX/RX state
int m_bits;
parity_type m_parity;
int m_stopbits;
int m_tx_int;
int m_txc;
int m_txd;
int m_tx_state;
int m_tx_bits;
int m_tx_shift;
int m_tx_parity;
int m_tx_counter;
int m_tx_irq_enable;
// Signals
int m_overrun;
int m_reset;
int m_rts;
int m_brk;
int m_first_reset;
int m_status_read;
serial_state m_rx_state;
serial_state m_tx_state;
int m_irq;
bool m_dcd_triggered;
int m_rxd;
int m_dcd;
int m_cts;
int m_rxc;
int m_rxd;
int m_rx_state;
int m_rx_bits;
int m_rx_shift;
int m_rx_parity;
int m_rx_counter;
int m_rx_irq_enable;
emu_timer *m_rx_timer;
emu_timer *m_tx_timer;
static const int ACIA6850_DIVIDE[3];
static const int ACIA6850_WORD[8][3];
static const int counter_divide_select[4];
static const int word_select[8][3];
static const int transmitter_control[4][3];
};
// device type definition
extern const device_type ACIA6850;
#endif /* __ACIA6850_H__ */

63
src/emu/machine/clock.c Normal file
View File

@ -0,0 +1,63 @@
#include "clock.h"
const device_type CLOCK = &device_creator<clock_device>;
clock_device::clock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, CLOCK, "Clock", tag, owner, clock, "clock", __FILE__),
m_signal(0),
m_timer(NULL),
m_signal_handler(*this)
{
}
void clock_device::device_start()
{
m_signal_handler.resolve();
save_item(NAME(m_signal));
}
void clock_device::device_clock_changed()
{
update_timer();
}
attotime clock_device::period()
{
return attotime::from_hz(m_clock * 2);
}
void clock_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
m_signal = !m_signal;
m_signal_handler(m_signal);
m_timer->adjust(period());
}
void clock_device::update_timer()
{
if (!m_signal_handler.isnull() && m_clock > 0)
{
if (m_timer == NULL)
{
m_timer = timer_alloc(0);
m_timer->adjust(period());
}
else
{
attotime next = period() - m_timer->elapsed();
if (next < attotime::zero)
{
next = attotime::zero;
}
m_timer->adjust(next);
}
}
else if (m_timer != NULL)
{
m_timer->adjust(attotime::never);
}
}

35
src/emu/machine/clock.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef __CLOCK_H__
#define __CLOCK_H__
#pragma once
#include "emu.h"
#define MCFG_CLOCK_SIGNAL_HANDLER(_devcb) \
devcb = &clock_device::set_signal_handler(*device, DEVCB2_##_devcb);
class clock_device : public device_t
{
public:
clock_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_signal_handler(device_t &device, _Object object) { return downcast<clock_device &>(device).m_signal_handler.set_callback(object); }
protected:
virtual void device_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
virtual void device_clock_changed();
private:
void update_timer();
attotime period();
int m_signal;
emu_timer *m_timer;
devcb2_write_line m_signal_handler;
};
extern const device_type CLOCK;
#endif

View File

@ -48,11 +48,11 @@ const int com8116_device::divisors_32X_5_0688MHz[] =
// com8116_device - constructor
//-------------------------------------------------
com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, COM8116, "COM8116", tag, owner, clock, "com8116", __FILE__),
m_write_fx4(*this),
m_write_fr(*this),
m_write_ft(*this)
com8116_device::com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, COM8116, "COM8116", tag, owner, clock, "com8116", __FILE__),
m_fx4_handler(*this),
m_fr_handler(*this),
m_ft_handler(*this)
{
}
@ -64,13 +64,13 @@ com8116_device::com8116_device(const machine_config &mconfig, const char *tag, d
void com8116_device::device_start()
{
// resolve callbacks
m_write_fx4.resolve_safe();
m_write_fr.resolve_safe();
m_write_ft.resolve_safe();
m_fx4_handler.resolve_safe();
m_fr_handler.resolve_safe();
m_ft_handler.resolve_safe();
// allocate timers
m_fx4_timer = timer_alloc(TIMER_FX4);
m_fx4_timer->adjust(attotime::from_hz(clock() / 4), 0, attotime::from_hz(clock() / 4));
m_fx4_timer->adjust(attotime::from_hz((clock() / 4) * 2), 0, attotime::from_hz((clock() / 4)) * 2);
m_fr_timer = timer_alloc(TIMER_FR);
m_ft_timer = timer_alloc(TIMER_FT);
@ -78,6 +78,7 @@ void com8116_device::device_start()
m_ft_divisors = divisors_16X_5_0688MHz;
// register for state saving
save_item(NAME(m_fx4));
save_item(NAME(m_fr));
save_item(NAME(m_ft));
}
@ -89,6 +90,7 @@ void com8116_device::device_start()
void com8116_device::device_reset()
{
m_fx4 = 0;
m_fr = 0;
m_ft = 0;
}
@ -103,15 +105,18 @@ void com8116_device::device_timer(emu_timer &timer, device_timer_id id, int para
switch (id)
{
case TIMER_FX4:
m_write_fx4(1);
m_fx4 = !m_fx4;
m_fx4_handler(m_fx4);
break;
case TIMER_FR:
m_write_fr(1);
m_fr = !m_fr;
m_fr_handler(m_fr);
break;
case TIMER_FT:
m_write_ft(1);
m_ft = !m_ft;
m_ft_handler(m_ft);
break;
}
}
@ -123,12 +128,12 @@ void com8116_device::device_timer(emu_timer &timer, device_timer_id id, int para
void com8116_device::str_w(UINT8 data)
{
m_fr = data & 0x0f;
int fr_clock = clock() / m_fr_divisors[m_fr];
int fr_divider = data & 0x0f;
int fr_clock = clock() / m_fr_divisors[fr_divider];
if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[m_fr], fr_clock);
if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[fr_divider], fr_clock);
m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock));
m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock * 2));
}
WRITE8_MEMBER( com8116_device::str_w )
@ -143,12 +148,12 @@ WRITE8_MEMBER( com8116_device::str_w )
void com8116_device::stt_w(UINT8 data)
{
m_ft = data & 0x0f;
int ft_clock = clock() / m_ft_divisors[m_ft];
int ft_divider = data & 0x0f;
int ft_clock = clock() / m_ft_divisors[ft_divider];
if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[m_ft], ft_clock);
if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[ft_divider], ft_clock);
m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock));
m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock * 2));
}
WRITE8_MEMBER( com8116_device::stt_w )

View File

@ -34,12 +34,14 @@
// INTERFACE CONFIGURATION MACROS
///*************************************************************************
#define MCFG_COM8116_ADD(_tag, _clock, _fx4, _fr, _ft) \
MCFG_DEVICE_ADD(_tag, COM8116, _clock) \
downcast<com8116_device *>(device)->set_fx4_callback(DEVCB2_##_fx4); \
downcast<com8116_device *>(device)->set_fr_callback(DEVCB2_##_fr); \
downcast<com8116_device *>(device)->set_ft_callback(DEVCB2_##_ft);
#define MCFG_COM8116_FX4_HANDLER(_devcb) \
devcb = &com8116_device::set_fx4_handler(*device, DEVCB2_##_devcb);
#define MCFG_COM8116_FR_HANDLER(_devcb) \
devcb = &com8116_device::set_ft_handler(*device, DEVCB2_##_devcb);
#define MCFG_COM8116_FT_HANDLER(_devcb) \
devcb = &com8116_device::set_ft_handler(*device, DEVCB2_##_devcb);
///*************************************************************************
@ -54,9 +56,9 @@ public:
// construction/destruction
com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _fx4> void set_fx4_callback(_fx4 fx4) { m_write_fx4.set_callback(fx4); }
template<class _fr> void set_fr_callback(_fr fr) { m_write_fr.set_callback(fr); }
template<class _ft> void set_ft_callback(_ft ft) { m_write_ft.set_callback(ft); }
template<class _Object> static devcb2_base &set_fx4_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_fx4_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_fr_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_fr_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_ft_handler(device_t &device, _Object object) { return downcast<com8116_device &>(device).m_ft_handler.set_callback(object); }
void str_w(UINT8 data);
DECLARE_WRITE8_MEMBER( str_w );
@ -81,13 +83,14 @@ private:
TIMER_FT
};
devcb2_write_line m_write_fx4;
devcb2_write_line m_write_fr;
devcb2_write_line m_write_ft;
int m_fr; // receiver frequency
int m_ft; // transmitter frequency
devcb2_write_line m_fx4_handler;
devcb2_write_line m_fr_handler;
devcb2_write_line m_ft_handler;
int m_fx4;
int m_fr;
int m_ft;
const int *m_fr_divisors;
const int *m_ft_divisors;
@ -101,6 +104,4 @@ private:
// device type definition
extern const device_type COM8116;
#endif

View File

@ -338,6 +338,8 @@ void mc68901_device::gpio_output()
mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MC68901, "Motorola MC68901", tag, owner, clock, "mc68901", __FILE__),
device_serial_interface(mconfig, *this),
m_aer(0),
m_ier(0),
m_gpio_input(0),
m_gpio_output(0xff)
{

View File

@ -73,6 +73,7 @@
******************************************************************************/
#include "emu.h"
#include "machine/clock.h"
#include "machine/6850acia.h"
#include "machine/meters.h"
#include "cpu/z80/z80.h"
@ -234,12 +235,16 @@ struct fdc_t
class bfcobra_state : public driver_device
{
public:
bfcobra_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
bfcobra_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_acia6850_0(*this, "acia6850_2"),
m_acia6850_1(*this, "acia6850_2"),
m_acia6850_2(*this, "acia6850_2"),
m_upd7759(*this, "upd") { }
m_upd7759(*this, "upd")
{
}
UINT8 m_bank_data[4];
UINT8 *m_work_ram;
@ -288,6 +293,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(z80_acia_irq);
DECLARE_WRITE_LINE_MEMBER(m6809_data_irq);
DECLARE_WRITE_LINE_MEMBER(data_acia_tx_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_DRIVER_INIT(bfcobra);
virtual void machine_reset();
virtual void video_start();
@ -306,6 +312,8 @@ public:
UINT8 results_phase(void);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<acia6850_device> m_acia6850_0;
required_device<acia6850_device> m_acia6850_1;
required_device<acia6850_device> m_acia6850_2;
required_device<upd7759_device> m_upd7759;
};
@ -1352,10 +1360,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( z80_io_map, AS_IO, 8, bfcobra_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x23) AM_READWRITE(chipset_r, chipset_w)
AM_RANGE(0x24, 0x24) AM_DEVWRITE("acia6850_0", acia6850_device, control_write)
AM_RANGE(0x25, 0x25) AM_DEVWRITE("acia6850_0", acia6850_device, data_write)
AM_RANGE(0x26, 0x26) AM_DEVREAD("acia6850_0", acia6850_device, status_read)
AM_RANGE(0x27, 0x27) AM_DEVREAD("acia6850_0", acia6850_device, data_read)
AM_RANGE(0x24, 0x24) AM_DEVWRITE("acia6850_0", acia6850_device, control_w)
AM_RANGE(0x25, 0x25) AM_DEVWRITE("acia6850_0", acia6850_device, data_w)
AM_RANGE(0x26, 0x26) AM_DEVREAD("acia6850_0", acia6850_device, status_r)
AM_RANGE(0x27, 0x27) AM_DEVREAD("acia6850_0", acia6850_device, data_r)
AM_RANGE(0x30, 0x30) AM_READ(fdctrl_r)
AM_RANGE(0x31, 0x31) AM_READWRITE(fddata_r, fdctrl_w)
AM_RANGE(0x40, 0x40) AM_WRITE(rombank_w)
@ -1482,10 +1490,10 @@ static ADDRESS_MAP_START( m6809_prog_map, AS_PROGRAM, 8, bfcobra_state )
AM_RANGE(0x2E00, 0x2E00) AM_READ(int_latch_r)
AM_RANGE(0x3001, 0x3001) AM_DEVWRITE("aysnd", ay8910_device, data_w)
AM_RANGE(0x3201, 0x3201) AM_DEVWRITE("aysnd", ay8910_device, address_w)
AM_RANGE(0x3404, 0x3404) AM_DEVREADWRITE("acia6850_1", acia6850_device, status_read, control_write)
AM_RANGE(0x3405, 0x3405) AM_DEVREADWRITE("acia6850_1", acia6850_device, data_read, data_write)
AM_RANGE(0x3406, 0x3406) AM_DEVREADWRITE("acia6850_2", acia6850_device, status_read, control_write)
AM_RANGE(0x3407, 0x3407) AM_DEVREADWRITE("acia6850_2", acia6850_device, data_read, data_write)
AM_RANGE(0x3404, 0x3404) AM_DEVREADWRITE("acia6850_1", acia6850_device, status_r, control_w)
AM_RANGE(0x3405, 0x3405) AM_DEVREADWRITE("acia6850_1", acia6850_device, data_r, data_w)
AM_RANGE(0x3406, 0x3406) AM_DEVREADWRITE("acia6850_2", acia6850_device, status_r, control_w)
AM_RANGE(0x3407, 0x3407) AM_DEVREADWRITE("acia6850_2", acia6850_device, data_r, data_w)
// AM_RANGE(0x3408, 0x3408) AM_NOP
// AM_RANGE(0x340A, 0x340A) AM_NOP
// AM_RANGE(0x3600, 0x3600) AM_NOP
@ -1609,9 +1617,6 @@ void bfcobra_state::init_ram()
m_video_ram = auto_alloc_array_clear(machine(), UINT8, 0x20000);
}
/*
What are the correct ACIA clocks ?
*/
WRITE_LINE_MEMBER(bfcobra_state::z80_acia_irq)
{
@ -1619,28 +1624,12 @@ WRITE_LINE_MEMBER(bfcobra_state::z80_acia_irq)
update_irqs();
}
static ACIA6850_INTERFACE( z80_acia_if )
{
500000,
500000,
DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_rx),
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,z80_acia_irq)
};
WRITE_LINE_MEMBER(bfcobra_state::m6809_data_irq)
{
m_audiocpu->set_input_line(M6809_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
static ACIA6850_INTERFACE( m6809_acia_if )
{
500000,
500000,
DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_rx),
DEVCB_NULL,
DEVCB_NULL
};
WRITE_LINE_MEMBER(bfcobra_state::data_acia_tx_w)
{
@ -1648,14 +1637,15 @@ WRITE_LINE_MEMBER(bfcobra_state::data_acia_tx_w)
}
static ACIA6850_INTERFACE( data_acia_if )
WRITE_LINE_MEMBER(bfcobra_state::write_acia_clock)
{
500000,
500000,
DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,data_acia_tx_w),/*data_t,*/
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bfcobra_state,m6809_data_irq)
};
m_acia6850_0->write_txc(state);
m_acia6850_0->write_rxc(state);
m_acia6850_1->write_txc(state);
m_acia6850_1->write_rxc(state);
m_acia6850_2->write_txc(state);
m_acia6850_2->write_rxc(state);
}
/* TODO: Driver vs Machine Init */
@ -1705,7 +1695,7 @@ DRIVER_INIT_MEMBER(bfcobra_state,bfcobra)
membank("bank4")->set_base(memregion("user1")->base());
/* TODO: Properly sort out the data ACIA */
m_acia6850_2->write_rx(1);
m_acia6850_2->write_rxd(1);
/* Finish this */
save_item(NAME(m_data_r));
@ -1765,11 +1755,20 @@ static MACHINE_CONFIG_START( bfcobra, bfcobra_state )
MCFG_SOUND_ADD("upd", UPD7759, UPD7759_STANDARD_CLOCK)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
/* ACIAs */
MCFG_ACIA6850_ADD("acia6850_0", z80_acia_if)
MCFG_ACIA6850_ADD("acia6850_1", m6809_acia_if)
MCFG_ACIA6850_ADD("acia6850_2", data_acia_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_rxd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bfcobra_state, z80_acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_rxd))
MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bfcobra_state, data_acia_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bfcobra_state, m6809_data_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bfcobra_state, write_acia_clock))
MACHINE_CONFIG_END
/***************************************************************************

View File

@ -58,6 +58,7 @@ ___________________________________________________________________________
#include "cpu/m6809/m6809.h"
#include "video/awpvid.h"
#include "machine/6850acia.h"
#include "machine/clock.h"
#include "machine/meters.h"
#include "machine/roc10937.h" // vfd
#include "machine/steppers.h" // stepper motor
@ -70,10 +71,12 @@ ___________________________________________________________________________
class bfmsys85_state : public driver_device
{
public:
bfmsys85_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_vfd(*this, "vfd"),
m_maincpu(*this, "maincpu") { }
bfmsys85_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag),
m_vfd(*this, "vfd"),
m_maincpu(*this, "maincpu"),
m_acia6850_0(*this, "acia6850_0")
{
}
optional_device<roc10937_t> m_vfd;
int m_mmtr_latch;
@ -107,6 +110,7 @@ public:
DECLARE_READ8_MEMBER(triac_r);
DECLARE_READ_LINE_MEMBER(sys85_data_r);
DECLARE_WRITE_LINE_MEMBER(sys85_data_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_DRIVER_INIT(decode);
DECLARE_DRIVER_INIT(nodecode);
virtual void machine_start();
@ -114,6 +118,7 @@ public:
INTERRUPT_GEN_MEMBER(timer_irq);
int b85_find_project_string( );
required_device<cpu_device> m_maincpu;
required_device<acia6850_device> m_acia6850_0;
};
#define MASTER_CLOCK (XTAL_4MHz)
@ -128,14 +133,13 @@ WRITE_LINE_MEMBER(bfmsys85_state::sys85_data_w)
m_sys85_data_line_t = state;
}
static ACIA6850_INTERFACE( m6809_acia_if )
WRITE_LINE_MEMBER(bfmsys85_state::write_acia_clock)
{
500000,
500000,
DEVCB_DRIVER_LINE_MEMBER(bfmsys85_state,sys85_data_w),
DEVCB_NULL,
DEVCB_NULL
};
m_acia6850_0->write_txc(state);
m_acia6850_0->write_rxc(state);
}
///////////////////////////////////////////////////////////////////////////
// called if board is reset ///////////////////////////////////////////////
@ -392,11 +396,11 @@ static ADDRESS_MAP_START( memmap, AS_PROGRAM, 8, bfmsys85_state )
AM_RANGE(0x3001, 0x3001) AM_READNOP //sound latch
AM_RANGE(0x3200, 0x3200) AM_DEVWRITE("aysnd", ay8910_device, address_w)
AM_RANGE(0x3402, 0x3402) AM_DEVWRITE("acia6850_0", acia6850_device, control_write)
AM_RANGE(0x3403, 0x3403) AM_DEVWRITE("acia6850_0", acia6850_device, data_write)
AM_RANGE(0x3402, 0x3402) AM_DEVWRITE("acia6850_0", acia6850_device, control_w)
AM_RANGE(0x3403, 0x3403) AM_DEVWRITE("acia6850_0", acia6850_device, data_w)
AM_RANGE(0x3406, 0x3406) AM_DEVREAD("acia6850_0", acia6850_device, status_read)
AM_RANGE(0x3407, 0x3407) AM_DEVREAD("acia6850_0", acia6850_device, data_read)
AM_RANGE(0x3406, 0x3406) AM_DEVREAD("acia6850_0", acia6850_device, status_r)
AM_RANGE(0x3407, 0x3407) AM_DEVREAD("acia6850_0", acia6850_device, data_r)
AM_RANGE(0x3600, 0x3600) AM_WRITE(mux_enable_w) // mux enable
@ -413,7 +417,11 @@ static MACHINE_CONFIG_START( bfmsys85, bfmsys85_state )
MCFG_CPU_PERIODIC_INT_DRIVER(bfmsys85_state, timer_irq, 1000) // generate 1000 IRQ's per second
MCFG_MSC1937_ADD("vfd",0,RIGHT_TO_LEFT)
MCFG_ACIA6850_ADD("acia6850_0", m6809_acia_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bfmsys85_state,sys85_data_w))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 31250*16) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bfmsys85_state, write_acia_clock))
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("aysnd",AY8912, MASTER_CLOCK/4) // add AY8912 soundchip

View File

@ -648,7 +648,6 @@
#include "cpu/m6502/m65c02.h"
#include "video/mc6845.h"
#include "machine/6821pia.h"
#include "machine/6850acia.h"
#include "machine/nvram.h"
#include "sound/ay8910.h"
#include "includes/calomega.h"
@ -658,16 +657,12 @@
* Read/Write Handlers *
**************************************************/
WRITE_LINE_MEMBER(calomega_state::tx_rx_clk)
WRITE_LINE_MEMBER(calomega_state::update_aciabaud_scale)
{
int trx_clk;
UINT8 dsw2 = ioport("SW2")->read();
trx_clk = UART_CLOCK * dsw2 / 128;
acia6850_device *acia = machine().device<acia6850_device>("acia6850_0");
acia->set_rx_clock(trx_clk);
acia->set_tx_clock(trx_clk);
}
m_aciabaud->set_clock_scale((double)dsw2 / 128);
}
READ8_MEMBER(calomega_state::s903_mux_port_r)
{
@ -840,8 +835,8 @@ static ADDRESS_MAP_START( sys903_map, AS_PROGRAM, 8, calomega_state )
AM_RANGE(0x0881, 0x0881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
AM_RANGE(0x08c4, 0x08c7) AM_DEVREADWRITE("pia0", pia6821_device, read, write)
AM_RANGE(0x08c8, 0x08cb) AM_DEVREADWRITE("pia1", pia6821_device, read, write)
AM_RANGE(0x08d0, 0x08d0) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_read, control_write)
AM_RANGE(0x08d1, 0x08d1) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_read, data_write)
AM_RANGE(0x08d0, 0x08d0) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_r, control_w)
AM_RANGE(0x08d1, 0x08d1) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_r, data_w)
AM_RANGE(0x1000, 0x13ff) AM_RAM_WRITE(calomega_videoram_w) AM_SHARE("videoram")
AM_RANGE(0x1400, 0x17ff) AM_RAM_WRITE(calomega_colorram_w) AM_SHARE("colorram")
AM_RANGE(0x1800, 0x3fff) AM_ROM
@ -2556,20 +2551,18 @@ GFXDECODE_END
* ACIA Interface *
*************************************************/
WRITE_LINE_MEMBER(calomega_state::acia_tx_w)
WRITE_LINE_MEMBER(calomega_state::write_acia_tx)
{
m_tx_line = state;
}
static ACIA6850_INTERFACE( acia6850_intf )
WRITE_LINE_MEMBER(calomega_state::write_acia_clock)
{
UART_CLOCK,
UART_CLOCK,
DEVCB_DRIVER_LINE_MEMBER(calomega_state,acia_tx_w), /*&tx_line,*/
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(calomega_state,tx_rx_clk)
};
m_acia6850_0->write_txc(state);
m_acia6850_0->write_rxc(state);
update_aciabaud_scale(0);
}
/*************************************************
* Sound Interfaces *
@ -2668,7 +2661,11 @@ static MACHINE_CONFIG_START( sys903, calomega_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
/* acia */
MCFG_ACIA6850_ADD("acia6850_0", acia6850_intf)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(calomega_state, write_acia_tx))
MCFG_DEVICE_ADD("4024", CLOCK, UART_CLOCK)
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(calomega_state, write_acia_clock))
MACHINE_CONFIG_END

View File

@ -31,6 +31,7 @@
#include "emu.h"
#include "includes/jpmsys5.h"
#include "machine/clock.h"
#include "sound/saa1099.h"
#include "jpmsys5.lh"
@ -295,14 +296,14 @@ READ16_MEMBER(jpmsys5_state::jpm_upd7759_r)
AM_RANGE(0x000000, 0x01ffff) AM_ROM \
AM_RANGE(0x040000, 0x043fff) AM_RAM AM_SHARE("nvram") \
AM_RANGE(0x046000, 0x046001) AM_WRITENOP \
AM_RANGE(0x046020, 0x046021) AM_DEVREADWRITE8("acia6850_0", acia6850_device, status_read, control_write, 0xff) \
AM_RANGE(0x046022, 0x046023) AM_DEVREADWRITE8("acia6850_0", acia6850_device, data_read, data_write, 0xff) \
AM_RANGE(0x046020, 0x046021) AM_DEVREADWRITE8("acia6850_0", acia6850_device, status_r, control_w, 0xff) \
AM_RANGE(0x046022, 0x046023) AM_DEVREADWRITE8("acia6850_0", acia6850_device, data_r, data_w, 0xff) \
AM_RANGE(0x046040, 0x04604f) AM_DEVREADWRITE8("6840ptm", ptm6840_device, read, write, 0xff) \
AM_RANGE(0x046060, 0x046067) AM_DEVREADWRITE8("6821pia", pia6821_device, read, write,0xff) \
AM_RANGE(0x046080, 0x046081) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff) \
AM_RANGE(0x046082, 0x046083) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff) \
AM_RANGE(0x04608c, 0x04608d) AM_DEVREADWRITE8("acia6850_2", acia6850_device, status_read, control_write, 0xff) \
AM_RANGE(0x04608e, 0x04608f) AM_DEVREADWRITE8("acia6850_2", acia6850_device, data_read, data_write, 0xff) \
AM_RANGE(0x046080, 0x046081) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff) \
AM_RANGE(0x046082, 0x046083) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff) \
AM_RANGE(0x04608c, 0x04608d) AM_DEVREADWRITE8("acia6850_2", acia6850_device, status_r, control_w, 0xff) \
AM_RANGE(0x04608e, 0x04608f) AM_DEVREADWRITE8("acia6850_2", acia6850_device, data_r, data_w, 0xff) \
AM_RANGE(0x0460c0, 0x0460c1) AM_WRITENOP \
AM_RANGE(0x048000, 0x04801f) AM_READWRITE(coins_r, coins_w) \
AM_RANGE(0x04c000, 0x04c0ff) AM_READ(mux_r) AM_WRITE(mux_w)
@ -352,13 +353,13 @@ TIMER_CALLBACK_MEMBER(jpmsys5_state::touch_cb)
case START:
{
m_touch_shift_cnt = 0;
acia6850_2->write_rx(0);
m_acia6850_2->write_rxd(0);
m_touch_state = DATA;
break;
}
case DATA:
{
acia6850_2->write_rx((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1);
m_acia6850_2->write_rxd((m_touch_data[m_touch_data_count] >> (m_touch_shift_cnt)) & 1);
if (++m_touch_shift_cnt == 8)
m_touch_state = STOP1;
@ -367,13 +368,13 @@ TIMER_CALLBACK_MEMBER(jpmsys5_state::touch_cb)
}
case STOP1:
{
acia6850_2->write_rx(1);
m_acia6850_2->write_rxd(1);
m_touch_state = STOP2;
break;
}
case STOP2:
{
acia6850_2->write_rx(1);
m_acia6850_2->write_rxd(1);
if (++m_touch_data_count == 3)
{
@ -578,50 +579,30 @@ WRITE_LINE_MEMBER(jpmsys5_state::acia_irq)
m_maincpu->set_input_line(INT_6850ACIA, state ? ASSERT_LINE : CLEAR_LINE);
}
/* Clocks are incorrect */
WRITE_LINE_MEMBER(jpmsys5_state::a0_tx_w)
{
m_a0_data_out = state;
}
static ACIA6850_INTERFACE( acia0_if )
{
10000,
10000,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a0_tx_w), /*&a0_data_out,*/
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq)
};
WRITE_LINE_MEMBER(jpmsys5_state::a1_tx_w)
{
m_a1_data_out = state;
}
static ACIA6850_INTERFACE( acia1_if )
{
10000,
10000,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a1_tx_w), /*&state->m_a1_data_out,*/
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq)
};
WRITE_LINE_MEMBER(jpmsys5_state::a2_tx_w)
{
m_a2_data_out = state;
}
static ACIA6850_INTERFACE( acia2_if )
WRITE_LINE_MEMBER(jpmsys5_state::write_acia_clock)
{
10000,
10000,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,a2_tx_w), /*&state->m_a2_data_out,*/
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(jpmsys5_state,acia_irq)
};
m_acia6850_0->write_txc(state);
m_acia6850_0->write_rxc(state);
m_acia6850_1->write_txc(state);
m_acia6850_1->write_rxc(state);
m_acia6850_2->write_txc(state);
m_acia6850_2->write_rxc(state);
}
/*************************************
*
@ -639,8 +620,8 @@ MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5v)
{
m_touch_timer->reset();
m_touch_state = IDLE;
acia6850_2->write_rx(1);
acia6850_2->write_dcd(0);
m_acia6850_2->write_rxd(1);
m_acia6850_2->write_dcd(0);
m_vfd->reset();
}
@ -656,9 +637,20 @@ static MACHINE_CONFIG_START( jpmsys5v, jpmsys5_state )
MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz)
MCFG_CPU_PROGRAM_MAP(68000_map)
MCFG_ACIA6850_ADD("acia6850_0", acia0_if)
MCFG_ACIA6850_ADD("acia6850_1", acia1_if)
MCFG_ACIA6850_ADD("acia6850_2", acia2_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_NVRAM_ADD_0FILL("nvram")
@ -843,8 +835,8 @@ MACHINE_START_MEMBER(jpmsys5_state,jpmsys5)
MACHINE_RESET_MEMBER(jpmsys5_state,jpmsys5)
{
acia6850_2->write_rx(1);
acia6850_2->write_dcd(0);
m_acia6850_2->write_rxd(1);
m_acia6850_2->write_dcd(0);
m_vfd->reset();
}
@ -861,9 +853,20 @@ MACHINE_CONFIG_START( jpmsys5_ym, jpmsys5_state )
MCFG_CPU_PROGRAM_MAP(68000_awp_map)
MCFG_ACIA6850_ADD("acia6850_0", acia0_if)
MCFG_ACIA6850_ADD("acia6850_1", acia1_if)
MCFG_ACIA6850_ADD("acia6850_2", acia2_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_ROC10937_ADD("vfd",0,RIGHT_TO_LEFT)
@ -897,9 +900,20 @@ MACHINE_CONFIG_START( jpmsys5, jpmsys5_state )
MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz)
MCFG_CPU_PROGRAM_MAP(68000_awp_map_saa)
MCFG_ACIA6850_ADD("acia6850_0", acia0_if)
MCFG_ACIA6850_ADD("acia6850_1", acia1_if)
MCFG_ACIA6850_ADD("acia6850_2", acia2_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a0_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a1_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia6850_2", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(jpmsys5_state, a2_tx_w))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(jpmsys5_state, acia_irq))
MCFG_DEVICE_ADD("acia_clock", CLOCK, 10000) // What are the correct ACIA clocks ?
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(jpmsys5_state, write_acia_clock))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_ROC10937_ADD("vfd",0,RIGHT_TO_LEFT)

View File

@ -335,15 +335,6 @@ WRITE_LINE_MEMBER(mpu4vid_state::m6809_acia_irq)
m_maincpu->set_input_line(M6809_IRQ_LINE, state);
}
static ACIA6850_INTERFACE( m6809_acia_if )
{
0,
0,
DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_rx),
DEVCB_DEVICE_LINE_MEMBER("acia6850_1", acia6850_device, write_dcd),
DEVCB_DRIVER_LINE_MEMBER(mpu4vid_state, m6809_acia_irq)
};
WRITE_LINE_MEMBER(mpu4vid_state::m68k_acia_irq)
{
m_acia_0->write_cts(state);
@ -351,15 +342,6 @@ WRITE_LINE_MEMBER(mpu4vid_state::m68k_acia_irq)
update_mpu68_interrupts(1);
}
static ACIA6850_INTERFACE( m68k_acia_if )
{
0,
0,
DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_rx),
DEVCB_DEVICE_LINE_MEMBER("acia6850_0", acia6850_device, write_dcd),
DEVCB_DRIVER_LINE_MEMBER(mpu4vid_state, m68k_acia_irq)
};
WRITE_LINE_MEMBER(mpu4vid_state::cpu1_ptm_irq)
{
@ -372,13 +354,10 @@ WRITE8_MEMBER(mpu4vid_state::vid_o1_callback)
{
m_ptm->set_c2(data); /* this output is the clock for timer2 */
if (data)
{
m_acia_0->tx_clock_in();
m_acia_0->rx_clock_in();
m_acia_1->tx_clock_in();
m_acia_1->rx_clock_in();
}
m_acia_0->write_txc(data);
m_acia_0->write_rxc(data);
m_acia_1->write_txc(data);
m_acia_1->write_rxc(data);
}
@ -1330,8 +1309,8 @@ static ADDRESS_MAP_START( mpu4_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram")
AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff)
AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff)
AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff)
AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff)
AM_RANGE(0xff9000, 0xff900f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff)
AM_RANGE(0xffd000, 0xffd00f) AM_READWRITE(characteriser16_r, characteriser16_w)
ADDRESS_MAP_END
@ -1348,8 +1327,8 @@ static ADDRESS_MAP_START( mpu4oki_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram")
AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff)
AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff)
AM_RANGE(0xff8000, 0xff8001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff)
AM_RANGE(0xff8002, 0xff8003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff)
AM_RANGE(0xff9000, 0xff900f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff)
AM_RANGE(0xffa040, 0xffa04f) AM_DEVREAD8("ptm_ic3ss", ptm6840_device, read,0xff) // 6840PTM on sampled sound board
AM_RANGE(0xffa040, 0xffa04f) AM_WRITE8(ic3ss_w,0x00ff) // 6840PTM on sampled sound board
@ -1371,8 +1350,8 @@ static ADDRESS_MAP_START( bwbvid_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram")
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff)
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff)
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff)
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff)
AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0xff)
//AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(bwb_characteriser16_r, bwb_characteriser16_w)//AM_READWRITE(adpcm_r, adpcm_w) CHR ?
ADDRESS_MAP_END
@ -1389,8 +1368,8 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) AM_SHARE("vid_vidram")
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_read, control_write, 0xff)
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_read, data_write, 0xff)
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_device, status_r, control_w, 0xff)
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_device, data_r, data_w, 0xff)
AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_device, read, write, 0x00ff)
AM_RANGE(0xe02000, 0xe02007) AM_DEVREADWRITE8("pia_ic4ss", pia6821_device, read, write, 0xff00)
AM_RANGE(0xe03000, 0xe0300f) AM_DEVREAD8("ptm_ic3ss", ptm6840_device, read,0xff00) // 6840PTM on sampled sound board
@ -1403,8 +1382,8 @@ ADDRESS_MAP_END
/* TODO: Fix up MPU4 map*/
static ADDRESS_MAP_START( mpu4_6809_map, AS_PROGRAM, 8, mpu4_state )
AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x0800, 0x0800) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_read, control_write)
AM_RANGE(0x0801, 0x0801) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_read, data_write)
AM_RANGE(0x0800, 0x0800) AM_DEVREADWRITE("acia6850_0", acia6850_device, status_r, control_w)
AM_RANGE(0x0801, 0x0801) AM_DEVREADWRITE("acia6850_0", acia6850_device, data_r, data_w)
AM_RANGE(0x0880, 0x0881) AM_NOP //Read/write here
AM_RANGE(0x0900, 0x0907) AM_DEVREADWRITE("ptm_ic2", ptm6840_device, read, write)
AM_RANGE(0x0a00, 0x0a03) AM_DEVREADWRITE("pia_ic3", pia6821_device, read, write)
@ -1466,8 +1445,15 @@ static MACHINE_CONFIG_START( mpu4_vid, mpu4vid_state )
MCFG_SOUND_ROUTE(0, "lspeaker", 0.5)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.5)
MCFG_ACIA6850_ADD("acia6850_0", m6809_acia_if)
MCFG_ACIA6850_ADD("acia6850_1", m68k_acia_if)
MCFG_DEVICE_ADD("acia6850_0", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_rxd))
MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("acia6850_1", acia6850_device, write_dcd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(mpu4vid_state, m6809_acia_irq))
MCFG_DEVICE_ADD("acia6850_1", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_rxd))
MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("acia6850_0", acia6850_device, write_dcd))
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(mpu4vid_state, m68k_acia_irq))
// for the video timing
MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", mpu4vid_state, scanline_timer_callback, "screen", 0, 1)

View File

@ -1,22 +1,22 @@
#include "machine/6850acia.h"
#include "machine/clock.h"
class calomega_state : public driver_device
{
public:
calomega_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
calomega_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_acia6850_0(*this, "acia6850_0"),
m_aciabaud(*this, "aciabaud"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode") { }
m_gfxdecode(*this, "gfxdecode")
{
}
UINT8 m_tx_line;
int m_s903_mux_data;
int m_s905_mux_data;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> m_colorram;
tilemap_t *m_bg_tilemap;
DECLARE_WRITE8_MEMBER(calomega_videoram_w);
DECLARE_WRITE8_MEMBER(calomega_colorram_w);
DECLARE_WRITE_LINE_MEMBER(tx_rx_clk);
DECLARE_READ8_MEMBER(s903_mux_port_r);
DECLARE_WRITE8_MEMBER(s903_mux_w);
DECLARE_READ8_MEMBER(s905_mux_port_r);
@ -35,15 +35,30 @@ public:
DECLARE_WRITE8_MEMBER(lamps_903a_w);
DECLARE_WRITE8_MEMBER(lamps_903b_w);
DECLARE_WRITE8_MEMBER(lamps_905_w);
DECLARE_WRITE_LINE_MEMBER(acia_tx_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_tx);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_WRITE_LINE_MEMBER(update_aciabaud_scale);
DECLARE_DRIVER_INIT(elgrande);
DECLARE_DRIVER_INIT(standard);
DECLARE_DRIVER_INIT(comg080);
DECLARE_DRIVER_INIT(jjpoker);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
UINT32 screen_update_calomega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
virtual void video_start();
virtual void palette_init();
UINT32 screen_update_calomega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
private:
DECLARE_WRITE_LINE_MEMBER(update_aciabaud);
required_device<cpu_device> m_maincpu;
optional_device<acia6850_device> m_acia6850_0;
optional_device<clock_device> m_aciabaud;
required_shared_ptr<UINT8> m_videoram;
required_shared_ptr<UINT8> m_colorram;
required_device<gfxdecode_device> m_gfxdecode;
UINT8 m_tx_line;
int m_s903_mux_data;
int m_s905_mux_data;
tilemap_t *m_bg_tilemap;
};

View File

@ -15,17 +15,21 @@
class jpmsys5_state : public driver_device
{
public:
jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
jpmsys5_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
acia6850_2(*this, "acia6850_2"),
m_acia6850_0(*this, "acia6850_0"),
m_acia6850_1(*this, "acia6850_1"),
m_acia6850_2(*this, "acia6850_2"),
m_upd7759(*this, "upd7759"),
m_tms34061(*this, "tms34061"),
m_vfd(*this, "vfd"),
m_direct_port(*this, "DIRECT") { }
required_device<cpu_device> m_maincpu;
required_device<acia6850_device> acia6850_2;
required_device<acia6850_device> m_acia6850_0;
required_device<acia6850_device> m_acia6850_1;
required_device<acia6850_device> m_acia6850_2;
required_device<upd7759_device> m_upd7759;
optional_device<tms34061_device> m_tms34061;
optional_device<roc10937_t> m_vfd;
@ -70,6 +74,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(a0_tx_w);
DECLARE_WRITE_LINE_MEMBER(a1_tx_w);
DECLARE_WRITE_LINE_MEMBER(a2_tx_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_READ16_MEMBER(mux_awp_r);
DECLARE_READ16_MEMBER(coins_awp_r);
void sys5_draw_lamps();

View File

@ -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 */

View File

@ -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))

View File

@ -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")
{
}
required_device<cpu_device> m_maincpu;
required_shared_ptr<UINT8> m_ram;
virtual void machine_reset();
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;
};
@ -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

View File

@ -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")

View File

@ -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)

View File

@ -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 */

View File

@ -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;

View File

@ -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))

View File

@ -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)

View File

@ -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;
}
WRITE_LINE_MEMBER( h8_state::write_cassette_clock )
{
m_uart->write_txc(state);
m_uart->write_rxc(state);
}
TIMER_DEVICE_CALLBACK_MEMBER(h8_state::h8_c)
{
/// 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_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))

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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 */

View File

@ -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)

View File

@ -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)

View File

@ -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)
@ -165,48 +165,20 @@ 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")

View File

@ -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)

View File

@ -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")
{
}
required_device<cpu_device> m_maincpu;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_shared_ptr<UINT8> m_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;
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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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 )

View File

@ -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))

View File

@ -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")

View File

@ -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)

View File

@ -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)

View File

@ -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 )

View File

@ -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

View File

@ -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 */

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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);
};

View File

@ -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,17 +33,90 @@ 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;
DECLARE_READ8_MEMBER(nc_memory_management_r);
DECLARE_WRITE8_MEMBER(nc_memory_management_w);
DECLARE_WRITE8_MEMBER(nc_irq_mask_w);
DECLARE_WRITE8_MEMBER(nc_irq_status_w);
DECLARE_READ8_MEMBER(nc_irq_status_r);
DECLARE_READ8_MEMBER(nc_key_data_in_r);
DECLARE_WRITE8_MEMBER(nc_sound_w);
DECLARE_WRITE8_MEMBER(nc_uart_control_w);
DECLARE_WRITE8_MEMBER(nc100_display_memory_start_w);
DECLARE_WRITE8_MEMBER(nc100_uart_control_w);
DECLARE_WRITE8_MEMBER(nc100_poweroff_control_w);
DECLARE_READ8_MEMBER(nc100_card_battery_status_r);
DECLARE_WRITE8_MEMBER(nc100_memory_card_wait_state_w);
DECLARE_WRITE8_MEMBER(nc200_display_memory_start_w);
DECLARE_READ8_MEMBER(nc200_card_battery_status_r);
DECLARE_READ8_MEMBER(nc200_printer_status_r);
DECLARE_WRITE8_MEMBER(nc200_uart_control_w);
DECLARE_WRITE8_MEMBER(nc200_memory_card_wait_state_w);
DECLARE_WRITE8_MEMBER(nc200_poweroff_control_w);
DECLARE_MACHINE_START(nc200);
DECLARE_MACHINE_RESET(nc200);
UINT32 screen_update_nc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(nc_keyboard_timer_callback);
TIMER_CALLBACK_MEMBER(nc_serial_timer_callback);
TIMER_DEVICE_CALLBACK_MEMBER(dummy_timer_callback);
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);
DECLARE_WRITE_LINE_MEMBER(nc200_txrdy_callback);
DECLARE_WRITE_LINE_MEMBER(nc200_rxrdy_callback);
DECLARE_WRITE_LINE_MEMBER(nc200_fdc_interrupt);
DECLARE_DRIVER_INIT( nc );
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( nc_pcmcia_card );
DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( nc_pcmcia_card );
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);
int nc_card_load(device_image_interface &image, unsigned char **ptr);
void nc_set_card_present_state(int state);
void nc_update_interrupts();
void nc_refresh_memory_bank_config(int bank);
void nc_refresh_memory_config();
void nc_common_init_machine();
void nc_sound_update(int channel);
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;
@ -66,72 +141,6 @@ public:
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);
DECLARE_WRITE8_MEMBER(nc_irq_status_w);
DECLARE_READ8_MEMBER(nc_irq_status_r);
DECLARE_READ8_MEMBER(nc_key_data_in_r);
DECLARE_WRITE8_MEMBER(nc_sound_w);
DECLARE_WRITE8_MEMBER(nc_uart_control_w);
DECLARE_WRITE8_MEMBER(nc100_display_memory_start_w);
DECLARE_WRITE8_MEMBER(nc100_uart_control_w);
DECLARE_WRITE8_MEMBER(nc100_poweroff_control_w);
DECLARE_READ8_MEMBER(nc100_card_battery_status_r);
DECLARE_WRITE8_MEMBER(nc100_memory_card_wait_state_w);
DECLARE_WRITE8_MEMBER(nc200_display_memory_start_w);
DECLARE_READ8_MEMBER(nc200_card_battery_status_r);
DECLARE_READ8_MEMBER(nc200_printer_status_r);
DECLARE_WRITE8_MEMBER(nc200_uart_control_w);
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);
TIMER_CALLBACK_MEMBER(nc_keyboard_timer_callback);
TIMER_CALLBACK_MEMBER(nc_serial_timer_callback);
TIMER_DEVICE_CALLBACK_MEMBER(dummy_timer_callback);
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_nc100_centronics_ack);
DECLARE_WRITE_LINE_MEMBER(write_nc200_centronics_ack);
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(nc200_txrdy_callback);
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;
void nc200_video_set_backlight(int state);
void nc_card_save(device_image_interface &image);
int nc_card_calculate_mask(int size);
int nc_card_load(device_image_interface &image, unsigned char **ptr);
void nc_set_card_present_state(int state);
void nc_update_interrupts();
void nc_refresh_memory_bank_config(int bank);
void nc_refresh_memory_config();
void nc_common_init_machine();
void nc_sound_update(int channel);
void nc150_init_machine();
void nc200_refresh_uart_interrupt();
void nc200_floppy_drive_index_callback(int drive_id);
};

View File

@ -57,69 +57,35 @@
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();
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
enum
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")
{
TIMER_ID_RESET,
TIMER_ID_PWRUP
};
}
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE8_MEMBER( enrg1_w );
DECLARE_WRITE8_MEMBER( a_enrg1_w );
@ -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 );

View File

@ -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 );
DECLARE_WRITE_LINE_MEMBER( write_cassette_clock );
/* keyboard state */
UINT8 m_keylatch;
/* video state */
int m_32;
int m_coloren;
UINT8 *m_p_chargen;
/* 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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
/**************************************

View File

@ -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 == 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);
}
if (state)
set_midi_irq(IRQ_MIDI_TRANSMIT);
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::midi_rxirq )
{
m_midi->write_rx(state);
for (int i = 0; i < 16; i++) // divider is set to 16
{
m_midi->rx_clock_in();
}
if (state)
set_midi_irq(IRQ_MIDI_RECEIVE);
else
reset_midi_irq(IRQ_MIDI_TRANSMIT | IRQ_MIDI_RECEIVE);
}
WRITE_LINE_MEMBER( isa16_gus_device::write_acia_clock )
{
m_gf1->write_txc(state);
m_gf1->write_rxc(state);
}
WRITE_LINE_MEMBER( isa16_gus_device::nmi_w)

View File

@ -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);
// 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; }
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); }
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);
// 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; }
// DMA signals
UINT8 dack_r(int line);
void dack_w(int line,UINT8 data);
void eop_w(int state);
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);
// 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();
// DMA signals
UINT8 dack_r(int line);
void dack_w(int line,UINT8 data);
void eop_w(int state);
// voice-specific registers
gus_voice m_voice[32];
// 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();
// 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;
// voice-specific registers
gus_voice m_voice[32];
void set_irq(UINT8 source, UINT8 voice);
void reset_irq(UINT8 source);
void update_volume_ramps();
// 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;
UINT8* m_wave_ram;
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();
// 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;
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;
// internal state
sound_stream* m_stream;
emu_timer* m_timer1;
emu_timer* m_timer2;
emu_timer* m_dmatimer;
emu_timer* m_voltimer;
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_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];
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;
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);
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 );
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);
// 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;
// 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();
private:
gf1_device* m_gf1;
acia6850_device* m_midi;
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_stop();
UINT8 m_irq_status;
attotime m_joy_time;
private:
required_device<gf1_device> m_gf1;
UINT8 m_irq_status;
attotime m_joy_time;
};
// device type definition

View File

@ -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));
}

View File

@ -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);
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_tcr;
UINT8 m_pc_ppi_c;
UINT8 m_z80_ppi_c;
UINT8 m_pc_irq_state;
UINT8 m_z80_irq_state;
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;
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;
};

View File

@ -774,21 +774,17 @@ WRITE_LINE_MEMBER( thomson_state::to7_modem_tx_w )
m_to7_modem_tx = state;
}
ACIA6850_INTERFACE( to7_modem )
WRITE_LINE_MEMBER( thomson_state::write_acia_clock )
{
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)
};
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;
}
}
}