aquarius: Added support for .CAQ cassette images.

- Select 20K RAM as default.
This commit is contained in:
Nigel Barnes 2020-10-19 20:07:01 +01:00
parent d13d9d7669
commit af16e6fbe9
5 changed files with 149 additions and 8 deletions

View File

@ -305,6 +305,18 @@ if (FORMATS["AP_DSK35"]~=null or _OPTIONS["with-tools"]) then
}
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)