summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/uef_cas.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/uef_cas.cpp')
-rw-r--r--src/lib/formats/uef_cas.cpp65
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,