summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2014-10-10 15:28:46 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2014-10-10 15:28:46 +0000
commitf0fad04eb68b545e6075f3b65d6d4db8c03e4025 (patch)
treee1a52b526fd0a7e306fd5cfe9adac62976555823 /src
parent4de494250b26fc201171ac3b2b3c24f25ac08aab (diff)
(MESS) converted vectrex and crvision to use slot devices for
their carts. nw. (with these, we are done for the moment with new slot devices for carts...)
Diffstat (limited to 'src')
-rw-r--r--src/emu/bus/bus.mak24
-rw-r--r--src/emu/bus/crvision/rom.c138
-rw-r--r--src/emu/bus/crvision/rom.h114
-rw-r--r--src/emu/bus/crvision/slot.c296
-rw-r--r--src/emu/bus/crvision/slot.h107
-rw-r--r--src/emu/bus/vectrex/rom.c86
-rw-r--r--src/emu/bus/vectrex/rom.h65
-rw-r--r--src/emu/bus/vectrex/slot.c280
-rw-r--r--src/emu/bus/vectrex/slot.h114
-rw-r--r--src/mame/drivers/vectrex.c30
-rw-r--r--src/mame/includes/vectrex.h10
-rw-r--r--src/mame/machine/vectrex.c116
-rw-r--r--src/mame/mame.mak9
-rw-r--r--src/mame/video/vectrex.c6
-rw-r--r--src/mess/drivers/crvision.c148
-rw-r--r--src/mess/includes/crvision.h6
-rw-r--r--src/mess/mess.mak2
17 files changed, 1330 insertions, 221 deletions
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index 08a4be6cf19..986adb3a0b8 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -298,6 +298,18 @@ endif
#-------------------------------------------------
#
+#@src/emu/bus/crvision/slot.h,BUSES += CRVISION
+#-------------------------------------------------
+
+ifneq ($(filter CRVISION,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/crvision
+BUSOBJS += $(BUSOBJ)/crvision/slot.o
+BUSOBJS += $(BUSOBJ)/crvision/rom.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/bus/dmv/dmv.h,BUSES += DMV
#-------------------------------------------------
@@ -716,6 +728,18 @@ endif
#-------------------------------------------------
#
+#@src/emu/bus/vectrex/slot.h,BUSES += VECTREX
+#-------------------------------------------------
+
+ifneq ($(filter VECTREX,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/vectrex
+BUSOBJS += $(BUSOBJ)/vectrex/slot.o
+BUSOBJS += $(BUSOBJ)/vectrex/rom.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/bus/vic10/exp.h,BUSES += VIC10
#-------------------------------------------------
diff --git a/src/emu/bus/crvision/rom.c b/src/emu/bus/crvision/rom.c
new file mode 100644
index 00000000000..0030851828c
--- /dev/null
+++ b/src/emu/bus/crvision/rom.c
@@ -0,0 +1,138 @@
+/***********************************************************************************************************
+
+
+ V-Tech CreatiVision cart emulation
+
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// crvision_rom_device - constructor
+//-------------------------------------------------
+
+const device_type CRVISION_ROM_4K = &device_creator<crvision_rom_device>;
+const device_type CRVISION_ROM_6K = &device_creator<crvision_rom6k_device>;
+const device_type CRVISION_ROM_8K = &device_creator<crvision_rom8k_device>;
+const device_type CRVISION_ROM_10K = &device_creator<crvision_rom10k_device>;
+const device_type CRVISION_ROM_12K = &device_creator<crvision_rom12k_device>;
+const device_type CRVISION_ROM_16K = &device_creator<crvision_rom16k_device>;
+const device_type CRVISION_ROM_18K = &device_creator<crvision_rom18k_device>;
+
+
+crvision_rom_device::crvision_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_crvision_cart_interface(mconfig, *this)
+{
+}
+
+crvision_rom_device::crvision_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, CRVISION_ROM_4K, "CreatiVision 4K Carts", tag, owner, clock, "crvision_4k", __FILE__),
+ device_crvision_cart_interface(mconfig, *this)
+{
+}
+
+crvision_rom6k_device::crvision_rom6k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_6K, "CreatiVision 6K Carts", tag, owner, clock, "crvision_6k", __FILE__)
+{
+}
+
+crvision_rom8k_device::crvision_rom8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_8K, "CreatiVision 8K Carts", tag, owner, clock, "crvision_8k", __FILE__)
+{
+}
+
+crvision_rom10k_device::crvision_rom10k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_10K, "CreatiVision 10K Carts", tag, owner, clock, "crvision_10k", __FILE__)
+{
+}
+
+crvision_rom12k_device::crvision_rom12k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_12K, "CreatiVision 12K Carts", tag, owner, clock, "crvision_12k", __FILE__)
+{
+}
+
+crvision_rom16k_device::crvision_rom16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_16K, "CreatiVision 16K Carts", tag, owner, clock, "crvision_16k", __FILE__)
+{
+}
+
+crvision_rom18k_device::crvision_rom18k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_18K, "CreatiVision 18K Carts", tag, owner, clock, "crvision_18k", __FILE__)
+{
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+READ8_MEMBER(crvision_rom_device::read_rom80)
+{
+ offset &= 0x1fff;
+ if (offset < 0x1000)
+ return 0xff;
+
+ return m_rom[offset & 0xfff];
+}
+
+
+READ8_MEMBER(crvision_rom6k_device::read_rom80)
+{
+ offset &= 0x1fff;
+ if (offset < 0x1000)
+ return m_rom[0x1000 + (offset & 0x7ff)];
+
+ return m_rom[offset & 0xfff];
+}
+
+
+READ8_MEMBER(crvision_rom8k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+
+READ8_MEMBER(crvision_rom10k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+READ8_MEMBER(crvision_rom10k_device::read_rom40)
+{
+ return m_rom[0x2000 + (offset & 0x7ff)];
+}
+
+
+READ8_MEMBER(crvision_rom12k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+READ8_MEMBER(crvision_rom12k_device::read_rom40)
+{
+ return m_rom[0x2000 + (offset & 0xfff)];
+}
+
+
+READ8_MEMBER(crvision_rom16k_device::read_rom80)
+{
+ // lower 8K in 0xa000-0xbfff, higher 8K in 0x8000-0x9fff
+ return m_rom[offset ^ 0x2000];
+}
+
+
+READ8_MEMBER(crvision_rom18k_device::read_rom80)
+{
+ // lower 8K in 0xa000-0xbfff, higher 8K in 0x8000-0x9fff
+ return m_rom[offset ^ 0x2000];
+}
+
+READ8_MEMBER(crvision_rom18k_device::read_rom40)
+{
+ return m_rom[0x4000 + (offset & 0x7ff)];
+}
diff --git a/src/emu/bus/crvision/rom.h b/src/emu/bus/crvision/rom.h
new file mode 100644
index 00000000000..e8715d47a2c
--- /dev/null
+++ b/src/emu/bus/crvision/rom.h
@@ -0,0 +1,114 @@
+#ifndef __CRVISION_ROM_H
+#define __CRVISION_ROM_H
+
+#include "slot.h"
+
+
+// ======================> crvision_rom_device
+
+class crvision_rom_device : public device_t,
+ public device_crvision_cart_interface
+{
+public:
+ // construction/destruction
+ crvision_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+ crvision_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start() {}
+ virtual void device_reset() {}
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom6k_device
+
+class crvision_rom6k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom6k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom8k_device
+
+class crvision_rom8k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom10k_device
+
+class crvision_rom10k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom10k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom12k_device
+
+class crvision_rom12k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom12k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom16k_device
+
+class crvision_rom16k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom18k_device
+
+class crvision_rom18k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom18k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+
+
+
+
+// device type definition
+extern const device_type CRVISION_ROM_4K;
+extern const device_type CRVISION_ROM_6K;
+extern const device_type CRVISION_ROM_8K;
+extern const device_type CRVISION_ROM_10K;
+extern const device_type CRVISION_ROM_12K;
+extern const device_type CRVISION_ROM_16K;
+extern const device_type CRVISION_ROM_18K;
+
+
+#endif
diff --git a/src/emu/bus/crvision/slot.c b/src/emu/bus/crvision/slot.c
new file mode 100644
index 00000000000..18bcab83019
--- /dev/null
+++ b/src/emu/bus/crvision/slot.c
@@ -0,0 +1,296 @@
+/***********************************************************************************************************
+
+ V-Tech CreatiVision cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type CRVISION_CART_SLOT = &device_creator<crvision_cart_slot_device>;
+
+//**************************************************************************
+// CreatiVision Cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_crvision_cart_interface - constructor
+//-------------------------------------------------
+
+device_crvision_cart_interface::device_crvision_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(NULL),
+ m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_crvision_cart_interface - destructor
+//-------------------------------------------------
+
+device_crvision_cart_interface::~device_crvision_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_crvision_cart_interface::rom_alloc(UINT32 size, const char *tag)
+{
+ if (m_rom == NULL)
+ {
+ astring tempstring(tag);
+ tempstring.cat(CRVSLOT_ROM_REGION_TAG);
+ m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// crvision_cart_slot_device - constructor
+//-------------------------------------------------
+crvision_cart_slot_device::crvision_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, CRVISION_CART_SLOT, "APF Cartridge Slot", tag, owner, clock, "crvision_cart_slot", __FILE__),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(CRV_4K)
+{
+}
+
+
+//-------------------------------------------------
+// crvision_cart_slot_device - destructor
+//-------------------------------------------------
+
+crvision_cart_slot_device::~crvision_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void crvision_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_crvision_cart_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void crvision_cart_slot_device::device_config_complete()
+{
+ // set brief and instance name
+ update_names();
+}
+
+
+//-------------------------------------------------
+// APF PCB
+//-------------------------------------------------
+
+struct crvision_slot
+{
+ int pcb_id;
+ const char *slot_option;
+};
+
+// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
+static const crvision_slot slot_list[] =
+{
+ { CRV_4K, "crv_rom4k" },
+ { CRV_6K, "crv_rom6k" },
+ { CRV_8K, "crv_rom8k" },
+ { CRV_10K, "crv_rom10k" },
+ { CRV_12K, "crv_rom12k" },
+ { CRV_16K, "crv_rom16k" },
+ { CRV_18K, "crv_rom18k" }
+};
+
+static int crvision_get_pcb_id(const char *slot)
+{
+ for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
+ {
+ if (!core_stricmp(slot_list[i].slot_option, slot))
+ return slot_list[i].pcb_id;
+ }
+
+ return 0;
+}
+
+static const char *crvision_get_slot(int type)
+{
+ for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
+ {
+ if (slot_list[i].pcb_id == type)
+ return slot_list[i].slot_option;
+ }
+
+ return "crv_rom4k";
+}
+
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+bool crvision_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
+
+ if (size > 0x4800)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF cart");
+ return IMAGE_INIT_FAIL;
+ }
+
+ m_cart->rom_alloc(size, tag());
+
+ if (software_entry() == NULL)
+ fread(m_cart->get_rom_base(), size);
+ else
+ memcpy(m_cart->get_rom_base(), get_software_region("rom"), size);
+
+ if (software_entry() == NULL)
+ {
+ m_type = CRV_4K;
+
+ switch (size)
+ {
+ case 0x4800:
+ m_type = CRV_18K;
+ break;
+ case 0x4000:
+ m_type = CRV_16K;
+ break;
+ case 0x3000:
+ m_type = CRV_12K;
+ break;
+ case 0x2800:
+ m_type = CRV_10K;
+ break;
+ case 0x2000:
+ m_type = CRV_8K;
+ break;
+ case 0x1800:
+ m_type = CRV_6K;
+ break;
+ case 0x1000:
+ default:
+ break;
+ }
+ }
+ else
+ {
+ const char *pcb_name = get_feature("slot");
+ if (pcb_name)
+ m_type = crvision_get_pcb_id(pcb_name);
+ }
+
+ printf("Type: %s\n", crvision_get_slot(m_type));
+
+ return IMAGE_INIT_PASS;
+ }
+
+ return IMAGE_INIT_PASS;
+}
+
+
+/*-------------------------------------------------
+ call softlist load
+ -------------------------------------------------*/
+
+bool crvision_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
+{
+ load_software_part_region(*this, swlist, swname, start_entry);
+ return TRUE;
+}
+
+
+/*-------------------------------------------------
+ get default card software
+ -------------------------------------------------*/
+
+void crvision_cart_slot_device::get_default_card_software(astring &result)
+{
+ if (open_image_file(mconfig().options()))
+ {
+ const char *slot_string = "crv_rom4k";
+ UINT32 size = core_fsize(m_file);
+ int type = CRV_4K;
+
+ switch (size)
+ {
+ case 0x4800:
+ type = CRV_18K;
+ break;
+ case 0x4000:
+ type = CRV_16K;
+ break;
+ case 0x3000:
+ type = CRV_12K;
+ break;
+ case 0x2800:
+ type = CRV_10K;
+ break;
+ case 0x2000:
+ type = CRV_8K;
+ break;
+ case 0x1800:
+ type = CRV_6K;
+ break;
+ case 0x1000:
+ default:
+ break;
+ }
+
+ slot_string = crvision_get_slot(type);
+
+ //printf("type: %s\n", slot_string);
+ clear();
+
+ result.cpy(slot_string);
+ return;
+ }
+
+ software_get_default_slot(result, "crv_rom4k");
+}
+
+/*-------------------------------------------------
+ read_rom
+ -------------------------------------------------*/
+
+READ8_MEMBER(crvision_cart_slot_device::read_rom40)
+{
+ if (m_cart)
+ return m_cart->read_rom40(space, offset);
+ else
+ return 0xff;
+}
+
+READ8_MEMBER(crvision_cart_slot_device::read_rom80)
+{
+ if (m_cart)
+ return m_cart->read_rom80(space, offset);
+ else
+ return 0xff;
+}
+
diff --git a/src/emu/bus/crvision/slot.h b/src/emu/bus/crvision/slot.h
new file mode 100644
index 00000000000..8029eba2752
--- /dev/null
+++ b/src/emu/bus/crvision/slot.h
@@ -0,0 +1,107 @@
+#ifndef __CRVISION_SLOT_H
+#define __CRVISION_SLOT_H
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+
+/* PCB */
+enum
+{
+ CRV_4K = 0,
+ CRV_6K,
+ CRV_8K,
+ CRV_10K,
+ CRV_12K,
+ CRV_16K,
+ CRV_18K
+};
+
+
+// ======================> device_crvision_cart_interface
+
+class device_crvision_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_crvision_cart_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_crvision_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40) { return 0xff; }
+ virtual DECLARE_READ8_MEMBER(read_rom80) { return 0xff; }
+
+ void rom_alloc(UINT32 size, const char *tag);
+ UINT8* get_rom_base() { return m_rom; }
+ UINT32 get_rom_size() { return m_rom_size; }
+
+protected:
+ // internal state
+ UINT8 *m_rom;
+ UINT32 m_rom_size;
+};
+
+
+// ======================> crvision_cart_slot_device
+
+class crvision_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ crvision_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~crvision_cart_slot_device();
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_config_complete();
+
+ // image-level overrides
+ virtual bool call_load();
+ virtual void call_unload() {}
+ virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry);
+
+ int get_type() { return m_type; }
+
+ virtual iodevice_t image_type() const { return IO_CARTSLOT; }
+ virtual bool is_readable() const { return 1; }
+ virtual bool is_writeable() const { return 0; }
+ virtual bool is_creatable() const { return 0; }
+ virtual bool must_be_loaded() const { return 0; }
+ virtual bool is_reset_on_load() const { return 1; }
+ virtual const option_guide *create_option_guide() const { return NULL; }
+ virtual const char *image_interface() const { return "crvision_cart"; }
+ virtual const char *file_extensions() const { return "bin,rom"; }
+
+ // slot interface overrides
+ virtual void get_default_card_software(astring &result);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+
+protected:
+
+ int m_type;
+ device_crvision_cart_interface* m_cart;
+};
+
+
+
+// device type definition
+extern const device_type CRVISION_CART_SLOT;
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define CRVSLOT_ROM_REGION_TAG ":cart:rom"
+
+#define MCFG_CRVISION_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
+ MCFG_DEVICE_ADD(_tag, CRVISION_CART_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+
+#endif
diff --git a/src/emu/bus/vectrex/rom.c b/src/emu/bus/vectrex/rom.c
new file mode 100644
index 00000000000..ceaa76c24c7
--- /dev/null
+++ b/src/emu/bus/vectrex/rom.c
@@ -0,0 +1,86 @@
+/***********************************************************************************************************
+
+
+ GCE Vectrex cart emulation
+
+ TODO:
+ - better understand how much SRAM is expected to be present by the homebrew using
+ this cart type and use a RAM array instead of the ROM region for writes
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// vectrex_rom_device - constructor
+//-------------------------------------------------
+
+const device_type VECTREX_ROM_STD = &device_creator<vectrex_rom_device>;
+const device_type VECTREX_ROM_64K = &device_creator<vectrex_rom64k_device>;
+const device_type VECTREX_ROM_SRAM = &device_creator<vectrex_sram_device>;
+
+
+vectrex_rom_device::vectrex_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_vectrex_cart_interface(mconfig, *this)
+{
+}
+
+vectrex_rom_device::vectrex_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, VECTREX_ROM_STD, "Vectrex Standard Carts", tag, owner, clock, "vectrex_rom", __FILE__),
+ device_vectrex_cart_interface(mconfig, *this)
+{
+}
+
+vectrex_rom64k_device::vectrex_rom64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : vectrex_rom_device(mconfig, VECTREX_ROM_64K, "Vectrex Carts w/ Bankswitch", tag, owner, clock, "vectrex_64k", __FILE__)
+{
+}
+
+vectrex_sram_device::vectrex_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : vectrex_rom_device(mconfig, VECTREX_ROM_SRAM, "Vectrex Carts w/ SRAM", tag, owner, clock, "vectrex_sram", __FILE__)
+{
+}
+
+
+void vectrex_rom64k_device::device_start()
+{
+ save_item(NAME(m_bank));
+}
+
+void vectrex_rom64k_device::device_reset()
+{
+ m_bank = 0;
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+READ8_MEMBER(vectrex_rom_device::read_rom)
+{
+ if (offset < m_rom_size)
+ return m_rom[offset];
+ else
+ return 0xff;
+}
+
+
+READ8_MEMBER(vectrex_rom64k_device::read_rom)
+{
+ return m_rom[(offset + m_bank * 0x8000) & (m_rom_size - 1)];
+}
+
+WRITE8_MEMBER(vectrex_rom64k_device::write_bank)
+{
+ m_bank = data >> 6;
+}
+
+WRITE8_MEMBER(vectrex_sram_device::write_ram)
+{
+ m_rom[offset & (m_rom_size - 1)] = data;
+}
diff --git a/src/emu/bus/vectrex/rom.h b/src/emu/bus/vectrex/rom.h
new file mode 100644
index 00000000000..c1cfbe866c8
--- /dev/null
+++ b/src/emu/bus/vectrex/rom.h
@@ -0,0 +1,65 @@
+#ifndef __VECTREX_ROM_H
+#define __VECTREX_ROM_H
+
+#include "slot.h"
+
+
+// ======================> vectrex_rom_device
+
+class vectrex_rom_device : public device_t,
+ public device_vectrex_cart_interface
+{
+public:
+ // construction/destruction
+ vectrex_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+ vectrex_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start() {}
+ virtual void device_reset() {}
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom);
+};
+
+// ======================> vectrex_rom64k_device
+
+class vectrex_rom64k_device : public vectrex_rom_device
+{
+public:
+ // construction/destruction
+ vectrex_rom64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom);
+ virtual DECLARE_WRITE8_MEMBER(write_bank);
+
+private:
+ int m_bank;
+};
+
+// ======================> vectrex_sram_device
+
+class vectrex_sram_device : public vectrex_rom_device
+{
+public:
+ // construction/destruction
+ vectrex_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_WRITE8_MEMBER(write_ram);
+};
+
+
+
+// device type definition
+extern const device_type VECTREX_ROM_STD;
+extern const device_type VECTREX_ROM_64K;
+extern const device_type VECTREX_ROM_SRAM;
+
+
+#endif
diff --git a/src/emu/bus/vectrex/slot.c b/src/emu/bus/vectrex/slot.c
new file mode 100644
index 00000000000..b44da803f74
--- /dev/null
+++ b/src/emu/bus/vectrex/slot.c
@@ -0,0 +1,280 @@
+/***********************************************************************************************************
+
+ GCE Vectrex cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type VECTREX_CART_SLOT = &device_creator<vectrex_cart_slot_device>;
+
+//**************************************************************************
+// Vectrex Cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_vectrex_cart_interface - constructor
+//-------------------------------------------------
+
+device_vectrex_cart_interface::device_vectrex_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(NULL),
+ m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_vectrex_cart_interface - destructor
+//-------------------------------------------------
+
+device_vectrex_cart_interface::~device_vectrex_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_vectrex_cart_interface::rom_alloc(UINT32 size, const char *tag)
+{
+ if (m_rom == NULL)
+ {
+ astring tempstring(tag);
+ tempstring.cat(VECSLOT_ROM_REGION_TAG);
+ m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vectrex_cart_slot_device - constructor
+//-------------------------------------------------
+vectrex_cart_slot_device::vectrex_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, VECTREX_CART_SLOT, "GCE Vectrex Cartridge Slot", tag, owner, clock, "vectrex_cart_slot", __FILE__),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(VECTREX_STD),
+ m_vec3d(VEC3D_NONE)
+{
+}
+
+
+//-------------------------------------------------
+// vectrex_cart_slot_device - destructor
+//-------------------------------------------------
+
+vectrex_cart_slot_device::~vectrex_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vectrex_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_vectrex_cart_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void vectrex_cart_slot_device::device_config_complete()
+{
+ // set brief and instance name
+ update_names();
+}
+
+
+//-------------------------------------------------
+// Vectrex PCB
+//-------------------------------------------------
+
+struct vectrex_slot
+{
+ int pcb_id;
+ const char *slot_option;
+};
+
+// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
+static const vectrex_slot slot_list[] =
+{
+ { VECTREX_STD, "vec_rom" },
+ { VECTREX_64K, "vec_rom64k" },
+ { VECTREX_SRAM, "vec_sram" }
+};
+
+#if 0
+static int vectrex_get_pcb_id(const char *slot)
+{
+ for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
+ {
+ if (!core_stricmp(slot_list[i].slot_option, slot))
+ return slot_list[i].pcb_id;
+ }
+
+ return 0;
+}
+#endif
+
+static const char *vectrex_get_slot(int type)
+{
+ for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
+ {
+ if (slot_list[i].pcb_id == type)
+ return slot_list[i].slot_option;
+ }
+
+ return "vec_rom";
+}
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+bool vectrex_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
+ UINT8 *ROM;
+
+ if (size > 0x10000)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return IMAGE_INIT_FAIL;
+ }
+
+ m_cart->rom_alloc((size < 0x1000) ? 0x1000 : size, tag());
+ ROM = m_cart->get_rom_base();
+
+ if (software_entry() == NULL)
+ fread(ROM, size);
+ else
+ memcpy(ROM, get_software_region("rom"), size);
+
+ // Verify the file is accepted by the Vectrex bios
+ if (memcmp(ROM, "g GCE", 5))
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid image");
+ return IMAGE_INIT_FAIL;
+ }
+
+ // determine type
+ m_type = VECTREX_STD;
+ if (!memcmp(ROM + 0x06, "SRAM", 4))
+ m_type = VECTREX_SRAM;
+ if (size > 0x8000)
+ m_type = VECTREX_64K;
+
+ //printf("Type: %s\n", vectrex_get_slot(m_type));
+
+ // determine 3D setup (to help video setup at machine_start)
+ if (!memcmp(ROM + 0x11, "NARROW", 6) && (ROM[0x39] == 0x0c))
+ m_vec3d = VEC3D_NARROW;
+
+ if (!memcmp(ROM + 0x11, "CRAZY COASTER", 13))
+ m_vec3d = VEC3D_CCOAST;
+
+ if (!memcmp(ROM + 0x11, "3D MINE STORM", 13))
+ m_vec3d = VEC3D_MINEST;
+
+ return IMAGE_INIT_PASS;
+ }
+
+ return IMAGE_INIT_PASS;
+}
+
+
+/*-------------------------------------------------
+ call softlist load
+ -------------------------------------------------*/
+
+bool vectrex_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
+{
+ load_software_part_region(*this, swlist, swname, start_entry);
+ return TRUE;
+}
+
+
+/*-------------------------------------------------
+ get default card software
+ -------------------------------------------------*/
+
+void vectrex_cart_slot_device::get_default_card_software(astring &result)
+{
+ if (open_image_file(mconfig().options()))
+ {
+ const char *slot_string = "vec_rom";
+ UINT32 size = core_fsize(m_file);
+ dynamic_buffer rom(size);
+ int type = VECTREX_STD;
+
+ core_fread(m_file, rom, size);
+
+ if (!memcmp(rom + 0x06, "SRAM", 4))
+ type = VECTREX_SRAM;
+ if (size > 0x8000)
+ type = VECTREX_64K;
+
+ slot_string = vectrex_get_slot(type);
+
+ //printf("type: %s\n", slot_string);
+ clear();
+
+ result.cpy(slot_string);
+ return;
+ }
+
+ software_get_default_slot(result, "vec_rom");
+}
+
+/*-------------------------------------------------
+ read_rom
+ -------------------------------------------------*/
+
+READ8_MEMBER(vectrex_cart_slot_device::read_rom)
+{
+ if (m_cart)
+ return m_cart->read_rom(space, offset);
+ else
+ return 0xff;
+}
+
+/*-------------------------------------------------
+ write_ram
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(vectrex_cart_slot_device::write_ram)
+{
+ if (m_cart)
+ m_cart->write_ram(space, offset, data);
+}
+
+/*-------------------------------------------------
+ write_bank
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(vectrex_cart_slot_device::write_bank)
+{
+ if (m_cart)
+ m_cart->write_bank(space, offset, data);
+}
+
+
diff --git a/src/emu/bus/vectrex/slot.h b/src/emu/bus/vectrex/slot.h
new file mode 100644
index 00000000000..912a2147e54
--- /dev/null
+++ b/src/emu/bus/vectrex/slot.h
@@ -0,0 +1,114 @@
+#ifndef __VECTREX_SLOT_H
+#define __VECTREX_SLOT_H
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+
+/* PCB */
+enum
+{
+ VECTREX_STD = 0,
+ VECTREX_64K,
+ VECTREX_SRAM
+};
+
+// 3D setup
+enum
+{
+ VEC3D_NONE = 0,
+ VEC3D_MINEST,
+ VEC3D_CCOAST,
+ VEC3D_NARROW
+};
+
+// ======================> device_vectrex_cart_interface
+
+class device_vectrex_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_vectrex_cart_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_vectrex_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_ram) {}
+ virtual DECLARE_WRITE8_MEMBER(write_bank) {}
+
+ void rom_alloc(UINT32 size, const char *tag);
+ UINT8* get_rom_base() { return m_rom; }
+ UINT32 get_rom_size() { return m_rom_size; }
+
+protected:
+ // internal state
+ UINT8 *m_rom;
+ UINT32 m_rom_size;
+};
+
+
+// ======================> vectrex_cart_slot_device
+
+class vectrex_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ vectrex_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~vectrex_cart_slot_device();
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_config_complete();
+
+ // image-level overrides
+ virtual bool call_load();
+ virtual void call_unload() {}
+ virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry);
+
+ int get_type() { return m_type; }
+ int get_vec3d() { return m_vec3d; }
+
+ virtual iodevice_t image_type() const { return IO_CARTSLOT; }
+ virtual bool is_readable() const { return 1; }
+ virtual bool is_writeable() const { return 0; }
+ virtual bool is_creatable() const { return 0; }
+ virtual bool must_be_loaded() const { return 0; }
+ virtual bool is_reset_on_load() const { return 1; }
+ virtual const option_guide *create_option_guide() const { return NULL; }
+ virtual const char *image_interface() const { return "vectrex_cart"; }
+ virtual const char *file_extensions() const { return "bin,gam,vec"; }
+
+ // slot interface overrides
+ virtual void get_default_card_software(astring &result);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom);
+ virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual DECLARE_WRITE8_MEMBER(write_bank);
+
+protected:
+
+ int m_type, m_vec3d;
+ device_vectrex_cart_interface* m_cart;
+};
+
+
+
+// device type definition
+extern const device_type VECTREX_CART_SLOT;
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define VECSLOT_ROM_REGION_TAG ":cart:rom"
+
+#define MCFG_VECTREX_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
+ MCFG_DEVICE_ADD(_tag, VECTREX_CART_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+
+#endif
diff --git a/src/mame/drivers/vectrex.c b/src/mame/drivers/vectrex.c
index fa6b9a704f6..647cb9493d4 100644
--- a/src/mame/drivers/vectrex.c
+++ b/src/mame/drivers/vectrex.c
@@ -13,17 +13,16 @@ Bruce Tomlin (hardware info)
#include "video/vector.h"
#include "machine/6522via.h"
#include "includes/vectrex.h"
-#include "imagedev/cartslot.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "machine/nvram.h"
static ADDRESS_MAP_START(vectrex_map, AS_PROGRAM, 8, vectrex_state )
- AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("bank1") AM_REGION("maincpu", 0)
+ AM_RANGE(0x0000, 0x7fff) AM_NOP // cart area, handled at machine_start
AM_RANGE(0xc800, 0xcbff) AM_RAM AM_MIRROR(0x0400) AM_SHARE("gce_vectorram")
AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(vectrex_via_r, vectrex_via_w)
- AM_RANGE(0xe000, 0xffff) AM_ROM
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("maincpu", 0)
ADDRESS_MAP_END
static INPUT_PORTS_START(vectrex)
@@ -84,6 +83,12 @@ static INPUT_PORTS_START(vectrex)
INPUT_PORTS_END
+static SLOT_INTERFACE_START(vectrex_cart)
+ SLOT_INTERFACE_INTERNAL("vec_rom", VECTREX_ROM_STD)
+ SLOT_INTERFACE_INTERNAL("vec_rom64k", VECTREX_ROM_64K)
+ SLOT_INTERFACE_INTERNAL("vec_sram", VECTREX_ROM_SRAM)
+SLOT_INTERFACE_END
+
static MACHINE_CONFIG_START( vectrex, vectrex_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809, XTAL_6MHz / 4)
@@ -97,7 +102,6 @@ static MACHINE_CONFIG_START( vectrex, vectrex_state )
MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 299)
MCFG_SCREEN_UPDATE_DRIVER(vectrex_state, screen_update_vectrex)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_DAC_ADD("dac")
@@ -118,28 +122,24 @@ static MACHINE_CONFIG_START( vectrex, vectrex_state )
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(vectrex_state, vectrex_via_irq))
/* cartridge */
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,gam,vec")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(vectrex_state,vectrex_cart)
- MCFG_CARTSLOT_INTERFACE("vectrex_cart")
+ MCFG_VECTREX_CARTRIDGE_ADD("cartslot", vectrex_cart, NULL)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","vectrex")
MACHINE_CONFIG_END
ROM_START(vectrex)
- ROM_REGION(0x18000,"maincpu", 0)
+ ROM_REGION(0x2000,"maincpu", 0)
ROM_SYSTEM_BIOS(0, "bios0", "exec rom")
- ROMX_LOAD("exec_rom.bin", 0xe000, 0x2000, CRC(ba13fb57) SHA1(65d07426b520ddd3115d40f255511e0fd2e20ae7), ROM_BIOS(1) )
+ ROMX_LOAD("exec_rom.bin", 0x0000, 0x2000, CRC(ba13fb57) SHA1(65d07426b520ddd3115d40f255511e0fd2e20ae7), ROM_BIOS(1) )
ROM_SYSTEM_BIOS(1, "bios1", "exec rom intl 284001-1")
- ROMX_LOAD("exec_rom_intl_284001-1.bin", 0xe000, 0x2000, CRC(6d2bd167) SHA1(77a220d5d98846b606dff608f7b5d00183ec3bab), ROM_BIOS(2) )
+ ROMX_LOAD("exec_rom_intl_284001-1.bin", 0x0000, 0x2000, CRC(6d2bd167) SHA1(77a220d5d98846b606dff608f7b5d00183ec3bab), ROM_BIOS(2) )
// The following fastboots are listed here for reference and documentation
// ROM_SYSTEM_BIOS(2, "bios2", "us-fastboot hack")
-// ROMX_LOAD("us-fastboot.bin", 0xe000, 0x2000, CRa6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(3) )
+// ROMX_LOAD("us-fastboot.bin", 0x0000, 0x2000, CRa6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(3) )
// ROM_SYSTEM_BIOS(3, "bios3", "intl-fastboot hack")
-// ROMX_LOAD("intl-fastboot.bin", 0xe000, 0x2000, CRC(71dcf0f4) SHA1(2a257c5111f5cee841bd14acaa9df6496aaf3d8b), ROM_BIOS(4) )
+// ROMX_LOAD("intl-fastboot.bin", 0x0000, 0x2000, CRC(71dcf0f4) SHA1(2a257c5111f5cee841bd14acaa9df6496aaf3d8b), ROM_BIOS(4) )
ROM_END
@@ -218,7 +218,7 @@ static MACHINE_CONFIG_DERIVED( raaspec, vectrex )
MCFG_DEVICE_MODIFY("via6522_0")
MCFG_VIA6522_READPB_HANDLER(READ8(vectrex_state, vectrex_s1_via_pb_r))
- MCFG_DEVICE_REMOVE("cart")
+ MCFG_DEVICE_REMOVE("cartslot")
MACHINE_CONFIG_END
ROM_START(raaspec)
diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h
index 4fd8e69cbf4..aecf543e476 100644
--- a/src/mame/includes/vectrex.h
+++ b/src/mame/includes/vectrex.h
@@ -12,6 +12,8 @@
#include "sound/ay8910.h"
#include "video/vector.h"
+#include "bus/vectrex/slot.h"
+#include "bus/vectrex/rom.h"
#define NVECT 10000
@@ -44,6 +46,7 @@ public:
m_dac(*this, "dac"),
m_ay8912(*this, "ay8912"),
m_vector(*this, "vector"),
+ m_cart(*this, "cartslot"),
m_io_contr1x(*this, "CONTR1X"),
m_io_contr1y(*this, "CONTR1Y"),
m_io_contr2x(*this, "CONTR2X"),
@@ -54,10 +57,10 @@ public:
m_io_lpenx(*this, "LPENX"),
m_io_lpeny(*this, "LPENY"),
m_io_coin(*this, "COIN"),
- m_screen(*this, "screen") { }
+ m_screen(*this, "screen")
+ { }
required_shared_ptr<UINT8> m_gce_vectorram;
- int m_64k_cart;
int m_imager_status;
UINT32 m_beam_color;
unsigned char m_via_out[2];
@@ -99,6 +102,7 @@ public:
DECLARE_WRITE8_MEMBER(raaspec_led_w);
DECLARE_DRIVER_INIT(vectrex);
virtual void video_start();
+ virtual void machine_start();
DECLARE_VIDEO_START(raaspec);
UINT32 screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
@@ -126,6 +130,7 @@ protected:
required_device<dac_device> m_dac;
required_device<ay8910_device> m_ay8912;
required_device<vector_device> m_vector;
+ optional_device<vectrex_cart_slot_device> m_cart;
optional_ioport m_io_contr1x;
optional_ioport m_io_contr1y;
optional_ioport m_io_contr2x;
@@ -142,7 +147,6 @@ protected:
void vectrex_multiplexer(int mux);
void vectrex_add_point(int x, int y, rgb_t color, int intensity);
void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);
- int vectrex_verify_cart(char *data);
};
#endif /* VECTREX_H_ */
diff --git a/src/mame/machine/vectrex.c b/src/mame/machine/vectrex.c
index 04a198f1a13..4a5bbc5fb08 100644
--- a/src/mame/machine/vectrex.c
+++ b/src/mame/machine/vectrex.c
@@ -42,19 +42,9 @@ static const double minestorm_3d_angles[3] = {0, 0.1692, 0.2086};
static const double narrow_escape_angles[3] = {0, 0.1631, 0.3305};
static const double crazy_coaster_angles[3] = {0, 0.1631, 0.3305};
-
static const double unknown_game_angles[3] = {0,0.16666666, 0.33333333};
-int vectrex_state::vectrex_verify_cart(char *data)
-{
- /* Verify the file is accepted by the Vectrex bios */
- if (!memcmp(data,"g GCE", 5))
- return IMAGE_VERIFY_PASS;
- else
- return IMAGE_VERIFY_FAIL;
-}
-
void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
@@ -87,71 +77,6 @@ void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param
}
-/*********************************************************************
-
- ROM load and id functions
-
-*********************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER(vectrex_state,vectrex_cart)
-{
- UINT8 *mem = memregion("maincpu")->base();
- if (image.software_entry() == NULL)
- {
- image.fread( mem, 0x8000);
- if (image.length() > 0x8000)
- {
- image.fread( mem+0x10000, 0x8000);
- m_64k_cart = 1;
- }
- } else {
- int size = image.get_software_region_length("rom");
- memcpy(mem, image.get_software_region("rom"), size);
- }
-
- /* check image! */
- if (vectrex_verify_cart((char*)mem) == IMAGE_VERIFY_FAIL)
- {
- logerror("Invalid image!\n");
- return IMAGE_INIT_FAIL;
- }
-
- if (memcmp(mem + 0x06,"SRAM",4)) {
- m_maincpu->space(AS_PROGRAM).unmap_write(0x0000, 0x7fff);
- }
-
- /* If VIA T2 starts, reset refresh timer.
- This is the best strategy for most games. */
- m_reset_refresh = 1;
-
- m_imager_angles = narrow_escape_angles;
-
- /* let's do this 3D detection with a strcmp using data inside the cart images */
- /* slightly prettier than having to hardcode CRCs */
-
- /* handle 3D Narrow Escape but skip the 2-d hack of it from Fred Taft */
- if (!memcmp(mem + 0x11,"NARROW",6) && (((char*)mem)[0x39] == 0x0c))
- {
- m_imager_angles = narrow_escape_angles;
- }
-
- if (!memcmp(mem + 0x11,"CRAZY COASTER", 13))
- {
- m_imager_angles = crazy_coaster_angles;
- }
-
- if (!memcmp(mem + 0x11,"3D MINE STORM", 13))
- {
- m_imager_angles = minestorm_3d_angles;
-
- /* Don't reset T2 each time it's written.
- This would cause jerking in mine3. */
- m_reset_refresh = 0;
- }
-
- return IMAGE_INIT_PASS;
-}
-
/*********************************************************************
@@ -377,12 +302,9 @@ WRITE8_MEMBER(vectrex_state::vectrex_psg_port_w)
DRIVER_INIT_MEMBER(vectrex_state,vectrex)
{
- int i;
-
- m_64k_cart = 0;
m_imager_angles = unknown_game_angles;
m_beam_color = rgb_t::white;
- for (i=0; i<ARRAY_LENGTH(m_imager_colors); i++)
+ for (int i = 0; i < ARRAY_LENGTH(m_imager_colors); i++)
m_imager_colors[i] = rgb_t::white;
/*
@@ -394,3 +316,39 @@ DRIVER_INIT_MEMBER(vectrex_state,vectrex)
m_gce_vectorram[0x7e] = machine().rand() | 1;
m_gce_vectorram[0x7f] = machine().rand() | 1;
}
+
+void vectrex_state::machine_start()
+{
+ if (m_cart && m_cart->exists())
+ {
+ // install cart accesses
+ if (m_cart->get_type() == VECTREX_SRAM)
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart), write8_delegate(FUNC(vectrex_cart_slot_device::write_ram),(vectrex_cart_slot_device*)m_cart));
+ else
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart));
+
+ // setup 3d imager and refresh timer
+
+ // If VIA T2 starts, reset refresh timer. This is the best strategy for most games.
+ m_reset_refresh = 1;
+ m_imager_angles = narrow_escape_angles;
+
+ // let's do this 3D detection
+ switch (m_cart->get_vec3d())
+ {
+ case VEC3D_MINEST:
+ m_imager_angles = minestorm_3d_angles;
+ // Don't reset T2 each time it's written. This would cause jerking in mine3.
+ m_reset_refresh = 0;
+ break;
+ case VEC3D_CCOAST:
+ m_imager_angles = crazy_coaster_angles;
+ break;
+ case VEC3D_NARROW:
+ m_imager_angles = narrow_escape_angles;
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index abcf39b5498..a5fe946a32c 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -575,17 +575,21 @@ MACHINES += PCCARD
#BUSES += ABCKB
#BUSES += ADAM
#BUSES += ADAMNET
+#BUSES += APF
+#BUSES += ARCADIA
#BUSES += BML3
#BUSES += BW2
#BUSES += C64
#BUSES += CBM2
#BUSES += CBMIEC
BUSES += CENTRONICS
+#BUSES += CHANNELF
#BUSES += COCO
#BUSES += COLECO
#BUSES += COMPUCOLOR
#BUSES += COMX35
#BUSES += CPC
+#BUSES += CRVISION
#BUSES += DMV
#BUSES += ECBBUS
#BUSES += ECONET
@@ -596,6 +600,7 @@ BUSES += CENTRONICS
BUSES += GENERIC
#BUSES += IEEE488
#BUSES += IMI7000
+#BUSES += INTV
#BUSES += IQ151
BUSES += ISA
#BUSES += ISBX
@@ -607,6 +612,7 @@ BUSES += ISA
BUSES += NEOGEO
#BUSES += NES
#BUSES += NUBUS
+#BUSES += O2
#BUSES += ORICEXT
#BUSES += PCE
#BUSES += PCI
@@ -627,8 +633,10 @@ BUSES += SCSI
#BUSES += TI99PEB
#BUSES += TVC
#BUSES += VBOY
+#BUSES += VC4000
#BUSES += VCS
#BUSES += VCS_CTRL
+BUSES += VECTREX
#BUSES += VIC10
#BUSES += VIC20
#BUSES += VIDBRAIN
@@ -636,6 +644,7 @@ BUSES += SCSI
#BUSES += VTECH_IOEXP
#BUSES += VTECH_MEMEXP
#BUSES += WANGPC
+#BUSES += WSWAN
#BUSES += X68K
#BUSES += Z88
#BUSES += ZORRO
diff --git a/src/mame/video/vectrex.c b/src/mame/video/vectrex.c
index 053a036351f..60091e7a7ae 100644
--- a/src/mame/video/vectrex.c
+++ b/src/mame/video/vectrex.c
@@ -330,10 +330,8 @@ WRITE8_MEMBER(vectrex_state::v_via_pb_w)
}
/* Cartridge bank-switching */
- if (m_64k_cart && ((data ^ m_via_out[PORTB]) & 0x40))
- {
- membank("bank1")->set_base(memregion("maincpu")->base() + ((data & 0x40) ? 0x10000 : 0x0000));
- }
+ if (m_cart && ((data ^ m_via_out[PORTB]) & 0x40))
+ m_cart->write_bank(space, 0, data);
/* Sound */
if (data & 0x10)
diff --git a/src/mess/drivers/crvision.c b/src/mess/drivers/crvision.c
index 1acab4cb555..269d832135f 100644
--- a/src/mess/drivers/crvision.c
+++ b/src/mess/drivers/crvision.c
@@ -699,6 +699,12 @@ void crvision_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
+
+ if (m_cart->exists())
+ {
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
+ }
}
void crvision_pal_state::machine_start()
@@ -706,6 +712,12 @@ void crvision_pal_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
+
+ if (m_cart->exists())
+ {
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
+ }
}
/*-------------------------------------------------
@@ -717,122 +729,29 @@ void laser2001_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
-}
-
-/***************************************************************************
- CARTRIDGE
-***************************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER( crvision_state, crvision_cart )
-{
- UINT32 size;
- dynamic_buffer temp_copy;
- UINT8 *mem = memregion(M6502_TAG)->base();
- address_space &program = m_maincpu->space(AS_PROGRAM);
-
- if (image.software_entry() == NULL)
+
+ if (m_cart->exists())
{
- size = image.length();
- temp_copy.resize(size);
- image.fread( temp_copy, size);
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
}
- else
- {
- size= image.get_software_region_length("rom");
- temp_copy.resize(size);
- memcpy(temp_copy, image.get_software_region("rom"), size);
- }
-
- switch (size)
- {
- case 0x1000: // 4K
- memcpy(mem + 0x9000, temp_copy, 0x1000); // load 4KB at 0x9000
- memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror 4KB at 0xb000
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x1800: // 6K
- memcpy(mem + 0x9000, temp_copy, 0x1000); // load lower 4KB at 0x9000
- memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror lower 4KB at 0xb000
- memcpy(mem + 0x8000, temp_copy + 0x1000, 0x0800); // load higher 2KB at 0x8000
- memcpy(mem + 0x8800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0x8800
- memcpy(mem + 0xa000, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa000
- memcpy(mem + 0xa800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa800
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x2000: // 8K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror 8KB at 0xa000
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x2800: // 10K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000
- memcpy(mem + 0x4000, temp_copy + 0x2000, 0x0800); // load higher 2KB at 0x4000
- memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800
- memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000
- memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800
- memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000
- memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800
- memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000
- memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x3000: // 12K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000
- memcpy(mem + 0x4000, temp_copy + 0x2000, 0x1000); // load higher 4KB at 0x4000
- memcpy(mem + 0x5000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x5000
- memcpy(mem + 0x6000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x6000
- memcpy(mem + 0x7000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x7000
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x4000: // 16K
- memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000
- memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x4800: // 18K
- memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000
- memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000
- memcpy(mem + 0x4000, temp_copy + 0x4000, 0x0800); // load higher 2KB at 0x4000
- memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800
- memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000
- memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800
- memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000
- memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800
- memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000
- memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- default:
- auto_free(machine(), temp_copy);
- return IMAGE_INIT_FAIL;
- }
-
- membank(BANK_ROM1)->configure_entry(0, mem + 0x8000);
- membank(BANK_ROM1)->set_entry(0);
-
- membank(BANK_ROM2)->configure_entry(0, mem + 0x4000);
- membank(BANK_ROM2)->set_entry(0);
-
- return IMAGE_INIT_PASS;
}
+
/***************************************************************************
MACHINE DRIVERS
***************************************************************************/
+static SLOT_INTERFACE_START(crvision_cart)
+ SLOT_INTERFACE_INTERNAL("crv_rom4k", CRVISION_ROM_4K)
+ SLOT_INTERFACE_INTERNAL("crv_rom6k", CRVISION_ROM_6K)
+ SLOT_INTERFACE_INTERNAL("crv_rom8k", CRVISION_ROM_8K)
+ SLOT_INTERFACE_INTERNAL("crv_rom10k", CRVISION_ROM_10K)
+ SLOT_INTERFACE_INTERNAL("crv_rom12k", CRVISION_ROM_12K)
+ SLOT_INTERFACE_INTERNAL("crv_rom16k", CRVISION_ROM_16K)
+ SLOT_INTERFACE_INTERNAL("crv_rom18k", CRVISION_ROM_18K)
+SLOT_INTERFACE_END
+
/*-------------------------------------------------
MACHINE_CONFIG_START( creativision, crvision_state )
-------------------------------------------------*/
@@ -872,11 +791,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state )
MCFG_SOUND_ROUTE(1, "mono", 0.25)
// cartridge
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
- MCFG_CARTSLOT_MANDATORY
- MCFG_CARTSLOT_INTERFACE("crvision_cart")
- MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart)
+ MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL)
// internal ram
MCFG_RAM_ADD(RAM_TAG)
@@ -884,7 +799,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state )
MCFG_RAM_EXTRA_OPTIONS("15K") // 16K expansion (lower 14K available only, upper 2K shared with BIOS ROM)
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list","crvision")
+ MCFG_SOFTWARE_LIST_ADD("cart_list", "crvision")
MACHINE_CONFIG_END
/*-------------------------------------------------
@@ -958,10 +873,7 @@ static MACHINE_CONFIG_START( lasr2001, laser2001_state )
MCFG_SOUND_ROUTE(1, "mono", 0.25)
// cartridge
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
- MCFG_CARTSLOT_INTERFACE("crvision_cart")
- MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart)
+ MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL)
// internal ram
MCFG_RAM_ADD(RAM_TAG)
diff --git a/src/mess/includes/crvision.h b/src/mess/includes/crvision.h
index 2c1775eb351..89ee61b7f3f 100644
--- a/src/mess/includes/crvision.h
+++ b/src/mess/includes/crvision.h
@@ -6,11 +6,12 @@
#include "emu.h"
#include "cpu/m6502/m6502.h"
-#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "machine/6821pia.h"
#include "machine/buffer.h"
#include "bus/centronics/ctronics.h"
+#include "bus/crvision/slot.h"
+#include "bus/crvision/rom.h"
#include "machine/ram.h"
#include "sound/sn76496.h"
#include "sound/wave.h"
@@ -35,6 +36,7 @@ public:
m_pia(*this, PIA6821_TAG),
m_psg(*this, SN76489_TAG),
m_cassette(*this, "cassette"),
+ m_cart(*this, "cartslot"),
m_cent_data_out(*this, "cent_data_out"),
m_ram(*this, RAM_TAG)
{
@@ -44,6 +46,7 @@ public:
required_device<pia6821_device> m_pia;
required_device<sn76496_base_device> m_psg;
required_device<cassette_image_device> m_cassette;
+ required_device<crvision_cart_slot_device> m_cart;
required_device<output_latch_device> m_cent_data_out;
required_device<ram_device> m_ram;
@@ -53,7 +56,6 @@ public:
DECLARE_READ8_MEMBER( pia_pa_r );
DECLARE_READ8_MEMBER( pia_pb_r );
DECLARE_INPUT_CHANGED_MEMBER( trigger_nmi );
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( crvision_cart );
UINT8 read_keyboard(int pa);
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 39e8aa225c5..a355f631bd3 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -582,6 +582,7 @@ BUSES += COLECO
BUSES += COMPUCOLOR
BUSES += COMX35
BUSES += CPC
+BUSES += CRVISION
BUSES += DMV
BUSES += ECBBUS
BUSES += ECONET
@@ -628,6 +629,7 @@ BUSES += VBOY
BUSES += VC4000
BUSES += VCS
BUSES += VCS_CTRL
+BUSES += VECTREX
BUSES += VIC10
BUSES += VIC20
BUSES += VIDBRAIN