summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/electron/m2105.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/electron/m2105.cpp')
-rw-r--r--src/devices/bus/electron/m2105.cpp154
1 files changed, 94 insertions, 60 deletions
diff --git a/src/devices/bus/electron/m2105.cpp b/src/devices/bus/electron/m2105.cpp
index abc652d6fdf..a5edb8e3232 100644
--- a/src/devices/bus/electron/m2105.cpp
+++ b/src/devices/bus/electron/m2105.cpp
@@ -59,27 +59,27 @@ void electron_m2105_device::device_add_mconfig(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- INPUT_MERGER_ANY_HIGH(config, m_irqs);
- m_irqs->output_handler().set(FUNC(electron_m2105_device::intrq_w));
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+
+ /* nvram */
+ RAM(config, m_ram).set_default_size("64K");
/* system via */
- VIA6522(config, m_via6522_0, 1000000);
- /*m_via6522_0->readpa_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_porta));
- m_via6522_0->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_portb));
- m_via6522_0->writepa_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_porta));
- m_via6522_0->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_portb));*/
+ VIA6522(config, m_via6522_0, DERIVED_CLOCK(1, 16));
+ //m_via6522_0->readpa_handler().set(FUNC(electron_m2105_device::m2105_via_system_read_porta));
+ m_via6522_0->readpb_handler().set(m_tms, FUNC(tms5220_device::status_r));
+ //m_via6522_0->writepa_handler().set(FUNC(electron_m2105_device::m2105_via_system_write_porta));
+ m_via6522_0->writepb_handler().set(m_tms, FUNC(tms5220_device::data_w));
m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
/* user via */
- VIA6522(config, m_via6522_1, 1000000);
- //m_via6522_1->readpb_handler().set(FUNC(electron_m2105_device::m2105_via_user_read_portb));
- m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
- //m_via6522_1->writepb_handler().set(FUNC(electron_m2105_device::m2105_via_user_write_portb));
+ VIA6522(config, m_via6522_1, DERIVED_CLOCK(1, 16));
+ m_via6522_1->writepb_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
m_via6522_1->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe));
m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
- /* duart */
- SCN2681(config, m_duart, XTAL(3'686'400));
+ /* duart */
+ SCN2681(config, m_duart, XTAL(3'686'400)); // TODO: confirm clock
m_duart->irq_cb().set(m_irqs, FUNC(input_merger_device::in_w<2>));
m_duart->a_tx_cb().set("rs232", FUNC(rs232_port_device::write_txd));
//m_duart->outport_cb().set(FUNC(electron_m2105_device::sio_out_w));
@@ -93,10 +93,14 @@ void electron_m2105_device::device_add_mconfig(machine_config &config)
output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
m_centronics->set_output_latch(latch);
+ /* AM7910 modem */
+
/* speech hardware */
SPEECHROM(config, "vsm", 0);
TMS5220(config, m_tms, 640000);
m_tms->set_speechrom_tag("vsm");
+ //m_tms->irq_handler().set(m_via6522_0, FUNC(via6522_device::write_cb1));
+ //m_tms->readyq_handler().set(m_via6522_0, FUNC(via6522_device::write_cb2));
m_tms->add_route(ALL_OUTPUTS, "mono", 1.0);
}
@@ -117,12 +121,14 @@ electron_m2105_device::electron_m2105_device(const machine_config &mconfig, cons
: device_t(mconfig, ELECTRON_M2105, tag, owner, clock)
, device_electron_expansion_interface(mconfig, *this)
, m_exp_rom(*this, "exp_rom")
+ , m_ram(*this, RAM_TAG)
, m_via6522_0(*this, "via6522_0")
, m_via6522_1(*this, "via6522_1")
, m_duart(*this, "duart")
, m_tms(*this, "tms5220")
, m_centronics(*this, "centronics")
, m_irqs(*this, "irqs")
+ , m_ram_page(0)
, m_romsel(0)
{
}
@@ -133,7 +139,7 @@ electron_m2105_device::electron_m2105_device(const machine_config &mconfig, cons
void electron_m2105_device::device_start()
{
- m_slot = dynamic_cast<electron_expansion_slot_device *>(owner());
+ save_item(NAME(m_ram_page));
}
//-------------------------------------------------
@@ -148,37 +154,57 @@ void electron_m2105_device::device_reset()
// expbus_r - expansion data read
//-------------------------------------------------
-uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uint8_t data)
+uint8_t electron_m2105_device::expbus_r(offs_t offset)
{
- if (offset >= 0x8000 && offset < 0xc000)
+ uint8_t data = 0xff;
+
+ switch (offset >> 12)
{
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ case 0xb:
switch (m_romsel)
{
case 0:
- data = m_exp_rom->base()[0x8000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x8000 | (offset & 0x3fff)];
break;
case 2:
- data = m_exp_rom->base()[0xc000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0xc000 | (offset & 0x3fff)];
break;
case 12:
- data = m_exp_rom->base()[0x0000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x0000 | (offset & 0x3fff)];
break;
case 13:
- data = m_exp_rom->base()[0x4000 + (offset & 0x3fff)];
+ data = m_exp_rom->base()[0x4000 | (offset & 0x3fff)];
+ break;
+ }
+ break;
+
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ logerror("read %04x\n", offset);
+ if (offset >= 0xfc50 && offset < 0xfc60)
+ {
+ data = m_duart->read(offset & 0x0f);
+ }
+ else if (offset >= 0xfc60 && offset < 0xfc70)
+ {
+ data = m_via6522_1->read(offset & 0x0f);
+ }
+ else if (offset >= 0xfc70 && offset < 0xfc80)
+ {
+ data = m_via6522_0->read(offset & 0x0f);
+ }
+ break;
+
+ case 0xfd:
+ //if (m_ram_page < 0x80)
+ data = m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)];
break;
}
- }
- else if (offset >= 0xfc40 && offset < 0xfc60)
- {
- data = m_via6522_1->read(offset);
- }
- else if (offset >= 0xfc60 && offset < 0xfc70)
- {
- data = m_duart->read(offset & 0x0f);
- }
- else if (offset >= 0xfc70 && offset < 0xfc90)
- {
- data = m_via6522_0->read(offset);
}
return data;
@@ -188,36 +214,44 @@ uint8_t electron_m2105_device::expbus_r(address_space &space, offs_t offset, uin
// expbus_w - expansion data write
//-------------------------------------------------
-void electron_m2105_device::expbus_w(address_space &space, offs_t offset, uint8_t data)
+void electron_m2105_device::expbus_w(offs_t offset, uint8_t data)
{
- if (offset >= 0x8000 && offset < 0xc000)
- {
- logerror("write ram bank %d\n", m_romsel);
- }
- else if (offset >= 0xfc40 && offset < 0xfc60)
+ switch (offset >> 12)
{
- m_via6522_1->write(offset, data);
- }
- else if (offset >= 0xfc60 && offset < 0xfc70)
- {
- m_duart->write(offset & 0x0f, data);
- }
- else if (offset >= 0xfc70 && offset < 0xfc90)
- {
- m_via6522_0->write(offset, data);
- }
- else if (offset == 0xfe05)
- {
- m_romsel = data & 0x0f;
- }
-}
-
+ case 0xf:
+ switch (offset >> 8)
+ {
+ case 0xfc:
+ logerror("write %04x %02x\n", offset, data);
+ if (offset >= 0xfc50 && offset < 0xfc60)
+ {
+ m_duart->write(offset & 0x0f, data);
+ }
+ else if (offset >= 0xfc60 && offset < 0xfc70)
+ {
+ m_via6522_1->write(offset & 0x0f, data);
+ }
+ else if (offset >= 0xfc70 && offset < 0xfc80)
+ {
+ m_via6522_0->write(offset & 0x0f, data);
+ }
+ else if (offset == 0xfcff)
+ {
+ m_ram_page = data;
+ }
+ break;
-//**************************************************************************
-// IMPLEMENTATION
-//**************************************************************************
+ case 0xfd:
+ //if (m_ram_page < 0x80)
+ m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)] = data;
+ break;
-WRITE_LINE_MEMBER(electron_m2105_device::intrq_w)
-{
- m_slot->irq_w(state);
+ case 0xfe:
+ if (offset == 0xfe05)
+ {
+ m_romsel = data & 0x0f;
+ }
+ break;
+ }
+ }
}