diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2019-05-04 19:46:52 -0400 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2019-05-04 19:46:58 -0400 |
commit | 1f032f00b0b2d95336276dcf4f2e1645013a06e3 (patch) | |
tree | 3c8e17511ef73ecbec183d40b7e534e739282329 /src/devices/bus/apricot/expansion/winchester.cpp | |
parent | 7f669367efa1d0fd4a3b93ec75863280876fc8e4 (diff) |
bus/apricot/expansion/winchester: Use LS259 addressable latch device (nw)
Diffstat (limited to 'src/devices/bus/apricot/expansion/winchester.cpp')
-rw-r--r-- | src/devices/bus/apricot/expansion/winchester.cpp | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/src/devices/bus/apricot/expansion/winchester.cpp b/src/devices/bus/apricot/expansion/winchester.cpp index f5a35ec4ac1..5096cd7d4e0 100644 --- a/src/devices/bus/apricot/expansion/winchester.cpp +++ b/src/devices/bus/apricot/expansion/winchester.cpp @@ -11,6 +11,7 @@ #include "emu.h" #include "winchester.h" #include "imagedev/harddriv.h" +#include "machine/74259.h" //#define LOG_GENERAL (1U << 0) #define LOG_REGS (1U << 1) @@ -38,14 +39,8 @@ DEFINE_DEVICE_TYPE(APRICOT_WINCHESTER, apricot_winchester_device, "apricot_winch void apricot_winchester_device::regs(address_map &map) { map(0x0e0, 0x0ef).rw(m_hdc, FUNC(wd1010_device::read), FUNC(wd1010_device::write)).umask16(0x00ff); - map(0x1e0, 0x1e0).rw(FUNC(apricot_winchester_device::int_r), FUNC(apricot_winchester_device::head_w<0>)).umask16(0x00ff); - map(0x1e2, 0x1e2).w(FUNC(apricot_winchester_device::head_w<1>)).umask16(0x00ff); - map(0x1e4, 0x1e4).w(FUNC(apricot_winchester_device::head_w<2>)).umask16(0x00ff); - map(0x1e6, 0x1e6).w(FUNC(apricot_winchester_device::drive_w<0>)).umask16(0x00ff); - map(0x1e8, 0x1e8).w(FUNC(apricot_winchester_device::xferd_w)).umask16(0x00ff); // transferred - map(0x1ea, 0x1ea).w(FUNC(apricot_winchester_device::hbcr_w)).umask16(0x00ff); // host buffer clear register - map(0x1ec, 0x1ec).w(FUNC(apricot_winchester_device::clksel_w)).umask16(0x00ff); // buffer chip read/write clock select (host or wdc) - map(0x1ee, 0x1ee).w(FUNC(apricot_winchester_device::drive_w<1>)).umask16(0x00ff); + map(0x1e0, 0x1e0).r(FUNC(apricot_winchester_device::int_r)); + map(0x1e0, 0x1ef).w("latch", FUNC(ls259_device::write_d0)).umask16(0x00ff); map(0x1f0, 0x1f0).rw(FUNC(apricot_winchester_device::data_r), FUNC(apricot_winchester_device::data_w)).umask16(0x00ff); } @@ -60,6 +55,16 @@ void apricot_winchester_device::device_add_mconfig(machine_config &config) m_hdc->in_data_callback().set(FUNC(apricot_winchester_device::hdc_data_r)); m_hdc->out_data_callback().set(FUNC(apricot_winchester_device::hdc_data_w)); + ls259_device &latch(LS259(config, "latch")); // IC6 + latch.q_out_cb<0>().set(FUNC(apricot_winchester_device::head_w<0>)); + latch.q_out_cb<1>().set(FUNC(apricot_winchester_device::head_w<1>)); + latch.q_out_cb<2>().set(FUNC(apricot_winchester_device::head_w<2>)); + latch.q_out_cb<3>().set(FUNC(apricot_winchester_device::drive_w<0>)); + latch.q_out_cb<4>().set(FUNC(apricot_winchester_device::xferd_w)); // transferred + latch.q_out_cb<5>().set(FUNC(apricot_winchester_device::hbcr_w)); // host buffer clear register + latch.q_out_cb<6>().set(FUNC(apricot_winchester_device::clksel_w)); // buffer chip read/write clock select (host or wdc) + latch.q_out_cb<7>().set(FUNC(apricot_winchester_device::drive_w<1>)); + HARDDISK(config, "hdc:0", 0); HARDDISK(config, "hdc:1", 0); } @@ -127,7 +132,7 @@ WRITE_LINE_MEMBER( apricot_winchester_device::hdc_intrq_w ) m_bus->int2_w(state); } -READ8_MEMBER( apricot_winchester_device::hdc_data_r ) +uint8_t apricot_winchester_device::hdc_data_r() { uint8_t data = 0xff; @@ -143,7 +148,7 @@ READ8_MEMBER( apricot_winchester_device::hdc_data_r ) return data; } -WRITE8_MEMBER( apricot_winchester_device::hdc_data_w ) +void apricot_winchester_device::hdc_data_w(uint8_t data) { if (m_clksel == 1) { @@ -155,22 +160,22 @@ WRITE8_MEMBER( apricot_winchester_device::hdc_data_w ) } } -READ8_MEMBER( apricot_winchester_device::int_r ) +uint8_t apricot_winchester_device::int_r() { return m_int; } template<int N> -WRITE8_MEMBER( apricot_winchester_device::head_w ) +WRITE_LINE_MEMBER( apricot_winchester_device::head_w ) { - m_head = (m_head & ~(1 << N)) | (BIT(data, 0) << N); + m_head = (m_head & ~(1 << N)) | (state << N); LOGREGS("Select head: %d\n", m_head); } template<int N> -WRITE8_MEMBER( apricot_winchester_device::drive_w ) +WRITE_LINE_MEMBER( apricot_winchester_device::drive_w ) { - m_drive = (m_drive & ~(1 << N)) | (BIT(data, 0) << N); + m_drive = (m_drive & ~(1 << N)) | (state << N); LOGREGS("Select drive: %d\n", m_drive); // forward drive status to the hdc @@ -196,32 +201,32 @@ WRITE8_MEMBER( apricot_winchester_device::drive_w ) m_hdc->drdy_w(drive != nullptr && drive->exists()); } -WRITE8_MEMBER( apricot_winchester_device::xferd_w ) +WRITE_LINE_MEMBER( apricot_winchester_device::xferd_w ) { - LOGREGS("xferd_w: %02x\n", data); + LOGREGS("xferd_w: %02x\n", state); - m_hdc->brdy_w(BIT(data, 0)); + m_hdc->brdy_w(state); } -WRITE8_MEMBER( apricot_winchester_device::hbcr_w ) +WRITE_LINE_MEMBER( apricot_winchester_device::hbcr_w ) { - LOGREGS("hbcr_w: %02x\n", data); + LOGREGS("hbcr_w: %02x\n", state); // reset ram pointer on high->low transition - if (m_hbcr == 1 && data == 0) + if (m_hbcr == 1 && !state) m_ram_ptr = 0; - m_hbcr = BIT(data, 0); + m_hbcr = state; } -WRITE8_MEMBER( apricot_winchester_device::clksel_w ) +WRITE_LINE_MEMBER( apricot_winchester_device::clksel_w ) { - LOGREGS("clksel_w: %02x\n", data); + LOGREGS("clksel_w: %02x\n", state); - m_clksel = BIT(data, 0); + m_clksel = state; } -READ8_MEMBER( apricot_winchester_device::data_r ) +uint8_t apricot_winchester_device::data_r() { uint8_t data = 0xff; @@ -239,7 +244,7 @@ READ8_MEMBER( apricot_winchester_device::data_r ) return data; } -WRITE8_MEMBER( apricot_winchester_device::data_w ) +void apricot_winchester_device::data_w(uint8_t data) { if (m_clksel == 0) { |