summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2022-05-31 17:23:14 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2022-05-31 17:23:14 +0700
commita87474c2647395f9873fd8b68e5ee2c084a1888a (patch)
treed929254776ada621262ed9373514f3c45f0143e0
parent9de083aee9cdcfe5cb5e8710b87b59956be774e2 (diff)
labtam: improve z80sbc floppy hookup
-rw-r--r--src/devices/bus/multibus/labtam_z80sbc.cpp61
-rw-r--r--src/devices/bus/multibus/labtam_z80sbc.h1
2 files changed, 44 insertions, 18 deletions
diff --git a/src/devices/bus/multibus/labtam_z80sbc.cpp b/src/devices/bus/multibus/labtam_z80sbc.cpp
index ed3bc2fa147..272fbed8ac4 100644
--- a/src/devices/bus/multibus/labtam_z80sbc.cpp
+++ b/src/devices/bus/multibus/labtam_z80sbc.cpp
@@ -8,8 +8,6 @@
* - https://arvutimuuseum.ut.ee/index.php?m=eksponaadid&id=223
*
* TODO:
- * - interrupts and dma
- * - floppy
* - serial
*/
/*
@@ -210,6 +208,12 @@ ioport_constructor labtam_z80sbc_device::device_input_ports() const
return INPUT_PORTS_NAME(labtam_z80sbc);
}
+void labtam_z80sbc_device::device_resolve_objects()
+{
+ // TODO: Multibus interrupt lines may optionally be wire-wrapped to
+ // Am9517 interrupt request inputs 0, 1, 3 or 7.
+}
+
void labtam_z80sbc_device::device_start()
{
m_ram0 = std::make_unique<u8[]>(0x10000);
@@ -247,9 +251,6 @@ void labtam_z80sbc_device::device_reset()
m_bus->space(AS_IO).install_write_handler(pio_select | 4, pio_select | 4, write8smo_delegate(*this, FUNC(labtam_z80sbc_device::fdcattn_w)));
m_bus->space(AS_IO).install_read_handler(pio_select | 8, pio_select | 8, read8smo_delegate(*this, FUNC(labtam_z80sbc_device::fdcstatus_r)));
- // TODO: Multibus interrupt lines may optionally be wire-wrapped to
- // Am9517 interrupt request inputs 0, 1, 3 or 7.
-
m_installed = true;
}
@@ -345,7 +346,7 @@ void labtam_z80sbc_device::cpu_pio(address_map &map)
map(0x0020, 0x0020).mirror(0xff00).lw8([this](u8 data) { m_map_enabled = true; LOG("intswt 0x%02x mapnum 0x%02x (%s)\n", data, m_map_num, machine().describe_context()); }, "intswt");
map(0x0028, 0x0028).mirror(0xff00).lw8([this](u8 data) { m_map_enabled = true; m_map_num = data & 0x0f; LOG("mapnum 0x%02x (%s)\n", data, machine().describe_context()); }, "mapnum");
- map(0x0030, 0x0033).mirror(0xff00).w(FUNC(labtam_z80sbc_device::drive_w));
+ map(0x0030, 0x0037).mirror(0xff00).w(FUNC(labtam_z80sbc_device::drive_w));
map(0x0038, 0x0038).mirror(0xff00).lw8([this](u8 data) { LOG("reset drive fault\n"); }, "fltrest");
map(0x0040, 0x0043).mirror(0xff00).rw(m_fdc, FUNC(wd2793_device::read), FUNC(wd2793_device::write));
map(0x0048, 0x004b).mirror(0xff00).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w));
@@ -358,7 +359,7 @@ void labtam_z80sbc_device::cpu_pio(address_map &map)
map(0x0068, 0x0068).mirror(0xff00).r(FUNC(labtam_z80sbc_device::drvstatus_r));
map(0x0070, 0x0070).select(0xff00).lr8([this](offs_t offset) { return m_map_lo[offset >> 8]; }, "maprd0");
- map(0x0078, 0x0078).select(0xff00).lr8([this](offs_t offset) { return m_map_hi[offset >> 8]; }, "maprd1"); // TODO: code at 167c reads maprd1 lower 3 bits?
+ map(0x0078, 0x0078).select(0xff00).lr8([this](offs_t offset) { return m_map_hi[offset >> 8] | m_map_num; }, "maprd1");
map(0x0080, 0x0080).mirror(0xff00).rw(m_dma[0], FUNC(z80dma_device::read), FUNC(z80dma_device::write));
map(0x00a0, 0x00a0).mirror(0xff00).rw(m_dma[1], FUNC(z80dma_device::read), FUNC(z80dma_device::write));
@@ -442,18 +443,42 @@ void labtam_z80sbc_device::map_w(unsigned map_num, offs_t offset, u8 data)
void labtam_z80sbc_device::drive_w(offs_t offset, u8 data)
{
- LOG("drive_w %s drive %d (%s)\n", data ? "select" : "deselect", offset, machine().describe_context());
-
- if (data)
- {
- m_drive = offset;
- m_fdc->enmf_w(BIT(m_e21->read(), offset));
- m_fdc->set_floppy(m_fdd[*m_drive]->get_device());
- }
- else
+ switch (offset)
{
- m_drive.reset();
- m_fdc->set_floppy(nullptr);
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ if (BIT(data, 0))
+ {
+ LOG("drive_w select drive %d (%s)\n", offset, machine().describe_context());
+ m_drive = offset;
+ m_fdc->set_floppy(m_fdd[*m_drive]->get_device());
+ }
+ else
+ {
+ m_drive.reset();
+ m_fdc->set_floppy(nullptr);
+ }
+ break;
+ case 4:
+ m_fdc->dden_w(BIT(data, 0));
+ break;
+ case 5:
+ // FIXME: make side select persistent
+ if (m_drive)
+ {
+ LOG("drive_w select side %d (%s)\n", BIT(data, 0), machine().describe_context());
+ m_fdd[*m_drive]->get_device()->ss_w(BIT(data, 0));
+ }
+ break;
+ case 6:
+ // TODO: precomp
+ break;
+ case 7:
+ LOG("drive_w mini-floppy %s (%s)\n", BIT(data, 0) ? "disable" : "enable", machine().describe_context());
+ m_fdc->enmf_w(BIT(data, 0));
+ break;
}
}
diff --git a/src/devices/bus/multibus/labtam_z80sbc.h b/src/devices/bus/multibus/labtam_z80sbc.h
index 02cca3c0f1e..6431ca0d01c 100644
--- a/src/devices/bus/multibus/labtam_z80sbc.h
+++ b/src/devices/bus/multibus/labtam_z80sbc.h
@@ -30,6 +30,7 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
+ virtual void device_resolve_objects() override;
virtual void device_start() override;
virtual void device_reset() override;