From e7da0b3a4b75ba3327bd690ea94c9337ee4cf43b Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Tue, 10 Jul 2018 11:07:09 +0100 Subject: New machines marked as NOT_WORKING ---------------------------------- CMS 6502 Development System --- scripts/target/mame/mess.lua | 1 + src/lib/formats/acorn_dsk.cpp | 24 ++++ src/mame/drivers/cms.cpp | 318 ++++++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 3 + src/mame/mess.flt | 1 + 5 files changed, 347 insertions(+) create mode 100644 src/mame/drivers/cms.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 17be595034d..6b4b4914534 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -1379,6 +1379,7 @@ files { MAME_DIR .. "src/mame/includes/bbc.h", MAME_DIR .. "src/mame/machine/bbc.cpp", MAME_DIR .. "src/mame/video/bbc.cpp", + MAME_DIR .. "src/mame/drivers/cms.cpp", MAME_DIR .. "src/mame/drivers/electron.cpp", MAME_DIR .. "src/mame/includes/electron.h", MAME_DIR .. "src/mame/machine/electron.cpp", diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp index 55629e2c3c8..59261f9b4d5 100644 --- a/src/lib/formats/acorn_dsk.cpp +++ b/src/lib/formats/acorn_dsk.cpp @@ -111,6 +111,22 @@ const acorn_ssd_format::format acorn_ssd_format::formats[] = floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM, 4000, 10, 80, 2, 256, {}, 0, {}, 40, 10, 10 }, + { // 100k 40 track single sided single density + floppy_image::FF_35, floppy_image::SSSD, floppy_image::FM, + 4000, 10, 40, 1, 256,{}, 0,{}, 40, 10, 10 + }, + { // 200k 80 track single sided single density + floppy_image::FF_35, floppy_image::SSDD, floppy_image::FM, + 4000, 10, 80, 1, 256,{}, 0,{}, 40, 10, 10 + }, + { // 200k 40 track double sided single density + floppy_image::FF_35, floppy_image::DSSD, floppy_image::FM, + 4000, 10, 40, 2, 256,{}, 0,{}, 40, 10, 10 + }, + { // 400k 80 track double sided single density + floppy_image::FF_35, floppy_image::DSDD, floppy_image::FM, + 4000, 10, 80, 2, 256,{}, 0,{}, 40, 10, 10 + }, {} }; @@ -201,6 +217,14 @@ const acorn_dsd_format::format acorn_dsd_format::formats[] = floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM, 4000, 10, 40, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10 }, + { // 400k 80 track double sided single density (interleaved) + floppy_image::FF_35, floppy_image::DSDD, floppy_image::FM, + 4000, 10, 80, 2, 256,{}, -1,{ 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10 + }, + { // 200k 40 track double sided single density (interleaved) + floppy_image::FF_35, floppy_image::DSSD, floppy_image::FM, + 4000, 10, 40, 2, 256,{}, -1,{ 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10 + }, {} }; diff --git a/src/mame/drivers/cms.cpp b/src/mame/drivers/cms.cpp new file mode 100644 index 00000000000..3a9285d06c1 --- /dev/null +++ b/src/mame/drivers/cms.cpp @@ -0,0 +1,318 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +// thanks-to:Phill Harvey-Smith +/*************************************************************************** + + CMS 6502 Development System + + This is an industrial 6502 system in a rack chassis consisting of a + back-plane and plug-in cards, with two 3.5" floppy disk drives, a + "SIMON" System Monitor, DFS, and an extended version of BBC BASIC + called MULTI-BASIC. It has an IBM-XT style keyboard. + + The "Eurocard" standard format cards are as follows: + - 6502 2nd Processor For The BBC Micro (CMS0026 6502) + - 40/80 Terminal Card (also handles the keyboard) (CMS 0010-3) + - High Performance Colour Graphics Card (CMS Video-4) + - Versatile Interface Board (CMS0006 Issue 4) + - Analogue Digital Interface Board (CMS00092 A/D I/O) + - Floppy Disk Controller + +****************************************************************************/ + +#include "emu.h" +#include "cpu/m6502/m6502.h" +#include "machine/6522via.h" +#include "machine/input_merger.h" +#include "bus/acorn/bus.h" +#include "coreutil.h" + + +class cms_state : public driver_device +{ +public: + cms_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_rom(*this, "rom") + , m_bank1(*this, "bank1") + , m_via(*this, "via") + , 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: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + DECLARE_WRITE8_MEMBER(map_select_w); + DECLARE_WRITE8_MEMBER(page_select_w); + DECLARE_WRITE_LINE_MEMBER(bus_nmi_w); + DECLARE_READ8_MEMBER(cms_rtc_r); + DECLARE_WRITE8_MEMBER(cms_rtc_w); + + void cms_rtc_set_time(); + + required_device m_maincpu; + required_memory_region m_rom; + required_memory_bank m_bank1; + required_device m_via; + required_device m_irqs; + required_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_rtc_data[0x10]; + int m_rtc_reg; + int m_rtc_state; + + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + emu_timer* m_rtc_timer; + + enum + { + TIMER_RTC + }; +}; + + +void cms_state::cms6502_mem(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x7fff).ram(); /* socket M1 43256C-12 32K RAM */ + map(0x8000, 0xbfff).bankr("bank1").w(FUNC(cms_state::page_select_w)); + map(0xc000, 0xffff).rom().region("mos", 0); + map(0xfc00, 0xfc0f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write)); + map(0xfc30, 0xfc3f).rw(FUNC(cms_state::cms_rtc_r), FUNC(cms_state::cms_rtc_w)); + map(0xfc70, 0xfc7f).w(FUNC(cms_state::map_select_w)); +} + + +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); +} + +WRITE8_MEMBER(cms_state::page_select_w) +{ + logerror("page select %02x\n", data); + m_page_select = data & 0x03; + if (m_map_select == 0x00) + { + m_page_select = data & 0x03; + m_bank1->set_entry(m_page_select); + } +} + + +/* Input ports */ +static INPUT_PORTS_START( cms ) +INPUT_PORTS_END + + +void cms_state::machine_start() +{ + m_bank1->configure_entries(0, 16, m_rom->base(), 0x4000); + + memset(&m_rtc_data, 0, sizeof(m_rtc_data)); + m_rtc_reg = 0; + m_rtc_state = 0; + m_rtc_data[0xf] = 1; + + m_rtc_timer = timer_alloc(); + m_rtc_timer->adjust(attotime::zero, 0, attotime(1, 0)); +} + + +void cms_state::machine_reset() +{ + m_bank1->set_entry(0); +} + +/* Real Time Clock and NVRAM EM M3002 + +reg 0: seconds +reg 1: minutes +reg 2: hours +reg 3: day 1 based +reg 4: month 1 based +reg 5: year +reg 6: week day +reg 7: week number +reg .. +reg 15: status + +*/ + +void cms_state::cms_rtc_set_time() +{ + system_time systime; + + /* get the current date/time from the core */ + machine().current_datetime(systime); + + m_rtc_data[0] = dec_2_bcd(systime.utc_time.second); + m_rtc_data[1] = dec_2_bcd(systime.utc_time.minute); + m_rtc_data[2] = dec_2_bcd(systime.utc_time.hour); + + m_rtc_data[3] = dec_2_bcd(systime.utc_time.mday); + m_rtc_data[4] = dec_2_bcd(systime.utc_time.month + 1); + m_rtc_data[5] = dec_2_bcd(systime.utc_time.year % 100); +} + +void cms_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + int month, year; + + switch (id) + { + case TIMER_RTC: + m_rtc_data[0] = bcd_adjust(m_rtc_data[0] + 1); + if (m_rtc_data[0] >= 0x60) + { + m_rtc_data[0] = 0; + m_rtc_data[1] = bcd_adjust(m_rtc_data[1] + 1); + if (m_rtc_data[1] >= 0x60) + { + m_rtc_data[1] = 0; + m_rtc_data[2] = bcd_adjust(m_rtc_data[2] + 1); + if (m_rtc_data[2] >= 0x24) + { + m_rtc_data[2] = 0; + m_rtc_data[3] = bcd_adjust(m_rtc_data[3] + 1); + month = bcd_2_dec(m_rtc_data[4]); + year = bcd_2_dec(m_rtc_data[5]) + 2000; // save for julian_days_in_month_calculation + if (m_rtc_data[3]> gregorian_days_in_month(month, year)) + { + m_rtc_data[3] = 1; + m_rtc_data[4] = bcd_adjust(m_rtc_data[4] + 1); + if (m_rtc_data[4]>0x12) + { + m_rtc_data[4] = 1; + m_rtc_data[5] = bcd_adjust(m_rtc_data[5] + 1) & 0xff; + } + } + } + } + } + break; + } +} + +READ8_MEMBER(cms_state::cms_rtc_r) +{ + int data = 0; + + switch (m_rtc_state) + { + case 1: + data = (m_rtc_data[m_rtc_reg] & 0xf0) >> 4; + m_rtc_state++; + break; + case 2: + data = m_rtc_data[m_rtc_reg] & 0xf; + m_rtc_state = 0; + break; + } + return data; +} + +WRITE8_MEMBER(cms_state::cms_rtc_w) +{ + switch (m_rtc_state) + { + case 0: + m_rtc_reg = data; + m_rtc_state = 1; + break; + case 1: + m_rtc_data[m_rtc_reg] = (m_rtc_data[m_rtc_reg] & ~0xf0) | ((data & 0xf) << 4); + m_rtc_state++; + break; + case 2: + m_rtc_data[m_rtc_reg] = (m_rtc_data[m_rtc_reg] & ~0xf) | (data & 0xf); + m_rtc_state = 0; + break; + } +} + + +WRITE_LINE_MEMBER(cms_state::bus_nmi_w) +{ + m_maincpu->set_input_line(INPUT_LINE_NMI, state); +} + + +/*************************************************************************** + MACHINE DRIVERS +***************************************************************************/ + +void cms_state::cms6502(machine_config &config) +{ + M6502(config, m_maincpu, 1_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, cms_state::cms6502_mem); + + 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 */ + ACORN_BUS(config, m_bus, 0); + m_bus->set_cputag(m_maincpu); + m_bus->out_irq_callback().set(m_irqs, FUNC(input_merger_device::in_w<1>)); + m_bus->out_nmi_callback().set(FUNC(cms_state::bus_nmi_w)); + ACORN_BUS_SLOT(config, "bus1", m_bus, cms_bus_devices, "4080term"); + ACORN_BUS_SLOT(config, "bus2", m_bus, cms_bus_devices, nullptr); + ACORN_BUS_SLOT(config, "bus3", m_bus, cms_bus_devices, "fdc"); + ACORN_BUS_SLOT(config, "bus4", m_bus, cms_bus_devices, "hires"); + ACORN_BUS_SLOT(config, "bus5", m_bus, cms_bus_devices, nullptr); + ACORN_BUS_SLOT(config, "bus6", m_bus, cms_bus_devices, nullptr); +} + + +/*************************************************************************** + ROM definitions +***************************************************************************/ + +ROM_START( cms6502 ) + ROM_REGION(0x04000, "mos", 0) /* 27128 */ + ROM_LOAD("6502 system os.m5", 0x0000, 0x4000, CRC(1b6da63d) SHA1(5c0afc55288ad86e1d6e653dda9c5dcccdaf0ff2)) + + ROM_REGION(0x40000, "rom", 0) + /* 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)) + /* Socket M3 empty */ + /* Socket M2 27128 */ + ROM_LOAD("gdp.m2", 0x20000, 0x4000, CRC(f545293b) SHA1(532c45ac4661643c6c6f633d504ef72e800cc900)) + /* Socket M1 contains RAM, not mapped as ROM */ + + ROM_REGION(0x200, "proms", 0) + ROM_LOAD("bassys2.ic8", 0x0000, 0x0200, CRC(417ff0b4) SHA1(878718accb83f18456fefaf67a0e4a6a407113e4)) // 512x8 +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 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 47f0fd39aa4..fb0f23d1d49 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -9854,6 +9854,9 @@ cmi2x // Fairlight CMI IIx @source:cmmb.cpp cmmb162 // +@source:cms.cpp +cms6502 // CMS 6502 Development System + @source:cninja.cpp cninja // MAG (c) 1991 Data East Corporation (World) cninja1 // MAG (c) 1991 Data East Corporation (World) diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 48ce60ed4fa..682b9bcf035 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -134,6 +134,7 @@ ckz80.cpp clcd.cpp cm1800.cpp cmi.cpp +cms.cpp coco12.cpp coco3.cpp codata.cpp -- cgit v1.2.3