diff options
author | 2014-10-10 15:28:46 +0000 | |
---|---|---|
committer | 2014-10-10 15:28:46 +0000 | |
commit | f0fad04eb68b545e6075f3b65d6d4db8c03e4025 (patch) | |
tree | e1a52b526fd0a7e306fd5cfe9adac62976555823 /src | |
parent | 4de494250b26fc201171ac3b2b3c24f25ac08aab (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.mak | 24 | ||||
-rw-r--r-- | src/emu/bus/crvision/rom.c | 138 | ||||
-rw-r--r-- | src/emu/bus/crvision/rom.h | 114 | ||||
-rw-r--r-- | src/emu/bus/crvision/slot.c | 296 | ||||
-rw-r--r-- | src/emu/bus/crvision/slot.h | 107 | ||||
-rw-r--r-- | src/emu/bus/vectrex/rom.c | 86 | ||||
-rw-r--r-- | src/emu/bus/vectrex/rom.h | 65 | ||||
-rw-r--r-- | src/emu/bus/vectrex/slot.c | 280 | ||||
-rw-r--r-- | src/emu/bus/vectrex/slot.h | 114 | ||||
-rw-r--r-- | src/mame/drivers/vectrex.c | 30 | ||||
-rw-r--r-- | src/mame/includes/vectrex.h | 10 | ||||
-rw-r--r-- | src/mame/machine/vectrex.c | 116 | ||||
-rw-r--r-- | src/mame/mame.mak | 9 | ||||
-rw-r--r-- | src/mame/video/vectrex.c | 6 | ||||
-rw-r--r-- | src/mess/drivers/crvision.c | 148 | ||||
-rw-r--r-- | src/mess/includes/crvision.h | 6 | ||||
-rw-r--r-- | src/mess/mess.mak | 2 |
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 |