summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/adamnet/ddp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/adamnet/ddp.cpp')
-rw-r--r--src/devices/bus/adamnet/ddp.cpp109
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)