More work on cvs.c

- use tms rom clock as sense input for the s2650. darkwar now speaks again on startup.
- only one latch used for sound & speech.
- hooked up 393Hz signal to "dac3"
- pcb pictures indicate discrete logic on the sound board. Marked all games as GAME_IMPERFECT_SOUND since we seem to miss some sounds.
- 4bit dac remains mysterious
This commit is contained in:
Couriersud 2009-09-19 00:46:26 +00:00
parent 611759686d
commit 92388c1e02

View File

@ -80,6 +80,14 @@ Driver by
Hardware Info Hardware Info
Malcolm & Darren Malcolm & Darren
Additional work
2009 Couriersud
Todo & FIXME:
- the board most probably has discrete circuits. The 393Hz tone used
for shots (superbike) and collisions (8ball) is just a guess.
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
@ -123,6 +131,8 @@ static UINT8 character_banking_mode;
static UINT16 character_ram_page_start; static UINT16 character_ram_page_start;
static UINT16 speech_rom_bit_address; static UINT16 speech_rom_bit_address;
static int dac3_state[4] = {0,0,0,0};
UINT8 cvs_get_character_banking_mode(void) UINT8 cvs_get_character_banking_mode(void)
@ -296,23 +306,30 @@ static READ8_HANDLER( cvs_input_r )
* Timing * Timing
* *
*************************************/ *************************************/
#if 0
static READ8_HANDLER( cvs_393hz_clock_r ) static READ8_HANDLER( cvs_393hz_clock_r )
{ {
return cvs_393hz_clock ? 0x80 : 0; return cvs_393hz_clock ? 0x80 : 0;
} }
#endif
static READ8_DEVICE_HANDLER( tms_clock_r )
{
return tms5110_romclk_r(device, 0) ? 0x80 : 0;
}
static TIMER_CALLBACK( cvs_393hz_timer_cb ) static TIMER_CALLBACK( cvs_393hz_timer_cb )
{ {
cvs_393hz_clock = !cvs_393hz_clock; cvs_393hz_clock = !cvs_393hz_clock;
if (dac3_state[2])
dac_w(devtag_get_device(machine, "dac3"), 0, cvs_393hz_clock * 0xff);
} }
static void start_393hz_timer(running_machine *machine) static void start_393hz_timer(running_machine *machine)
{ {
cvs_393hz_timer = timer_alloc(machine, cvs_393hz_timer_cb, NULL); cvs_393hz_timer = timer_alloc(machine, cvs_393hz_timer_cb, NULL);
timer_adjust_periodic(cvs_393hz_timer, ATTOTIME_IN_HZ(2*393), 0, ATTOTIME_IN_HZ(2*393)); timer_adjust_periodic(cvs_393hz_timer, ATTOTIME_IN_HZ(30*393), 0, ATTOTIME_IN_HZ(30*393));
} }
@ -326,8 +343,13 @@ static void start_393hz_timer(running_machine *machine)
static WRITE8_DEVICE_HANDLER( cvs_4_bit_dac_data_w ) static WRITE8_DEVICE_HANDLER( cvs_4_bit_dac_data_w )
{ {
UINT8 dac_value; UINT8 dac_value;
static int old_data[4] = {0,0,0,0};
//LOG(("4BIT: %02x %02x\n", offset, data)); if (data != old_data[offset])
{
LOG(("4BIT: %02x %02x\n", offset, data));
old_data[offset] = data;
}
cvs_4_bit_dac_data[offset] = data >> 7; cvs_4_bit_dac_data[offset] = data >> 7;
/* merge into D0-D3 */ /* merge into D0-D3 */
@ -340,7 +362,15 @@ static WRITE8_DEVICE_HANDLER( cvs_4_bit_dac_data_w )
dac_data_w(device, (dac_value << 4) | dac_value); dac_data_w(device, (dac_value << 4) | dac_value);
} }
static WRITE8_DEVICE_HANDLER( cvs_unknown_w )
{
if (data != dac3_state[offset])
{
LOG(("Unknown: %02x %02x\n", offset, data));
dac3_state[offset] = data;
}
}
/************************************* /*************************************
* *
@ -368,7 +398,7 @@ static READ8_HANDLER( cvs_speech_command_r )
/* FIXME: this was by observation on board ??? /* FIXME: this was by observation on board ???
* -bit 7 is TMS status (active LO) */ * -bit 7 is TMS status (active LO) */
return ((tms5110_ctl_r(devtag_get_device(space->machine, "tms"), 0) ^ 1) << 7) return ((tms5110_ctl_r(devtag_get_device(space->machine, "tms"), 0) ^ 1) << 7)
| (soundlatch2_r(space, 0) & 0x7f); | (soundlatch_r(space, 0) & 0x7f);
} }
@ -433,7 +463,7 @@ static WRITE8_HANDLER( audio_command_w )
{ {
LOG(("data %02x\n", data)); LOG(("data %02x\n", data));
/* cause interrupt on audio CPU if bit 7 set */ /* cause interrupt on audio CPU if bit 7 set */
soundlatch2_w(space, 0, data); //soundlatch2_w(space, 0, data);
soundlatch_w(space, 0, data); soundlatch_w(space, 0, data);
cvs_slave_cpu_interrupt(space->machine, "audiocpu", data & 0x80 ? 1 : 0); cvs_slave_cpu_interrupt(space->machine, "audiocpu", data & 0x80 ? 1 : 0);
} }
@ -460,9 +490,6 @@ MACHINE_START( cvs )
start_393hz_timer(machine); start_393hz_timer(machine);
soundlatch_setclearedvalue(machine, 0xff);
soundlatch2_clear_w(NULL, 0, 0);
/* register state save */ /* register state save */
state_save_register_global_pointer(machine, cvs_color_ram, 0x400); state_save_register_global_pointer(machine, cvs_color_ram, 0x400);
state_save_register_global_pointer(machine, cvs_palette_ram, 0x10); state_save_register_global_pointer(machine, cvs_palette_ram, 0x10);
@ -518,12 +545,13 @@ static ADDRESS_MAP_START( cvs_dac_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1800, 0x1800) AM_READ(soundlatch_r) AM_RANGE(0x1800, 0x1800) AM_READ(soundlatch_r)
AM_RANGE(0x1840, 0x1840) AM_DEVWRITE("dac1", dac_w) AM_RANGE(0x1840, 0x1840) AM_DEVWRITE("dac1", dac_w)
AM_RANGE(0x1880, 0x1883) AM_DEVWRITE("dac2", cvs_4_bit_dac_data_w) AM_BASE(&cvs_4_bit_dac_data) AM_RANGE(0x1880, 0x1883) AM_DEVWRITE("dac2", cvs_4_bit_dac_data_w) AM_BASE(&cvs_4_bit_dac_data)
AM_RANGE(0x1884, 0x1887) AM_WRITENOP /* not connected to anything */ AM_RANGE(0x1884, 0x1887) AM_DEVWRITE("dac3", cvs_unknown_w) /* ???? not connected to anything */
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( cvs_dac_cpu_io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( cvs_dac_cpu_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(cvs_393hz_clock_r) /* doesn't look like it is used at all */
//AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(cvs_393hz_clock_r)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -546,11 +574,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cvs_speech_cpu_io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( cvs_speech_cpu_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(cvs_393hz_clock_r) /* romclk is much more probable, 393 Hz results in timing issues */
// AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(cvs_393hz_clock_r)
AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_DEVREAD("tms", tms_clock_r)
ADDRESS_MAP_END ADDRESS_MAP_END
/************************************* /*************************************
* *
* Standard CVS port definitions * Standard CVS port definitions
@ -1014,6 +1043,9 @@ static MACHINE_DRIVER_START( cvs )
MDRV_SOUND_ADD("dac2", DAC, 0) MDRV_SOUND_ADD("dac2", DAC, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ADD("dac3", DAC, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ADD("tms", TMS5100, 640000) MDRV_SOUND_ADD("tms", TMS5100, 640000)
MDRV_SOUND_CONFIG(tms5100_interface) MDRV_SOUND_CONFIG(tms5100_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
@ -1601,24 +1633,24 @@ static DRIVER_INIT( raiders )
* *
*************************************/ *************************************/
GAME( 1981, cosmos, 0, cvs, cosmos, 0, ROT90, "Century Electronics", "Cosmos", GAME_NO_COCKTAIL ) GAME( 1981, cosmos, 0, cvs, cosmos, 0, ROT90, "Century Electronics", "Cosmos", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND )
GAME( 1981, darkwar, 0, cvs, darkwar, 0, ROT90, "Century Electronics", "Dark Warrior", GAME_NO_COCKTAIL ) GAME( 1981, darkwar, 0, cvs, darkwar, 0, ROT90, "Century Electronics", "Dark Warrior", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1981, spacefrt, 0, cvs, spacefrt, 0, ROT90, "Century Electronics", "Space Fortress (CVS)", GAME_NO_COCKTAIL ) GAME( 1981, spacefrt, 0, cvs, spacefrt, 0, ROT90, "Century Electronics", "Space Fortress (CVS)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND )
GAME( 1982, 8ball, 0, cvs, 8ball, 0, ROT90, "Century Electronics", "Video Eight Ball", GAME_NO_COCKTAIL ) GAME( 1982, 8ball, 0, cvs, 8ball, 0, ROT90, "Century Electronics", "Video Eight Ball", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, 8ball1, 8ball, cvs, 8ball, 0, ROT90, "Century Electronics", "Video Eight Ball (Rev.1)", GAME_NO_COCKTAIL ) GAME( 1982, 8ball1, 8ball, cvs, 8ball, 0, ROT90, "Century Electronics", "Video Eight Ball (Rev.1)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, logger, 0, cvs, logger, 0, ROT90, "Century Electronics", "Logger", GAME_NO_COCKTAIL ) GAME( 1982, logger, 0, cvs, logger, 0, ROT90, "Century Electronics", "Logger", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, dazzler, 0, cvs, dazzler, 0, ROT90, "Century Electronics", "Dazzler", GAME_NO_COCKTAIL ) GAME( 1982, dazzler, 0, cvs, dazzler, 0, ROT90, "Century Electronics", "Dazzler", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, wallst, 0, cvs, wallst, 0, ROT90, "Century Electronics", "Wall Street", GAME_NO_COCKTAIL ) GAME( 1982, wallst, 0, cvs, wallst, 0, ROT90, "Century Electronics", "Wall Street", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, radarzon, 0, cvs, radarzon, 0, ROT90, "Century Electronics", "Radar Zone", GAME_NO_COCKTAIL ) GAME( 1982, radarzon, 0, cvs, radarzon, 0, ROT90, "Century Electronics", "Radar Zone", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, radarzon1,radarzon, cvs, radarzon, 0, ROT90, "Century Electronics", "Radar Zone (Rev.1)", GAME_NO_COCKTAIL ) GAME( 1982, radarzon1,radarzon, cvs, radarzon, 0, ROT90, "Century Electronics", "Radar Zone (Rev.1)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, radarzont,radarzon, cvs, radarzon, 0, ROT90, "Century Electronics (Tuni Electro Service Inc)", "Radar Zone (Tuni)", GAME_NO_COCKTAIL ) GAME( 1982, radarzont,radarzon, cvs, radarzon, 0, ROT90, "Century Electronics (Tuni Electro Service Inc)", "Radar Zone (Tuni)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, outline, radarzon, cvs, radarzon, 0, ROT90, "Century Electronics", "Outline", GAME_NO_COCKTAIL ) GAME( 1982, outline, radarzon, cvs, radarzon, 0, ROT90, "Century Electronics", "Outline", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, goldbug, 0, cvs, goldbug, 0, ROT90, "Century Electronics", "Gold Bug", GAME_NO_COCKTAIL ) GAME( 1982, goldbug, 0, cvs, goldbug, 0, ROT90, "Century Electronics", "Gold Bug", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1982, diggerc, 0, cvs, diggerc, 0, ROT90, "Century Electronics", "Digger (CVS)", GAME_NO_COCKTAIL ) GAME( 1982, diggerc, 0, cvs, diggerc, 0, ROT90, "Century Electronics", "Digger (CVS)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, heartatk, 0, cvs, heartatk, 0, ROT90, "Century Electronics", "Heart Attack", GAME_NO_COCKTAIL ) GAME( 1983, heartatk, 0, cvs, heartatk, 0, ROT90, "Century Electronics", "Heart Attack", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, hunchbak, 0, cvs, hunchbak, 0, ROT90, "Century Electronics", "Hunchback (set 1)", GAME_NO_COCKTAIL ) GAME( 1983, hunchbak, 0, cvs, hunchbak, 0, ROT90, "Century Electronics", "Hunchback (set 1)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, hunchbaka,hunchbak, cvs, hunchbak, hunchbka, ROT90, "Century Electronics", "Hunchback (set 2)", GAME_NO_COCKTAIL ) GAME( 1983, hunchbaka,hunchbak, cvs, hunchbak, hunchbka, ROT90, "Century Electronics", "Hunchback (set 2)", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, superbik, 0, cvs, superbik, superbik, ROT90, "Century Electronics", "Superbike", GAME_NO_COCKTAIL ) GAME( 1983, superbik, 0, cvs, superbik, superbik, ROT90, "Century Electronics", "Superbike", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, raiders, 0, cvs, raiders, raiders, ROT90, "Century Electronics", "Raiders", GAME_NO_COCKTAIL ) GAME( 1983, raiders, 0, cvs, raiders, raiders, ROT90, "Century Electronics", "Raiders", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1983, hero, 0, cvs, hero, hero, ROT90, "Seatongrove Ltd", "Hero", GAME_NO_COCKTAIL ) GAME( 1983, hero, 0, cvs, hero, hero, ROT90, "Seatongrove Ltd", "Hero", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)
GAME( 1984, huncholy, 0, cvs, huncholy, huncholy, ROT90, "Seatongrove Ltd", "Hunchback Olympic", GAME_NO_COCKTAIL ) GAME( 1984, huncholy, 0, cvs, huncholy, huncholy, ROT90, "Seatongrove Ltd", "Hunchback Olympic", GAME_NO_COCKTAIL | GAME_IMPERFECT_SOUND)