static TIMER_CALLBACK(poly88_cassette_timer_callback) { poly88_state *state = machine.driver_data<poly88_state>(); int data; int current_level; // if (!(input_port_read(machine, "DSW0") & 0x02)) /* V.24 / Tape Switch */ //{ /* tape reading */ if (cassette_get_state(machine.device("cassette"))&CASSETTE_PLAY) { if (state->m_clk_level_tape) { state->m_previous_level = (cassette_input(machine.device("cassette")) > 0.038) ? 1 : 0; state->m_clk_level_tape = 0; } else { current_level = (cassette_input(machine.device("cassette")) > 0.038) ? 1 : 0; if (state->m_previous_level!=current_level) { data = (!state->m_previous_level && current_level) ? 1 : 0; //data = current_level; set_out_data_bit(state->m_cassette_serial_connection.State, data); serial_connection_out(machine, &state->m_cassette_serial_connection); msm8251_receive_clock(machine.device("uart")); state->m_clk_level_tape = 1; } } } /* tape writing */ if (cassette_get_state(machine.device("cassette"))&CASSETTE_RECORD) { data = get_in_data_bit(state->m_cassette_serial_connection.input_state); data ^= state->m_clk_level_tape; cassette_output(machine.device("cassette"), data&0x01 ? 1 : -1); if (!state->m_clk_level_tape) msm8251_transmit_clock(machine.device("uart")); state->m_clk_level_tape = state->m_clk_level_tape ? 0 : 1; return; } state->m_clk_level_tape = 1; if (!state->m_clk_level) msm8251_transmit_clock(machine.device("uart")); state->m_clk_level = state->m_clk_level ? 0 : 1; // } }
static void wave_sound_update(void *param,stream_sample_t **inputs, stream_sample_t **_buffer,int length) { #ifdef MESS const device_config *image; cassette_image *cassette; cassette_state state; double time_index; double duration; int num = ((FPTR)param) & ~WAVE_TOKEN_MASK; stream_sample_t *buffer = _buffer[0]; int i; image = image_from_devtype_and_index(IO_CASSETTE, num); state = cassette_get_state(image); state &= CASSETTE_MASK_UISTATE | CASSETTE_MASK_MOTOR | CASSETTE_MASK_SPEAKER; if (image_exists(image) && (ALWAYS_PLAY_SOUND || (state == (CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)))) { cassette = cassette_get_image(image); time_index = cassette_get_position(image); duration = ((double) length) / Machine->sample_rate; cassette_get_samples(cassette, 0, time_index, duration, length, 2, buffer, CASSETTE_WAVEFORM_16BIT); for (i = length-1; i >= 0; i--) buffer[i] = ((INT16 *) buffer)[i]; } else { memset(buffer, 0, sizeof(*buffer) * length); } #endif }
static int cassette_is_motor_on(mess_image *cassette) { cassette_state state; state = cassette_get_state(cassette); if ((state & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) return FALSE; if ((state & CASSETTE_MASK_MOTOR) != CASSETTE_MOTOR_ENABLED) return FALSE; return TRUE; }
/* display a small tape icon, with the current position in the tape image */ static void device_display_cassette(mess_image *image) { char buf[65]; float x, y; int n; double position, length; cassette_state uistate; /* abort if we should not be showing the image */ if (!image_exists(image)) return; if (!cassette_is_motor_on(image)) return; /* figure out where we are in the cassette */ position = cassette_get_position(image); length = cassette_get_length(image); uistate = cassette_get_state(image) & CASSETTE_MASK_UISTATE; /* choose a location on the screen */ x = 0.0f; y = image_index_in_device(image) * ui_get_line_height(); /* choose which frame of the animation we are at */ n = ((int) position / ANIMATION_FPS) % ANIMATION_FRAMES; /* character pairs 2-3, 4-5, 6-7, 8-9 form little tape cassette images */ snprintf(buf, sizeof(buf) / sizeof(buf[0]), "%c%c %c %02d:%02d (%04d) [%02d:%02d (%04d)]", n * 2 + 2, /* cassette icon left */ n * 2 + 3, /* cassette icon right */ (uistate == CASSETTE_PLAY) ? 16 : 14, /* play or record icon */ ((int) position / 60), ((int) position % 60), (int) position, ((int) length / 60), ((int) length % 60), (int) length); /* draw the cassette */ ui_draw_text_box(buf, JUSTIFY_LEFT, x, y, UI_FILLCOLOR); }
static STREAM_UPDATE( wave_sound_update ) { #ifdef MESS const device_config *image = param; cassette_image *cassette; cassette_state state; double time_index; double duration; stream_sample_t *left_buffer = outputs[0]; stream_sample_t *right_buffer = outputs[1]; int i; state = cassette_get_state(image); state &= CASSETTE_MASK_UISTATE | CASSETTE_MASK_MOTOR | CASSETTE_MASK_SPEAKER; if (image_exists(image) && (ALWAYS_PLAY_SOUND || (state == (CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)))) { cassette = cassette_get_image(image); time_index = cassette_get_position(image); duration = ((double) samples) / image->machine->sample_rate; cassette_get_samples(cassette, 0, time_index, duration, samples, 2, left_buffer, CASSETTE_WAVEFORM_16BIT); cassette_get_samples(cassette, 1, time_index, duration, samples, 2, right_buffer, CASSETTE_WAVEFORM_16BIT); for (i = samples - 1; i >= 0; i--) { left_buffer[i] = ((INT16 *) left_buffer)[i]; right_buffer[i] = ((INT16 *) right_buffer)[i]; } } else { memset(left_buffer, 0, sizeof(*left_buffer) * samples); memset(right_buffer, 0, sizeof(*right_buffer) * samples); } #endif }
/* display a small tape icon, with the current position in the tape image */ static DEVICE_IMAGE_DISPLAY(cassette) { device_t *device = &image.device(); char buf[65]; float x, y; int n; double position, length; cassette_state uistate; device_t *dev; static const UINT8 shapes[8] = { 0x2d, 0x5c, 0x7c, 0x2f, 0x2d, 0x20, 0x20, 0x20 }; /* abort if we should not be showing the image */ if (!image.exists()) return; if (!cassette_is_motor_on(device)) return; /* figure out where we are in the cassette */ position = cassette_get_position(device); length = cassette_get_length(device); uistate = (cassette_state)(cassette_get_state(device) & CASSETTE_MASK_UISTATE); /* choose a location on the screen */ x = 0.2f; y = 0.5f; dev = device->machine().m_devicelist.first(CASSETTE ); while ( dev && strcmp( dev->tag(), device->tag() ) ) { y += 1; dev = dev->typenext(); } y *= ui_get_line_height(device->machine()) + 2.0f * UI_BOX_TB_BORDER; /* choose which frame of the animation we are at */ n = ((int) position / ANIMATION_FPS) % ANIMATION_FRAMES; /* Since you can have anything in a BDF file, we will use crude ascii characters instead */ snprintf(buf, ARRAY_LENGTH(buf), "%c%c %c %02d:%02d (%04d) [%02d:%02d (%04d)]", #if 0 /* THE ANIMATION HASN'T WORKED SINCE 0.114 - LEFT HERE FOR REFERENCE */ /* NEVER SEEN THE PLAY / RECORD ICONS */ /* character pairs 2-3, 4-5, 6-7, 8-9 form little tape cassette images */ n * 2 + 2, /* cassette icon left */ n * 2 + 3, /* cassette icon right */ (uistate == CASSETTE_PLAY) ? 16 : 14, /* play or record icon */ #else shapes[n], /* cassette icon left */ shapes[n|4], /* cassette icon right */ (uistate == CASSETTE_PLAY) ? 0x50 : 0x52, /* play (P) or record (R) */ #endif ((int) position / 60), ((int) position % 60), (int) position, ((int) length / 60), ((int) length % 60), (int) length); /* draw the cassette */ ui_draw_text_box(&device->machine().render().ui_container(), buf, JUSTIFY_LEFT, x, y, UI_BACKGROUND_COLOR); }