1 // license:BSD-3-Clause 2 // copyright-holders:Sandro Ronco 3 /********************************************************************* 4 5 kc.h 6 7 KC85_2/3/4/5 expansion slot emulation 8 9 *********************************************************************/ 10 11 #ifndef MAME_BUS_KC_KC_H 12 #define MAME_BUS_KC_KC_H 13 14 #pragma once 15 16 #include "softlist_dev.h" 17 18 /*************************************************************************** 19 TYPE DEFINITIONS 20 ***************************************************************************/ 21 22 // ======================> device_kcexp_interface 23 24 class device_kcexp_interface : public device_interface 25 { 26 public: 27 // construction/destruction 28 virtual ~device_kcexp_interface(); 29 30 // reading and writing module_id_r()31 virtual uint8_t module_id_r() { return 0xff; } control_w(uint8_t data)32 virtual void control_w(uint8_t data) { } read(offs_t offset,uint8_t & data)33 virtual void read(offs_t offset, uint8_t &data) { } write(offs_t offset,uint8_t data)34 virtual void write(offs_t offset, uint8_t data) { } io_read(offs_t offset,uint8_t & data)35 virtual void io_read(offs_t offset, uint8_t &data) { } io_write(offs_t offset,uint8_t data)36 virtual void io_write(offs_t offset, uint8_t data) { } get_cart_base()37 virtual uint8_t* get_cart_base() { return nullptr; } DECLARE_WRITE_LINE_MEMBER(mei_w)38 virtual DECLARE_WRITE_LINE_MEMBER( mei_w ) { } 39 40 protected: 41 device_kcexp_interface(const machine_config &mconfig, device_t &device); 42 }; 43 44 // ======================> kcexp_slot_device 45 46 class kcexp_slot_device : public device_t, public device_single_card_slot_interface<device_kcexp_interface> 47 { 48 public: 49 // construction/destruction 50 template <typename T> kcexp_slot_device(machine_config const & mconfig,char const * tag,device_t * owner,T && opts,char const * dflt)51 kcexp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) 52 : kcexp_slot_device(mconfig, tag, owner, (uint32_t)0) 53 { 54 option_reset(); 55 opts(*this); 56 set_default_option(dflt); 57 set_fixed(false); 58 } 59 kcexp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 60 virtual ~kcexp_slot_device(); 61 irq()62 auto irq() { return m_out_irq_cb.bind(); } nmi()63 auto nmi() { return m_out_nmi_cb.bind(); } halt()64 auto halt() { return m_out_halt_cb.bind(); } 65 66 // inline configuration set_next_slot(T && next_module_tag)67 template <typename T> void set_next_slot(T &&next_module_tag) { m_next_slot.set_tag(std::forward<T>(next_module_tag)); } 68 69 // reading and writing 70 virtual uint8_t module_id_r(); 71 virtual void control_w(uint8_t data); 72 virtual void read(offs_t offset, uint8_t &data); 73 virtual void write(offs_t offset, uint8_t data); 74 virtual void io_read(offs_t offset, uint8_t &data); 75 virtual void io_write(offs_t offset, uint8_t data); 76 virtual DECLARE_WRITE_LINE_MEMBER( mei_w ); 77 virtual DECLARE_WRITE_LINE_MEMBER( meo_w ); 78 79 devcb_write_line m_out_irq_cb; 80 devcb_write_line m_out_nmi_cb; 81 devcb_write_line m_out_halt_cb; 82 83 protected: 84 kcexp_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 85 86 // device-level overrides 87 virtual void device_validity_check(validity_checker &valid) const override; 88 virtual void device_start() override; 89 90 device_kcexp_interface* m_cart; 91 92 optional_device<kcexp_slot_device> m_next_slot; 93 }; 94 95 // ======================> kccart_slot_device 96 97 class kccart_slot_device : public kcexp_slot_device, public device_image_interface 98 { 99 public: 100 // construction/destruction 101 template <typename T> kccart_slot_device(machine_config const & mconfig,char const * tag,device_t * owner,T && opts,char const * dflt)102 kccart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) 103 : kccart_slot_device(mconfig, tag, owner, (uint32_t)0) 104 { 105 option_reset(); 106 opts(*this); 107 set_default_option(dflt); 108 set_fixed(false); 109 } 110 kccart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 111 virtual ~kccart_slot_device(); 112 113 // image-level overrides 114 virtual image_init_result call_load() override; 115 image_type()116 virtual iodevice_t image_type() const noexcept override { return IO_CARTSLOT; } is_readable()117 virtual bool is_readable() const noexcept override { return true; } is_writeable()118 virtual bool is_writeable() const noexcept override { return false; } is_creatable()119 virtual bool is_creatable() const noexcept override { return false; } must_be_loaded()120 virtual bool must_be_loaded() const noexcept override { return false; } is_reset_on_load()121 virtual bool is_reset_on_load() const noexcept override { return true; } image_interface()122 virtual const char *image_interface() const noexcept override { return "kc_cart"; } file_extensions()123 virtual const char *file_extensions() const noexcept override { return "bin"; } 124 125 // slot interface overrides 126 virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override; 127 128 protected: 129 // device_image_interface implementation get_software_list_loader()130 virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); } 131 }; 132 133 // device type definition 134 DECLARE_DEVICE_TYPE(KCEXP_SLOT, kcexp_slot_device) 135 DECLARE_DEVICE_TYPE(KCCART_SLOT, kccart_slot_device) 136 137 #endif // MAME_BUS_KC_KC_H 138