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
|
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Atari Portfolio Expansion Port emulation
**********************************************************************
ABUF 1 2 5VS
REDY 3 4 VCC
BCOM 5 6 NCC1
NMD1 7 8 WAKE
DTR 9 10 DEN
PDET 11 12 IINT
CCLK 13 14 MRST
HLDA 15 16 HLDO
IACK 17 18 CDET
IOM 19 20 A19
A18 21 22 A17
A16 23 24 A15
A14 25 26 A13
A12 27 28 A11
A10 29 30 A9
A8 31 32 VRAM
HLDI 33 34 ALE
GND 35 36 NMIO
OA7 37 38 OA6
OA5 39 40 OA4
OA3 41 42 OA2
OA1 43 44 OA0
AD0 45 46 AD1
AD2 47 48 AD3
AD4 49 50 AD5
AD6 51 52 AD7
EINT 53 54 NRDI
VEXT 55 56 EACK
BATD 57 58 NWRI
5VS 59 60 BBUF
**********************************************************************/
#ifndef MAME_BUS_POFO_EXP_H
#define MAME_BUS_POFO_EXP_H
#pragma once
//**************************************************************************
// CONSTANTS
//**************************************************************************
#define PORTFOLIO_EXPANSION_SLOT_TAG "exp"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_PORTFOLIO_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot) \
MCFG_DEVICE_ADD(_tag, PORTFOLIO_EXPANSION_SLOT, _clock) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
#define MCFG_PORTFOLIO_EXPANSION_SLOT_EINT_CALLBACK(_write) \
devcb = &portfolio_expansion_slot_device::set_eint_wr_callback(*device, DEVCB_##_write);
#define MCFG_PORTFOLIO_EXPANSION_SLOT_NMIO_CALLBACK(_write) \
devcb = &portfolio_expansion_slot_device::set_nmio_wr_callback(*device, DEVCB_##_write);
#define MCFG_PORTFOLIO_EXPANSION_SLOT_WAKE_CALLBACK(_write) \
devcb = &portfolio_expansion_slot_device::set_wake_wr_callback(*device, DEVCB_##_write);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> device_portfolio_expansion_slot_interface
class portfolio_expansion_slot_device;
class device_portfolio_expansion_slot_interface : public device_slot_card_interface
{
public:
virtual bool nmd1() { return 1; }
virtual bool pdet() { return 0; }
virtual bool cdet() { return 1; }
virtual uint8_t iack_r() { return 0xff; }
virtual uint8_t eack_r() { return 0xff; }
virtual uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return data; }
virtual void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { }
virtual WRITE_LINE_MEMBER( iint_w ) { }
DECLARE_WRITE_LINE_MEMBER( eint_w );
DECLARE_WRITE_LINE_MEMBER( nmio_w );
DECLARE_WRITE_LINE_MEMBER( wake_w );
protected:
// construction/destruction
device_portfolio_expansion_slot_interface(const machine_config &mconfig, device_t &device);
portfolio_expansion_slot_device *m_slot;
};
// ======================> portfolio_expansion_slot_device
class portfolio_expansion_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
portfolio_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
template <class Object> static devcb_base &set_eint_wr_callback(device_t &device, Object &&cb) { return downcast<portfolio_expansion_slot_device &>(device).m_write_eint.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_nmio_wr_callback(device_t &device, Object &&cb) { return downcast<portfolio_expansion_slot_device &>(device).m_write_nmio.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_wake_wr_callback(device_t &device, Object &&cb) { return downcast<portfolio_expansion_slot_device &>(device).m_write_wake.set_callback(std::forward<Object>(cb)); }
// computer interface
bool nmd1_r() { return (m_card != nullptr) ? m_card->nmd1() : 1; }
bool pdet_r() { return (m_card != nullptr) ? m_card->pdet() : 0; }
bool cdet_r() { return (m_card != nullptr) ? m_card->cdet() : 1; }
uint8_t iack_r() { return (m_card != nullptr) ? m_card->iack_r() : 0xff; };
uint8_t eack_r() { return (m_card != nullptr) ? m_card->eack_r() : 0xff; };
uint8_t nrdi_r(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { return (m_card != nullptr) ? m_card->nrdi_r(space, offset, data, iom, bcom, ncc1) : data; }
void nwri_w(address_space &space, offs_t offset, uint8_t data, bool iom, bool bcom, bool ncc1) { if (m_card != nullptr) m_card->nwri_w(space, offset, data, iom, bcom, ncc1); }
WRITE_LINE_MEMBER( iint_w ) { if (m_card != nullptr) m_card->iint_w(state); }
// peripheral interface
WRITE_LINE_MEMBER( eint_w ) { m_write_eint(state); }
WRITE_LINE_MEMBER( nmio_w ) { m_write_nmio(state); }
WRITE_LINE_MEMBER( wake_w ) { m_write_wake(state); }
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
devcb_write_line m_write_eint;
devcb_write_line m_write_nmio;
devcb_write_line m_write_wake;
device_portfolio_expansion_slot_interface *m_card;
};
// device type definition
extern const device_type PORTFOLIO_EXPANSION_SLOT;
DECLARE_DEVICE_TYPE(PORTFOLIO_EXPANSION_SLOT, portfolio_expansion_slot_device)
SLOT_INTERFACE_EXTERN( portfolio_expansion_cards );
#endif // MAME_BUS_POFO_EXP_H
|