summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/fdc37c665gt.h
blob: 17e768438c0f5b08356747f16c8cb80b23b8d86f (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
// license:BSD-3-Clause
// copyright-holders: Samuele Zannoli, windyfairy
/***************************************************************************

FDC37C665GT.h

SMSC FDC37C665GT High Performance Multi-Mode Parallel Port Super I/O Floppy Disk Controllers

***************************************************************************/

#ifndef MAME_MACHINE_FDC37C665GT_H
#define MAME_MACHINE_FDC37C665GT_H

#pragma once

// floppy disk controller
#include "machine/upd765.h"
#include "imagedev/floppy.h"
// parallel port
#include "machine/pc_lpt.h"
// serial port
#include "machine/ins8250.h"

class fdc37c665gt_device : public device_t
{
public:
	fdc37c665gt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
		: fdc37c665gt_device(mconfig, tag, owner, clock, upd765_family_device::mode_t::AT)
	{ }

	fdc37c665gt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, upd765_family_device::mode_t floppy_mode);

	// optional information overrides
	virtual void device_add_mconfig(machine_config &config) override;

	// to access io ports
	uint8_t read(offs_t offset);
	void write(offs_t offset, uint8_t data);

	auto fintr() { return m_fintr_callback.bind(); }
	auto fdrq() { return m_fdrq_callback.bind(); }
	auto txd1() { return m_txd1_callback.bind(); }
	auto ndtr1() { return m_ndtr1_callback.bind(); }
	auto nrts1() { return m_nrts1_callback.bind(); }
	auto txd2() { return m_txd2_callback.bind(); }
	auto ndtr2() { return m_ndtr2_callback.bind(); }
	auto nrts2() { return m_nrts2_callback.bind(); }

	// chip pins for uarts
	void rxd1_w(int state);
	void ndcd1_w(int state);
	void ndsr1_w(int state);
	void nri1_w(int state);
	void ncts1_w(int state);
	void rxd2_w(int state);
	void ndcd2_w(int state);
	void ndsr2_w(int state);
	void nri2_w(int state);
	void ncts2_w(int state);

protected:
	// device-level overrides
	virtual void device_start() override;

	// for the internal floppy controller
	void irq_floppy_w(int state);

	// for the internal parallel port
	void irq_parallel_w(int state);

	// for the internal uarts
	void irq_serial1_w(int state);
	void txd_serial1_w(int state);
	void dtr_serial1_w(int state);
	void rts_serial1_w(int state);
	void irq_serial2_w(int state);
	void txd_serial2_w(int state);
	void dtr_serial2_w(int state);
	void rts_serial2_w(int state);

private:
	// put your private members here
	enum OperatingMode
	{
		Run = 0,
		Configuration = 1
	} mode;

	enum LogicalDevice
	{
		FDC = 0,
		IDE,
		Parallel,
		Serial1,
		Serial2,

		LogicalDeviceEnd
	};

	int config_key_step;
	int config_index;
	bool enabled_logical[LogicalDevice::LogicalDeviceEnd];
	int device_addresses[LogicalDevice::LogicalDeviceEnd];
	int com_addresses[4];

	upd765_family_device::mode_t m_floppy_mode;

	uint8_t configuration_registers[16];

	devcb_write_line m_fintr_callback;
	devcb_write_line m_fdrq_callback;
	devcb_write_line m_pintr1_callback; // Parallel
	devcb_write_line m_irq3_callback; // Serial Port COM1/COM3
	devcb_write_line m_irq4_callback; // Serial Port COM2/COM4

	devcb_write_line m_txd1_callback;
	devcb_write_line m_ndtr1_callback;
	devcb_write_line m_nrts1_callback;
	devcb_write_line m_txd2_callback;
	devcb_write_line m_ndtr2_callback;
	devcb_write_line m_nrts2_callback;

	required_device<n82077aa_device> m_fdc;
	required_device_array<ns16550_device, 2> m_serial;
	required_device<pc_lpt_device> m_lpt;

	void write_configuration_register(int index, int data);
};

DECLARE_DEVICE_TYPE(FDC37C665GT, fdc37c665gt_device);

#endif // MAME_MACHINE_FDC37C665GT_H