Added a new cycle exact VMS interface to TMS5110 emulating M0, M1 and ADD1 to ADD8 lines. Added TMS6100 memory controller device. Also added TMSPROM device emulating bagman and ad2083 prom controlled speech logic. Switched bagman, ad2083 (scramble.c) and radarscp1 to use the new interface and devices. [Couriersud]

This commit is contained in:
Couriersud 2010-05-31 00:14:02 +00:00
parent 8b31d67163
commit 224c4a05ec
8 changed files with 664 additions and 196 deletions

View File

@ -117,6 +117,15 @@ struct _tms5110_state
/* external callback */
int (*M0_callback)(running_device *);
void (*set_load_address)(running_device *, int);
/* callbacks */
devcb_resolved_write_line m0_func; /* the M0 line */
devcb_resolved_write_line m1_func; /* the M1 line */
devcb_resolved_write8 addr_func; /* Write to ADD1,2,4,8 - 4 address bits */
devcb_resolved_read_line data_func; /* Read one bit from ADD8/Data - voice data */
devcb_resolved_write_line romclk_func; /* rom clock - Only used to drive the data lines */
running_device *device;
/* these contain data describing the current and previous voice frames */
@ -156,6 +165,57 @@ struct _tms5110_state
UINT8 romclk_hack_state;
};
#define TMS6100_READ_PENDING 0x01
#define TMS6100_NEXT_READ_IS_DUMMY 0x02
typedef struct _tms6100_state tms6100_state;
struct _tms6100_state
{
/* Rom interface */
UINT32 address;
UINT32 address_latch;
UINT8 loadptr;
UINT8 m0;
UINT8 m1;
UINT8 addr_bits;
UINT8 clock;
UINT8 data;
UINT8 state;
const UINT8 *rom;
running_device *device;
#if 0
const tms5110_interface *intf;
#endif
};
typedef struct _tmsprom_state tmsprom_state;
struct _tmsprom_state
{
/* Rom interface */
UINT32 address;
/* ctl lines */
UINT8 m0;
UINT8 enable;
UINT32 base_address;
UINT8 bit;
int prom_cnt;
int clock;
const UINT8 *rom;
const UINT8 *prom;
devcb_resolved_write_line pdc_func; /* tms pdc func */
devcb_resolved_write8 ctl_func; /* tms ctl func */
running_device *device;
emu_timer *romclk_timer;
const tmsprom_interface *intf;
};
/* Pull in the ROM tables */
#include "tms5110r.c"
@ -177,6 +237,22 @@ INLINE tms5110_state *get_safe_token(running_device *device)
return (tms5110_state *)device->token;
}
INLINE tms6100_state *get_safe_token_6100(running_device *device)
{
assert(device != NULL);
assert(device->token != NULL);
assert(device->type == TMS6100 ||
device->type == M58819);
return (tms6100_state *)device->token;
}
INLINE tmsprom_state *get_safe_token_prom(running_device *device)
{
assert(device != NULL);
assert(device->token != NULL);
assert(device->type == TMSPROM);
return (tmsprom_state *)device->token;
}
/* Static function prototypes */
static void tms5110_set_variant(tms5110_state *tms, int variant);
@ -209,6 +285,39 @@ void tms5110_set_variant(tms5110_state *tms, int variant)
tms->variant = variant;
}
static void new_int_write(tms5110_state *tms, UINT8 rc, UINT8 m0, UINT8 m1, UINT8 addr)
{
if (tms->m0_func.write)
devcb_call_write_line(&tms->m0_func, m0);
if (tms->m1_func.write)
devcb_call_write_line(&tms->m1_func, m1);
if (tms->addr_func.write)
devcb_call_write8(&tms->addr_func, 0, addr);
if (tms->romclk_func.write)
{
//printf("rc %d\n", rc);
devcb_call_write_line(&tms->romclk_func, rc);
}
}
static void new_int_write_addr(tms5110_state *tms, UINT8 addr)
{
new_int_write(tms, 1, 0, 1, addr);
new_int_write(tms, 0, 0, 1, addr);
new_int_write(tms, 1, 0, 0, addr);
new_int_write(tms, 0, 0, 0, addr);
}
static UINT8 new_int_read(tms5110_state *tms)
{
new_int_write(tms, 1, 1, 0, 0);
new_int_write(tms, 0, 1, 0, 0);
new_int_write(tms, 1, 0, 0, 0);
new_int_write(tms, 0, 0, 0, 0);
if (tms->data_func.read)
return devcb_call_read_line(&tms->data_func);
return 0;
}
static void register_for_save_states(tms5110_state *tms)
{
@ -310,7 +419,11 @@ int i;
FIFO_data_write(tms, data);
}
else
if (DEBUG_5110) logerror("-->ERROR: TMS5110 missing M0 callback function\n");
{
//if (DEBUG_5110) logerror("-->ERROR: TMS5110 missing M0 callback function\n");
UINT8 data = new_int_read(tms);
FIFO_data_write(tms, data);
}
}
}
@ -321,10 +434,16 @@ static void perform_dummy_read(tms5110_state *tms)
if (tms->M0_callback)
{
int data = (*tms->M0_callback)(tms->device);
if (DEBUG_5110) logerror("TMS5110 performing dummy read; value read = %1i\n", data&1);
if (DEBUG_5110) logerror("TMS5110 performing dummy read; value read = %1i\n", data&1);
}
else
{
int data = new_int_read(tms);
if (DEBUG_5110) logerror("TMS5110 performing dummy read; value read = %1i\n", data&1);
//if (DEBUG_5110) logerror("-->ERROR: TMS5110 missing M0 callback function\n");
}
else
if (DEBUG_5110) logerror("-->ERROR: TMS5110 missing M0 callback function\n");
tms->schedule_dummy_read = FALSE;
}
}
@ -685,6 +804,7 @@ void tms5110_PDC_set(tms5110_state *tms, int data)
tms->schedule_dummy_read = TRUE;
if (tms->set_load_address)
tms->set_load_address(tms->device, tms->address);
new_int_write_addr(tms, tms->CTL_pins & 0x0F);
}
else
{
@ -918,25 +1038,37 @@ static void speech_rom_set_addr(running_device *device, int addr)
******************************************************************************/
static DEVICE_START( tms5110 )
{
static const tms5110_interface dummy = { 0 };
static const tms5110_interface dummy = { NULL, NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL};
tms5110_state *tms = get_safe_token(device);
assert_always(tms != NULL, "Error creating TMS5110 chip");
assert_always(device->baseconfig().static_config != NULL, "No config");
tms->intf = device->baseconfig().static_config ? (const tms5110_interface *)device->baseconfig().static_config : &dummy;
tms->table = *device->region;
tms->device = device;
tms5110_set_variant(tms, TMS5110_IS_5110A);
assert_always(tms != NULL, "Error creating TMS5110 chip");
/* resolve lines */
devcb_resolve_write_line(&tms->m0_func, &tms->intf->m0_func, device);
devcb_resolve_write_line(&tms->m1_func, &tms->intf->m1_func, device);
devcb_resolve_write_line(&tms->romclk_func, &tms->intf->romclk_func, device);
devcb_resolve_write8(&tms->addr_func, &tms->intf->addr_func, device);
devcb_resolve_read_line(&tms->data_func, &tms->intf->data_func, device);
/* initialize a stream */
tms->stream = stream_create(device, 0, 1, device->clock / 80, tms, tms5110_update);
if (tms->table == NULL)
{
#if 0
assert_always(tms->intf->M0_callback != NULL, "Missing _mandatory_ 'M0_callback' function pointer in the TMS5110 interface\n This function is used by TMS5110 to call for a single bits\n needed to generate the speech\n Aborting startup...\n");
#endif
tms->M0_callback = tms->intf->M0_callback;
tms->set_load_address = tms->intf->load_address;
}
@ -1021,7 +1153,19 @@ static DEVICE_RESET( tms5110 )
memset(tms->x, 0, sizeof(tms->x));
tms->next_is_address = FALSE;
tms->address = 0;
tms->schedule_dummy_read = TRUE;
if (tms->table != NULL || tms->M0_callback != NULL)
{
/* legacy interface */
tms->schedule_dummy_read = TRUE;
}
else
{
/* no dummy read! This makes bagman and ad2083 speech fail
* with the new cycle and transition exact interfaces
*/
tms->schedule_dummy_read = FALSE;
}
tms->addr_bit = 0;
}
@ -1050,13 +1194,13 @@ WRITE8_DEVICE_HANDLER( tms5110_ctl_w )
******************************************************************************/
WRITE8_DEVICE_HANDLER( tms5110_pdc_w )
WRITE_LINE_DEVICE_HANDLER( tms5110_pdc_w )
{
tms5110_state *tms = get_safe_token(device);
/* bring up to date first */
stream_update(tms->stream);
tms5110_PDC_set(tms, data);
tms5110_PDC_set(tms, state);
}
@ -1193,9 +1337,290 @@ void tms5110_set_frequency(running_device *device, int frequency)
}
/******************************************************************************
DEVICE_START( tms6100 ) -- allocate buffers and reset the 6100
******************************************************************************/
static void register_for_save_states_6100(tms6100_state *tms)
{
state_save_register_device_item(tms->device, 0, tms->addr_bits);
state_save_register_device_item(tms->device, 0, tms->address);
state_save_register_device_item(tms->device, 0, tms->address_latch);
state_save_register_device_item(tms->device, 0, tms->data);
state_save_register_device_item(tms->device, 0, tms->loadptr);
state_save_register_device_item(tms->device, 0, tms->m0);
state_save_register_device_item(tms->device, 0, tms->m1);
state_save_register_device_item(tms->device, 0, tms->state);
}
static DEVICE_START( tms6100 )
{
//static const tms5110_interface dummy = { 0 };
tms6100_state *tms = get_safe_token_6100(device);
assert_always(tms != NULL, "Error creating TMS6100 chip");
//tms->intf = device->baseconfig().static_config ? (const tms5110_interface *)device->baseconfig().static_config : &dummy;
tms->rom = *device->region;
tms->device = device;
register_for_save_states_6100(tms);
}
static DEVICE_START( m58819 )
{
//tms6100_state *tms = get_safe_token_6100(device);
DEVICE_START_CALL( tms6100 );
//tms5110_set_variant(tms, TMS5110_IS_5100);
}
static DEVICE_RESET( tms6100 )
{
tms6100_state *tms = get_safe_token_6100(device);
/* initialize the chip */
tms->addr_bits = 0;
tms->address = 0;
tms->address_latch = 0;
tms->loadptr = 0;
tms->m0 = 0;
tms->m1 = 0;
tms->state = 0;
tms->clock = 0;
tms->data = 0;
}
WRITE_LINE_DEVICE_HANDLER( tms6100_m0_w )
{
tms6100_state *tms = get_safe_token_6100(device);
if (state != tms->m0)
tms->m0 = state;
}
WRITE_LINE_DEVICE_HANDLER( tms6100_m1_w )
{
tms6100_state *tms = get_safe_token_6100(device);
if (state != tms->m1)
tms->m1 = state;
}
WRITE_LINE_DEVICE_HANDLER( tms6100_romclock_w )
{
tms6100_state *tms = get_safe_token_6100(device);
/* process on falling edge */
if (tms->clock && !state)
{
switch ((tms->m1<<1) | tms->m0)
{
case 0x00:
/* NOP in datasheet, not really ... */
if (tms->state & TMS6100_READ_PENDING)
{
if (tms->state & TMS6100_NEXT_READ_IS_DUMMY)
{
tms->address = (tms->address_latch << 3);
tms->address_latch = 0;
tms->loadptr = 0;
tms->state &= ~TMS6100_NEXT_READ_IS_DUMMY;
printf("loaded address %08x\n", tms->address);
}
else
{
/* read bit at address */
tms->data = (tms->rom[tms->address >> 3] >> ((tms->address & 0x07) ^ 0x07)) & 1;
tms->address++;
}
tms->state &= ~TMS6100_READ_PENDING;
}
break;
case 0x01:
/* READ */
tms->state |= TMS6100_READ_PENDING;
break;
case 0x02:
/* LOAD ADDRESS */
tms->state |= TMS6100_NEXT_READ_IS_DUMMY;
tms->address_latch |= (tms->addr_bits << tms->loadptr);
printf("loaded address latch %08x\n", tms->address_latch);
tms->loadptr += 4;
break;
case 0x03:
/* READ AND BRANCH */
break;
}
}
tms->clock = state;
}
WRITE8_DEVICE_HANDLER( tms6100_addr_w )
{
tms6100_state *tms = get_safe_token_6100(device);
if (data != tms->addr_bits)
tms->addr_bits = data;
}
READ_LINE_DEVICE_HANDLER( tms6100_data_r )
{
tms6100_state *tms = get_safe_token_6100(device);
return tms->data;
}
/******************************************************************************
DEVICE_START( tmsprom ) -- allocate buffers initialize
******************************************************************************/
static void register_for_save_states_prom(tmsprom_state *tms)
{
state_save_register_device_item(tms->device, 0, tms->address);
state_save_register_device_item(tms->device, 0, tms->base_address);
state_save_register_device_item(tms->device, 0, tms->bit);
state_save_register_device_item(tms->device, 0, tms->enable);
state_save_register_device_item(tms->device, 0, tms->prom_cnt);
state_save_register_device_item(tms->device, 0, tms->m0);
}
static void update_prom_cnt(tmsprom_state *tms)
{
UINT8 prev_val = tms->prom[tms->prom_cnt] | 0x0200;
if (tms->enable && (prev_val & (1<<tms->intf->stop_bit)))
tms->prom_cnt |= 0x10;
else
tms->prom_cnt &= 0x0f;
}
static TIMER_CALLBACK( tmsprom_step )
{
running_device *device = (running_device *)ptr;
tmsprom_state *tms = get_safe_token_prom(device);
/* only 16 bytes needed ... The original dump is bad. This
* is what is needed to get speech to work. The prom data has
* been updated and marked as BAD_DUMP. The information below
* is given for reference once another dump should surface.
*
* static const int prom[16] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00,
* 0x02, 0x00, 0x40, 0x00, 0x04, 0x06, 0x04, 0x84 };
*/
UINT16 ctrl;
update_prom_cnt(tms);
ctrl = (tms->prom[tms->prom_cnt] | 0x200);
//printf("ctrl %04x, enable %d cnt %d\n", ctrl, tms->enable, tms->prom_cnt);
tms->prom_cnt = ((tms->prom_cnt + 1) & 0x0f) | (tms->prom_cnt & 0x10);
if (ctrl & (1 << tms->intf->reset_bit))
tms->address = 0;
devcb_call_write8(&tms->ctl_func, 0, BITSWAP8(ctrl,0,0,0,0,tms->intf->ctl8_bit,
tms->intf->ctl4_bit,tms->intf->ctl2_bit,tms->intf->ctl1_bit));
devcb_call_write_line(&tms->pdc_func, (ctrl >> tms->intf->pdc_bit) & 0x01);
}
static DEVICE_START( tmsprom )
{
tmsprom_state *tms = get_safe_token_prom(device);
assert_always(tms != NULL, "Error creating TMSPROM chip");
tms->intf = (const tmsprom_interface *) device->baseconfig().static_config;
assert_always(tms->intf != NULL, "Error creating TMSPROM chip: No configuration");
/* resolve lines */
devcb_resolve_write_line(&tms->pdc_func, &tms->intf->pdc_func, device);
devcb_resolve_write8(&tms->ctl_func, &tms->intf->ctl_func, device);
tms->rom = *device->region;
assert_always(tms->rom != NULL, "Error creating TMSPROM chip: No rom region found");
tms->prom = memory_region(device->machine, tms->intf->prom_region);
assert_always(tms->rom != NULL, "Error creating TMSPROM chip: No prom region found");
tms->device = device;
tms->clock = device->clock;
tms->romclk_timer = timer_alloc(device->machine, tmsprom_step, device);
timer_adjust_periodic(tms->romclk_timer, attotime_zero, 0, ATTOTIME_IN_HZ(tms->clock));
tms->bit = 0;
tms->base_address = 0;
tms->address = 0;
tms->enable = 0;
tms->m0 = 0;
tms->prom_cnt = 0;
register_for_save_states_prom(tms);
}
WRITE_LINE_DEVICE_HANDLER( tmsprom_m0_w )
{
tmsprom_state *tms = get_safe_token_prom(device);
/* falling edge counts */
if (tms->m0 && !state)
{
tms->address += 1;
tms->address &= (tms->intf->rom_size-1);
}
tms->m0 = state;
}
READ_LINE_DEVICE_HANDLER( tmsprom_data_r )
{
tmsprom_state *tms = get_safe_token_prom(device);
return (tms->rom[tms->base_address + tms->address] >> tms->bit) & 0x01;
}
WRITE8_DEVICE_HANDLER( tmsprom_rom_csq_w )
{
tmsprom_state *tms = get_safe_token_prom(device);
if (!data)
tms->base_address = offset * tms->intf->rom_size;
}
WRITE8_DEVICE_HANDLER( tmsprom_bit_w )
{
tmsprom_state *tms = get_safe_token_prom(device);
tms->bit = data;
}
WRITE_LINE_DEVICE_HANDLER( tmsprom_enable_w )
{
tmsprom_state *tms = get_safe_token_prom(device);
if (state != tms->enable)
{
tms->enable = state;
update_prom_cnt(tms);
/* the following is needed for ad2084.
* It is difficult to derive the actual connections from
* pcb pictures but the reset pin of the LS393 driving
* the prom address line is connected somewhere.
*
* This does not affect bagman. It just simulates that a
* write to ads3 is always happening when the four lower
* counter bits are 0!
*/
if (state)
tms->prom_cnt &= 0x10;
}
}
/*-------------------------------------------------
device definition
TMS 5110 device definition
-------------------------------------------------*/
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
@ -1235,3 +1660,37 @@ static const char DEVTEMPLATE_SOURCE[] = __FILE__;
#define DEVTEMPLATE_DERIVED_FEATURES DT_HAS_START
#define DEVTEMPLATE_DERIVED_NAME "M58817"
#include "devtempl.h"
/*-------------------------------------------------
TMS 6100 device definition
-------------------------------------------------*/
#undef DEVTEMPLATE_ID
#undef DEVTEMPLATE_NAME
#undef DEVTEMPLATE_FEATURES
#define DEVTEMPLATE_ID(p,s) p##tms6100##s
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET
#define DEVTEMPLATE_NAME "TMS6100"
#define DEVTEMPLATE_FAMILY "TI Speech"
#include "devtempl.h"
#define DEVTEMPLATE_DERIVED_ID(p,s) p##m58819##s
#define DEVTEMPLATE_DERIVED_FEATURES DT_HAS_START
#define DEVTEMPLATE_DERIVED_NAME "M58819"
#include "devtempl.h"
/*-------------------------------------------------
TMS PROM interface definition
-------------------------------------------------*/
#undef DEVTEMPLATE_ID
#undef DEVTEMPLATE_NAME
#undef DEVTEMPLATE_FEATURES
#define DEVTEMPLATE_ID(p,s) p##tmsprom##s
#define DEVTEMPLATE_FEATURES DT_HAS_START
#define DEVTEMPLATE_NAME "TMSPROM"
#define DEVTEMPLATE_FAMILY "TI Speech"
#include "devtempl.h"

View File

@ -28,18 +28,18 @@ struct _tms5110_interface
/* new rom controller interface */
devcb_write_line m0_func; /* the M0 line */
devcb_write_line m1_func; /* the M1 line */
devcb_write8 address_func; /* Write to ADD1,2,4,8 - 4 address bits */
devcb_write8 addr_func; /* Write to ADD1,2,4,8 - 4 address bits */
devcb_read_line data_func; /* Read one bit from ADD8/Data - voice data */
/* on a real chip rom_clk is running all the time
* Here, we only use it to properly emulate the protocol.
* Do not rely on it to be a timed signal.
*/
devcb_write_line rom_clk_func; /* rom_clk - Only used to drive the data lines */
devcb_write_line romclk_func; /* rom clock - Only used to drive the data lines */
};
WRITE8_DEVICE_HANDLER( tms5110_ctl_w );
READ8_DEVICE_HANDLER( tms5110_ctl_r );
WRITE8_DEVICE_HANDLER( tms5110_pdc_w );
WRITE_LINE_DEVICE_HANDLER( tms5110_pdc_w );
/* this is only used by cvs.c
* it is not related at all to the speech generation
@ -70,5 +70,50 @@ DEVICE_GET_INFO( m58817 );
#define SOUND_CD2802 DEVICE_GET_INFO_NAME( cd2802 )
#define SOUND_M58817 DEVICE_GET_INFO_NAME( m58817 )
/* TMS 6100 memory controller */
WRITE_LINE_DEVICE_HANDLER( tms6100_m0_w );
WRITE_LINE_DEVICE_HANDLER( tms6100_m1_w );
WRITE_LINE_DEVICE_HANDLER( tms6100_romclock_w );
WRITE8_DEVICE_HANDLER( tms6100_addr_w );
READ_LINE_DEVICE_HANDLER( tms6100_data_r );
DEVICE_GET_INFO( tms6100 );
DEVICE_GET_INFO( m58819 );
#define TMS6100 DEVICE_GET_INFO_NAME( tms6100 )
#define M58819 DEVICE_GET_INFO_NAME( m58819 )
/* PROM controlled TMS5110 interface */
typedef struct _tmsprom_interface tmsprom_interface;
struct _tmsprom_interface
{
const char *prom_region; /* prom memory region - sound region is automatically assigned */
UINT32 rom_size; /* individual rom_size */
UINT8 pdc_bit; /* bit # of pdc line */
/* virtual bit 8: constant 0, virtual bit 9:constant 1 */
UINT8 ctl1_bit; /* bit # of ctl1 line */
UINT8 ctl2_bit; /* bit # of ctl2 line */
UINT8 ctl4_bit; /* bit # of ctl4 line */
UINT8 ctl8_bit; /* bit # of ctl8 line */
UINT8 reset_bit; /* bit # of rom reset */
UINT8 stop_bit; /* bit # of stop */
devcb_write_line pdc_func; /* tms pdc func */
devcb_write8 ctl_func; /* tms ctl func */
};
WRITE_LINE_DEVICE_HANDLER( tmsprom_m0_w );
READ_LINE_DEVICE_HANDLER( tmsprom_data_r );
/* offset is rom # */
WRITE8_DEVICE_HANDLER( tmsprom_rom_csq_w );
WRITE8_DEVICE_HANDLER( tmsprom_bit_w );
WRITE_LINE_DEVICE_HANDLER( tmsprom_enable_w );
DEVICE_GET_INFO( tmsprom );
#define TMSPROM DEVICE_GET_INFO_NAME( tmsprom )
#endif /* __TMS5110_H__ */

View File

@ -1166,7 +1166,7 @@ Addresses found at @0x510, cpu2
static WRITE8_DEVICE_HANDLER( M58817_command_w )
{
tms5110_ctl_w(device, 0, data & 0x0f);
tms5110_pdc_w(device, 0, (data>>4) & 0x01);
tms5110_pdc_w(device, (data>>4) & 0x01);
/* FIXME 0x20 is CS */
}
@ -1295,6 +1295,15 @@ ADDRESS_MAP_END
static const nes_interface nes_interface_1 = { "n2a03a" };
static const nes_interface nes_interface_2 = { "n2a03b" };
const tms5110_interface tms_interface = {
NULL,
NULL,
DEVCB_DEVICE_LINE("m58819", tms6100_m0_w),
DEVCB_DEVICE_LINE("m58819", tms6100_m1_w),
DEVCB_DEVICE_HANDLER("m58819", tms6100_addr_w),
DEVCB_DEVICE_LINE("m58819", tms6100_data_r),
DEVCB_DEVICE_LINE("m58819", tms6100_romclock_w)
};
/*************************************
*
@ -1364,7 +1373,11 @@ MACHINE_DRIVER_START( radarscp1_audio )
MDRV_LATCH8_DEVREAD(7, "ls259.6h", latch8_r, 3)
MDRV_LATCH8_DEVREAD(6, "tms", m58817_status_r, 0)
/* tms memory controller */
MDRV_DEVICE_ADD("m58819", M58819, 0)
MDRV_SOUND_ADD("tms", M58817, XTAL_640kHz)
MDRV_DEVICE_CONFIG(tms_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END

View File

@ -210,6 +210,15 @@ void scramble_sh_init(running_machine *machine)
Q6 ==> Reset Counters (LS393)
Q7 ==> Trigger Logic
only 16 bytes needed ... The original dump is bad. This
is what is needed to get speech to work. The prom data has
been updated and marked as BAD_DUMP. The information below
is given for reference once another dump should surface.
static const int prom[16] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00,
0x02, 0x00, 0x40, 0x00, 0x04, 0x06, 0x04, 0x84 };
***************************************************************************/
/*
@ -236,91 +245,33 @@ void scramble_sh_init(running_machine *machine)
*
*/
static UINT32 speech_rom_address;
static UINT32 speech_rom_address_hi;
static UINT8 speech_rom_bit;
static UINT8 speech_cnt;
static TIMER_CALLBACK( ad2083_step )
{
running_device *tms = devtag_get_device(machine, "tms");
/* only 16 bytes needed ... The original dump is bad. This
* is what is needed to get speech to work. The prom data has
* been updated and marked as BAD_DUMP. The information below
* is given for reference once another dump should surface.
*
* static const int prom[16] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00,
* 0x02, 0x00, 0x40, 0x00, 0x04, 0x06, 0x04, 0x84 };
*/
UINT8 *prom = memory_region(machine, "5110ctrl");
UINT8 ctrl;
if (param == 0)
{
if (speech_cnt < 0x10)
{
/* Just reset and exit */
speech_cnt = 0;
return;
}
speech_cnt = 0;
}
ctrl = prom[speech_cnt++];
if (ctrl & 0x40)
speech_rom_address = 0;
tms5110_ctl_w(tms, 0, ctrl & 0x04 ? TMS5110_CMD_SPEAK : TMS5110_CMD_RESET);
tms5110_pdc_w(tms, 0, ctrl & 0x02 ? 0 : 1);
if (!(ctrl & 0x80))
timer_set(machine, ATTOTIME_IN_HZ(AD2083_TMS5110_CLOCK / 2),NULL,1,ad2083_step);
}
static int ad2083_speech_rom_read_bit(running_device *device)
{
UINT8 *ROM = memory_region(device->machine, "tms5110");
int bit;
speech_rom_address %= 4096;
bit = (ROM[speech_rom_address | speech_rom_address_hi] >> speech_rom_bit) & 1;
speech_rom_address++;
return bit;
}
static WRITE8_HANDLER( ad2083_tms5110_ctrl_w )
static WRITE8_DEVICE_HANDLER( ad2083_tms5110_ctrl_w )
{
static const int tbl[8] = {0,4,2,6,1,5,3,7};
speech_rom_bit = tbl[data & 0x07];
tmsprom_bit_w(device, 0, tbl[data & 0x07]);
switch (data>>3)
{
case 0x00:
logerror("Rom 0 select .. \n");
break;
case 0x01:
/* Rom 2 select */
speech_rom_address_hi = 0x1000;
break;
case 0x02:
logerror("Rom 1 select\n");
tmsprom_rom_csq_w(device, 1, 0);
break;
case 0x03:
tmsprom_rom_csq_w(device, 0, 0);
break;
case 0x00:
/* Rom 2 select */
logerror("Rom 2 select\n");
break;
case 0x02:
logerror("Rom 3 select .. \n");
/* Rom 3 select */
speech_rom_address_hi = 0x0000;
break;
}
timer_set(space->machine, attotime_zero,NULL,0,ad2083_step);
/* most likely triggered by write access */
tmsprom_enable_w(device, 0);
tmsprom_enable_w(device, 1);
}
static const tms5110_interface ad2083_tms5110_interface =
{
ad2083_speech_rom_read_bit /* M0 callback function. Called whenever chip requests a single bit of data */
};
static const ay8910_interface ad2083_ay8910_interface_1 =
{
@ -349,7 +300,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( ad2083_sound_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x01, 0x01) AM_WRITE(ad2083_tms5110_ctrl_w)
AM_RANGE(0x01, 0x01) AM_DEVWRITE("tmsprom", ad2083_tms5110_ctrl_w)
AM_RANGE(0x10, 0x10) AM_DEVWRITE("ay1", ay8910_address_w)
AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w)
AM_RANGE(0x40, 0x40) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w)
@ -358,23 +309,48 @@ ADDRESS_MAP_END
static SOUND_START( ad2083 )
{
speech_rom_address = 0;
speech_rom_address_hi = 0;
speech_rom_bit = 0;
speech_cnt = 0x10;
state_save_register_global(machine, speech_rom_address);
state_save_register_global(machine, speech_rom_address_hi);
state_save_register_global(machine, speech_rom_bit);
state_save_register_global(machine, speech_cnt);
}
static const tmsprom_interface prom_intf =
{
"5110ctrl", /* prom memory region - sound region is automatically assigned */
0x1000, /* individual rom_size */
1, /* bit # of pdc line */
/* virtual bit 8: constant 0, virtual bit 9:constant 1 */
8, /* bit # of ctl1 line */
2, /* bit # of ctl2 line */
8, /* bit # of ctl4 line */
2, /* bit # of ctl8 line */
6, /* bit # of rom reset */
7, /* bit # of stop */
DEVCB_DEVICE_LINE("tms", tms5110_pdc_w), /* tms pdc func */
DEVCB_DEVICE_HANDLER("tms", tms5110_ctl_w) /* tms ctl func */
};
static const tms5110_interface ad2083_tms5110_interface =
{
/* legacy interface */
NULL, /* function to be called when chip requests another bit */
NULL, /* speech ROM load address callback */
/* new rom controller interface */
DEVCB_DEVICE_LINE("tmsprom", tmsprom_m0_w), /* the M0 line */
DEVCB_NULL, /* the M1 line */
DEVCB_NULL, /* Write to ADD1,2,4,8 - 4 address bits */
DEVCB_DEVICE_LINE("tmsprom", tmsprom_data_r), /* Read one bit from ADD8/Data - voice data */
DEVCB_NULL /* rom clock - Only used to drive the data lines */
};
MACHINE_DRIVER_START( ad2083_audio )
MDRV_CPU_ADD("audiocpu", Z80, 14318000/8) /* 1.78975 MHz */
MDRV_CPU_PROGRAM_MAP(ad2083_sound_map)
MDRV_CPU_IO_MAP(ad2083_sound_io_map)
MDRV_DEVICE_ADD("tmsprom", TMSPROM, AD2083_TMS5110_CLOCK / 2) /* rom clock */
MDRV_DEVICE_CONFIG(prom_intf)
MDRV_SOUND_START(ad2083)
MDRV_SPEAKER_STANDARD_MONO("mono")

View File

@ -67,99 +67,35 @@ DIP locations verified for:
#include "includes/bagman.h"
static int speech_rom_address = 0;
//static int speech_rom_address = 0;
static UINT8 ls259_buf[8] = {0,0,0,0,0,0,0,0};
static void start_talking (running_device *tms)
static WRITE8_DEVICE_HANDLER( bagman_ls259_w )
{
speech_rom_address = 0x0;
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);
}
static void reset_talking (running_device *tms)
{
/*To be extremely accurate there should be a delays between each of
the function calls below. In real they happen with the frequency of 160 kHz.
*/
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_address = 0x0;
}
static int bagman_speech_rom_read_bit(running_device *device)
{
UINT8 *ROM = memory_region(device->machine, "speech");
int bit_no = (ls259_buf[0]<<2) | (ls259_buf[1]<<1) | (ls259_buf[2]<<0);
int byte = 0;
#if 0
if ( (ls259_buf[4] == 0) && (ls259_buf[5] == 0) )
logerror("readbit: BAD SPEECH ROM SELECT (both enabled)\n");
if ( (ls259_buf[4] == 1) && (ls259_buf[5] == 1) )
logerror("readbit: BAD SPEECH ROM SELECT (both disabled)\n");
#endif
if (ls259_buf[4]==0) /*ROM 11 chip enable*/
{
byte |= ROM[ speech_rom_address + 0x0000 ];
}
if (ls259_buf[5]==0) /*ROM 12 chip enable*/
{
byte |= ROM[ speech_rom_address + 0x1000 ]; /*0x1000 is because both roms are loaded in one memory region*/
}
speech_rom_address++;
speech_rom_address &= 0x0fff;
return (byte>>(bit_no^0x7)) & 1;
}
#if 0
static READ8_HANDLER( bagman_ls259_r )
{
return ls259_buf[offset];
}
#endif
static WRITE8_HANDLER( bagman_ls259_w )
{
bagman_pal16r6_w(space,offset,data); /*this is just a simulation*/
bagman_pal16r6_w(NULL /*space*/,offset,data); /*this is just a simulation*/
if (ls259_buf[offset] != (data&1) )
{
ls259_buf[offset] = data&1;
if (offset==3)
switch (offset)
{
running_device *tms = devtag_get_device(space->machine, "tms");
if (ls259_buf[3] == 0) /* 1->0 transition */
{
reset_talking(tms);
}
else
{
start_talking(tms); /* 0->1 transition */
}
case 0:
case 1:
case 2:
tmsprom_bit_w(device, 0, (ls259_buf[0]<<2) | (ls259_buf[1]<<1) | (ls259_buf[2]<<0));
break;
case 3:
tmsprom_enable_w(device, ls259_buf[offset]);
break;
case 4:
tmsprom_rom_csq_w(device, 0, ls259_buf[offset]);
break;
case 5:
tmsprom_rom_csq_w(device, 1, ls259_buf[offset]);
break;
}
}
}
@ -184,7 +120,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) /* hidden portion of color RAM */
/* here only to initialize the pointer, */
/* writes are handled by bagman_colorram_w */
AM_RANGE(0xa800, 0xa805) AM_WRITE(bagman_ls259_w) /* TMS5110 driving state machine */
AM_RANGE(0xa800, 0xa805) AM_DEVWRITE("tmsprom", bagman_ls259_w) /* TMS5110 driving state machine */
AM_RANGE(0xa004, 0xa004) AM_WRITE(bagman_coin_counter_w)
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW")
AM_RANGE(0xb800, 0xb800) AM_READNOP
@ -495,9 +431,33 @@ static const ay8910_interface ay8910_interface_2 =
DEVCB_NULL
};
static const tmsprom_interface prom_intf =
{
"5110ctrl", /* prom memory region - sound region is automatically assigned */
0x1000, /* individual rom_size */
1, /* bit # of pdc line */
/* virtual bit 8: constant 0, virtual bit 9:constant 1 */
8, /* bit # of ctl1 line */
2, /* bit # of ctl2 line */
8, /* bit # of ctl4 line */
2, /* bit # of ctl8 line */
6, /* bit # of rom reset */
7, /* bit # of stop */
DEVCB_DEVICE_LINE("tms", tms5110_pdc_w), /* tms pdc func */
DEVCB_DEVICE_HANDLER("tms", tms5110_ctl_w) /* tms ctl func */
};
static const tms5110_interface bagman_tms5110_interface =
{
bagman_speech_rom_read_bit /*M0 callback function. Called whenever chip requests a single bit of data*/
/* legacy interface */
NULL, /* function to be called when chip requests another bit */
NULL, /* speech ROM load address callback */
/* new rom controller interface */
DEVCB_DEVICE_LINE("tmsprom", tmsprom_m0_w), /* the M0 line */
DEVCB_NULL, /* the M1 line */
DEVCB_NULL, /* Write to ADD1,2,4,8 - 4 address bits */
DEVCB_DEVICE_LINE("tmsprom", tmsprom_data_r), /* Read one bit from ADD8/Data - voice data */
DEVCB_NULL /* rom clock - Only used to drive the data lines */
};
static MACHINE_DRIVER_START( bagman )
@ -524,6 +484,9 @@ static MACHINE_DRIVER_START( bagman )
MDRV_VIDEO_START(bagman)
MDRV_VIDEO_UPDATE(bagman)
MDRV_DEVICE_ADD("tmsprom", TMSPROM, 640000 / 2) /* rom clock */
MDRV_DEVICE_CONFIG(prom_intf)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
@ -661,9 +624,11 @@ ROM_START( bagman )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "r9_b11.bin", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "t9_b12.bin", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -688,9 +653,11 @@ ROM_START( bagnard )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "r9_b11.bin", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "t9_b12.bin", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -715,9 +682,11 @@ ROM_START( bagnarda )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "r9_b11.bin", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "t9_b12.bin", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -744,7 +713,7 @@ ROM_START( bagmans )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "r9_b11.bin", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "t9_b12.bin", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -769,9 +738,11 @@ ROM_START( bagmans2 )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "r9_b11.bin", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "t9_b12.bin", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -808,9 +779,11 @@ ROM_START( sbagman )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "11.9r", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "12.9t", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END
@ -845,9 +818,11 @@ ROM_START( sbagmans )
ROM_REGION( 0x0060, "proms", 0 )
ROM_LOAD( "p3.bin", 0x0000, 0x0020, CRC(2a855523) SHA1(91e032233fee397c90b7c1662934aca9e0671482) )
ROM_LOAD( "r3.bin", 0x0020, 0x0020, CRC(ae6f1019) SHA1(fd711882b670380cb4bd909c840ba06277b8fbe3) )
ROM_LOAD( "r6.bin", 0x0040, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "speech", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x0060, "5110ctrl", 0)
ROM_LOAD( "r6.bin", 0x0000, 0x0020, CRC(c58a4f6a) SHA1(35ef244b3e94032df2610aa594ea5670b91e1449) ) /*state machine driving TMS5110*/
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "11.9r", 0x0000, 0x1000, CRC(2e0057ff) SHA1(33e3ffa6418f86864eb81e5e9bda4bf540c143a6) )
ROM_LOAD( "12.9t", 0x1000, 0x1000, CRC(b2120edd) SHA1(52b89dbcc749b084331fa82b13d0876e911fce52) )
ROM_END

View File

@ -433,7 +433,7 @@ static WRITE8_DEVICE_HANDLER( cvs_tms5110_pdc_w )
{
UINT8 out = ((~data) >> 7) & 1;
LOG(("CVS: Speech PDC = %02x %02x\n", offset, out));
tms5110_pdc_w(device, 0, out);
tms5110_pdc_w(device, out);
}

View File

@ -1824,7 +1824,7 @@ ROM_START( radarscp1 )
ROM_RELOAD( 0x0800, 0x0800 )
ROM_FILL( 0x1000, 0x0800, 0xFF )
ROM_REGION( 0x0800, "tms", 0 ) /* speech rom */
ROM_REGION( 0x0800, "m58819", 0 ) /* speech rom */
ROM_LOAD( "trs014ha.bin", 0x0000, 0x0800, CRC(d1f1b48c) SHA1(ee5584368d2e9f7bde271f5004585b53f5ff5c3f) ) /* speech rom */
ROM_REGION( 0x1000, "gfx1", 0 )

View File

@ -1940,7 +1940,7 @@ ROM_START( ad2083 )
ROM_LOAD( "ad4.5k", 0x0000, 0x2000, CRC(388cdd21) SHA1(52f97d8e4f7c7f45a2875f03eadc622b540693e7) )
ROM_LOAD( "ad5.3k", 0x2000, 0x2000, CRC(f53f3449) SHA1(0711f2e47504f256d46eea1e225e35f9bde8b9fb) )
ROM_REGION( 0x2000, "tms5110", 0 ) /* data for the TMS5110 speech chip */
ROM_REGION( 0x2000, "tmsprom", 0 ) /* data for the TMS5110 speech chip */
ROM_LOAD( "ad1v.9a", 0x0000, 0x1000, CRC(4cb93fff) SHA1(2cc686a9a58a85f2bb04fb6ced4626e9952635bb) )
ROM_LOAD( "ad2v.10a", 0x1000, 0x1000, CRC(4b530ea7) SHA1(8793b3497b598f33b34bf9524e360c6c62e8001d) )