static void cassette_update(mess_image *cassette) { struct mess_cassetteimg *tag; double cur_time; double new_position; cur_time = timer_get_time(); tag = get_cassimg(cassette); if (cassette_is_motor_on(cassette) && tag->cassette) { new_position = tag->position + (cur_time - tag->position_time); switch(tag->state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(tag->cassette, 0, tag->position, new_position - tag->position, tag->value); break; case CASSETTE_PLAY: cassette_get_sample(tag->cassette, 0, new_position, 0.0, &tag->value); break; } tag->position = new_position; } tag->position_time = cur_time; }
static void cassette_update(device_t *device) { dev_cassette_t *cassette = get_safe_token( device ); double cur_time = device->machine().time().as_double(); if (cassette_is_motor_on(device)) { double new_position = cassette->position + (cur_time - cassette->position_time); switch(cassette->state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(cassette->cassette, 0, cassette->position, new_position - cassette->position, cassette->value); break; case CASSETTE_PLAY: if ( cassette->cassette ) { cassette_get_sample(cassette->cassette, 0, new_position, 0.0, &cassette->value); /* See if reached end of tape */ double length = cassette_get_length(device); if (new_position > length) { cassette->state = (cassette_state)(( cassette->state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = length; } } break; } cassette->position = new_position; } cassette->position_time = cur_time; }
static cassette_image::error sc3000_bit_load(cassette_image *cassette) { cassette_image::error err; UINT64 image_size = cassette_image_size(cassette); UINT64 image_pos = 0; double time_index = 0.0; double time_displacement; UINT8 data; while (image_pos < image_size) { cassette_image_read(cassette, &data, image_pos, 1); switch (data) { case '1': MODULATE(1); break; case '0': MODULATE(0); break; case ' ': err = cassette_put_sample( cassette, 0, time_index, 1/1200.0, 0); if (err != cassette_image::error::SUCCESS) return err; time_index += 1/1200.0; break; } image_pos++; } return cassette_image::error::SUCCESS; }
// Store byte of data cassette_image::error coladam_put_byte(cassette_image *cass, int channel, double *time_index, int byte, int *prev_sign) { cassette_image::error err = cassette_image::error::SUCCESS; for (int i = 0; i < 8; i++) { if(byte & 0x80) { err = cassette_put_sample( cass, channel, *time_index, COL_ADAM_PERIOD1, -CASS_AMP*(*prev_sign) ); (*time_index) += COL_ADAM_PERIOD1; err = cassette_put_sample( cass, channel, *time_index, COL_ADAM_PERIOD2, CASS_AMP*(*prev_sign) ); (*time_index) += COL_ADAM_PERIOD2; } else { err = cassette_put_sample( cass, channel, *time_index, COL_ADAM_PERIOD, -CASS_AMP*(*prev_sign) ); (*prev_sign) *=-1; (*time_index) += COL_ADAM_PERIOD; } byte <<= 1; } return err; }
void cassette_image_device::update() { double cur_time = device().machine().time().as_double(); if (is_motor_on()) { double new_position = m_position + (cur_time - m_position_time)*m_speed*m_direction; switch(m_state & CASSETTE_MASK_UISTATE) { case CASSETTE_RECORD: cassette_put_sample(m_cassette, m_channel, m_position, new_position - m_position, m_value); break; case CASSETTE_PLAY: if ( m_cassette ) { cassette_get_sample(m_cassette, m_channel, new_position, 0.0, &m_value); /* See if reached end of tape */ double length = get_length(); if (new_position > length) { m_state = (cassette_state)(( m_state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = length; } else if (new_position < 0) { m_state = (cassette_state)(( m_state & ~CASSETTE_MASK_UISTATE ) | CASSETTE_STOPPED); new_position = 0; } } break; } m_position = new_position; } m_position_time = cur_time; }
static casserr_t cas_load(cassette_image *cassette, UINT8 silence) { casserr_t err; UINT64 offset; UINT64 image_size; UINT8 block[258]; /* 255 bytes per block + 3 (type, length, checksum) */ int block_length = 0; UINT8 last_blocktype; double time_index = 0.0; double time_displacement; static const UINT8 magic_bytes[2] = { 0x55, 0x3C }; #if 0 { static const UINT8 dummy_bytes[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x3C, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A }; time_index = 10.0; return cassette_put_modulated_data(cassette, 0, time_index, dummy_bytes, sizeof(dummy_bytes), &coco_cas_modulation, &time_displacement); } #endif err = cassette_put_sample(cassette, 0, time_index, COCO_WAVESAMPLES_HEADER, 0); if (err) return err; time_index += COCO_WAVESAMPLES_HEADER; offset = 0; last_blocktype = 0; image_size = cassette_image_size(cassette); /* try to find a block that we can untangle */ while(get_cas_block(cassette, &offset, block, &block_length)) { /* Forcing a silence before a filename block, improves the ability to load some */ /* copy protected Dragon games, e.g. Rommel's Revenge */ /* was the last block a filename block? */ if ((last_blocktype == 0) || (last_blocktype == 0xFF) || (block[0] == 0)) { /* silence */ err = cassette_put_sample(cassette, 0, time_index, silence, 0); if (err) return err; time_index += silence; /* sync data */ err = cassette_put_modulated_filler(cassette, 0, time_index, 0x55, 128, &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; } else if (synccount != 0) /* If we have multiple sync bytes in cas file, make sure they */ { /* are passed through */ /* sync data */ err = cassette_put_modulated_filler(cassette, 0, time_index, 0x55, synccount, &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; } /* now fill in the magic bytes */ err = cassette_put_modulated_data(cassette, 0, time_index, magic_bytes, sizeof(magic_bytes), &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; /* now fill in the block */ err = cassette_put_modulated_data(cassette, 0, time_index, block, block_length, &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; /* and the last magic byte */ err = cassette_put_modulated_filler(cassette, 0, time_index, 0x55, 1, &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; last_blocktype = block[0]; } /* all futher data is undecipherable, so output it verbatim */ err = cassette_read_modulated_data(cassette, 0, time_index, offset, image_size - offset, &coco_cas_modulation, &time_displacement); if (err) return err; time_index += time_displacement; return CASSETTE_ERROR_SUCCESS; }