mame/src/lib/formats/p6001_cas.cpp
Miodrag Milanovic ddb290d5f6 NOTICE (TYPE NAME CONSOLIDATION)
Use standard uint64_t, uint32_t, uint16_t or uint8_t instead of UINT64, UINT32, UINT16 or UINT8
also use standard int64_t, int32_t, int16_t or int8_t instead of INT64, INT32, INT16 or INT8
2016-10-22 13:13:17 +02:00

98 lines
2.5 KiB
C++

// license:BSD-3-Clause
// copyright-holders:Angelo Salese
/*
* NEC PC-6001 cassette format handling
*/
#include <assert.h>
#include "p6001_cas.h"
#define WAVE_HIGH 0x5a9e
#define WAVE_LOW -0x5a9e
static int cas_size;
static int pc6001_fill_wave(int16_t* buffer, uint8_t data, int sample_pos)
{
int x;
int sample_count = 0;
// one byte = 8 samples
for(x=0;x<8;x++)
{
if(buffer)
buffer[sample_pos+x] = ((data >> (7-x)) & 1) ? WAVE_HIGH : WAVE_LOW;
}
sample_count+=8;
return sample_count;
}
static int pc6001_handle_cas(int16_t* buffer, const uint8_t* casdata)
{
int sample_count = 0;
int data_pos = 0;
while(sample_count < cas_size)
{
sample_count += pc6001_fill_wave(buffer,casdata[data_pos],sample_count);
data_pos++;
}
return sample_count;
}
/*******************************************************************
Calculate the number of samples needed for this tape image
********************************************************************/
static int pc6001_cas_to_wav_size (const uint8_t *casdata, int caslen)
{
cas_size = caslen*8;
return pc6001_handle_cas(nullptr,casdata);
}
/*******************************************************************
Generate samples for the tape image
********************************************************************/
static int pc6001_cas_fill_wave(int16_t *buffer, int sample_count, uint8_t *bytes)
{
return pc6001_handle_cas(buffer,bytes);
}
static const struct CassetteLegacyWaveFiller pc6001_legacy_fill_wave =
{
pc6001_cas_fill_wave, /* fill_wave */
-1, /* chunk_size */
0, /* chunk_samples */
pc6001_cas_to_wav_size, /* chunk_sample_calc */
8000, /* sample_frequency */
0, /* header_samples */
0 /* trailer_samples */
};
static cassette_image::error pc6001_cas_identify(cassette_image *cassette, struct CassetteOptions *opts)
{
return cassette_legacy_identify(cassette, opts, &pc6001_legacy_fill_wave);
}
static cassette_image::error pc6001_cas_load(cassette_image *cassette)
{
return cassette_legacy_construct(cassette, &pc6001_legacy_fill_wave);
}
static const struct CassetteFormat pc6001_cassette_format = {
"cas",
pc6001_cas_identify,
pc6001_cas_load,
nullptr
};
CASSETTE_FORMATLIST_START(pc6001_cassette_formats)
CASSETTE_FORMAT(pc6001_cassette_format)
CASSETTE_FORMATLIST_END