Added casting operators to the region_info class so you can assign

a region to a generic type pointer and have it automatically convert.
Also added a bytes() method which is safe if the region is NULL
(useful for saying machine->region("foo")->bytes() and not crashing
if foo doesn't exist).

Changed the region field in the device_config to be a region_info *,
and removed the regionbytes field. Updated all users of these fields
to use the new casting operators and bytes() methods instead.

Added subdevice and subregion methods to the device_config class, so
you can easily query for devices and regions that are device-specific.
The device prefix ("devicename:") is automatically prepended.
This commit is contained in:
Aaron Giles 2010-01-16 00:53:57 +00:00
parent 51fd1fa822
commit d35a800134
47 changed files with 195 additions and 142 deletions

View File

@ -81,6 +81,40 @@ INLINE int device_matches_type(const device_config *device, device_type type)
} }
/*-------------------------------------------------
subregion - return a pointer to the region
info for a given region
-------------------------------------------------*/
const region_info *device_config::subregion(const char *_tag) const
{
// safety first
if (this == NULL)
return NULL;
// build a fully-qualified name
astring tempstring(tag, ":", _tag);
return machine->region(tempstring);
}
/*-------------------------------------------------
subdevice - return a pointer to the given
device that is owned by us
-------------------------------------------------*/
const device_config *device_config::subdevice(const char *_tag) const
{
// safety first
if (this == NULL)
return NULL;
// build a fully-qualified name
astring tempstring(tag, ":", _tag);
return machine->device(tempstring);
}
/*************************************************************************** /***************************************************************************
DEVICE CONFIGURATION DEVICE CONFIGURATION
@ -116,12 +150,50 @@ void device_list_deinit(device_list *devlist)
end of a device list end of a device list
-------------------------------------------------*/ -------------------------------------------------*/
device_config::device_config(const device_config *_owner, device_type _type, const char *_tag, UINT32 _clock)
: next(NULL),
owner(const_cast<device_config *>(_owner)),
typenext(NULL),
classnext(NULL),
tag(_tag),
type(_type),
devclass(static_cast<device_class>(devtype_get_info_int(_type, DEVINFO_INT_CLASS))),
clock(_clock),
static_config(NULL),
inline_config(NULL),
machine(NULL),
started(DEVICE_STOPPED),
token(NULL),
tokenbytes(NULL),
execute(NULL),
region(NULL)
{
memset(address_map, 0, sizeof(address_map));
memset(addrspace, 0, sizeof(addrspace));
if ((clock & 0xff000000) == 0xff000000)
{
assert(owner != NULL);
clock = owner->clock * ((clock >> 12) & 0xfff) / ((clock >> 0) & 0xfff);
}
/* populate device configuration */
UINT32 configlen = (UINT32)devtype_get_info_int(_type, DEVINFO_INT_INLINE_CONFIG_BYTES);
inline_config = (configlen == 0) ? NULL : global_alloc_array_clear(UINT8, configlen);
}
device_config::~device_config()
{
global_free(inline_config);
}
device_config *device_list_add(device_list *devlist, const device_config *owner, device_type type, const char *tag, UINT32 clock) device_config *device_list_add(device_list *devlist, const device_config *owner, device_type type, const char *tag, UINT32 clock)
{ {
device_config **devptr, **tempdevptr; device_config **devptr, **tempdevptr;
device_config *device, *tempdevice; device_config *device, *tempdevice;
tagmap_error tmerr; tagmap_error tmerr;
UINT32 configlen;
assert(devlist != NULL); assert(devlist != NULL);
assert(type != NULL); assert(type != NULL);
@ -131,7 +203,7 @@ device_config *device_list_add(device_list *devlist, const device_config *owner,
for (devptr = &devlist->head; *devptr != NULL; devptr = &(*devptr)->next) ; for (devptr = &devlist->head; *devptr != NULL; devptr = &(*devptr)->next) ;
/* allocate a new device */ /* allocate a new device */
device = global_alloc(device_config); device = global_alloc(device_config(owner, type, tag, clock));
/* add to the map */ /* add to the map */
tmerr = devlist->map.add_unique_hash(tag, device, FALSE); tmerr = devlist->map.add_unique_hash(tag, device, FALSE);
@ -145,41 +217,6 @@ device_config *device_list_add(device_list *devlist, const device_config *owner,
fatalerror("Two devices have tags which hash to the same value: '%s' and '%s'\n", tag, match->tag.cstr()); fatalerror("Two devices have tags which hash to the same value: '%s' and '%s'\n", tag, match->tag.cstr());
} }
/* populate device relationships */
device->next = NULL;
device->owner = (device_config *)owner;
device->typenext = NULL;
device->classnext = NULL;
/* populate device properties */
device->type = type;
device->devclass = (device_class)(INT32)devtype_get_info_int(type, DEVINFO_INT_CLASS);
/* populate device configuration */
device->clock = clock;
memset((void *)device->address_map, 0, sizeof(device->address_map));
if ((device->clock & 0xff000000) == 0xff000000)
{
assert(device->owner != NULL);
device->clock = device->owner->clock * ((device->clock >> 12) & 0xfff) / ((device->clock >> 0) & 0xfff);
}
device->static_config = NULL;
configlen = (UINT32)devtype_get_info_int(type, DEVINFO_INT_INLINE_CONFIG_BYTES);
device->inline_config = (configlen == 0) ? NULL : global_alloc_array_clear(UINT8, configlen);
/* ensure live fields are all cleared */
device->machine = NULL;
device->started = DEVICE_STOPPED;
device->token = NULL;
device->tokenbytes = 0;
device->region = NULL;
device->regionbytes = 0;
memset((void *)device->addrspace, 0, sizeof(device->addrspace));
device->execute = NULL;
/* append the tag */
device->tag.cpy(tag);
/* fetch function pointers to the core functions */ /* fetch function pointers to the core functions */
/* before adding us to the global list, add us to the end of the type list */ /* before adding us to the global list, add us to the end of the type list */
@ -238,8 +275,6 @@ void device_list_remove(device_list *devlist, const char *tag)
devlist->map.remove(device->tag); devlist->map.remove(device->tag);
/* free the device object */ /* free the device object */
if (device->inline_config != NULL)
global_free(device->inline_config);
global_free(device); global_free(device);
} }
@ -633,8 +668,7 @@ void device_list_start(running_machine *machine)
device->token = auto_alloc_array_clear(machine, UINT8, device->tokenbytes); device->token = auto_alloc_array_clear(machine, UINT8, device->tokenbytes);
/* fill in the remaining runtime fields */ /* fill in the remaining runtime fields */
device->region = memory_region(machine, device->tag); device->region = machine->region(device->tag);
device->regionbytes = memory_region_length(machine, device->tag);
for (spacenum = 0; spacenum < ADDRESS_SPACES; spacenum++) for (spacenum = 0; spacenum < ADDRESS_SPACES; spacenum++)
device->addrspace[spacenum] = device->space(spacenum); device->addrspace[spacenum] = device->space(spacenum);
device->execute = (device_execute_func)device_get_info_fct(device, DEVINFO_FCT_EXECUTE); device->execute = (device_execute_func)device_get_info_fct(device, DEVINFO_FCT_EXECUTE);
@ -718,7 +752,6 @@ static void device_list_stop(running_machine *machine)
device->tokenbytes = 0; device->tokenbytes = 0;
device->machine = NULL; device->machine = NULL;
device->region = NULL; device->region = NULL;
device->regionbytes = 0;
} }
} }

View File

@ -305,11 +305,24 @@ enum device_space
AS_IO = 2 AS_IO = 2
}; };
class region_info;
class device_config class device_config
{ {
DISABLE_COPYING(device_config);
public: // private eventually
const address_space * addrspace[ADDRESS_SPACES]; /* auto-discovered address spaces */
public: public:
device_config(const device_config *owner, device_type type, const char *tag, UINT32 clock);
~device_config();
inline const address_space *space(int index = 0) const; inline const address_space *space(int index = 0) const;
inline const address_space *space(device_space index) const; inline const address_space *space(device_space index) const;
const region_info *subregion(const char *tag) const;
const device_config *subdevice(const char *tag) const;
/* device relationships (always valid) */ /* device relationships (always valid) */
device_config * next; /* next device (of any type/class) */ device_config * next; /* next device (of any type/class) */
@ -335,10 +348,8 @@ public:
UINT8 started; /* TRUE if the start function has succeeded */ UINT8 started; /* TRUE if the start function has succeeded */
void * token; /* token if device is live */ void * token; /* token if device is live */
UINT32 tokenbytes; /* size of the token data allocated */ UINT32 tokenbytes; /* size of the token data allocated */
UINT8 * region; /* pointer to region with the device's tag, or NULL */
UINT32 regionbytes; /* size of the region, in bytes */
const address_space * addrspace[ADDRESS_SPACES]; /* auto-discovered address spaces */
device_execute_func execute; /* quick pointer to execute callback */ device_execute_func execute; /* quick pointer to execute callback */
const region_info * region; /* our device-local region */
}; };

View File

@ -78,9 +78,13 @@ class running_machine;
union generic_ptr union generic_ptr
{ {
void * v; void * v;
INT8 * i8;
UINT8 * u8; UINT8 * u8;
INT16 * i16;
UINT16 * u16; UINT16 * u16;
INT32 * i32;
UINT32 * u32; UINT32 * u32;
INT64 * i64;
UINT64 * u64; UINT64 * u64;
}; };

View File

@ -143,7 +143,7 @@ static DEVICE_START(at28c16)
c->oe_12v = 0; c->oe_12v = 0;
c->last_write = -1; c->last_write = -1;
c->write_timer = timer_alloc(device->machine, write_finished, c ); c->write_timer = timer_alloc(device->machine, write_finished, c );
c->default_data = device->region; c->default_data = *device->region;
config = (const at28c16_config *)device->inline_config; config = (const at28c16_config *)device->inline_config;
if (config->id != NULL) if (config->id != NULL)

View File

@ -360,20 +360,18 @@ static DEVICE_NVRAM( eeprom )
/* populate from a memory region if present */ /* populate from a memory region if present */
if (device->region != NULL) if (device->region != NULL)
{ {
UINT32 region_flags = memory_region_flags(device->machine, device->tag.cstr()); if (device->region->length != eeprom_bytes)
if (device->regionbytes != eeprom_bytes)
fatalerror("eeprom region '%s' wrong size (expected size = 0x%X)", device->tag.cstr(), eeprom_bytes); fatalerror("eeprom region '%s' wrong size (expected size = 0x%X)", device->tag.cstr(), eeprom_bytes);
if (eestate->intf->data_bits == 8 && (region_flags & ROMREGION_WIDTHMASK) != ROMREGION_8BIT) if (eestate->intf->data_bits == 8 && (device->region->flags & ROMREGION_WIDTHMASK) != ROMREGION_8BIT)
fatalerror("eeprom region '%s' needs to be an 8-bit region", device->tag.cstr()); fatalerror("eeprom region '%s' needs to be an 8-bit region", device->tag.cstr());
if (eestate->intf->data_bits == 16 && ((region_flags & ROMREGION_WIDTHMASK) != ROMREGION_16BIT || (region_flags & ROMREGION_ENDIANMASK) != ROMREGION_BE)) if (eestate->intf->data_bits == 16 && ((device->region->flags & ROMREGION_WIDTHMASK) != ROMREGION_16BIT || (device->region->flags & ROMREGION_ENDIANMASK) != ROMREGION_BE))
fatalerror("eeprom region '%s' needs to be a 16-bit big-endian region (flags=%08x)", device->tag.cstr(), region_flags); fatalerror("eeprom region '%s' needs to be a 16-bit big-endian region (flags=%08x)", device->tag.cstr(), device->region->flags);
for (offs = 0; offs < eeprom_length; offs++) for (offs = 0; offs < eeprom_length; offs++)
if (eestate->intf->data_bits == 8) if (eestate->intf->data_bits == 8)
memory_write_byte(device->space(), offs, device->region[offs]); memory_write_byte(device->space(), offs, device->region->base.u8[offs]);
else else
memory_write_word(device->space(), offs * 2, ((UINT16 *)device->region)[offs]); memory_write_word(device->space(), offs * 2, device->region->base.u16[offs]);
} }
} }
} }

View File

@ -351,7 +351,8 @@ static void pr8210_init(laserdisc_state *ld)
player->slowtrg = curtime; player->slowtrg = curtime;
/* find our CPU */ /* find our CPU */
player->cpu = ld->device->machine->device(device_build_tag(tempstring, ld->device, "pr8210")); player->cpu = ld->device->subdevice("pr8210");
assert(player->cpu != NULL);
/* we don't have the Simutrek player overrides */ /* we don't have the Simutrek player overrides */
player->simutrek.cpu = NULL; player->simutrek.cpu = NULL;

View File

@ -310,11 +310,8 @@ static DEVICE_START(timekeeper)
c->century = make_bcd( systime.local_time.year / 100 ); c->century = make_bcd( systime.local_time.year / 100 );
c->data = auto_alloc_array( device->machine, UINT8, c->size ); c->data = auto_alloc_array( device->machine, UINT8, c->size );
c->default_data = device->region; c->default_data = *device->region;
if (c->default_data != NULL) assert( device->region->bytes() == c->size );
{
assert( device->regionbytes == c->size );
}
state_save_register_device_item( device, 0, c->control ); state_save_register_device_item( device, 0, c->control );
state_save_register_device_item( device, 0, c->seconds ); state_save_register_device_item( device, 0, c->seconds );

View File

@ -748,9 +748,9 @@ region_info::region_info(running_machine *_machine, const char *_name, UINT32 _l
next(NULL), next(NULL),
name(_name), name(_name),
length(_length), length(_length),
flags(_flags), flags(_flags)
base(auto_alloc_array(_machine, UINT8, _length))
{ {
base.u8 = auto_alloc_array(_machine, UINT8, _length);
} }
@ -760,7 +760,7 @@ region_info::region_info(running_machine *_machine, const char *_name, UINT32 _l
region_info::~region_info() region_info::~region_info()
{ {
auto_free(machine, base); auto_free(machine, base.v);
} }
@ -793,7 +793,7 @@ UINT8 *memory_region_alloc(running_machine *machine, const char *name, UINT32 le
/* hook us into the list */ /* hook us into the list */
*infoptr = info; *infoptr = info;
return reinterpret_cast<UINT8 *>(info->base); return info->base.u8;
} }
@ -850,7 +850,7 @@ region_info *memory_region_info(running_machine *machine, const char *name)
UINT8 *memory_region(running_machine *machine, const char *name) UINT8 *memory_region(running_machine *machine, const char *name)
{ {
const region_info *region = machine->region(name); const region_info *region = machine->region(name);
return (region != NULL) ? reinterpret_cast<UINT8 *>(region->base) : NULL; return (region != NULL) ? region->base.u8 : NULL;
} }
@ -885,6 +885,8 @@ UINT32 memory_region_flags(running_machine *machine, const char *name)
const char *memory_region_next(running_machine *machine, const char *name) const char *memory_region_next(running_machine *machine, const char *name)
{ {
if (name == NULL)
return (machine->mame_data->regionlist != NULL) ? machine->mame_data->regionlist->name : NULL;
const region_info *region = machine->region(name); const region_info *region = machine->region(name);
return (region != NULL && region->next != NULL) ? region->next->name.cstr() : NULL; return (region != NULL && region->next != NULL) ? region->next->name.cstr() : NULL;
} }

View File

@ -160,17 +160,29 @@ class region_info
{ {
DISABLE_COPYING(region_info); DISABLE_COPYING(region_info);
running_machine *machine; running_machine * machine;
public: public:
region_info(running_machine *machine, const char *_name, UINT32 _length, UINT32 _flags); region_info(running_machine *machine, const char *_name, UINT32 _length, UINT32 _flags);
~region_info(); ~region_info();
region_info * next; operator void *() const { return (this != NULL) ? base.v : NULL; }
astring name; operator INT8 *() const { return (this != NULL) ? base.i8 : NULL; }
UINT32 length; operator UINT8 *() const { return (this != NULL) ? base.u8 : NULL; }
UINT32 flags; operator INT16 *() const { return (this != NULL) ? base.i16 : NULL; }
UINT8 * base; operator UINT16 *() const { return (this != NULL) ? base.u16 : NULL; }
operator INT32 *() const { return (this != NULL) ? base.i32 : NULL; }
operator UINT32 *() const { return (this != NULL) ? base.u32 : NULL; }
operator INT64 *() const { return (this != NULL) ? base.i64 : NULL; }
operator UINT64 *() const { return (this != NULL) ? base.u64 : NULL; }
UINT32 bytes() const { return (this != NULL) ? length : 0; }
region_info * next;
astring name;
generic_ptr base;
UINT32 length;
UINT32 flags;
}; };

View File

@ -161,8 +161,8 @@ static DEVICE_START( ym2608 )
/* stream system initialize */ /* stream system initialize */
info->stream = stream_create(device,0,2,rate,info,ym2608_stream_update); info->stream = stream_create(device,0,2,rate,info,ym2608_stream_update);
/* setup adpcm buffers */ /* setup adpcm buffers */
pcmbufa = device->region; pcmbufa = *device->region;
pcmsizea = device->regionbytes; pcmsizea = device->region->bytes();
/* initialize YM2608 */ /* initialize YM2608 */
info->chip = ym2608_init(info,device,device->clock,rate, info->chip = ym2608_init(info,device,device->clock,rate,

View File

@ -165,8 +165,8 @@ static DEVICE_START( ym2610 )
/* stream system initialize */ /* stream system initialize */
info->stream = stream_create(device,0,2,rate,info,(type == SOUND_YM2610) ? ym2610_stream_update : ym2610b_stream_update); info->stream = stream_create(device,0,2,rate,info,(type == SOUND_YM2610) ? ym2610_stream_update : ym2610b_stream_update);
/* setup adpcm buffers */ /* setup adpcm buffers */
pcmbufa = device->region; pcmbufa = *device->region;
pcmsizea = device->regionbytes; pcmsizea = device->region->bytes();
name.printf("%s.deltat", device->tag.cstr()); name.printf("%s.deltat", device->tag.cstr());
pcmbufb = (void *)(memory_region(device->machine, name)); pcmbufb = (void *)(memory_region(device->machine, name));
pcmsizeb = memory_region_length(device->machine, name); pcmsizeb = memory_region_length(device->machine, name);

View File

@ -130,7 +130,7 @@ static DEVICE_START( y8950 )
assert_always(info->chip != NULL, "Error creating Y8950 chip"); assert_always(info->chip != NULL, "Error creating Y8950 chip");
/* ADPCM ROM data */ /* ADPCM ROM data */
y8950_set_delta_t_memory(info->chip, device->region, device->regionbytes); y8950_set_delta_t_memory(info->chip, *device->region, device->region->bytes());
info->stream = stream_create(device,0,1,rate,info,y8950_stream_update); info->stream = stream_create(device,0,1,rate,info,y8950_stream_update);

View File

@ -533,11 +533,11 @@ static void AICA_Init(const device_config *device, aica_state *AICA, const aica_
{ {
AICA->Master = intf->master; AICA->Master = intf->master;
AICA->AICARAM = device->region; AICA->AICARAM = *device->region;
if (AICA->AICARAM) if (AICA->AICARAM)
{ {
AICA->AICARAM += intf->roffset; AICA->AICARAM += intf->roffset;
AICA->AICARAM_LENGTH = device->regionbytes; AICA->AICARAM_LENGTH = device->region->bytes();
AICA->RAM_MASK = AICA->AICARAM_LENGTH-1; AICA->RAM_MASK = AICA->AICARAM_LENGTH-1;
AICA->RAM_MASK16 = AICA->RAM_MASK & 0x7ffffe; AICA->RAM_MASK16 = AICA->RAM_MASK & 0x7ffffe;
AICA->DSP.AICARAM = (UINT16 *)AICA->AICARAM; AICA->DSP.AICARAM = (UINT16 *)AICA->AICARAM;

View File

@ -124,8 +124,8 @@ static DEVICE_START( bsmt2000 )
chip->clock = device->clock; chip->clock = device->clock;
/* initialize the regions */ /* initialize the regions */
chip->region_base = (INT8 *)device->region; chip->region_base = *device->region;
chip->total_banks = device->regionbytes / 0x10000; chip->total_banks = device->region->bytes() / 0x10000;
/* register chip-wide data for save states */ /* register chip-wide data for save states */
state_save_register_device_item(device, 0, chip->last_register); state_save_register_device_item(device, 0, chip->last_register);

View File

@ -475,7 +475,7 @@ static DEVICE_START( c140 )
info->stream = stream_create(device,0,2,info->sample_rate,info,update_stereo); info->stream = stream_create(device,0,2,info->sample_rate,info,update_stereo);
info->pRom=device->region; info->pRom=*device->region;
/* make decompress pcm table */ //2000.06.26 CAB /* make decompress pcm table */ //2000.06.26 CAB
{ {

View File

@ -543,8 +543,8 @@ static DEVICE_START( c352 )
{ {
c352_state *info = get_safe_token(device); c352_state *info = get_safe_token(device);
info->c352_rom_samples = device->region; info->c352_rom_samples = *device->region;
info->c352_rom_length = device->regionbytes; info->c352_rom_length = device->region->bytes();
info->sample_rate_base = device->clock / 192; info->sample_rate_base = device->clock / 192;

View File

@ -227,7 +227,7 @@ static DEVICE_START( es8712 )
chip->repeat = 0; chip->repeat = 0;
chip->bank_offset = 0; chip->bank_offset = 0;
chip->region_base = device->region; chip->region_base = *device->region;
/* generate the name and create the stream */ /* generate the name and create the stream */
chip->stream = stream_create(device, 0, 1, device->clock, chip, es8712_update); chip->stream = stream_create(device, 0, 1, device->clock, chip, es8712_update);

View File

@ -268,7 +268,7 @@ static DEVICE_START( gaelco )
info->stream = stream_create(device, 0, 2, 8000, info, gaelco_update); info->stream = stream_create(device, 0, 2, 8000, info, gaelco_update);
info->snd_data = (UINT8 *)memory_region(device->machine, intf->gfxregion); info->snd_data = (UINT8 *)memory_region(device->machine, intf->gfxregion);
if (info->snd_data == NULL) if (info->snd_data == NULL)
info->snd_data = device->region; info->snd_data = *device->region;
/* init volume table */ /* init volume table */
for (vol = 0; vol < VOLUME_LEVELS; vol++){ for (vol = 0; vol < VOLUME_LEVELS; vol++){

View File

@ -477,7 +477,7 @@ static DEVICE_START( ics2115 )
chip->device = device; chip->device = device;
chip->intf = (const ics2115_interface *)device->static_config; chip->intf = (const ics2115_interface *)device->static_config;
chip->rom = device->region; chip->rom = *device->region;
chip->timer[0].timer = timer_alloc(device->machine, timer_cb_0, chip); chip->timer[0].timer = timer_alloc(device->machine, timer_cb_0, chip);
chip->timer[1].timer = timer_alloc(device->machine, timer_cb_1, chip); chip->timer[1].timer = timer_alloc(device->machine, timer_cb_1, chip);
chip->ulaw = auto_alloc_array(device->machine, INT16, 256); chip->ulaw = auto_alloc_array(device->machine, INT16, 256);

View File

@ -242,8 +242,8 @@ static DEVICE_START( iremga20 )
int i; int i;
/* Initialize our chip structure */ /* Initialize our chip structure */
chip->rom = device->region; chip->rom = *device->region;
chip->rom_size = device->regionbytes; chip->rom_size = device->region->bytes();
iremga20_reset(chip); iremga20_reset(chip);

View File

@ -176,7 +176,7 @@ static DEVICE_START( k005289 )
/* build the mixer table */ /* build the mixer table */
make_mixer_table(device->machine, info, 2); make_mixer_table(device->machine, info, 2);
info->sound_prom = device->region; info->sound_prom = *device->region;
/* reset all the voices */ /* reset all the voices */
voice[0].frequency = 0; voice[0].frequency = 0;

View File

@ -311,9 +311,9 @@ static DEVICE_START( k007232 )
/* Set up the chips */ /* Set up the chips */
info->pcmbuf[0] = device->region; info->pcmbuf[0] = *device->region;
info->pcmbuf[1] = device->region; info->pcmbuf[1] = *device->region;
info->pcmlimit = device->regionbytes; info->pcmlimit = device->region->bytes();
info->clock = device->clock; info->clock = device->clock;

View File

@ -218,13 +218,11 @@ static DEVICE_START( k053260 )
ic->intf = (device->static_config != NULL) ? (const k053260_interface *)device->static_config : &defintrf; ic->intf = (device->static_config != NULL) ? (const k053260_interface *)device->static_config : &defintrf;
ic->mode = 0; ic->mode = 0;
ic->rom = device->region;
ic->rom_size = device->regionbytes; const region_info *region = (ic->intf->rgnoverride != NULL) ? device->machine->region(ic->intf->rgnoverride) : device->region;
if (ic->intf->rgnoverride != NULL)
{ ic->rom = *region;
ic->rom = memory_region(device->machine, ic->intf->rgnoverride); ic->rom_size = region->bytes();
ic->rom_size = memory_region_length(device->machine, ic->intf->rgnoverride);
}
DEVICE_RESET_CALL(k053260); DEVICE_RESET_CALL(k053260);

View File

@ -459,13 +459,9 @@ static void k054539_init_chip(const device_config *device, k054539_state *info)
info->cur_ptr = 0; info->cur_ptr = 0;
memset(info->ram, 0, 0x4000*2+device->clock/50*2); memset(info->ram, 0, 0x4000*2+device->clock/50*2);
info->rom = device->region; const region_info *region = (info->intf->rgnoverride != NULL) ? device->machine->region(info->intf->rgnoverride) : device->region;
info->rom_size = device->regionbytes; info->rom = *region;
if (info->intf->rgnoverride != NULL) info->rom_size = region->bytes();
{
info->rom = memory_region(device->machine, info->intf->rgnoverride);
info->rom_size = memory_region_length(device->machine, info->intf->rgnoverride);
}
info->rom_mask = 0xffffffffU; info->rom_mask = 0xffffffffU;
for(i=0; i<32; i++) for(i=0; i<32; i++)
if((1U<<i) >= info->rom_size) { if((1U<<i) >= info->rom_size) {

View File

@ -502,7 +502,7 @@ static DEVICE_START( multipcm )
MultiPCM *ptChip = get_safe_token(device); MultiPCM *ptChip = get_safe_token(device);
int i; int i;
ptChip->ROM=(INT8 *)device->region; ptChip->ROM=*device->region;
ptChip->Rate=(float) device->clock / MULTIPCM_CLOCKDIV; ptChip->Rate=(float) device->clock / MULTIPCM_CLOCKDIV;
ptChip->stream = stream_create(device, 0, 2, ptChip->Rate, ptChip, MultiPCM_update); ptChip->stream = stream_create(device, 0, 2, ptChip->Rate, ptChip, MultiPCM_update);

View File

@ -115,7 +115,7 @@ static DEVICE_START( namco_63701x )
{ {
namco_63701x *chip = get_safe_token(device); namco_63701x *chip = get_safe_token(device);
chip->rom = device->region; chip->rom = *device->region;
chip->stream = stream_create(device, 0, 2, device->clock/1000, chip, namco_63701x_update); chip->stream = stream_create(device, 0, 2, device->clock/1000, chip, namco_63701x_update);
} }

View File

@ -388,7 +388,7 @@ static DEVICE_START( namco )
logerror("Namco: freq fractional bits = %d: internal freq = %d, output freq = %d\n", chip->f_fracbits, chip->namco_clock, chip->sample_rate); logerror("Namco: freq fractional bits = %d: internal freq = %d, output freq = %d\n", chip->f_fracbits, chip->namco_clock, chip->sample_rate);
/* build the waveform table */ /* build the waveform table */
build_decoded_waveform(device->machine, chip, device->region); build_decoded_waveform(device->machine, chip, *device->region);
/* get stream channels */ /* get stream channels */
if (intf->stereo) if (intf->stereo)

View File

@ -229,7 +229,7 @@ static DEVICE_START( nile )
{ {
nile_state *info = get_safe_token(device); nile_state *info = get_safe_token(device);
info->sound_ram = device->region; info->sound_ram = *device->region;
info->stream = stream_create(device, 0, 2, 44100, info, nile_update); info->stream = stream_create(device, 0, 2, 44100, info, nile_update);
} }

View File

@ -413,7 +413,7 @@ void okim6295_set_bank_base(const device_config *device, int base)
if (info->bank_installed) if (info->bank_installed)
{ {
info->bank_offs = base; info->bank_offs = base;
memory_set_bankptr(device->machine, device->tag, device->region + base); memory_set_bankptr(device->machine, device->tag, device->region->base.u8 + base);
} }
} }

View File

@ -305,7 +305,7 @@ static DEVICE_START( okim6376 )
compute_tables(); compute_tables();
info->command = -1; info->command = -1;
info->region_base = device->region; info->region_base = *device->region;
info->master_clock = device->clock; info->master_clock = device->clock;
/* generate the name and create the stream */ /* generate the name and create the stream */

View File

@ -107,8 +107,8 @@ static DEVICE_START( qsound )
qsound_state *chip = get_safe_token(device); qsound_state *chip = get_safe_token(device);
int i; int i;
chip->sample_rom = (QSOUND_SRC_SAMPLE *)device->region; chip->sample_rom = (QSOUND_SRC_SAMPLE *)*device->region;
chip->sample_rom_length = device->regionbytes; chip->sample_rom_length = device->region->bytes();
memset(chip->channel, 0, sizeof(chip->channel)); memset(chip->channel, 0, sizeof(chip->channel));

View File

@ -244,8 +244,8 @@ static void rf5c400_init_chip(const device_config *device, rf5c400_state *info)
{ {
int i; int i;
info->rom = (INT16*)device->region; info->rom = *device->region;
info->rom_length = device->regionbytes / 2; info->rom_length = device->region->bytes() / 2;
// init volume table // init volume table
{ {

View File

@ -581,7 +581,7 @@ static DEVICE_START( s14001a )
chip->filtervals[i] = SILENCE; chip->filtervals[i] = SILENCE;
} }
chip->SpeechRom = device->region; chip->SpeechRom = *device->region;
chip->stream = stream_create(device, 0, 1, device->clock ? device->clock : device->machine->sample_rate, chip, s14001a_pcm_update); chip->stream = stream_create(device, 0, 1, device->clock ? device->clock : device->machine->sample_rate, chip, s14001a_pcm_update);
} }

View File

@ -537,10 +537,10 @@ static void SCSP_Init(const device_config *device, struct _SCSP *SCSP, const scs
SCSP->Master=0; SCSP->Master=0;
} }
SCSP->SCSPRAM = device->region; SCSP->SCSPRAM = *device->region;
if (SCSP->SCSPRAM) if (SCSP->SCSPRAM)
{ {
SCSP->SCSPRAM_LENGTH = device->regionbytes; SCSP->SCSPRAM_LENGTH = device->region->bytes();
SCSP->DSP.SCSPRAM = (UINT16 *)SCSP->SCSPRAM; SCSP->DSP.SCSPRAM = (UINT16 *)SCSP->SCSPRAM;
SCSP->DSP.SCSPRAM_LENGTH = SCSP->SCSPRAM_LENGTH/2; SCSP->DSP.SCSPRAM_LENGTH = SCSP->SCSPRAM_LENGTH/2;
SCSP->SCSPRAM += intf->roffset; SCSP->SCSPRAM += intf->roffset;

View File

@ -92,7 +92,7 @@ static DEVICE_START( segapcm )
int mask, rom_mask, len; int mask, rom_mask, len;
segapcm_state *spcm = get_safe_token(device); segapcm_state *spcm = get_safe_token(device);
spcm->rom = (const UINT8 *)device->region; spcm->rom = *device->region;
spcm->ram = auto_alloc_array(device->machine, UINT8, 0x800); spcm->ram = auto_alloc_array(device->machine, UINT8, 0x800);
memset(spcm->ram, 0xff, 0x800); memset(spcm->ram, 0xff, 0x800);
@ -102,7 +102,7 @@ static DEVICE_START( segapcm )
if(!mask) if(!mask)
mask = BANK_MASK7>>16; mask = BANK_MASK7>>16;
len = device->regionbytes; len = device->region->bytes();
for(rom_mask = 1; rom_mask < len; rom_mask *= 2); for(rom_mask = 1; rom_mask < len; rom_mask *= 2);
rom_mask--; rom_mask--;

View File

@ -1214,7 +1214,7 @@ static DEVICE_START( sp0256 )
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
/* Setup the ROM. */ /* Setup the ROM. */
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
sp->rom = device->region; sp->rom = *device->region;
sp0256_bitrevbuff(sp->rom, 0, 0xffff); sp0256_bitrevbuff(sp->rom, 0, 0xffff);
} }

View File

@ -943,7 +943,7 @@ static DEVICE_START( tms5110 )
tms5110_state *tms = get_safe_token(device); tms5110_state *tms = get_safe_token(device);
tms->intf = device->static_config ? (const tms5110_interface *)device->static_config : &dummy; tms->intf = device->static_config ? (const tms5110_interface *)device->static_config : &dummy;
tms->table = device->region; tms->table = *device->region;
tms->device = device; tms->device = device;
tms5110_set_variant(tms, TMS5110_IS_5110A); tms5110_set_variant(tms, TMS5110_IS_5110A);

View File

@ -656,7 +656,7 @@ static DEVICE_START( upd7759 )
chip->state = STATE_IDLE; chip->state = STATE_IDLE;
/* compute the ROM base or allocate a timer */ /* compute the ROM base or allocate a timer */
chip->rom = chip->rombase = device->region; chip->rom = chip->rombase = *device->region;
if (chip->rom == NULL) if (chip->rom == NULL)
chip->timer = timer_alloc(device->machine, upd7759_slave_update, chip); chip->timer = timer_alloc(device->machine, upd7759_slave_update, chip);

View File

@ -665,10 +665,10 @@ static DEVICE_START( vlm5030 )
vlm5030_reset(chip); vlm5030_reset(chip);
chip->phase = PH_IDLE; chip->phase = PH_IDLE;
chip->rom = device->region; chip->rom = *device->region;
/* memory size */ /* memory size */
if( chip->intf->memory_size == 0) if( chip->intf->memory_size == 0)
chip->address_mask = device->regionbytes-1; chip->address_mask = device->region->bytes()-1;
else else
chip->address_mask = chip->intf->memory_size-1; chip->address_mask = chip->intf->memory_size-1;

View File

@ -206,7 +206,7 @@ static DEVICE_START( x1_010 )
const x1_010_interface *intf = (const x1_010_interface *)device->static_config; const x1_010_interface *intf = (const x1_010_interface *)device->static_config;
x1_010_state *info = get_safe_token(device); x1_010_state *info = get_safe_token(device);
info->region = device->region; info->region = *device->region;
info->base_clock = device->clock; info->base_clock = device->clock;
info->rate = device->clock / 1024; info->rate = device->clock / 1024;
info->address = intf->adr; info->address = intf->adr;

View File

@ -1779,7 +1779,7 @@ static DEVICE_START( ymf271 )
intf = (device->static_config != NULL) ? (const ymf271_interface *)device->static_config : &defintrf; intf = (device->static_config != NULL) ? (const ymf271_interface *)device->static_config : &defintrf;
ymf271_init(device, chip, device->region, intf->irq_callback, &intf->ext_read, &intf->ext_write); ymf271_init(device, chip, *device->region, intf->irq_callback, &intf->ext_read, &intf->ext_write);
chip->stream = stream_create(device, 0, 2, device->clock/384, chip, ymf271_update); chip->stream = stream_create(device, 0, 2, device->clock/384, chip, ymf271_update);
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)

View File

@ -668,7 +668,7 @@ WRITE8_DEVICE_HANDLER( ymf278b_w )
static void ymf278b_init(const device_config *device, YMF278BChip *chip, void (*cb)(const device_config *, int)) static void ymf278b_init(const device_config *device, YMF278BChip *chip, void (*cb)(const device_config *, int))
{ {
chip->rom = device->region; chip->rom = *device->region;
chip->irq_callback = cb; chip->irq_callback = cb;
chip->timer_a = timer_alloc(device->machine, ymf278b_timer_a_tick, chip); chip->timer_a = timer_alloc(device->machine, ymf278b_timer_a_tick, chip);
chip->timer_b = timer_alloc(device->machine, ymf278b_timer_b_tick, chip); chip->timer_b = timer_alloc(device->machine, ymf278b_timer_b_tick, chip);

View File

@ -650,7 +650,7 @@ static DEVICE_START( ymz280b )
/* initialize the rest of the structure */ /* initialize the rest of the structure */
chip->master_clock = (double)device->clock / 384.0; chip->master_clock = (double)device->clock / 384.0;
chip->region_base = device->region; chip->region_base = *device->region;
chip->irq_callback = intf->irq_callback; chip->irq_callback = intf->irq_callback;
/* create the stream */ /* create the stream */

View File

@ -3735,10 +3735,10 @@ static void init_ds3(running_machine *machine)
/* if we have a sound DSP, boot it */ /* if we have a sound DSP, boot it */
if (state->soundcpu != NULL && cpu_get_type(state->soundcpu) == CPU_ADSP2105) if (state->soundcpu != NULL && cpu_get_type(state->soundcpu) == CPU_ADSP2105)
adsp2105_load_boot_data((UINT8 *)(state->soundcpu->region + 0x10000), (UINT32 *)state->soundcpu->region); adsp2105_load_boot_data(state->soundcpu->region->base.u8 + 0x10000, state->soundcpu->region->base.u32);
if (state->sounddsp != NULL && cpu_get_type(state->sounddsp) == CPU_ADSP2105) if (state->sounddsp != NULL && cpu_get_type(state->sounddsp) == CPU_ADSP2105)
adsp2105_load_boot_data((UINT8 *)(state->sounddsp->region + 0x10000), (UINT32 *)state->sounddsp->region); adsp2105_load_boot_data(state->sounddsp->region->base.u8 + 0x10000, state->sounddsp->region->base.u32);
/* /*

View File

@ -2105,7 +2105,7 @@ static UINT8 tape_get_status_bits(const device_config *device)
/* data block bytes are data */ /* data block bytes are data */
else if (tape->bytenum >= BYTE_DATA_0 && tape->bytenum <= BYTE_DATA_255) else if (tape->bytenum >= BYTE_DATA_0 && tape->bytenum <= BYTE_DATA_255)
byteval = device->region[blocknum * 256 + (tape->bytenum - BYTE_DATA_0)]; byteval = static_cast<UINT8 *>(*device->region)[blocknum * 256 + (tape->bytenum - BYTE_DATA_0)];
/* CRC MSB */ /* CRC MSB */
else if (tape->bytenum == BYTE_CRC16_MSB) else if (tape->bytenum == BYTE_CRC16_MSB)
@ -2182,10 +2182,11 @@ static DEVICE_START( decocass_tape )
tape->timer = timer_alloc(device->machine, tape_clock_callback, (void *)device); tape->timer = timer_alloc(device->machine, tape_clock_callback, (void *)device);
if (device->region == NULL) if (device->region == NULL)
return; return;
UINT8 *regionbase = *device->region;
/* scan for the first non-empty block in the image */ /* scan for the first non-empty block in the image */
for (offs = device->regionbytes - 1; offs >= 0; offs--) for (offs = device->region->bytes() - 1; offs >= 0; offs--)
if (device->region[offs] != 0) if (regionbase[offs] != 0)
break; break;
numblocks = ((offs | 0xff) + 1) / 256; numblocks = ((offs | 0xff) + 1) / 256;
assert(numblocks < ARRAY_LENGTH(tape->crc16)); assert(numblocks < ARRAY_LENGTH(tape->crc16));
@ -2201,7 +2202,7 @@ static DEVICE_START( decocass_tape )
/* first CRC the 256 bytes of data */ /* first CRC the 256 bytes of data */
for (offs = 256 * curblock; offs < 256 * curblock + 256; offs++) for (offs = 256 * curblock; offs < 256 * curblock + 256; offs++)
crc = tape_crc16_byte(crc, device->region[offs]); crc = tape_crc16_byte(crc, regionbase[offs]);
/* then find a pair of bytes that will bring the CRC to 0 (any better way than brute force?) */ /* then find a pair of bytes that will bring the CRC to 0 (any better way than brute force?) */
for (testval = 0; testval < 0x10000; testval++) for (testval = 0; testval < 0x10000; testval++)

View File

@ -163,7 +163,7 @@ void segaic16_memory_mapper_config(running_machine *machine, const UINT8 *map_da
void segaic16_memory_mapper_set_decrypted(running_machine *machine, UINT8 *decrypted) void segaic16_memory_mapper_set_decrypted(running_machine *machine, UINT8 *decrypted)
{ {
struct memory_mapper_chip *chip = &memory_mapper; struct memory_mapper_chip *chip = &memory_mapper;
offs_t romsize = chip->cpu->regionbytes; offs_t romsize = chip->cpu->region->length;
int rgnum; int rgnum;
/* loop over the regions */ /* loop over the regions */
@ -346,7 +346,7 @@ static void update_memory_mapping(running_machine *machine, struct memory_mapper
/* ROM areas need extra clamping */ /* ROM areas need extra clamping */
if (rgn->romoffset != ~0) if (rgn->romoffset != ~0)
{ {
offs_t romsize = chip->cpu->regionbytes; offs_t romsize = chip->cpu->region->length;
if (region_start >= romsize) if (region_start >= romsize)
read = NULL; read = NULL;
else if (region_start + rgn->length > romsize) else if (region_start + rgn->length > romsize)
@ -382,7 +382,7 @@ static void update_memory_mapping(running_machine *machine, struct memory_mapper
decrypted = (UINT8 *)fd1089_get_decrypted_base(); decrypted = (UINT8 *)fd1089_get_decrypted_base();
} }
memory_configure_bank(machine, readbank, 0, 1, (UINT8 *)chip->cpu->region + region_start, 0); memory_configure_bank(machine, readbank, 0, 1, chip->cpu->region->base.u8 + region_start, 0);
if (decrypted) if (decrypted)
memory_configure_bank_decrypted(machine, readbank, 0, 1, decrypted + region_start, 0); memory_configure_bank_decrypted(machine, readbank, 0, 1, decrypted + region_start, 0);

View File

@ -557,8 +557,8 @@ VIDEO_UPDATE( atarisy1 )
static void decode_gfx(running_machine *machine, UINT16 *pflookup, UINT16 *molookup) static void decode_gfx(running_machine *machine, UINT16 *pflookup, UINT16 *molookup)
{ {
atarisy1_state *state = (atarisy1_state *)machine->driver_data; atarisy1_state *state = (atarisy1_state *)machine->driver_data;
UINT8 *prom1 = &machine->region("proms")->base[0x000]; UINT8 *prom1 = &machine->region("proms")->base.u8[0x000];
UINT8 *prom2 = &machine->region("proms")->base[0x200]; UINT8 *prom2 = &machine->region("proms")->base.u8[0x200];
int obj, i; int obj, i;
/* reset the globals */ /* reset the globals */
@ -660,7 +660,7 @@ static int get_bank(running_machine *machine, UINT8 prom1, UINT8 prom2, int bpp)
assert(gfx_index != MAX_GFX_ELEMENTS); assert(gfx_index != MAX_GFX_ELEMENTS);
/* decode the graphics */ /* decode the graphics */
srcdata = &tiles->base[0x80000 * (bank_index - 1)]; srcdata = &tiles->base.u8[0x80000 * (bank_index - 1)];
switch (bpp) switch (bpp)
{ {
case 4: case 4: