bus/spectrum fix expansion devices chaining

This commit is contained in:
MetalliC 2020-07-22 19:50:24 +03:00
parent e1ccaea11f
commit fcc6f1aa7c
29 changed files with 125 additions and 123 deletions

View File

@ -820,12 +820,6 @@ uint8_t spectrum_gamma_device::mreq_r(offs_t offset)
return m_rom->base()[(offset & 0x3fff) + (m_romcs ? 0x4000 : 0)];
}
void spectrum_betav2_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
void spectrum_betav2_device::fdc_hld_w(int state)
{
m_fdc->set_force_ready(state); // HLD connected to RDY pin

View File

@ -46,11 +46,15 @@ protected:
virtual void pre_opcode_fetch(offs_t offset) override;
virtual void pre_data_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
required_memory_region m_rom;
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;

View File

@ -269,12 +269,6 @@ uint8_t spectrum_beta128_device::mreq_r(offs_t offset)
return data;
}
void spectrum_beta128_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
INPUT_CHANGED_MEMBER(spectrum_beta128_device::magic_button)
{
if (newval && !oldval)

View File

@ -42,11 +42,16 @@ protected:
virtual void pre_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
required_memory_region m_rom;
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;

View File

@ -307,5 +307,6 @@ void spectrum_flpone_device::mreq_w(offs_t offset, uint8_t data)
}
}
m_exp->mreq_w(offset, data);
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}

View File

@ -49,6 +49,13 @@ protected:
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual uint8_t iorq_r(offs_t offset) override { return m_exp->iorq_r(offset); }
virtual void iorq_w(offs_t offset, uint8_t data) override { m_exp->iorq_w(offset, data); }
DECLARE_WRITE_LINE_MEMBER(busy_w) { m_busy = state; };
required_memory_region m_rom;

View File

@ -88,32 +88,6 @@ void spectrum_fuller_device::device_start()
// IMPLEMENTATION
//**************************************************************************
READ_LINE_MEMBER(spectrum_fuller_device::romcs)
{
return m_exp->romcs();
}
void spectrum_fuller_device::pre_opcode_fetch(offs_t offset)
{
m_exp->pre_opcode_fetch(offset);
}
uint8_t spectrum_fuller_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;
if (m_exp->romcs())
data &= m_exp->mreq_r(offset);
return data;
}
void spectrum_fuller_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_fuller_device::iorq_r(offs_t offset)
{
uint8_t data = m_exp->iorq_r(offset);

View File

@ -37,12 +37,17 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual void pre_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual uint8_t mreq_r(offs_t offset) override { return m_exp->romcs() ? m_exp->mreq_r(offset) : 0xff; }
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
virtual DECLARE_READ_LINE_MEMBER(romcs) override { return m_exp->romcs(); }
private:
required_device<spectrum_expansion_slot_device> m_exp;

View File

@ -156,12 +156,6 @@ uint8_t spectrum_intf1_device::mreq_r(offs_t offset)
return data;
}
void spectrum_intf1_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_intf1_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;

View File

@ -40,11 +40,15 @@ protected:
virtual void pre_opcode_fetch(offs_t offset) override;
virtual void post_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
private:
required_device<spectrum_expansion_slot_device> m_exp;
required_device<rs232_port_device> m_rs232;

View File

@ -151,7 +151,7 @@ uint8_t spectrum_kempdisc_device::iorq_r(offs_t offset)
switch (offset & 0xff)
{
case 0xe5: case 0xe7: case 0xed: case 0xef:
data = m_fdc->read(BIT(offset, 1) | (BIT(offset, 3) << 1));
data &= m_fdc->read(BIT(offset, 1) | (BIT(offset, 3) << 1));
break;
}
@ -205,9 +205,3 @@ uint8_t spectrum_kempdisc_device::mreq_r(offs_t offset)
return data;
}
void spectrum_kempdisc_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}

View File

@ -39,11 +39,17 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
required_memory_region m_rom;
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;

View File

@ -132,13 +132,11 @@ READ_LINE_MEMBER(spectrum_proceed_device::romcs)
return m_romcs;
}
uint8_t spectrum_proceed_device::mreq_r(offs_t offset)
void spectrum_proceed_device::fetch(offs_t offset)
{
u8 data = 0xff;
switch (offset >> 8)
{
// always override
// always override
case 0x00:
case 0x0e:
case 0x39: case 0x3a: case 0x3b: case 0x3c:
@ -148,7 +146,7 @@ uint8_t spectrum_proceed_device::mreq_r(offs_t offset)
m_romcs = 1;
offset |= 0x0400; // 1Bxx -> 1Fxx
break;
// override only if PIO PB7 is 0
// override only if PIO PB7 is 0
case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d:
case 0x0f: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18:
case 0x1d: case 0x1e:
@ -158,6 +156,11 @@ uint8_t spectrum_proceed_device::mreq_r(offs_t offset)
default:
m_romcs = 0;
}
}
uint8_t spectrum_proceed_device::mreq_r(offs_t offset)
{
u8 data = 0xff;
if (m_romcs)
data = m_rom->base()[offset & 0x1fff];

View File

@ -43,6 +43,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
void fetch(offs_t offset);
virtual void pre_opcode_fetch(offs_t offset) override { fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { fetch(offset); };
virtual uint8_t mreq_r(offs_t offset) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;

View File

@ -64,32 +64,6 @@ void spectrum_melodik_device::device_start()
// IMPLEMENTATION
//**************************************************************************
READ_LINE_MEMBER(spectrum_melodik_device::romcs)
{
return m_exp->romcs();
}
void spectrum_melodik_device::pre_opcode_fetch(offs_t offset)
{
m_exp->pre_opcode_fetch(offset);
}
uint8_t spectrum_melodik_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;
if (m_exp->romcs())
data &= m_exp->mreq_r(offset);
return data;
}
void spectrum_melodik_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_melodik_device::iorq_r(offs_t offset)
{
uint8_t data = m_exp->iorq_r(offset);

View File

@ -36,12 +36,17 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual void pre_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual uint8_t mreq_r(offs_t offset) override { return m_exp->romcs() ? m_exp->mreq_r(offset) : 0xff; }
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
virtual DECLARE_READ_LINE_MEMBER(romcs) override { return m_exp->romcs(); }
private:
required_device<spectrum_expansion_slot_device> m_exp;

View File

@ -381,11 +381,6 @@ uint8_t spectrum_mprint_device::iorq_r(offs_t offset)
return data;
}
void spectrum_mface_base_device::iorq_w(offs_t offset, uint8_t data)
{
m_exp->iorq_w(offset, data);
}
void spectrum_mface1_device::iorq_w(offs_t offset, uint8_t data)
{
switch (offset & 0xff)

View File

@ -40,9 +40,15 @@ protected:
virtual void pre_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual uint8_t iorq_r(offs_t offset) override { return m_exp->iorq_r(offset); }
virtual void iorq_w(offs_t offset, uint8_t data) override { m_exp->iorq_w(offset, data); }
required_memory_region m_rom;
required_device<spectrum_expansion_slot_device> m_exp;

View File

@ -190,11 +190,6 @@ uint8_t spectrum_opus_device::iorq_r(offs_t offset)
return data;
}
void spectrum_opus_device::iorq_w(offs_t offset, uint8_t data)
{
m_exp->iorq_w(offset, data);
}
uint8_t spectrum_opus_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;

View File

@ -46,9 +46,14 @@ protected:
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void iorq_w(offs_t offset, uint8_t data) override { m_exp->iorq_w(offset, data); }
private:
void pia_out_a(uint8_t data);
void pia_out_b(uint8_t data);

View File

@ -365,7 +365,8 @@ void spectrum_swiftdisc_device::mreq_w(offs_t offset, uint8_t data)
}
}
m_exp->mreq_w(offset, data);
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_swiftdisc_device::iorq_r(offs_t offset)
@ -373,7 +374,7 @@ uint8_t spectrum_swiftdisc_device::iorq_r(offs_t offset)
uint8_t data = m_exp->iorq_r(offset);
if (!BIT(offset, 5))
data = m_joy->read();
data &= m_joy->read();
return data;
}
@ -472,7 +473,8 @@ void spectrum_swiftdisc2_device::mreq_w(offs_t offset, uint8_t data)
}
}
m_exp->mreq_w(offset, data);
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_swiftdisc2_device::iorq_r(offs_t offset)
@ -483,7 +485,7 @@ uint8_t spectrum_swiftdisc2_device::iorq_r(offs_t offset)
data &= control_r();
if (!BIT(offset, 5) && !BIT(m_control, 3))
data = m_joy->read();
data &= m_joy->read();
if (m_conf->read())
{

View File

@ -51,6 +51,12 @@ protected:
virtual uint8_t iorq_r(offs_t offset) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_opcode_fetch(offs_t offset) override { m_exp->pre_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void iorq_w(offs_t offset, uint8_t data) override { m_exp->iorq_w(offset, data); }
required_memory_region m_rom;
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;

View File

@ -241,5 +241,6 @@ void spectrum_speccydos_device::mreq_w(offs_t offset, uint8_t data)
}
}
m_exp->mreq_w(offset, data);
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}

View File

@ -46,6 +46,13 @@ protected:
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void post_opcode_fetch(offs_t offset) override { m_exp->post_opcode_fetch(offset); };
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual uint8_t iorq_r(offs_t offset) override { return m_exp->iorq_r(offset); }
virtual void iorq_w(offs_t offset, uint8_t data) override { m_exp->iorq_w(offset, data); }
required_memory_region m_rom;
required_device<wd_fdc_device_base> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;

View File

@ -82,6 +82,24 @@ void spectrum_uslot_device::pre_opcode_fetch(offs_t offset)
m_exp2->pre_opcode_fetch(offset);
}
void spectrum_uslot_device::post_opcode_fetch(offs_t offset)
{
m_exp1->post_opcode_fetch(offset);
m_exp2->post_opcode_fetch(offset);
}
void spectrum_uslot_device::pre_data_fetch(offs_t offset)
{
m_exp1->pre_data_fetch(offset);
m_exp2->pre_data_fetch(offset);
}
void spectrum_uslot_device::post_data_fetch(offs_t offset)
{
m_exp1->post_data_fetch(offset);
m_exp2->post_data_fetch(offset);
}
uint8_t spectrum_uslot_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;

View File

@ -37,6 +37,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void pre_opcode_fetch(offs_t offset) override;
virtual void post_opcode_fetch(offs_t offset) override;
virtual void pre_data_fetch(offs_t offset) override;
virtual void post_data_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;

View File

@ -158,12 +158,6 @@ uint8_t spectrum_wafa_device::mreq_r(offs_t offset)
return data;
}
void spectrum_wafa_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
m_exp->mreq_w(offset, data);
}
uint8_t spectrum_wafa_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;

View File

@ -42,11 +42,15 @@ protected:
virtual void pre_opcode_fetch(offs_t offset) override;
virtual void post_opcode_fetch(offs_t offset) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual void mreq_w(offs_t offset, uint8_t data) override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override;
// passthru
virtual void pre_data_fetch(offs_t offset) override { m_exp->pre_data_fetch(offset); };
virtual void post_data_fetch(offs_t offset) override { m_exp->post_data_fetch(offset); };
virtual void mreq_w(offs_t offset, uint8_t data) override { if (m_exp->romcs()) m_exp->mreq_w(offset, data); }
private:
required_device<spectrum_expansion_slot_device> m_exp;
required_memory_region m_rom;

View File

@ -323,12 +323,10 @@ void spectrum_state::spectrum_rom_w(offs_t offset, uint8_t data)
uint8_t spectrum_state::spectrum_rom_r(offs_t offset)
{
uint8_t data, edata;
edata = m_exp->mreq_r(offset);
uint8_t data;
if (m_exp->romcs())
data = edata;
data = m_exp->mreq_r(offset);
else
data = memregion("maincpu")->base()[offset];