From 7c531e00b2bb83c888ded7b5110ca11c7f5848b0 Mon Sep 17 00:00:00 2001 From: Philip Kendall Date: Thu, 17 Jul 2003 13:44:04 +0000 Subject: [PATCH] Use the new encapsulated libspectrum_tape_block API. Legacy-ID: 1488 --- listbasic.c | 38 ++++++++------ tzxlist.c | 149 +++++++++++++++++++++++----------------------------- 2 files changed, 87 insertions(+), 100 deletions(-) diff --git a/listbasic.c b/listbasic.c index e57bb86..26ad6a5 100644 --- a/listbasic.c +++ b/listbasic.c @@ -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 diff --git a/tzxlist.c b/tzxlist.c index b5fe598..7708102 100644 --- a/tzxlist.c +++ b/tzxlist.c @@ -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; icount; 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; icount; 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; icount; 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; icount; 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: