diff options
Diffstat (limited to 'src/lib/formats/uef_cas.cpp')
-rw-r--r-- | src/lib/formats/uef_cas.cpp | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/src/lib/formats/uef_cas.cpp b/src/lib/formats/uef_cas.cpp index 78247887eb5..02f150915a7 100644 --- a/src/lib/formats/uef_cas.cpp +++ b/src/lib/formats/uef_cas.cpp @@ -17,13 +17,15 @@ the size of memory to alloc for the decoding. Not nice, but it works... */ +#include "uef_cas.h" +#include "imageutl.h" -#include <string.h> -#include <math.h> -#include <assert.h> +#include "multibyte.h" #include <zlib.h> -#include "uef_cas.h" + +#include <cmath> +#include <cstring> #define UEF_WAV_FREQUENCY 4800 @@ -64,7 +66,7 @@ static const uint8_t* skip_gz_header( const uint8_t *p ) { /* Skip the extra field */ if ( ( flags & EXTRA_FIELD ) != 0 ) { - int len = ( p[1] << 8 ) | p[0]; + int len = get_u16le( &p[0] ); p += 2 + len; } /* Skip the original file name */ @@ -94,13 +96,13 @@ static float get_uef_float( const uint8_t *Float) was the first byte read from the UEF, Float[1] the second, etc */ /* decode mantissa */ - Mantissa = Float[0] | (Float[1] << 8) | ((Float[2]&0x7f)|0x80) << 16; + Mantissa = get_u24le(&Float[0]) | 0x800000; Result = (float)Mantissa; Result = (float)ldexp(Result, -23); /* decode exponent */ - Exponent = ((Float[2]&0x80) >> 7) | (Float[3]&0x7f) << 1; + Exponent = (get_u16le(&Float[2])&0x7f80) >> 7; Exponent -= 127; Result = (float)ldexp(Result, Exponent); @@ -118,7 +120,7 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { if ( casdata[0] == 0x1f && casdata[1] == 0x8b ) { int err; z_stream d_stream; - int inflate_size = ( casdata[ caslen - 1 ] << 24 ) | ( casdata[ caslen - 2 ] << 16 ) | ( casdata[ caslen - 3 ] << 8 ) | casdata[ caslen - 4 ]; + int inflate_size = get_u32le( &casdata[ caslen - 4 ] ); const uint8_t *in_ptr = skip_gz_header( casdata ); if ( in_ptr == nullptr ) { @@ -166,8 +168,8 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { size = 0; pos = sizeof(UEF_HEADER) + 2; while( pos < caslen ) { - int chunk_type = ( casdata[pos+1] << 8 ) | casdata[pos]; - int chunk_length = ( casdata[pos+5] << 24 ) | ( casdata[pos+4] << 16 ) | ( casdata[pos+3] << 8 ) | casdata[pos+2]; + int chunk_type = get_u16le( &casdata[pos] ); + int chunk_length = get_u32le( &casdata[pos+2] ); int baud_length; pos += 6; @@ -187,14 +189,14 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { size += ( chunk_length * 10 ) * 4; break; case 0x0110: /* carrier tone (previously referred to as 'high tone') */ - baud_length = ( casdata[pos+1] << 8 ) | casdata[pos]; + baud_length = get_u16le( &casdata[pos] ); size += baud_length * 2; break; case 0x0111: LOG_FORMATS( "Unsupported chunk type: %04x\n", chunk_type ); break; case 0x0112: /* integer gap */ - baud_length = ( casdata[pos+1] << 8 ) | casdata[pos]; + baud_length = get_u16le( &casdata[pos] ); size += baud_length * 2 ; break; case 0x0116: /* floating point gap */ @@ -245,7 +247,7 @@ static int16_t* uef_cas_fill_bit( uint8_t loops, int16_t *buffer, bool bit ) return buffer; } -static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) +static int uef_cas_fill_wave( int16_t *buffer, int length, const uint8_t *bytes, int ) { if ( bytes[0] == 0x1f && bytes[1] == 0x8b ) { if ( gz_ptr == nullptr ) { @@ -259,19 +261,19 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) uint32_t pos = sizeof(UEF_HEADER) + 2; length = length / 2; while( length > 0 ) { - int chunk_type = ( bytes[pos+1] << 8 ) | bytes[pos]; - int chunk_length = ( bytes[pos+5] << 24 ) | ( bytes[pos+4] << 16 ) | ( bytes[pos+3] << 8 ) | bytes[pos+2]; + int chunk_type = get_u16le( &bytes[pos] ); + int chunk_length = get_u32le( &bytes[pos+2] ); - uint32_t baud_length, j; - uint8_t i, *c; + uint32_t baud_length; + const uint8_t *c; pos += 6; switch( chunk_type ) { case 0x0100: /* implicit start/stop bit data block */ case 0x0104: // used by atom dumps, looks like normal data - for( j = 0; j < chunk_length; j++ ) { + for( uint32_t j = 0; j < chunk_length; j++ ) { uint8_t byte = bytes[pos+j]; p = uef_cas_fill_bit( loops, p, 0 ); - for( i = 0; i < 8; i++ ) { + for( uint8_t i = 0; i < 8; i++ ) { p = uef_cas_fill_bit( loops, p, (byte >> i) & 1 ); } p = uef_cas_fill_bit( loops, p, 1 ); @@ -283,11 +285,10 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) LOG_FORMATS( "Unsupported chunk type: %04x\n", chunk_type ); break; case 0x0102: /* explicit tape data block */ - j = ( chunk_length * 10 ) - bytes[pos]; c = bytes + pos; - while( j ) { + for( uint32_t j = ( chunk_length * 10 ) - bytes[pos]; j; ) { uint8_t byte = *c; - for( i = 0; i < 8 && i < j; i++ ) { + for( uint8_t i = 0; i < 8 && i < j; i++ ) { p = uef_cas_fill_bit( loops, p, (byte >> i) & 1 ); j--; } @@ -295,27 +296,27 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) } break; case 0x0110: /* carrier tone (previously referred to as 'high tone') */ - for( baud_length = ( ( bytes[pos+1] << 8 ) | bytes[pos] ) ; baud_length; baud_length-- ) { + for( baud_length = get_u16le( &bytes[pos] ) ; baud_length; baud_length-- ) { *p = WAVE_LOW; p++; *p = WAVE_HIGH; p++; length -= 2; } break; case 0x0112: /* integer gap */ - for( baud_length = ( ( bytes[pos+1] << 8 ) | bytes[pos] ) ; baud_length; baud_length-- ) { + for( baud_length = get_u16le( &bytes[pos] ) ; baud_length; baud_length-- ) { *p = WAVE_NULL; p++; *p = WAVE_NULL; p++; length -= 2; } break; case 0x0116: /* floating point gap */ - for( baud_length = (get_uef_float(bytes+pos)*UEF_WAV_FREQUENCY); baud_length; baud_length-- ) { + for( baud_length = (get_uef_float(bytes + pos)*UEF_WAV_FREQUENCY); baud_length; baud_length-- ) { *p = WAVE_NULL; p++; length -= 1; } break; case 0x0117: /* change baud rate */ - baud_length = ( bytes[pos+1] << 8 ) | bytes[pos]; + baud_length = get_u16le( &bytes[pos] ); // These are the only supported numbers if (baud_length == 300) loops = 4; @@ -334,7 +335,7 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) return p - buffer; } -static const struct CassetteLegacyWaveFiller uef_legacy_fill_wave = { +static const cassette_image::LegacyWaveFiller uef_legacy_fill_wave = { uef_cas_fill_wave, /* fill_wave */ -1, /* chunk_size */ 0, /* chunk_samples */ @@ -344,21 +345,21 @@ static const struct CassetteLegacyWaveFiller uef_legacy_fill_wave = { 0 /* trailer_samples */ }; -static cassette_image::error uef_cassette_identify( cassette_image *cassette, struct CassetteOptions *opts ) { +static cassette_image::error uef_cassette_identify( cassette_image *cassette, cassette_image::Options *opts ) { uint8_t header[10]; - cassette_image_read(cassette, header, 0, sizeof(header)); + cassette->image_read(header, 0, sizeof(header)); if (memcmp(&header[0], GZ_HEADER, sizeof(GZ_HEADER)) && memcmp(&header[0], UEF_HEADER, sizeof(UEF_HEADER))) { return cassette_image::error::INVALID_IMAGE; } - return cassette_legacy_identify( cassette, opts, &uef_legacy_fill_wave ); + return cassette->legacy_identify( opts, &uef_legacy_fill_wave ); } static cassette_image::error uef_cassette_load( cassette_image *cassette ) { - return cassette_legacy_construct( cassette, &uef_legacy_fill_wave ); + return cassette->legacy_construct( &uef_legacy_fill_wave ); } -const struct CassetteFormat uef_cassette_format = { +const cassette_image::Format uef_cassette_format = { "uef", uef_cassette_identify, uef_cassette_load, |