You've already forked fuse-utils
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:
38
listbasic.c
38
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
|
||||
|
||||
149
tzxlist.c
149
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; 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:
|
||||
|
||||
Reference in New Issue
Block a user