diff --git a/src/emu/sound/tms5110.c b/src/emu/sound/tms5110.c index 2d1c93cf745..8cedf281804 100644 --- a/src/emu/sound/tms5110.c +++ b/src/emu/sound/tms5110.c @@ -32,6 +32,9 @@ PROM OUT | 13 16 | NC VSS | 14 15 | M0 +-----------------+ + + T11: Sync for serial data out + M58817 @@ -85,6 +88,12 @@ #define TMS5110_IS_CD2802 TMS5110_IS_5110 #define TMS5110_IS_M58817 TMS5110_IS_5110 +/* States for CTL */ + +#define CTL_STATE_INPUT (0) +#define CTL_STATE_OUTPUT (1) +#define CTL_STATE_NEXT_OUTPUT (2) + struct tms5100_coeffs { int subtype; @@ -120,7 +129,7 @@ struct _tms5110_state UINT8 speaking_now; UINT8 speak_delay_frames; UINT8 talk_status; - UINT8 ignore_next_cmd; + UINT8 state; /* Rom interface */ UINT32 address; @@ -231,7 +240,7 @@ static void register_for_save_states(tms5110_state *tms) state_save_register_device_item(tms->device, 0, tms->speaking_now); state_save_register_device_item(tms->device, 0, tms->speak_delay_frames); state_save_register_device_item(tms->device, 0, tms->talk_status); - state_save_register_device_item(tms->device, 0, tms->ignore_next_cmd); + state_save_register_device_item(tms->device, 0, tms->state); state_save_register_device_item(tms->device, 0, tms->old_energy); state_save_register_device_item(tms->device, 0, tms->old_pitch); @@ -399,7 +408,7 @@ void tms5110_process(tms5110_state *tms, INT16 *buffer, unsigned int size) /* if the old frame was a stop frame, exit and do not process any more frames */ if (tms->old_energy == COEFF_ENERGY_SENTINEL) { - /*if (DEBUG_5110) logerror("processing frame: stop frame\n");*/ + if (DEBUG_5110) logerror("processing frame: stop frame\n"); tms->target_energy = tms->current_energy = 0; tms->speaking_now = tms->talk_status = 0; tms->interp_count = tms->sample_count = tms->pitch_count = 0; @@ -672,9 +681,17 @@ void tms5110_PDC_set(tms5110_state *tms, int data) tms->PDC = data & 0x1; if (tms->PDC == 0) /* toggling 1->0 processes command on CTL_pins */ { - if (tms->ignore_next_cmd) + /* first pdc toggles output, next toggles input */ + switch (tms->state) { - tms->ignore_next_cmd = FALSE; + case CTL_STATE_INPUT: + /* continue */ + break; + case CTL_STATE_NEXT_OUTPUT: + tms->state = CTL_STATE_OUTPUT; + return; + case CTL_STATE_OUTPUT: + tms->state = CTL_STATE_INPUT; return; } /* the only real commands we handle now are SPEAK and RESET */ @@ -718,10 +735,7 @@ void tms5110_PDC_set(tms5110_state *tms, int data) break; case TMS5110_CMD_TEST_TALK: - /* FIXME: status on CTL1 can only be read after this command - * to properly do radarscope, we need a separate m58817 status read. - */ - tms->ignore_next_cmd = TRUE; + tms->state = CTL_STATE_NEXT_OUTPUT; break; default: @@ -945,6 +959,8 @@ static DEVICE_START( tms5110 ) tms->M0_callback = speech_rom_read_bit; tms->set_load_address = speech_rom_set_addr; } + + tms->state = CTL_STATE_INPUT; /* most probably not defined */ register_for_save_states(tms); } @@ -1060,7 +1076,7 @@ WRITE8_DEVICE_HANDLER( tms5110_pdc_w ) /****************************************************************************** - tms5110_status_r -- read status from the sound chip + tms5110_ctl_r -- read status from the sound chip bit 0 = TS - Talk Status is active (high) when the VSP is processing speech data. Talk Status goes active at the initiation of a SPEAK command. @@ -1068,10 +1084,30 @@ WRITE8_DEVICE_HANDLER( tms5110_pdc_w ) immediately(?????? not TMS5110) by a RESET command. TMS5110 datasheets mention this is only available as a result of executing TEST TALK command. + + FIXME: data read not implemented, CTL1 only available after TALK command ******************************************************************************/ -READ8_DEVICE_HANDLER( tms5110_status_r ) +READ8_DEVICE_HANDLER( tms5110_ctl_r ) +{ + tms5110_state *tms = get_safe_token(device); + + /* bring up to date first */ + stream_update(tms->stream); + if (tms->state == CTL_STATE_OUTPUT) + { + //if (DEBUG_5110) logerror("Status read (status=%2d)\n", tms->talk_status); + return (tms->talk_status << 0); /*CTL1 = still talking ? */ + } + else + { + //if (DEBUG_5110) logerror("Status read (not in output mode)\n"); + return (0); + } +} + +READ8_DEVICE_HANDLER( m58817_status_r ) { tms5110_state *tms = get_safe_token(device); @@ -1080,6 +1116,8 @@ READ8_DEVICE_HANDLER( tms5110_status_r ) return (tms->talk_status << 0); /*CTL1 = still talking ? */ } +WRITE8_DEVICE_HANDLER( tms5110_ctl_w ); + /****************************************************************************** diff --git a/src/emu/sound/tms5110.h b/src/emu/sound/tms5110.h index 066c4ae704c..89199c302d3 100644 --- a/src/emu/sound/tms5110.h +++ b/src/emu/sound/tms5110.h @@ -26,9 +26,12 @@ struct _tms5110_interface }; WRITE8_DEVICE_HANDLER( tms5110_ctl_w ); +READ8_DEVICE_HANDLER( tms5110_ctl_r ); WRITE8_DEVICE_HANDLER( tms5110_pdc_w ); -READ8_DEVICE_HANDLER( tms5110_status_r ); +/* m58817 status line */ +READ8_DEVICE_HANDLER( m58817_status_r ); + int tms5110_ready_r(const device_config *device); void tms5110_set_frequency(const device_config *device, int frequency); diff --git a/src/mame/audio/dkong.c b/src/mame/audio/dkong.c index 209a73f281e..f765f6834eb 100644 --- a/src/mame/audio/dkong.c +++ b/src/mame/audio/dkong.c @@ -1287,7 +1287,7 @@ MACHINE_DRIVER_START( radarsc1_audio ) MDRV_LATCH8_ADD( "virtual_p1" ) /* virtual latch for port A */ MDRV_LATCH8_INVERT( 0x80 ) /* signal is inverted */ MDRV_LATCH8_DEVREAD(7, "ls259.6h", latch8_r, 3) - MDRV_LATCH8_DEVREAD(6, "tms", tms5110_status_r, 0) + MDRV_LATCH8_DEVREAD(6, "tms", m58817_status_r, 0) MDRV_SOUND_ADD("tms", M58817, XTAL_640kHz) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) diff --git a/src/mame/drivers/cvs.c b/src/mame/drivers/cvs.c index a87354d9dab..7b1b9b7a5dd 100644 --- a/src/mame/drivers/cvs.c +++ b/src/mame/drivers/cvs.c @@ -251,10 +251,11 @@ static INTERRUPT_GEN( cvs_main_cpu_interrupt ) } -static void cvs_dac_cpu_interrupt(running_machine *machine) +static void cvs_slave_cpu_interrupt(running_machine *machine, const char *cpu, int state) { - cpu_set_input_line_vector(cputag_get_cpu(machine, "audiocpu"), 0, 0x03); - cputag_set_input_line(machine, "audiocpu", 0, HOLD_LINE); + cpu_set_input_line_vector(cputag_get_cpu(machine, cpu), 0, 0x03); + //cputag_set_input_line(machine, cpu, 0, state ? ASSERT_LINE : CLEAR_LINE); + cputag_set_input_line(machine, cpu, 0, state ? HOLD_LINE : CLEAR_LINE); } @@ -326,6 +327,7 @@ static WRITE8_DEVICE_HANDLER( cvs_4_bit_dac_data_w ) { UINT8 dac_value; + //LOG(("4BIT: %02x %02x\n", offset, data)); cvs_4_bit_dac_data[offset] = data >> 7; /* merge into D0-D3 */ @@ -346,88 +348,53 @@ static WRITE8_DEVICE_HANDLER( cvs_4_bit_dac_data_w ) * *************************************/ -/* temporary code begin */ -static void speech_execute_command(const device_config *tms, UINT8 command) -{ - /* reset */ - if (command == 0x3f) - { - tms5110_ctl_w(tms, 0, TMS5110_CMD_RESET); - - tms5110_pdc_w(tms, 0,0); - tms5110_pdc_w(tms, 0,1); - tms5110_pdc_w(tms, 0,0); - - tms5110_pdc_w(tms, 0,0); - tms5110_pdc_w(tms, 0,1); - tms5110_pdc_w(tms, 0,0); - - tms5110_pdc_w(tms, 0,0); - tms5110_pdc_w(tms, 0,1); - tms5110_pdc_w(tms, 0,0); - - speech_rom_bit_address = 0; - } - /* start */ - else - { - tms5110_ctl_w(tms, 0, TMS5110_CMD_SPEAK); - - tms5110_pdc_w(tms, 0, 0); - tms5110_pdc_w(tms, 0, 1); - tms5110_pdc_w(tms, 0, 0); - - speech_rom_bit_address = command * 0x80 * 8; - } -} -/* temporary code end */ - static WRITE8_HANDLER( cvs_speech_rom_address_lo_w ) { /* assuming that d0-d2 are cleared here */ speech_rom_bit_address = (speech_rom_bit_address & 0xf800) | (data << 3); - LOG(("%04x : CVS: Speech Address = %04x\n", cpu_get_pc(space->cpu), speech_rom_bit_address >> 3)); + LOG(("%04x : CVS: Speech Lo %02x Address = %04x\n", cpu_get_pc(space->cpu), data, speech_rom_bit_address >> 3)); } static WRITE8_HANDLER( cvs_speech_rom_address_hi_w ) { speech_rom_bit_address = (speech_rom_bit_address & 0x07ff) | (data << 11); -} - - -static void cvs_set_speech_command_w(const address_space *space, UINT8 data) -{ - soundlatch2_w(space, 0, data & 0x7f); - if (~data & 0x40) LOG(("%04x : CVS: Speech Command W = %04x\n", cpu_get_pc(space->cpu), data & 0x7f)); + LOG(("%04x : CVS: Speech Hi %02x Address = %04x\n", cpu_get_pc(space->cpu), data, speech_rom_bit_address >> 3)); } static READ8_HANDLER( cvs_speech_command_r ) { - /* bit 7 is TMS status (active LO) */ - return (~tms5110_status_r(devtag_get_device(space->machine, "tms"), 0) << 7) | soundlatch2_r(space, 0); + /* FIXME: this was by observation on board ??? + * -bit 7 is TMS status (active LO) */ + return ((tms5110_ctl_r(devtag_get_device(space->machine, "tms"), 0) ^ 1) << 7) + | (soundlatch2_r(space, 0) & 0x7f); } static WRITE8_DEVICE_HANDLER( cvs_tms5110_ctl_w ) { UINT8 ctl; - + /* + * offset 0: CS ? + */ cvs_tms5110_ctl_data[offset] = (~data >> 7) & 0x01; ctl = 0 | /* CTL1 */ (cvs_tms5110_ctl_data[1] << 1) | /* CTL2 */ - 0 | /* CTL4 */ - (cvs_tms5110_ctl_data[0] << 3); /* CTL8 */ + (cvs_tms5110_ctl_data[2] << 2) | /* CTL4 */ + (cvs_tms5110_ctl_data[1] << 3); /* CTL8 */ - //tms5110_ctl_w(device, ctl); + LOG(("CVS: Speech CTL = %04x %02x %02x\n", ctl, offset, data)); + tms5110_ctl_w(device, 0, ctl); } static WRITE8_DEVICE_HANDLER( cvs_tms5110_pdc_w ) { - //tms5110_pdc_w(device, ~data >> 7); + UINT8 out = ((~data) >> 7) & 1; + LOG(("CVS: Speech PDC = %02x %02x\n", offset, out)); + tms5110_pdc_w(device, 0, out); } @@ -464,21 +431,11 @@ static const tms5110_interface tms5100_interface = static WRITE8_HANDLER( audio_command_w ) { + LOG(("data %02x\n", data)); /* cause interrupt on audio CPU if bit 7 set */ - if (data & 0x80) - { - soundlatch_w(space, 0, data); - cvs_dac_cpu_interrupt(space->machine); - - LOG(("%04x : CVS: Audio command = %02x\n", cpu_get_pc(space->cpu), data)); - } - - cvs_set_speech_command_w(space, data); - - /* temporary code begin */ - if ((data & 0x40) == 0) - speech_execute_command(devtag_get_device(space->machine, "tms"), data & 0x03f); - /* temporary code end */ + soundlatch2_w(space, 0, data); + soundlatch_w(space, 0, data); + cvs_slave_cpu_interrupt(space->machine, "audiocpu", data & 0x80 ? 1 : 0); } @@ -502,6 +459,9 @@ MACHINE_START( cvs ) gfx_element_set_source(machine->gfx[1], cvs_character_ram); start_393hz_timer(machine); + + soundlatch_setclearedvalue(machine, 0xff); + soundlatch2_clear_w(NULL, 0, 0); /* register state save */ state_save_register_global_pointer(machine, cvs_color_ram, 0x400); @@ -580,7 +540,7 @@ static ADDRESS_MAP_START( cvs_speech_cpu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x1d00, 0x1d00) AM_WRITE(cvs_speech_rom_address_lo_w) AM_RANGE(0x1d40, 0x1d40) AM_WRITE(cvs_speech_rom_address_hi_w) AM_RANGE(0x1d80, 0x1d80) AM_READ(cvs_speech_command_r) - AM_RANGE(0x1ddd, 0x1dde) AM_DEVWRITE("tms", cvs_tms5110_ctl_w) AM_BASE(&cvs_tms5110_ctl_data) + AM_RANGE(0x1ddc, 0x1dde) AM_DEVWRITE("tms", cvs_tms5110_ctl_w) AM_BASE(&cvs_tms5110_ctl_data) AM_RANGE(0x1ddf, 0x1ddf) AM_DEVWRITE("tms", cvs_tms5110_pdc_w) ADDRESS_MAP_END