1 // license:BSD-3-Clause
2 // copyright-holders:Wilbert Pol
3 /*****************************************************************************
4  *
5  * includes/msx.h
6  *
7  ****************************************************************************/
8 
9 #ifndef MAME_INCLUDES_MSX_H
10 #define MAME_INCLUDES_MSX_H
11 
12 #include "cpu/z80/z80.h"
13 #include "machine/i8255.h"
14 #include "machine/rp5c01.h"
15 #include "machine/buffer.h"
16 #include "machine/input_merger.h"
17 #include "bus/centronics/ctronics.h"
18 #include "sound/ay8910.h"
19 #include "sound/dac.h"
20 #include "sound/ym2413.h"
21 #include "video/v9938.h"
22 #include "video/tms9928a.h"
23 #include "imagedev/cassette.h"
24 #include "formats/fmsx_cas.h"
25 #include "formats/msx_dsk.h"
26 #include "hashfile.h"
27 #include "machine/wd_fdc.h"
28 #include "imagedev/floppy.h"
29 #include "bus/msx_slot/slot.h"
30 #include "bus/msx_slot/rom.h"
31 #include "bus/msx_slot/ram.h"
32 #include "bus/msx_slot/cartridge.h"
33 #include "bus/msx_slot/ram_mm.h"
34 #include "bus/msx_slot/disk.h"
35 #include "bus/msx_slot/music.h"
36 #include "bus/msx_slot/bunsetsu.h"
37 #include "bus/msx_slot/fs4600.h"
38 #include "bus/msx_slot/panasonic08.h"
39 #include "bus/msx_slot/sony08.h"
40 #include "machine/msx_switched.h"
41 
42 
43 #define TC8521_TAG  "rtc"
44 
45 
46 class msx_state : public driver_device
47 {
48 public:
msx_state(const machine_config & mconfig,device_type type,const char * tag)49 	msx_state(const machine_config &mconfig, device_type type, const char *tag)
50 		: driver_device(mconfig, type, tag)
51 		, m_maincpu(*this, "maincpu")
52 		, m_cassette(*this, "cassette")
53 		, m_ay8910(*this, "ay8910")
54 		, m_dac(*this, "dac")
55 		, m_region_maincpu(*this, "maincpu")
56 		, m_region_kanji(*this, "kanji")
57 		, m_io_joy(*this, "JOY%u", 0U)
58 		, m_io_dsw(*this, "DSW")
59 		, m_io_mouse(*this, "MOUSE%u", 0U)
60 		, m_io_key(*this, "KEY%u", 0U)
61 		, m_leds(*this, "led%u", 1U)
62 		, m_psg_b(0)
63 		, m_kanji_latch(0)
64 		, m_empty_slot(mconfig, *this)
65 		, m_primary_slot(0)
66 		, m_port_c_old(0)
67 		, m_keylatch(0)
68 	{
69 		for (int prim = 0; prim < 4; prim++ )
70 		{
71 			m_slot_expanded[prim] = false;
72 			m_secondary_slot[prim] = 0;
73 			for (int sec = 0; sec < 4; sec++ )
74 			{
75 				for (int page = 0; page < 4; page++ )
76 				{
77 					m_all_slots[prim][sec][page] = nullptr;
78 				}
79 			}
80 		}
81 		m_mouse[0] = m_mouse[1] = 0;
82 		m_mouse_stat[0] = m_mouse_stat[1] = 0;
83 		m_empty_slot.set_memory_space(m_maincpu, AS_PROGRAM);
84 		m_empty_slot.set_io_space(m_maincpu, AS_IO);
85 	}
86 
87 	void hc6(machine_config &config);
88 	void hb75d(machine_config &config);
89 	void dpc100(machine_config &config);
90 	void hb55p(machine_config &config);
91 	void hotbi13p(machine_config &config);
92 	void fspc800(machine_config &config);
93 	void mpc200(machine_config &config);
94 	void hb201p(machine_config &config);
95 	void hx22i(machine_config &config);
96 	void svi738dk(machine_config &config);
97 	void gfc1080a(machine_config &config);
98 	void svi738pl(machine_config &config);
99 	void hx10dp(machine_config &config);
100 	void perfect1(machine_config &config);
101 	void mlf110(machine_config &config);
102 	void cf1200(machine_config &config);
103 	void hx20(machine_config &config);
104 	void cf3000(machine_config &config);
105 	void mpc100(machine_config &config);
106 	void vg8020f(machine_config &config);
107 	void hx10f(machine_config &config);
108 	void cf2000(machine_config &config);
109 	void expertpl(machine_config &config);
110 	void fs4000a(machine_config &config);
111 	void mpc10(machine_config &config);
112 	void pv16(machine_config &config);
113 	void jvchc7gb(machine_config &config);
114 	void phc28(machine_config &config);
115 	void hx10sa(machine_config &config);
116 	void cx5m128(machine_config &config);
117 	void expert10(machine_config &config);
118 	void mbh50(machine_config &config);
119 	void hc7(machine_config &config);
120 	void gfc1080(machine_config &config);
121 	void cpc51(machine_config &config);
122 	void ax150(machine_config &config);
123 	void phc28s(machine_config &config);
124 	void mlfx1(machine_config &config);
125 	void tadpc200(machine_config &config);
126 	void gsfc200(machine_config &config);
127 	void hx10d(machine_config &config);
128 	void expertdp(machine_config &config);
129 	void yis303(machine_config &config);
130 	void canonv25(machine_config &config);
131 	void svi738sp(machine_config &config);
132 	void fmx(machine_config &config);
133 	void phc2(machine_config &config);
134 	void pv7(machine_config &config);
135 	void hx10(machine_config &config);
136 	void mlf48(machine_config &config);
137 	void cpc50b(machine_config &config);
138 	void hb10p(machine_config &config);
139 	void hx20i(machine_config &config);
140 	void mx10(machine_config &config);
141 	void mx15(machine_config &config);
142 	void expert13(machine_config &config);
143 	void bruc100(machine_config &config);
144 	void hx21(machine_config &config);
145 	void cf3300(machine_config &config);
146 	void cx5f1(machine_config &config);
147 	void hx10e(machine_config &config);
148 	void dpc200(machine_config &config);
149 	void svi738(machine_config &config);
150 	void dpc200e(machine_config &config);
151 	void canonv10(machine_config &config);
152 	void yis503(machine_config &config);
153 	void mpc200sp(machine_config &config);
154 	void svi738sw(machine_config &config);
155 	void vg8010f(machine_config &config);
156 	void dpc180(machine_config &config);
157 	void mlf120(machine_config &config);
158 	void hb201(machine_config &config);
159 	void piopxv60(machine_config &config);
160 	void hb10(machine_config &config);
161 	void hb501p(machine_config &config);
162 	void cx5m(machine_config &config);
163 	void mx101(machine_config &config);
164 	void mx64(machine_config &config);
165 	void hb55d(machine_config &config);
166 	void nms801(machine_config &config);
167 	void svi728(machine_config &config);
168 	void hotbi13b(machine_config &config);
169 	void hotbit12(machine_config &config);
170 	void hotbit11(machine_config &config);
171 	void vg8010(machine_config &config);
172 	void cf2700(machine_config &config);
173 	void hx21i(machine_config &config);
174 	void mbh2(machine_config &config);
175 	void cx5f(machine_config &config);
176 	void mpc64(machine_config &config);
177 	void yc64(machine_config &config);
178 	void yis503m(machine_config &config);
179 	void gsfc80u(machine_config &config);
180 	void cf2700g(machine_config &config);
181 	void ax170(machine_config &config);
182 	void y503iir(machine_config &config);
183 	void svi738ar(machine_config &config);
184 	void yis503ii(machine_config &config);
185 	void yis503f(machine_config &config);
186 	void cx5m2(machine_config &config);
187 	void spc800(machine_config &config);
188 	void canonv20(machine_config &config);
189 	void hb20p(machine_config &config);
190 	void mbh25(machine_config &config);
191 	void fs4000(machine_config &config);
192 	void hx10s(machine_config &config);
193 	void piopx7uk(machine_config &config);
194 	void hc5(machine_config &config);
195 	void dgnmsx(machine_config &config);
196 	void fdpc200(machine_config &config);
197 	void hx22(machine_config &config);
198 	void fs1300(machine_config &config);
199 	void phc28l(machine_config &config);
200 	void hb101p(machine_config &config);
201 	void expert11(machine_config &config);
202 	void vg802020(machine_config &config);
203 	void tadpc20a(machine_config &config);
204 	void hb75p(machine_config &config);
205 	void piopx7(machine_config &config);
206 	void canonv8(machine_config &config);
207 	void cpc88(machine_config &config);
208 	void vg802000(machine_config &config);
209 	void mlf80(machine_config &config);
210 	void cpc50a(machine_config &config);
211 	void hb701fd(machine_config &config);
212 	void vg8000(machine_config &config);
213 	void hb55(machine_config &config);
214 	void y503iir2(machine_config &config);
215 	void fpc500(machine_config &config);
216 
217 protected:
218 	void msx(machine_config &config);
219 	template<typename VDPType> void msx1(VDPType &vdp_type, machine_config &config);
220 
221 	void msx1_cartlist(machine_config &config);
222 	void msx1_floplist(machine_config &config);
223 	void msx_fd1793(machine_config &config);
224 	void msx_wd2793_force_ready(machine_config &config);
225 	void msx_wd2793(machine_config &config);
226 	void msx_mb8877a(machine_config &config);
227 	void msx_tc8566af(machine_config &config);
228 	void msx_microsol(machine_config &config);
229 	void msx_1_35_ssdd_drive(machine_config &config);
230 	void msx_1_35_dd_drive(machine_config &config);
231 	void msx_2_35_dd_drive(machine_config &config);
232 
233 	// static configuration helpers
234 	void install_slot_pages(uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, msx_internal_slot_interface &device);
235 	template <typename T, typename U>
add_internal_slot(machine_config & config,T && type,U && tag,uint8_t prim,uint8_t sec,uint8_t page,uint8_t numpages)236 	auto &add_internal_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages)
237 	{
238 		auto &device(std::forward<T>(type)(config, std::forward<U>(tag), 0U));
239 		device.set_memory_space(m_maincpu, AS_PROGRAM);
240 		device.set_io_space(m_maincpu, AS_IO);
241 		device.set_start_address(page * 0x4000);
242 		device.set_size(numpages * 0x4000);
243 		install_slot_pages(prim, sec, page, numpages, device);
244 		return device;
245 	}
246 	template <typename T, typename U>
add_internal_slot(machine_config & config,T && type,U && tag,uint8_t prim,uint8_t sec,uint8_t page,uint8_t numpages,const char * region,uint32_t offset)247 	auto &add_internal_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, const char *region, uint32_t offset)
248 	{
249 		auto &device(std::forward<T>(type)(config, std::forward<U>(tag), 0U));
250 		device.set_memory_space(m_maincpu, AS_PROGRAM);
251 		device.set_io_space(m_maincpu, AS_IO);
252 		device.set_start_address(page * 0x4000);
253 		device.set_size(numpages * 0x4000);
254 		device.set_rom_start(region, offset);
255 		install_slot_pages(prim, sec, page, numpages, device);
256 		return device;
257 	}
258 	template <typename T, typename U>
add_internal_slot_mirrored(machine_config & config,T && type,U && tag,uint8_t prim,uint8_t sec,uint8_t page,uint8_t numpages,const char * region,uint32_t offset)259 	auto &add_internal_slot_mirrored(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, uint8_t page, uint8_t numpages, const char *region, uint32_t offset)
260 	{
261 		// Memory mapped FDC registers are also accessible through page 2
262 		auto &device(type(config, std::forward<U>(tag), 0U));
263 		device.set_memory_space(m_maincpu, AS_PROGRAM);
264 		device.set_io_space(m_maincpu, AS_IO);
265 		device.set_start_address(page * 0x4000);
266 		device.set_size(0x4000);
267 		device.set_rom_start(region, offset);
268 		install_slot_pages(prim, sec, page, numpages, device);
269 		return device;
270 	}
271 	template <int N, typename T, typename U, typename V>
add_cartridge_slot(machine_config & config,T && type,U && tag,uint8_t prim,uint8_t sec,V && intf,const char * deft)272 	auto &add_cartridge_slot(machine_config &config, T &&type, U &&tag, uint8_t prim, uint8_t sec, V &&intf, const char *deft)
273 	{
274 		auto &device(type(config, std::forward<U>(tag), 0U));
275 		device.set_memory_space(m_maincpu, AS_PROGRAM);
276 		device.set_io_space(m_maincpu, AS_IO);
277 		device.option_reset();
278 		intf(device);
279 		device.set_default_option(deft);
280 		device.set_fixed(false);
281 		device.irq_handler().set("mainirq", FUNC(input_merger_device::in_w<N>));
282 		install_slot_pages(prim, sec, 0, 4, device);
283 		return device;
284 	}
285 
286 	virtual void driver_start() override;
287 	virtual void machine_start() override;
288 	virtual void machine_reset() override;
289 	virtual void device_post_load() override;
290 
291 	void msx_sec_slot_w(uint8_t data);
292 	uint8_t msx_sec_slot_r();
293 	uint8_t msx_kanji_r(offs_t offset);
294 	void msx_kanji_w(offs_t offset, uint8_t data);
295 	void msx_ppi_port_a_w(uint8_t data);
296 	void msx_ppi_port_c_w(uint8_t data);
297 	uint8_t msx_ppi_port_b_r();
298 	uint8_t msx_mem_read(offs_t offset);
299 	void msx_mem_write(offs_t offset, uint8_t data);
300 	uint8_t msx_psg_port_a_r();
301 	uint8_t msx_psg_port_b_r();
302 	void msx_psg_port_a_w(uint8_t data);
303 	void msx_psg_port_b_w(uint8_t data);
304 
305 private:
306 	void msx_memory_map_all();
307 	void msx_memory_map_page(uint8_t page);
308 	void msx_memory_reset();
309 	void msx_memory_init();
310 
311 	DECLARE_FLOPPY_FORMATS(floppy_formats);
312 
313 	INTERRUPT_GEN_MEMBER(msx_interrupt);
314 
315 protected:
316 	void msx_io_map(address_map &map);
317 	void msx_memory_map(address_map &map);
318 
319 	required_device<z80_device> m_maincpu;
320 	required_device<cassette_image_device> m_cassette;
321 	required_device<ay8910_device> m_ay8910;
322 	required_device<dac_bit_interface> m_dac;
323 	required_memory_region m_region_maincpu;
324 	optional_memory_region m_region_kanji;
325 	required_ioport_array<2> m_io_joy;
326 	required_ioport m_io_dsw;
327 	required_ioport_array<2> m_io_mouse;
328 	required_ioport_array<6> m_io_key;
329 	output_finder<2> m_leds;
330 
331 private:
332 	/* PSG */
333 	int m_psg_b;
334 	/* mouse */
335 	uint16_t m_mouse[2];
336 	int m_mouse_stat[2];
337 	/* kanji */
338 	int m_kanji_latch;
339 	/* memory */
340 	msx_internal_slot_interface m_empty_slot;
341 	msx_internal_slot_interface *m_all_slots[4][4][4];
342 	msx_internal_slot_interface *m_current_page[4];
343 	bool m_slot_expanded[4];
344 	uint8_t m_primary_slot;
345 	uint8_t m_secondary_slot[4];
346 	int m_port_c_old;
347 	int m_keylatch;
348 };
349 
350 
351 class msx2_state : public msx_state
352 {
353 public:
msx2_state(const machine_config & mconfig,device_type type,const char * tag)354 	msx2_state(const machine_config &mconfig, device_type type, const char *tag)
355 		: msx_state(mconfig, type, tag)
356 		, m_v9938(*this, "v9938")
357 		, m_v9958(*this, "v9958")
358 		, m_rtc(*this, TC8521_TAG)
359 		, m_rtc_latch(0)
360 	{
361 	}
362 
363 	void ax350(machine_config &config);
364 	void ax370(machine_config &config);
365 	void canonv25(machine_config &config);
366 	void canonv30(machine_config &config);
367 	void canonv30f(machine_config &config);
368 	void cpc300(machine_config &config);
369 	void cpc300e(machine_config &config);
370 	void cpc330k(machine_config &config);
371 	void cpc400(machine_config &config);
372 	void cpc400s(machine_config &config);
373 	void cpc61(machine_config &config);
374 	void cpg120(machine_config &config);
375 	void fpc900(machine_config &config);
376 	void expert20(machine_config &config);
377 	void mbh70(machine_config &config);
378 	void kmc5000(machine_config &config);
379 	void mlg1(machine_config &config);
380 	void mlg3(machine_config &config);
381 	void mlg10(machine_config &config);
382 	void mlg30(machine_config &config);
383 	void fs4500(machine_config &config);
384 	void fs4600(machine_config &config);
385 	void fs4700(machine_config &config);
386 	void fs5000(machine_config &config);
387 	void fs5500f1(machine_config &config);
388 	void fs5500f2(machine_config &config);
389 	void fsa1(machine_config &config);
390 	void fsa1a(machine_config &config);
391 	void fsa1f(machine_config &config);
392 	void fsa1fm(machine_config &config);
393 	void fsa1mk2(machine_config &config);
394 	void nms8220(machine_config &config);
395 	void nms8220a(machine_config &config);
396 	void nms8245(machine_config &config);
397 	void nms8245f(machine_config &config);
398 	void nms8250(machine_config &config);
399 	void nms8250f(machine_config &config);
400 	void nms8250j(machine_config &config);
401 	void nms8255(machine_config &config);
402 	void nms8255f(machine_config &config);
403 	void nms8260(machine_config &config);
404 	void nms8280(machine_config &config);
405 	void nms8280f(machine_config &config);
406 	void nms8280g(machine_config &config);
407 	void vg8230(machine_config &config);
408 	void vg8230j(machine_config &config);
409 	void vg8235(machine_config &config);
410 	void vg8235f(machine_config &config);
411 	void vg8240(machine_config &config);
412 	void mpc2300(machine_config &config);
413 	void mpc2500f(machine_config &config);
414 	void mpc25fd(machine_config &config);
415 	void mpc27(machine_config &config);
416 	void phc23(machine_config &config);
417 	void phc55fd2(machine_config &config);
418 	void phc77(machine_config &config);
419 	void hotbit20(machine_config &config);
420 	void hbf1(machine_config &config);
421 	void hbf12(machine_config &config);
422 	void hbf1xd(machine_config &config);
423 	void hbf1xdm2(machine_config &config);
424 	void hbf5(machine_config &config);
425 	void hbf500(machine_config &config);
426 	void hbf500f(machine_config &config);
427 	void hbf500p(machine_config &config);
428 	void hbf700d(machine_config &config);
429 	void hbf700f(machine_config &config);
430 	void hbf700p(machine_config &config);
431 	void hbf700s(machine_config &config);
432 	void hbf900(machine_config &config);
433 	void hbf900a(machine_config &config);
434 	void hbf9p(machine_config &config);
435 	void hbf9pr(machine_config &config);
436 	void hbf9s(machine_config &config);
437 	void hbg900ap(machine_config &config);
438 	void hbg900p(machine_config &config);
439 	void tpc310(machine_config &config);
440 	void tpp311(machine_config &config);
441 	void tps312(machine_config &config);
442 	void hx23(machine_config &config);
443 	void hx23f(machine_config &config);
444 	void hx23i(machine_config &config);
445 	void hx33(machine_config &config);
446 	void hx34(machine_config &config);
447 	void hx34i(machine_config &config);
448 	void fstm1(machine_config &config);
449 	void victhc90(machine_config &config);
450 	void victhc95(machine_config &config);
451 	void victhc95a(machine_config &config);
452 	void cx7m(machine_config &config);
453 	void cx7m128(machine_config &config);
454 	void y503iiir(machine_config &config);
455 	void y503iiire(machine_config &config);
456 	void yis60464(machine_config &config);
457 	void yis604(machine_config &config);
458 	void y805128(machine_config &config);
459 	void y805128r2(machine_config &config);
460 	void y805128r2e(machine_config &config);
461 	void y805256(machine_config &config);
462 	void expert3i(machine_config &config);
463 	void expert3t(machine_config &config);
464 	void expertac(machine_config &config);
465 	void expertdx(machine_config &config);
466 	void fsa1fx(machine_config &config);
467 	void fsa1wsx(machine_config &config);
468 	void fsa1wx(machine_config &config);
469 	void fsa1wxa(machine_config &config);
470 	void phc35j(machine_config &config);
471 	void phc70fd(machine_config &config);
472 	void phc70fd2(machine_config &config);
473 	void hbf1xdj(machine_config &config);
474 	void hbf1xv(machine_config &config);
475 	void hbf9sp(machine_config &config);
476 	void fsa1gt(machine_config &config);
477 	void fsa1st(machine_config &config);
478 
479 protected:
480 	virtual void machine_start() override;
481 
482 private:
483 	void msx2(machine_config &config);
484 	void msx2p(machine_config &config);
485 	void msx2_pal(machine_config &config);
486 
487 	void msx2_cartlist(machine_config &config);
488 	void msx2_floplist(machine_config &config);
489 	void msx2p_floplist(machine_config &config);
490 	void msxr_floplist(machine_config &config);
491 	void msx_ym2413(machine_config &config);
492 	void msx2_64kb_vram(machine_config &config);
493 
494 	uint8_t msx_rtc_reg_r();
495 	void msx_rtc_reg_w(uint8_t data);
496 	void msx_rtc_latch_w(uint8_t data);
497 	uint8_t msx_switched_r(offs_t offset);
498 	void msx_switched_w(offs_t offset, uint8_t data);
499 	DECLARE_WRITE_LINE_MEMBER(turbo_w);
500 
501 	void msx2_io_map(address_map &map);
502 	void msx2p_io_map(address_map &map);
503 
504 	std::vector<msx_switched_interface *> m_switched;
505 
506 	optional_device<v9938_device> m_v9938;
507 	optional_device<v9958_device> m_v9958;
508 	required_device<rp5c01_device> m_rtc;
509 
510 	/* rtc */
511 	int m_rtc_latch;
512 };
513 
514 
515 #endif // MAME_INCLUDES_MSX_H
516