1 // license:BSD-3-Clause
2 // copyright-holders: Samuele Zannoli
3 #ifndef MAME_MACHINE_NFORCEPC_H
4 #define MAME_MACHINE_NFORCEPC_H
5 
6 #pragma once
7 // floppy disk controller
8 #include "machine/upd765.h"
9 #include "imagedev/floppy.h"
10 #include "formats/pc_dsk.h"
11 #include "formats/naslite_dsk.h"
12 // keyboard
13 #include "machine/8042kbdc.h"
14 // parallel port
15 #include "machine/pc_lpt.h"
16 // serial port
17 #include "machine/ins8250.h"
18 
19 // NVIDIA Corporation nForce CPU bridge
20 
21 class crush11_host_device : public pci_host_device {
22 public:
23 	template <typename T>
crush11_host_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock,T && cpu_tag,const char * bios_device_tag)24 	crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, const char *bios_device_tag)
25 		: crush11_host_device(mconfig, tag, owner, clock)
26 	{
27 		set_ids_host(0x10de01a4, 0xb2, 0);
28 		set_cpu_tag(std::forward<T>(cpu_tag));
29 		biosrom.set_tag(bios_device_tag);
30 	}
31 	crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
32 
set_cpu_tag(T && tag)33 	template <typename T> void set_cpu_tag(T &&tag) { cpu.set_tag(std::forward<T>(tag)); }
get_cpu_tag()34 	const char *get_cpu_tag() { return cpu.finder_tag(); }
set_ram_size(uint32_t size)35 	void set_ram_size(uint32_t size) { ram_size = size; }
get_cpu_space(int spacenum)36 	address_space *get_cpu_space(int spacenum) { return &cpu->space(spacenum); }
37 
38 	void bios_map(address_map &map);
aperture_map(address_map & map)39 	void aperture_map(address_map &map) {}
40 
41 protected:
42 	virtual void device_start() override;
43 	virtual void device_reset() override;
44 
45 	virtual void reset_all_mappings() override;
46 
47 	virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
48 		uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
49 
50 	virtual void config_map(address_map &map) override;
51 
52 private:
53 	required_device<device_memory_interface> cpu;
54 	required_device<intelfsh8_device> biosrom;
55 	uint32_t ram_size;
56 
57 	virtual uint8_t header_type_r() override;
58 	uint8_t unknown_r();
59 	void unknown_w(uint8_t data);
60 	uint32_t ram_size_r();
61 	void ram_size_w(uint32_t data);
62 };
63 
DECLARE_DEVICE_TYPE(CRUSH11,crush11_host_device)64 DECLARE_DEVICE_TYPE(CRUSH11, crush11_host_device)
65 
66 // For ddr ram
67 
68 class crush11_memory_device : public pci_device {
69 public:
70 	crush11_memory_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t subsystem_id, int ram_size);
71 	crush11_memory_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
72 
73 	void set_ram_size(int ram_size);
74 
75 protected:
76 	virtual void device_start() override;
77 	virtual void device_reset() override;
78 
79 	virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
80 		uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
81 
82 	virtual void config_map(address_map &map) override;
83 
84 private:
85 	int ddr_ram_size;
86 	std::vector<uint32_t> ram;
87 	crush11_host_device *host;
88 	address_space *ram_space;
89 };
90 
DECLARE_DEVICE_TYPE(CRUSH11_MEMORY,crush11_memory_device)91 DECLARE_DEVICE_TYPE(CRUSH11_MEMORY, crush11_memory_device)
92 
93 // device connected to SMBus
94 
95 class smbus_logger_device : public device_t, public smbus_interface
96 {
97 public:
98 	smbus_logger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
99 	virtual int execute_command(int command, int rw, int data) override;
100 	uint8_t *get_buffer() { return buffer; }
101 
102 protected:
103 	virtual void device_start() override;
104 	virtual void device_reset() override;
105 
106 private:
107 	uint8_t buffer[0xff];
108 };
109 
DECLARE_DEVICE_TYPE(SMBUS_LOGGER,smbus_logger_device)110 DECLARE_DEVICE_TYPE(SMBUS_LOGGER, smbus_logger_device)
111 
112 // Simple smbus rom used as a placeholder for the serial presence detect chip in a ddr dimm
113 
114 class smbus_rom_device : public device_t, public smbus_interface
115 {
116 public:
117 	smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const uint8_t *data, int size);
118 	smbus_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
119 	virtual int execute_command(int command, int rw, int data) override;
120 
121 protected:
122 	virtual void device_start() override;
123 	virtual void device_reset() override;
124 
125 private:
126 	const uint8_t *buffer;
127 	int buffer_size;
128 };
129 
DECLARE_DEVICE_TYPE(SMBUS_ROM,smbus_rom_device)130 DECLARE_DEVICE_TYPE(SMBUS_ROM, smbus_rom_device)
131 
132 // Asus AS99127F chip
133 // It answers to three smbus addresses, by default 0x2d 0x48 0x49
134 
135 class as99127f_device : public device_t, public smbus_interface
136 {
137 public:
138 	as99127f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
139 	virtual int execute_command(int command, int rw, int data) override;
140 	uint8_t *get_buffer() { return buffer; }
141 
142 protected:
143 	virtual void device_start() override;
144 
145 private:
146 	uint8_t buffer[0xff];
147 };
148 
DECLARE_DEVICE_TYPE(AS99127F,as99127f_device)149 DECLARE_DEVICE_TYPE(AS99127F, as99127f_device)
150 
151 class as99127f_sensor2_device : public device_t, public smbus_interface
152 {
153 public:
154 	as99127f_sensor2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
155 	virtual int execute_command(int command, int rw, int data) override;
156 	uint8_t *get_buffer() { return buffer; }
157 
158 protected:
159 	virtual void device_start() override;
160 
161 private:
162 	uint8_t buffer[0xff];
163 };
164 
DECLARE_DEVICE_TYPE(AS99127F_SENSOR2,as99127f_sensor2_device)165 DECLARE_DEVICE_TYPE(AS99127F_SENSOR2, as99127f_sensor2_device)
166 
167 class as99127f_sensor3_device : public device_t, public smbus_interface
168 {
169 public:
170 	as99127f_sensor3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
171 	virtual int execute_command(int command, int rw, int data) override;
172 	uint8_t *get_buffer() { return buffer; }
173 
174 protected:
175 	virtual void device_start() override;
176 
177 private:
178 	uint8_t buffer[0xff];
179 };
180 
DECLARE_DEVICE_TYPE(AS99127F_SENSOR3,as99127f_sensor3_device)181 DECLARE_DEVICE_TYPE(AS99127F_SENSOR3, as99127f_sensor3_device)
182 
183 // ITE IT8703F-A SuperIO
184 
185 class it8703f_device : public device_t, public lpcbus_device_interface
186 {
187 public:
188 	it8703f_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
189 	virtual void map_extra(address_space *memory_space, address_space *io_space) override;
190 	virtual void set_host(int index, lpcbus_host_interface *host) override;
191 	virtual void device_add_mconfig(machine_config &config) override;
192 
193 	auto pin_reset() { return pin_reset_callback.bind(); }
194 	auto pin_gatea20() { return pin_gatea20_callback.bind(); }
195 	auto txd1() { return m_txd1_callback.bind(); }
196 	auto ndtr1() { return m_ndtr1_callback.bind(); }
197 	auto nrts1() { return m_nrts1_callback.bind(); }
198 	auto txd2() { return m_txd2_callback.bind(); }
199 	auto ndtr2() { return m_ndtr2_callback.bind(); }
200 	auto nrts2() { return m_nrts2_callback.bind(); }
201 
202 	void map_lpt(address_map& map);
203 	void map_serial1(address_map& map);
204 	void map_serial2(address_map& map);
205 	void map_keyboard(address_map &map);
206 
207 	// floppy disk controller
208 	DECLARE_WRITE_LINE_MEMBER(irq_floppy_w);
209 	DECLARE_WRITE_LINE_MEMBER(drq_floppy_w);
210 	// parallel port
211 	DECLARE_WRITE_LINE_MEMBER(irq_parallel_w);
212 	DECLARE_WRITE_LINE_MEMBER(drq_parallel_w);
213 	// uarts
214 	DECLARE_WRITE_LINE_MEMBER(irq_serial1_w);
215 	DECLARE_WRITE_LINE_MEMBER(txd_serial1_w);
216 	DECLARE_WRITE_LINE_MEMBER(dtr_serial1_w);
217 	DECLARE_WRITE_LINE_MEMBER(rts_serial1_w);
218 	DECLARE_WRITE_LINE_MEMBER(irq_serial2_w);
219 	DECLARE_WRITE_LINE_MEMBER(txd_serial2_w);
220 	DECLARE_WRITE_LINE_MEMBER(dtr_serial2_w);
221 	DECLARE_WRITE_LINE_MEMBER(rts_serial2_w);
222 	// uarts
223 	DECLARE_WRITE_LINE_MEMBER(rxd1_w);
224 	DECLARE_WRITE_LINE_MEMBER(ndcd1_w);
225 	DECLARE_WRITE_LINE_MEMBER(ndsr1_w);
226 	DECLARE_WRITE_LINE_MEMBER(nri1_w);
227 	DECLARE_WRITE_LINE_MEMBER(ncts1_w);
228 	DECLARE_WRITE_LINE_MEMBER(rxd2_w);
229 	DECLARE_WRITE_LINE_MEMBER(ndcd2_w);
230 	DECLARE_WRITE_LINE_MEMBER(ndsr2_w);
231 	DECLARE_WRITE_LINE_MEMBER(nri2_w);
232 	DECLARE_WRITE_LINE_MEMBER(ncts2_w);
233 	// keyboard
234 	DECLARE_WRITE_LINE_MEMBER(irq_keyboard_w);
235 	DECLARE_WRITE_LINE_MEMBER(kbdp21_gp25_gatea20_w);
236 	DECLARE_WRITE_LINE_MEMBER(kbdp20_gp20_reset_w);
237 
238 	uint8_t read_it8703f(offs_t offset);
239 	void write_it8703f(offs_t offset, uint8_t data);
240 	// parallel port
241 	uint8_t lpt_read(offs_t offset);
242 	void lpt_write(offs_t offset, uint8_t data);
243 	// uarts
244 	uint8_t serial1_read(offs_t offset);
245 	void serial1_write(offs_t offset, uint8_t data);
246 	uint8_t serial2_read(offs_t offset);
247 	void serial2_write(offs_t offset, uint8_t data);
248 	// keyboard
249 	uint8_t at_keybc_r(offs_t offset);
250 	void at_keybc_w(offs_t offset, uint8_t data);
251 	uint8_t keybc_status_r();
252 	void keybc_command_w(uint8_t data);
253 
254 protected:
255 	virtual void device_start() override;
256 
257 private:
258 	enum OperatingMode
259 	{
260 		Run = 0,
261 		Configuration = 1
262 	} mode;
263 	enum LogicalDevice
264 	{
265 		FDC = 0,        // Floppy disk controller
266 		Parallel,       // Parallel port
267 		Serial1,        // Serial port 1
268 		Serial2,        // Serial port 2
269 		Keyboard = 5,   // Keyboard controller
270 		ConsumerIR,     // Consumer IR
271 		Gpio1,          // Game port, MIDI, GPIO set 1
272 		Gpio2,          // GPIO set 2
273 		Gpio34,         // GPIO set 3 and 4
274 		ACPI,           // ACPI
275 		Gpio567 = 12    // GPIO set 5, 6 and 7
276 	};
277 	int config_key_step;
278 	int config_index;
279 	int logical_device;
280 	uint8_t global_configuration_registers[0x30];
281 	uint8_t configuration_registers[13][0x100];
282 	devcb_write_line pin_reset_callback;
283 	devcb_write_line pin_gatea20_callback;
284 	devcb_write_line m_txd1_callback;
285 	devcb_write_line m_ndtr1_callback;
286 	devcb_write_line m_nrts1_callback;
287 	devcb_write_line m_txd2_callback;
288 	devcb_write_line m_ndtr2_callback;
289 	devcb_write_line m_nrts2_callback;
290 	required_device<smc37c78_device> floppy_controller_fdcdev;
291 	required_device<pc_lpt_device> pc_lpt_lptdev;
292 	required_device<ns16450_device> pc_serial1_comdev;
293 	required_device<ns16450_device> pc_serial2_comdev;
294 	required_device<kbdc8042_device> m_kbdc;
295 	bool enabled_logical[13];
296 	bool enabled_game_port;
297 	bool enabled_midi_port;
298 
299 	lpcbus_host_interface *lpchost;
300 	int lpcindex;
301 	address_space *memspace;
302 	address_space *iospace;
303 
304 	void internal_memory_map(address_map &map);
305 	void internal_io_map(address_map &map);
306 	uint16_t get_base_address(int logical, int index);
307 	void map_fdc_addresses();
308 	void map_lpt_addresses();
309 	void map_serial1_addresses();
310 	void map_serial2_addresses();
311 	void map_keyboard_addresses();
312 	void write_global_configuration_register(int index, int data);
313 	void write_logical_configuration_register(int index, int data);
314 	void write_fdd_configuration_register(int index, int data);
315 	void write_parallel_configuration_register(int index, int data);
316 	void write_serial1_configuration_register(int index, int data);
317 	void write_serial2_configuration_register(int index, int data);
318 	void write_keyboard_configuration_register(int index, int data);
319 	uint16_t read_global_configuration_register(int index);
320 	uint16_t read_logical_configuration_register(int index);
321 	uint16_t read_fdd_configuration_register(int index) { return configuration_registers[LogicalDevice::FDC][index]; }
322 	uint16_t read_parallel_configuration_register(int index) { return configuration_registers[LogicalDevice::Parallel][index]; }
323 	uint16_t read_serial1_configuration_register(int index) { return configuration_registers[LogicalDevice::Serial1][index]; }
324 	uint16_t read_serial2_configuration_register(int index) { return configuration_registers[LogicalDevice::Serial2][index]; }
325 	uint16_t read_keyboard_configuration_register(int index) { return configuration_registers[LogicalDevice::Keyboard][index]; }
326 };
327 
328 DECLARE_DEVICE_TYPE(IT8703F, it8703f_device)
329 
330 
331 #endif
332