|
| 1 | +// license:BSD-3-Clause |
| 2 | +// copyright-holders:Sergey Svishchev |
| 3 | +/*************************************************************************** |
| 4 | +
|
| 5 | + BK "Altpro" combo floppy/ATA controller series |
| 6 | +
|
| 7 | + CSRs 177130, 177740. No vector. |
| 8 | +
|
| 9 | + Compatible with standard floppy controller. ATA port has software |
| 10 | + support in ANDOS and MK-DOS. |
| 11 | +
|
| 12 | + Not implemented: memory expansion (SMK models). |
| 13 | +
|
| 14 | +***************************************************************************/ |
| 15 | + |
| 16 | +#include "emu.h" |
| 17 | +#include "bk_altpro.h" |
| 18 | + |
| 19 | +#include "bus/ata/ataintf.h" |
| 20 | +#include "cpu/t11/t11.h" |
| 21 | +#include "formats/bk0010_dsk.h" |
| 22 | +#include "imagedev/harddriv.h" |
| 23 | +#include "machine/1801vp128.h" |
| 24 | + |
| 25 | + |
| 26 | +namespace { |
| 27 | + |
| 28 | +ROM_START(bk_altpro) |
| 29 | + ROM_REGION(0x1000, "maincpu", 0) |
| 30 | + ROM_DEFAULT_BIOS("smk00") |
| 31 | + ROM_SYSTEM_BIOS(0, "smk00", "SMK00 1.41") |
| 32 | + ROMX_LOAD("disk_smk00_v1.41.rom", 0, 0x1000, CRC(cf41889f) SHA1(d34480e35a400316a1f0b6a9d2f3208f2ff2a6de), ROM_BIOS(0)) |
| 33 | + ROM_SYSTEM_BIOS(1, "smk64", "SMK64 2.05") |
| 34 | + ROMX_LOAD("disk_smk64_v2.05.rom", 0, 0x1000, CRC(f5ac331d) SHA1(f14f54eb7a1f3327ceb7d6a30c484f6a0d5226ad), ROM_BIOS(1)) |
| 35 | + ROM_SYSTEM_BIOS(2, "smk512", "SMK512 2.05") |
| 36 | + ROMX_LOAD("disk_smk512_v2.05.rom", 0, 0x1000, CRC(6ca562a7) SHA1(4796f373e343460b2c9acf769fd4ddfa46e6e90f), ROM_BIOS(2)) |
| 37 | +ROM_END |
| 38 | + |
| 39 | +/*************************************************************************** |
| 40 | + TYPE DEFINITIONS |
| 41 | +***************************************************************************/ |
| 42 | + |
| 43 | +// ======================> bk_altpro_device |
| 44 | + |
| 45 | +class bk_altpro_device : public device_t, |
| 46 | + public device_qbus_card_interface |
| 47 | +{ |
| 48 | +public: |
| 49 | + // construction/destruction |
| 50 | + bk_altpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); |
| 51 | + |
| 52 | + uint16_t ata_r(offs_t offset, uint16_t mem_mask = ~0); |
| 53 | + void ata_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); |
| 54 | + |
| 55 | +protected: |
| 56 | + // device-level overrides |
| 57 | + virtual void device_start() override ATTR_COLD; |
| 58 | + virtual void device_reset() override ATTR_COLD; |
| 59 | + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; |
| 60 | + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; |
| 61 | + |
| 62 | + required_device<k1801vp128_device> m_fdc; |
| 63 | + required_device<ata_interface_device> m_ata; |
| 64 | + |
| 65 | +private: |
| 66 | + static void floppy_formats(format_registration &fr); |
| 67 | + |
| 68 | + bool odd; |
| 69 | + |
| 70 | + std::unique_ptr<uint8_t[]> m_ram; |
| 71 | +}; |
| 72 | + |
| 73 | + |
| 74 | + |
| 75 | +//************************************************************************** |
| 76 | +// LIVE DEVICE |
| 77 | +//************************************************************************** |
| 78 | + |
| 79 | +//------------------------------------------------- |
| 80 | +// bk_altpro_device - constructor |
| 81 | +//------------------------------------------------- |
| 82 | + |
| 83 | +bk_altpro_device::bk_altpro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) |
| 84 | + : device_t(mconfig, BK_ALTPRO, tag, owner, clock) |
| 85 | + , device_qbus_card_interface(mconfig, *this) |
| 86 | + , m_fdc(*this, "fdc") |
| 87 | + , m_ata(*this, "ata") |
| 88 | +{ |
| 89 | +} |
| 90 | + |
| 91 | +void bk_altpro_device::floppy_formats(format_registration &fr) |
| 92 | +{ |
| 93 | + fr.add_mfm_containers(); |
| 94 | + fr.add(FLOPPY_BK0010_FORMAT); |
| 95 | +} |
| 96 | + |
| 97 | +static void bk_floppies(device_slot_interface &device) |
| 98 | +{ |
| 99 | + device.option_add("525qd", FLOPPY_525_QD); |
| 100 | +} |
| 101 | + |
| 102 | +const tiny_rom_entry *bk_altpro_device::device_rom_region() const |
| 103 | +{ |
| 104 | + return ROM_NAME(bk_altpro); |
| 105 | +} |
| 106 | + |
| 107 | +void bk_altpro_device::device_add_mconfig(machine_config &config) |
| 108 | +{ |
| 109 | + K1801VP128(config, m_fdc, XTAL(4'000'000)); |
| 110 | + m_fdc->ds_in_callback().set([] (uint16_t data) { |
| 111 | + switch (data & 15) |
| 112 | + { |
| 113 | + case 1: return 0; |
| 114 | + case 2: return 1; |
| 115 | + default: return -1; |
| 116 | + } |
| 117 | + }); |
| 118 | + FLOPPY_CONNECTOR(config, "fdc:0", bk_floppies, "525qd", bk_altpro_device::floppy_formats); |
| 119 | + FLOPPY_CONNECTOR(config, "fdc:1", bk_floppies, "525qd", bk_altpro_device::floppy_formats); |
| 120 | + |
| 121 | + ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false); |
| 122 | +} |
| 123 | + |
| 124 | + |
| 125 | +//------------------------------------------------- |
| 126 | +// device_start - device-specific startup |
| 127 | +//------------------------------------------------- |
| 128 | + |
| 129 | +void bk_altpro_device::device_start() |
| 130 | +{ |
| 131 | + m_ram = make_unique_clear<uint8_t[]>(4096); |
| 132 | + m_bus->install_device(0177130, 0177133, |
| 133 | + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::read)), |
| 134 | + emu::rw_delegate(m_fdc, FUNC(k1801vp128_device::write)) |
| 135 | + ); |
| 136 | + m_bus->program_space().install_readwrite_handler(0177740, 0177757, |
| 137 | + emu::rw_delegate(*this, FUNC(bk_altpro_device::ata_r)), |
| 138 | + emu::rw_delegate(*this, FUNC(bk_altpro_device::ata_w)), |
| 139 | + 0, 0, t11_device::UNALIGNED_WORD |
| 140 | + ); |
| 141 | + m_bus->program_space().install_rom(0160000, 0167777, memregion(this->subtag("maincpu").c_str())->base()); |
| 142 | + m_bus->program_space().unmap_write(0160000, 0167777); |
| 143 | + m_bus->program_space().install_ram(0170000, 0176777, &m_ram[0]); |
| 144 | +} |
| 145 | + |
| 146 | +void bk_altpro_device::device_reset() |
| 147 | +{ |
| 148 | + odd = false; |
| 149 | +} |
| 150 | + |
| 151 | +uint16_t bk_altpro_device::ata_r(offs_t offset, uint16_t mem_mask) |
| 152 | +{ |
| 153 | + if (mem_mask == 0xff00) // unaligned access |
| 154 | + { |
| 155 | + odd = true; |
| 156 | + return ((m_ata->cs1_r(7 - offset) << 8) ^ 0xffff); |
| 157 | + } |
| 158 | + else if (odd) |
| 159 | + { |
| 160 | + odd = false; |
| 161 | + return 0; |
| 162 | + } |
| 163 | + else if (offset == 7) |
| 164 | + return m_ata->cs0_r(7 - offset) ^ 0xffff; |
| 165 | + else |
| 166 | + return (m_ata->cs0_r(7 - offset) ^ 0xffff) & 0xff; |
| 167 | +} |
| 168 | + |
| 169 | +void bk_altpro_device::ata_w(offs_t offset, uint16_t data, uint16_t mem_mask) |
| 170 | +{ |
| 171 | + if (mem_mask == 0xff00) // unaligned access |
| 172 | + { |
| 173 | + odd = true; |
| 174 | + m_ata->cs1_w(7 - offset, ((data >> 8) ^ 0xffff) & 0xff); |
| 175 | + } |
| 176 | + else if (odd) |
| 177 | + { |
| 178 | + odd = false; |
| 179 | + return; |
| 180 | + } |
| 181 | + else if (offset == 7) |
| 182 | + m_ata->cs0_w(7 - offset, (data ^ 0xffff)); |
| 183 | + else |
| 184 | + m_ata->cs0_w(7 - offset, (data ^ 0xffff) & 0xff); |
| 185 | +} |
| 186 | + |
| 187 | +} // anonymous namespace |
| 188 | + |
| 189 | + |
| 190 | +//************************************************************************** |
| 191 | +// DEVICE DEFINITIONS |
| 192 | +//************************************************************************** |
| 193 | + |
| 194 | +DEFINE_DEVICE_TYPE_PRIVATE(BK_ALTPRO, device_qbus_card_interface, bk_altpro_device, "bk_altpro", "BK Altpro floppy/ATA") |
0 commit comments