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