cms6502: Cleanups and promoted to working.

- Corrected M4 ROM ordering.
- Added IEEE controller card.
This commit is contained in:
Nigel Barnes 2020-03-03 19:27:56 +00:00
parent 89edcc3ea4
commit a1a70c4357
8 changed files with 190 additions and 43 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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