diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 1a8a700e78bc8..b902c086eaa3e 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5002,10 +5002,14 @@ end if (BUSES["QBUS"]~=null) then files { + MAME_DIR .. "src/devices/bus/qbus/bk_altpro.cpp", + MAME_DIR .. "src/devices/bus/qbus/bk_altpro.h", MAME_DIR .. "src/devices/bus/qbus/bk_irps.cpp", MAME_DIR .. "src/devices/bus/qbus/bk_irps.h", MAME_DIR .. "src/devices/bus/qbus/bk_kmd.cpp", MAME_DIR .. "src/devices/bus/qbus/bk_kmd.h", + MAME_DIR .. "src/devices/bus/qbus/bk_samara.cpp", + MAME_DIR .. "src/devices/bus/qbus/bk_samara.h", MAME_DIR .. "src/devices/bus/qbus/dsd4432.cpp", MAME_DIR .. "src/devices/bus/qbus/dsd4432.h", MAME_DIR .. "src/devices/bus/qbus/dvk_dwhle.cpp", diff --git a/src/devices/bus/qbus/bk_altpro.cpp b/src/devices/bus/qbus/bk_altpro.cpp new file mode 100644 index 0000000000000..66a2a1bf96548 --- /dev/null +++ b/src/devices/bus/qbus/bk_altpro.cpp @@ -0,0 +1,194 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK "Altpro" combo floppy/ATA controller series + + CSRs 177130, 177740. No vector. + + Compatible with standard floppy controller. ATA port has software + support in ANDOS and MK-DOS. + + Not implemented: memory expansion (SMK models). + +***************************************************************************/ + +#include "emu.h" +#include "bk_altpro.h" + +#include "bus/ata/ataintf.h" +#include "cpu/t11/t11.h" +#include "formats/bk0010_dsk.h" +#include "imagedev/harddriv.h" +#include "machine/1801vp128.h" + + +namespace { + +ROM_START(bk_altpro) + ROM_REGION(0x1000, "maincpu", 0) + ROM_DEFAULT_BIOS("smk00") + ROM_SYSTEM_BIOS(0, "smk00", "SMK00 1.41") + ROMX_LOAD("disk_smk00_v1.41.rom", 0, 0x1000, CRC(cf41889f) SHA1(d34480e35a400316a1f0b6a9d2f3208f2ff2a6de), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "smk64", "SMK64 2.05") + ROMX_LOAD("disk_smk64_v2.05.rom", 0, 0x1000, CRC(f5ac331d) SHA1(f14f54eb7a1f3327ceb7d6a30c484f6a0d5226ad), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "smk512", "SMK512 2.05") + ROMX_LOAD("disk_smk512_v2.05.rom", 0, 0x1000, CRC(6ca562a7) SHA1(4796f373e343460b2c9acf769fd4ddfa46e6e90f), ROM_BIOS(2)) +ROM_END + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> bk_altpro_device + +class bk_altpro_device : public device_t, + public device_qbus_card_interface +{ +public: + // construction/destruction + bk_altpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + uint16_t ata_r(offs_t offset, uint16_t mem_mask = ~0); + void ata_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + +protected: + // device-level overrides + 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; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + + required_device m_fdc; + required_device m_ata; + +private: + static void floppy_formats(format_registration &fr); + + bool odd; + + std::unique_ptr m_ram; +}; + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bk_altpro_device - constructor +//------------------------------------------------- + +bk_altpro_device::bk_altpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BK_ALTPRO, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , m_fdc(*this, "fdc") + , m_ata(*this, "ata") +{ +} + +void bk_altpro_device::floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add(FLOPPY_BK0010_FORMAT); +} + +static void bk_floppies(device_slot_interface &device) +{ + device.option_add("525qd", FLOPPY_525_QD); +} + +const tiny_rom_entry *bk_altpro_device::device_rom_region() const +{ + return ROM_NAME(bk_altpro); +} + +void bk_altpro_device::device_add_mconfig(machine_config &config) +{ + K1801VP128(config, m_fdc, XTAL(4'000'000)); + m_fdc->ds_in_callback().set([] (uint16_t data) { + switch (data & 15) + { + case 1: return 0; + case 2: return 1; + default: return -1; + } + }); + FLOPPY_CONNECTOR(config, "fdc:0", bk_floppies, "525qd", bk_altpro_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", bk_floppies, "525qd", bk_altpro_device::floppy_formats); + + ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bk_altpro_device::device_start() +{ + m_ram = make_unique_clear(4096); + m_bus->install_device(0177130, 0177133, + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::read)), + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::write)) + ); + m_bus->program_space().install_readwrite_handler(0177740, 0177757, + emu::rw_delegate(*this, FUNC(bk_altpro_device::ata_r)), + emu::rw_delegate(*this, FUNC(bk_altpro_device::ata_w)), + 0, 0, t11_device::UNALIGNED_WORD + ); + m_bus->program_space().install_rom(0160000, 0167777, memregion(this->subtag("maincpu").c_str())->base()); + m_bus->program_space().unmap_write(0160000, 0167777); + m_bus->program_space().install_ram(0170000, 0176777, &m_ram[0]); +} + +void bk_altpro_device::device_reset() +{ + odd = false; +} + +uint16_t bk_altpro_device::ata_r(offs_t offset, uint16_t mem_mask) +{ + if (mem_mask == 0xff00) // unaligned access + { + odd = true; + return ((m_ata->cs1_r(7 - offset) << 8) ^ 0xffff); + } + else if (odd) + { + odd = false; + return 0; + } + else if (offset == 7) + return m_ata->cs0_r(7 - offset) ^ 0xffff; + else + return (m_ata->cs0_r(7 - offset) ^ 0xffff) & 0xff; +} + +void bk_altpro_device::ata_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + if (mem_mask == 0xff00) // unaligned access + { + odd = true; + m_ata->cs1_w(7 - offset, ((data >> 8) ^ 0xffff) & 0xff); + } + else if (odd) + { + odd = false; + return; + } + else if (offset == 7) + m_ata->cs0_w(7 - offset, (data ^ 0xffff)); + else + m_ata->cs0_w(7 - offset, (data ^ 0xffff) & 0xff); +} + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(BK_ALTPRO, device_qbus_card_interface, bk_altpro_device, "bk_altpro", "BK Altpro floppy/ATA") diff --git a/src/devices/bus/qbus/bk_altpro.h b/src/devices/bus/qbus/bk_altpro.h new file mode 100644 index 0000000000000..4a91cd058447b --- /dev/null +++ b/src/devices/bus/qbus/bk_altpro.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK "Altpro" combo floppy/ATA controller + +***************************************************************************/ + +#ifndef MAME_BUS_QBUS_BK_ALTPRO_H +#define MAME_BUS_QBUS_BK_ALTPRO_H + +#pragma once + +#include "qbus.h" + + +DECLARE_DEVICE_TYPE(BK_ALTPRO, device_qbus_card_interface) + +#endif diff --git a/src/devices/bus/qbus/bk_samara.cpp b/src/devices/bus/qbus/bk_samara.cpp new file mode 100644 index 0000000000000..75d813f53a5e2 --- /dev/null +++ b/src/devices/bus/qbus/bk_samara.cpp @@ -0,0 +1,173 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK "Samara" combo floppy/ATA controller + + CSRs 177130, 177620, 177640. No vector. + + Compatible with standard floppy controller. ATA port has software + support in CSI-DOS. + +***************************************************************************/ + +#include "emu.h" +#include "bk_samara.h" + +#include "bus/ata/ataintf.h" +#include "formats/bk0010_dsk.h" +#include "imagedev/harddriv.h" +#include "machine/1801vp128.h" + + +namespace { + +ROM_START(bk_samara) + ROM_REGION(0x1000, "maincpu", 0) + ROM_DEFAULT_BIOS("326") + ROM_SYSTEM_BIOS(0, "326", "mask 326 modded") + ROMX_LOAD("disk_samara_hdd+fis.rom", 0, 0x0ff4, CRC(3415a928) SHA1(abd1a48fbc1ec3a2bcb83e8d847dbce747453a1b), ROM_BIOS(0)) +ROM_END + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> bk_samara_device + +class bk_samara_device : public device_t, + public device_qbus_card_interface +{ +public: + // construction/destruction + bk_samara_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + uint16_t cs0_r(offs_t offset, uint16_t mem_mask = ~0); + uint16_t cs1_r(offs_t offset, uint16_t mem_mask = ~0); + void cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + + required_device m_fdc; + required_device m_ata; + +private: + static void floppy_formats(format_registration &fr); +}; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bk_samara_device - constructor +//------------------------------------------------- + +bk_samara_device::bk_samara_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BK_SAMARA, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , m_fdc(*this, "fdc") + , m_ata(*this, "ata") +{ +} + +void bk_samara_device::floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add(FLOPPY_BK0010_FORMAT); +} + +static void bk_floppies(device_slot_interface &device) +{ + device.option_add("525qd", FLOPPY_525_QD); +} + +const tiny_rom_entry *bk_samara_device::device_rom_region() const +{ + return ROM_NAME(bk_samara); +} + +void bk_samara_device::device_add_mconfig(machine_config &config) +{ + K1801VP128(config, m_fdc, XTAL(4'000'000)); + m_fdc->ds_in_callback().set([] (uint16_t data) { + switch (data & 15) + { + case 1: return 0; + case 2: return 1; + case 4: return 2; + case 8: return 3; + default: return -1; + } + }); + FLOPPY_CONNECTOR(config, "fdc:0", bk_floppies, "525qd", bk_samara_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", bk_floppies, "525qd", bk_samara_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:2", bk_floppies, "525qd", bk_samara_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:3", bk_floppies, "525qd", bk_samara_device::floppy_formats); + + ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bk_samara_device::device_start() +{ + m_bus->install_device(0177130, 0177133, + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::read)), + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::write)) + ); + m_bus->program_space().install_readwrite_handler(0177620, 0177623, + emu::rw_delegate(*this, FUNC(bk_samara_device::cs1_r)), + emu::rw_delegate(*this, FUNC(bk_samara_device::cs1_w)) + ); + m_bus->program_space().install_readwrite_handler(0177640, 0177657, + emu::rw_delegate(*this, FUNC(bk_samara_device::cs0_r)), + emu::rw_delegate(*this, FUNC(bk_samara_device::cs0_w)) + ); + m_bus->program_space().install_rom(0160000, 0167777, memregion(this->subtag("maincpu").c_str())->base()); + m_bus->program_space().unmap_write(0160000, 0167777); +} + +uint16_t bk_samara_device::cs0_r(offs_t offset, uint16_t mem_mask) +{ + if (offset == 7) + return m_ata->cs0_r(7 - offset) ^ 0xffff; + else + return (m_ata->cs0_r(7 - offset) ^ 0xffff) & 0xff; +} + +uint16_t bk_samara_device::cs1_r(offs_t offset, uint16_t mem_mask) +{ + return (m_ata->cs1_r(7 - offset) ^ 0xffff) & 0xff; +} + +void bk_samara_device::cs0_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + if (offset == 7) + m_ata->cs0_w(7 - offset, (data ^ 0xffff)); + else + m_ata->cs0_w(7 - offset, (data ^ 0xffff) & 0xff); +} + +void bk_samara_device::cs1_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + m_ata->cs1_w(7 - offset, (data ^ 0xffff) & 0xff); +} + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(BK_SAMARA, device_qbus_card_interface, bk_samara_device, "bk_samara", "BK Samara floppy/ATA") diff --git a/src/devices/bus/qbus/bk_samara.h b/src/devices/bus/qbus/bk_samara.h new file mode 100644 index 0000000000000..f7e54a4775e87 --- /dev/null +++ b/src/devices/bus/qbus/bk_samara.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK "Samara" combo floppy/ATA controller + +***************************************************************************/ + +#ifndef MAME_BUS_QBUS_BK_SAMARA_H +#define MAME_BUS_QBUS_BK_SAMARA_H + +#pragma once + +#include "qbus.h" + + +DECLARE_DEVICE_TYPE(BK_SAMARA, device_qbus_card_interface) + +#endif diff --git a/src/devices/bus/qbus/qbus.cpp b/src/devices/bus/qbus/qbus.cpp index 74c2a8365fba4..3f1c15093e8ad 100644 --- a/src/devices/bus/qbus/qbus.cpp +++ b/src/devices/bus/qbus/qbus.cpp @@ -13,7 +13,9 @@ // Peripheral boards // storage +#include "bk_altpro.h" #include "bk_kmd.h" +#include "bk_samara.h" #include "dsd4432.h" #include "dvk_dwhle.h" #include "dvk_kgd.h" @@ -33,9 +35,15 @@ void qbus_cards(device_slot_interface &device) { + device.option_add("dsd4432", DSD4432); device.option_add("pc11", DEC_PC11); /* Paper tape reader and punch */ + device.option_add("qg640", MATROX_QG640); device.option_add("qts1", TTI_QTS1); - device.option_add("dsd4432", DSD4432); + device.option_add("tdl12", TDL12); + device.option_add("terak_v", TERAK_V); + + device.option_add("altpro", BK_ALTPRO); + device.option_add("by", BK_KMD); device.option_add("dw", DVK_DWHLE); device.option_add("irps", BK_IRPS); device.option_add("kgd", DVK_KGD); @@ -43,10 +51,7 @@ void qbus_cards(device_slot_interface &device) device.option_add("mx", DVK_MX); device.option_add("my", DVK_KMD); device.option_add("mz", UKNC_KMD); - device.option_add("qg640", MATROX_QG640); - device.option_add("by", BK_KMD); - device.option_add("tdl12", TDL12); - device.option_add("terak_v", TERAK_V); + device.option_add("samara", BK_SAMARA); }