summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/aquarius_caq.cpp107
-rw-r--r--src/lib/formats/aquarius_caq.h19
2 files changed, 126 insertions, 0 deletions
diff --git a/src/lib/formats/aquarius_caq.cpp b/src/lib/formats/aquarius_caq.cpp
new file mode 100644
index 00000000000..aecb883aabf
--- /dev/null
+++ b/src/lib/formats/aquarius_caq.cpp
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ formats/aquarius_caq.cpp
+
+ Cassette code for Aquarius .CAQ files
+
+*********************************************************************/
+
+#include "aquarius_caq.h"
+
+#include "coretmpl.h" // BIT
+
+#include <cassert>
+
+
+/*-------------------------------------------------
+ CassetteModulation aquarius_caq_modulation
+-------------------------------------------------*/
+
+static const cassette_image::Modulation aquarius_caq_modulation =
+{
+ cassette_image::MODULATION_SINEWAVE,
+ 900.0 - 300, 900.0, 900.0 + 300,
+ 1800.0 - 600, 1800.0, 1800.0 + 600
+
+
+};
+
+/*-------------------------------------------------
+ aquarius_caq_identify - identify cassette
+-------------------------------------------------*/
+
+static cassette_image::error aquarius_caq_identify(cassette_image *cassette, cassette_image::Options *opts)
+{
+ return cassette->modulation_identify(aquarius_caq_modulation, opts);
+}
+
+/*-------------------------------------------------
+ aquarius_caq_load - load cassette
+-------------------------------------------------*/
+
+#define MODULATE(_value) \
+ for (int i = 0; i < 2; i++) { \
+ err = cassette->put_modulated_data_bit(0, time_index, _value, aquarius_caq_modulation, &time_displacement); \
+ if (err != cassette_image::error::SUCCESS) return err; \
+ time_index += time_displacement; \
+ }
+
+static cassette_image::error aquarius_caq_load(cassette_image *cassette)
+{
+ cassette_image::error err;
+ uint64_t image_size = cassette->image_size();
+ uint64_t image_pos = 0;
+ double time_index = 0.0;
+ double time_displacement;
+ uint8_t data;
+
+ /* silence */
+ err = cassette->put_sample(0, time_index, 0.5, 0);
+ if (err != cassette_image::error::SUCCESS) return err;
+ time_index += 0.5;
+
+ while (image_pos < image_size)
+ {
+ cassette->image_read(&data, image_pos, 1);
+
+ /* start bit */
+ MODULATE(0);
+
+ /* data bits */
+ for (int bit = 7; bit >= 0; bit--)
+ {
+ MODULATE(util::BIT(data, bit));
+ }
+
+ /* stop bits */
+ MODULATE(1);
+ MODULATE(1);
+
+ image_pos++;
+ }
+
+ /* silence */
+ err = cassette->put_sample(0, time_index, 0.5, 0);
+ if (err != cassette_image::error::SUCCESS) return err;
+ time_index += 0.5;
+
+ return cassette_image::error::SUCCESS;
+}
+
+/*-------------------------------------------------
+ CassetteFormat aquarius_caq_cassette_format
+-------------------------------------------------*/
+
+const cassette_image::Format aquarius_caq_format =
+{
+ "caq",
+ aquarius_caq_identify,
+ aquarius_caq_load,
+ nullptr
+};
+
+CASSETTE_FORMATLIST_START( aquarius_cassette_formats )
+ CASSETTE_FORMAT(aquarius_caq_format)
+CASSETTE_FORMATLIST_END
diff --git a/src/lib/formats/aquarius_caq.h b/src/lib/formats/aquarius_caq.h
new file mode 100644
index 00000000000..158b1f12a5d
--- /dev/null
+++ b/src/lib/formats/aquarius_caq.h
@@ -0,0 +1,19 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ formats/aquarius_caq.h
+
+ Cassette code for Aquarius .CAQ files
+
+*********************************************************************/
+#ifndef MAME_FORMATS_AQUARIUS_CAQ_H
+#define MAME_FORMATS_AQUARIUS_CAQ_H
+
+#pragma once
+
+#include "cassimg.h"
+
+CASSETTE_FORMATLIST_EXTERN(aquarius_cassette_formats);
+
+#endif // MAME_FORMATS_AQUARIUS_CAQ_H