diff options
Diffstat (limited to 'src/devices/bus/generic/slot.cpp')
-rw-r--r-- | src/devices/bus/generic/slot.cpp | 172 |
1 files changed, 105 insertions, 67 deletions
diff --git a/src/devices/bus/generic/slot.cpp b/src/devices/bus/generic/slot.cpp index 557e1d8dcef..f2e86809a66 100644 --- a/src/devices/bus/generic/slot.cpp +++ b/src/devices/bus/generic/slot.cpp @@ -18,12 +18,20 @@ e.g. APF cart slot device for an example of a simple device with multiple pcbs supported) + TODO: + - add support for hotswapping (ie. don't force a hard reset), it's doable for + generic rom cartridges, but then you still can't swap from empty slot + ***********************************************************************************************************/ #include "emu.h" #include "slot.h" +#define VERBOSE 1 +#include "logmacro.h" + + //************************************************************************** // GLOBAL VARIABLES //************************************************************************** @@ -32,98 +40,127 @@ DEFINE_DEVICE_TYPE(GENERIC_SOCKET, generic_socket_device, "generic_socket", "Gen DEFINE_DEVICE_TYPE(GENERIC_CARTSLOT, generic_cartslot_device, "generic_cartslot", "Generic Cartridge Slot") -//------------------------------------------------- -// device_generic_cart_interface - constructor -//------------------------------------------------- +//************************************************************************** +// device_generic_cart_interface +//************************************************************************** -device_generic_cart_interface::device_generic_cart_interface(const machine_config &mconfig, device_t &device) - : device_slot_card_interface(mconfig, device), - m_rom(nullptr), - m_rom_size(0), - m_region(*this, DEVICE_SELF) +device_generic_cart_interface::device_generic_cart_interface(machine_config const &mconfig, device_t &device) : + device_interface(device, "genslot"), + m_region(*this, DEVICE_SELF), + m_ram(), + m_rom(nullptr), + m_rom_size(0) { } +device_generic_cart_interface::~device_generic_cart_interface() +{ +} -//------------------------------------------------- -// ~device_generic_cart_interface - destructor -//------------------------------------------------- +u8 device_generic_cart_interface::read_rom(offs_t offset) +{ + return 0xff; +} -device_generic_cart_interface::~device_generic_cart_interface() +u16 device_generic_cart_interface::read16_rom(offs_t offset, u16 mem_mask) { + return 0xffff; } -//------------------------------------------------- -// rom_alloc - alloc the space for the cart -//------------------------------------------------- +u32 device_generic_cart_interface::read32_rom(offs_t offset, u32 mem_mask) +{ + return 0xffffffff; +} -void device_generic_cart_interface::rom_alloc(size_t size, int width, endianness_t endian, const char *tag) +u8 device_generic_cart_interface::read_ram(offs_t offset) { - if (m_rom == nullptr) - { - m_rom = device().machine().memory().region_alloc(std::string(tag).append(GENERIC_ROM_REGION_TAG).c_str(), size, width, endian)->base(); - m_rom_size = size; - } + return 0xff; } +void device_generic_cart_interface::write_ram(offs_t offset, u8 data) +{ +} -//------------------------------------------------- -// ram_alloc - alloc the space for the ram -//------------------------------------------------- +void device_generic_cart_interface::rom_alloc(u32 size, int width, endianness_t endian, char const *tag) +{ + if (m_rom) + { + throw emu_fatalerror( + "%s: Request to allocate ROM when already allocated (allocated size %u, requested size %u)\n", + device().tag(), + m_rom_size, + size); + } -void device_generic_cart_interface::ram_alloc(uint32_t size) + std::string fulltag(tag); + fulltag.append(GENERIC_ROM_REGION_TAG); + device().logerror("Allocating %u byte ROM region with tag '%s' (width %d)\n", size, fulltag, width); + m_rom = device().machine().memory().region_alloc(fulltag, size, width, endian)->base(); + m_rom_size = size; +} + +void device_generic_cart_interface::ram_alloc(u32 size) { + if (!m_ram.empty()) + { + throw emu_fatalerror( + "%s: Request to allocate RAM when already allocated (allocated size %u, requested size %u)\n", + device().tag(), + m_ram.size(), + size); + } + + device().logerror("Allocating %u bytes of RAM\n", size); m_ram.resize(size); } - //************************************************************************** -// LIVE DEVICE +// generic_slot_device //************************************************************************** -//------------------------------------------------- -// generic_slot_device - constructor -//------------------------------------------------- -generic_slot_device::generic_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : +generic_slot_device::generic_slot_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) : device_t(mconfig, type, tag, owner, clock), - device_image_interface(mconfig, *this), - device_slot_interface(mconfig, *this), + device_rom_image_interface(mconfig, *this), + device_single_card_slot_interface<device_generic_cart_interface>(mconfig, *this), m_interface(nullptr), m_default_card("rom"), m_extensions("bin"), - m_must_be_loaded(false), m_width(GENERIC_ROM8_WIDTH), m_endianness(ENDIANNESS_LITTLE), - m_cart(nullptr) + m_cart(nullptr), + m_device_image_load(*this), + m_device_image_unload(*this) { } -generic_socket_device::generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : generic_slot_device(mconfig, GENERIC_SOCKET, tag, owner, clock) +generic_socket_device::generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + generic_slot_device(mconfig, GENERIC_SOCKET, tag, owner, clock) { } -generic_cartslot_device::generic_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : generic_slot_device(mconfig, GENERIC_CARTSLOT, tag, owner, clock) +generic_cartslot_device::generic_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + generic_slot_device(mconfig, GENERIC_CARTSLOT, tag, owner, clock) { } -//------------------------------------------------- -// generic_slot_device - destructor -//------------------------------------------------- - generic_slot_device::~generic_slot_device() { } -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- +generic_socket_device::~generic_socket_device() +{ +} + +generic_cartslot_device::~generic_cartslot_device() +{ +} void generic_slot_device::device_start() { - m_cart = dynamic_cast<device_generic_cart_interface *>(get_card_device()); + m_cart = get_card_device(); + m_device_image_load.resolve(); + m_device_image_unload.resolve(); } @@ -131,24 +168,25 @@ void generic_slot_device::device_start() call load -------------------------------------------------*/ -image_init_result generic_slot_device::call_load() +std::pair<std::error_condition, std::string> generic_slot_device::call_load() { - if (m_cart) + if (!m_cart) + { + return std::make_pair(std::error_condition(), std::string()); + } + else if (!m_device_image_load.isnull()) { - if (!m_device_image_load.isnull()) - return m_device_image_load(*this); - else - { - uint32_t len = common_get_size("rom"); + return m_device_image_load(*this); + } + else + { + u32 const len = common_get_size("rom"); - rom_alloc(len, m_width, m_endianness); - common_load_rom(get_rom_base(), len, "rom"); + rom_alloc(len, m_width, m_endianness); + common_load_rom(get_rom_base(), len, "rom"); - return image_init_result::PASS; - } + return std::make_pair(std::error_condition(), std::string()); } - - return image_init_result::PASS; } @@ -185,7 +223,7 @@ std::string generic_slot_device::get_default_card_software(get_default_card_soft for fullpath and for softlist -------------------------------------------------*/ -uint32_t generic_slot_device::common_get_size(const char *region) +u32 generic_slot_device::common_get_size(char const *region) { // if we are loading from softlist, you have to specify a region assert(!loaded_through_softlist() || (region != nullptr)); @@ -198,7 +236,7 @@ uint32_t generic_slot_device::common_get_size(const char *region) for fullpath and for softlist -------------------------------------------------*/ -void generic_slot_device::common_load_rom(uint8_t *ROM, uint32_t len, const char *region) +void generic_slot_device::common_load_rom(u8 *ROM, u32 len, char const *region) { // basic sanity check assert((ROM != nullptr) && (len > 0)); @@ -216,7 +254,7 @@ void generic_slot_device::common_load_rom(uint8_t *ROM, uint32_t len, const char read_rom -------------------------------------------------*/ -uint8_t generic_slot_device::read_rom(offs_t offset) +u8 generic_slot_device::read_rom(offs_t offset) { if (m_cart) return m_cart->read_rom(offset); @@ -228,7 +266,7 @@ uint8_t generic_slot_device::read_rom(offs_t offset) read16_rom -------------------------------------------------*/ -uint16_t generic_slot_device::read16_rom(offs_t offset, uint16_t mem_mask) +u16 generic_slot_device::read16_rom(offs_t offset, u16 mem_mask) { if (m_cart) return m_cart->read16_rom(offset, mem_mask); @@ -240,7 +278,7 @@ uint16_t generic_slot_device::read16_rom(offs_t offset, uint16_t mem_mask) read32_rom -------------------------------------------------*/ -uint32_t generic_slot_device::read32_rom(offs_t offset, uint32_t mem_mask) +u32 generic_slot_device::read32_rom(offs_t offset, u32 mem_mask) { if (m_cart) return m_cart->read32_rom(offset, mem_mask); @@ -252,7 +290,7 @@ uint32_t generic_slot_device::read32_rom(offs_t offset, uint32_t mem_mask) read_ram -------------------------------------------------*/ -uint8_t generic_slot_device::read_ram(offs_t offset) +u8 generic_slot_device::read_ram(offs_t offset) { if (m_cart) return m_cart->read_ram(offset); @@ -264,7 +302,7 @@ uint8_t generic_slot_device::read_ram(offs_t offset) write_ram -------------------------------------------------*/ -void generic_slot_device::write_ram(offs_t offset, uint8_t data) +void generic_slot_device::write_ram(offs_t offset, u8 data) { if (m_cart) m_cart->write_ram(offset, data); |