From 5c3f7a9a6dca84dcde412941eecd67e27fa84a9a Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 4 Jul 2019 11:28:17 +1000 Subject: (nw) uef : added baudrate detection for atom. Needs much more to be done. --- src/lib/formats/uef_cas.cpp | 73 +++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/lib/formats/uef_cas.cpp b/src/lib/formats/uef_cas.cpp index d3b95022f9e..78247887eb5 100644 --- a/src/lib/formats/uef_cas.cpp +++ b/src/lib/formats/uef_cas.cpp @@ -54,8 +54,8 @@ static const uint8_t* skip_gz_header( const uint8_t *p ) { /* skip initial 1f 8b header */ p += 2; /* get method and flags */ - method = *p; p++; - flags = *p; p++; + method = *p++; + flags = *p++; if ( method != Z_DEFLATED || ( flags & RESERVED ) != 0 ) { return nullptr; } @@ -184,6 +184,7 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { break; case 0x0104: /* defined tape format data block */ LOG_FORMATS( "Unsupported chunk type: %04x\n", chunk_type ); + size += ( chunk_length * 10 ) * 4; break; case 0x0110: /* carrier tone (previously referred to as 'high tone') */ baud_length = ( casdata[pos+1] << 8 ) | casdata[pos]; @@ -222,25 +223,30 @@ cleanup: return -1; } -static int16_t* uef_cas_fill_bit( int16_t *buffer, int bit ) { - if ( bit ) { - *buffer = WAVE_LOW; buffer++; - *buffer = WAVE_HIGH; buffer++; - *buffer = WAVE_LOW; buffer++; - *buffer = WAVE_HIGH; buffer++; - } else { - *buffer = WAVE_LOW; buffer++; - *buffer = WAVE_LOW; buffer++; - *buffer = WAVE_HIGH; buffer++; - *buffer = WAVE_HIGH; buffer++; +static int16_t* uef_cas_fill_bit( uint8_t loops, int16_t *buffer, bool bit ) +{ + for (uint8_t i = 0; i < loops; i++) + { + if ( bit ) + { + *buffer++ = WAVE_LOW; + *buffer++ = WAVE_HIGH; + *buffer++ = WAVE_LOW; + *buffer++ = WAVE_HIGH; + } + else + { + *buffer++ = WAVE_LOW; + *buffer++ = WAVE_LOW; + *buffer++ = WAVE_HIGH; + *buffer++ = WAVE_HIGH; + } } return buffer; } -static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) { - int pos; - int16_t *p = buffer; - +static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) +{ if ( bytes[0] == 0x1f && bytes[1] == 0x8b ) { if ( gz_ptr == nullptr ) { return 1; @@ -248,25 +254,27 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) { bytes = gz_ptr; } - pos = sizeof(UEF_HEADER) + 2; + uint8_t loops = 1; + int16_t *p = buffer; + 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 baud_length, i, j; - uint8_t *c; + uint32_t baud_length, j; + uint8_t i, *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++ ) { uint8_t byte = bytes[pos+j]; - p = uef_cas_fill_bit( p, 0 ); + p = uef_cas_fill_bit( loops, p, 0 ); for( i = 0; i < 8; i++ ) { - p = uef_cas_fill_bit( p, byte & 1 ); - byte = byte >> 1; + p = uef_cas_fill_bit( loops, p, (byte >> i) & 1 ); } - p = uef_cas_fill_bit( p, 1 ); + p = uef_cas_fill_bit( loops, p, 1 ); length -= ( 10 * 4 ); } break; @@ -280,8 +288,7 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) { while( j ) { uint8_t byte = *c; for( i = 0; i < 8 && i < j; i++ ) { - p = uef_cas_fill_bit( p, byte & 1 ); - byte = byte >> 1; + p = uef_cas_fill_bit( loops, p, (byte >> i) & 1 ); j--; } c++; @@ -307,6 +314,20 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) { length -= 1; } break; + case 0x0117: /* change baud rate */ + baud_length = ( bytes[pos+1] << 8 ) | bytes[pos]; + // These are the only supported numbers + if (baud_length == 300) + loops = 4; + else + if (baud_length == 1200) + loops = 1; + else + printf("Unsupported baud rate = %d\n",baud_length); + length -= chunk_length; + break; + default: + length -= chunk_length; } pos += chunk_length; } -- cgit v1.2.3