mirror of
https://github.com/holub/mame
synced 2025-04-27 02:33:13 +03:00
bbc_cv1797: Implemented side and motor control, and now works.
This commit is contained in:
parent
fb3758b667
commit
c6d5c5e7d2
@ -6,6 +6,10 @@
|
|||||||
|
|
||||||
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/ComputerVillage_FDC.html
|
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/ComputerVillage_FDC.html
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
Everything seems to work, but schematic required to confirm implementation
|
||||||
|
of side and motor control.
|
||||||
|
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
@ -59,12 +63,12 @@ ROM_END
|
|||||||
void bbc_cv1797_device::device_add_mconfig(machine_config &config)
|
void bbc_cv1797_device::device_add_mconfig(machine_config &config)
|
||||||
{
|
{
|
||||||
FD1797(config, m_fdc, 8_MHz_XTAL / 8);
|
FD1797(config, m_fdc, 8_MHz_XTAL / 8);
|
||||||
m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::intrq_w));
|
|
||||||
m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::drq_w));
|
m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::drq_w));
|
||||||
m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::motor_w));
|
m_fdc->sso_wr_callback().set(FUNC(bbc_cv1797_device::fdc_sso_w));
|
||||||
|
m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::fdc_hld_w));
|
||||||
|
|
||||||
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
|
FLOPPY_CONNECTOR(config, m_floppies[0], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
|
||||||
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
|
FLOPPY_CONNECTOR(config, m_floppies[1], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const
|
const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const
|
||||||
@ -84,9 +88,8 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
|
|||||||
: device_t(mconfig, BBC_CV1797, tag, owner, clock)
|
: device_t(mconfig, BBC_CV1797, tag, owner, clock)
|
||||||
, device_bbc_fdc_interface(mconfig, *this)
|
, device_bbc_fdc_interface(mconfig, *this)
|
||||||
, m_fdc(*this, "fd1797")
|
, m_fdc(*this, "fd1797")
|
||||||
, m_floppy0(*this, "fd1797:0")
|
, m_floppies(*this, "fd1797:%u", 0)
|
||||||
, m_floppy1(*this, "fd1797:1")
|
, m_floppy(nullptr)
|
||||||
, m_drive_control(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +99,6 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
|
|||||||
|
|
||||||
void bbc_cv1797_device::device_start()
|
void bbc_cv1797_device::device_start()
|
||||||
{
|
{
|
||||||
save_item(NAME(m_drive_control));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -110,11 +112,11 @@ uint8_t bbc_cv1797_device::read(offs_t offset)
|
|||||||
|
|
||||||
if (offset & 0x04)
|
if (offset & 0x04)
|
||||||
{
|
{
|
||||||
data = m_fdc->read(offset & 0x03);
|
data = 0xfe;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data = m_drive_control;
|
data = m_fdc->read(offset & 0x03);
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -123,36 +125,30 @@ void bbc_cv1797_device::write(offs_t offset, uint8_t data)
|
|||||||
{
|
{
|
||||||
if (offset & 0x04)
|
if (offset & 0x04)
|
||||||
{
|
{
|
||||||
m_fdc->write(offset & 0x03, data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
floppy_image_device *floppy = nullptr;
|
|
||||||
|
|
||||||
m_drive_control = data;
|
|
||||||
logerror("fdc: Drive control %02x\n", data);
|
|
||||||
// bit 0: drive select
|
// bit 0: drive select
|
||||||
switch (BIT(data, 0))
|
m_floppy = m_floppies[BIT(data, 0)]->get_device();
|
||||||
{
|
m_fdc->set_floppy(m_floppy);
|
||||||
case 0: floppy = m_floppy0->get_device(); break;
|
|
||||||
case 1: floppy = m_floppy1->get_device(); break;
|
|
||||||
}
|
|
||||||
m_fdc->set_floppy(floppy);
|
|
||||||
|
|
||||||
// bit 1: side select
|
// bit 1: side select
|
||||||
if (floppy)
|
if (m_floppy)
|
||||||
floppy->ss_w(BIT(data, 1));
|
m_floppy->ss_w(BIT(data, 1));
|
||||||
|
|
||||||
// bit 2: density
|
// bit 2: density
|
||||||
m_fdc->dden_w(!BIT(data, 2));
|
m_fdc->dden_w(!BIT(data, 2));
|
||||||
|
}
|
||||||
// bit 6: reset
|
else
|
||||||
//m_fdc->mr_w(!BIT(data, 6));
|
{
|
||||||
|
m_fdc->write(offset & 0x03, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(bbc_cv1797_device::motor_w)
|
WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_sso_w)
|
||||||
{
|
{
|
||||||
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
|
// TODO: schematic required to confirm usage.
|
||||||
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_hld_w)
|
||||||
|
{
|
||||||
|
if (m_floppy)
|
||||||
|
m_floppy->mon_w(!state);
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,6 @@ class bbc_cv1797_device :
|
|||||||
public device_bbc_fdc_interface
|
public device_bbc_fdc_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static constexpr feature_type imperfect_features() { return feature::DISK; }
|
|
||||||
|
|
||||||
// construction/destruction
|
// construction/destruction
|
||||||
bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
@ -46,13 +44,12 @@ protected:
|
|||||||
private:
|
private:
|
||||||
DECLARE_FLOPPY_FORMATS(floppy_formats);
|
DECLARE_FLOPPY_FORMATS(floppy_formats);
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(motor_w);
|
DECLARE_WRITE_LINE_MEMBER(fdc_sso_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
|
||||||
|
|
||||||
required_device<fd1797_device> m_fdc;
|
required_device<fd1797_device> m_fdc;
|
||||||
required_device<floppy_connector> m_floppy0;
|
required_device_array<floppy_connector, 2> m_floppies;
|
||||||
optional_device<floppy_connector> m_floppy1;
|
floppy_image_device* m_floppy;
|
||||||
|
|
||||||
int m_drive_control;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user