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
|
// license:BSD-3-Clause
// copyright-holders:smf
/***************************************************************************
ataintf.h
ATA Interface implementation.
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
***************************************************************************/
#pragma once
#ifndef __ATAINTF_H__
#define __ATAINTF_H__
#include "atadev.h"
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
// ======================> ata_slot_device
class ata_slot_device : public device_t,
public device_slot_interface
{
public:
// construction/destruction
ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
ata_device_interface *dev() { return m_dev; }
protected:
// device-level overrides
virtual void device_start();
virtual void device_config_complete();
private:
ata_device_interface *m_dev;
};
// device type definition
extern const device_type ATA_SLOT;
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
#define MCFG_ATA_INTERFACE_IRQ_HANDLER(_devcb) \
devcb = &ata_interface_device::set_irq_handler(*device, DEVCB_##_devcb);
#define MCFG_ATA_INTERFACE_DMARQ_HANDLER(_devcb) \
devcb = &ata_interface_device::set_dmarq_handler(*device, DEVCB_##_devcb);
#define MCFG_ATA_INTERFACE_DASP_HANDLER(_devcb) \
devcb = &ata_interface_device::set_dasp_handler(*device, DEVCB_##_devcb);
SLOT_INTERFACE_EXTERN(ata_devices);
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_ATA_INTERFACE_ADD(_tag, _slot_intf, _master, _slave, _fixed) \
MCFG_DEVICE_ADD(_tag, ATA_INTERFACE, 0) \
MCFG_DEVICE_MODIFY(_tag ":0") \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _master, _fixed) \
MCFG_DEVICE_MODIFY(_tag ":1") \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _slave, _fixed) \
MCFG_DEVICE_MODIFY(_tag)
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
/* ----- device interface ----- */
class ata_interface_device : public device_t
{
public:
ata_interface_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
ata_interface_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
// static configuration helpers
template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast<ata_interface_device &>(device).m_irq_handler.set_callback(object); }
template<class _Object> static devcb_base &set_dmarq_handler(device_t &device, _Object object) { return downcast<ata_interface_device &>(device).m_dmarq_handler.set_callback(object); }
template<class _Object> static devcb_base &set_dasp_handler(device_t &device, _Object object) { return downcast<ata_interface_device &>(device).m_dasp_handler.set_callback(object); }
UINT16 read_dma();
virtual DECLARE_READ16_MEMBER(read_cs0);
virtual DECLARE_READ16_MEMBER(read_cs1);
void write_dma(UINT16 data);
virtual DECLARE_WRITE16_MEMBER(write_cs0);
virtual DECLARE_WRITE16_MEMBER(write_cs1);
DECLARE_WRITE_LINE_MEMBER(write_dmack);
protected:
// device-level overrides
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
virtual void set_irq(int state);
virtual void set_dmarq(int state);
virtual void set_dasp(int state);
private:
DECLARE_WRITE_LINE_MEMBER(irq0_write_line);
DECLARE_WRITE_LINE_MEMBER(dmarq0_write_line);
DECLARE_WRITE_LINE_MEMBER(dasp0_write_line);
DECLARE_WRITE_LINE_MEMBER(pdiag0_write_line);
DECLARE_WRITE_LINE_MEMBER(irq1_write_line);
DECLARE_WRITE_LINE_MEMBER(dmarq1_write_line);
DECLARE_WRITE_LINE_MEMBER(dasp1_write_line);
DECLARE_WRITE_LINE_MEMBER(pdiag1_write_line);
ata_slot_device *m_slot[2];
int m_irq[2];
int m_dmarq[2];
int m_dasp[2];
int m_pdiag[2];
devcb_write_line m_irq_handler;
devcb_write_line m_dmarq_handler;
devcb_write_line m_dasp_handler;
};
extern const device_type ATA_INTERFACE;
#endif /* __ATAINTF_H__ */
|