1 // license:GPL-2.0+
2 // copyright-holders:Jonathan Edwards
3 /***************************************************************************
4 
5   bml3bus.h - Hitachi MB-6890 slot bus and card emulation
6 
7   Adapted from a2bus by Jonathan Edwards
8 
9 ***************************************************************************/
10 
11 #ifndef MAME_BUS_BML3_BML3BUS_H
12 #define MAME_BUS_BML3_BML3BUS_H
13 
14 #pragma once
15 
16 
17 #define BML3BUS_MAX_SLOTS 6
18 
19 
20 //**************************************************************************
21 //  TYPE DEFINITIONS
22 //**************************************************************************
23 
24 class bml3bus_device;
25 class device_bml3bus_card_interface;
26 
27 
28 class bml3bus_slot_device : public device_t,
29 							public device_single_card_slot_interface<device_bml3bus_card_interface>
30 {
31 public:
32 	// construction/destruction
33 	template <typename T, typename U>
bml3bus_slot_device(machine_config const & mconfig,const char * tag,device_t * owner,T && nbtag,U && opts,const char * dflt)34 	bml3bus_slot_device(machine_config const &mconfig, const char *tag, device_t *owner, T &&nbtag, U &&opts, const char *dflt)
35 		: bml3bus_slot_device(mconfig, tag, owner, (uint32_t)0)
36 	{
37 		option_reset();
38 		opts(*this);
39 		set_default_option(dflt);
40 		set_fixed(false);
41 		set_bml3bus_slot(std::forward<T>(nbtag), tag);
42 	}
43 
44 	bml3bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
45 
46 	// inline configuration
47 	template <typename T>
set_bml3bus_slot(T && tag,const char * slottag)48 	void set_bml3bus_slot(T &&tag, const char *slottag)
49 	{
50 		m_bml3bus.set_tag(std::forward<T>(tag));
51 		m_bml3bus_slottag = slottag;
52 	}
53 
54 protected:
55 	bml3bus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
56 
57 	// device-level overrides
58 	virtual void device_start() override;
59 
60 	// configuration
61 	required_device<bml3bus_device> m_bml3bus;
62 	const char *m_bml3bus_slottag;
63 };
64 
65 // device type definition
DECLARE_DEVICE_TYPE(BML3BUS_SLOT,bml3bus_slot_device)66 DECLARE_DEVICE_TYPE(BML3BUS_SLOT, bml3bus_slot_device)
67 
68 
69 // ======================> bml3bus_device
70 class bml3bus_device : public device_t
71 {
72 	friend class device_bml3bus_card_interface;
73 public:
74 	// construction/destruction
75 	bml3bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
76 
77 	// inline configuration
78 	template <class Object> void set_space(Object &&tag, int spacenum) { m_space.set_tag(std::forward<Object>(tag), spacenum); }
79 	auto nmi_callback() { return m_out_nmi_cb.bind(); }
80 	auto irq_callback() { return m_out_irq_cb.bind(); }
81 	auto firq_callback() { return m_out_firq_cb.bind(); }
82 
83 	device_bml3bus_card_interface *get_bml3bus_card(int slot);
84 
85 	DECLARE_WRITE_LINE_MEMBER( nmi_w );
86 	DECLARE_WRITE_LINE_MEMBER( irq_w );
87 	DECLARE_WRITE_LINE_MEMBER( firq_w );
88 
89 protected:
90 	bml3bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
91 
92 	// device-level overrides
93 	virtual void device_start() override;
94 	virtual void device_reset() override;
95 
96 	void add_bml3bus_card(int slot, device_bml3bus_card_interface &card);
97 
98 	address_space &space() const { return *m_space; }
99 
100 	void set_nmi_line(int state);
101 	void set_irq_line(int state);
102 	void set_firq_line(int state);
103 
104 	// internal state
105 	required_address_space m_space;
106 
107 	devcb_write_line    m_out_nmi_cb;
108 	devcb_write_line    m_out_irq_cb;
109 	devcb_write_line    m_out_firq_cb;
110 
111 	device_bml3bus_card_interface *m_device_list[BML3BUS_MAX_SLOTS];
112 };
113 
114 
115 // device type definition
DECLARE_DEVICE_TYPE(BML3BUS,bml3bus_device)116 DECLARE_DEVICE_TYPE(BML3BUS, bml3bus_device)
117 
118 // ======================> device_bml3bus_card_interface
119 
120 // class representing interface-specific live bml3bus card
121 class device_bml3bus_card_interface : public device_interface
122 {
123 	friend class bml3bus_device;
124 public:
125 	// construction/destruction
126 	virtual ~device_bml3bus_card_interface();
127 
128 	// inline configuration
129 	void set_bml3bus(bml3bus_device &bus, const char *slottag);
130 
131 protected:
132 	virtual void interface_pre_start() override;
133 
134 	address_space &space() { return m_bml3bus->space(); }
135 
136 	void raise_slot_nmi() { m_bml3bus->set_nmi_line(ASSERT_LINE); }
137 	void lower_slot_nmi() { m_bml3bus->set_nmi_line(CLEAR_LINE); }
138 	void raise_slot_irq() { m_bml3bus->set_irq_line(ASSERT_LINE); }
139 	void lower_slot_irq() { m_bml3bus->set_irq_line(CLEAR_LINE); }
140 	void raise_slot_firq() { m_bml3bus->set_firq_line(ASSERT_LINE); }
141 	void lower_slot_firq() { m_bml3bus->set_firq_line(CLEAR_LINE); }
142 
143 	device_bml3bus_card_interface(const machine_config &mconfig, device_t &device);
144 
145 private:
146 	bml3bus_device *m_bml3bus;
147 	int m_slot;
148 };
149 
150 #endif // MAME_BUS_BML3_BML3BUS_H
151