/* The cassette output signal for writing tapes is generated by a flip-flop which is toggled to produce the output waveform. Any access to the cassette I/O range, whether a read or a write, toggles this flip-flop. */ static void cassette_toggle_output(void) { static int cassette_output_flipflop = 0; cassette_output_flipflop = !cassette_output_flipflop; cassette_output(cassette_device_image(), cassette_output_flipflop ? 1.0 : -1.0); }
static READ8_HANDLER( ondra_keyboard_r ) { UINT8 retVal = 0x00; UINT8 ondra_keyboard_line = offset & 0x000f; static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" }; double valcas = cassette_input(cassette_device_image(space->machine())); if ( valcas < 0.00) { retVal = 0x80; } if (ondra_keyboard_line > 9) { retVal |= 0x1f; } else { retVal |= input_port_read(space->machine(), keynames[ondra_keyboard_line]); } return retVal; }
/* not called yet - this will update the via with the state of the tape data. This allows the via to trigger on bit changes and issue interrupts */ static void oric_refresh_tape(int dummy) { int data; int input_port_9; data = 0; if (cassette_input(cassette_device_image()) > 0.0038) data |= 1; /* "A simple cable to catch the vertical retrace signal ! This cable connects the video output for the television/monitor to the via cb1 input. Interrupts can be generated from the vertical sync, and flicker free games can be produced */ input_port_9 = readinputport(9); /* cable is enabled? */ if ((input_port_9 & 0x08)!=0) { /* return state of vsync */ data = input_port_9>>4; }
/* not called yet - this will update the via with the state of the tape data. This allows the via to trigger on bit changes and issue interrupts */ static TIMER_CALLBACK(oric_refresh_tape) { int data; int input_port_9; via6522_device *via_0 = machine.device<via6522_device>("via6522_0"); data = 0; if (cassette_input(cassette_device_image(machine)) > 0.0038) data |= 1; /* "A simple cable to catch the vertical retrace signal ! This cable connects the video output for the television/monitor to the via cb1 input. Interrupts can be generated from the vertical sync, and flicker free games can be produced */ input_port_9 = input_port_read(machine, "FLOPPY"); /* cable is enabled? */ if ((input_port_9 & 0x08)!=0) { /* return state of vsync */ data = input_port_9>>4; }
static TIMER_CALLBACK(sorcerer_cassette_tc) { sorcerer_state *state = machine.driver_data<sorcerer_state>(); UINT8 cass_ws = 0; switch (state->m_fe & 0xc0) /*/ bit 7 low indicates cassette */ { case 0x00: /* Cassette 300 baud */ /* loading a tape - this is basically the same as the super80. We convert the 1200/2400 Hz signal to a 0 or 1, and send it to the uart. */ state->m_cass_data.input.length++; cass_ws = ((cassette_device_image(machine))->input() > +0.02) ? 1 : 0; if (cass_ws != state->m_cass_data.input.level) { state->m_cass_data.input.level = cass_ws; state->m_cass_data.input.bit = ((state->m_cass_data.input.length < 0x6) || (state->m_cass_data.input.length > 0x20)) ? 1 : 0; state->m_cass_data.input.length = 0; ay31015_set_input_pin( state->m_uart, AY31015_SI, state->m_cass_data.input.bit ); } /* saving a tape - convert the serial stream from the uart, into 1200 and 2400 Hz frequencies. Synchronisation of the frequency pulses to the uart is extremely important. */ state->m_cass_data.output.length++; if (!(state->m_cass_data.output.length & 0x1f)) { cass_ws = ay31015_get_output_pin( state->m_uart, AY31015_SO ); if (cass_ws != state->m_cass_data.output.bit) { state->m_cass_data.output.bit = cass_ws; state->m_cass_data.output.length = 0; } } if (!(state->m_cass_data.output.length & 3)) { if (!((state->m_cass_data.output.bit == 0) && (state->m_cass_data.output.length & 4))) { state->m_cass_data.output.level ^= 1; // toggle output state, except on 2nd half of low bit cassette_device_image(machine)->output(state->m_cass_data.output.level ? -1.0 : +1.0); } } return; case 0x40: /* Cassette 1200 baud */ /* loading a tape */ state->m_cass_data.input.length++; cass_ws = ((cassette_device_image(machine))->input() > +0.02) ? 1 : 0; if (cass_ws != state->m_cass_data.input.level || state->m_cass_data.input.length == 10) { state->m_cass_data.input.bit = ((state->m_cass_data.input.length < 10) || (state->m_cass_data.input.length > 0x20)) ? 1 : 0; if ( cass_ws != state->m_cass_data.input.level ) { state->m_cass_data.input.length = 0; state->m_cass_data.input.level = cass_ws; } ay31015_set_input_pin( state->m_uart, AY31015_SI, state->m_cass_data.input.bit ); } /* saving a tape - convert the serial stream from the uart, into 600 and 1200 Hz frequencies. */ state->m_cass_data.output.length++; if (!(state->m_cass_data.output.length & 7)) { cass_ws = ay31015_get_output_pin( state->m_uart, AY31015_SO ); if (cass_ws != state->m_cass_data.output.bit) { state->m_cass_data.output.bit = cass_ws; state->m_cass_data.output.length = 0; } } if (!(state->m_cass_data.output.length & 7)) { if (!((state->m_cass_data.output.bit == 0) && (state->m_cass_data.output.length & 8))) { state->m_cass_data.output.level ^= 1; // toggle output state, except on 2nd half of low bit cassette_device_image(machine)->output(state->m_cass_data.output.level ? -1.0 : +1.0); } } return; } }
/* The cassette output signal for writing tapes is generated by a flip-flop which is toggled to produce the output waveform. Any access to the cassette I/O range, whether a read or a write, toggles this flip-flop. */ static void cassette_toggle_output(running_machine &machine) { apple1_state *state = machine.driver_data<apple1_state>(); state->m_cassette_output_flipflop = !state->m_cassette_output_flipflop; cassette_device_image(machine)->output(state->m_cassette_output_flipflop ? 1.0 : -1.0); }