mirror of
https://github.com/holub/mame
synced 2025-10-07 01:16:22 +03:00
(MESS) msx.c: Added microsol fdc; marked a few more drivers as working. (nw)
This commit is contained in:
parent
5e934423a2
commit
b1af64c863
@ -37,16 +37,21 @@ const device_type MSX_SLOT_DISK1 = &device_creator<msx_slot_disk1_device>;
|
||||
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>;
|
||||
|
||||
|
||||
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<floppy_connector>(m_floppy0_tag);
|
||||
m_floppy1 = owner()->subdevice<floppy_connector>(m_floppy1_tag);
|
||||
m_floppy0 = m_floppy0_tag ? owner()->subdevice<floppy_connector>(m_floppy0_tag) : NULL;
|
||||
m_floppy1 = m_floppy1_tag ? owner()->subdevice<floppy_connector>(m_floppy1_tag) : NULL;
|
||||
m_floppy2 = m_floppy2_tag ? owner()->subdevice<floppy_connector>(m_floppy2_tag) : NULL;
|
||||
m_floppy3 = m_floppy3_tag ? owner()->subdevice<floppy_connector>(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<cpu_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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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<msx_slot_disk_device &>(device).m_fdc_tag = tag; }
|
||||
static void set_floppy0_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy0_tag = tag; }
|
||||
static void set_floppy1_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy1_tag = tag; }
|
||||
static void set_floppy2_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(device).m_floppy2_tag = tag; }
|
||||
static void set_floppy3_tag(device_t &device, const char *tag) { dynamic_cast<msx_slot_disk_device &>(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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user