Skip to content

Commit add9234

Browse files
authored
bk: "Altpro" and "Samara" combo floppy/ATA controllers. (#14419)
1 parent de73691 commit add9234

File tree

6 files changed

+419
-5
lines changed

6 files changed

+419
-5
lines changed

scripts/src/bus.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5002,10 +5002,14 @@ end
50025002

50035003
if (BUSES["QBUS"]~=null) then
50045004
files {
5005+
MAME_DIR .. "src/devices/bus/qbus/bk_altpro.cpp",
5006+
MAME_DIR .. "src/devices/bus/qbus/bk_altpro.h",
50055007
MAME_DIR .. "src/devices/bus/qbus/bk_irps.cpp",
50065008
MAME_DIR .. "src/devices/bus/qbus/bk_irps.h",
50075009
MAME_DIR .. "src/devices/bus/qbus/bk_kmd.cpp",
50085010
MAME_DIR .. "src/devices/bus/qbus/bk_kmd.h",
5011+
MAME_DIR .. "src/devices/bus/qbus/bk_samara.cpp",
5012+
MAME_DIR .. "src/devices/bus/qbus/bk_samara.h",
50095013
MAME_DIR .. "src/devices/bus/qbus/dsd4432.cpp",
50105014
MAME_DIR .. "src/devices/bus/qbus/dsd4432.h",
50115015
MAME_DIR .. "src/devices/bus/qbus/dvk_dwhle.cpp",

src/devices/bus/qbus/bk_altpro.cpp

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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")

src/devices/bus/qbus/bk_altpro.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Sergey Svishchev
3+
/***************************************************************************
4+
5+
BK "Altpro" combo floppy/ATA controller
6+
7+
***************************************************************************/
8+
9+
#ifndef MAME_BUS_QBUS_BK_ALTPRO_H
10+
#define MAME_BUS_QBUS_BK_ALTPRO_H
11+
12+
#pragma once
13+
14+
#include "qbus.h"
15+
16+
17+
DECLARE_DEVICE_TYPE(BK_ALTPRO, device_qbus_card_interface)
18+
19+
#endif

0 commit comments

Comments
 (0)