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