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