summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua6
-rw-r--r--src/devices/bus/mtx/cfx.cpp142
-rw-r--r--src/devices/bus/mtx/cfx.h51
-rw-r--r--src/devices/bus/mtx/exp.cpp90
-rw-r--r--src/devices/bus/mtx/exp.h33
-rw-r--r--src/devices/bus/mtx/magrom.cpp103
-rw-r--r--src/devices/bus/mtx/magrom.h50
-rw-r--r--src/devices/bus/mtx/rompak.cpp51
-rw-r--r--src/devices/bus/mtx/rompak.h40
-rw-r--r--src/devices/bus/mtx/sdx.cpp13
-rw-r--r--src/devices/bus/mtx/sdx.h2
-rw-r--r--src/mame/drivers/mtx.cpp126
-rw-r--r--src/mame/includes/mtx.h21
-rw-r--r--src/mame/machine/mtx.cpp82
14 files changed, 710 insertions, 100 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 7e87a80393b..b4118f17087 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -1856,6 +1856,12 @@ if (BUSES["MTX"]~=null) then
files {
MAME_DIR .. "src/devices/bus/mtx/exp.cpp",
MAME_DIR .. "src/devices/bus/mtx/exp.h",
+ MAME_DIR .. "src/devices/bus/mtx/cfx.cpp",
+ MAME_DIR .. "src/devices/bus/mtx/cfx.h",
+ MAME_DIR .. "src/devices/bus/mtx/magrom.cpp",
+ MAME_DIR .. "src/devices/bus/mtx/magrom.h",
+ MAME_DIR .. "src/devices/bus/mtx/rompak.cpp",
+ MAME_DIR .. "src/devices/bus/mtx/rompak.h",
MAME_DIR .. "src/devices/bus/mtx/sdx.cpp",
MAME_DIR .. "src/devices/bus/mtx/sdx.h",
}
diff --git a/src/devices/bus/mtx/cfx.cpp b/src/devices/bus/mtx/cfx.cpp
new file mode 100644
index 00000000000..2bf6e5d23b0
--- /dev/null
+++ b/src/devices/bus/mtx/cfx.cpp
@@ -0,0 +1,142 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Memotech Compact Flash System
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "cfx.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MTX_CFX, mtx_cfx_device, "mtx_cfx", "MTX CFX System")
+
+
+//-------------------------------------------------
+// ROM( cfx )
+//-------------------------------------------------
+
+ROM_START( cfx )
+ ROM_REGION(0x4000, "flash", ROMREGION_ERASE00) // SST39SF010
+ ROM_SYSTEM_BIOS(0, "153", "CFX Duo 15 (Build 153, 02 April 2018)")
+ ROMX_LOAD("cfx015-b153,280.bin", 0x0000, 0x3afc, CRC(77b31543) SHA1(3973016bbbd36ac958915e187f26816ec431ef87), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "151", "CFX Duo 15 (Build 151, 03 December 2017)")
+ ROMX_LOAD("cfx015-b151.bin", 0x0000, 0x3afc, CRC(4c7366c7) SHA1(33a7f503a84602aaf93ba61f55a3e4d5dbb223ce), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "147", "CFX Duo 14 (Build 147, 28 December 2016)")
+ ROMX_LOAD("cfx014-b147,512.bin", 0x0000, 0x3afc, CRC(ef9d0e1f) SHA1(b6e5ba79f804f509f0d028f00d5972e07e2cb9cf), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(3, "144", "CFX Duo 14 (Build 144, 17 October 2015)")
+ ROMX_LOAD("cfx0014,512.bin", 0x0000, 0x3a3f, CRC(23ab4f0e) SHA1(e01874ba5392518be2313fb3161bcef6a72c9662), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(4, "132", "CFX Duo 13 (Build 132, 11 October 2015)")
+ ROMX_LOAD("cfx013,512.bin", 0x0000, 0x3c31, CRC(2d1c4ebc) SHA1(5f894bdc9fc20d37d11a2771b8e8fbcacd3f938e), ROM_BIOS(4))
+ ROM_SYSTEM_BIOS(5, "103", "CFX Duo 12 (Build 103, 21 August 2015)")
+ ROMX_LOAD("cfx_duo12.bin", 0x0000, 0x4000, CRC(4fbe5ab7) SHA1(3e8dcc3d88158e0dc30d7d9ecec7e427883f7171), ROM_BIOS(5))
+ROM_END
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void mtx_cfx_device::device_add_mconfig(machine_config &config)
+{
+ I8255(config, m_pia);
+ m_pia->in_pa_callback().set([this]() { return m_ide_data & 0xff; });
+ m_pia->out_pa_callback().set([this](uint8_t data) { m_ide_data = (m_ide_data & 0xff00) | data; });
+ m_pia->in_pb_callback().set([this]() { return m_ide_data >> 8; });
+ m_pia->out_pb_callback().set([this](uint8_t data) { m_ide_data = (m_ide_data & 0x00ff) | (data << 8); });
+ m_pia->out_pc_callback().set(FUNC(mtx_cfx_device::portc_w));
+
+ ATA_INTERFACE(config, m_ide).options(ata_devices, "hdd", nullptr, false);
+}
+
+
+const tiny_rom_entry *mtx_cfx_device::device_rom_region() const
+{
+ return ROM_NAME( cfx );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mtx_cfx_device - constructor
+//-------------------------------------------------
+
+mtx_cfx_device::mtx_cfx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, MTX_CFX, tag, owner, clock)
+ , device_mtx_exp_interface(mconfig, *this)
+ , m_flash(*this, "flash")
+ , m_pia(*this, "pia")
+ , m_ide(*this, "ide")
+ , m_ide_data(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mtx_cfx_device::device_start()
+{
+ save_item(NAME(m_ide_data));
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mtx_cfx_device::device_reset()
+{
+ machine().root_device().membank("rommap_bank1")->configure_entries(4, 2, m_flash->base(), 0x2000);
+
+ io_space().install_readwrite_handler(0x6c, 0x6f, read8sm_delegate(*m_pia, FUNC(i8255_device::read)), write8sm_delegate(*m_pia, FUNC(i8255_device::write)));
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+void mtx_cfx_device::portc_w(uint8_t data)
+{
+ /*
+ b0 A0
+ b1 A1
+ b2 A2
+ b3 CS0
+ b4 CS1
+ b5 WRITE
+ b6 READ
+ b7 RESET
+ */
+
+ if (BIT(data, 7))
+ m_ide->reset();
+
+ switch (BIT(data, 5, 2))
+ {
+ case 0x01: // WRITE
+ if (BIT(data, 3)) // CS0
+ m_ide->cs0_w(data & 0x07, m_ide_data);
+ else if (BIT(data, 4)) // CS1
+ m_ide->cs1_w(data & 0x07, m_ide_data);
+ break;
+
+ case 0x02: // READ
+ if (BIT(data, 3)) // CS0
+ m_ide_data = m_ide->cs0_r(data & 0x07);
+ else if (BIT(data, 4)) // CS1
+ m_ide_data = m_ide->cs1_r(data & 0x07);
+ break;
+ }
+}
diff --git a/src/devices/bus/mtx/cfx.h b/src/devices/bus/mtx/cfx.h
new file mode 100644
index 00000000000..1f19fd5648f
--- /dev/null
+++ b/src/devices/bus/mtx/cfx.h
@@ -0,0 +1,51 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Memotech Compact Flash System
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_MTX_CFX_H
+#define MAME_BUS_MTX_CFX_H
+
+#include "exp.h"
+#include "machine/i8255.h"
+#include "bus/ata/ataintf.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class mtx_cfx_device : public device_t, public device_mtx_exp_interface
+{
+public:
+ // construction/destruction
+ mtx_cfx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_flash;
+ required_device<i8255_device> m_pia;
+ required_device<ata_interface_device> m_ide;
+
+ uint16_t m_ide_data;
+
+ void portc_w(uint8_t data);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(MTX_CFX, mtx_cfx_device)
+
+#endif // MAME_BUS_MTX_CFX_H
diff --git a/src/devices/bus/mtx/exp.cpp b/src/devices/bus/mtx/exp.cpp
index 58071cd1a38..4b3f376977a 100644
--- a/src/devices/bus/mtx/exp.cpp
+++ b/src/devices/bus/mtx/exp.cpp
@@ -27,11 +27,27 @@ DEFINE_DEVICE_TYPE(MTX_EXP_SLOT, mtx_exp_slot_device, "mtx_exp_slot", "MTX expan
device_mtx_exp_interface::device_mtx_exp_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "mtxexp")
+ , m_rom(nullptr)
+ , m_rom_size(0)
{
m_slot = dynamic_cast<mtx_exp_slot_device *>(device.owner());
}
+//-------------------------------------------------
+// rom_alloc - alloc the space for the ROM
+//-------------------------------------------------
+
+void device_mtx_exp_interface::rom_alloc(uint32_t size, const char *tag)
+{
+ if (m_rom == nullptr)
+ {
+ m_rom = device().machine().memory().region_alloc(std::string(tag).append(":cart:rom").c_str(), size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -43,11 +59,13 @@ device_mtx_exp_interface::device_mtx_exp_interface(const machine_config &mconfig
mtx_exp_slot_device::mtx_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MTX_EXP_SLOT, tag, owner, clock)
, device_single_card_slot_interface<device_mtx_exp_interface>(mconfig, *this)
+ , device_cartrom_image_interface(mconfig, *this)
, m_program(*this, finder_base::DUMMY_TAG, -1)
, m_io(*this, finder_base::DUMMY_TAG, -1)
, m_busreq_handler(*this)
, m_int_handler(*this)
, m_nmi_handler(*this)
+ , m_card(nullptr)
{
}
@@ -58,6 +76,8 @@ mtx_exp_slot_device::mtx_exp_slot_device(const machine_config &mconfig, const ch
void mtx_exp_slot_device::device_start()
{
+ m_card = get_card_device();
+
// resolve callbacks
m_busreq_handler.resolve_safe();
m_int_handler.resolve_safe();
@@ -66,18 +86,84 @@ void mtx_exp_slot_device::device_start()
//-------------------------------------------------
+// call_load
+//-------------------------------------------------
+
+image_init_result mtx_exp_slot_device::call_load()
+{
+ if (m_card)
+ {
+ uint32_t size = !loaded_through_softlist() ? length() : get_software_region_length("rom");
+
+ if (size % 0x2000)
+ {
+ seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_card->rom_alloc(size, tag());
+
+ if (!loaded_through_softlist())
+ fread(m_card->get_rom_base(), size);
+ else
+ memcpy(m_card->get_rom_base(), get_software_region("rom"), size);
+ }
+
+ return image_init_result::PASS;
+}
+
+
+//-------------------------------------------------
+// get_default_card_software -
+//-------------------------------------------------
+
+std::string mtx_exp_slot_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ if (hook.image_file())
+ {
+ uint64_t len;
+ hook.image_file()->length(len); // FIXME: check error return
+
+ if (len == 0x80000)
+ return software_get_default_slot("magrom");
+ }
+
+ return software_get_default_slot("rompak");
+}
+
+
+void mtx_exp_slot_device::bankswitch(uint8_t data)
+{
+ if (m_card)
+ m_card->bankswitch(data);
+}
+
+
+//-------------------------------------------------
// SLOT_INTERFACE( mtx_exp_devices )
//-------------------------------------------------
// slot devices
+#include "cfx.h"
//#include "fdx.h"
+#include "magrom.h"
+#include "rompak.h"
#include "sdx.h"
-void mtx_expansion_devices(device_slot_interface &device)
+void mtx_int_expansion_devices(device_slot_interface &device)
{
+ device.option_add("cfx", MTX_CFX);
//device.option_add("fdx", MTX_FDX); /* FDX Floppy Disc System */
- device.option_add("sdxbas", MTX_SDXBAS); /* SDX Floppy Disc System (SDX ROM)*/
+ device.option_add_internal("magrom", MTX_MAGROM);
device.option_add("sdxcpm", MTX_SDXCPM); /* SDX Floppy Disc System (CP/M ROM and 80 column card) */
}
+
+void mtx_ext_expansion_devices(device_slot_interface &device)
+{
+ device.option_add("cfx", MTX_CFX);
+ device.option_add_internal("magrom", MTX_MAGROM);
+ device.option_add_internal("rompak", MTX_ROMPAK);
+ device.option_add("sdxbas", MTX_SDXBAS); /* SDX Floppy Disc System (SDX ROM)*/
+}
diff --git a/src/devices/bus/mtx/exp.h b/src/devices/bus/mtx/exp.h
index 2d1cf583f16..dd23586c05e 100644
--- a/src/devices/bus/mtx/exp.h
+++ b/src/devices/bus/mtx/exp.h
@@ -12,6 +12,8 @@
#pragma once
+#include "imagedev/cartrom.h"
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -21,7 +23,7 @@
class device_mtx_exp_interface;
-class mtx_exp_slot_device : public device_t, public device_single_card_slot_interface<device_mtx_exp_interface>
+class mtx_exp_slot_device : public device_t, public device_single_card_slot_interface<device_mtx_exp_interface>, public device_cartrom_image_interface
{
friend class device_mtx_exp_interface;
public:
@@ -51,10 +53,22 @@ public:
DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
+ virtual void bankswitch(uint8_t data);
+
protected:
// device-level overrides
virtual void device_start() override;
+ // image-level overrides
+ virtual image_init_result call_load() override;
+
+ virtual bool is_reset_on_load() const noexcept override { return true; }
+ virtual const char *image_interface() const noexcept override { return "mtx_cart"; }
+ virtual const char *file_extensions() const noexcept override { return "bin,rom"; }
+
+ // slot interface overrides
+ virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
+
private:
// address spaces we are attached to
required_address_space m_program;
@@ -63,6 +77,8 @@ private:
devcb_write_line m_busreq_handler;
devcb_write_line m_int_handler;
devcb_write_line m_nmi_handler;
+
+ device_mtx_exp_interface *m_card;
};
@@ -70,6 +86,13 @@ private:
class device_mtx_exp_interface : public device_interface
{
+public:
+ virtual void bankswitch(uint8_t data) { }
+
+ void rom_alloc(uint32_t size, const char *tag);
+ uint8_t* get_rom_base() { return m_rom; }
+ uint32_t get_rom_size() { return m_rom_size; }
+
protected:
// construction/destruction
device_mtx_exp_interface(const machine_config &mconfig, device_t &device);
@@ -78,13 +101,19 @@ protected:
address_space &io_space() { return *m_slot->m_io; }
mtx_exp_slot_device *m_slot;
+
+private:
+ // internal state
+ uint8_t *m_rom;
+ uint32_t m_rom_size;
};
// device type definition
DECLARE_DEVICE_TYPE(MTX_EXP_SLOT, mtx_exp_slot_device)
-void mtx_expansion_devices(device_slot_interface &device);
+void mtx_int_expansion_devices(device_slot_interface &device);
+void mtx_ext_expansion_devices(device_slot_interface &device);
#endif // MAME_BUS_MTX_EXP_H
diff --git a/src/devices/bus/mtx/magrom.cpp b/src/devices/bus/mtx/magrom.cpp
new file mode 100644
index 00000000000..5b75a9d4f1e
--- /dev/null
+++ b/src/devices/bus/mtx/magrom.cpp
@@ -0,0 +1,103 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Martin Allcorn's Games ROM
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "magrom.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MTX_MAGROM, mtx_magrom_device, "mtx_magrom", "MTX MAGROM")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( magrom )
+//-------------------------------------------------
+
+INPUT_PORTS_START(magrom)
+ PORT_START("JUMPERS")
+ PORT_CONFNAME(0x03, 0x01, "System")
+ PORT_CONFSETTING(0x00, "MTX500")
+ PORT_CONFSETTING(0x01, "MTX512")
+ PORT_CONFSETTING(0x03, "RS128")
+ PORT_CONFNAME(0x04, 0x00, "ROM ID")
+ PORT_CONFSETTING(0x00, "GROM")
+ PORT_CONFSETTING(0x04, "ROM 6")
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor mtx_magrom_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(magrom);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mtx_magrom_device - constructor
+//-------------------------------------------------
+
+mtx_magrom_device::mtx_magrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, MTX_MAGROM, tag, owner, clock)
+ , device_mtx_exp_interface(mconfig, *this)
+ , m_bank(*this, "bank")
+ , m_jumpers(*this, "JUMPERS")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mtx_magrom_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mtx_magrom_device::device_reset()
+{
+ m_bank->configure_entries(0, 32, get_rom_base(), 0x4000);
+
+ int rom_id = (m_jumpers->read() & 0x04) ? 6 : 7;
+ machine().root_device().membank("rommap_bank1")->configure_entry(rom_id, get_rom_base() + 0x2000);
+
+ io_space().install_write_handler(0xfb, 0xfb, write8smo_delegate(*this, FUNC(mtx_magrom_device::page_w)));
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+void mtx_magrom_device::bankswitch(uint8_t data)
+{
+ int page = m_jumpers->read() & 0x03;
+ if (!BIT(data, 7) && BIT(data, 0, 4) == page)
+ program_space().install_read_bank(0x4000, 0x7fff, m_bank);
+}
+
+
+void mtx_magrom_device::page_w(uint8_t data)
+{
+ m_bank->set_entry(data & 0x1f);
+}
diff --git a/src/devices/bus/mtx/magrom.h b/src/devices/bus/mtx/magrom.h
new file mode 100644
index 00000000000..a4868024150
--- /dev/null
+++ b/src/devices/bus/mtx/magrom.h
@@ -0,0 +1,50 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Martin Allcorn's Games ROM
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_MTX_MAGROM_H
+#define MAME_BUS_MTX_MAGROM_H
+
+#include "exp.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mtx_magrom_device
+
+class mtx_magrom_device : public device_t, public device_mtx_exp_interface
+{
+public:
+ // construction/destruction
+ mtx_magrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const override;
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void bankswitch(uint8_t data) override;
+
+private:
+ memory_bank_creator m_bank;
+ required_ioport m_jumpers;
+
+ void page_w(uint8_t data);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(MTX_MAGROM, mtx_magrom_device)
+
+
+#endif // MAME_BUS_MTX_MAGROM_H
diff --git a/src/devices/bus/mtx/rompak.cpp b/src/devices/bus/mtx/rompak.cpp
new file mode 100644
index 00000000000..6f870c540ce
--- /dev/null
+++ b/src/devices/bus/mtx/rompak.cpp
@@ -0,0 +1,51 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Memotech ROMPAK
+
+**********************************************************************/
+
+#include "emu.h"
+#include "rompak.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(MTX_ROMPAK, mtx_rompak_device, "rompak", "MTX ROMPAK")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// mtx_rompak_device - constructor
+//-------------------------------------------------
+
+mtx_rompak_device::mtx_rompak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MTX_ROMPAK, tag, owner, clock)
+ , device_mtx_exp_interface(mconfig, *this)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mtx_rompak_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mtx_rompak_device::device_reset()
+{
+ machine().root_device().membank("rommap_bank1")->configure_entry(7, get_rom_base());
+}
diff --git a/src/devices/bus/mtx/rompak.h b/src/devices/bus/mtx/rompak.h
new file mode 100644
index 00000000000..f26af1fbe34
--- /dev/null
+++ b/src/devices/bus/mtx/rompak.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Memotech ROMPAK
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_MTX_ROMPAK_H
+#define MAME_BUS_MTX_ROMPAK_H
+
+#pragma once
+
+#include "exp.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mtx_rompak_device
+
+class mtx_rompak_device : public device_t, public device_mtx_exp_interface
+{
+public:
+ // construction/destruction
+ mtx_rompak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+};
+
+
+// device type definitions
+DECLARE_DEVICE_TYPE(MTX_ROMPAK, mtx_rompak_device)
+
+
+#endif // MAME_BUS_MTX_ROMPAK_H
diff --git a/src/devices/bus/mtx/sdx.cpp b/src/devices/bus/mtx/sdx.cpp
index 61d19a11fa6..0a27e48f309 100644
--- a/src/devices/bus/mtx/sdx.cpp
+++ b/src/devices/bus/mtx/sdx.cpp
@@ -152,16 +152,13 @@ void mtx_sdxcpm_device::device_add_mconfig(machine_config &config)
/* 80 column video card - required to be installed in MTX internally */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- m_screen->set_refresh_hz(50);
- m_screen->set_size(960, 313);
- m_screen->set_visarea(00, 640 - 1, 0, 240 - 1);
- m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update));
+ m_screen->set_raw(15_MHz_XTAL, 960, 0, 640, 313, 0, 240);
+ m_screen->set_screen_update("crtc", FUNC(hd6845s_device::screen_update));
GFXDECODE(config, "gfxdecode", "palette", gfx_mtx_sdx);
PALETTE(config, "palette", palette_device::RGB_3BIT);
- MC6845(config, m_crtc, 15_MHz_XTAL / 8);
+ HD6845S(config, m_crtc, 15_MHz_XTAL / 8);
m_crtc->set_screen("screen");
m_crtc->set_show_border_area(false);
m_crtc->set_char_width(8);
@@ -255,8 +252,8 @@ void mtx_sdxcpm_device::device_reset()
/* 80 column */
io_space().install_readwrite_handler(0x30, 0x33, read8sm_delegate(*this, FUNC(mtx_sdxcpm_device::mtx_80col_r)), write8sm_delegate(*this, FUNC(mtx_sdxcpm_device::mtx_80col_w)));
- io_space().install_readwrite_handler(0x38, 0x38, read8smo_delegate(*m_crtc, FUNC(mc6845_device::status_r)), write8smo_delegate(*m_crtc, FUNC(mc6845_device::address_w)));
- io_space().install_readwrite_handler(0x39, 0x39, read8smo_delegate(*m_crtc, FUNC(mc6845_device::register_r)), write8smo_delegate(*m_crtc, FUNC(mc6845_device::register_w)));
+ io_space().install_readwrite_handler(0x38, 0x38, read8smo_delegate(*m_crtc, FUNC(hd6845s_device::status_r)), write8smo_delegate(*m_crtc, FUNC(mc6845_device::address_w)));
+ io_space().install_readwrite_handler(0x39, 0x39, read8smo_delegate(*m_crtc, FUNC(hd6845s_device::register_r)), write8smo_delegate(*m_crtc, FUNC(mc6845_device::register_w)));
memset(m_80col_char_ram, 0, sizeof(m_80col_char_ram));
memset(m_80col_attr_ram, 0, sizeof(m_80col_attr_ram));
diff --git a/src/devices/bus/mtx/sdx.h b/src/devices/bus/mtx/sdx.h
index d701a4d3c64..5bed06258aa 100644
--- a/src/devices/bus/mtx/sdx.h
+++ b/src/devices/bus/mtx/sdx.h
@@ -87,7 +87,7 @@ private:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
- required_device<mc6845_device> m_crtc;
+ required_device<hd6845s_device> m_crtc;
required_memory_region m_char_rom;
uint8_t m_80col_char_ram[0x800];
uint8_t m_80col_attr_ram[0x800];
diff --git a/src/mame/drivers/mtx.cpp b/src/mame/drivers/mtx.cpp
index 2ed4ac0542a..00abf7b659d 100644
--- a/src/mame/drivers/mtx.cpp
+++ b/src/mame/drivers/mtx.cpp
@@ -48,6 +48,7 @@ void mtx_state::mtx_mem(address_map &map)
void mtx_state::mtx_io(address_map &map)
{
+ map.unmap_value_high(); // TODO: floating bus
map.global_mask(0xff);
map(0x00, 0x00).rw(FUNC(mtx_state::mtx_strobe_r), FUNC(mtx_state::mtx_bankswitch_w));
map(0x01, 0x01).rw("tms9929a", FUNC(tms9929a_device::vram_read), FUNC(tms9929a_device::vram_write));
@@ -98,8 +99,8 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7 Page") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
- PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(CANCEL)) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7 PAGE") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
+ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9 BRK") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(CANCEL)) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
PORT_START("ROW1")
@@ -122,8 +123,8 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
- PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('\t') PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5 " UTF8_UP) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
+ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4 TAB") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('\t') PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
PORT_START("ROW3")
@@ -133,20 +134,20 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`')
- PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Linefeed") PORT_CODE(KEYCODE_PRTSCR)
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
- PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
+ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Line Feed") PORT_CODE(KEYCODE_PRTSCR)
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1 " UTF8_LEFT) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
+ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6 DEL") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
PORT_START("ROW4")
- PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("AlphaLock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Alpha Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(']') PORT_CHAR('}')
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3 " UTF8_RIGHT) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
@@ -158,7 +159,7 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2 HOME") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
@@ -170,7 +171,7 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . " UTF8_DOWN) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
@@ -181,19 +182,62 @@ static INPUT_PORTS_START( mtx512 )
PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('_')
- PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
- PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad Enter CLS") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0 INS") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad ENT CLS") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
- PORT_START("country_code")
- PORT_DIPNAME(0x04, 0x00, "Country Code Switch 1")
- PORT_DIPSETTING(0x04, DEF_STR(Off) )
- PORT_DIPSETTING(0x00, DEF_STR(On) )
- PORT_DIPNAME(0x08, 0x00, "Country Code Switch 0")
- PORT_DIPSETTING(0x08, DEF_STR(Off) )
- PORT_DIPSETTING(0x00, DEF_STR(On) )
- PORT_BIT( 0xf3, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_START("RESET")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CHANGED_MEMBER(DEVICE_SELF, mtx_state, trigger_reset, 0)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) PORT_CHANGED_MEMBER(DEVICE_SELF, mtx_state, trigger_reset, 0)
+
+ PORT_START("JOY0")
+ PORT_BIT( 0x3ff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY1")
+ PORT_BIT( 0x3ff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY2")
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x37f, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY3")
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x37f, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY4")
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x37f, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY5")
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x37f, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY6")
+ PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x37f, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOY7")
+ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2f0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("JOYSTICKS")
+ PORT_CONFNAME(0x03, 0x02, "Joysticks")
+ PORT_CONFSETTING(0x00, "None" )
+ PORT_CONFSETTING(0x01, "Left" )
+ PORT_CONFSETTING(0x02, "Right" )
+ PORT_CONFSETTING(0x03, "Left + Right" )
+
+ PORT_START("SWA")
+ PORT_DIPNAME(0xc00, 0x000, "Country Code")
+ PORT_DIPSETTING(0x000, "English" )
+ PORT_DIPSETTING(0x400, "French" )
+ PORT_DIPSETTING(0x800, "German" )
+ PORT_DIPSETTING(0xc00, "Swedish" )
PORT_START("keyboard_rom")
PORT_CONFNAME(0x03, 0x00, "Keyboard ROM")
@@ -202,6 +246,19 @@ static INPUT_PORTS_START( mtx512 )
PORT_CONFSETTING(0x02, "Finland")
INPUT_PORTS_END
+INPUT_CHANGED_MEMBER(mtx_state::trigger_reset)
+{
+ if (m_reset->read() & 0x03)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
+ }
+ else
+ {
+ bankswitch(0);
+ m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+ }
+}
+
/***************************************************************************
DEVICE CONFIGURATION
***************************************************************************/
@@ -329,22 +386,27 @@ void mtx_state::mtx512(machine_config &config)
GENERIC_SOCKET(config, m_extrom, generic_plain_slot, "mtx_rom", "bin,rom");
m_extrom->set_device_load(FUNC(mtx_state::extrom_load));
- /* rs232 board with disk drive bus */
- MTX_EXP_SLOT(config, m_exp, mtx_expansion_devices, nullptr);
- m_exp->set_program_space(m_maincpu, AS_PROGRAM);
- m_exp->set_io_space(m_maincpu, AS_IO);
- m_exp->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
- m_exp->busreq_handler().set_inputline(m_maincpu, Z80_INPUT_LINE_BUSRQ);
-
- /* cartridge slot */
- GENERIC_CARTSLOT(config, m_rompak, generic_plain_slot, "mtx_cart", "bin,rom");
- m_rompak->set_device_load(FUNC(mtx_state::rompak_load));
+ /* J10 external cartridge */
+ MTX_EXP_SLOT(config, m_exp_ext, mtx_ext_expansion_devices, nullptr);
+ m_exp_ext->set_program_space(m_maincpu, AS_PROGRAM);
+ m_exp_ext->set_io_space(m_maincpu, AS_IO);
+ m_exp_ext->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp_ext->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_exp_ext->busreq_handler().set_inputline(m_maincpu, Z80_INPUT_LINE_BUSRQ);
+
+ /* J0 internal expansion - rs232 board with disk drive bus */
+ MTX_EXP_SLOT(config, m_exp_int, mtx_int_expansion_devices, nullptr);
+ m_exp_int->set_program_space(m_maincpu, AS_PROGRAM);
+ m_exp_int->set_io_space(m_maincpu, AS_IO);
+ m_exp_int->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_exp_int->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
+ m_exp_int->busreq_handler().set_inputline(m_maincpu, Z80_INPUT_LINE_BUSRQ);
/* software lists */
SOFTWARE_LIST(config, "cass_list").set_original("mtx_cass");
SOFTWARE_LIST(config, "flop_list").set_original("mtx_flop");
SOFTWARE_LIST(config, "cart_list").set_original("mtx_cart");
+ SOFTWARE_LIST(config, "hdd_list").set_original("mtx_hdd");
SOFTWARE_LIST(config, "rom_list").set_original("mtx_rom");
}
diff --git a/src/mame/includes/mtx.h b/src/mame/includes/mtx.h
index 02d25a4c185..0f8789d96fa 100644
--- a/src/mame/includes/mtx.h
+++ b/src/mame/includes/mtx.h
@@ -36,10 +36,15 @@ public:
, m_z80dart(*this, "z80dart")
, m_cassette(*this, "cassette")
, m_centronics(*this, "centronics")
+ , m_keyboard(*this, "ROW%u", 0U)
+ , m_joystick(*this, "JOY%u", 0U)
+ , m_joysticks(*this, "JOYSTICKS")
+ , m_reset(*this, "RESET")
+ , m_country(*this, "SWA")
, m_ram(*this, RAM_TAG)
- , m_exp(*this, "exp")
+ , m_exp_int(*this, "exp_int")
+ , m_exp_ext(*this, "exp_ext")
, m_extrom(*this, "extrom")
- , m_rompak(*this, "rompak")
, m_rammap_bank1(*this, "rammap_bank1")
, m_rammap_bank2(*this, "rammap_bank2")
, m_rammap_bank3(*this, "rammap_bank3")
@@ -52,6 +57,8 @@ public:
void mtx500(machine_config &config);
void mtx512(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
+
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -64,10 +71,15 @@ private:
optional_device<z80dart_device> m_z80dart;
required_device<cassette_image_device> m_cassette;
required_device<centronics_device> m_centronics;
+ required_ioport_array<8> m_keyboard;
+ required_ioport_array<8> m_joystick;
+ required_ioport m_joysticks;
+ required_ioport m_reset;
+ required_ioport m_country;
required_device<ram_device> m_ram;
- required_device<mtx_exp_slot_device> m_exp;
+ required_device<mtx_exp_slot_device> m_exp_int;
+ required_device<mtx_exp_slot_device> m_exp_ext;
required_device<generic_slot_device> m_extrom;
- required_device<generic_slot_device> m_rompak;
memory_bank_creator m_rammap_bank1;
memory_bank_creator m_rammap_bank2;
memory_bank_creator m_rammap_bank3;
@@ -119,7 +131,6 @@ private:
DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
void bankswitch(uint8_t data);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(extrom_load);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rompak_load);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
diff --git a/src/mame/machine/mtx.cpp b/src/mame/machine/mtx.cpp
index 41cffc13e11..f4241b966f8 100644
--- a/src/mame/machine/mtx.cpp
+++ b/src/mame/machine/mtx.cpp
@@ -103,17 +103,17 @@ void mtx_state::bankswitch(uint8_t data)
program.install_readwrite_bank(0x8000, 0xbfff, m_rammap_bank3);
/* set ram bank, for invalid pages a nop-handler will be installed */
- if ((ram_page == 0 && m_ram->size() > 0xc000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0xc000))
+ if ((ram_page == 0 && m_ram->size() > 0xc000) || (ram_page > 0 && m_ram->size() > 0x4000 + ram_page * 0xc000))
m_rammap_bank1->set_entry(ram_page);
else
program.nop_readwrite(0x0000, 0x3fff);
- if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x14000 + ram_page * 0xc000))
+ if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x8000 + ram_page * 0xc000))
m_rammap_bank2->set_entry(ram_page);
else
program.nop_readwrite(0x4000, 0x7fff);
- if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page > 0 && m_ram->size() > 0x18000 + ram_page * 0xc000))
+ if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page > 0 && m_ram->size() > 0xc000 + ram_page * 0xc000))
m_rammap_bank3->set_entry(ram_page);
else
program.nop_readwrite(0x8000, 0xbfff);
@@ -132,11 +132,12 @@ void mtx_state::bankswitch(uint8_t data)
m_rommap_bank1->set_entry(rom_page);
/* set ram bank, for invalid pages a nop-handler will be installed */
- if ((ram_page == 0 && m_ram->size() > 0x8000) || (ram_page > 0 && m_ram->size() > 0x10000 + ram_page * 0x8000))
+ if (m_ram->size() > 0x8000 + ram_page * 0x8000)
m_rommap_bank2->set_entry(ram_page);
else
program.nop_readwrite(0x4000, 0x7fff);
- if ((ram_page == 0 && m_ram->size() > 0x4000) || (ram_page == 1 && m_ram->size() > 0xc000) || (ram_page > 1 && m_ram->size() > 0x14000 + ram_page * 0x8000))
+
+ if (m_ram->size() > 0x4000 + ram_page * 0x8000)
m_rommap_bank3->set_entry(ram_page);
else
program.nop_readwrite(0x8000, 0xbfff);
@@ -146,6 +147,9 @@ void mtx_state::bankswitch(uint8_t data)
void mtx_state::mtx_bankswitch_w(uint8_t data)
{
bankswitch(data);
+
+ m_exp_int->bankswitch(data);
+ m_exp_ext->bankswitch(data);
}
/*-------------------------------------------------
@@ -263,18 +267,19 @@ void mtx_state::mtx_sense_w(uint8_t data)
uint8_t mtx_state::mtx_key_lo_r()
{
- uint8_t data = 0xff;
+ uint16_t data = 0xffff;
- if (!(m_key_sense & 0x01)) data &= ioport("ROW0")->read();
- if (!(m_key_sense & 0x02)) data &= ioport("ROW1")->read();
- if (!(m_key_sense & 0x04)) data &= ioport("ROW2")->read();
- if (!(m_key_sense & 0x08)) data &= ioport("ROW3")->read();
- if (!(m_key_sense & 0x10)) data &= ioport("ROW4")->read();
- if (!(m_key_sense & 0x20)) data &= ioport("ROW5")->read();
- if (!(m_key_sense & 0x40)) data &= ioport("ROW6")->read();
- if (!(m_key_sense & 0x80)) data &= ioport("ROW7")->read();
+ for (int row = 0; row < 8; row++)
+ {
+ if (!(m_key_sense & (1 << row)))
+ {
+ data &= m_keyboard[row]->read();
+ if ((row == 7 && BIT(m_joysticks->read(), 0)) || (row != 7 && BIT(m_joysticks->read(), 1)))
+ data &= m_joystick[row]->read();
+ }
+ }
- return data;
+ return data & 0xff;
}
/*-------------------------------------------------
@@ -283,18 +288,19 @@ uint8_t mtx_state::mtx_key_lo_r()
uint8_t mtx_state::mtx_key_hi_r()
{
- uint8_t data = ioport("country_code")->read();
+ uint16_t data = 0xffff;
- if (!(m_key_sense & 0x01)) data &= ioport("ROW0")->read() >> 8;
- if (!(m_key_sense & 0x02)) data &= ioport("ROW1")->read() >> 8;
- if (!(m_key_sense & 0x04)) data &= ioport("ROW2")->read() >> 8;
- if (!(m_key_sense & 0x08)) data &= ioport("ROW3")->read() >> 8;
- if (!(m_key_sense & 0x10)) data &= ioport("ROW4")->read() >> 8;
- if (!(m_key_sense & 0x20)) data &= ioport("ROW5")->read() >> 8;
- if (!(m_key_sense & 0x40)) data &= ioport("ROW6")->read() >> 8;
- if (!(m_key_sense & 0x80)) data &= ioport("ROW7")->read() >> 8;
+ for (int row = 0; row < 8; row++)
+ {
+ if (!(m_key_sense & (1 << row)))
+ {
+ data &= m_keyboard[row]->read();
+ if ((row == 7 && BIT(m_joysticks->read(), 0)) || (row != 7 && BIT(m_joysticks->read(), 1)))
+ data &= m_joystick[row]->read();
+ }
+ }
- return data;
+ return (m_country->read() | data) >> 8;
}
/*-------------------------------------------------
@@ -408,26 +414,6 @@ DEVICE_IMAGE_LOAD_MEMBER( mtx_state::extrom_load )
}
/***************************************************************************
- ROMPAK ROMS
-***************************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER( mtx_state::rompak_load )
-{
- uint32_t size = m_rompak->common_get_size("rom");
-
- if (size > 0x2000)
- {
- image.seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- m_rompak->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- m_rompak->common_load_rom(m_rompak->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-/***************************************************************************
SNAPSHOT
***************************************************************************/
@@ -573,8 +559,7 @@ void mtx_state::machine_start()
m_rommap_bank2->configure_entry(0, m_ram->pointer() + 0x8000);
m_rommap_bank2->configure_entries(1, 15, m_ram->pointer() + 0x10000, 0x8000);
m_rommap_bank3->configure_entry(0, m_ram->pointer() + 0x4000);
- m_rommap_bank3->configure_entry(1, m_ram->pointer() + 0xc000);
- m_rommap_bank3->configure_entries(2, 14, m_ram->pointer() + 0x14000, 0x8000);
+ m_rommap_bank3->configure_entries(1, 15, m_ram->pointer() + 0xc000, 0x8000);
/* setup banks for ram based memory map */
program.install_readwrite_bank(0x0000, 0x3fff, m_rammap_bank1);
@@ -600,9 +585,6 @@ void mtx_state::machine_reset()
/* keyboard ROMs */
if (ioport("keyboard_rom")->read())
m_rommap_bank1->configure_entry(7, memregion("keyboard_rom")->base() + (ioport("keyboard_rom")->read() - 1) * 0x2000);
- /* rompak ROMs */
- if (m_rompak->exists())
- m_rommap_bank1->configure_entry(7, m_rompak->get_rom_base());
/* bank switching */
bankswitch(0);