summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/nscsi_cb.h
blob: 9b193c6c876af1e3af882cda6894b9eb06d9c89d (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
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
#ifndef NSCSI_CB_H
#define NSCSI_CB_H

#include "machine/nscsi_bus.h"

#define MCFG_NSCSICB_RST_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_rst_callback(DEVCB_##_line);

#define MCFG_NSCSICB_ATN_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_atn_callback(DEVCB_##_line);

#define MCFG_NSCSICB_ACK_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_ack_callback(DEVCB_##_line);

#define MCFG_NSCSICB_REQ_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_req_callback(DEVCB_##_line);

#define MCFG_NSCSICB_MSG_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_msg_callback(DEVCB_##_line);

#define MCFG_NSCSICB_IO_HANDLER(_line) \
	devcb = &downcast<nscsi_callback_device *>(device)->set_io_callback(DEVCB_##_line);

#define MCFG_NSCSICB_CD_HANDLER(_line) \
	downcast<nscsi_callback_device *>(device)->set_cd_callback(DEVCB_##_line);

#define MCFG_NSCSICB_SEL_HANDLER(_line) \
	downcast<nscsi_callback_device *>(device)->set_sel_callback(DEVCB_##_line);

#define MCFG_NSCSICB_BSY_HANDLER(_line) \
	downcast<nscsi_callback_device *>(device)->set_bsy_callback(DEVCB_##_line);

class nscsi_callback_device : public nscsi_device
{
public:
	nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	template<class _line> devcb_base &set_rst_callback(_line line) { return m_write_rst.set_callback(line); }
	template<class _line> devcb_base &set_atn_callback(_line line) { return m_write_atn.set_callback(line); }
	template<class _line> devcb_base &set_ack_callback(_line line) { return m_write_ack.set_callback(line); }
	template<class _line> devcb_base &set_req_callback(_line line) { return m_write_req.set_callback(line); }
	template<class _line> devcb_base &set_msg_callback(_line line) { return m_write_msg.set_callback(line); }
	template<class _line> devcb_base &set_io_callback(_line line)  { return m_write_io.set_callback(line); }
	template<class _line> devcb_base &set_cd_callback(_line line)  { return m_write_cd.set_callback(line); }
	template<class _line> devcb_base &set_sel_callback(_line line) { return m_write_sel.set_callback(line); }
	template<class _line> devcb_base &set_bsy_callback(_line line) { return m_write_bsy.set_callback(line); }

	virtual void scsi_ctrl_changed() override;

	uint8_t read() { return scsi_bus->data_r(); }
	DECLARE_READ8_MEMBER( read ) { return read(); }
	void write(uint8_t data) { scsi_bus->data_w(scsi_refid, data); }
	DECLARE_WRITE8_MEMBER( write ) { write(data); }

	DECLARE_READ_LINE_MEMBER( rst_r ) { return (m_ctrl & S_RST) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( atn_r ) { return (m_ctrl & S_ATN) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( ack_r ) { return (m_ctrl & S_ACK) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( req_r ) { return (m_ctrl & S_REQ) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( msg_r ) { return (m_ctrl & S_MSG) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( io_r )  { return (m_ctrl & S_INP) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( cd_r )  { return (m_ctrl & S_CTL) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( sel_r ) { return (m_ctrl & S_SEL) ? 1 : 0; }
	DECLARE_READ_LINE_MEMBER( bsy_r ) { return (m_ctrl & S_BSY) ? 1 : 0; }

	DECLARE_WRITE_LINE_MEMBER( rst_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_RST : 0, S_RST); }
	DECLARE_WRITE_LINE_MEMBER( atn_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_ATN : 0, S_ATN); }
	DECLARE_WRITE_LINE_MEMBER( ack_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_ACK : 0, S_ACK); }
	DECLARE_WRITE_LINE_MEMBER( req_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_REQ : 0, S_REQ); }
	DECLARE_WRITE_LINE_MEMBER( msg_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_MSG : 0, S_MSG); }
	DECLARE_WRITE_LINE_MEMBER( io_w )  { scsi_bus->ctrl_w(scsi_refid, state ? S_INP : 0, S_INP); }
	DECLARE_WRITE_LINE_MEMBER( cd_w )  { scsi_bus->ctrl_w(scsi_refid, state ? S_CTL : 0, S_CTL); }
	DECLARE_WRITE_LINE_MEMBER( sel_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_SEL : 0, S_SEL); }
	DECLARE_WRITE_LINE_MEMBER( bsy_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_BSY : 0, S_BSY); }

protected:
	virtual void device_start() override;
	virtual void device_reset() override;

	devcb_write_line m_write_rst;
	devcb_write_line m_write_atn;
	devcb_write_line m_write_ack;
	devcb_write_line m_write_req;
	devcb_write_line m_write_msg;
	devcb_write_line m_write_io;
	devcb_write_line m_write_cd;
	devcb_write_line m_write_sel;
	devcb_write_line m_write_bsy;

	uint32_t m_ctrl;
};

extern const device_type NSCSI_CB;

#endif