(MESS) msx.c: Fixed floppy support for the hx34 and hx34i drivers. (nw)

This commit is contained in:
Wilbert Pol 2014-10-11 12:58:54 +00:00
parent a155f96028
commit e4d6a4e908
4 changed files with 219 additions and 10 deletions

View File

@ -38,6 +38,7 @@ const device_type MSX_SLOT_DISK2 = &device_creator<msx_slot_disk2_device>;
const device_type MSX_SLOT_DISK3 = &device_creator<msx_slot_disk3_device>;
const device_type MSX_SLOT_DISK4 = &device_creator<msx_slot_disk4_device>;
const device_type MSX_SLOT_DISK5 = &device_creator<msx_slot_disk5_device>;
const device_type MSX_SLOT_DISK6 = &device_creator<msx_slot_disk6_device>;
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;
}
}

View File

@ -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

View File

@ -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

View File

@ -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);