diff --git a/src/emu/bus/msx_slot/disk.c b/src/emu/bus/msx_slot/disk.c index 5dcc137e880..04f398ef6ef 100644 --- a/src/emu/bus/msx_slot/disk.c +++ b/src/emu/bus/msx_slot/disk.c @@ -38,6 +38,7 @@ 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; +const device_type MSX_SLOT_DISK6 = &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) @@ -638,3 +639,174 @@ WRITE8_MEMBER(msx_slot_disk5_device::io_write) break; } } + + + +msx_slot_disk6_device::msx_slot_disk6_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : msx_slot_wd_disk_device(mconfig, MSX_SLOT_DISK6, "MSX Internal floppy type 6", tag, owner, clock, "msx_slot_disk6", __FILE__) + , m_side_motor(0) + , m_drive_select0(0) + , m_drive_select1(0) +{ +} + + +void msx_slot_disk6_device::device_start() +{ + msx_slot_wd_disk_device::device_start(); + + save_item(NAME(m_side_motor)); + save_item(NAME(m_drive_select0)); + save_item(NAME(m_drive_select1)); + + machine().save().register_postload(save_prepost_delegate(FUNC(msx_slot_disk6_device::post_load), this)); +} + + +void msx_slot_disk6_device::device_reset() +{ + m_fdc->dden_w(false); +} + + +void msx_slot_disk6_device::post_load() +{ + select_drive(); +} + + +void msx_slot_disk6_device::select_drive() +{ + if (m_drive_select1) + { + m_floppy = m_floppy1 ? m_floppy1->get_device() : NULL; + if (!m_floppy) + { + m_drive_select1 = 0; + } + } + + if (m_drive_select0) + { + m_floppy = m_floppy0 ? m_floppy0->get_device() : NULL; + if (!m_floppy) + { + m_drive_select0 = 0; + } + } + + m_fdc->set_floppy(m_floppy); + + set_side_motor(); +} + + +void msx_slot_disk6_device::set_side_motor() +{ + if (m_floppy) + { + m_floppy->mon_w((m_side_motor & 0x02) ? 0 : 1); + m_floppy->ss_w(m_side_motor & 0x01); + } +} + + +READ8_MEMBER(msx_slot_disk6_device::read) +{ + switch (offset) + { + case 0x7ff0: // status? + case 0x7ff8: + return m_fdc->status_r(); + + case 0x7ff1: // track? + case 0x7ff9: + return m_fdc->track_r(); + + case 0x7ff2: // sector? + case 0x7ffa: + return m_fdc->sector_r(); + + case 0x7ff3: // data? + case 0x7ffb: + return m_fdc->data_r(); + + case 0x7ff4: + case 0x7ffc: + // bit 0 = side control + // bit 1 = motor control + return 0xfc | m_side_motor; + break; + + // This reads back a 1 in bit 0 if drive0 is present and selected + case 0x7ff5: + case 0x7ffd: + return 0xfe | m_drive_select0; + + // This reads back a 1 in bit 0 if drive1 is present and selected + case 0x7ff6: + case 0x7ffe: + return 0xfe | m_drive_select1; + + case 0x7ff7: + case 0x7fff: + return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80); + } + + return msx_slot_rom_device::read(space, offset); +} + + +WRITE8_MEMBER(msx_slot_disk6_device::write) +{ + switch (offset) + { + case 0x7ff0: // cmd? + case 0x7ff8: + m_fdc->cmd_w(data); + break; + + case 0x7ff1: // track? + case 0x7ff9: + m_fdc->track_w(data); + break; + + case 0x7ff2: // sector? + case 0x7ffa: + m_fdc->sector_w(data); + break; + + case 0x7ff3: // data? + case 0x7ffb: + m_fdc->data_w(data); + break; + + // Side and motort control + // bit 0 = side select + // bit 1 = motor on/off + case 0x7ff4: + case 0x7ffc: + m_side_motor = data; + set_side_motor(); + break; + + // bit 0 - select drive 0 + case 0x7ff5: + case 0x7ffd: + m_drive_select0 = data; + select_drive(); + break; + + // bit 1 - select drive 1 + case 0x7ff6: + case 0x7ffe: + m_drive_select1 = data; + select_drive(); + break; + + default: + logerror("msx_slot_disk6_device::write: Unmapped write writing %02x to %04x\n", data, offset); + break; + } +} + diff --git a/src/emu/bus/msx_slot/disk.h b/src/emu/bus/msx_slot/disk.h index 7816dd28bdc..66aa050ed0e 100644 --- a/src/emu/bus/msx_slot/disk.h +++ b/src/emu/bus/msx_slot/disk.h @@ -19,6 +19,8 @@ extern const device_type MSX_SLOT_DISK3; extern const device_type MSX_SLOT_DISK4; /* WD FDC accessed through i/o ports 0xd0-0xd4 */ extern const device_type MSX_SLOT_DISK5; +/* WD FDC accessed through 7ff0-7ff? (used in Toshiba HX34) */ +extern const device_type MSX_SLOT_DISK6; #define MCFG_MSX_SLOT_DISK1_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \ @@ -58,6 +60,13 @@ extern const device_type MSX_SLOT_DISK5; msx_slot_disk_device::set_floppy2_tag(*device, _floppy2_tag); \ msx_slot_disk_device::set_floppy3_tag(*device, _floppy3_tag); +#define MCFG_MSX_SLOT_DISK6_ADD(_tag, _startpage, _numpages, _region, _offset, _fdc_tag, _floppy0_tag, _floppy1_tag) \ + MCFG_MSX_INTERNAL_SLOT_ADD(_tag, MSX_SLOT_DISK6, _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); + class msx_slot_disk_device : public msx_slot_rom_device { @@ -194,4 +203,27 @@ private: }; +class msx_slot_disk6_device : public msx_slot_wd_disk_device +{ +public: + msx_slot_disk6_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual void device_start(); + virtual void device_reset(); + + virtual DECLARE_READ8_MEMBER(read); + virtual DECLARE_WRITE8_MEMBER(write); + + void post_load(); + +private: + UINT8 m_side_motor; + UINT8 m_drive_select0; + UINT8 m_drive_select1; + + void set_side_motor(); + void select_drive(); +}; + + #endif diff --git a/src/mess/drivers/msx.c b/src/mess/drivers/msx.c index 1bead63423a..eacda3a2bc8 100644 --- a/src/mess/drivers/msx.c +++ b/src/mess/drivers/msx.c @@ -69,7 +69,6 @@ ** - phc77: printer not emulated ** - hx21, hx22: Hook up kanji rom ** - hx21, hx22: Does not start firmware -** - hx34, hx34i: Floppy support broken ** - victhc90/95/95a: Turbo/2nd cpu not supported. ** - victhc90/95/95a: Firmware not working. ** - y503iiir/e: Fix keyboard support @@ -7034,7 +7033,8 @@ ROM_START (hx34) ROM_REGION (0x18000, "maincpu", 0) ROM_LOAD ("hx34bios.rom", 0x0000, 0x8000, CRC(3891e0f7) SHA1(7dfb18262d48e559fffb4199acbe29d9b4bee9db)) ROM_LOAD ("hx34ext.rom", 0x8000, 0x4000, CRC(4a48779c) SHA1(b8e30d604d319d511cbfbc61e5d8c38fbb9c5a33)) - ROM_LOAD ("hx34disk.rom", 0xc000, 0x4000, CRC(b6203bc8) SHA1(d31236e8b2491bca678d905546b365e9d365b072)) + // hx34disk.rom has contents of floppy registers at offset 3ff0-3ff7 and mirrored at 3ff8-3fff + ROM_LOAD ("hx34disk.rom", 0xc000, 0x4000, BAD_DUMP CRC(b6203bc8) SHA1(d31236e8b2491bca678d905546b365e9d365b072)) ROM_LOAD ("hx34firm.rom", 0x10000, 0x8000, CRC(d05b5ca6) SHA1(7eea205044af48cfde9b7fff277d961704c4d45c)) ROM_REGION (0x20000, "kanji", 0) @@ -7053,12 +7053,12 @@ static MACHINE_CONFIG_DERIVED( hx34, msx2 ) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0) MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000) - MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000) + MCFG_MSX_LAYOUT_DISK6("disk", 3, 2, 1, 1, "maincpu", 0xc000) MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 1, 2, "maincpu", 0x10000) MCFG_MSX_S1985_ADD("s1985") - MCFG_FRAGMENT_ADD( msx_wd2793_force_ready ) + MCFG_FRAGMENT_ADD( msx_wd2793 ) MCFG_FRAGMENT_ADD( msx_1_35_dd_drive ) MCFG_FRAGMENT_ADD( msx2_floplist ) @@ -7071,7 +7071,8 @@ ROM_START (hx34i) ROM_REGION (0x18000, "maincpu", 0) ROM_LOAD ("hx34ibios.rom", 0x0000, 0x8000, CRC(6cdaf3a5) SHA1(6103b39f1e38d1aa2d84b1c3219c44f1abb5436e)) ROM_LOAD ("hx34iext.rom", 0x8000, 0x4000, CRC(06e4f5e6) SHA1(f5eb0a396097572589f2a6efeed045044e9425e4)) - ROM_LOAD ("hx34idisk.rom", 0xc000, 0x4000, CRC(b6203bc8) SHA1(d31236e8b2491bca678d905546b365e9d365b072)) + // hx34idisk.rom has contents of floppy registers at offset 3ff0-3ff7 and mirrored at 3ff8-3fff + ROM_LOAD ("hx34idisk.rom", 0xc000, 0x4000, BAD_DUMP CRC(b6203bc8) SHA1(d31236e8b2491bca678d905546b365e9d365b072)) ROM_LOAD ("hx34ifirm.rom", 0x10000, 0x8000, CRC(f9e29c66) SHA1(3289336b2c12161fd926a7e5ce865770ae7038af)) ROM_END @@ -7087,12 +7088,12 @@ static MACHINE_CONFIG_DERIVED( hx34i, msx2_pal ) MCFG_MSX_LAYOUT_CARTRIDGE("cartslot2", 2, 0) MCFG_MSX_LAYOUT_RAM_MM("ram_mm", 3, 0, 0x10000) // 64KB Mapper RAM MCFG_MSX_LAYOUT_ROM("ext", 3, 1, 0, 1, "maincpu", 0x8000) - MCFG_MSX_LAYOUT_DISK1("disk", 3, 2, 1, 1, "maincpu", 0xc000) - MCFG_MSX_LAYOUT_ROM("firm", 3, 2, 1, 2, "maincpu", 0x10000) + MCFG_MSX_LAYOUT_DISK6("disk", 3, 2, 1, 1, "maincpu", 0xc000) + MCFG_MSX_LAYOUT_ROM("firm", 3, 3, 1, 2, "maincpu", 0x10000) MCFG_MSX_S1985_ADD("s1985") - MCFG_FRAGMENT_ADD( msx_wd2793_force_ready ) + MCFG_FRAGMENT_ADD( msx_wd2793 ) MCFG_FRAGMENT_ADD( msx_1_35_dd_drive ) MCFG_FRAGMENT_ADD( msx2_floplist ) @@ -8404,8 +8405,8 @@ COMP(1986, hx23, hx23i, 0, hx23, msx2, msx_state, msx, COMP(1986, hx23f, hx23i, 0, hx23f, msx2, msx_state, msx, "Toshiba", "HX-23F (MSX2)", 0) COMP(190?, hx23i, 0, 0, hx23i, msx2, msx_state, msx, "Toshiba", "HX-23I (MSX2)", 0) COMP(198?, hx33, 0, 0, hx33, msx2jp, msx_state, msx, "Toshiba", "HX-33 (MSX2)", 0) -COMP(198?, hx34, hx34i, 0, hx34, msx2jp, msx_state, msx, "Toshiba", "HX-34 (MSX2)", GAME_NOT_WORKING) // Floppy support broken -COMP(198?, hx34i, 0, 0, hx34i, msx, msx_state, msx, "Toshiba", "HX-34I (MSX2)", GAME_NOT_WORKING) // Floppy support broken +COMP(198?, hx34, hx34i, 0, hx34, msx2jp, msx_state, msx, "Toshiba", "HX-34 (MSX2)", 0) +COMP(198?, hx34i, 0, 0, hx34i, msx, msx_state, msx, "Toshiba", "HX-34I (MSX2)", 0) COMP(1985, fstm1, 0, 0, fstm1, msx, msx_state, msx, "Toshiba", "FS-TM1 (MSX2)", 0) COMP(198?, victhc90, victhc95, 0, victhc90, msxjp, msx_state, msx, "Victor", "HC-90 (MSX2)", GAME_NOT_WORKING) // 2nd cpu/turbo not emulated, firmware won't start COMP(198?, victhc95, 0, 0, victhc95, msxjp, msx_state, msx, "Victor", "HC-95 (MSX2)", GAME_NOT_WORKING) // 2nd cpu/turbo not emulated, firmware won't start diff --git a/src/mess/includes/msx.h b/src/mess/includes/msx.h index 9fe36f20519..7b6a5d8f6e3 100644 --- a/src/mess/includes/msx.h +++ b/src/mess/includes/msx.h @@ -86,6 +86,10 @@ 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_DISK6(_tag, _prim, _sec, _page, _numpages, _region, _offset) \ + MCFG_MSX_SLOT_DISK6_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_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);