// license:BSD-3-Clause // copyright-holders:Sean Young #include #include "formats/fmsx_cas.h" #define CAS_PERIOD (16) #define CAS_HEADER_PERIODS (4000) #define CAS_EMPTY_PERIODS (1000) static const uint8_t CasHeader[8] = { 0x1F,0xA6,0xDE,0xBA,0xCC,0x13,0x7D,0x74 }; static int cas_size; /******************************************************************* Calculate the number of samples needed for this tape image ********************************************************************/ static int fmsx_cas_to_wav_size (const uint8_t *casdata, int caslen) { int pos, size; if (caslen < 8) return -1; if (memcmp (casdata, CasHeader, sizeof (CasHeader) ) ) return -1; pos = size = 0; while (pos < caslen) { if ( (pos + 8) < caslen) if (!memcmp (casdata + pos, CasHeader, 8) ) { size += (CAS_EMPTY_PERIODS + CAS_HEADER_PERIODS) * CAS_PERIOD; pos += 8; continue; } size += CAS_PERIOD * 12; pos++; } cas_size = caslen; return size; } /******************************************************************* Generate samples for the tape image ********************************************************************/ static int fmsx_cas_fill_wave(int16_t *buffer, int sample_count, uint8_t *bytes) { int cas_pos, bit, state = 1, samples_pos, size, n, i, p; cas_pos = 0; samples_pos = 0; while (samples_pos < sample_count && cas_pos < cas_size) { /* Check if we need to output a header */ if ( cas_pos + 8 < cas_size ) { if ( ! memcmp( bytes + cas_pos, CasHeader, 8 ) ) { /* Write CAS_EMPTY_PERIODS of silence */ n = CAS_EMPTY_PERIODS * CAS_PERIOD; while (n--) buffer[samples_pos++] = 0; /* Write CAS_HEADER_PERIODS of header (high frequency) */ for (i=0;i