From ab24a264a4b18aa0fcb3ebb3846983729bf27e14 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 12 Oct 2023 18:06:20 -0400 Subject: adam_ddp: Clean up code using device finder array for cassettes --- src/devices/bus/adamnet/ddp.cpp | 96 ++++++++++++++++++----------------------- src/devices/bus/adamnet/ddp.h | 7 +-- 2 files changed, 43 insertions(+), 60 deletions(-) diff --git a/src/devices/bus/adamnet/ddp.cpp b/src/devices/bus/adamnet/ddp.cpp index b4a17e909cd..21c51a9f0ce 100644 --- a/src/devices/bus/adamnet/ddp.cpp +++ b/src/devices/bus/adamnet/ddp.cpp @@ -9,6 +9,8 @@ #include "emu.h" #include "ddp.h" +#include "formats/adam_cas.h" + //************************************************************************** @@ -80,17 +82,14 @@ void adam_digital_data_pack_device::device_add_mconfig(machine_config &config) // Port 3 = Multiplexed Address/Data m_maincpu->in_p4_cb().set(FUNC(adam_digital_data_pack_device::p4_r)); - CASSETTE(config, m_ddp0); - m_ddp0->set_formats(coleco_adam_cassette_formats); - m_ddp0->set_create_opts(&adam_cassette_options); - m_ddp0->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED); - m_ddp0->set_interface("adam_cass"); - - CASSETTE(config, m_ddp1); - m_ddp1->set_formats(coleco_adam_cassette_formats); - m_ddp1->set_create_opts(&adam_cassette_options); - m_ddp1->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED); - m_ddp1->set_interface("adam_cass"); + for (auto &ddp : m_ddp) + { + CASSETTE(config, ddp); + ddp->set_formats(coleco_adam_cassette_formats); + ddp->set_create_opts(&adam_cassette_options); + ddp->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED); + ddp->set_interface("adam_cass"); + } } @@ -107,8 +106,8 @@ adam_digital_data_pack_device::adam_digital_data_pack_device(const machine_confi : device_t(mconfig, ADAM_DDP, tag, owner, clock), device_adamnet_card_interface(mconfig, *this), m_maincpu(*this, M6801_TAG), - m_ddp0(*this, "cassette"), - m_ddp1(*this, "cassette2"), m_wr0(0), m_wr1(0), m_track(0) + m_ddp(*this, {"cassette", "cassette2"}), + m_wr(0), m_track(0) { } @@ -120,8 +119,7 @@ adam_digital_data_pack_device::adam_digital_data_pack_device(const machine_confi void adam_digital_data_pack_device::device_start() { // state saving - save_item(NAME(m_wr0)); - save_item(NAME(m_wr1)); + save_item(NAME(m_wr)); save_item(NAME(m_track)); } @@ -157,27 +155,21 @@ void adam_digital_data_pack_device::p1_w(uint8_t data) */ - if (m_ddp0->exists()) + for (int n = 0; n < 2; n++) { - m_ddp0->set_speed(BIT(data, 0) ? (double) 80/1.875 : 20/1.875); // speed select - if(!(data & 0x08)) m_ddp0->go_forward(); - if(!(data & 0x10)) m_ddp0->go_reverse(); - m_ddp0->change_state(BIT(data, 1) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); // motor control + if (m_ddp[n]->exists()) + { + m_ddp[n]->set_speed(BIT(data, 0) ? (double) 80/1.875 : 20/1.875); // speed select + if (!BIT(data, 3)) + m_ddp[n]->go_forward(); + if (!BIT(data, 4)) + m_ddp[n]->go_reverse(); + m_ddp[n]->change_state(BIT(data, n + 1) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); // motor control + } } - if (m_ddp1->exists()) - { - m_ddp1->set_speed(BIT(data, 0) ? (double) 80/1.875 : 20/1.875); // speed select - if(!(data & 0x08)) m_ddp1->go_forward(); - if(!(data & 0x10)) m_ddp1->go_reverse(); - m_ddp1->change_state(BIT(data, 2) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); // motor control - } - - // data write 0 - m_wr0 = BIT(data, 6); - - // data write 1 - m_wr1 = BIT(data, 7); + // data write 0/1 + m_wr = BIT(data, 6, 2); } @@ -204,7 +196,7 @@ uint8_t adam_digital_data_pack_device::p2_r() if (m_bus->reset_r()) data |= M6801_MODE_6; else - data |= m_ddp1->exists() << 1; // Cassette in place 1 + data |= m_ddp[1]->exists() << 1; // Cassette in place 1 // NET RXD data |= m_bus->rxd_r(this) << 3; @@ -231,16 +223,14 @@ void adam_digital_data_pack_device::p2_w(uint8_t data) */ - if (m_ddp0->exists()) + for (int n = 0; n < 2; n++) { - m_ddp0->set_channel(!BIT(data, 2)); // Track select - if (!m_wr0) m_ddp0->output(BIT(data, 0) ? 1.0 : -1.0); // write data - } - - if (m_ddp1->exists()) - { - m_ddp1->set_channel(!BIT(data, 2)); - if (!m_wr1) m_ddp1->output(BIT(data, 0) ? 1.0 : -1.0); + if (m_ddp[n]->exists()) + { + m_ddp[n]->set_channel(!BIT(data, 2)); // Track select + if (!BIT(m_wr, n)) + m_ddp[n]->output(BIT(data, 0) ? 1.0 : -1.0); // write data + } } // NET TXD @@ -271,19 +261,15 @@ uint8_t adam_digital_data_pack_device::p4_r() uint8_t data = 0; - // drive 0 - if (m_ddp0->exists()) - { - data |= ((m_ddp0->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_STOPPED) << 3; // motion sense - data |= 1 << 5; // cassette in place - data |= (m_ddp0->input() < 0) << 7; // read data - } - - // drive 1 - if (m_ddp1->exists()) + for (int n = 0; n < 2; n++) { - data |= ((m_ddp1->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_STOPPED) << 4; // motion sense - data |= (m_ddp1->input() < 0) << 7; // read data + if (m_ddp[n]->exists()) + { + data |= ((m_ddp[n]->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_STOPPED) << (n + 3); // motion sense + if (n == 0) + data |= 1 << 5; // cassette in place (drive 0) + data |= (m_ddp[n]->input() < 0) << 7; // read data + } } // read data 0 (always 1) diff --git a/src/devices/bus/adamnet/ddp.h b/src/devices/bus/adamnet/ddp.h index c6fa66f98d3..9f28beebbd7 100644 --- a/src/devices/bus/adamnet/ddp.h +++ b/src/devices/bus/adamnet/ddp.h @@ -13,7 +13,6 @@ #include "adamnet.h" #include "cpu/m6800/m6801.h" -#include "formats/adam_cas.h" #include "imagedev/cassette.h" @@ -44,11 +43,9 @@ protected: private: required_device m_maincpu; - required_device m_ddp0; - required_device m_ddp1; + required_device_array m_ddp; - int m_wr0; - int m_wr1; + uint8_t m_wr; int m_track; void p1_w(uint8_t data); -- cgit v1.2.3