From 68d1d9fd8a48b786b011054a5c8fb7ed9bc43cc8 Mon Sep 17 00:00:00 2001 From: Andrei Holub Date: Sun, 19 Jan 2025 23:17:20 -0500 Subject: [PATCH 1/3] bus/spectrum/zxbus.cpp: Refactored shadow IO handeling --- src/devices/bus/spectrum/nemoide.cpp | 8 +-- src/devices/bus/spectrum/neogs.cpp | 6 +- src/devices/bus/spectrum/smuc.cpp | 25 +++---- src/devices/bus/spectrum/zxbus.cpp | 16 +++++ src/devices/bus/spectrum/zxbus.h | 7 +- src/mame/sinclair/scorpion.cpp | 103 ++++++++++++++------------- src/mame/sinclair/sprinter.cpp | 2 +- 7 files changed, 96 insertions(+), 71 deletions(-) diff --git a/src/devices/bus/spectrum/nemoide.cpp b/src/devices/bus/spectrum/nemoide.cpp index 77985969739..75c83bc31fe 100644 --- a/src/devices/bus/spectrum/nemoide.cpp +++ b/src/devices/bus/spectrum/nemoide.cpp @@ -53,10 +53,10 @@ void nemoide_device::ata_w(offs_t offset, u8 data) void nemoide_device::map_io(address_map &map) { - map(0x00011, 0x00011).mirror(0xff00).lrw8(NAME([this]() { return m_ata_data_latch; }) + 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; })); - map(0x00010, 0x00010).select(0xffe0).rw(FUNC(nemoide_device::ata_r), FUNC(nemoide_device::ata_w)); - map(0x000c8, 0x000c8).mirror(0xff00).lrw8(NAME([this]() { return m_ata->cs1_r(6); }) + map(0x0010, 0x0010).select(0xffe0).rw(FUNC(nemoide_device::ata_r), FUNC(nemoide_device::ata_w)); + map(0x00c8, 0x00c8).mirror(0xff00).lrw8(NAME([this]() { return m_ata->cs1_r(6); }) , NAME([this](offs_t offset, u8 data) { m_ata->cs1_w(6, data); })); } @@ -75,7 +75,7 @@ void nemoide_device::device_start() { save_item(NAME(m_ata_data_latch)); - m_zxbus->install_device(0x00000, 0x1ffff, *this, &nemoide_device::map_io); + m_zxbus->install_device(0x0000, 0xffff, *this, &nemoide_device::map_io); } } // anonymous namespace diff --git a/src/devices/bus/spectrum/neogs.cpp b/src/devices/bus/spectrum/neogs.cpp index f1733f83947..156c2e2895c 100644 --- a/src/devices/bus/spectrum/neogs.cpp +++ b/src/devices/bus/spectrum/neogs.cpp @@ -440,9 +440,9 @@ const tiny_rom_entry *neogs_device::device_rom_region() const void neogs_device::neogsmap(address_map &map) { - map(0x000bb, 0x000bb).mirror(0xff00).rw(FUNC(neogs_device::neogs_status_r), FUNC(neogs_device::neogs_command_w)); - map(0x000b3, 0x000b3).mirror(0xff00).rw(FUNC(neogs_device::neogs_data_r), FUNC(neogs_device::neogs_data_w)); - map(0x00033, 0x00033).mirror(0xff00).w(FUNC(neogs_device::neogs_ctrl_w)); + 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)); + map(0x0033, 0x0033).mirror(0xff00).w(FUNC(neogs_device::neogs_ctrl_w)); } void neogs_device::device_start() diff --git a/src/devices/bus/spectrum/smuc.cpp b/src/devices/bus/spectrum/smuc.cpp index b086175aa33..d2ac18278a4 100644 --- a/src/devices/bus/spectrum/smuc.cpp +++ b/src/devices/bus/spectrum/smuc.cpp @@ -25,13 +25,15 @@ public: , m_ata(*this, "ata") { } + virtual void map_shadow_io(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 map_io(address_map &map) ATTR_COLD {} void port_ffba_w(offs_t offset, u8 data); u8 ata_r(offs_t offset); @@ -81,26 +83,25 @@ void smuc_device::ata_w(offs_t offset, u8 data) m_ata->cs0_w(ata_offset, ata_data); } - -void smuc_device::map_io(address_map &map) +void smuc_device::map_shadow_io(address_map &map) { - map(0x118a2, 0x118a2).mirror(0x4718) // 5fba | 0x011xxx101xx010 | Version: 2 + map(0x18a2, 0x18a2).mirror(0x4718) // 5fba | 0x011xxx101xx010 | Version: 2 .lr8(NAME([]() { return 0x40; })); - map(0x118a6, 0x118a6).mirror(0x4718) // 5fbe | 0x011xxx101xx110 | Revision: 0 + map(0x18a6, 0x18a6).mirror(0x4718) // 5fbe | 0x011xxx101xx110 | Revision: 0 .lr8(NAME([]() { return 0x28; })); - map(0x138a2, 0x138a2).mirror(0x4718) // 7fba | 0x111xxx101xx010 | VirtualFDD + map(0x38a2, 0x38a2).mirror(0x4718) // 7fba | 0x111xxx101xx010 | VirtualFDD .lrw8(NAME([this]() { return m_port_7fba_data | 0x37; }) , NAME([this](u8 data) { m_port_7fba_data = data; })); - map(0x138a6, 0x138a6).mirror(0x4718) // 7[ef]be | 0x111xxN101xx110 | i8259 - absent in 2.0 + map(0x38a6, 0x38a6).mirror(0x4718) // 7[ef]be | 0x111xxN101xx110 | i8259 - absent in 2.0 .lr8(NAME([]() { return 0x57; })).nopw(); - map(0x198a2, 0x198a2).mirror(0x4718) // dfba | 1x011xxx101xx010 | DS1685RTC + map(0x98a2, 0x98a2).mirror(0x4718) // dfba | 1x011xxx101xx010 | DS1685RTC .lrw8(NAME([this]() { return m_rtc->data_r(); }) , NAME([this](u8 data) { if (BIT(m_port_ffba_data, 7)) m_rtc->data_w(data); else m_rtc->address_w(data); })); - map(0x198a6, 0x198a6).mirror(0x4718) // d8be | 1x011xxx101xx110 | IDE-Hi + map(0x98a6, 0x98a6).mirror(0x4718) // d8be | 1x011xxx101xx110 | IDE-Hi .lrw8(NAME([this]() { return m_ide_hi; }), NAME([this](u8 data) { m_ide_hi = data; })); - map(0x1b8a2, 0x1b8a2).mirror(0x4718) // ffba | 1x111xxx101xx010 | SYS + map(0xb8a2, 0xb8a2).mirror(0x4718) // ffba | 1x111xxx101xx010 | SYS .lr8(NAME([this]() { return m_eeprom->read_sda() ? 0xff : 0xbf; })).w(FUNC(smuc_device::port_ffba_w)); - map(0x1b8a6, 0x1b8a6).select(0x4718) // f[8-f]be | 1x111NNN101xx110 | IDE#1Fx/#3F6 + map(0xb8a6, 0xb8a6).select(0x4718) // f[8-f]be | 1x111NNN101xx110 | IDE#1Fx/#3F6 .rw(FUNC(smuc_device::ata_r), FUNC(smuc_device::ata_w)); } @@ -125,7 +126,7 @@ void smuc_device::device_start() save_item(NAME(m_port_ffba_data)); save_item(NAME(m_ide_hi)); - m_zxbus->install_device(0x00000, 0x1ffff, *this, &smuc_device::map_io); + m_zxbus->install_device(0x0000, 0xffff, *this, &smuc_device::map_io); } void smuc_device::device_reset() diff --git a/src/devices/bus/spectrum/zxbus.cpp b/src/devices/bus/spectrum/zxbus.cpp index 24546353cf7..ac5e83436dd 100644 --- a/src/devices/bus/spectrum/zxbus.cpp +++ b/src/devices/bus/spectrum/zxbus.cpp @@ -41,6 +41,7 @@ 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) { } @@ -51,6 +52,11 @@ 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 *dev = slot.get_card_device(); + (*m_shadow_io_view).install_device(0x0000, 0xffff, *dev, &device_zxbus_card_interface::map_shadow_io); + } } device_zxbus_card_interface::device_zxbus_card_interface(const machine_config &mconfig, device_t &device) @@ -59,6 +65,11 @@ 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) @@ -74,5 +85,10 @@ void zxbus_cards(device_slot_interface &device) { device.option_add("nemoide", ZXBUS_NEMOIDE); device.option_add("neogs", ZXBUS_NEOGS); +} + +void zxbus_gmx_cards(device_slot_interface &device) +{ + zxbus_cards(device); device.option_add("smuc", ZXBUS_SMUC); } diff --git a/src/devices/bus/spectrum/zxbus.h b/src/devices/bus/spectrum/zxbus.h index ac819ecd6cc..ddaa176cf9e 100644 --- a/src/devices/bus/spectrum/zxbus.h +++ b/src/devices/bus/spectrum/zxbus.h @@ -92,6 +92,7 @@ public: } 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); @@ -100,6 +101,7 @@ protected: private: required_address_space m_iospace; + memory_view::memory_view_entry *m_shadow_io_view; std::forward_list m_slot_list; }; @@ -111,6 +113,9 @@ class device_zxbus_card_interface : public device_interface { friend class zxbus_slot_device; +public: + virtual void map_shadow_io(address_map &map) ATTR_COLD {} + protected: device_zxbus_card_interface(const machine_config &mconfig, device_t &device); @@ -123,6 +128,6 @@ protected: void zxbus_cards(device_slot_interface &device); - +void zxbus_gmx_cards(device_slot_interface &device); #endif // MAME_BUS_SPECTRUM_ZXBUS_H diff --git a/src/mame/sinclair/scorpion.cpp b/src/mame/sinclair/scorpion.cpp index 927b2cadb33..83988c636f2 100644 --- a/src/mame/sinclair/scorpion.cpp +++ b/src/mame/sinclair/scorpion.cpp @@ -28,8 +28,8 @@ class scorpion_state : public spectrum_128_state public: scorpion_state(const machine_config &mconfig, device_type type, const char *tag) : spectrum_128_state(mconfig, type, tag) - , m_bankio(*this, "bankio") , m_bank0_rom(*this, "bank0_rom") + , m_io_shadow_view(*this, "io_shadow_view") , m_beta(*this, BETA_DISK_TAG) , m_ay(*this, "ay%u", 0U) , m_io_mouse(*this, "mouse_input%u", 1U) @@ -54,10 +54,9 @@ protected: bool romram() const { return BIT(m_port_1ffd_data, 0); } bool rom1() const { return BIT(m_port_7ffd_data, 4); } - void scorpion_io(address_map &map) ATTR_COLD; + virtual void scorpion_io(address_map &map) ATTR_COLD; void scorpion_mem(address_map &map) ATTR_COLD; void scorpion_switch(address_map &map) ATTR_COLD; - virtual void scorpion_ioext(address_map &map) ATTR_COLD; u8 port_ff_r(); void port_7ffd_w(u8 data); void port_1ffd_w(u8 data); @@ -66,11 +65,11 @@ protected: virtual rectangle get_screen_area() override; virtual void scorpion_update_memory(); virtual void do_nmi(); + void update_io(bool dos_enable); memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program; - memory_access<17, 0, 0, ENDIANNESS_LITTLE>::specific m_ioext; - required_device m_bankio; memory_view m_bank0_rom; + memory_view m_io_shadow_view; required_device m_beta; required_device_array m_ay; @@ -106,7 +105,7 @@ protected: virtual void machine_reset() override ATTR_COLD; virtual void video_start() override ATTR_COLD; - virtual void scorpion_ioext(address_map &map) override ATTR_COLD; + virtual void scorpion_io(address_map &map) override ATTR_COLD; virtual void ay_address_w(u8 data) override; virtual void scorpion_update_memory() override; @@ -136,7 +135,7 @@ protected: virtual void machine_reset() override ATTR_COLD; virtual void video_start() override ATTR_COLD; - virtual void scorpion_ioext(address_map &map) override ATTR_COLD; + virtual void scorpion_io(address_map &map) override ATTR_COLD; void global_cfg_w(u8 data); u8 port_78fd_r(); u8 port_7afd_r(); @@ -230,12 +229,26 @@ INPUT_CHANGED_MEMBER(scorpion_state::on_nmi) void scorpion_state::do_nmi() { - m_beta->enable(); - scorpion_update_memory(); + update_io(true); m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); m_nmi_pending = 0; } +void scorpion_state::update_io(bool dos_enable) +{ + if (dos_enable) + m_beta->enable(); + else + m_beta->disable(); + + scorpion_update_memory(); + + if (dos()) + m_io_shadow_view.select(0); + else + m_io_shadow_view.disable(); +} + u8 scorpion_state::port_ff_r() { if (m_magic_lock && !machine().side_effects_disabled()) @@ -287,8 +300,7 @@ u8 scorpion_state::beta_enable_r(offs_t offset) if (m_is_m1_even && (m_maincpu->total_cycles() & 1)) m_maincpu->eat_cycles(1); if (!dos() && rom1()) { - m_beta->enable(); - scorpion_update_memory(); + update_io(true); } } return m_program.read_byte(offset + 0x3d00); @@ -305,8 +317,7 @@ u8 scorpion_state::beta_disable_r(offs_t offset) } else if (dos()) { - m_beta->disable(); - scorpion_update_memory(); + update_io(false); } } return m_program.read_byte(offset + 0x4000); @@ -323,21 +334,21 @@ void scorpion_state::scorpion_mem(address_map &map) map(0xc000, 0xffff).bankr(m_bank_ram[3]).w(FUNC(scorpion_state::spectrum_128_ram_w<3>)); } -void scorpion_state::scorpion_ioext(address_map &map) +void scorpion_state::scorpion_io(address_map &map) { map.unmap_value_high(); map(0x0022, 0x0022).select(0xffdc) // FE | xxxxxxxxxx1xxx10 .rw(FUNC(scorpion_state::spectrum_ula_r), FUNC(scorpion_state::spectrum_ula_w)); map(0x0023, 0x0023).mirror(0xffdc) // FF | xxxxxxxxxx1xxx11 .r(FUNC(scorpion_state::port_ff_r)); - map(0x0021, 0x0021).mirror(0x13fdc) // 1FFD | 00xxxxxxxx1xxx01 + map(0x0021, 0x0021).mirror(0x3fdc) // 1FFD | 00xxxxxxxx1xxx01 .w(FUNC(scorpion_state::port_1ffd_w)); - map(0x4021, 0x4021).mirror(0x13fdc) // 7FFD | 01xxxxxxxx1xxx01 + map(0x4021, 0x4021).mirror(0x3fdc) // 7FFD | 01xxxxxxxx1xxx01 .w(FUNC(scorpion_state::port_7ffd_w)); - map(0xa021, 0xa021).mirror(0x11fdc) // BFFD | 101xxxxxxx1xxx01 + map(0xa021, 0xa021).mirror(0x1fdc) // BFFD | 101xxxxxxx1xxx01 .lw8(NAME([this](u8 data) { m_ay[m_ay_selected]->data_w(data); })); - map(0xe021, 0xe021).mirror(0x11fdc) // FFFD | 111xxxxxxx1xxx01 + map(0xe021, 0xe021).mirror(0x1fdc) // FFFD | 111xxxxxxx1xxx01 .lr8(NAME([this]() { return m_ay[m_ay_selected]->data_r(); })).w(FUNC(scorpion_state::ay_address_w)); // Mouse @@ -349,18 +360,14 @@ void scorpion_state::scorpion_ioext(address_map &map) // Shadow // DOS + xxxxxxxx0nnxxx11 - map(0x10003, 0x10003).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w)); - map(0x10023, 0x10023).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); - map(0x10043, 0x10043).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w)); - map(0x10063, 0x10063).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w)); - map(0x100e3, 0x100e3).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); -} + map(0x0000, 0xffff).view(m_io_shadow_view); + m_io_shadow_view[0](0x0003, 0x0003).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w)); + m_io_shadow_view[0](0x0023, 0x0023).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); + m_io_shadow_view[0](0x0043, 0x0043).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w)); + m_io_shadow_view[0](0x0063, 0x0063).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w)); + m_io_shadow_view[0](0x00e3, 0x00e3).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); -void scorpion_state::scorpion_io(address_map &map) -{ - map(0x0000, 0xffff).lrw8( - NAME([this](offs_t offset) { return m_ioext.read_byte((dos() << 16) | offset); }), - NAME([this](offs_t offset, u8 data) { m_ioext.write_byte((dos() << 16) | offset, data); })); + subdevice("zxbus")->install_shadow_io(m_io_shadow_view[0]); } void scorpion_state::scorpion_switch(address_map &map) @@ -381,7 +388,6 @@ void scorpion_state::machine_start() save_item(NAME(m_ram_banks)); m_maincpu->space(AS_PROGRAM).specific(m_program); - m_bankio->space(AS_PROGRAM).specific(m_ioext); // reconfigure ROMs memory_region *rom = memregion("maincpu"); @@ -397,7 +403,6 @@ void scorpion_state::machine_reset() m_nmi_pending = 0; m_magic_lock = 0; m_ay_selected = 0; - m_beta->disable(); m_port_fe_data = 255; m_port_7ffd_data = 0; @@ -405,7 +410,7 @@ void scorpion_state::machine_reset() m_bank_ram[2]->set_entry(2); - scorpion_update_memory(); + update_io(false); } void scorpion_state::video_start() @@ -525,12 +530,10 @@ void scorpion_state::scorpion(machine_config &config) config.device_remove("exp"); - ADDRESS_MAP_BANK(config, m_bankio).set_map(&scorpion_state::scorpion_ioext).set_options(ENDIANNESS_LITTLE, 8, 17, 0); - zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); - zxbus.set_iospace(m_bankio, AS_PROGRAM); - ZXBUS_SLOT(config, "zxbus:1", 0, "zxbus", zxbus_cards, nullptr); - ZXBUS_SLOT(config, "zxbus:2", 0, "zxbus", zxbus_cards, nullptr); + zxbus.set_iospace("maincpu", AS_IO); + ZXBUS_SLOT(config, "zxbus:1", 0, "zxbus", zxbus_gmx_cards, nullptr); + ZXBUS_SLOT(config, "zxbus:2", 0, "zxbus", zxbus_gmx_cards, nullptr); } void scorpion_state::profi(machine_config &config) @@ -648,14 +651,14 @@ void scorpiontb_state::video_start() }); } -void scorpiontb_state::scorpion_ioext(address_map &map) +void scorpiontb_state::scorpion_io(address_map &map) { - scorpion_state::scorpion_ioext(map); - map(0x0021, 0x0021).mirror(0x13fdc) // 1FFD | 00xxxxxxxx1xxx01 + scorpion_state::scorpion_io(map); + map(0x0021, 0x0021).mirror(0x3fdc) // 1FFD | 00xxxxxxxx1xxx01 .lr8(NAME([this](offs_t offset) -> u8 { m_turbo = 0; m_maincpu->set_clock_scale(1); return 0xff; })); - map(0x4021, 0x4021).mirror(0x13fdc) // 7FFD | 01xxxxxxxx1xxx01 + map(0x4021, 0x4021).mirror(0x3fdc) // 7FFD | 01xxxxxxxx1xxx01 .lr8(NAME([this](offs_t offset) -> u8 { m_turbo = 1; m_maincpu->set_clock_scale(2); return 0xff; })); - map(0xe021, 0xe021).mirror(0x11fdc) // FFFD | 111xxxxxxx1xxx01 + map(0xe021, 0xe021).mirror(0x1fdc) // FFFD | 111xxxxxxx1xxx01 .rw(FUNC(scorpiontb_state::ay_data_r), FUNC(scorpiontb_state::ay_address_w)); // Centronics @@ -873,20 +876,20 @@ void scorpiongmx_state::video_start() scorpion_state::video_start(); } -void scorpiongmx_state::scorpion_ioext(address_map &map) +void scorpiongmx_state::scorpion_io(address_map &map) { - scorpiontb_state::scorpion_ioext(map); + scorpiontb_state::scorpion_io(map); map(0x0000, 0x0000).mirror(0xff00).w(FUNC(scorpiongmx_state::global_cfg_w)); - map(0x0000, 0x1ffff).view(m_io_gmx); - m_io_gmx[0](0x78fd, 0x78fd).mirror(0x10000).r(FUNC(scorpiongmx_state::port_78fd_r)) + map(0x0000, 0xffff).view(m_io_gmx); + m_io_gmx[0](0x78fd, 0x78fd).mirror(0x0000).r(FUNC(scorpiongmx_state::port_78fd_r)) .lw8(NAME([this](u8 data) { m_port_78fd_data = data & 0x7f; scorpion_update_memory(); })); - m_io_gmx[0](0x7afd, 0x7afd).mirror(0x10000).r(FUNC(scorpiongmx_state::port_7afd_r)) + m_io_gmx[0](0x7afd, 0x7afd).mirror(0x0000).r(FUNC(scorpiongmx_state::port_7afd_r)) .lw8(NAME([this](u8 data) { m_scroll_lo = data & 0xf0; })); - m_io_gmx[0](0x7cfd, 0x7cfd).mirror(0x10000) + m_io_gmx[0](0x7cfd, 0x7cfd).mirror(0x0000) .lw8(NAME([this](u8 data) { m_scroll_hi = data & 0x3f; })); - m_io_gmx[0](0x7efd, 0x7efd).mirror(0x10000).rw(FUNC(scorpiongmx_state::port_7efd_r), FUNC(scorpiongmx_state::port_7efd_w)); - m_io_gmx[0](0xdffd, 0xdffd).mirror(0x10000) + m_io_gmx[0](0x7efd, 0x7efd).mirror(0x0000).rw(FUNC(scorpiongmx_state::port_7efd_r), FUNC(scorpiongmx_state::port_7efd_w)); + m_io_gmx[0](0xdffd, 0xdffd).mirror(0x0000) .lw8(NAME([this](u8 data) { m_port_dffd_data = data & 0x07; scorpion_update_memory(); })); } diff --git a/src/mame/sinclair/sprinter.cpp b/src/mame/sinclair/sprinter.cpp index 63ed92f6234..20fdadf96cc 100644 --- a/src/mame/sinclair/sprinter.cpp +++ b/src/mame/sinclair/sprinter.cpp @@ -1709,7 +1709,7 @@ INPUT_PORTS_START( sprinter ) PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPS SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("z Z : LN BEEP COPY") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':') PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"x X £ EXP INK CLEAR") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(U'£') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("x X $ EXP INK CLEAR") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(U'£') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("c C ? LPRINT PAPER CONT") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("v V / LLIST FLASH CLS") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/') PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_SLASH_PAD) From efaf248eaccec0e7be6af9151e62d62d0bceefa8 Mon Sep 17 00:00:00 2001 From: Andrei Holub Date: Mon, 20 Jan 2025 19:06:43 -0500 Subject: [PATCH 2/3] bus/spectrum/zxbus.cpp more rafactoring --- src/devices/bus/spectrum/nemoide.cpp | 7 ++--- src/devices/bus/spectrum/neogs.cpp | 8 ++--- src/devices/bus/spectrum/smuc.cpp | 8 ++--- src/devices/bus/spectrum/zxbus.cpp | 19 ++++++------ src/devices/bus/spectrum/zxbus.h | 14 ++++----- src/mame/sinclair/pentevo.cpp | 31 +++++++++++--------- src/mame/sinclair/scorpion.cpp | 44 +++++++++++++--------------- src/mame/sinclair/specnext.cpp | 9 ++++-- src/mame/sinclair/sprinter.cpp | 6 ++-- src/mame/sinclair/tsconf.cpp | 5 ++-- 10 files changed, 74 insertions(+), 77 deletions(-) diff --git a/src/devices/bus/spectrum/nemoide.cpp b/src/devices/bus/spectrum/nemoide.cpp index 75c83bc31fe..4aef90df554 100644 --- a/src/devices/bus/spectrum/nemoide.cpp +++ b/src/devices/bus/spectrum/nemoide.cpp @@ -21,12 +21,13 @@ public: , 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); @@ -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; })); @@ -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 diff --git a/src/devices/bus/spectrum/neogs.cpp b/src/devices/bus/spectrum/neogs.cpp index 156c2e2895c..32fc939b509 100644 --- a/src/devices/bus/spectrum/neogs.cpp +++ b/src/devices/bus/spectrum/neogs.cpp @@ -85,6 +85,8 @@ public: , 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; @@ -92,8 +94,6 @@ protected: 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; @@ -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)); @@ -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)); diff --git a/src/devices/bus/spectrum/smuc.cpp b/src/devices/bus/spectrum/smuc.cpp index d2ac18278a4..f44cb7a6106 100644 --- a/src/devices/bus/spectrum/smuc.cpp +++ b/src/devices/bus/spectrum/smuc.cpp @@ -25,7 +25,7 @@ public: , 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; @@ -33,8 +33,6 @@ protected: 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); @@ -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; })); @@ -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() diff --git a/src/devices/bus/spectrum/zxbus.cpp b/src/devices/bus/spectrum/zxbus.cpp index ac5e83436dd..67beb56fb37 100644 --- a/src/devices/bus/spectrum/zxbus.cpp +++ b/src/devices/bus/spectrum/zxbus.cpp @@ -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) { } @@ -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); } } @@ -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) diff --git a/src/devices/bus/spectrum/zxbus.h b/src/devices/bus/spectrum/zxbus.h index ddaa176cf9e..5caa0f023ef 100644 --- a/src/devices/bus/spectrum/zxbus.h +++ b/src/devices/bus/spectrum/zxbus.h @@ -85,14 +85,13 @@ class zxbus_device : public device_t public: zxbus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - template void set_iospace(T &&tag, int spacenum) { m_iospace.set_tag(std::forward(tag), spacenum); } - template 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); @@ -100,8 +99,8 @@ protected: 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 m_slot_list; }; @@ -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); diff --git a/src/mame/sinclair/pentevo.cpp b/src/mame/sinclair/pentevo.cpp index c1ac0017368..02317273416 100644 --- a/src/mame/sinclair/pentevo.cpp +++ b/src/mame/sinclair/pentevo.cpp @@ -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 @@ -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 @@ -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")->set_io_space(m_io_view[0], m_io_view[1]); } void pentevo_state::init_mem_write() @@ -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); } diff --git a/src/mame/sinclair/scorpion.cpp b/src/mame/sinclair/scorpion.cpp index 83988c636f2..e1f44a54a2b 100644 --- a/src/mame/sinclair/scorpion.cpp +++ b/src/mame/sinclair/scorpion.cpp @@ -243,10 +243,7 @@ void scorpion_state::update_io(bool dos_enable) scorpion_update_memory(); - if (dos()) - m_io_shadow_view.select(0); - else - m_io_shadow_view.disable(); + m_io_shadow_view.select(dos() ? 1 : 0); } u8 scorpion_state::port_ff_r() @@ -337,10 +334,7 @@ void scorpion_state::scorpion_mem(address_map &map) void scorpion_state::scorpion_io(address_map &map) { map.unmap_value_high(); - map(0x0022, 0x0022).select(0xffdc) // FE | xxxxxxxxxx1xxx10 - .rw(FUNC(scorpion_state::spectrum_ula_r), FUNC(scorpion_state::spectrum_ula_w)); - map(0x0023, 0x0023).mirror(0xffdc) // FF | xxxxxxxxxx1xxx11 - .r(FUNC(scorpion_state::port_ff_r)); + map(0x0021, 0x0021).mirror(0x3fdc) // 1FFD | 00xxxxxxxx1xxx01 .w(FUNC(scorpion_state::port_1ffd_w)); map(0x4021, 0x4021).mirror(0x3fdc) // 7FFD | 01xxxxxxxx1xxx01 @@ -351,23 +345,28 @@ void scorpion_state::scorpion_io(address_map &map) map(0xe021, 0xe021).mirror(0x1fdc) // FFFD | 111xxxxxxx1xxx01 .lr8(NAME([this]() { return m_ay[m_ay_selected]->data_r(); })).w(FUNC(scorpion_state::ay_address_w)); - // Mouse - map(0xfadf, 0xfadf).lr8(NAME([this]() -> u8 { return 0x80 | (m_io_mouse[2]->read() & 0x07); })); - map(0xfbdf, 0xfbdf).lr8(NAME([this]() -> u8 { return m_io_mouse[0]->read(); })); - map(0xffdf, 0xffdf).lr8(NAME([this]() -> u8 { return ~m_io_mouse[1]->read(); })); - map(0x0003, 0x0003) // 1F | xxxxxxxx0x0xxx11 + map(0x0000, 0xffff).view(m_io_shadow_view); + + // !Shadow + m_io_shadow_view[0](0x0022, 0x0022).select(0xffdc) // FE | xxxxxxxxxx1xxx10 + .rw(FUNC(scorpion_state::spectrum_ula_r), FUNC(scorpion_state::spectrum_ula_w)); + m_io_shadow_view[0](0x0023, 0x0023).mirror(0xffdc) // FF | xxxxxxxxxx1xxx11 + .r(FUNC(scorpion_state::port_ff_r)); + m_io_shadow_view[0](0xfadf, 0xfadf).lr8(NAME([this]() -> u8 { return 0x80 | (m_io_mouse[2]->read() & 0x07); })); + m_io_shadow_view[0](0xfbdf, 0xfbdf).lr8(NAME([this]() -> u8 { return m_io_mouse[0]->read(); })); + m_io_shadow_view[0](0xffdf, 0xffdf).lr8(NAME([this]() -> u8 { return ~m_io_mouse[1]->read(); })); + m_io_shadow_view[0](0x0003, 0x0003) // 1F | xxxxxxxx0x0xxx11 .select(0xff5c).lr8(NAME([this]() -> u8 { return (m_beta->state_r() & 0xc0) | 0x00; })); // TODO Kepmston Joystick // Shadow // DOS + xxxxxxxx0nnxxx11 - map(0x0000, 0xffff).view(m_io_shadow_view); - m_io_shadow_view[0](0x0003, 0x0003).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w)); - m_io_shadow_view[0](0x0023, 0x0023).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); - m_io_shadow_view[0](0x0043, 0x0043).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w)); - m_io_shadow_view[0](0x0063, 0x0063).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w)); - m_io_shadow_view[0](0x00e3, 0x00e3).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); + m_io_shadow_view[1](0x0003, 0x0003).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::status_r), FUNC(beta_disk_device::command_w)); + m_io_shadow_view[1](0x0023, 0x0023).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); + m_io_shadow_view[1](0x0043, 0x0043).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w)); + m_io_shadow_view[1](0x0063, 0x0063).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w)); + m_io_shadow_view[1](0x00e3, 0x00e3).mirror(0xff1c).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); - subdevice("zxbus")->install_shadow_io(m_io_shadow_view[0]); + subdevice("zxbus")->set_io_space(m_io_shadow_view[0], m_io_shadow_view[1]); } void scorpion_state::scorpion_switch(address_map &map) @@ -531,9 +530,8 @@ void scorpion_state::scorpion(machine_config &config) config.device_remove("exp"); zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); - zxbus.set_iospace("maincpu", AS_IO); - ZXBUS_SLOT(config, "zxbus:1", 0, "zxbus", zxbus_gmx_cards, nullptr); - ZXBUS_SLOT(config, "zxbus:2", 0, "zxbus", zxbus_gmx_cards, nullptr); + ZXBUS_SLOT(config, "zxbus:1", 0, zxbus, zxbus_gmx_cards, nullptr); + ZXBUS_SLOT(config, "zxbus:2", 0, zxbus, zxbus_gmx_cards, nullptr); } void scorpion_state::profi(machine_config &config) diff --git a/src/mame/sinclair/specnext.cpp b/src/mame/sinclair/specnext.cpp index c34a1628494..fa9a025c515 100644 --- a/src/mame/sinclair/specnext.cpp +++ b/src/mame/sinclair/specnext.cpp @@ -68,6 +68,7 @@ public: specnext_state(const machine_config &mconfig, device_type type, const char *tag) : spectrum_128_state(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_io_shadow_view(*this, "io_shadow_view") , m_bank_boot_rom(*this, "bootrom") , m_bank_ram(*this, "bank_ram%u", 0U) , m_view0(*this, "mem_view0") @@ -289,6 +290,7 @@ private: memory_access<8, 0, 0, ENDIANNESS_LITTLE>::specific m_next_regs; memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program; memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_io; + memory_view m_io_shadow_view; memory_bank_creator m_bank_boot_rom; memory_bank_array_creator<8> m_bank_ram; memory_view m_view0, m_view1, m_view2, m_view3, m_view4, m_view5, m_view6, m_view7; @@ -2755,6 +2757,10 @@ void specnext_state::map_io(address_map &map) if (m_nr_08_dac_en) m_dac[3]->data_w(data); })); + + map(0x0000, 0xffff).view(m_io_shadow_view); + subdevice("zxbus")->set_io_space(m_io_shadow_view[0], m_io_shadow_view[1]); + m_io_shadow_view.select(0); } void specnext_state::map_regs(address_map &map) @@ -3493,8 +3499,7 @@ void specnext_state::tbblue(machine_config &config) SPECNEXT_DIVMMC(config, m_divmmc, 0); zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); - zxbus.set_iospace("maincpu", AS_IO); - ZXBUS_SLOT(config, "zxbus:1", 0, "zxbus", zxbus_cards, nullptr); + ZXBUS_SLOT(config, "zxbus:1", 0, zxbus, zxbus_cards, nullptr); const rectangle scr_full = { SCR_320x256.left() - 16, SCR_320x256.right() + 16, SCR_320x256.top() - 8, SCR_320x256.bottom() + 8 }; m_screen->set_raw(28_MHz_XTAL / 2, CYCLES_HORIZ, CYCLES_VERT, scr_full); diff --git a/src/mame/sinclair/sprinter.cpp b/src/mame/sinclair/sprinter.cpp index 20fdadf96cc..4b8a8959479 100644 --- a/src/mame/sinclair/sprinter.cpp +++ b/src/mame/sinclair/sprinter.cpp @@ -1709,7 +1709,7 @@ INPUT_PORTS_START( sprinter ) PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPS SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("z Z : LN BEEP COPY") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(':') PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("x X $ EXP INK CLEAR") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(U'£') + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("x X $ EXP INK CLEAR") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR('$') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("c C ? LPRINT PAPER CONT") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR('?') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("v V / LLIST FLASH CLS") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR('/') PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_SLASH_PAD) @@ -1894,8 +1894,8 @@ void sprinter_state::sprinter(machine_config &config) ISA8(config, m_isa[0], X_SP / 5); m_isa[0]->set_custom_spaces(); zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); - zxbus.set_iospace(m_isa[0], isa8_device::AS_ISA_IO); - ZXBUS_SLOT(config, "zxbus2isa", 0, "zxbus", zxbus_cards, nullptr); + //zxbus.set_iospace(m_isa[0], isa8_device::AS_ISA_IO); + ZXBUS_SLOT(config, "zxbus2isa", 0, zxbus, zxbus_cards, nullptr); ISA8(config, m_isa[1], X_SP / 5); m_isa[1]->set_custom_spaces(); diff --git a/src/mame/sinclair/tsconf.cpp b/src/mame/sinclair/tsconf.cpp index 5df2573f830..194d05506da 100644 --- a/src/mame/sinclair/tsconf.cpp +++ b/src/mame/sinclair/tsconf.cpp @@ -279,9 +279,8 @@ void tsconf_state::tsconf(machine_config &config) m_maincpu->set_vblank_int("screen", FUNC(tsconf_state::tsconf_vblank_interrupt)); 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, "zxbus2", 0, "zxbus", zxbus_cards, nullptr); + ZXBUS_SLOT(config, "zxbus1", 0, zxbus, zxbus_cards, nullptr); + //ZXBUS_SLOT(config, "zxbus2", 0, zxbus, zxbus_cards, nullptr); m_ram->set_default_size("4096K"); From 28a719e31829943d3500f6658d251becad02f9fa Mon Sep 17 00:00:00 2001 From: Andrei Holub Date: Tue, 21 Jan 2025 22:11:29 -0500 Subject: [PATCH 3/3] :( --- src/mame/sinclair/sprinter.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/mame/sinclair/sprinter.cpp b/src/mame/sinclair/sprinter.cpp index 4b8a8959479..b90c0230dcb 100644 --- a/src/mame/sinclair/sprinter.cpp +++ b/src/mame/sinclair/sprinter.cpp @@ -80,6 +80,7 @@ public: : spectrum_128_state(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_isa(*this, "isa%u", 0U) + , m_isa_io_view(*this, "isa_io_view") , m_rtc(*this, "rtc") , m_ata(*this, "ata%u", 1U) , m_beta(*this, BETA_DISK_TAG) @@ -113,6 +114,7 @@ protected: void map_io(address_map &map) ATTR_COLD; void map_mem(address_map &map) ATTR_COLD; void map_fetch(address_map &map) ATTR_COLD; + void map_isa_io(address_map &map) ATTR_COLD; u8 m1_r(offs_t offset); void cio_dtrb_w(int state); u8 joy_ctrl_r(int num); @@ -139,6 +141,7 @@ protected: required_device m_maincpu; required_device_array m_isa; + memory_view m_isa_io_view; private: enum accel_state : u8 @@ -1396,8 +1399,19 @@ void sprinter_state::init_taps() }); } +void sprinter_state::map_isa_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0xffff).view(m_isa_io_view); + subdevice("zxbus")->set_io_space(m_isa_io_view[0], m_isa_io_view[0]); + m_isa_io_view.select(0); +} + void sprinter_state::machine_start() { + address_space &m_isa_io = m_isa[0]->space(isa8_device::AS_ISA_IO); + m_isa_io.install_device(0x0000, 0xffff, *this, &sprinter_state::map_isa_io); + m_isa[0]->space(isa8_device::AS_ISA_IO).unmap_value_high(); m_isa[1]->space(isa8_device::AS_ISA_IO).unmap_value_high(); @@ -1894,7 +1908,6 @@ void sprinter_state::sprinter(machine_config &config) ISA8(config, m_isa[0], X_SP / 5); m_isa[0]->set_custom_spaces(); zxbus_device &zxbus(ZXBUS(config, "zxbus", 0)); - //zxbus.set_iospace(m_isa[0], isa8_device::AS_ISA_IO); ZXBUS_SLOT(config, "zxbus2isa", 0, zxbus, zxbus_cards, nullptr); ISA8(config, m_isa[1], X_SP / 5);