/* Called when a new block is started to initialise its internal state */ libspectrum_error libspectrum_tape_init_block( libspectrum_tape_block *block ) { switch( block->type ) { case LIBSPECTRUM_TAPE_BLOCK_ROM: return rom_init( &(block->types.rom) ); case LIBSPECTRUM_TAPE_BLOCK_TURBO: return turbo_init( &(block->types.turbo) ); case LIBSPECTRUM_TAPE_BLOCK_PURE_TONE: block->types.pure_tone.edge_count = block->types.pure_tone.pulses; break; case LIBSPECTRUM_TAPE_BLOCK_PULSES: block->types.pulses.edge_count = 0; break; case LIBSPECTRUM_TAPE_BLOCK_PURE_DATA: return pure_data_init( &(block->types.pure_data) ); /* These blocks need no initialisation */ case LIBSPECTRUM_TAPE_BLOCK_PAUSE: case LIBSPECTRUM_TAPE_BLOCK_GROUP_START: case LIBSPECTRUM_TAPE_BLOCK_GROUP_END: case LIBSPECTRUM_TAPE_BLOCK_JUMP: case LIBSPECTRUM_TAPE_BLOCK_LOOP_START: case LIBSPECTRUM_TAPE_BLOCK_LOOP_END: case LIBSPECTRUM_TAPE_BLOCK_SELECT: case LIBSPECTRUM_TAPE_BLOCK_STOP48: case LIBSPECTRUM_TAPE_BLOCK_COMMENT: case LIBSPECTRUM_TAPE_BLOCK_MESSAGE: case LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO: case LIBSPECTRUM_TAPE_BLOCK_HARDWARE: case LIBSPECTRUM_TAPE_BLOCK_CUSTOM: return LIBSPECTRUM_ERROR_NONE; default: libspectrum_print_error( "libspectrum_tape_init_block: unknown block type 0x%02x\n", block->type ); return LIBSPECTRUM_ERROR_LOGIC; } return LIBSPECTRUM_ERROR_NONE; }
/* Called when a new block is started to initialise its internal state */ libspectrum_error libspectrum_tape_block_init( libspectrum_tape_block *block, libspectrum_tape_block_state *state ) { if( !block ) return LIBSPECTRUM_ERROR_NONE; switch( libspectrum_tape_block_type( block ) ) { case LIBSPECTRUM_TAPE_BLOCK_ROM: return rom_init( &(block->types.rom), &(state->block_state.rom) ); case LIBSPECTRUM_TAPE_BLOCK_TURBO: return turbo_init( &(block->types.turbo), &(state->block_state.turbo) ); case LIBSPECTRUM_TAPE_BLOCK_PURE_TONE: state->block_state.pure_tone.edge_count = block->types.pure_tone.pulses; break; case LIBSPECTRUM_TAPE_BLOCK_PULSES: state->block_state.pulses.edge_count = 0; break; case LIBSPECTRUM_TAPE_BLOCK_PURE_DATA: return pure_data_init( &(block->types.pure_data), &(state->block_state.pure_data) ); case LIBSPECTRUM_TAPE_BLOCK_RAW_DATA: raw_data_init( &(block->types.raw_data), &(state->block_state.raw_data) ); return LIBSPECTRUM_ERROR_NONE; case LIBSPECTRUM_TAPE_BLOCK_GENERALISED_DATA: return generalised_data_init( &(block->types.generalised_data), &(state->block_state.generalised_data) ); case LIBSPECTRUM_TAPE_BLOCK_RLE_PULSE: state->block_state.rle_pulse.index = 0; return LIBSPECTRUM_ERROR_NONE; case LIBSPECTRUM_TAPE_BLOCK_PULSE_SEQUENCE: state->block_state.pulse_sequence.index = 0; state->block_state.pulse_sequence.pulse_count = 0; state->block_state.pulse_sequence.level = -1; return LIBSPECTRUM_ERROR_NONE; case LIBSPECTRUM_TAPE_BLOCK_DATA_BLOCK: return data_block_init( &(block->types.data_block), &(state->block_state.data_block) ); /* These blocks need no initialisation */ case LIBSPECTRUM_TAPE_BLOCK_PAUSE: case LIBSPECTRUM_TAPE_BLOCK_GROUP_START: case LIBSPECTRUM_TAPE_BLOCK_GROUP_END: case LIBSPECTRUM_TAPE_BLOCK_JUMP: case LIBSPECTRUM_TAPE_BLOCK_LOOP_START: case LIBSPECTRUM_TAPE_BLOCK_LOOP_END: case LIBSPECTRUM_TAPE_BLOCK_SELECT: case LIBSPECTRUM_TAPE_BLOCK_STOP48: case LIBSPECTRUM_TAPE_BLOCK_SET_SIGNAL_LEVEL: case LIBSPECTRUM_TAPE_BLOCK_COMMENT: case LIBSPECTRUM_TAPE_BLOCK_MESSAGE: case LIBSPECTRUM_TAPE_BLOCK_ARCHIVE_INFO: case LIBSPECTRUM_TAPE_BLOCK_HARDWARE: case LIBSPECTRUM_TAPE_BLOCK_CUSTOM: return LIBSPECTRUM_ERROR_NONE; default: libspectrum_print_error( LIBSPECTRUM_ERROR_LOGIC, "libspectrum_tape_init_block: unknown block type 0x%02x", block->type ); return LIBSPECTRUM_ERROR_LOGIC; } return LIBSPECTRUM_ERROR_NONE; }