diff options
Diffstat (limited to 'src/devices/bus/adamnet/ddp.cpp')
-rw-r--r-- | src/devices/bus/adamnet/ddp.cpp | 109 |
1 files changed, 46 insertions, 63 deletions
diff --git a/src/devices/bus/adamnet/ddp.cpp b/src/devices/bus/adamnet/ddp.cpp index ede3719c910..f4d08232d4e 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" + //************************************************************************** @@ -52,13 +54,10 @@ const tiny_rom_entry *adam_digital_data_pack_device::device_rom_region() const void adam_digital_data_pack_device::adam_ddp_mem(address_map &map) { - map(0x0000, 0x001f).rw(M6801_TAG, FUNC(m6801_cpu_device::m6801_io_r), FUNC(m6801_cpu_device::m6801_io_w)); - map(0x0080, 0x00ff).ram(); map(0x0400, 0x07ff).ram(); - map(0xf800, 0xffff).rom().region(M6801_TAG, 0); } -static const struct CassetteOptions adam_cassette_options = +static const cassette_image::Options adam_cassette_options = { 2, /* channels */ 16, /* bits per sample */ @@ -80,17 +79,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 +103,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 +116,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)); } @@ -140,7 +135,7 @@ void adam_digital_data_pack_device::adamnet_reset_w(int state) // p1_w - //------------------------------------------------- -WRITE8_MEMBER( adam_digital_data_pack_device::p1_w ) +void adam_digital_data_pack_device::p1_w(uint8_t data) { /* @@ -157,27 +152,21 @@ WRITE8_MEMBER( adam_digital_data_pack_device::p1_w ) */ - 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); } @@ -185,7 +174,7 @@ WRITE8_MEMBER( adam_digital_data_pack_device::p1_w ) // p2_r - //------------------------------------------------- -READ8_MEMBER( adam_digital_data_pack_device::p2_r ) +uint8_t adam_digital_data_pack_device::p2_r() { /* @@ -204,7 +193,7 @@ READ8_MEMBER( 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; @@ -217,7 +206,7 @@ READ8_MEMBER( adam_digital_data_pack_device::p2_r ) // p2_w - //------------------------------------------------- -WRITE8_MEMBER( adam_digital_data_pack_device::p2_w ) +void adam_digital_data_pack_device::p2_w(uint8_t data) { /* @@ -231,16 +220,14 @@ WRITE8_MEMBER( adam_digital_data_pack_device::p2_w ) */ - 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 @@ -252,7 +239,7 @@ WRITE8_MEMBER( adam_digital_data_pack_device::p2_w ) // p4_r - //------------------------------------------------- -READ8_MEMBER( adam_digital_data_pack_device::p4_r ) +uint8_t adam_digital_data_pack_device::p4_r() { /* @@ -271,19 +258,15 @@ READ8_MEMBER( 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) |