trunk/src/mess/drivers/msx.c
| r31041 | r31042 | |
| 26 | 26 | ** - y503iir, y503iir2: Net not emulated |
| 27 | 27 | ** - y503iir, y503iir2: Floppy support broken |
| 28 | 28 | ** - cpc300: Config for MSX Tutor ON/OFF is not saved |
| 29 | | ** - expert20: Does not boot |
| 30 | 29 | ** - fs4600: Kanji12 not emulated; how to trigger usage of kanji12?? |
| 31 | 30 | ** - fsa1fm: Firmware not emulated |
| 32 | 31 | ** - fsa1fm: kanji12 not emulated |
| 33 | 32 | ** - fsa1fm: Modem not emulated |
| 34 | 33 | ** - nms8280, nms8280g: Digitizer functionality not emulated |
| 35 | 34 | ** - vg8230j: Floppy support broken? |
| 36 | | ** - hotbit20: Does not boot |
| 37 | 35 | ** - hbf1: Does not boot. This seems to be caused by a raise condition between setting the VBlank bit in the |
| 38 | 36 | ** VDP status register and the z80 taking the interrupt. Currently the interrupt gets taken before the |
| 39 | 37 | ** bit can be read, so the code goes into an infinite loop. |
| r31041 | r31042 | |
| 1162 | 1160 | MACHINE_CONFIG_END |
| 1163 | 1161 | |
| 1164 | 1162 | static MACHINE_CONFIG_FRAGMENT( msx_microsol ) |
| 1165 | | // TODO: Implement MICROSOL, the fragment below is to keep the core happy |
| 1166 | 1163 | MCFG_WD2793x_ADD("fdc", XTAL_4MHz / 4) |
| 1167 | 1164 | MCFG_WD_FDC_FORCE_READY |
| 1168 | 1165 | MACHINE_CONFIG_END |
| r31041 | r31042 | |
| 3308 | 3305 | MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0) |
| 3309 | 3306 | MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */ |
| 3310 | 3307 | MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0x20000) /* BASIC */ |
| 3311 | | MCFG_MSX_LAYOUT_DISK1("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ |
| 3308 | MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ |
| 3312 | 3309 | MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */ |
| 3313 | 3310 | MCFG_MSX_RAMIO_SET_BITS(0x80) |
| 3314 | 3311 | MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0) |
| r31041 | r31042 | |
| 4355 | 4352 | MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0) |
| 4356 | 4353 | MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */ |
| 4357 | 4354 | MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0x20000) /* BASIC */ |
| 4358 | | MCFG_MSX_LAYOUT_DISK1("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ |
| 4355 | MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ |
| 4359 | 4356 | MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */ |
| 4360 | 4357 | MCFG_MSX_RAMIO_SET_BITS(0x80) |
| 4361 | 4358 | MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0) |
| r31041 | r31042 | |
| 5905 | 5902 | COMP(1985, msx2, 0, msx, msx2_gen, msx2, msx_state, msx, "ASCII & Microsoft", "MSX2", 0) |
| 5906 | 5903 | COMP(1986, ax350, msx2, 0, ax350, msx2, msx_state, msx, "Al Alamiah", "AX-350", 0) |
| 5907 | 5904 | COMP(1986, ax370, msx2, 0, ax370, msx2, msx_state, msx, "Al Alamiah", "AX-370", 0) |
| 5908 | | COMP(1986, expert20, msx2, 0, expert20, msx2, msx_state, msx, "Gradiente", "Expert 2.0 (Brazil)" , GAME_NOT_WORKING) // Black screen |
| 5905 | COMP(1986, expert20, msx2, 0, expert20, msx2, msx_state, msx, "Gradiente", "Expert 2.0 (Brazil)" , 0) |
| 5909 | 5906 | COMP(1986, nms8220, msx2, 0, nms8220, msx2, msx_state, msx, "Philips", "NMS-8220 (12-jun-1986)", 0) |
| 5910 | 5907 | COMP(1986, nms8220a, msx2, 0, nms8220a, msx2, msx_state, msx, "Philips", "NMS-8220 (13-aug-1986)", 0) |
| 5911 | 5908 | COMP(1986, vg8230, msx2, 0, vg8230, msx2, msx_state, msx, "Philips", "VG-8230", 0) |
| r31041 | r31042 | |
| 5929 | 5926 | COMP(1985, hbf700s, msx2, 0, hbf700s, msx2, msx_state, msx, "Sony", "HB-F700S (Spain)", 0) |
| 5930 | 5927 | COMP(1986, hbg900ap, msx2, 0, hbg900ap, msx2, msx_state, msx, "Sony", "HB-G900AP", 0 ) |
| 5931 | 5928 | COMP(1986, hbg900p, msx2, 0, hbg900p, msx2, msx_state, msx, "Sony", "HB-G900P", 0 ) |
| 5932 | | COMP(1986, hotbit20, msx2, 0, hotbit20, msx2, msx_state, msx, "Sharp / Epcom", "HB-8000 Hotbit 2.0" , GAME_NOT_WORKING) // Black screen |
| 5929 | COMP(1986, hotbit20, msx2, 0, hotbit20, msx2, msx_state, msx, "Sharp / Epcom", "HB-8000 Hotbit 2.0" , 0) // Black screen |
| 5933 | 5930 | COMP(1986, tpc310, msx2, 0, tpc310, msx2, msx_state, msx, "Talent", "TPC-310", 0) |
| 5934 | 5931 | COMP(19??, tpp311, msx2, 0, tpp311, msx2, msx_state, msx, "Talent", "TPP-311", 0) |
| 5935 | 5932 | COMP(19??, tps312, msx2, 0, tps312, msx2, msx_state, msx, "Talent", "TPS-312", 0) |
| r31041 | r31042 | |
| 5937 | 5934 | COMP(1986, hx23f, msx2, 0, hx23f, msx2, msx_state, msx, "Toshiba", "HX-23F", 0) |
| 5938 | 5935 | COMP(1986, cx7m, msx2, 0, cx7m, msx2, msx_state, msx, "Yamaha", "CX7M" , 0) |
| 5939 | 5936 | COMP(1986, cx7m128, msx2, 0, cx7m128, msx2, msx_state, msx, "Yamaha", "CX7M-128", 0) |
| 5940 | | COMP(1983, mlg30, msx2, 0, mlg30, msx2, msx_state, msx, "Mistubishi", "ML-G30", GAME_NOT_WORKING) // Screen flashes a few times before going into basic |
| 5937 | COMP(1983, mlg30, msx2, 0, mlg30, msx2, msx_state, msx, "Mistubishi", "ML-G30", 0) |
| 5941 | 5938 | COMP(1985, fs5500f1, msx2, 0, fs5500f1, msx2jp, msx_state, msx, "National / Matsushita", "FS-5500F1 (Japan)", 0 ) |
| 5942 | 5939 | COMP(1985, fs5500f2, msx2, 0, fs5500f2, msx2jp, msx_state, msx, "National / Matsushita", "FS-5500F2 (Japan)", 0 ) |
| 5943 | 5940 | COMP(1986, fs4500, msx2, 0, fs4500, msx2jp, msx_state, msx, "National / Matsushita", "FS-4500 (Japan)", 0 ) |
| r31041 | r31042 | |
| 5949 | 5946 | COMP(1987, fsa1mk2, msx2, 0, fsa1mk2, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1MK2 (Japan)", 0) |
| 5950 | 5947 | COMP(1987, fsa1f, msx2, 0, fsa1f, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1F (Japan)", 0 ) |
| 5951 | 5948 | COMP(1987, fsa1fm, msx2, 0, fsa1fm, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1FM (Japan)", 0 ) |
| 5952 | | COMP(19??, nms8250j, msx2, 0, nms8250j, msx2jp, msx_state, msx, "Philips", "NMS-8250J", GAME_NOT_WORKING) // Screen flashes a few times before going into basic |
| 5949 | COMP(19??, nms8250j, msx2, 0, nms8250j, msx2jp, msx_state, msx, "Philips", "NMS-8250J", 0) |
| 5953 | 5950 | COMP(19??, vg8230j, msx2, 0, vg8230j, msx2jp, msx_state, msx, "Philips", "VG-8230J", GAME_NOT_WORKING) // Screen flashes a few times before going into basic |
| 5954 | 5951 | COMP(1986, hbf500, msx2, 0, hbf500, msx2jp, msx_state, msx, "Sony", "HB-F500 (Japan)", 0) |
| 5955 | 5952 | COMP(1986, hbf900, msx2, 0, hbf900, msx2jp, msx_state, msx, "Sony", "HB-F900 / 1st released version (Japan)", 0) |
| r31041 | r31042 | |
| 5959 | 5956 | COMP(1987, hbf1xd, msx2, 0, hbf1xd, msx2jp, msx_state, msx, "Sony", "HB-F1XD (Japan)", 0) |
| 5960 | 5957 | COMP(1988, hbf1xdm2, msx2, 0, hbf1xdm2, msx2jp, msx_state, msx, "Sony", "HB-F1XDMK2 (Japan)", 0) |
| 5961 | 5958 | COMP(19??, mpc2300, msx2, 0, mpc2300, msx2, msx_state, msx, "Sanyo", "MPC-2300", GAME_NOT_WORKING) // Keyboard responds differently |
| 5962 | | COMP(19??, mpc25fd, msx2, 0, mpc25fd, msx2, msx_state, msx, "Sanyo", "Wavy MPC-25FD", GAME_NOT_WORKING) // Screen stays black |
| 5959 | COMP(19??, mpc25fd, msx2, 0, mpc25fd, msx2, msx_state, msx, "Sanyo", "Wavy MPC-25FD", 0) |
| 5963 | 5960 | COMP(1988, phc23, msx2, 0, phc23, msx2jp, msx_state, msx, "Sanyo", "Wavy PHC-23 (Japan)", 0) |
| 5964 | 5961 | COMP(1986, cpc300, msx2, 0, cpc300, msx2kr, msx_state, msx, "Daewoo", "IQ-2000 CPC-300 (Korea)", 0) |
| 5965 | 5962 | COMP(1986, cpc300e, msx2, 0, cpc300e, msx2kr, msx_state, msx, "Daewoo", "IQ-2000 CPC-300E (Korea)", 0) |
trunk/src/emu/bus/msx_slot/disk.c
| r31041 | r31042 | |
| 37 | 37 | const device_type MSX_SLOT_DISK2 = &device_creator<msx_slot_disk2_device>; |
| 38 | 38 | const device_type MSX_SLOT_DISK3 = &device_creator<msx_slot_disk3_device>; |
| 39 | 39 | const device_type MSX_SLOT_DISK4 = &device_creator<msx_slot_disk4_device>; |
| 40 | const device_type MSX_SLOT_DISK5 = &device_creator<msx_slot_disk5_device>; |
| 40 | 41 | |
| 41 | 42 | |
| 42 | 43 | msx_slot_disk_device::msx_slot_disk_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) |
| 43 | 44 | : msx_slot_rom_device(mconfig, type, name, tag, owner, clock, shortname, source) |
| 44 | 45 | , m_floppy0(NULL) |
| 45 | 46 | , m_floppy1(NULL) |
| 47 | , m_floppy2(NULL) |
| 48 | , m_floppy3(NULL) |
| 46 | 49 | , m_floppy(NULL) |
| 47 | 50 | , m_fdc_tag(NULL) |
| 48 | 51 | , m_floppy0_tag(NULL) |
| 49 | 52 | , m_floppy1_tag(NULL) |
| 53 | , m_floppy2_tag(NULL) |
| 54 | , m_floppy3_tag(NULL) |
| 50 | 55 | { |
| 51 | 56 | } |
| 52 | 57 | |
| r31041 | r31042 | |
| 60 | 65 | fatalerror("msx_slot_disk_device: no FDC tag specified\n"); |
| 61 | 66 | } |
| 62 | 67 | |
| 63 | | m_floppy0 = owner()->subdevice<floppy_connector>(m_floppy0_tag); |
| 64 | | m_floppy1 = owner()->subdevice<floppy_connector>(m_floppy1_tag); |
| 68 | m_floppy0 = m_floppy0_tag ? owner()->subdevice<floppy_connector>(m_floppy0_tag) : NULL; |
| 69 | m_floppy1 = m_floppy1_tag ? owner()->subdevice<floppy_connector>(m_floppy1_tag) : NULL; |
| 70 | m_floppy2 = m_floppy2_tag ? owner()->subdevice<floppy_connector>(m_floppy2_tag) : NULL; |
| 71 | m_floppy3 = m_floppy3_tag ? owner()->subdevice<floppy_connector>(m_floppy3_tag) : NULL; |
| 65 | 72 | |
| 66 | 73 | if (m_floppy0 == NULL && m_floppy1 == NULL) |
| 67 | 74 | { |
| r31041 | r31042 | |
| 508 | 515 | return msx_slot_rom_device::read(space, offset); |
| 509 | 516 | } |
| 510 | 517 | |
| 518 | |
| 519 | |
| 520 | |
| 521 | msx_slot_disk5_device::msx_slot_disk5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 522 | : msx_slot_wd_disk_device(mconfig, MSX_SLOT_DISK5, "MSX Internal floppy type 5", tag, owner, clock, "msx_slot_disk5", __FILE__) |
| 523 | , m_control(0) |
| 524 | { |
| 525 | } |
| 526 | |
| 527 | |
| 528 | void msx_slot_disk5_device::device_start() |
| 529 | { |
| 530 | msx_slot_wd_disk_device::device_start(); |
| 531 | |
| 532 | save_item(NAME(m_control)); |
| 533 | |
| 534 | machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk5_device::post_load), this)); |
| 535 | |
| 536 | // Install IO read/write handlers |
| 537 | address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO); |
| 538 | space.install_write_handler(0xd0, 0xd4, write8_delegate(FUNC(msx_slot_disk5_device::io_write), this)); |
| 539 | space.install_read_handler(0xd0, 0xd4, read8_delegate(FUNC(msx_slot_disk5_device::io_read), this)); |
| 540 | } |
| 541 | |
| 542 | |
| 543 | void msx_slot_disk5_device::device_reset() |
| 544 | { |
| 545 | m_fdc->dden_w(false); |
| 546 | } |
| 547 | |
| 548 | |
| 549 | void msx_slot_disk5_device::post_load() |
| 550 | { |
| 551 | set_control(m_control); |
| 552 | } |
| 553 | |
| 554 | |
| 555 | void msx_slot_disk5_device::set_control(UINT8 control) |
| 556 | { |
| 557 | m_control = control; |
| 558 | |
| 559 | switch (m_control & 0x0f) |
| 560 | { |
| 561 | case 0x01: |
| 562 | m_floppy = m_floppy0 ? m_floppy0->get_device() : NULL; |
| 563 | break; |
| 564 | |
| 565 | case 0x02: |
| 566 | m_floppy = m_floppy1 ? m_floppy1->get_device() : NULL; |
| 567 | break; |
| 568 | |
| 569 | case 0x04: |
| 570 | m_floppy = m_floppy2 ? m_floppy2->get_device() : NULL; |
| 571 | break; |
| 572 | |
| 573 | case 0x08: |
| 574 | m_floppy = m_floppy3 ? m_floppy3->get_device() : NULL; |
| 575 | break; |
| 576 | |
| 577 | default: |
| 578 | m_floppy = NULL; |
| 579 | break; |
| 580 | } |
| 581 | |
| 582 | if (m_floppy) |
| 583 | { |
| 584 | m_floppy->mon_w((m_control & 0x20) ? 0 : 1); |
| 585 | m_floppy->ss_w((m_control & 0x10) ? 1 : 0); |
| 586 | } |
| 587 | |
| 588 | m_fdc->set_floppy(m_floppy); |
| 589 | } |
| 590 | |
| 591 | |
| 592 | READ8_MEMBER(msx_slot_disk5_device::io_read) |
| 593 | { |
| 594 | switch (offset) |
| 595 | { |
| 596 | case 0x00: |
| 597 | return m_fdc->status_r(); |
| 598 | |
| 599 | case 0x01: |
| 600 | return m_fdc->track_r(); |
| 601 | |
| 602 | case 0x02: |
| 603 | return m_fdc->sector_r(); |
| 604 | |
| 605 | case 0x03: |
| 606 | return m_fdc->data_r(); |
| 607 | |
| 608 | case 0x04: |
| 609 | return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0); |
| 610 | } |
| 611 | |
| 612 | return 0xff; |
| 613 | } |
| 614 | |
| 615 | |
| 616 | WRITE8_MEMBER(msx_slot_disk5_device::io_write) |
| 617 | { |
| 618 | switch (offset) |
| 619 | { |
| 620 | case 0x00: |
| 621 | m_fdc->cmd_w(data); |
| 622 | break; |
| 623 | |
| 624 | case 0x01: |
| 625 | m_fdc->track_w(data); |
| 626 | break; |
| 627 | |
| 628 | case 0x02: |
| 629 | m_fdc->sector_w(data); |
| 630 | break; |
| 631 | |
| 632 | case 0x03: |
| 633 | m_fdc->data_w(data); |
| 634 | break; |
| 635 | |
| 636 | case 0x04: |
| 637 | set_control(data); |
| 638 | break; |
| 639 | } |
| 640 | } |
| 641 | |
| 642 | |
trunk/src/emu/bus/msx_slot/disk.h
| r31041 | r31042 | |
| 17 | 17 | extern const device_type MSX_SLOT_DISK3; |
| 18 | 18 | /* TC8566 accessed through 7ff0-7ff7 (used in Turob-R, untested) */ |
| 19 | 19 | extern const device_type MSX_SLOT_DISK4; |
| 20 | /* WD FDC accessed through i/o ports 0xd0-0xd4 */ |
| 21 | extern const device_type MSX_SLOT_DISK5; |
| 20 | 22 | |
| 23 | |
| 21 | 24 | #define MCFG_MSX_SLOT_DISK1_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \ |
| 22 | 25 | MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK1, _startpage, _numpages) \ |
| 23 | 26 | msx_slot_rom_device::set_rom_start(*device, _region, _offset); \ |
| r31041 | r31042 | |
| 46 | 49 | msx_slot_disk_device::set_floppy0_tag(*device, _floppy0_tag); \ |
| 47 | 50 | msx_slot_disk_device::set_floppy1_tag(*device, _floppy1_tag); |
| 48 | 51 | |
| 52 | #define MCFG_MSX_SLOT_DISK5_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag, _floppy2_tag, _floppy3_tag) \ |
| 53 | MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK5, _startpage, _numpages) \ |
| 54 | msx_slot_rom_device::set_rom_start(*device, _region, _offset); \ |
| 55 | msx_slot_disk_device::set_fdc_tag(*device, _fdc_tag); \ |
| 56 | msx_slot_disk_device::set_floppy0_tag(*device, _floppy0_tag); \ |
| 57 | msx_slot_disk_device::set_floppy1_tag(*device, _floppy1_tag); \ |
| 58 | msx_slot_disk_device::set_floppy2_tag(*device, _floppy2_tag); \ |
| 59 | msx_slot_disk_device::set_floppy3_tag(*device, _floppy3_tag); |
| 49 | 60 | |
| 61 | |
| 50 | 62 | class msx_slot_disk_device : public msx_slot_rom_device |
| 51 | 63 | { |
| 52 | 64 | public: |
| r31041 | r31042 | |
| 58 | 70 | static void set_fdc_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_fdc_tag = tag; } |
| 59 | 71 | static void set_floppy0_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy0_tag = tag; } |
| 60 | 72 | static void set_floppy1_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy1_tag = tag; } |
| 73 | static void set_floppy2_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy2_tag = tag; } |
| 74 | static void set_floppy3_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy3_tag = tag; } |
| 61 | 75 | |
| 62 | 76 | protected: |
| 63 | 77 | floppy_connector *m_floppy0; |
| 64 | 78 | floppy_connector *m_floppy1; |
| 79 | floppy_connector *m_floppy2; |
| 80 | floppy_connector *m_floppy3; |
| 65 | 81 | floppy_image_device *m_floppy; |
| 66 | 82 | |
| 67 | 83 | const char *m_fdc_tag; |
| 68 | 84 | const char *m_floppy0_tag; |
| 69 | 85 | const char *m_floppy1_tag; |
| 86 | const char *m_floppy2_tag; |
| 87 | const char *m_floppy3_tag; |
| 70 | 88 | }; |
| 71 | 89 | |
| 72 | 90 | |
| r31041 | r31042 | |
| 156 | 174 | }; |
| 157 | 175 | |
| 158 | 176 | |
| 177 | class msx_slot_disk5_device : public msx_slot_wd_disk_device |
| 178 | { |
| 179 | public: |
| 180 | msx_slot_disk5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 181 | |
| 182 | virtual void device_start(); |
| 183 | virtual void device_reset(); |
| 184 | |
| 185 | DECLARE_READ8_MEMBER(io_read); |
| 186 | DECLARE_WRITE8_MEMBER(io_write); |
| 187 | |
| 188 | void post_load(); |
| 189 | |
| 190 | private: |
| 191 | UINT8 m_control; |
| 192 | |
| 193 | void set_control(UINT8 control); |
| 194 | }; |
| 195 | |
| 196 | |
| 159 | 197 | #endif |
| 160 | 198 | |