diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 48bab075b1a62..4e8a7d4333b60 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1941,6 +1941,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 diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp index c634d85e6e4f3..71e133270b1ba 100644 --- a/src/devices/bus/isa/isa_cards.cpp +++ b/src/devices/bus/isa/isa_cards.cpp @@ -99,6 +99,7 @@ #include "finalchs.h" #include "hpblp.h" #include "opus100pm.h" +#include "zxbus_adapter.h" void pc_isa8_cards(device_slot_interface &device) @@ -160,6 +161,7 @@ void pc_isa8_cards(device_slot_interface &device) device.option_add("3xtwin", ISA8_3XTWIN); device.option_add("opus108pm", ISA8_OPUS108PM); device.option_add("ibm_speech", ISA8_IBM_SPEECH); + device.option_add("zxbus_adapter", ISA8_ZXBUS); } void pc_isa16_cards(device_slot_interface &device) diff --git a/src/devices/bus/isa/zxbus_adapter.cpp b/src/devices/bus/isa/zxbus_adapter.cpp new file mode 100644 index 0000000000000..cadefe9a156bf --- /dev/null +++ b/src/devices/bus/isa/zxbus_adapter.cpp @@ -0,0 +1,37 @@ +// 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::remap(int space_id, offs_t start, offs_t end) +{ + if (space_id == AS_IO) + { + m_isa->space(isa8_device::AS_ISA_IO).install_view(0x0000, 0xffff, m_isa_io_view); + } +} + +void zxbus_adapter_device::device_start() +{ + set_isa_device(); + remap(AS_IO, 0, 0xffff); + + 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); +} diff --git a/src/devices/bus/isa/zxbus_adapter.h b/src/devices/bus/isa/zxbus_adapter.h new file mode 100644 index 0000000000000..75eac079994ee --- /dev/null +++ b/src/devices/bus/isa/zxbus_adapter.h @@ -0,0 +1,28 @@ +// 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/bus.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; + virtual void remap(int space_id, offs_t start, offs_t end) override ATTR_COLD; + +private: + memory_view m_isa_io_view; + required_device m_zxbus; + +}; + +DECLARE_DEVICE_TYPE(ISA8_ZXBUS, zxbus_adapter_device) + +#endif // MAME_BUS_ISA_ZXBUS_ADAPTER_H diff --git a/src/devices/bus/spectrum/zxbus/bus.cpp b/src/devices/bus/spectrum/zxbus/bus.cpp index 3a34319b39c74..0dd47039458c4 100644 --- a/src/devices/bus/spectrum/zxbus/bus.cpp +++ b/src/devices/bus/spectrum/zxbus/bus.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/bus.h b/src/devices/bus/spectrum/zxbus/bus.h index 9a198490496e8..1af694f7e4412 100644 --- a/src/devices/bus/spectrum/zxbus/bus.h +++ b/src/devices/bus/spectrum/zxbus/bus.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 @@ class zxbus_device : public device_t 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/devices/bus/spectrum/zxbus/nemoide.cpp b/src/devices/bus/spectrum/zxbus/nemoide.cpp index 75c83bc31fe78..4aef90df5540f 100644 --- a/src/devices/bus/spectrum/zxbus/nemoide.cpp +++ b/src/devices/bus/spectrum/zxbus/nemoide.cpp @@ -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); @@ -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/zxbus/neogs.cpp b/src/devices/bus/spectrum/zxbus/neogs.cpp index 2848523a32867..f77d5071a6202 100644 --- a/src/devices/bus/spectrum/zxbus/neogs.cpp +++ b/src/devices/bus/spectrum/zxbus/neogs.cpp @@ -85,6 +85,8 @@ 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; @@ -92,8 +94,6 @@ class neogs_device : public device_t, public device_zxbus_card_interface 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; @@ -437,7 +437,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)); @@ -465,8 +465,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/zxbus/smuc.cpp b/src/devices/bus/spectrum/zxbus/smuc.cpp index d2ac18278a449..f44cb7a6106d4 100644 --- a/src/devices/bus/spectrum/zxbus/smuc.cpp +++ b/src/devices/bus/spectrum/zxbus/smuc.cpp @@ -25,7 +25,7 @@ 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; @@ -33,8 +33,6 @@ class smuc_device : public device_t, public device_zxbus_card_interface 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/mame/sinclair/beta_m.cpp b/src/mame/sinclair/beta_m.cpp index 05c3bda085d04..31df2aec398e5 100644 --- a/src/mame/sinclair/beta_m.cpp +++ b/src/mame/sinclair/beta_m.cpp @@ -20,6 +20,26 @@ #include "formats/trd_dsk.h" +namespace { + +void floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add_pc_formats(); + fr.add(FLOPPY_TRD_FORMAT); +} + +void beta_disk_floppies(device_slot_interface &device) +{ + device.option_add("525hd", FLOPPY_525_HD); + device.option_add("525qd", FLOPPY_525_QD); + device.option_add("35hd", FLOPPY_35_HD); + device.option_add("35dd", FLOPPY_35_DD); +} + +} // anonymous namespace + + /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ @@ -205,21 +225,6 @@ void beta_disk_device::motors_control() } } -void beta_disk_device::floppy_formats(format_registration &fr) -{ - fr.add_mfm_containers(); - fr.add_pc_formats(); - fr.add(FLOPPY_TRD_FORMAT); -} - -static void beta_disk_floppies(device_slot_interface &device) -{ - device.option_add("525hd", FLOPPY_525_HD); - device.option_add("525qd", FLOPPY_525_QD); - device.option_add("35hd", FLOPPY_35_HD); - device.option_add("35dd", FLOPPY_35_DD); -} - ROM_START( beta_disk ) ROM_REGION( 0x60000, "beta", 0 ) @@ -312,7 +317,7 @@ void beta_disk_device::device_add_mconfig(machine_config &config) KR1818VG93(config, m_wd179x, 8_MHz_XTAL / 8); m_wd179x->hld_wr_callback().set(FUNC(beta_disk_device::fdc_hld_w)); for (auto &floppy : m_floppy) - FLOPPY_CONNECTOR(config, floppy, beta_disk_floppies, "525qd", beta_disk_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, floppy, beta_disk_floppies, "525qd", floppy_formats).enable_sound(true); } //------------------------------------------------- diff --git a/src/mame/sinclair/beta_m.h b/src/mame/sinclair/beta_m.h index 042e62b374378..1db7e615cf7b5 100644 --- a/src/mame/sinclair/beta_m.h +++ b/src/mame/sinclair/beta_m.h @@ -59,8 +59,6 @@ class beta_disk_device : public device_t void motors_control(); u8 m_control; bool m_motor_active; - - static void floppy_formats(format_registration &fr); }; DECLARE_DEVICE_TYPE(BETA_DISK, beta_disk_device) diff --git a/src/mame/sinclair/pentevo.cpp b/src/mame/sinclair/pentevo.cpp index 6ce805d2f87dd..ffeb2d4c6ad64 100644 --- a/src/mame/sinclair/pentevo.cpp +++ b/src/mame/sinclair/pentevo.cpp @@ -151,7 +151,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 @@ -161,7 +161,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 @@ -595,28 +595,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() @@ -744,8 +748,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 7c0fd92086848..d5e45b792035a 100644 --- a/src/mame/sinclair/scorpion.cpp +++ b/src/mame/sinclair/scorpion.cpp @@ -238,10 +238,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() @@ -324,10 +321,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 @@ -338,23 +332,28 @@ void scorpion_state::scorpion_io(address_map &map) map(0xe021, 0xe021).mirror(0x1fdc) // FFFD | 111xxxxxxx1xxx01 .rw(m_ay_slot, FUNC(ay_slot_device::data_r), FUNC(ay_slot_device::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) @@ -503,9 +502,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 594736f71601e..d5c87773e9d80 100644 --- a/src/mame/sinclair/specnext.cpp +++ b/src/mame/sinclair/specnext.cpp @@ -68,6 +68,7 @@ class specnext_state : public spectrum_128_state 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") @@ -288,6 +289,7 @@ class specnext_state : public spectrum_128_state void port_e7_reg_w(u8 data); memory_access<8, 0, 0, ENDIANNESS_LITTLE>::specific m_next_regs; + 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; @@ -2769,6 +2771,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) @@ -3515,8 +3521,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 eca9b88e91338..8e463fa404ae1 100644 --- a/src/mame/sinclair/sprinter.cpp +++ b/src/mame/sinclair/sprinter.cpp @@ -94,7 +94,7 @@ class sprinter_state : public spectrum_128_state sprinter_state(const machine_config &mconfig, device_type type, const char *tag) : spectrum_128_state(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_isa(*this, "isa%u", 0U) + , m_isa(*this, "isa8%u", 0U) , m_irqs(*this, "irqs") , m_rtc(*this, "rtc") , m_ata(*this, "ata%u", 1U) @@ -1948,13 +1948,11 @@ 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_SLOT(config, "isa0", 0, m_isa[0], pc_isa8_cards, "zxbus_adapter", false); ISA8(config, m_isa[1], X_SP / 5); m_isa[1]->set_custom_spaces(); - ISA8_SLOT(config, "isa8", 0, m_isa[1], pc_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa1", 0, m_isa[1], pc_isa8_cards, nullptr, false); m_screen->set_raw(X_SP / 3, SPRINT_WIDTH, SPRINT_HEIGHT, { 0, SPRINT_XVIS - 1, 0, SPRINT_YVIS - 1 }); m_screen->set_screen_update(FUNC(sprinter_state::screen_update)); diff --git a/src/mame/sinclair/tsconf.cpp b/src/mame/sinclair/tsconf.cpp index 19c07b7b34af8..402ff17e7a136 100644 --- a/src/mame/sinclair/tsconf.cpp +++ b/src/mame/sinclair/tsconf.cpp @@ -27,9 +27,6 @@ TsConf: https://github.com/tslabs/zx-evo/blob/master/pentevo/docs/TSconf/tsconf_ FAQ-RUS: https://forum.tslabs.info/viewtopic.php?f=35&t=157 ROM: https://github.com/tslabs/zx-evo/blob/master/pentevo/rom/bin/ts-bios.rom (validated on: 2021-12-14) -TODO: -- VDos - ****************************************************************************/ #include "emu.h" @@ -83,12 +80,9 @@ void tsconf_state::tsconf_io(address_map &map) { map.unmap_value_high(); map(0x0000, 0x0000).mirror(0x7ffd).w(FUNC(tsconf_state::tsconf_port_7ffd_w)); - map(0x001f, 0x001f).mirror(0xff00).r(FUNC(tsconf_state::tsconf_port_xx1f_r)).w(m_beta, FUNC(beta_disk_device::command_w)); - map(0x003f, 0x003f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::track_r), FUNC(beta_disk_device::track_w)); + map(0x001f, 0x001f).mirror(0xff00).r(FUNC(tsconf_state::tsconf_port_xx1f_r)); map(0x0057, 0x0057).mirror(0xff00).rw(FUNC(tsconf_state::tsconf_port_57_zctr_r), FUNC(tsconf_state::tsconf_port_57_zctr_w)); // spi config map(0x0077, 0x0077).mirror(0xff00).rw(FUNC(tsconf_state::tsconf_port_77_zctr_r), FUNC(tsconf_state::tsconf_port_77_zctr_w)); // spi data - map(0x005f, 0x005f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::sector_r), FUNC(beta_disk_device::sector_w)); - map(0x007f, 0x007f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w)); // RS-232 map(0x00ef, 0x00ef).mirror(0xff00).rw(m_uart, FUNC(tsconf_rs232_device::dr_r), FUNC(tsconf_rs232_device::dr_w)); // 0x00ef..0xbfef @@ -98,7 +92,6 @@ void tsconf_state::tsconf_io(address_map &map) .lw8(NAME([this](offs_t offset, u8 data) { m_uart->reg_w(offset >> 8, data); })); map(0x00fe, 0x00fe).select(0xff00).rw(FUNC(tsconf_state::spectrum_ula_r), FUNC(tsconf_state::tsconf_ula_w)); - map(0x00ff, 0x00ff).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w)); map(0x00af, 0x00af).select(0xff00).rw(FUNC(tsconf_state::tsconf_port_xxaf_r), FUNC(tsconf_state::tsconf_port_xxaf_w)); 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(); })); @@ -108,6 +101,13 @@ void tsconf_state::tsconf_io(address_map &map) map(0x00fb, 0x00fb).mirror(0xff00).w(m_dac, FUNC(dac_byte_interface::data_w)); map(0x80fd, 0x80fd).mirror(0x3f00).w("ay_slot", FUNC(ay_slot_device::data_w)); map(0xc0fd, 0xc0fd).mirror(0x3f00).rw("ay_slot", FUNC(ay_slot_device::data_r), FUNC(ay_slot_device::address_w)); + + map(0x0000, 0xffff).view(m_io_shadow_view); + m_io_shadow_view[0]; // !Shadow + + // IO: Shadow + m_io_shadow_view[1](0x0000, 0xffff).m(m_beta, FUNC(tsconf_beta_device::tsconf_beta_io)); + subdevice("zxbus")->set_io_space(m_io_shadow_view[0], m_io_shadow_view[1]); } void tsconf_state::tsconf_switch(address_map &map) @@ -178,6 +178,7 @@ void tsconf_state::machine_start() m_bank_ram[0]->configure_entries(0, m_ram->size() / 0x4000, m_ram->pointer(), 0x4000); save_item(NAME(m_int_mask)); + save_item(NAME(m_update_on_m1)); save_item(NAME(m_regs)); save_item(NAME(m_cache_line_addr)); save_item(NAME(m_zctl_di)); @@ -188,11 +189,14 @@ void tsconf_state::machine_start() void tsconf_state::machine_reset() { + m_update_on_m1 = false; + m_frame_irq_timer->adjust(attotime::never); m_scanline_irq_timer->adjust(attotime::never); m_int_mask = 0; m_bank0_rom.select(0); + update_io(0); m_cache_line_addr = -1; m_glukrs->disable(); @@ -220,8 +224,7 @@ void tsconf_state::machine_reset() m_regs[INT_MASK] = 0x01; // xxxxx001 m_regs[CACHE_CONFIG] &= 0xf0; // xxxx0000 - if (m_beta->started()) - m_beta->enable(); + m_beta->fddvirt_w(m_regs[FDD_VIRT] & 0x0f); m_zctl_cs = 1; m_zctl_di = 0xff; @@ -271,9 +274,9 @@ void tsconf_state::tsconf(machine_config &config) config.device_remove("palette"); Z80(config.replace(), m_maincpu, 14_MHz_XTAL / 4); - m_maincpu->set_addrmap(AS_PROGRAM, &tsconf_state::tsconf_mem); - m_maincpu->set_addrmap(AS_IO, &tsconf_state::tsconf_io); - m_maincpu->set_addrmap(AS_OPCODES, &tsconf_state::tsconf_switch); + m_maincpu->set_memory_map(&tsconf_state::tsconf_mem); + m_maincpu->set_io_map(&tsconf_state::tsconf_io); + m_maincpu->set_m1_map(&tsconf_state::tsconf_switch); m_maincpu->set_irq_acknowledge_callback(FUNC(tsconf_state::irq_vector)); m_maincpu->set_vblank_int("screen", FUNC(tsconf_state::tsconf_vblank_interrupt)); @@ -290,9 +293,8 @@ void tsconf_state::tsconf(machine_config &config) rs232.cts_handler().set(m_uart, FUNC(tsconf_rs232_device::cts_w)); 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").set_default_value(0x00); // must be random but 0x00 behaves better than 0xff in tested software @@ -306,7 +308,10 @@ void tsconf_state::tsconf(machine_config &config) m_dma->out_sfile_callback().set(FUNC(tsconf_state::sfile_write16)); m_dma->on_ready_callback().set(FUNC(tsconf_state::dma_ready)); - BETA_DISK(config, m_beta, 0); + TSCONF_BETA(config, m_beta, 0); + m_beta->out_dos_callback().set(FUNC(tsconf_state::update_io)); + m_beta->out_vdos_m1_callback().set([this](int state) { m_update_on_m1 = true; }); + SPEAKER(config.replace(), "speakers", 2).front(); AY_SLOT(config.replace(), "ay_slot", 14_MHz_XTAL / 8, default_ay_slot_devices, "ay_ym2149") diff --git a/src/mame/sinclair/tsconf.h b/src/mame/sinclair/tsconf.h index c9b17644abd63..c99c764fbb2fd 100644 --- a/src/mame/sinclair/tsconf.h +++ b/src/mame/sinclair/tsconf.h @@ -13,10 +13,10 @@ #include "spec128.h" #include "glukrs.h" +#include "tsconf_beta.h" #include "tsconf_rs232.h" #include "tsconfdma.h" -#include "beta_m.h" #include "machine/pckeybrd.h" #include "machine/spi_sdcard.h" #include "sound/dac.h" @@ -28,12 +28,13 @@ class tsconf_state : public spectrum_128_state public: tsconf_state(const machine_config &mconfig, device_type type, const char *tag) : spectrum_128_state(mconfig, type, tag) + , m_io_shadow_view(*this, "io_shadow_view") , m_bank0_rom(*this, "bank0_rom") , m_tiles_raw(*this, "tiles%u_raw", 0U, 64U * 64 * 8 * 8, ENDIANNESS_LITTLE) , m_sprites_raw(*this, "sprites_raw", 64U * 64 * 8 * 8, ENDIANNESS_LITTLE) , m_keyboard(*this, "pc_keyboard") , m_io_mouse(*this, "mouse_input%u", 1U) - , m_beta(*this, BETA_DISK_TAG) + , m_beta(*this, "beta") , m_dma(*this, "dma") , m_sdcard(*this, "sdcard") , m_uart(*this, "uart") @@ -156,6 +157,7 @@ class tsconf_state : public spectrum_128_state INTERRUPT_GEN_MEMBER(tsconf_vblank_interrupt); IRQ_CALLBACK_MEMBER(irq_vector); u8 m_int_mask; + bool m_update_on_m1; DECLARE_VIDEO_START(tsconf); TILE_GET_INFO_MEMBER(get_tile_info_txt); @@ -188,6 +190,7 @@ class tsconf_state : public spectrum_128_state void tsconf_port_f7_w(offs_t offset, u8 data); void tsconf_update_bank0(); + void update_io(int dos); u8 beta_neutral_r(offs_t offset); u8 beta_enable_r(offs_t offset); u8 beta_disable_r(offs_t offset); @@ -212,6 +215,7 @@ class tsconf_state : public spectrum_128_state std::map m_scanline_delayed_regs_update; u8 m_regs[0x100]; + memory_view m_io_shadow_view; memory_view m_bank0_rom; memory_share_array_creator m_tiles_raw; memory_share_creator m_sprites_raw; @@ -220,7 +224,7 @@ class tsconf_state : public spectrum_128_state required_device m_keyboard; required_ioport_array<3> m_io_mouse; - required_device m_beta; + required_device m_beta; required_device m_dma; required_device m_sdcard; required_device m_uart; diff --git a/src/mame/sinclair/tsconf_beta.cpp b/src/mame/sinclair/tsconf_beta.cpp new file mode 100644 index 0000000000000..1d836225cbbc8 --- /dev/null +++ b/src/mame/sinclair/tsconf_beta.cpp @@ -0,0 +1,275 @@ +// license:BSD-3-Clause +// copyright-holders:Andrei I. Holub +/********************************************************************** + Beta TR-DOS with virtual drives +**********************************************************************/ + +#include "emu.h" +#include "tsconf_beta.h" + +#include "formats/trd_dsk.h" + + +namespace { + +void floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add_pc_formats(); + fr.add(FLOPPY_TRD_FORMAT); +} + +void beta_disk_floppies(device_slot_interface &device) +{ + device.option_add("525hd", FLOPPY_525_HD); + device.option_add("525qd", FLOPPY_525_QD); + device.option_add("35hd", FLOPPY_35_HD); + device.option_add("35dd", FLOPPY_35_DD); +} + +} // anonymous namespace + + +// device type definition +DEFINE_DEVICE_TYPE(TSCONF_BETA, tsconf_beta_device, "tsconf_beta", "Virtual TR-DOS") + +void tsconf_beta_device::tsconf_beta_io(address_map &map) +{ + map(0x001f, 0x001f).mirror(0xff00).rw(FUNC(tsconf_beta_device::status_r), FUNC(tsconf_beta_device::command_w)); + map(0x003f, 0x003f).mirror(0xff00).rw(FUNC(tsconf_beta_device::track_r), FUNC(tsconf_beta_device::track_w)); + map(0x005f, 0x005f).mirror(0xff00).rw(FUNC(tsconf_beta_device::sector_r), FUNC(tsconf_beta_device::sector_w)); + map(0x007f, 0x007f).mirror(0xff00).rw(FUNC(tsconf_beta_device::data_r), FUNC(tsconf_beta_device::data_w)); + map(0x009f, 0x009f).select(0xff60).rw(FUNC(tsconf_beta_device::state_r), FUNC(tsconf_beta_device::param_w)); +} + + +tsconf_beta_device::tsconf_beta_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, TSCONF_BETA, tag, owner, clock) + , m_out_dos_cb(*this) + , m_out_vdos_m1_cb(*this) + , m_wd179x(*this, "wd179x") + , m_floppy(*this, "wd179x:%u", 0U) + , m_floppy_led(*this, "fdd%u_led", 0U) + , m_control(0) + , m_motor_active(false) +{ +} + +bool tsconf_beta_device::pre_vg_in_check() +{ + if (m_dos) + { + if (m_vdos) + { + m_vdos = false; + m_out_dos_cb(dos_io_r()); + return false; + } + else if ((1 << (m_control & 3)) & m_fddvirt) + { + m_out_vdos_m1_cb(1); + return false; + } + } + + return true; +} + +u8 tsconf_beta_device::status_r() +{ + return pre_vg_in_check() ? m_wd179x->status_r() : 0xff; +} + +u8 tsconf_beta_device::track_r() +{ + return pre_vg_in_check() ? m_wd179x->track_r() : 0xff; +} + +u8 tsconf_beta_device::sector_r() +{ + return pre_vg_in_check() ? m_wd179x->sector_r() : 0xff; +} + +u8 tsconf_beta_device::data_r() +{ + return pre_vg_in_check() ? m_wd179x->data_r() : 0xff; +} + +u8 tsconf_beta_device::state_r() +{ + if (pre_vg_in_check()) + { + u8 result = 0x3f; // actually open bus + result |= m_wd179x->drq_r() ? 0x40 : 0; + result |= m_wd179x->intrq_r() ? 0x80 : 0; + return result; + } + else + { + return 0xff; + } +} + +bool tsconf_beta_device::pre_vg_out_check(bool is_port_match = true) +{ + if (m_dos) + { + if (m_vdos) + { + if (is_port_match) + { + m_vdos = false; + m_out_dos_cb(dos_io_r()); + return false; + } + } + else if ((1 << (m_control & 3)) & m_fddvirt) + { + m_vdos = true; + m_out_dos_cb(dos_io_r()); + return false; + } + } + + return true; +} + +void tsconf_beta_device::param_w(offs_t offset, u8 data) +{ + if (pre_vg_out_check((offset & 0x60) != 0x60)) // not through 0xff + { + m_control = data; + floppy_image_device* floppy = m_floppy[data & 3]->get_device(); + m_wd179x->set_floppy(floppy); + + if (!m_vdos) + { + floppy->ss_w(BIT(data, 4) ? 0 : 1); + m_wd179x->dden_w(BIT(data, 6)); + m_wd179x->mr_w(BIT(data, 2)); + + m_wd179x->hlt_w(BIT(data, 3)); + + motors_control(); + } + } +} + +void tsconf_beta_device::command_w(u8 data) +{ + if (pre_vg_out_check()) + { + m_wd179x->cmd_w(data); + } +} + +void tsconf_beta_device::track_w(u8 data) +{ + if (pre_vg_out_check()) + { + m_wd179x->track_w(data); + } +} + +void tsconf_beta_device::sector_w(u8 data) +{ + if (pre_vg_out_check()) + { + m_wd179x->sector_w(data); + } +} + +void tsconf_beta_device::data_w(u8 data) +{ + if (pre_vg_out_check()) + { + m_wd179x->data_w(data); + } +} + +void tsconf_beta_device::turbo_w(int state) +{ + m_wd179x->set_clock_scale(1 << (state & 1)); +} + +void tsconf_beta_device::on_m1_w() +{ + m_vdos = true; + m_out_dos_cb(dos_io_r()); +} + +void tsconf_beta_device::enable_w(bool state) +{ + if ((state && !m_dos) || (!state && m_dos && !m_vdos)) + { + m_dos = state; + m_out_dos_cb(dos_io_r()); + } +} + +void tsconf_beta_device::fddvirt_w(u8 fddvirt) +{ + m_fddvirt = fddvirt & 0x0f; +} + +void tsconf_beta_device::io_forced_w(bool io_forced) +{ + m_io_forced = io_forced; + m_out_dos_cb(dos_io_r()); +} + +void tsconf_beta_device::fdc_hld_w(int state) +{ + m_wd179x->set_force_ready(state); // HLD connected to RDY pin + m_motor_active = state; + motors_control(); +} + +void tsconf_beta_device::motors_control() +{ + for (int i = 0; i < 4; i++) + { + if (m_motor_active && (m_control & 3) == i) + { + m_floppy[i]->get_device()->mon_w(CLEAR_LINE); + m_floppy_led[i] = 1; + } + else + { + m_floppy[i]->get_device()->mon_w(ASSERT_LINE); + m_floppy_led[i] = 0; + } + } +} + +void tsconf_beta_device::device_start() +{ + save_item(NAME(m_control)); + save_item(NAME(m_motor_active)); + save_item(NAME(m_dos)); + save_item(NAME(m_vdos)); + save_item(NAME(m_io_forced)); + save_item(NAME(m_fddvirt)); + + m_floppy_led.resolve(); +} + +void tsconf_beta_device::device_reset() +{ + m_control = 0; + for (int i = 0; i < m_floppy_led.size(); i++) + m_floppy_led[i] = 0; + + m_dos = false; + m_vdos = false; + m_io_forced = false; + m_fddvirt = 0; +} + +void tsconf_beta_device::device_add_mconfig(machine_config &config) +{ + KR1818VG93(config, m_wd179x, 8_MHz_XTAL / 8); + m_wd179x->hld_wr_callback().set(FUNC(tsconf_beta_device::fdc_hld_w)); + for (auto &floppy : m_floppy) + FLOPPY_CONNECTOR(config, floppy, beta_disk_floppies, "525qd", floppy_formats).enable_sound(true); +} diff --git a/src/mame/sinclair/tsconf_beta.h b/src/mame/sinclair/tsconf_beta.h new file mode 100644 index 0000000000000..c7eac15cfd4f9 --- /dev/null +++ b/src/mame/sinclair/tsconf_beta.h @@ -0,0 +1,72 @@ +// license:BSD-3-Clause +// copyright-holders:Andrei I. Holub +#ifndef MAME_SINCLAIR_TSCONF_BETA_H +#define MAME_SINCLAIR_TSCONF_BETA_H + +#pragma once + +#include "imagedev/floppy.h" +#include "machine/wd_fdc.h" + + +class tsconf_beta_device : public device_t +{ +public: + tsconf_beta_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + void tsconf_beta_io(address_map &map) ATTR_COLD; + + auto out_dos_callback() { return m_out_dos_cb.bind(); } + auto out_vdos_m1_callback() { return m_out_vdos_m1_cb.bind(); } + + u8 status_r(); + u8 track_r(); + u8 sector_r(); + u8 data_r(); + u8 state_r(); + + void param_w(offs_t offset, u8 data); + void command_w(u8 data); + void track_w(u8 data); + void sector_w(u8 data); + void data_w(u8 data); + void turbo_w(int state); + + void on_m1_w(); + bool dos_r() { return m_dos; } + bool vdos_r() { return m_vdos; } + bool dos_io_r() { return m_dos || m_io_forced; } + void enable_w(bool state); + void fddvirt_w(u8 fddvirt); + void io_forced_w(bool io_forced); + +protected: + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + devcb_write_line m_out_dos_cb; + devcb_write_line m_out_vdos_m1_cb; + +private: + required_device m_wd179x; + required_device_array m_floppy; + output_finder<4> m_floppy_led; + void fdc_hld_w(int state); + void motors_control(); + u8 m_control; + bool m_motor_active; + + bool m_dos; + bool m_vdos; + bool m_io_forced; + u8 m_fddvirt; + + bool pre_vg_in_check(); + bool pre_vg_out_check(bool is_port_match); +}; + + +DECLARE_DEVICE_TYPE(TSCONF_BETA, tsconf_beta_device) + +#endif // MAME_SINCLAIR_TSCONF_BETA_H diff --git a/src/mame/sinclair/tsconf_m.cpp b/src/mame/sinclair/tsconf_m.cpp index 1d4a5fac35fbc..5b2398ea1bc8a 100644 --- a/src/mame/sinclair/tsconf_m.cpp +++ b/src/mame/sinclair/tsconf_m.cpp @@ -55,13 +55,13 @@ void tsconf_state::tsconf_update_bank0() if (!NW0_MAP) { /* ROM: 0-SYS, 1-DOS, 2-128, 3-48 */ - page0 = m_beta->started() && m_beta->is_active() ? ROM128 : (0x02 | ROM128); - page0 |= (m_regs[PAGE0] & 0xfc); + page0 &= 0xfc; + page0 |= m_beta->dos_r() ? ROM128 : (0x02 | ROM128); } - if (W0_RAM) + if (W0_RAM || m_beta->vdos_r()) { - m_bank_ram[0]->set_entry(page0); + m_bank_ram[0]->set_entry(m_beta->vdos_r() ? 0xff : page0); m_bank0_rom.disable(); } else @@ -71,6 +71,12 @@ void tsconf_state::tsconf_update_bank0() } } +void tsconf_state::update_io(int dos) +{ + m_io_shadow_view.select(dos ? 1 : 0); + tsconf_update_bank0(); +} + void tsconf_state::tsconf_update_video_mode() { rectangle visarea = screen_area[3]; @@ -399,8 +405,10 @@ void tsconf_state::ram_bank_write(u8 bank, offs_t offset, u8 data) } } - if (bank > 0 || (W0_WE && W0_RAM)) + if (bank > 0 || W0_WE) ram_page_write(m_regs[PAGE0 + bank], offset, data); + else if (!bank && m_beta->vdos_r()) + ram_page_write(0xff, offset, data); } static int tiles_offset_to_raw(int t_offset) @@ -496,9 +504,7 @@ void tsconf_state::sfile_write16(offs_t offset, u16 data) } u8 tsconf_state::tsconf_port_xx1f_r(offs_t offset) { - return m_beta->started() && m_beta->is_active() - ? m_beta->status_r() - : 0x00; // TODO kempston read + return 0x00; // TODO kempston read } void tsconf_state::tsconf_port_7ffd_w(u8 data) @@ -719,12 +725,15 @@ void tsconf_state::tsconf_port_xxaf_w(offs_t port, u8 data) update_frame_timer(); break; + case FDD_VIRT: + m_beta->io_forced_w(BIT(data, 7)); + m_beta->fddvirt_w(data & 0x0f); + break; + case FMAPS: case TS_CONFIG: case INT_MASK: case CACHE_CONFIG: - // TODO - case FDD_VIRT: break; default: @@ -897,7 +906,7 @@ INTERRUPT_GEN_MEMBER(tsconf_state::tsconf_vblank_interrupt) void tsconf_state::dma_ready(int line) { - if (BIT(m_regs[INT_MASK], 2)) + if (BIT(m_regs[INT_MASK], 2) && !(m_beta->vdos_r() || m_update_on_m1)) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); m_int_mask |= 4; @@ -906,7 +915,7 @@ void tsconf_state::dma_ready(int line) TIMER_CALLBACK_MEMBER(tsconf_state::irq_frame) { - if (BIT(m_regs[INT_MASK], 0)) + if (BIT(m_regs[INT_MASK], 0) && !(m_beta->vdos_r() || m_update_on_m1)) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); m_irq_off_timer->adjust(attotime::from_ticks(32, m_maincpu->unscaled_clock())); @@ -916,7 +925,7 @@ TIMER_CALLBACK_MEMBER(tsconf_state::irq_frame) TIMER_CALLBACK_MEMBER(tsconf_state::irq_scanline) { - if (BIT(m_regs[INT_MASK], 1)) + if (BIT(m_regs[INT_MASK], 1) && !(m_beta->vdos_r() || m_update_on_m1)) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); m_int_mask |= 2; @@ -975,6 +984,11 @@ TIMER_CALLBACK_MEMBER(tsconf_state::irq_scanline) u8 tsconf_state::beta_neutral_r(offs_t offset) { + if (!machine().side_effects_disabled() && m_update_on_m1) + { + m_update_on_m1 = false; + m_beta->on_m1_w(); + } return m_program.read_byte(offset); } @@ -982,13 +996,14 @@ u8 tsconf_state::beta_enable_r(offs_t offset) { if (!machine().side_effects_disabled()) { - if (!W0_RAM && m_bank_rom[0]->entry() == 3) + if (m_update_on_m1) { - if (m_beta->started() && !m_beta->is_active()) - { - m_beta->enable(); - tsconf_update_bank0(); - } + m_update_on_m1 = false; + m_beta->on_m1_w(); + } + if (ROM128 && !NW0_MAP) + { + m_beta->enable_w(1); } } return m_program.read_byte(offset + 0x3d00); @@ -998,11 +1013,12 @@ u8 tsconf_state::beta_disable_r(offs_t offset) { if (!machine().side_effects_disabled()) { - if (m_beta->started() && m_beta->is_active()) + if (m_update_on_m1) { - m_beta->disable(); - tsconf_update_bank0(); + m_update_on_m1 = false; + m_beta->on_m1_w(); } + m_beta->enable_w(0); } return m_program.read_byte(offset + 0x4000); }