1
0
mirror of https://git.code.sf.net/p/fuse-emulator/fuse-utils synced 2025-12-06 19:40:55 +03:00

Use the new encapsulated libspectrum_tape_block API.

Legacy-ID: 1488
This commit is contained in:
Philip Kendall
2003-07-17 13:44:04 +00:00
parent a8578a1b80
commit 7c531e00b2
2 changed files with 87 additions and 100 deletions

View File

@@ -188,7 +188,7 @@ parse_tape_file( const unsigned char *buffer, size_t length,
libspectrum_tape *tape;
GSList *block;
libspectrum_tape_block *tape_block;
libspectrum_tape_rom_block *rom_block;
libspectrum_byte *data;
libspectrum_word program_length;
int error;
@@ -202,43 +202,47 @@ parse_tape_file( const unsigned char *buffer, size_t length,
/* Find a ROM block */
tape_block = block->data;
if( tape_block->type != LIBSPECTRUM_TAPE_BLOCK_ROM ) continue;
if( libspectrum_tape_block_type( tape_block )
!= LIBSPECTRUM_TAPE_BLOCK_ROM ) continue;
/* Start assuming this block is a BASIC header; firstly, check
there is another block after this one to hold the data, and
if there's not, just finish */
if( !block->next ) break;
rom_block = &tape_block->types.rom;
/* If it's a header, it must be 19 bytes long */
if( rom_block->length != 19 ) continue;
if( libspectrum_tape_block_data_length( tape_block ) != 19 ) continue;
data = libspectrum_tape_block_data( tape_block );
/* The first byte should be zero to indicate a header */
if( rom_block->data[0] != 0 ) continue;
if( data[0] != 0 ) continue;
/* The second byte should be zero to indicate a BASIC program */
if( rom_block->data[1] != 0 ) continue;
if( data[1] != 0 ) continue;
/* The program length is stored at offset 16 */
program_length = rom_block->data[16] | rom_block->data[17] << 8;
program_length = data[16] | data[17] << 8;
/* Now have a look at the next block */
tape_block = block->next->data;
/* Must be a ROM block */
if( tape_block->type != LIBSPECTRUM_TAPE_BLOCK_ROM ) continue;
rom_block = &tape_block->types.rom;
if( libspectrum_tape_block_type( tape_block )
!= LIBSPECTRUM_TAPE_BLOCK_ROM ) continue;
/* Must be at least as long as the program */
if( rom_block->length < program_length ) continue;
if( libspectrum_tape_block_data_length( tape_block ) < program_length )
continue;
data = libspectrum_tape_block_data( tape_block );
/* Must be a data block */
if( rom_block->data[0] != 0xff ) continue;
if( data[0] != 0xff ) continue;
/* Now, just read the BASIC out */
error = extract_basic( 1, program_length + 1, read_tape_block, rom_block );
error = extract_basic( 1, program_length + 1, read_tape_block,
tape_block );
if( error ) { libspectrum_tape_free( tape ); return error; }
/* Don't parse this block again */
@@ -253,14 +257,14 @@ parse_tape_file( const unsigned char *buffer, size_t length,
libspectrum_byte
read_tape_block( libspectrum_word offset, void *data )
{
libspectrum_tape_rom_block *block = data;
libspectrum_tape_block *tape_block = data;
if( offset > block->length ) {
if( offset > libspectrum_tape_block_data_length( tape_block ) ) {
fprintf( stderr, "%s: attempt to read past end of block\n", progname );
exit( 1 );
}
return block->data[ offset ];
return libspectrum_tape_block_data( tape_block )[offset];
}
int

149
tzxlist.c
View File

@@ -115,127 +115,111 @@ process_tzx( char *filename )
libspectrum_tape_block *block = (libspectrum_tape_block*)ptr->data;
char description[ DESCRIPTION_LENGTH ];
libspectrum_tape_rom_block *rom_block;
libspectrum_tape_turbo_block *turbo_block;
libspectrum_tape_pure_tone_block *tone_block;
libspectrum_tape_pulses_block *pulses_block;
libspectrum_tape_pure_data_block *data_block;
libspectrum_tape_raw_data_block *raw_block;
libspectrum_tape_select_block *select_block;
libspectrum_tape_archive_info_block *info_block;
libspectrum_tape_hardware_block *hardware_block;
error =
libspectrum_tape_block_description( description, DESCRIPTION_LENGTH,
block );
if( error ) return 1;
printf( "Block type 0x%02x (%s)\n", block->type, description );
printf( "Block type 0x%02x (%s)\n", libspectrum_tape_block_type( block ),
description );
switch( libspectrum_tape_block_type( block ) ) {
switch( block->type ) {
case LIBSPECTRUM_TAPE_BLOCK_ROM:
rom_block = &(block->types.rom);
printf(" Data length: %ld bytes\n", (unsigned long)rom_block->length );
printf(" Pause length: %d ms\n", rom_block->pause );
printf(" Data length: %ld bytes\n",
(unsigned long)libspectrum_tape_block_data_length( block ) );
printf(" Pause length: %d ms\n",
libspectrum_tape_block_pause( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_TURBO:
turbo_block = &(block->types.turbo);
printf(" %ld pilot pulses of %d tstates\n",
(unsigned long)turbo_block->pilot_pulses,
turbo_block->pilot_length );
(unsigned long)libspectrum_tape_block_pilot_pulses( block ),
libspectrum_tape_block_pilot_length( block ) );
printf(" Sync pulses of %d and %d tstates\n",
turbo_block->sync1_length, turbo_block->sync2_length );
libspectrum_tape_block_sync1_length( block ),
libspectrum_tape_block_sync2_length( block ) );
/* Fall through */
case LIBSPECTRUM_TAPE_BLOCK_PURE_DATA:
printf(" Data bits are %d (reset) and %d (set) tstates\n",
turbo_block->bit0_length, turbo_block->bit1_length );
libspectrum_tape_block_bit0_length( block ),
libspectrum_tape_block_bit1_length( block ) );
printf(" Data length: %ld bytes (%ld bits in last byte used)\n",
(unsigned long)turbo_block->length,
(unsigned long)turbo_block->bits_in_last_byte );
printf(" Pause length: %d ms\n", turbo_block->pause );
(unsigned long)libspectrum_tape_block_data_length( block ),
(unsigned long)libspectrum_tape_block_bits_in_last_byte(block) );
printf(" Pause length: %d ms\n",
libspectrum_tape_block_pause( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_PURE_TONE:
tone_block = &(block->types.pure_tone);
printf(" %ld pulses of %ld tstates\n",
(unsigned long)tone_block->pulses,
(unsigned long)tone_block->length );
(unsigned long)libspectrum_tape_block_count( block ),
(unsigned long)libspectrum_tape_block_pulse_length( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_PULSES:
pulses_block = &(block->types.pulses);
for( i=0; i<pulses_block->count; i++ )
for( i=0; i < libspectrum_tape_block_count( block ); i++ )
printf(" Pulse %3ld: length %d tstates\n",
(unsigned long)i, pulses_block->lengths[i] );
break;
case LIBSPECTRUM_TAPE_BLOCK_PURE_DATA:
data_block = &(block->types.pure_data);
printf(" Data bits are %d (reset) and %d (set) tstates\n",
data_block->bit0_length, data_block->bit1_length );
printf(" Data length: %ld bytes (%ld bits in last byte used)\n",
(unsigned long)data_block->length,
(unsigned long)data_block->bits_in_last_byte );
printf(" Pause length: %d ms\n", data_block->pause );
(unsigned long)i,
libspectrum_tape_block_pulse_lengths( block, i ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_RAW_DATA:
raw_block = &(block->types.raw_data);
printf(" Length: %ld bytes\n", (unsigned long)raw_block->length );
printf(" Length: %ld bytes\n", (unsigned long)
libspectrum_tape_block_data_length( block ) );
printf(" Bits in last byte: %ld\n",
(unsigned long)raw_block->bits_in_last_byte );
printf(" Each bit is %d tstates\n", raw_block->bit_length );
printf(" Pause length: %d ms\n", raw_block->pause );
(unsigned long)libspectrum_tape_block_bits_in_last_byte(block) );
printf(" Each bit is %d tstates\n",
libspectrum_tape_block_bit_length( block ) );
printf(" Pause length: %d ms\n",
libspectrum_tape_block_pause( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_PAUSE:
printf(" Length: %d ms\n", block->types.pause.length );
printf(" Length: %d ms\n", libspectrum_tape_block_pause( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_GROUP_START:
printf(" Name: %s\n", block->types.group_start.name );
printf(" Name: %s\n", libspectrum_tape_block_text( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_GROUP_END:
/* Do nothing */
break;
case LIBSPECTRUM_TAPE_BLOCK_JUMP:
printf(" Offset: %d\n", block->types.jump.offset );
break;
case LIBSPECTRUM_TAPE_BLOCK_LOOP_START:
printf(" Count: %d\n", block->types.loop_start.count );
break;
case LIBSPECTRUM_TAPE_BLOCK_LOOP_END:
/* Do nothing */
break;
case LIBSPECTRUM_TAPE_BLOCK_SELECT:
select_block = &(block->types.select);
for( i=0; i<select_block->count; i++ ) {
printf(" Choice %2ld: Offset %d: %s\n", (unsigned long)i,
select_block->offsets[i], select_block->descriptions[i] );
}
break;
case LIBSPECTRUM_TAPE_BLOCK_STOP48:
/* Do nothing */
break;
case LIBSPECTRUM_TAPE_BLOCK_COMMENT:
printf(" Comment: %s\n", block->types.comment.text );
case LIBSPECTRUM_TAPE_BLOCK_JUMP:
printf(" Offset: %d\n", libspectrum_tape_block_offset( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_LOOP_START:
printf(" Count: %lu\n",
(unsigned long)libspectrum_tape_block_count( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_SELECT:
for( i = 0; i < libspectrum_tape_block_count( block ); i++ ) {
printf(" Choice %2ld: Offset %d: %s\n", (unsigned long)i,
libspectrum_tape_block_offsets( block, i ),
libspectrum_tape_block_texts( block, i ) );
}
break;
case LIBSPECTRUM_TAPE_BLOCK_MESSAGE:
printf(" Display for %d seconds\n", block->types.message.time );
printf(" Comment: %s\n", block->types.message.text );
printf(" Display for %d seconds\n",
libspectrum_tape_block_pause( block ) );
/* Fall through */
case LIBSPECTRUM_TAPE_BLOCK_COMMENT:
printf(" Comment: %s\n", libspectrum_tape_block_text( block ) );
break;
case LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO:
info_block = &(block->types.archive_info);
for( i=0; i<info_block->count; i++ ) {
for( i = 0; i < libspectrum_tape_block_count( block ); i++ ) {
printf(" ");
switch( info_block->ids[i] ) {
switch( libspectrum_tape_block_ids( block, i ) ) {
case 0: printf("Full Title:"); break;
case 1: printf(" Publisher:"); break;
case 2: printf(" Author:"); break;
@@ -248,19 +232,18 @@ process_tzx( char *filename )
case 255: printf(" Comment:"); break;
default: printf("(Unknown string): "); break;
}
printf(" %s\n", info_block->strings[i] );
printf(" %s\n", libspectrum_tape_block_texts( block, i ) );
}
break;
case LIBSPECTRUM_TAPE_BLOCK_HARDWARE:
hardware_block = &(block->types.hardware);
for( i=0; i<hardware_block->count; i++ ) {
for( i = 0; i < libspectrum_tape_block_count( block ); i++ ) {
printf( " %s: ",
hardware_desc( hardware_block->types[i],
hardware_block->ids[i]
hardware_desc( libspectrum_tape_block_types( block, i ),
libspectrum_tape_block_ids( block, i )
)
);
switch( hardware_block->values[i] ) {
switch( libspectrum_tape_block_values( block, i ) ) {
case 0: printf("runs"); break;
case 1: printf("runs, using hardware"); break;
case 2: printf("runs, does not use hardware"); break;
@@ -271,9 +254,9 @@ process_tzx( char *filename )
break;
case LIBSPECTRUM_TAPE_BLOCK_CUSTOM:
printf( " Description: %s\n", block->types.custom.description );
printf( " Description: %s\n", libspectrum_tape_block_text( block ) );
printf( " Length: %ld bytes\n",
(unsigned long)block->types.custom.length );
(unsigned long)libspectrum_tape_block_data_length( block ) );
break;
default: