1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
// license: BSD-3-Clause
// copyright-holders: Dirk Best
/***************************************************************************
mc-68000-Computer System Bus
96-pin slot
32 +5V +5V +5V
31 +12V +5V -12V
30 BA8 _IRQ1 BA1
29 BA9 _IRQ2 BA2
28 BA10 _IRQ3 BA3
27 BA11 _IRQ4 BA4
26 BA12 _IRQ5 BA5
25 BA13 _IRQ6 BA6
24 BA14 _IRQ7 BA7
23 BA15 GND _EXP
22 BA16 _FLOPPY FC2
21 BA17 NC FC1
20 BA18 GND FC0
19 BA19 +12V GND
18 BA20 +12V _BAS
17 BA21 GND GND
16 BA22 NC _DTACK
15 BA23 NC GND
14 GND LPSTB BR/_W
13 NC _VPA _BLDS
12 _RESET _BR _BUDS
11 _BERR _EXT GND
10 HALT NC 16 MHZ
9 GND _POR GND
8 BD15 NC BD7
7 BD14 B_R/W BD6
6 BD13 _BVMA BD5
5 BD12 BE BD4
4 BD11 _BG BD3
3 BD10 NC BD2
2 BD9 _BGACK BD1
1 BD8 _SSEL BD0
***************************************************************************/
#ifndef MAME_BUS_MC68000_SYSBUS_H
#define MAME_BUS_MC68000_SYSBUS_H
#pragma once
// forward declaration
class device_mc68000_sysbus_card_interface;
//**************************************************************************
// BUS DEVICE
//**************************************************************************
class mc68000_sysbus_device : public device_t
{
public:
// construction/destruction
mc68000_sysbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~mc68000_sysbus_device();
void add_card(int slot, device_mc68000_sysbus_card_interface *card);
auto irq1_cb() { return m_irq1_cb.bind(); }
auto irq2_cb() { return m_irq2_cb.bind(); }
auto irq3_cb() { return m_irq3_cb.bind(); }
auto irq4_cb() { return m_irq4_cb.bind(); }
auto irq5_cb() { return m_irq5_cb.bind(); }
auto irq6_cb() { return m_irq6_cb.bind(); }
auto irq7_cb() { return m_irq7_cb.bind(); }
// from cards
void irq1_w(int state);
void irq2_w(int state);
void irq3_w(int state);
void irq4_w(int state);
void irq5_w(int state);
void irq6_w(int state);
void irq7_w(int state);
// called from host
uint16_t slot_r(int slot, offs_t offset, uint16_t mem_mask = ~0);
void slot_w(int slot, offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
uint16_t floppy_r(offs_t offset, uint16_t mem_mask = ~0);
void floppy_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
protected:
// device_t implementation
virtual void device_start() override ATTR_COLD;
private:
device_mc68000_sysbus_card_interface *m_device_list[8];
devcb_write_line m_irq1_cb;
devcb_write_line m_irq2_cb;
devcb_write_line m_irq3_cb;
devcb_write_line m_irq4_cb;
devcb_write_line m_irq5_cb;
devcb_write_line m_irq6_cb;
devcb_write_line m_irq7_cb;
};
// device type definition
DECLARE_DEVICE_TYPE(MC68000_SYSBUS, mc68000_sysbus_device)
//**************************************************************************
// SLOT DEVICE
//**************************************************************************
class mc68000_sysbus_slot_device : public device_t, public device_single_card_slot_interface<device_mc68000_sysbus_card_interface>
{
public:
// construction/destruction
template <typename T>
mc68000_sysbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
: mc68000_sysbus_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
mc68000_sysbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
mc68000_sysbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device_t implementation
virtual void device_resolve_objects() override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
};
// device type definition
DECLARE_DEVICE_TYPE(MC68000_SYSBUS_SLOT, mc68000_sysbus_slot_device)
//**************************************************************************
// CARD INTERFACE
//**************************************************************************
class device_mc68000_sysbus_card_interface : public device_interface
{
public:
// construction/destruction
virtual ~device_mc68000_sysbus_card_interface();
void set_bus(mc68000_sysbus_device *bus, const char *slot_tag);
device_mc68000_sysbus_card_interface *next() const { return m_next; }
virtual uint16_t slot_r(offs_t offset, uint16_t mem_mask = ~0) { return 0xffff; }
virtual void slot_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) { }
virtual uint16_t floppy_r(offs_t offset, uint16_t mem_mask = ~0) { return 0xffff; }
virtual void floppy_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) { }
protected:
device_mc68000_sysbus_card_interface(const machine_config &mconfig, device_t &device);
virtual void interface_pre_start() override;
mc68000_sysbus_device *m_bus;
device_mc68000_sysbus_card_interface *m_next;
const char *m_slot_tag;
int m_slot;
};
// include here so drivers don't need to
#include "cards.h"
#endif // MAME_BUS_MC68000_SYSBUS_H
|