@@ -804,31 +804,56 @@ static int cdt_cas_fill_wave( int16_t *buffer, int length, const uint8_t *bytes
804
804
return size;
805
805
}
806
806
807
- static int tap_cas_to_wav_size ( const uint8_t *casdata, int caslen )
807
+ static int tap_cas_to_wav_size (const uint8_t *casdata, int caslen)
808
808
{
809
+ /*
810
+ TAP Header:
811
+ | 0 | W | Length of Data Block (N) | -+
812
+ | 2 | B | Flag Byte | -+
813
+ | 3 | B*(N-2) | Data | | Data Block
814
+ | N+1 | B | XOR Checksum of [2..N] | -+
815
+ */
816
+
809
817
int size = 0 ;
810
818
const uint8_t *p = casdata;
811
819
812
- while (caslen > 0 )
820
+ while (caslen > 2 )
813
821
{
814
822
int data_size = get_u16le (&p[0 ]);
815
- int pilot_length = (p[ 2 ] == 0x00 ) ? 8063 : 3223 ;
816
- caslen -= data_size ;
817
- if (caslen < 0 )
823
+ p += 2 ;
824
+ caslen -= 2 ;
825
+ if (caslen < data_size )
818
826
{
819
- LOG_FORMATS (" tap_cas_to_wav_size: Requested 0x%X byte but only 0x%X available.\n " , data_size, data_size + caslen);
820
- data_size + = caslen;
827
+ LOG_FORMATS (" tap_cas_to_wav_size: Requested 0x%X bytes but only 0x%X available.\n " , data_size, caslen);
828
+ data_size = caslen;
821
829
}
830
+ caslen -= data_size;
831
+
832
+ // Data Block
822
833
LOG_FORMATS (" tap_cas_to_wav_size: Handling TAP block containing 0x%X bytes" , data_size);
823
- p += 2 ;
834
+ const int pilot_length = (p[ 0 ] == 0x00 ) ? 8063 : 3223 ;
824
835
size += tzx_cas_handle_block (nullptr , p, 1000 , data_size, 2168 , pilot_length, 667 , 735 , 855 , 1710 , 8 );
825
- LOG_FORMATS (" , total size is now: %d\n " , size);
836
+ LOG_FORMATS (" , total size is now: %d" , size);
837
+
838
+ // Validate Checksum
839
+ const uint8_t checksum = p[data_size - 1 ];
840
+ LOG_FORMATS (" , checksum 0x%X\n " , checksum);
841
+ uint8_t check = 0x00 ;
842
+ for (int i = 0 ; i < (data_size - 1 ); i++)
843
+ {
844
+ check ^= p[i];
845
+ }
846
+ if (check != checksum)
847
+ {
848
+ LOG_FORMATS (" tap_cas_to_wav_size: wrong checksum 0x%X\n " , check);
849
+ }
850
+
826
851
p += data_size;
827
852
}
828
853
return size;
829
854
}
830
855
831
- static int tap_cas_fill_wave ( int16_t *buffer, int length, const uint8_t *bytes )
856
+ static int tap_cas_fill_wave (int16_t *buffer, int length, const uint8_t *bytes)
832
857
{
833
858
int16_t *p = buffer;
834
859
int size = 0 ;
@@ -837,7 +862,9 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, const uint8_t *bytes
837
862
while (size < length)
838
863
{
839
864
int data_size = get_u16le (&bytes[0 ]);
840
- int pilot_length = (bytes[2 ] == 0x00 ) ? 8063 : 3223 ;
865
+ bytes += 2 ;
866
+
867
+ int pilot_length = (bytes[0 ] == 0x00 ) ? 8063 : 3223 ;
841
868
LOG_FORMATS (" tap_cas_fill_wave: Handling TAP block containing 0x%X bytes\n " , data_size);
842
869
/*
843
870
length -= data_size;
@@ -846,7 +873,6 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, const uint8_t *bytes
846
873
data_size += length; // Take as much as we can.
847
874
}
848
875
*/
849
- bytes += 2 ;
850
876
size += tzx_cas_handle_block (&p, bytes, 1000 , data_size, 2168 , pilot_length, 667 , 735 , 855 , 1710 , 8 );
851
877
bytes += data_size;
852
878
}
0 commit comments