diff options
Diffstat (limited to 'src/devices/bus/sega8/sega8_slot.h')
-rw-r--r-- | src/devices/bus/sega8/sega8_slot.h | 262 |
1 files changed, 193 insertions, 69 deletions
diff --git a/src/devices/bus/sega8/sega8_slot.h b/src/devices/bus/sega8/sega8_slot.h index 9b653d4887b..ca3ebdc6172 100644 --- a/src/devices/bus/sega8/sega8_slot.h +++ b/src/devices/bus/sega8/sega8_slot.h @@ -32,7 +32,9 @@ enum SEGA8_MUSIC_EDITOR, SEGA8_DAHJEE_TYPEA, SEGA8_DAHJEE_TYPEB, - SEGA8_SEOJIN + SEGA8_SEOJIN, + SEGA8_MULTICART, + SEGA8_MEGACART }; @@ -56,6 +58,9 @@ public: // a few carts (for SG1000) acts as a RAM expansion, taking control of the system RAM in 0xc000-0xffff virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } virtual DECLARE_WRITE8_MEMBER(write_ram) { } + // the SC3000 has I/OR, I/OW lines connected + virtual DECLARE_READ8_MEMBER(read_io) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(write_io) { } void rom_alloc(uint32_t size, const char *tag); void ram_alloc(uint32_t size); @@ -126,18 +131,14 @@ public: void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); } - void set_mandatory(bool val) { m_must_be_loaded = val; } - void set_intf(const char * interface) { m_interface = interface; } - void set_ext(const char * extensions) { m_extensions = extensions; } - virtual iodevice_t image_type() const override { return IO_CARTSLOT; } virtual bool is_readable() const override { return 1; } virtual bool is_writeable() const override { return 0; } virtual bool is_creatable() const override { return 0; } - virtual bool must_be_loaded() const override { return m_must_be_loaded; } virtual bool is_reset_on_load() const override { return 1; } - virtual const char *image_interface() const override { return m_interface; } - virtual const char *file_extensions() const override { return m_extensions; } + virtual bool must_be_loaded() const override { return false; } + virtual const char *image_interface() const override { return "sms_cart"; } + virtual const char *file_extensions() const override { return "bin"; } // slot interface overrides virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override; @@ -148,20 +149,20 @@ public: virtual DECLARE_WRITE8_MEMBER(write_mapper); virtual DECLARE_READ8_MEMBER(read_ram); virtual DECLARE_WRITE8_MEMBER(write_ram); + virtual DECLARE_READ8_MEMBER(read_io); + virtual DECLARE_WRITE8_MEMBER(write_io); int get_lphaser_xoffs() { return m_cart ? m_cart->get_lphaser_xoffs() : -1; } int get_sms_mode() { return m_cart->get_sms_mode(); } protected: - sega8_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_card); + sega8_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_card = false); // device-level overrides virtual void device_start() override; int m_type; - bool m_must_be_loaded, m_is_card; - const char *m_interface; - const char *m_extensions; + bool m_is_card; device_sega8_cart_interface* m_cart; }; @@ -175,8 +176,188 @@ public: virtual const char *custom_instance_name() const override { return "card"; } virtual const char *custom_brief_instance_name() const override { return "card"; } + +protected: + // construction/destruction + sega8_card_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); +}; + +// ======================> sg1000_cart_slot_device + +class sg1000_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + sg1000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sg1000_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sg1000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return true; } + virtual const char *image_interface() const override { return "sg1000_cart"; } + virtual const char *file_extensions() const override { return "bin,sg"; } +}; + +// ======================> omv_cart_slot_device + +class omv_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + omv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : omv_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + omv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return false; } + virtual const char *image_interface() const override { return "sg1000_cart"; } + virtual const char *file_extensions() const override { return "bin,sg"; } +}; + +// ======================> sc3000_cart_slot_device + +class sc3000_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + sc3000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sc3000_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sc3000_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return true; } + virtual const char *image_interface() const override { return "sg1000_cart"; } + virtual const char *file_extensions() const override { return "bin,sg,sc"; } +}; + +// ======================> sg1000mk3_cart_slot_device + +class sg1000mk3_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + sg1000mk3_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sg1000mk3_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sg1000mk3_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return false; } + virtual const char *image_interface() const override { return "sms_cart,sg1000_cart"; } + virtual const char *file_extensions() const override { return "bin,sms,sg"; } }; +// ======================> sms_cart_slot_device + +class sms_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + sms_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sms_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sms_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return false; } + virtual const char *image_interface() const override { return "sms_cart"; } + virtual const char *file_extensions() const override { return "bin,sms"; } +}; + +// ======================> gamegear_cart_slot_device + +class gamegear_cart_slot_device : public sega8_cart_slot_device +{ +public: + // construction/destruction + template <typename T> + gamegear_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : gamegear_cart_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + gamegear_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return true; } + virtual const char *image_interface() const override { return "gamegear_cart"; } + virtual const char *file_extensions() const override { return "bin,gg"; } +}; + + +// ======================> sms_card_slot_device + +class sms_card_slot_device : public sega8_card_slot_device +{ +public: + // construction/destruction + template <typename T> + sms_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sms_card_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sms_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual bool must_be_loaded() const override { return false; } + virtual const char *image_interface() const override { return "sms_card"; } + virtual const char *file_extensions() const override { return "bin"; } +}; + +// ======================> sg1000_card_slot_device + +class sg1000_card_slot_device : public sega8_card_slot_device +{ +public: + // construction/destruction + template <typename T> + sg1000_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt) + : sg1000_card_slot_device(mconfig, tag, owner, u32(0)) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + sg1000_card_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual const char *image_interface() const override { return "sg1000_cart"; } + virtual const char *file_extensions() const override { return "bin,sg"; } +}; + +DECLARE_DEVICE_TYPE(SG1000_CART_SLOT, sg1000_cart_slot_device) +DECLARE_DEVICE_TYPE(OMV_CART_SLOT, omv_cart_slot_device) +DECLARE_DEVICE_TYPE(SC3000_CART_SLOT, sc3000_cart_slot_device) +DECLARE_DEVICE_TYPE(SG1000MK3_CART_SLOT, sg1000mk3_cart_slot_device) +DECLARE_DEVICE_TYPE(SMS_CART_SLOT, sms_cart_slot_device) +DECLARE_DEVICE_TYPE(GAMEGEAR_CART_SLOT, gamegear_cart_slot_device) +DECLARE_DEVICE_TYPE(SMS_CARD_SLOT, sms_card_slot_device) +DECLARE_DEVICE_TYPE(SG1000_CARD_SLOT, sg1000_card_slot_device) /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -185,63 +366,6 @@ public: #define S8SLOT_ROM_REGION_TAG ":cart:rom" -#define MCFG_SG1000_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg"); - -#define MCFG_OMV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg"); - -#define MCFG_SC3000_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("sg1000_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sg,sc"); - -#define MCFG_SG1000MK3_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("sms_cart,sg1000_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sms,sg"); - -#define MCFG_SMS_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(false); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("sms_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,sms"); - -#define MCFG_GG_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_cart_slot_device *>(device)->set_mandatory(true); \ - static_cast<sega8_cart_slot_device *>(device)->set_intf("gamegear_cart"); \ - static_cast<sega8_cart_slot_device *>(device)->set_ext("bin,gg"); - - - -#define MCFG_SMS_CARD_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CARD_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_card_slot_device *>(device)->set_mandatory(false); \ - static_cast<sega8_card_slot_device *>(device)->set_intf("sms_card"); \ - static_cast<sega8_card_slot_device *>(device)->set_ext("bin"); -#define MCFG_SG1000_CARD_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, SEGA8_CARD_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ - static_cast<sega8_card_slot_device *>(device)->set_intf("sg1000_cart"); \ - static_cast<sega8_card_slot_device *>(device)->set_ext("bin,sg"); - - // slot interfaces void sg1000_cart(device_slot_interface &device); void sg1000mk3_cart(device_slot_interface &device); |