summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2021-05-08 19:29:10 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2021-05-09 17:22:11 +0100
commit79847c3ddf977f28eef95cec7c22bb2fc0fcaf10 (patch)
tree333a5fc1a0fe6a0820964710c49a531c00cf5a93
parentc20dd83d13489de37b3064251ebcda71507b55ca (diff)
bus/electron/m2105: Rewritten M2105 expansion according to schematic.
- added missing printer handler lines. - corrected ROM mapping. - added battery backed RAM.
-rw-r--r--src/devices/bus/electron/m2105.cpp200
-rw-r--r--src/devices/bus/electron/m2105.h13
2 files changed, 112 insertions, 101 deletions
diff --git a/src/devices/bus/electron/m2105.cpp b/src/devices/bus/electron/m2105.cpp
index d7058943a92..35ba1e40e13 100644
--- a/src/devices/bus/electron/m2105.cpp
+++ b/src/devices/bus/electron/m2105.cpp
@@ -4,6 +4,10 @@
BT Merlin M2105
+ TODO:
+ - speech implementation is not verified
+ - modem
+
**********************************************************************/
@@ -25,27 +29,27 @@ DEFINE_DEVICE_TYPE(ELECTRON_M2105, electron_m2105_device, "electron_m2105", "Aco
ROM_START( m2105 )
ROM_REGION(0x10000, "exp_rom", 0)
- ROM_DEFAULT_BIOS("v350")
+ ROM_DEFAULT_BIOS("350")
- ROM_SYSTEM_BIOS(0, "v350", "V3.50 16/02/87")
+ ROM_SYSTEM_BIOS(0, "350", "V3.50 16/02/87")
ROMX_LOAD("ic22-sm-35l-1.ic22", 0x0000, 0x4000, CRC(e8f8a639) SHA1(eb7fa1e884be9c072ae0c1e598507b802422127f), ROM_BIOS(0))
ROMX_LOAD("ic23-sm-35l-1.ic23", 0x4000, 0x4000, CRC(b1bb1d83) SHA1(07ca3a93744519b8d03bbf1c3c3537c0a0a3c6fe), ROM_BIOS(0))
ROMX_LOAD("sk01-pc-35l-1.ic24", 0x8000, 0x4000, CRC(54fd4c09) SHA1(9588296306581580ba223cf6bce4be61476f14c4), ROM_BIOS(0))
ROMX_LOAD("sk02-pc-35l-1.ic24", 0xc000, 0x4000, CRC(c08de988) SHA1(86f2da5f8e9a5301ad40360e286f841f42e94a99), ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "v341", "V3.41 26/11/85")
+ ROM_SYSTEM_BIOS(1, "341", "V3.41 26/11/85")
ROMX_LOAD("ic22-sm-34l-1.ic22", 0x0000, 0x4000, CRC(b514b15f) SHA1(a9c6c20b5a4f860b000511dde2f54497bcdd97b0), ROM_BIOS(1))
ROMX_LOAD("ic23-sm-34l-1.ic23", 0x4000, 0x4000, CRC(18875889) SHA1(d1a7dd87c4d99869a1961becec5e9d567d8fad53), ROM_BIOS(1))
ROMX_LOAD("sk01-pc-34l-1.ic24", 0x8000, 0x4000, CRC(a8796c9e) SHA1(29bc01b8f7617b252e4b243d13b1bbd3cd32cc3b), ROM_BIOS(1))
ROMX_LOAD("sk02-pc-34l-1.ic24", 0xc000, 0x4000, CRC(fa74063c) SHA1(cdc31c606e69e7a6d221b7340a310d475d487fc9), ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "v207", "V2.07 14/03/85")
+ ROM_SYSTEM_BIOS(2, "207", "V2.07 14/03/85")
ROMX_LOAD("ic22-sm-207l-1.ic22", 0x0000, 0x4000, CRC(0c431547) SHA1(13d2eab49b9c79f507b7dd8436d1e56cf43be412), ROM_BIOS(2))
ROMX_LOAD("ic23-sm-207l-1.ic23", 0x4000, 0x4000, CRC(15044d49) SHA1(e75fe4321579a9027527a0e256050d1444b3fe82), ROM_BIOS(2))
ROMX_LOAD("sk01-pc-207l-1.ic24", 0x8000, 0x4000, CRC(0850bcea) SHA1(270e7a31e69e1454cfb70ced23a50f5d97efe4d5), ROM_BIOS(2))
ROMX_LOAD("sk02-pc-207l-1.ic24", 0xc000, 0x4000, CRC(d8b9143f) SHA1(4e132c7a6dae4caf7203139b51882706d508c449), ROM_BIOS(2))
- ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "tms6100", 0)
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
@@ -56,52 +60,75 @@ ROM_END
void electron_m2105_device::device_add_mconfig(machine_config &config)
{
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
-
- 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 */
- MOS6522(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 */
- MOS6522(config, m_via6522_1, DERIVED_CLOCK(1, 16));
- m_via6522_1->writepb_handler().set("cent_data_out", FUNC(output_latch_device::write));
- 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)); // TODO: confirm clock
- m_duart->irq_cb().set(m_irqs, FUNC(input_merger_device::in_w<2>));
+ NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
+
+ INPUT_MERGER_ANY_HIGH(config, "irqs").output_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w));
+
+ MOS6522(config, m_via[0], DERIVED_CLOCK(1, 16));
+ m_via[0]->readpa_handler().set("tms5220", FUNC(tms5220_device::status_r));
+ m_via[0]->writepa_handler().set("tms5220", FUNC(tms5220_device::data_w));
+ m_via[0]->writepb_handler().set("tms5220", FUNC(tms5220_device::combined_rsq_wsq_w)).mask(0x03);
+ //m_via[0]->writepb_handler().set().bit(5); SPK ENABLE
+ //m_via[0]->writepb_handler().set().bit(6); SND ENABLE
+ m_via[0]->cb1_handler().set(m_via[0], FUNC(via6522_device::write_pb4));
+ m_via[0]->cb2_handler().set(m_via[1], FUNC(via6522_device::write_cb1));
+ m_via[0]->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
+
+ MOS6522(config, m_via[1], DERIVED_CLOCK(1, 16));
+ m_via[1]->writepa_handler().set("cent_data_out", FUNC(output_latch_device::write));
+ //m_via[1]->writepb_handler().set().bit(1); // DORELAY
+ m_via[1]->writepb_handler().append("modem", FUNC(rs232_port_device::write_dtr)).bit(2); // LSRELAY
+ //m_via[1]->readpb_handler().set().bit(3); // RA16
+ //m_via[1]->writepb_handler().set().bit(4); // DIALEN
+ //m_via[1]->writepb_handler().set().bit(5); // PULSE TRAIN
+ //m_via[1]->readpb_handler().set().bit(6); // RING
+ m_via[1]->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe));
+ m_via[1]->irq_handler().set("irqs", FUNC(input_merger_device::in_w<1>));
+
+ SCN2681(config, m_duart, 3.6864_MHz_XTAL);
+ m_duart->irq_cb().set("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));
+ m_duart->b_tx_cb().set("modem", FUNC(rs232_port_device::write_txd));
+ m_duart->outport_cb().set("rs232", FUNC(rs232_port_device::write_rts)).bit(0);
+ m_duart->outport_cb().append("modem", FUNC(rs232_port_device::write_rts)).bit(1);
+ m_duart->outport_cb().append("rs232", FUNC(rs232_port_device::write_dtr)).bit(2);
+ m_duart->outport_cb().append("modem", FUNC(rs232_port_device::write_rts)).bit(5);
+
+ rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, "null_modem")); // Am7910
+ modem.rxd_handler().set(m_duart, FUNC(scn2681_device::rx_b_w));
+ modem.cts_handler().set(m_duart, FUNC(scn2681_device::ip1_w));
+ modem.dcd_handler().set(m_duart, FUNC(scn2681_device::ip3_w));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
rs232.rxd_handler().set(m_duart, FUNC(scn2681_device::rx_a_w));
+ rs232.cts_handler().set(m_duart, FUNC(scn2681_device::ip0_w));
+ rs232.dsr_handler().set(m_duart, FUNC(scn2681_device::ip5_w));
+ rs232.dcd_handler().set(m_duart, FUNC(scn2681_device::ip6_w));
- /* printer */
- CENTRONICS(config, m_centronics, centronics_devices, "printer");
- m_centronics->ack_handler().set(m_via6522_1, FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted?
- output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
- m_centronics->set_output_latch(latch);
+ centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
+ centronics.ack_handler().set(m_via[1], FUNC(via6522_device::write_ca1));
+ centronics.busy_handler().set(m_via[1], FUNC(via6522_device::write_pb0));
+ centronics.select_handler().set(m_via[1], FUNC(via6522_device::write_pb7));
+ centronics.select_handler().append(m_via[1], FUNC(via6522_device::write_cb2));
- /* AM7910 modem */
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
+
+ TMS6100(config, "tms6100", 640000/4);
+
+ tms5220_device &tms(TMS5220(config, "tms5220", 640000));
+ tms.ready_cb().set(m_via[0], FUNC(via6522_device::write_ca1));
+ tms.ready_cb().append(m_via[0], FUNC(via6522_device::write_pb2));
+ tms.irq_cb().set(m_via[0], FUNC(via6522_device::write_ca2));
+ tms.irq_cb().append(m_via[0], FUNC(via6522_device::write_pb3));
+ tms.m0_cb().set("tms6100", FUNC(tms6100_device::m0_w));
+ tms.m1_cb().set("tms6100", FUNC(tms6100_device::m1_w));
+ tms.addr_cb().set("tms6100", FUNC(tms6100_device::add_w));
+ tms.data_cb().set("tms6100", FUNC(tms6100_device::data_line_r));
+ tms.romclk_cb().set("tms6100", FUNC(tms6100_device::clk_w));
+ tms.add_route(ALL_OUTPUTS, "mono", 1.0);
- /* 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);
+ SPEAKER(config, "mono").front_center();
}
const tiny_rom_entry *electron_m2105_device::device_rom_region() const
@@ -121,13 +148,9 @@ 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_nvram(*this, "nvram")
+ , m_via(*this, "via%u", 0U)
, m_duart(*this, "duart")
- , m_tms(*this, "tms5220")
- , m_centronics(*this, "centronics")
- , m_irqs(*this, "irqs")
, m_ram_page(0)
, m_romsel(0)
{
@@ -139,15 +162,11 @@ electron_m2105_device::electron_m2105_device(const machine_config &mconfig, cons
void electron_m2105_device::device_start()
{
- save_item(NAME(m_ram_page));
-}
+ m_ram = std::make_unique<uint8_t[]>(0x10000);
+ m_nvram->set_base(m_ram.get(), 0x10000);
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void electron_m2105_device::device_reset()
-{
+ save_item(NAME(m_ram_page));
+ save_pointer(NAME(m_ram), 0x10000);
}
//-------------------------------------------------
@@ -166,18 +185,18 @@ uint8_t electron_m2105_device::expbus_r(offs_t offset)
case 0xb:
switch (m_romsel)
{
- case 0:
- data = m_exp_rom->base()[0x8000 | (offset & 0x3fff)];
- break;
- case 2:
- data = m_exp_rom->base()[0xc000 | (offset & 0x3fff)];
- break;
- case 12:
+ case 0: case 12:
data = m_exp_rom->base()[0x0000 | (offset & 0x3fff)];
break;
- case 13:
+ case 1: case 13:
data = m_exp_rom->base()[0x4000 | (offset & 0x3fff)];
break;
+ case 2: case 14:
+ data = m_exp_rom->base()[0x8000 | (offset & 0x3fff)];
+ break;
+ case 3: case 15:
+ data = m_exp_rom->base()[0xc000 | (offset & 0x3fff)];
+ break;
}
break;
@@ -185,24 +204,22 @@ uint8_t electron_m2105_device::expbus_r(offs_t offset)
switch (offset >> 8)
{
case 0xfc:
- logerror("read %04x\n", offset);
- if (offset >= 0xfc50 && offset < 0xfc60)
+ switch (offset & 0xf0)
{
+ case 0x50:
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 0x60:
+ data = m_via[0]->read(offset & 0x0f);
+ break;
+ case 0x70:
+ data = m_via[1]->read(offset & 0x0f);
+ break;
}
break;
case 0xfd:
- //if (m_ram_page < 0x80)
- data = m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)];
+ data = m_ram[(m_ram_page << 8) | (offset & 0xff)];
break;
}
}
@@ -222,28 +239,25 @@ void electron_m2105_device::expbus_w(offs_t offset, uint8_t data)
switch (offset >> 8)
{
case 0xfc:
- logerror("write %04x %02x\n", offset, data);
- if (offset >= 0xfc50 && offset < 0xfc60)
+ switch (offset & 0xf0)
{
+ case 0x50:
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)
- {
+ break;
+ case 0x60:
+ m_via[0]->write(offset & 0x0f, data);
+ break;
+ case 0x70:
+ m_via[1]->write(offset & 0x0f, data);
+ break;
+ case 0xf0:
m_ram_page = data;
+ break;
}
break;
case 0xfd:
- //if (m_ram_page < 0x80)
- m_ram->pointer()[(m_ram_page << 8) | (offset & 0xff)] = data;
+ m_ram[(m_ram_page << 8) | (offset & 0xff)] = data;
break;
case 0xfe:
diff --git a/src/devices/bus/electron/m2105.h b/src/devices/bus/electron/m2105.h
index c09f4722eab..07c5ffc35c4 100644
--- a/src/devices/bus/electron/m2105.h
+++ b/src/devices/bus/electron/m2105.h
@@ -12,10 +12,11 @@
#pragma once
#include "exp.h"
-#include "machine/ram.h"
#include "machine/6522via.h"
#include "machine/mc68681.h"
+#include "machine/nvram.h"
#include "machine/input_merger.h"
+#include "machine/tms6100.h"
#include "sound/tms5220.h"
#include "bus/centronics/ctronics.h"
#include "bus/rs232/rs232.h"
@@ -35,7 +36,6 @@ public:
protected:
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -46,14 +46,11 @@ protected:
private:
required_memory_region m_exp_rom;
- required_device<ram_device> m_ram;
- required_device<via6522_device> m_via6522_0;
- required_device<via6522_device> m_via6522_1;
+ required_device<nvram_device> m_nvram;
+ required_device_array<via6522_device, 2> m_via;
required_device<scn2681_device> m_duart;
- required_device<tms5220_device> m_tms;
- required_device<centronics_device> m_centronics;
- required_device<input_merger_device> m_irqs;
+ std::unique_ptr<uint8_t[]> m_ram;
uint8_t m_ram_page;
uint8_t m_romsel;
};