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