summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2020-10-19 20:07:01 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2020-10-19 21:14:54 +0100
commitaf16e6fbe99f4fc8822e65d3ab8413252e711cac (patch)
tree0b4072ce33a315e6c2ae5e960633b6c90a45361f
parentd13d9d7669dd145cdcff4a822a94f0fb940ef4b3 (diff)
aquarius: Added support for .CAQ cassette images.
- Select 20K RAM as default.
-rw-r--r--scripts/src/formats.lua12
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/lib/formats/aquarius_caq.cpp107
-rw-r--r--src/lib/formats/aquarius_caq.h19
-rw-r--r--src/mame/drivers/aquarius.cpp18
5 files changed, 149 insertions, 8 deletions
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua
index 815ecabe73d..a3decee1833 100644
--- a/scripts/src/formats.lua
+++ b/scripts/src/formats.lua
@@ -307,6 +307,18 @@ end
--------------------------------------------------
--
+--@src/lib/formats/aquarius_caq.h,FORMATS["AQUARIUS_CAQ"] = true
+--------------------------------------------------
+
+if (FORMATS["AQUARIUS_CAQ"]~=null or _OPTIONS["with-tools"]) then
+ files {
+ MAME_DIR.. "src/lib/formats/aquarius_caq.cpp",
+ MAME_DIR.. "src/lib/formats/aquarius_caq.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/lib/formats/asst128_dsk.h,FORMATS["ASST128_DSK"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 6ccc3ddc536..a9d9c2ffa74 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -980,6 +980,7 @@ FORMATS["APOLLO_DSK"] = true
FORMATS["APPLIX_DSK"] = true
FORMATS["APRIDISK"] = true
FORMATS["AP_DSK35"] = true
+FORMATS["AQUARIUS_CAQ"] = true
FORMATS["ASST128_DSK"] = true
FORMATS["ASTROCADE_WAV"] = true
FORMATS["ATARI_DSK"] = true
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
diff --git a/src/mame/drivers/aquarius.cpp b/src/mame/drivers/aquarius.cpp
index b1d9abb6d3b..fe2bbf745c4 100644
--- a/src/mame/drivers/aquarius.cpp
+++ b/src/mame/drivers/aquarius.cpp
@@ -10,7 +10,6 @@
- slot interface for cartridges
- hand controllers
- scramble RAM also
- - CAQ tape support
- memory mapper
- proper video timings
- PAL mode
@@ -43,7 +42,7 @@ X-6026 : Roll of paper for the printer
***************************************************************************/
#define XTAL1 8866000
-#define XTAL2 XTAL(7'159'090)
+#define XTAL2 7.15909_MHz_XTAL
/***************************************************************************
@@ -362,7 +361,7 @@ GFXDECODE_END
void aquarius_state::aquarius(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, XTAL(3'579'545)); // ???
+ Z80(config, m_maincpu, XTAL2 / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &aquarius_state::aquarius_mem);
m_maincpu->set_addrmap(AS_IO, &aquarius_state::aquarius_io);
m_maincpu->set_vblank_int("screen", FUNC(aquarius_state::irq0_line_hold));
@@ -384,6 +383,7 @@ void aquarius_state::aquarius(machine_config &config)
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
+ /* mini expander */
ay8910_device &ay8910(AY8910(config, "ay8910", XTAL(3'579'545)/2)); // ??? AY-3-8914
ay8910.port_a_read_callback().set_ioport("RIGHT");
ay8910.port_b_read_callback().set_ioport("LEFT");
@@ -393,12 +393,14 @@ void aquarius_state::aquarius(machine_config &config)
CASSETTE(config, m_cassette);
m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
+ m_cassette->set_formats(aquarius_cassette_formats);
+ m_cassette->set_interface("aquarius_cass");
/* cartridge */
GENERIC_CARTSLOT(config, m_cart, generic_linear_slot, "aquarius_cart");
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("4K").set_extra_options("8K,20K,36K");
+ RAM(config, RAM_TAG).set_default_size("20K").set_extra_options("4K,8K,36K");
/* software lists */
SOFTWARE_LIST(config, "cart_list").set_original("aquarius");
@@ -414,10 +416,10 @@ ROM_START( aquarius )
/* basic rom */
ROM_DEFAULT_BIOS("rev2")
- ROM_SYSTEM_BIOS(0, "rev1", "Revision 1")
- ROMX_LOAD("aq1.u2", 0x0000, 0x2000, NO_DUMP, ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "rev2", "Revision 2")
- ROMX_LOAD("aq2.u2", 0x0000, 0x2000, CRC(a2d15bcf) SHA1(ca6ef55e9ead41453efbf5062d6a60285e9661a6), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(0, "rev2", "Revision 2")
+ ROMX_LOAD("aq2.u2", 0x0000, 0x2000, CRC(a2d15bcf) SHA1(ca6ef55e9ead41453efbf5062d6a60285e9661a6), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "rev1", "Revision 1")
+ ROMX_LOAD("aq1.u2", 0x0000, 0x2000, NO_DUMP, ROM_BIOS(1))
/* charrom */
ROM_REGION(0x800, "gfx1", 0)