summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/mc68000/sysbus.h
blob: ad8cea51776068f7321186f4959f8fbafb4fa232 (plain) (blame)
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