Further improvements to slot option validation (nw)

- All slot options are now validated whether or not they are user-selectable. This has already exposed a bug in one MSX-Audio device.
- Slots within slots, however, get added for validation only if they are declared fixed. Various Commodore floppy drives have been affected by this, since it doesn't look as if the current FDC emulation allows for detachability.
This commit is contained in:
AJR 2017-06-10 12:34:43 -04:00
parent d45ede8270
commit 6b7ca78a6c
14 changed files with 75 additions and 60 deletions

View File

@ -172,7 +172,7 @@ adam_fdc_device::adam_fdc_device(const machine_config &mconfig, const char *tag,
device_adamnet_card_interface(mconfig, *this),
m_maincpu(*this, M6801_TAG),
m_fdc(*this, WD2793_TAG),
m_floppy0(*this, WD2793_TAG":0:525ssdd"),
m_connector(*this, WD2793_TAG":0"),
m_floppy(nullptr),
m_ram(*this, "ram"),
m_sw3(*this, "SW3")
@ -239,7 +239,8 @@ READ8_MEMBER( adam_fdc_device::p1_r )
uint8_t data = 0x00;
// disk in place
data |= m_floppy0->exists() ? 0x00 : 0x01;
floppy_image_device *floppy0 = m_connector->get_device();
data |= (floppy0 != nullptr && floppy0->exists()) ? 0x00 : 0x01;
// floppy data request
data |= m_fdc->drq_r() ? 0x04 : 0x00;
@ -283,7 +284,7 @@ WRITE8_MEMBER( adam_fdc_device::p1_w )
if (BIT(data, 5))
{
m_floppy = m_floppy0;
m_floppy = m_connector->get_device();
}
m_fdc->set_floppy(m_floppy);

View File

@ -52,7 +52,7 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<wd2793_device> m_fdc;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_connector> m_connector;
floppy_image_device *m_floppy;
required_shared_ptr<uint8_t> m_ram;
required_ioport m_sw3;

View File

@ -836,7 +836,7 @@ MACHINE_CONFIG_MEMBER( c1541_device_base::device_add_mconfig )
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_ATN_CALLBACK(WRITELINE(c1541_device_base, atn_w))
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1541_device_base, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1540_floppies, "525ssqd", c1541_device_base::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1540_floppies, "525ssqd", c1541_device_base::floppy_formats)
MACHINE_CONFIG_END

View File

@ -632,7 +632,7 @@ MACHINE_CONFIG_MEMBER( c1570_device::device_add_mconfig )
MCFG_WD1770_ADD(WD1770_TAG, XTAL_16MHz/2)
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MACHINE_CONFIG_END
@ -668,7 +668,7 @@ MACHINE_CONFIG_MEMBER( c1571_device::device_add_mconfig )
MCFG_WD1770_ADD(WD1770_TAG, XTAL_16MHz/2)
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MACHINE_CONFIG_END
@ -698,7 +698,7 @@ MACHINE_CONFIG_MEMBER( c1571cr_device::device_add_mconfig )
MCFG_WD1770_ADD(WD1770_TAG, XTAL_16MHz/2)
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MACHINE_CONFIG_END
@ -734,7 +734,7 @@ MACHINE_CONFIG_MEMBER( mini_chief_device::device_add_mconfig )
MCFG_WD1770_ADD(WD1770_TAG, XTAL_16MHz/2)
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c1571_device, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1571_floppies, "525qd", c1571_device::floppy_formats)
MCFG_DEVICE_ADD(ISA_BUS_TAG, ISA8, 0)
MCFG_ISA8_CPU(M6502_TAG)

View File

@ -279,7 +279,7 @@ MACHINE_CONFIG_MEMBER( c1581_device::device_add_mconfig )
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c1581_device, cia_pb_w))
MCFG_WD1772_ADD(WD1772_TAG, XTAL_16MHz/2)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", c1581_floppies, "35dd", c1581_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(WD1772_TAG":0", c1581_floppies, "35dd", c1581_device::floppy_formats)
MACHINE_CONFIG_END

View File

@ -223,7 +223,7 @@ MACHINE_CONFIG_MEMBER( fd2000_device::device_add_mconfig )
MCFG_DP8473_ADD(DP8473V_TAG)
MCFG_FLOPPY_DRIVE_ADD(DP8473V_TAG":0", fd2000_floppies, "35hd", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(DP8473V_TAG":0", fd2000_floppies, "35hd", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MACHINE_CONFIG_END
@ -239,7 +239,7 @@ MACHINE_CONFIG_MEMBER( fd4000_device::device_add_mconfig )
MCFG_PC8477A_ADD(PC8477AV1_TAG)
MCFG_FLOPPY_DRIVE_ADD(PC8477AV1_TAG":0", fd4000_floppies, "35ed", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(PC8477AV1_TAG":0", fd4000_floppies, "35ed", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MACHINE_CONFIG_END

View File

@ -51,7 +51,7 @@ SLOT_INTERFACE_END
//-------------------------------------------------
MACHINE_CONFIG_MEMBER( compucolor_floppy_device::device_add_mconfig )
MCFG_FLOPPY_DRIVE_ADD("floppy", compucolor_floppies, "525sssd", compucolor_floppy_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED("floppy", compucolor_floppies, "525sssd", compucolor_floppy_device::floppy_formats)
MACHINE_CONFIG_END

View File

@ -325,7 +325,7 @@ MACHINE_CONFIG_MEMBER( c2031_device::device_add_mconfig )
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(WRITELINE(c2031_device, byte_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c2031_floppies, "525ssqd", c2031_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c2031_floppies, "525ssqd", c2031_device::floppy_formats)
MACHINE_CONFIG_END

View File

@ -486,8 +486,8 @@ MACHINE_CONFIG_MEMBER( c2040_device::device_add_mconfig )
MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_new_device, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c2040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":1", c2040_floppies, "525ssqd", c2040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c2040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c2040_device::floppy_formats)
MACHINE_CONFIG_END
@ -529,8 +529,8 @@ MACHINE_CONFIG_MEMBER( c3040_device::device_add_mconfig )
MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_new_device, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c3040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":1", c2040_floppies, "525ssqd", c3040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c3040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c3040_device::floppy_formats)
MACHINE_CONFIG_END
@ -572,8 +572,8 @@ MACHINE_CONFIG_MEMBER( c4040_device::device_add_mconfig )
MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_new_device, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c4040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":1", c2040_floppies, "525ssqd", c4040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":0", c2040_floppies, "525ssqd", c4040_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(FDC_TAG":1", c2040_floppies, "525ssqd", c4040_device::floppy_formats)
MACHINE_CONFIG_END

View File

@ -126,6 +126,17 @@ READ8_MEMBER(msx_cart_msx_audio_hxmu900_device::read_cart)
}
ROM_START( msx_hxmu )
ROM_REGION(0x8000, "y8950", ROMREGION_ERASE00)
ROM_END
const tiny_rom_entry *msx_cart_msx_audio_hxmu900_device::device_rom_region() const
{
return ROM_NAME( msx_hxmu );
}

View File

@ -23,6 +23,7 @@ public:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void initialize_cartridge() override;

View File

@ -366,7 +366,7 @@ static MACHINE_CONFIG_START( c1551 )
MCFG_DEVICE_ADD(C64H156_TAG, C64H156, XTAL_16MHz)
MCFG_64H156_BYTE_CALLBACK(DEVWRITELINE(C64H156_TAG, c64h156_device, atni_w))
MCFG_FLOPPY_DRIVE_ADD(C64H156_TAG":0", c1551_floppies, "525ssqd", c1551_device::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD_FIXED(C64H156_TAG":0", c1551_floppies, "525ssqd", c1551_device::floppy_formats)
MCFG_PLUS4_PASSTHRU_EXPANSION_SLOT_ADD()
MACHINE_CONFIG_END

View File

@ -30,6 +30,11 @@
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
static_cast<floppy_connector *>(device)->set_formats(_formats);
#define MCFG_FLOPPY_DRIVE_ADD_FIXED(_tag, _slot_intf, _def_slot, _formats) \
MCFG_DEVICE_ADD(_tag, FLOPPY_CONNECTOR, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, true) \
static_cast<floppy_connector *>(device)->set_formats(_formats);
#define MCFG_FLOPPY_DRIVE_SOUND(_doit) \
static_cast<floppy_connector *>(device)->enable_sound(_doit);

View File

@ -1834,54 +1834,51 @@ void validity_checker::validate_devices()
// if it's a slot, iterate over possible cards (don't recurse, or you'll stack infinite tee connectors)
device_slot_interface *const slot = dynamic_cast<device_slot_interface *>(&device);
if (slot && !slot->fixed())
if (slot != nullptr)
{
for (auto &option : slot->option_list())
{
if (option.second->selectable())
std::string const card_tag(util::string_format("_%s", option.second->name()));
device_t *const card = m_current_config->device_add(&slot->device(), card_tag.c_str(), option.second->devtype(), option.second->clock());
const char *const def_bios = option.second->default_bios();
if (def_bios)
device_t::static_set_default_bios_tag(*card, def_bios);
machine_config_constructor const additions = option.second->machine_config();
if (additions)
(*additions)(*m_current_config, card, card);
for (device_slot_interface &subslot : slot_interface_iterator(*card))
{
std::string const card_tag(util::string_format("_%s", option.second->name()));
device_t *const card = m_current_config->device_add(&slot->device(), card_tag.c_str(), option.second->devtype(), option.second->clock());
const char *const def_bios = option.second->default_bios();
if (def_bios)
device_t::static_set_default_bios_tag(*card, def_bios);
machine_config_constructor const additions = option.second->machine_config();
if (additions)
(*additions)(*m_current_config, card, card);
for (device_slot_interface &subslot : slot_interface_iterator(*card))
if (subslot.fixed())
{
if (subslot.default_option() && *subslot.default_option())
device_slot_option const *const suboption = subslot.option(subslot.default_option());
if (suboption)
{
device_slot_option const *const suboption = subslot.option(subslot.default_option());
if (suboption)
{
device_t *const sub_card = m_current_config->device_add(&subslot.device(), suboption->name(), suboption->devtype(), suboption->clock());
const char *const sub_bios = suboption->default_bios();
if (sub_bios)
device_t::static_set_default_bios_tag(*sub_card, sub_bios);
machine_config_constructor const sub_additions = suboption->machine_config();
if (sub_additions)
(*sub_additions)(*m_current_config, sub_card, sub_card);
}
device_t *const sub_card = m_current_config->device_add(&subslot.device(), suboption->name(), suboption->devtype(), suboption->clock());
const char *const sub_bios = suboption->default_bios();
if (sub_bios)
device_t::static_set_default_bios_tag(*sub_card, sub_bios);
machine_config_constructor const sub_additions = suboption->machine_config();
if (sub_additions)
(*sub_additions)(*m_current_config, sub_card, sub_card);
}
}
for (device_t &card_dev : device_iterator(*card))
card_dev.config_complete();
validate_roms(*card);
for (device_t &card_dev : device_iterator(*card))
{
m_current_device = &card_dev;
card_dev.findit(true);
card_dev.validity_check(*this);
m_current_device = nullptr;
}
m_current_config->device_remove(&slot->device(), card_tag.c_str());
}
for (device_t &card_dev : device_iterator(*card))
card_dev.config_complete();
validate_roms(*card);
for (device_t &card_dev : device_iterator(*card))
{
m_current_device = &card_dev;
card_dev.findit(true);
card_dev.validity_check(*this);
m_current_device = nullptr;
}
m_current_config->device_remove(&slot->device(), card_tag.c_str());
}
}
}