summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2020-12-24 18:06:40 +0000
committer Nigel Barnes <Pernod70@users.noreply.github.com>2020-12-25 00:09:53 +0000
commit840bfe4304cab8d51629cf4b6534150c87d6c784 (patch)
tree4ef749488707dda08defad4f75a0b2a27814f9e1
parent165cac428e85dba174927bfd71db449906ae1927 (diff)
accomm: Added SAA5240 teletext device, and SCN2641 for RS423 port.
-rw-r--r--src/mame/drivers/accomm.cpp94
1 files changed, 76 insertions, 18 deletions
diff --git a/src/mame/drivers/accomm.cpp b/src/mame/drivers/accomm.cpp
index 9f4c4bff070..3af3d9f714d 100644
--- a/src/mame/drivers/accomm.cpp
+++ b/src/mame/drivers/accomm.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:R. Belmont, Wilbert Pol
+// copyright-holders:R. Belmont, Wilbert Pol, Nigel Barnes
/***************************************************************************
Acorn Communicator
@@ -7,8 +7,19 @@
Driver-in-progress by R. Belmont
Electron ULA emulation by Wilbert Pol
- Main CPU: 65C816
- Other chips: 6850 UART, 6522 VIA, SAA5240(teletext), AM7910(modem), PCF0335(dialler?), PCF8573P(RTC)
+ Main CPU:
+ 65C816
+
+ Other chips:
+ 6850 UART
+ 6522 VIA
+ SAA5240 (Teletext)
+ MC68B54 (Econet)
+ AM7910 (Modem)
+ PCD3312 (Tone Generator)
+ PCF0335 (Pulse Dialler?)
+ PCF8573 (RTC)
+ SCN2641 (RS423)
****************************************************************************/
@@ -22,8 +33,11 @@
#include "machine/ram.h"
#include "machine/nvram.h"
#include "machine/pcf8573.h"
+#include "machine/scn_pci.h"
#include "machine/bankdev.h"
#include "sound/beep.h"
+#include "sound/pcd3311.h"
+#include "video/saa5240.h"
#include "bus/econet/econet.h"
#include "bus/centronics/ctronics.h"
#include "bus/rs232/rs232.h"
@@ -51,12 +65,15 @@ public:
m_maincpu_region(*this, "maincpu"),
m_irqs(*this, "irqs"),
m_screen(*this, "screen"),
+ m_cct(*this, "saa5240"),
m_beeper(*this, "beeper"),
+ m_dtmf(*this, "dtmf"),
m_ram(*this, RAM_TAG),
m_rtc(*this, "rtc"),
m_via(*this, "via6522"),
m_acia(*this, "acia"),
m_acia_clock(*this, "acia_clock"),
+ m_scn2641(*this, "aci"),
m_adlc(*this, "mc6854"),
m_vram(*this, "vram"),
m_keybd1(*this, "LINE1.%u", 0),
@@ -67,6 +84,7 @@ public:
{ }
void accomm(machine_config &config);
+ void accommi(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
@@ -92,18 +110,22 @@ private:
void accomm_palette(palette_device &palette) const;
void main_map(address_map &map);
+ void saa5240_map(address_map &map);
// devices
required_device<g65816_device> m_maincpu;
required_memory_region m_maincpu_region;
required_device<input_merger_device> m_irqs;
required_device<screen_device> m_screen;
+ required_device<saa5240_device> m_cct;
required_device<beep_device> m_beeper;
+ required_device<pcd3311_device> m_dtmf;
required_device<ram_device> m_ram;
required_device<pcf8573_device> m_rtc;
required_device<via6522_device> m_via;
required_device<acia6850_device> m_acia;
required_device<clock_device> m_acia_clock;
+ required_device<scn2641_device> m_scn2641;
required_device<mc6854_device> m_adlc;
required_shared_ptr<uint8_t> m_vram;
required_ioport_array<14> m_keybd1, m_keybd2;
@@ -670,10 +692,10 @@ void accomm_state::main_map(address_map &map)
{
map(0x000000, 0x1fffff).rw(FUNC(accomm_state::ram_r), FUNC(accomm_state::ram_w)); /* System RAM */
map(0x200000, 0x3fffff).noprw(); /* External expansion RAM */
- map(0x400000, 0x400000).noprw(); /* MODEM */
+ map(0x400000, 0x400001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* MODEM */
map(0x410000, 0x410000).ram(); /* Econet ID */
map(0x420000, 0x42000f).m(m_via, FUNC(via6522_device::map)); /* 6522 VIA (printer etc) */
- map(0x430000, 0x430001).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* 2641 ACIA (RS423) */
+ map(0x430000, 0x430003).rw(m_scn2641, FUNC(scn2641_device::read), FUNC(scn2641_device::write)); /* 2641 ACIA (RS423) */
map(0x440000, 0x44ffff).w(FUNC(accomm_state::ch00switch_w)); /* CH00SWITCH */
map(0x450000, 0x457fff).ram().share("vram"); /* Video RAM */
map(0x458000, 0x459fff).r(FUNC(accomm_state::read_keyboard1)); /* Video ULA */
@@ -692,6 +714,12 @@ void accomm_state::main_map(address_map &map)
map(0xff0000, 0xffffff).rom().region("maincpu", 0x010000); /* ROM bank 1 (ROM Slot 0) */
}
+void accomm_state::saa5240_map(address_map &map)
+{
+ map.global_mask(0x07ff);
+ map(0x0000, 0x07ff).ram();
+}
+
INPUT_CHANGED_MEMBER(accomm_state::trigger_reset)
{
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
@@ -901,32 +929,49 @@ void accomm_state::accomm(machine_config &config)
m_rtc->comp_cb().set(m_via, FUNC(via6522_device::write_cb1));
/* teletext */
- //SAA5240(config, m_cct);
+ SAA5240A(config, m_cct, 6_MHz_XTAL);
+ m_cct->set_addrmap(0, &accomm_state::saa5240_map);
/* via */
VIA6522(config, m_via, 16_MHz_XTAL / 16);
m_via->writepa_handler().set("cent_data_out", FUNC(output_latch_device::write));
m_via->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe));
m_via->readpb_handler().set(m_rtc, FUNC(pcf8573_device::sda_r)).bit(0);
+ m_via->readpb_handler().append(m_cct, FUNC(saa5240a_device::read_sda)).bit(0);
m_via->writepb_handler().set(m_rtc, FUNC(pcf8573_device::sda_w)).bit(1).invert();
m_via->writepb_handler().append(m_rtc, FUNC(pcf8573_device::scl_w)).bit(2).invert();
+ m_via->writepb_handler().append(m_cct, FUNC(saa5240a_device::write_sda)).bit(1).invert();
+ m_via->writepb_handler().append(m_cct, FUNC(saa5240a_device::write_scl)).bit(2).invert();
m_via->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
- /* acia */
+ /* rs423 */
+ SCN2641(config, m_scn2641, 3.6864_MHz_XTAL);
+ m_scn2641->txd_handler().set("rs423", FUNC(rs232_port_device::write_txd));
+ m_scn2641->rts_handler().set("rs423", FUNC(rs232_port_device::write_rts));
+ m_scn2641->intr_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
+
+ rs232_port_device &rs423(RS232_PORT(config, "rs423", default_rs232_devices, nullptr));
+ rs423.rxd_handler().set(m_scn2641, FUNC(scn2641_device::rxd_w));
+ rs423.dcd_handler().set(m_scn2641, FUNC(scn2641_device::dcd_w));
+ rs423.cts_handler().set(m_scn2641, FUNC(scn2641_device::cts_w));
+
+ /* modem */
ACIA6850(config, m_acia, 0);
- m_acia->txd_handler().set("serial", FUNC(rs232_port_device::write_txd));
- m_acia->rts_handler().set("serial", FUNC(rs232_port_device::write_rts));
- m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
+ m_acia->txd_handler().set("modem", FUNC(rs232_port_device::write_txd));
+ m_acia->rts_handler().set("modem", FUNC(rs232_port_device::write_rts));
+ m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>));
- rs232_port_device &serial(RS232_PORT(config, "serial", default_rs232_devices, nullptr));
- serial.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
- serial.dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd));
- serial.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts));
+ rs232_port_device &modem(RS232_PORT(config, "modem", default_rs232_devices, "null_modem"));
+ modem.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
+ modem.dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd));
+ modem.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts));
CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13);
m_acia_clock->signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
m_acia_clock->signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
+ PCD3311(config, m_dtmf, 3.57864_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.25); // PCD3312
+
/* econet */
MC6854(config, m_adlc);
m_adlc->out_txd_cb().set("econet", FUNC(econet_device::host_data_w));
@@ -946,6 +991,17 @@ void accomm_state::accomm(machine_config &config)
centronics.set_output_latch(cent_data_out);
}
+
+void accomm_state::accommi(machine_config &config)
+{
+ accomm(config);
+
+ /* teletext */
+ SAA5240B(config.replace(), m_cct, 6_MHz_XTAL);
+ m_cct->set_addrmap(0, &accomm_state::saa5240_map);
+}
+
+
ROM_START(accomm)
ROM_REGION(0x80000, "maincpu", 0)
ROM_DEFAULT_BIOS("100")
@@ -1031,7 +1087,9 @@ ROM_START(accommi)
ROM_REGION(0x380000, "ext", ROMREGION_ERASEFF)
ROM_END
-COMP( 1986, accomm, 0, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator", MACHINE_NOT_WORKING )
-COMP( 1985, accommp, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator (prototype)", MACHINE_NOT_WORKING )
-COMP( 1987, accommb, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Briefcase Communicator", MACHINE_NOT_WORKING )
-COMP( 1988, accommi, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator (Italian)", MACHINE_NOT_WORKING )
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1986, accomm, 0, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator", MACHINE_NOT_WORKING )
+COMP( 1985, accommp, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator (prototype)", MACHINE_NOT_WORKING )
+COMP( 1987, accommb, accomm, 0, accomm, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Briefcase Communicator", MACHINE_NOT_WORKING )
+COMP( 1988, accommi, accomm, 0, accommi, accomm, accomm_state, empty_init, "Acorn Computers", "Acorn Communicator (Italian)", MACHINE_NOT_WORKING )