summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2020-03-03 19:27:56 +0000
committer Nigel Barnes <Pernod70@users.noreply.github.com>2020-03-03 19:40:23 +0000
commita1a70c4357c4ee87e7492a4cd2f62306f7965cd5 (patch)
treef545da0e0a8ba1b43e9cb00c2c22a415696969a1
parent89edcc3ea4de545fc385ab11f60d27eb450b5e98 (diff)
cms6502: Cleanups and promoted to working.
- Corrected M4 ROM ordering. - Added IEEE controller card.
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/acorn/bus.cpp2
-rw-r--r--src/devices/bus/acorn/cms/4080term.cpp2
-rw-r--r--src/devices/bus/acorn/cms/fdc.cpp27
-rw-r--r--src/devices/bus/acorn/cms/fdc.h2
-rw-r--r--src/devices/bus/acorn/cms/ieee.cpp89
-rw-r--r--src/devices/bus/acorn/cms/ieee.h48
-rw-r--r--src/mame/drivers/cms.cpp61
8 files changed, 190 insertions, 43 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 87b372b9e50..522b9a07fb1 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -125,6 +125,8 @@ if (BUSES["ACORN"]~=null) then
MAME_DIR .. "src/devices/bus/acorn/cms/fdc.h",
MAME_DIR .. "src/devices/bus/acorn/cms/hires.cpp",
MAME_DIR .. "src/devices/bus/acorn/cms/hires.h",
+ MAME_DIR .. "src/devices/bus/acorn/cms/ieee.cpp",
+ MAME_DIR .. "src/devices/bus/acorn/cms/ieee.h",
MAME_DIR .. "src/devices/bus/acorn/system/32k.cpp",
MAME_DIR .. "src/devices/bus/acorn/system/32k.h",
MAME_DIR .. "src/devices/bus/acorn/system/8k.cpp",
diff --git a/src/devices/bus/acorn/bus.cpp b/src/devices/bus/acorn/bus.cpp
index 9bbbf1e7fac..55f332e6581 100644
--- a/src/devices/bus/acorn/bus.cpp
+++ b/src/devices/bus/acorn/bus.cpp
@@ -159,6 +159,7 @@ void device_acorn_bus_interface::interface_pre_start()
#include "cms/4080term.h"
#include "cms/fdc.h"
#include "cms/hires.h"
+#include "cms/ieee.h"
void acorn_bus_devices(device_slot_interface &device)
{
@@ -187,4 +188,5 @@ void cms_bus_devices(device_slot_interface &device)
device.option_add("4080term", CMS_4080TERM); /* CMS 40/80 Video Terminal Card */
device.option_add("fdc", CMS_FDC); /* CMS Floppy Disc Controller */
device.option_add("hires", CMS_HIRES); /* CMS High Resolution Colour Graphics Card */
+ device.option_add("ieee", CMS_IEEE); /* CMS IEEE Interface */
}
diff --git a/src/devices/bus/acorn/cms/4080term.cpp b/src/devices/bus/acorn/cms/4080term.cpp
index f5ae26633e5..104f70bb60d 100644
--- a/src/devices/bus/acorn/cms/4080term.cpp
+++ b/src/devices/bus/acorn/cms/4080term.cpp
@@ -78,7 +78,7 @@ void cms_4080term_device::device_add_mconfig(machine_config &config)
m_screen->set_screen_update("ef9345", FUNC(ef9345_device::screen_update));
GFXDECODE(config, "gfxdecode", "palette", gfx_cms_4080term);
- PALETTE(config, "palette").set_entries(8);
+ PALETTE(config, "palette", palette_device::RGB_3BIT);
EF9345(config, m_ef9345, 0);
m_ef9345->set_screen("screen");
diff --git a/src/devices/bus/acorn/cms/fdc.cpp b/src/devices/bus/acorn/cms/fdc.cpp
index 1d2c81dabf5..16cabac444a 100644
--- a/src/devices/bus/acorn/cms/fdc.cpp
+++ b/src/devices/bus/acorn/cms/fdc.cpp
@@ -24,7 +24,8 @@ DEFINE_DEVICE_TYPE(CMS_FDC, cms_fdc_device, "cms_fdc", "CMS Floppy Disc Controll
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER(cms_fdc_device::floppy_formats )
- FLOPPY_ACORN_SSD_FORMAT
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT
FLOPPY_FORMATS_END
static void cms_floppies(device_slot_interface &device)
@@ -39,14 +40,9 @@ static void cms_floppies(device_slot_interface &device)
void cms_fdc_device::device_add_mconfig(machine_config &config)
{
WD1770(config, m_fdc, 8_MHz_XTAL);
- //m_fdc->intrq_wr_callback().set(FUNC(cms_fdc_device::bus_irq_w));
- //m_fdc->drq_wr_callback().set(FUNC(cms_fdc_device::bus_nmi_w));
- FLOPPY_CONNECTOR(config, m_floppy[0], cms_floppies, "35dd", floppy_formats);
- m_floppy[0]->enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy[1], cms_floppies, "35dd", floppy_formats);
- m_floppy[1]->enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy[2], cms_floppies, nullptr, floppy_formats);
- m_floppy[2]->enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[0], cms_floppies, "35dd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[1], cms_floppies, "35dd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[2], cms_floppies, nullptr, floppy_formats).enable_sound(true);
}
@@ -90,14 +86,13 @@ READ8_MEMBER(cms_fdc_device::wd1770_state_r)
data |= m_fdc->intrq_r() << 6;
data |= m_fdc->drq_r() << 7;
- logerror("floppy state %02x\n", data);
+
return data;
}
WRITE8_MEMBER(cms_fdc_device::wd1770_control_w)
{
floppy_image_device *floppy = nullptr;
- logerror("floppy control %02x\n", data);
// bit 0, 1, 2: drive select
if (BIT(data, 0)) floppy = m_floppy[0]->get_device();
@@ -112,13 +107,3 @@ WRITE8_MEMBER(cms_fdc_device::wd1770_control_w)
// bit 7: density ??
m_fdc->dden_w(BIT(data, 7));
}
-
-WRITE_LINE_MEMBER(cms_fdc_device::bus_nmi_w)
-{
- m_bus->nmi_w(state);
-}
-
-WRITE_LINE_MEMBER(cms_fdc_device::bus_irq_w)
-{
- m_bus->irq_w(state);
-}
diff --git a/src/devices/bus/acorn/cms/fdc.h b/src/devices/bus/acorn/cms/fdc.h
index 4795eaab18a..64bb921bba7 100644
--- a/src/devices/bus/acorn/cms/fdc.h
+++ b/src/devices/bus/acorn/cms/fdc.h
@@ -41,8 +41,6 @@ protected:
private:
DECLARE_READ8_MEMBER(wd1770_state_r);
DECLARE_WRITE8_MEMBER(wd1770_control_w);
- DECLARE_WRITE_LINE_MEMBER(bus_irq_w);
- DECLARE_WRITE_LINE_MEMBER(bus_nmi_w);
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 3> m_floppy;
diff --git a/src/devices/bus/acorn/cms/ieee.cpp b/src/devices/bus/acorn/cms/ieee.cpp
new file mode 100644
index 00000000000..06d9b47f0dd
--- /dev/null
+++ b/src/devices/bus/acorn/cms/ieee.cpp
@@ -0,0 +1,89 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ CMS IEEE Controller Board
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "ieee.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(CMS_IEEE, cms_ieee_device, "cms_ieee", "CMS IEEE Controller Board");
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void cms_ieee_device::device_add_mconfig(machine_config &config)
+{
+ TMS9914(config, m_tms9914, 4_MHz_XTAL); // TODO: verify clock
+ m_tms9914->int_write_cb().set(FUNC(cms_ieee_device::bus_irq_w));
+ m_tms9914->dio_read_cb().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
+ m_tms9914->dio_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_dio_w));
+ m_tms9914->eoi_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_eoi_w));
+ m_tms9914->dav_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_dav_w));
+ m_tms9914->nrfd_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_nrfd_w));
+ m_tms9914->ndac_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ndac_w));
+ m_tms9914->ifc_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ifc_w));
+ m_tms9914->srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
+ m_tms9914->atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
+ m_tms9914->ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
+
+ IEEE488(config, m_ieee);
+ m_ieee->eoi_callback().set(m_tms9914, FUNC(tms9914_device::eoi_w));
+ m_ieee->dav_callback().set(m_tms9914, FUNC(tms9914_device::dav_w));
+ m_ieee->nrfd_callback().set(m_tms9914, FUNC(tms9914_device::nrfd_w));
+ m_ieee->ndac_callback().set(m_tms9914, FUNC(tms9914_device::ndac_w));
+ m_ieee->ifc_callback().set(m_tms9914, FUNC(tms9914_device::ifc_w));
+ m_ieee->srq_callback().set(m_tms9914, FUNC(tms9914_device::srq_w));
+ m_ieee->atn_callback().set(m_tms9914, FUNC(tms9914_device::atn_w));
+ m_ieee->ren_callback().set(m_tms9914, FUNC(tms9914_device::ren_w));
+ IEEE488_SLOT(config, "ieee_dev", 0, cbm_ieee488_devices, nullptr);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// cms_ieee_device - constructor
+//-------------------------------------------------
+
+cms_ieee_device::cms_ieee_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, CMS_IEEE, tag, owner, clock)
+ , device_acorn_bus_interface(mconfig, *this)
+ , m_ieee(*this, IEEE488_TAG)
+ , m_tms9914(*this, "hpib")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void cms_ieee_device::device_start()
+{
+ address_space &space = m_bus->memspace();
+
+ space.install_readwrite_handler(0xfc60, 0xfc6f, read8sm_delegate(*m_tms9914, FUNC(tms9914_device::read)), write8sm_delegate(*m_tms9914, FUNC(tms9914_device::write)));
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+WRITE_LINE_MEMBER(cms_ieee_device::bus_irq_w)
+{
+ m_bus->irq_w(state);
+}
diff --git a/src/devices/bus/acorn/cms/ieee.h b/src/devices/bus/acorn/cms/ieee.h
new file mode 100644
index 00000000000..48352d4a100
--- /dev/null
+++ b/src/devices/bus/acorn/cms/ieee.h
@@ -0,0 +1,48 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ CMS IEEE Controller Board
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_ACORN_CMS_IEEE_H
+#define MAME_BUS_ACORN_CMS_IEEE_H
+
+#include "bus/acorn/bus.h"
+#include "bus/ieee488/ieee488.h"
+#include "machine/tms9914.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class cms_ieee_device:
+ public device_t,
+ public device_acorn_bus_interface
+{
+public:
+ // construction/destruction
+ cms_ieee_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(bus_irq_w);
+
+ required_device<ieee488_device> m_ieee;
+ required_device<tms9914_device> m_tms9914;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(CMS_IEEE, cms_ieee_device);
+
+
+#endif /* MAME_BUS_ACORN_CMS_IEEE_H */
diff --git a/src/mame/drivers/cms.cpp b/src/mame/drivers/cms.cpp
index 3f83032791c..5b081ec3554 100644
--- a/src/mame/drivers/cms.cpp
+++ b/src/mame/drivers/cms.cpp
@@ -18,6 +18,30 @@
- Analogue Digital Interface Board (CMS00092 A/D I/O)
- Floppy Disk Controller
+ System I/O Allocation
+ &FA00-&FBFF Advanced graphics card
+ &FC00-&FC0F CPU card VIA
+ &FC10-&FC1F GDP card control register
+ &FC20-&FC2F GDP card colour register
+ &FC30-&FC3F Real-Time-Clock registers
+ &FC40-&FC4F Disc controller registers
+ &FC50-&FC5F Disc controller drive select register
+ &FC60-&FC6F IEEE controller card
+ &FC70-&FC7F Memory select register (on CPU card)
+ &FC80-&FC8F VIA1 on VIB card
+ &FC90-&FC9F VIA2 on VIB card
+ &FCA0-&FCAF VIA3 on VIB card
+ &FCB0-&FCBF VIA4 on VIB card (Printer interface)
+ &FCC0-&FCCF Analogue card ADC
+ &FCD0-&FCDF Analogue card DAC
+ &FCE0-&FCEF Analogue card VIA
+ &FCF0-&FCFF Serial Interface on VIB card
+ &FD00-&FD1F Reserved
+ &FD20-&FD2F 40/80 column card video processor
+ &FD30-&FD3F 40/80 column card VIA (printer interface)
+ &FD40-&FD4F 40/80 column card serial interface
+ &FD50-&FD5F Reserved for future I/O cards
+
****************************************************************************/
#include "emu.h"
@@ -40,11 +64,8 @@ public:
, m_irqs(*this, "irqs")
, m_bus(*this, "bus")
, m_map_select(0)
- , m_page_select(0)
{ }
- //DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
-
void cms6502(machine_config &config);
protected:
@@ -67,11 +88,10 @@ private:
required_device<input_merger_device> m_irqs;
required_device<acorn_bus_device> m_bus;
- void cms_bank(address_map &map);
void cms6502_mem(address_map &map);
uint8_t m_map_select;
- uint8_t m_page_select;
+ uint8_t m_page_select[4];
uint8_t m_rtc_data[0x10];
int m_rtc_reg;
@@ -101,23 +121,18 @@ void cms_state::cms6502_mem(address_map &map)
WRITE8_MEMBER(cms_state::map_select_w)
{
- m_map_select = (data & 0x03) << 2;
- logerror("map select %02x\n", data);
- //if (m_map_select == 0x00)
- // m_bank1->set_entry(m_page_select);
- //else
- m_bank1->set_entry(m_map_select);
+ m_map_select = data & 0x03;
+ m_bank1->set_entry((m_map_select << 2) | m_page_select[m_map_select]);
}
WRITE8_MEMBER(cms_state::page_select_w)
{
- logerror("page select %02x\n", data);
- m_page_select = data & 0x03;
+ /* 27513 in socket M4 (map 0) */
if (m_map_select == 0x00)
{
- m_page_select = data & 0x03;
- m_bank1->set_entry(m_page_select);
+ m_page_select[m_map_select] = data & 0x03;
}
+ m_bank1->set_entry((m_map_select << 2) | m_page_select[m_map_select]);
}
@@ -137,11 +152,20 @@ void cms_state::machine_start()
m_rtc_timer = timer_alloc();
m_rtc_timer->adjust(attotime::zero, 0, attotime(1, 0));
+
+ /* register for save states */
+ save_item(NAME(m_map_select));
+ save_item(NAME(m_page_select));
}
void cms_state::machine_reset()
{
+ m_map_select = 0x00;
+ for (int i = 0; i < 4; i++)
+ {
+ m_page_select[i] = 0x00;
+ }
m_bank1->set_entry(0);
}
@@ -271,7 +295,6 @@ void cms_state::cms6502(machine_config &config)
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
VIA6522(config, m_via, 1_MHz_XTAL);
- //m_via->cb2_handler().set(FUNC(cms_state::cass_w));
m_via->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
/* 7 Slot Backplane */
@@ -300,8 +323,8 @@ ROM_START( cms6502 )
/* Socket M4 27513 */
ROM_LOAD("basic.m4", 0x00000, 0x4000, CRC(e27b6146) SHA1(ae89ee695bed6f49402f009ded16ad3a36f64c28))
ROM_LOAD("dfs-1.4.m4", 0x04000, 0x4000, CRC(0743ddb5) SHA1(cd61956a10510a6954cba9ba17f70c2991e81d9b))
- ROM_LOAD("simon-2.02.m4", 0x08000, 0x4000, CRC(d1f1b633) SHA1(991c3691a70f45fff3c828c8c0a0906b9f5e34fc))
- ROM_LOAD("multi-basic.m4", 0x0c000, 0x4000, CRC(fb785563) SHA1(9f97582ba0b82f314008bf95eacb00e7bced3cac))
+ ROM_LOAD("multi-basic.m4", 0x08000, 0x4000, CRC(fb785563) SHA1(9f97582ba0b82f314008bf95eacb00e7bced3cac))
+ ROM_LOAD("simon-2.02.m4", 0x0c000, 0x4000, CRC(d1f1b633) SHA1(991c3691a70f45fff3c828c8c0a0906b9f5e34fc))
/* Socket M3 empty */
/* Socket M2 27128 */
ROM_LOAD("gdp.m2", 0x20000, 0x4000, CRC(f545293b) SHA1(532c45ac4661643c6c6f633d504ef72e800cc900))
@@ -315,4 +338,4 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1986, cms6502, 0, 0, cms6502, cms, cms_state, empty_init, "Cambridge Microprocessor Systems", "CMS 6502 Development System", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 1986, cms6502, 0, 0, cms6502, cms, cms_state, empty_init, "Cambridge Microprocessor Systems", "CMS 6502 Development System", MACHINE_NO_SOUND_HW )