Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/src/bus.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1896,6 +1896,8 @@ if (BUSES["ISA"]~=null) then
MAME_DIR .. "src/devices/bus/isa/xsu_cards.h",
MAME_DIR .. "src/devices/bus/isa/xtide.cpp",
MAME_DIR .. "src/devices/bus/isa/xtide.h",
MAME_DIR .. "src/devices/bus/isa/zxbus_adapter.cpp",
MAME_DIR .. "src/devices/bus/isa/zxbus_adapter.h",
}
end

Expand Down
2 changes: 2 additions & 0 deletions src/devices/bus/isa/isa_cards.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
#include "finalchs.h"
#include "hpblp.h"
#include "opus100pm.h"
#include "zxbus_adapter.h"


void pc_isa8_cards(device_slot_interface &device)
Expand Down Expand Up @@ -148,6 +149,7 @@ void pc_isa8_cards(device_slot_interface &device)
device.option_add("acb2072", ACB2072);
device.option_add("3xtwin", ISA8_3XTWIN);
device.option_add("opus108pm", ISA8_OPUS108PM);
device.option_add("zxbus_adapter", ISA8_ZXBUS);
}

void pc_isa16_cards(device_slot_interface &device)
Expand Down
28 changes: 28 additions & 0 deletions src/devices/bus/isa/zxbus_adapter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// license:BSD-3-Clause
// copyright-holders:Andrei I. Holub
#include "emu.h"
#include "zxbus_adapter.h"

DEFINE_DEVICE_TYPE(ISA8_ZXBUS, zxbus_adapter_device, "zxbus_adapter", "ISA8 to ZXBUS Adapter")

zxbus_adapter_device::zxbus_adapter_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, ISA8_ZXBUS, tag, owner, clock)
, device_isa8_card_interface(mconfig, *this)
, m_isa_io_view(*this, "isa_io_view")
, m_zxbus(*this, "zxbus")
{
}

void zxbus_adapter_device::device_start()
{
set_isa_device();
m_isa->space(isa8_device::AS_ISA_IO).install_view(0x0000, 0xffff, m_isa_io_view);
m_zxbus->set_io_space(m_isa_io_view[0], m_isa_io_view[0]);
m_isa_io_view.select(0);
}

void zxbus_adapter_device::device_add_mconfig(machine_config &config)
{
ZXBUS(config, m_zxbus, 0);
ZXBUS_SLOT(config, "card", 0, m_zxbus, zxbus_cards, nullptr);
}
27 changes: 27 additions & 0 deletions src/devices/bus/isa/zxbus_adapter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// license:BSD-3-Clause
// copyright-holders:Andrei I. Holub
#ifndef MAME_BUS_ISA_ZXBUS_ADAPTER_H
#define MAME_BUS_ISA_ZXBUS_ADAPTER_H

#include "isa.h"

#include "bus/spectrum/zxbus.h"

class zxbus_adapter_device: public device_t, public device_isa8_card_interface
{
public:
zxbus_adapter_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

protected:
virtual void device_start() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;

private:
memory_view m_isa_io_view;
required_device<zxbus_device> m_zxbus;

};

DECLARE_DEVICE_TYPE(ISA8_ZXBUS, zxbus_adapter_device)

#endif // MAME_BUS_ISA_ZXBUS_ADAPTER_H
7 changes: 3 additions & 4 deletions src/devices/bus/spectrum/nemoide.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ class nemoide_device : public device_t, public device_zxbus_card_interface
, m_ata(*this, "ata")
{ }

virtual void io_map(address_map &map) override ATTR_COLD;

protected:
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD;

private:
void map_io(address_map &map) ATTR_COLD;

u8 ata_r(offs_t offset);
void ata_w(offs_t offset, u8 data);
Expand All @@ -51,7 +52,7 @@ void nemoide_device::ata_w(offs_t offset, u8 data)
m_ata->cs0_w((offset >> 5) & 7, ata_data);
}

void nemoide_device::map_io(address_map &map)
void nemoide_device::io_map(address_map &map)
{
map(0x0011, 0x0011).mirror(0xff00).lrw8(NAME([this]() { return m_ata_data_latch; })
, NAME([this](offs_t offset, u8 data) { m_ata_data_latch = data; }));
Expand All @@ -74,8 +75,6 @@ void nemoide_device::device_add_mconfig(machine_config &config)
void nemoide_device::device_start()
{
save_item(NAME(m_ata_data_latch));

m_zxbus->install_device(0x0000, 0xffff, *this, &nemoide_device::map_io);
}

} // anonymous namespace
Expand Down
8 changes: 3 additions & 5 deletions src/devices/bus/spectrum/neogs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,15 @@ class neogs_device : public device_t, public device_zxbus_card_interface
, m_neogs_led(*this, "neogs_led")
{ }

virtual void io_map(address_map &map) override ATTR_COLD;

protected:
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;

void neogsmap(address_map &map) ATTR_COLD;

INTERRUPT_GEN_MEMBER(irq0_line_assert);

void map_memory(address_map &map) ATTR_COLD;
Expand Down Expand Up @@ -438,7 +438,7 @@ const tiny_rom_entry *neogs_device::device_rom_region() const
return ROM_NAME( neogs );
}

void neogs_device::neogsmap(address_map &map)
void neogs_device::io_map(address_map &map)
{
map(0x00bb, 0x00bb).mirror(0xff00).rw(FUNC(neogs_device::neogs_status_r), FUNC(neogs_device::neogs_command_w));
map(0x00b3, 0x00b3).mirror(0xff00).rw(FUNC(neogs_device::neogs_data_r), FUNC(neogs_device::neogs_data_w));
Expand Down Expand Up @@ -466,8 +466,6 @@ void neogs_device::device_start()
}
});

m_zxbus->install_device(0x0000, 0xffff, *this, &neogs_device::neogsmap);

m_neogs_led.resolve();

save_item(NAME(m_data_in));
Expand Down
8 changes: 2 additions & 6 deletions src/devices/bus/spectrum/smuc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,14 @@ class smuc_device : public device_t, public device_zxbus_card_interface
, m_ata(*this, "ata")
{ }

virtual void map_shadow_io(address_map &map) override ATTR_COLD;
virtual void shadow_io_map(address_map &map) override ATTR_COLD;

protected:
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;

private:
void map_io(address_map &map) ATTR_COLD {}

void port_ffba_w(offs_t offset, u8 data);
u8 ata_r(offs_t offset);
void ata_w(offs_t offset, u8 data);
Expand Down Expand Up @@ -83,7 +81,7 @@ void smuc_device::ata_w(offs_t offset, u8 data)
m_ata->cs0_w(ata_offset, ata_data);
}

void smuc_device::map_shadow_io(address_map &map)
void smuc_device::shadow_io_map(address_map &map)
{
map(0x18a2, 0x18a2).mirror(0x4718) // 5fba | 0x011xxx101xx010 | Version: 2
.lr8(NAME([]() { return 0x40; }));
Expand Down Expand Up @@ -125,8 +123,6 @@ void smuc_device::device_start()
save_item(NAME(m_port_7fba_data));
save_item(NAME(m_port_ffba_data));
save_item(NAME(m_ide_hi));

m_zxbus->install_device(0x0000, 0xffff, *this, &smuc_device::map_io);
}

void smuc_device::device_reset()
Expand Down
19 changes: 9 additions & 10 deletions src/devices/bus/spectrum/zxbus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ zxbus_device::zxbus_device(const machine_config &mconfig, const char *tag, devic

zxbus_device::zxbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
, m_iospace(*this, finder_base::DUMMY_TAG, -1)
, m_shadow_io_view(nullptr)
, m_io(nullptr)
, m_shadow_io(nullptr)
{
}

Expand All @@ -52,10 +52,14 @@ void zxbus_device::device_start()
void zxbus_device::add_slot(zxbus_slot_device &slot)
{
m_slot_list.push_front(&slot);
if (m_shadow_io_view)

device_zxbus_card_interface *card = slot.get_card_device();
if (card)
{
device_zxbus_card_interface *dev = slot.get_card_device();
(*m_shadow_io_view).install_device(0x0000, 0xffff, *dev, &device_zxbus_card_interface::map_shadow_io);
if (m_io)
m_io->install_device(0x0000, 0xffff, *card, &device_zxbus_card_interface::io_map);
if (m_shadow_io)
m_shadow_io->install_device(0x0000, 0xffff, *card, &device_zxbus_card_interface::shadow_io_map);
}
}

Expand All @@ -65,11 +69,6 @@ device_zxbus_card_interface::device_zxbus_card_interface(const machine_config &m
{
}

void zxbus_device::install_shadow_io(memory_view::memory_view_entry &io_view)
{
m_shadow_io_view = &io_view;
}

void device_zxbus_card_interface::interface_pre_start()
{
if (!m_zxbus)
Expand Down
14 changes: 7 additions & 7 deletions src/devices/bus/spectrum/zxbus.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,23 +85,22 @@ class zxbus_device : public device_t
public:
zxbus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

template <typename T> void set_iospace(T &&tag, int spacenum) { m_iospace.set_tag(std::forward<T>(tag), spacenum); }
template<typename T> void install_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), u64 unitmask = ~u64(0))
void set_io_space(address_space_installer &io, address_space_installer &shadow_io)
{
m_iospace->install_device(addrstart, addrend, device, map, unitmask);
m_io = &io;
m_shadow_io = &shadow_io;
}

void add_slot(zxbus_slot_device &slot);
void install_shadow_io(memory_view::memory_view_entry &io_view);

protected:
zxbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);

virtual void device_start() override ATTR_COLD;

private:
required_address_space m_iospace;
memory_view::memory_view_entry *m_shadow_io_view;
address_space_installer *m_io;
address_space_installer *m_shadow_io;

std::forward_list<zxbus_slot_device *> m_slot_list;
};
Expand All @@ -114,7 +113,8 @@ class device_zxbus_card_interface : public device_interface
friend class zxbus_slot_device;

public:
virtual void map_shadow_io(address_map &map) ATTR_COLD {}
virtual void io_map(address_map &map) ATTR_COLD {}
virtual void shadow_io_map(address_map &map) ATTR_COLD {}

protected:
device_zxbus_card_interface(const machine_config &mconfig, device_t &device);
Expand Down
31 changes: 17 additions & 14 deletions src/mame/sinclair/pentevo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ void pentevo_state::atm_update_io()
{
if (BIT(m_port_bf_data, 0) || is_dos_active())
{
m_io_view.select(0);
m_io_view.select(1);
if (m_beta_drive_selected && m_beta_drive_virtual == m_beta_drive_selected)
m_io_dos_view.disable();
else
Expand All @@ -168,7 +168,7 @@ void pentevo_state::atm_update_io()
}
else
{
m_io_view.disable();
m_io_view.select(0);
if (BIT(m_port_eff7_data, 7))
m_glukrs->enable();
else
Expand Down Expand Up @@ -623,28 +623,32 @@ void pentevo_state::pentevo_io(address_map &map)
map(0xffdf, 0xffdf).lr8(NAME([this]() -> u8 { return ~m_io_mouse[1]->read(); }));
map(0x001f, 0x001f).mirror(0xff00).lr8(NAME([]() -> u8 { return 0x00; })); // TODO Kepmston Joystick

// PORTS: Shadow
map(0x0000, 0xffff).view(m_io_view);
m_io_view[0](0x0000, 0xffff).view(m_io_dos_view);
m_io_view[0];

// PORTS: Shadow
m_io_view[1](0x0000, 0xffff).view(m_io_dos_view);
m_io_dos_view[0](0x001f, 0x001f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w));
m_io_dos_view[0](0x003f, 0x003f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w));
m_io_dos_view[0](0x005f, 0x005f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w));
m_io_dos_view[0](0x007f, 0x007f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w));
m_io_dos_view[0](0x00ff, 0x00ff).select(0xff00).r(m_beta, FUNC(beta_disk_device::state_r));

m_io_view[0](0x00ff, 0x00ff).select(0xff00).w(FUNC(pentevo_state::atm_port_ff_w));
m_io_view[0](0x0077, 0x0077).select(0xff00).lr8(NAME([]() { return 0xff; })).w(FUNC(pentevo_state::atm_port_77_w));
m_io_view[0](0x3ff7, 0x3ff7).select(0xc000).w(FUNC(pentevo_state::atm_port_f7_w)); // ATM
m_io_view[0](0x37f7, 0x37f7).select(0xc000).w(FUNC(pentevo_state::pentevo_port_7f7_w)); // PENTEVO
m_io_view[0](0x3bf7, 0x3bf7).select(0xc000).w(FUNC(pentevo_state::pentevo_port_bf7_w)); // RO
m_io_view[1](0x00ff, 0x00ff).select(0xff00).w(FUNC(pentevo_state::atm_port_ff_w));
m_io_view[1](0x0077, 0x0077).select(0xff00).lr8(NAME([]() { return 0xff; })).w(FUNC(pentevo_state::atm_port_77_w));
m_io_view[1](0x3ff7, 0x3ff7).select(0xc000).w(FUNC(pentevo_state::atm_port_f7_w)); // ATM
m_io_view[1](0x37f7, 0x37f7).select(0xc000).w(FUNC(pentevo_state::pentevo_port_7f7_w)); // PENTEVO
m_io_view[1](0x3bf7, 0x3bf7).select(0xc000).w(FUNC(pentevo_state::pentevo_port_bf7_w)); // RO

// SPI
m_io_view[0](0x0057, 0x0057).select(0xff00)
m_io_view[1](0x0057, 0x0057).select(0xff00)
.lw8(NAME([this](offs_t offset, u8 data) { if (BIT(offset, 15)) spi_port_77_w(offset, data); else spi_port_57_w(offset, data); }));

// Gluk
m_io_view[0](0xdef7, 0xdef7).lw8(NAME([this](offs_t offset, u8 data) { m_glukrs->address_w(data); } ));
m_io_view[0](0xbef7, 0xbef7).rw(FUNC(pentevo_state::gluk_data_r), FUNC(pentevo_state::gluk_data_w));
m_io_view[1](0xdef7, 0xdef7).lw8(NAME([this](offs_t offset, u8 data) { m_glukrs->address_w(data); } ));
m_io_view[1](0xbef7, 0xbef7).rw(FUNC(pentevo_state::gluk_data_r), FUNC(pentevo_state::gluk_data_w));

subdevice<zxbus_device>("zxbus")->set_io_space(m_io_view[0], m_io_view[1]);
}

void pentevo_state::init_mem_write()
Expand Down Expand Up @@ -786,8 +790,7 @@ void pentevo_state::pentevo(machine_config &config)
AT_KEYB(config, m_keyboard, pc_keyboard_device::KEYBOARD_TYPE::AT, 3);

zxbus_device &zxbus(ZXBUS(config, "zxbus", 0));
zxbus.set_iospace("maincpu", AS_IO);
ZXBUS_SLOT(config, "zxbus1", 0, "zxbus", zxbus_cards, nullptr);
ZXBUS_SLOT(config, "zxbus1", 0, zxbus, zxbus_cards, nullptr);
}


Expand Down
Loading
Loading