diff --git a/src/emu/bus/msx_slot/disk.c b/src/emu/bus/msx_slot/disk.c index 2b0213b4dba..c132a651cb9 100644 --- a/src/emu/bus/msx_slot/disk.c +++ b/src/emu/bus/msx_slot/disk.c @@ -37,16 +37,21 @@ const device_type MSX_SLOT_DISK1 = &device_creator; const device_type MSX_SLOT_DISK2 = &device_creator; const device_type MSX_SLOT_DISK3 = &device_creator; const device_type MSX_SLOT_DISK4 = &device_creator; +const device_type MSX_SLOT_DISK5 = &device_creator; 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) : msx_slot_rom_device(mconfig, type, name, tag, owner, clock, shortname, source) , m_floppy0(NULL) , m_floppy1(NULL) + , m_floppy2(NULL) + , m_floppy3(NULL) , m_floppy(NULL) , m_fdc_tag(NULL) , m_floppy0_tag(NULL) , m_floppy1_tag(NULL) + , m_floppy2_tag(NULL) + , m_floppy3_tag(NULL) { } @@ -60,8 +65,10 @@ void msx_slot_disk_device::device_start() fatalerror("msx_slot_disk_device: no FDC tag specified\n"); } - m_floppy0 = owner()->subdevice(m_floppy0_tag); - m_floppy1 = owner()->subdevice(m_floppy1_tag); + m_floppy0 = m_floppy0_tag ? owner()->subdevice(m_floppy0_tag) : NULL; + m_floppy1 = m_floppy1_tag ? owner()->subdevice(m_floppy1_tag) : NULL; + m_floppy2 = m_floppy2_tag ? owner()->subdevice(m_floppy2_tag) : NULL; + m_floppy3 = m_floppy3_tag ? owner()->subdevice(m_floppy3_tag) : NULL; if (m_floppy0 == NULL && m_floppy1 == NULL) { @@ -508,3 +515,128 @@ READ8_MEMBER(msx_slot_disk4_device::read) return msx_slot_rom_device::read(space, offset); } + + + +msx_slot_disk5_device::msx_slot_disk5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : msx_slot_wd_disk_device(mconfig, MSX_SLOT_DISK5, "MSX Internal floppy type 5", tag, owner, clock, "msx_slot_disk5", __FILE__) + , m_control(0) +{ +} + + +void msx_slot_disk5_device::device_start() +{ + msx_slot_wd_disk_device::device_start(); + + save_item(NAME(m_control)); + + machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk5_device::post_load), this)); + + // Install IO read/write handlers + address_space &space = machine().device("maincpu")->space(AS_IO); + space.install_write_handler(0xd0, 0xd4, write8_delegate(FUNC(msx_slot_disk5_device::io_write), this)); + space.install_read_handler(0xd0, 0xd4, read8_delegate(FUNC(msx_slot_disk5_device::io_read), this)); +} + + +void msx_slot_disk5_device::device_reset() +{ + m_fdc->dden_w(false); +} + + +void msx_slot_disk5_device::post_load() +{ + set_control(m_control); +} + + +void msx_slot_disk5_device::set_control(UINT8 control) +{ + m_control = control; + + switch (m_control & 0x0f) + { + case 0x01: + m_floppy = m_floppy0 ? m_floppy0->get_device() : NULL; + break; + + case 0x02: + m_floppy = m_floppy1 ? m_floppy1->get_device() : NULL; + break; + + case 0x04: + m_floppy = m_floppy2 ? m_floppy2->get_device() : NULL; + break; + + case 0x08: + m_floppy = m_floppy3 ? m_floppy3->get_device() : NULL; + break; + + default: + m_floppy = NULL; + break; + } + + if (m_floppy) + { + m_floppy->mon_w((m_control & 0x20) ? 0 : 1); + m_floppy->ss_w((m_control & 0x10) ? 1 : 0); + } + + m_fdc->set_floppy(m_floppy); +} + + +READ8_MEMBER(msx_slot_disk5_device::io_read) +{ + switch (offset) + { + case 0x00: + return m_fdc->status_r(); + + case 0x01: + return m_fdc->track_r(); + + case 0x02: + return m_fdc->sector_r(); + + case 0x03: + return m_fdc->data_r(); + + case 0x04: + return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0); + } + + return 0xff; +} + + +WRITE8_MEMBER(msx_slot_disk5_device::io_write) +{ + switch (offset) + { + case 0x00: + m_fdc->cmd_w(data); + break; + + case 0x01: + m_fdc->track_w(data); + break; + + case 0x02: + m_fdc->sector_w(data); + break; + + case 0x03: + m_fdc->data_w(data); + break; + + case 0x04: + set_control(data); + break; + } +} + + diff --git a/src/emu/bus/msx_slot/disk.h b/src/emu/bus/msx_slot/disk.h index 6e2b2c3ef34..ad734b7fde7 100644 --- a/src/emu/bus/msx_slot/disk.h +++ b/src/emu/bus/msx_slot/disk.h @@ -17,6 +17,9 @@ extern const device_type MSX_SLOT_DISK2; extern const device_type MSX_SLOT_DISK3; /* TC8566 accessed through 7ff0-7ff7 (used in Turob-R, untested) */ extern const device_type MSX_SLOT_DISK4; +/* WD FDC accessed through i/o ports 0xd0-0xd4 */ +extern const device_type MSX_SLOT_DISK5; + #define MCFG_MSX_SLOT_DISK1_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \ MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK1, _startpage, _numpages) \ @@ -46,6 +49,15 @@ extern const device_type MSX_SLOT_DISK4; msx_slot_disk_device::set_floppy0_tag(*device, _floppy0_tag); \ msx_slot_disk_device::set_floppy1_tag(*device, _floppy1_tag); +#define MCFG_MSX_SLOT_DISK5_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag, _floppy2_tag, _floppy3_tag) \ + MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK5, _startpage, _numpages) \ + msx_slot_rom_device::set_rom_start(*device, _region, _offset); \ + msx_slot_disk_device::set_fdc_tag(*device, _fdc_tag); \ + msx_slot_disk_device::set_floppy0_tag(*device, _floppy0_tag); \ + msx_slot_disk_device::set_floppy1_tag(*device, _floppy1_tag); \ + msx_slot_disk_device::set_floppy2_tag(*device, _floppy2_tag); \ + msx_slot_disk_device::set_floppy3_tag(*device, _floppy3_tag); + class msx_slot_disk_device : public msx_slot_rom_device { @@ -58,15 +70,21 @@ public: static void set_fdc_tag(device_t &device, const char *tag) { dynamic_cast(device).m_fdc_tag = tag; } static void set_floppy0_tag(device_t &device, const char *tag) { dynamic_cast(device).m_floppy0_tag = tag; } static void set_floppy1_tag(device_t &device, const char *tag) { dynamic_cast(device).m_floppy1_tag = tag; } + static void set_floppy2_tag(device_t &device, const char *tag) { dynamic_cast(device).m_floppy2_tag = tag; } + static void set_floppy3_tag(device_t &device, const char *tag) { dynamic_cast(device).m_floppy3_tag = tag; } protected: floppy_connector *m_floppy0; floppy_connector *m_floppy1; + floppy_connector *m_floppy2; + floppy_connector *m_floppy3; floppy_image_device *m_floppy; const char *m_fdc_tag; const char *m_floppy0_tag; const char *m_floppy1_tag; + const char *m_floppy2_tag; + const char *m_floppy3_tag; }; @@ -156,5 +174,25 @@ public: }; +class msx_slot_disk5_device : public msx_slot_wd_disk_device +{ +public: + msx_slot_disk5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual void device_start(); + virtual void device_reset(); + + DECLARE_READ8_MEMBER(io_read); + DECLARE_WRITE8_MEMBER(io_write); + + void post_load(); + +private: + UINT8 m_control; + + void set_control(UINT8 control); +}; + + #endif diff --git a/src/mess/drivers/msx.c b/src/mess/drivers/msx.c index af0563d9888..a4cee4225c1 100644 --- a/src/mess/drivers/msx.c +++ b/src/mess/drivers/msx.c @@ -26,14 +26,12 @@ ** - y503iir, y503iir2: Net not emulated ** - y503iir, y503iir2: Floppy support broken ** - cpc300: Config for MSX Tutor ON/OFF is not saved -** - expert20: Does not boot ** - fs4600: Kanji12 not emulated; how to trigger usage of kanji12?? ** - fsa1fm: Firmware not emulated ** - fsa1fm: kanji12 not emulated ** - fsa1fm: Modem not emulated ** - nms8280, nms8280g: Digitizer functionality not emulated ** - vg8230j: Floppy support broken? -** - hotbit20: Does not boot ** - hbf1: Does not boot. This seems to be caused by a raise condition between setting the VBlank bit in the ** VDP status register and the z80 taking the interrupt. Currently the interrupt gets taken before the ** bit can be read, so the code goes into an infinite loop. @@ -1162,7 +1160,6 @@ static MACHINE_CONFIG_FRAGMENT( msx_tc8566af ) MACHINE_CONFIG_END static MACHINE_CONFIG_FRAGMENT( msx_microsol ) - // TODO: Implement MICROSOL, the fragment below is to keep the core happy MCFG_WD2793x_ADD("fdc", XTAL_4MHz / 4) MCFG_WD_FDC_FORCE_READY MACHINE_CONFIG_END @@ -3308,7 +3305,7 @@ static MACHINE_CONFIG_DERIVED( expert20, msx2_pal ) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0) MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */ MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0x20000) /* BASIC */ - MCFG_MSX_LAYOUT_DISK1("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ + MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */ MCFG_MSX_RAMIO_SET_BITS(0x80) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0) @@ -4355,7 +4352,7 @@ static MACHINE_CONFIG_DERIVED( hotbit20, msx2_pal ) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot1", 1, 0) MCFG_MSX_LAYOUT_ROM("ext", 1, 1, 0, 1, "maincpu", 0x8000) /* EXT */ MCFG_MSX_LAYOUT_ROM("xbasic", 1, 1, 1, 1, "maincpu", 0x20000) /* BASIC */ - MCFG_MSX_LAYOUT_DISK1("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ + MCFG_MSX_LAYOUT_DISK5("disk", 1, 3, 1, 1, "maincpu", 0x24000) /* Microsol controller */ MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 2, 0, 0x20000) /* 128KB Mapper RAM */ MCFG_MSX_RAMIO_SET_BITS(0x80) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 3, 0) @@ -5905,7 +5902,7 @@ COMP(1984, bruc100, msx, 0, bruc100, msx, msx_state, msx, COMP(1985, msx2, 0, msx, msx2_gen, msx2, msx_state, msx, "ASCII & Microsoft", "MSX2", 0) COMP(1986, ax350, msx2, 0, ax350, msx2, msx_state, msx, "Al Alamiah", "AX-350", 0) COMP(1986, ax370, msx2, 0, ax370, msx2, msx_state, msx, "Al Alamiah", "AX-370", 0) -COMP(1986, expert20, msx2, 0, expert20, msx2, msx_state, msx, "Gradiente", "Expert 2.0 (Brazil)" , GAME_NOT_WORKING) // Black screen +COMP(1986, expert20, msx2, 0, expert20, msx2, msx_state, msx, "Gradiente", "Expert 2.0 (Brazil)" , 0) COMP(1986, nms8220, msx2, 0, nms8220, msx2, msx_state, msx, "Philips", "NMS-8220 (12-jun-1986)", 0) COMP(1986, nms8220a, msx2, 0, nms8220a, msx2, msx_state, msx, "Philips", "NMS-8220 (13-aug-1986)", 0) COMP(1986, vg8230, msx2, 0, vg8230, msx2, msx_state, msx, "Philips", "VG-8230", 0) @@ -5929,7 +5926,7 @@ COMP(1985, hbf700p, msx2, 0, hbf700p, msx2, msx_state, msx, COMP(1985, hbf700s, msx2, 0, hbf700s, msx2, msx_state, msx, "Sony", "HB-F700S (Spain)", 0) COMP(1986, hbg900ap, msx2, 0, hbg900ap, msx2, msx_state, msx, "Sony", "HB-G900AP", 0 ) COMP(1986, hbg900p, msx2, 0, hbg900p, msx2, msx_state, msx, "Sony", "HB-G900P", 0 ) -COMP(1986, hotbit20, msx2, 0, hotbit20, msx2, msx_state, msx, "Sharp / Epcom", "HB-8000 Hotbit 2.0" , GAME_NOT_WORKING) // Black screen +COMP(1986, hotbit20, msx2, 0, hotbit20, msx2, msx_state, msx, "Sharp / Epcom", "HB-8000 Hotbit 2.0" , 0) // Black screen COMP(1986, tpc310, msx2, 0, tpc310, msx2, msx_state, msx, "Talent", "TPC-310", 0) COMP(19??, tpp311, msx2, 0, tpp311, msx2, msx_state, msx, "Talent", "TPP-311", 0) COMP(19??, tps312, msx2, 0, tps312, msx2, msx_state, msx, "Talent", "TPS-312", 0) @@ -5937,7 +5934,7 @@ COMP(1986, hx23, msx2, 0, hx23, msx2, msx_state, msx, COMP(1986, hx23f, msx2, 0, hx23f, msx2, msx_state, msx, "Toshiba", "HX-23F", 0) COMP(1986, cx7m, msx2, 0, cx7m, msx2, msx_state, msx, "Yamaha", "CX7M" , 0) COMP(1986, cx7m128, msx2, 0, cx7m128, msx2, msx_state, msx, "Yamaha", "CX7M-128", 0) -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 +COMP(1983, mlg30, msx2, 0, mlg30, msx2, msx_state, msx, "Mistubishi", "ML-G30", 0) COMP(1985, fs5500f1, msx2, 0, fs5500f1, msx2jp, msx_state, msx, "National / Matsushita", "FS-5500F1 (Japan)", 0 ) COMP(1985, fs5500f2, msx2, 0, fs5500f2, msx2jp, msx_state, msx, "National / Matsushita", "FS-5500F2 (Japan)", 0 ) COMP(1986, fs4500, msx2, 0, fs4500, msx2jp, msx_state, msx, "National / Matsushita", "FS-4500 (Japan)", 0 ) @@ -5949,7 +5946,7 @@ COMP(1986, fsa1a, msx2, 0, fsa1a, msx2jp, msx_state, msx, COMP(1987, fsa1mk2, msx2, 0, fsa1mk2, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1MK2 (Japan)", 0) COMP(1987, fsa1f, msx2, 0, fsa1f, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1F (Japan)", 0 ) COMP(1987, fsa1fm, msx2, 0, fsa1fm, msx2jp, msx_state, msx, "Panasonic / Matsushita", "FS-A1FM (Japan)", 0 ) -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 +COMP(19??, nms8250j, msx2, 0, nms8250j, msx2jp, msx_state, msx, "Philips", "NMS-8250J", 0) 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 COMP(1986, hbf500, msx2, 0, hbf500, msx2jp, msx_state, msx, "Sony", "HB-F500 (Japan)", 0) COMP(1986, hbf900, msx2, 0, hbf900, msx2jp, msx_state, msx, "Sony", "HB-F900 / 1st released version (Japan)", 0) @@ -5959,7 +5956,7 @@ COMP(1987, hbf12, msx2, 0, hbf12, msx2jp, msx_state, msx, COMP(1987, hbf1xd, msx2, 0, hbf1xd, msx2jp, msx_state, msx, "Sony", "HB-F1XD (Japan)", 0) COMP(1988, hbf1xdm2, msx2, 0, hbf1xdm2, msx2jp, msx_state, msx, "Sony", "HB-F1XDMK2 (Japan)", 0) COMP(19??, mpc2300, msx2, 0, mpc2300, msx2, msx_state, msx, "Sanyo", "MPC-2300", GAME_NOT_WORKING) // Keyboard responds differently -COMP(19??, mpc25fd, msx2, 0, mpc25fd, msx2, msx_state, msx, "Sanyo", "Wavy MPC-25FD", GAME_NOT_WORKING) // Screen stays black +COMP(19??, mpc25fd, msx2, 0, mpc25fd, msx2, msx_state, msx, "Sanyo", "Wavy MPC-25FD", 0) COMP(1988, phc23, msx2, 0, phc23, msx2jp, msx_state, msx, "Sanyo", "Wavy PHC-23 (Japan)", 0) COMP(1986, cpc300, msx2, 0, cpc300, msx2kr, msx_state, msx, "Daewoo", "IQ-2000 CPC-300 (Korea)", 0) COMP(1986, cpc300e, msx2, 0, cpc300e, msx2kr, msx_state, msx, "Daewoo", "IQ-2000 CPC-300E (Korea)", 0) diff --git a/src/mess/includes/msx.h b/src/mess/includes/msx.h index 84f54cea711..527d639edb4 100644 --- a/src/mess/includes/msx.h +++ b/src/mess/includes/msx.h @@ -83,6 +83,10 @@ MCFG_MSX_SLOT_DISK4_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1") \ msx_state::install_slot_pages(*owner, _prim, _sec, _page, _numpages, device); +#define MCFG_MSX_LAYOUT_DISK5(_tag, _prim, _sec, _page, _numpages, _region, _offset) \ + MCFG_MSX_SLOT_DISK5_ADD(_tag, _page, _numpages, _region, _offset, "fdc", "fdc:0", "fdc:1", "fdc:2", "fdc:3") \ + msx_state::install_slot_pages(*owner, _prim, _sec, _page, _numpages, device); + #define MCFG_MSX_LAYOUT_MUSIC(_tag, _prim, _sec, _page, _numpages, _region, _offset) \ MCFG_MSX_SLOT_MUSIC_ADD(_tag, _page, _numpages, _region, _offset, "ym2413" ) \ msx_state::install_slot_pages(*owner, _prim, _sec, _page, _numpages, device);