summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/vboy
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
committer Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
commitf88cefad27a1737c76e09d99c9fb43e173506081 (patch)
tree2d8167d03579c46e226471747eb4407bd00ed6fa /src/devices/bus/vboy
parente92ac9e0fa8e99869894bea00589bbb526be30aa (diff)
Move all devices into separate part of src tree (nw)
Diffstat (limited to 'src/devices/bus/vboy')
-rw-r--r--src/devices/bus/vboy/rom.c61
-rw-r--r--src/devices/bus/vboy/rom.h47
-rw-r--r--src/devices/bus/vboy/slot.c273
-rw-r--r--src/devices/bus/vboy/slot.h115
4 files changed, 496 insertions, 0 deletions
diff --git a/src/devices/bus/vboy/rom.c b/src/devices/bus/vboy/rom.c
new file mode 100644
index 00000000000..587be158610
--- /dev/null
+++ b/src/devices/bus/vboy/rom.c
@@ -0,0 +1,61 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+
+ Nintendo Virtual Boy cart emulation
+
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// vboy_rom_device - constructor
+//-------------------------------------------------
+
+const device_type VBOY_ROM_STD = &device_creator<vboy_rom_device>;
+const device_type VBOY_ROM_EEPROM = &device_creator<vboy_eeprom_device>;
+
+
+vboy_rom_device::vboy_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_vboy_cart_interface( mconfig, *this )
+{
+}
+
+vboy_rom_device::vboy_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, VBOY_ROM_STD, "Nintendo Virtual Boy Carts", tag, owner, clock, "vboy_rom", __FILE__),
+ device_vboy_cart_interface( mconfig, *this )
+{
+}
+
+vboy_eeprom_device::vboy_eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : vboy_rom_device(mconfig, VBOY_ROM_EEPROM, "Nintendo Virtual Boy Carts + EEPROM", tag, owner, clock, "vboy_eeprom", __FILE__)
+{
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+READ32_MEMBER(vboy_rom_device::read_cart)
+{
+ return m_rom[offset & m_rom_mask];
+}
+
+
+READ32_MEMBER(vboy_eeprom_device::read_eeprom)
+{
+ return m_eeprom[offset];
+}
+
+
+WRITE32_MEMBER(vboy_eeprom_device::write_eeprom)
+{
+ COMBINE_DATA(&m_eeprom[offset]);
+}
diff --git a/src/devices/bus/vboy/rom.h b/src/devices/bus/vboy/rom.h
new file mode 100644
index 00000000000..0f26468892b
--- /dev/null
+++ b/src/devices/bus/vboy/rom.h
@@ -0,0 +1,47 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+#ifndef __VBOY_ROM_H
+#define __VBOY_ROM_H
+
+#include "slot.h"
+
+
+// ======================> vboy_rom_device
+
+class vboy_rom_device : public device_t,
+ public device_vboy_cart_interface
+{
+public:
+ // construction/destruction
+ vboy_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);
+ vboy_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start() {}
+
+ // reading and writing
+ virtual DECLARE_READ32_MEMBER(read_cart);
+};
+
+// ======================> vboy_eeprom_device
+
+class vboy_eeprom_device : public vboy_rom_device
+{
+public:
+ // construction/destruction
+ vboy_eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ32_MEMBER(read_eeprom);
+ virtual DECLARE_WRITE32_MEMBER(write_eeprom);
+};
+
+
+
+// device type definition
+extern const device_type VBOY_ROM_STD;
+extern const device_type VBOY_ROM_EEPROM;
+
+
+
+#endif
diff --git a/src/devices/bus/vboy/slot.c b/src/devices/bus/vboy/slot.c
new file mode 100644
index 00000000000..da00aeaca04
--- /dev/null
+++ b/src/devices/bus/vboy/slot.c
@@ -0,0 +1,273 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+ Nintendo Virtual Boy cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type VBOY_CART_SLOT = &device_creator<vboy_cart_slot_device>;
+
+//**************************************************************************
+// vboy cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_vboy_cart_interface - constructor
+//-------------------------------------------------
+
+device_vboy_cart_interface::device_vboy_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(NULL),
+ m_rom_size(0),
+ m_rom_mask(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_vboy_cart_interface - destructor
+//-------------------------------------------------
+
+device_vboy_cart_interface::~device_vboy_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_vboy_cart_interface::rom_alloc(UINT32 size, const char *tag)
+{
+ if (m_rom == NULL)
+ {
+ m_rom = (UINT32 *)device().machine().memory().region_alloc(std::string(tag).append(VBOYSLOT_ROM_REGION_TAG).c_str(), size, 4, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size/4;
+ m_rom_mask = m_rom_size - 1;
+ }
+}
+
+
+//-------------------------------------------------
+// ram_alloc - alloc the space for the ram
+//-------------------------------------------------
+
+void device_vboy_cart_interface::eeprom_alloc(UINT32 size)
+{
+ m_eeprom.resize(size/sizeof(UINT32));
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vboy_cart_slot_device - constructor
+//-------------------------------------------------
+vboy_cart_slot_device::vboy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, VBOY_CART_SLOT, "Nintendo Virtual Boy Cartridge Slot", tag, owner, clock, "vboy_cart_slot", __FILE__),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(VBOY_STD)
+{
+}
+
+
+//-------------------------------------------------
+// vboy_cart_slot_device - destructor
+//-------------------------------------------------
+
+vboy_cart_slot_device::~vboy_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vboy_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_vboy_cart_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void vboy_cart_slot_device::device_config_complete()
+{
+ // set brief and instance name
+ update_names();
+}
+
+
+//-------------------------------------------------
+// vboy PCB
+//-------------------------------------------------
+
+struct vboy_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 vboy_slot slot_list[] =
+{
+ { VBOY_STD, "vb_rom" },
+ { VBOY_EEPROM, "vb_eeprom" }
+};
+
+static int vboy_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;
+}
+
+#if 0
+static const char *vboy_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 "vb_rom";
+}
+#endif
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+bool vboy_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ UINT8 *ROM;
+ UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom");
+ bool has_eeprom = (software_entry() != NULL) && get_software_region("eeprom");
+
+ if (len > 0x200000)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return IMAGE_INIT_FAIL;
+ }
+
+ // always alloc 0x200000 so to be able to directly map the region
+ // to the address map (speeding up emulation a bit)
+ m_cart->rom_alloc(0x200000, tag());
+ if (has_eeprom)
+ m_cart->eeprom_alloc(get_software_region_length("eeprom"));
+
+ ROM = (UINT8 *)m_cart->get_rom_base();
+
+ if (software_entry() == NULL)
+ fread(ROM, len);
+ else
+ memcpy(ROM, get_software_region("rom"), len);
+
+ if (len < 0x080000) { memcpy(ROM + 0x040000, ROM, 0x040000); }
+ if (len < 0x100000) { memcpy(ROM + 0x080000, ROM, 0x080000); }
+ if (len < 0x200000) { memcpy(ROM + 0x100000, ROM, 0x100000); }
+
+ if (software_entry() == NULL)
+ m_type = vboy_get_pcb_id("vb_rom");
+ else
+ {
+ const char *pcb_name = get_feature("slot");
+ if (pcb_name)
+ m_type = vboy_get_pcb_id(pcb_name);
+ }
+
+ //printf("Type: %s\n", vboy_get_slot(m_type));
+
+ return IMAGE_INIT_PASS;
+ }
+
+ return IMAGE_INIT_PASS;
+}
+
+
+/*-------------------------------------------------
+ call_unload
+ -------------------------------------------------*/
+
+void vboy_cart_slot_device::call_unload()
+{
+ if (m_cart && m_cart->get_eeprom_base() && m_cart->get_eeprom_size())
+ battery_save(m_cart->get_eeprom_base(), m_cart->get_eeprom_size() * 4);
+}
+
+/*-------------------------------------------------
+ call softlist load
+ -------------------------------------------------*/
+
+bool vboy_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 vboy_cart_slot_device::get_default_card_software(std::string &result)
+{
+ software_get_default_slot(result, "vb_rom");
+}
+
+/*-------------------------------------------------
+ read
+ -------------------------------------------------*/
+
+READ32_MEMBER(vboy_cart_slot_device::read_cart)
+{
+ if (m_cart)
+ return m_cart->read_cart(space, offset, mem_mask);
+ else
+ return 0xffffffff;
+}
+
+/*-------------------------------------------------
+ read
+ -------------------------------------------------*/
+
+READ32_MEMBER(vboy_cart_slot_device::read_eeprom)
+{
+ if (m_cart)
+ return m_cart->read_eeprom(space, offset, mem_mask);
+ else
+ return 0xffffffff;
+}
+
+/*-------------------------------------------------
+ write
+ -------------------------------------------------*/
+
+WRITE32_MEMBER(vboy_cart_slot_device::write_eeprom)
+{
+ if (m_cart)
+ m_cart->write_eeprom(space, offset, data, mem_mask);
+}
diff --git a/src/devices/bus/vboy/slot.h b/src/devices/bus/vboy/slot.h
new file mode 100644
index 00000000000..e865eece213
--- /dev/null
+++ b/src/devices/bus/vboy/slot.h
@@ -0,0 +1,115 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+#ifndef __VBOY_SLOT_H
+#define __VBOY_SLOT_H
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+
+/* PCB */
+enum
+{
+ VBOY_STD = 0,
+ VBOY_EEPROM
+};
+
+
+// ======================> device_vboy_cart_interface
+
+class device_vboy_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_vboy_cart_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_vboy_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ32_MEMBER(read_cart) { return 0xffffffff; }
+ virtual DECLARE_READ32_MEMBER(read_eeprom) { return 0xffffffff; }
+ virtual DECLARE_WRITE32_MEMBER(write_eeprom) {}
+
+ void rom_alloc(UINT32 size, const char *tag);
+ void eeprom_alloc(UINT32 size);
+ UINT32* get_rom_base() { return m_rom; }
+ UINT32* get_eeprom_base() { return &m_eeprom[0]; }
+ UINT32 get_rom_size() { return m_rom_size; }
+ UINT32 get_eeprom_size() { return m_eeprom.size(); }
+
+ void save_eeprom() { device().save_item(NAME(m_eeprom)); }
+
+protected:
+ // internal state
+ UINT32 *m_rom;
+ UINT32 m_rom_size;
+ UINT32 m_rom_mask;
+ std::vector<UINT32> m_eeprom;
+};
+
+
+// ======================> vboy_cart_slot_device
+
+class vboy_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ vboy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~vboy_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_cart_type(UINT8 *ROM, UINT32 len);
+
+ void save_eeprom() { if (m_cart && m_cart->get_eeprom_size()) m_cart->save_eeprom(); }
+
+ 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 1; }
+ 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 "vboy_cart"; }
+ virtual const char *file_extensions() const { return "vb,bin"; }
+
+ // slot interface overrides
+ virtual void get_default_card_software(std::string &result);
+
+ // reading and writing
+ virtual DECLARE_READ32_MEMBER(read_cart);
+ virtual DECLARE_READ32_MEMBER(read_eeprom);
+ virtual DECLARE_WRITE32_MEMBER(write_eeprom);
+
+protected:
+
+ int m_type;
+ device_vboy_cart_interface* m_cart;
+};
+
+
+
+// device type definition
+extern const device_type VBOY_CART_SLOT;
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define VBOYSLOT_ROM_REGION_TAG ":cart:rom"
+
+#define MCFG_VBOY_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
+ MCFG_DEVICE_ADD(_tag, VBOY_CART_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
+#endif