Converted intelfsh to a device, updated all users.

Note CPS3 and G-NET testing is very limited due to lack of
CHDs. The other drivers have been verified to varying extents.
This commit is contained in:
Aaron Giles 2010-09-11 18:58:29 +00:00
parent 8182f611b0
commit dcedf21a43
9 changed files with 943 additions and 939 deletions

View File

@ -14,6 +14,11 @@
#include "emu.h" #include "emu.h"
#include "intelfsh.h" #include "intelfsh.h"
//**************************************************************************
// CONSTANTS
//**************************************************************************
enum enum
{ {
FM_NORMAL, // normal read/write FM_NORMAL, // normal read/write
@ -32,185 +37,280 @@ enum
FM_BYTEPROGRAM, FM_BYTEPROGRAM,
}; };
struct flash_chip
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
// 8-bit variants
DEFINE_TRIVIAL_DERIVED_DEVICE(intel_28f016s5_device_config, intelfsh8_device_config, intel_28f016s5_device, intelfsh8_device, "Sharp LH28F400 Flash", intelfsh_device_config::FLASH_SHARP_LH28F400)
DEFINE_TRIVIAL_DERIVED_DEVICE(fujitsu_29f016a_device_config, intelfsh8_device_config, fujitsu_29f016a_device, intelfsh8_device, "Fujitsu 29F016A Flash", intelfsh_device_config::FLASH_FUJITSU_29F016A)
DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f016s_device_config, intelfsh8_device_config, sharp_lh28f016s_device, intelfsh8_device, "Sharp LH28F016S Flash", intelfsh_device_config::FLASH_SHARP_LH28F016S)
DEFINE_TRIVIAL_DERIVED_DEVICE(intel_e28f008sa_device_config, intelfsh8_device_config, intel_e28f008sa_device, intelfsh8_device, "Intel E28F008SA Flash", intelfsh_device_config::FLASH_INTEL_E28F008SA)
DEFINE_TRIVIAL_DERIVED_DEVICE(macronix_29l001mc_device_config, intelfsh8_device_config, macronix_29l001mc_device, intelfsh8_device, "Macronix 29L001MC Flash", intelfsh_device_config::FLASH_MACRONIX_29L001MC)
DEFINE_TRIVIAL_DERIVED_DEVICE(panasonic_mn63f805mnp_device_config, intelfsh8_device_config, panasonic_mn63f805mnp_device, intelfsh8_device, "Panasonic MN63F805MNP Flash", intelfsh_device_config::FLASH_PANASONIC_MN63F805MNP)
DEFINE_TRIVIAL_DERIVED_DEVICE(sanyo_le26fv10n1ts_device_config, intelfsh8_device_config, sanyo_le26fv10n1ts_device, intelfsh8_device, "Sanyo LE26FV10N1TS Flash", intelfsh_device_config::FLASH_SANYO_LE26FV10N1TS)
const device_type INTEL_28F016S5 = intel_28f016s5_device_config::static_alloc_device_config;
const device_type SHARP_LH28F016S = sharp_lh28f016s_device_config::static_alloc_device_config;
const device_type FUJITSU_29F016A = fujitsu_29f016a_device_config::static_alloc_device_config;
const device_type INTEL_E28F008SA = intel_e28f008sa_device_config::static_alloc_device_config;
const device_type MACRONIX_29L001MC = macronix_29l001mc_device_config::static_alloc_device_config;
const device_type PANASONIC_MN63F805MNP = panasonic_mn63f805mnp_device_config::static_alloc_device_config;
const device_type SANYO_LE26FV10N1TS = sanyo_le26fv10n1ts_device_config::static_alloc_device_config;
// 16-bit variants
DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f400_device_config, intelfsh16_device_config, sharp_lh28f400_device, intelfsh16_device, "Sharp LH28F400 Flash", intelfsh_device_config::FLASH_SHARP_LH28F400)
DEFINE_TRIVIAL_DERIVED_DEVICE(intel_te28f160_device_config, intelfsh16_device_config, intel_te28f160_device, intelfsh16_device, "Intel TE28F160 Flash", intelfsh_device_config::FLASH_INTEL_TE28F160)
DEFINE_TRIVIAL_DERIVED_DEVICE(intel_e28f400_device_config, intelfsh16_device_config, intel_e28f400_device, intelfsh16_device, "Intel E28F400 Flash", intelfsh_device_config::FLASH_INTEL_E28F400)
DEFINE_TRIVIAL_DERIVED_DEVICE(sharp_unk128mbit_device_config, intelfsh16_device_config, sharp_unk128mbit_device, intelfsh16_device, "Sharp Unknown 128Mb Flash", intelfsh_device_config::FLASH_SHARP_UNK128MBIT)
const device_type SHARP_LH28F400 = sharp_lh28f400_device_config::static_alloc_device_config;
const device_type INTEL_TE28F160 = intel_te28f160_device_config::static_alloc_device_config;
const device_type INTEL_E28F400 = intel_e28f400_device_config::static_alloc_device_config;
const device_type SHARP_UNK128MBIT = sharp_unk128mbit_device_config::static_alloc_device_config;
//**************************************************************************
// DEVICE CONFIGURATION
//**************************************************************************
//-------------------------------------------------
// intelfsh_device_config - constructor
//-------------------------------------------------
intelfsh_device_config::intelfsh_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant)
: device_config(mconfig, type, name, tag, owner, clock),
device_config_nvram_interface(mconfig, *this),
m_type(variant)
{ {
int type; }
int size;
int bits;
int status;
int erase_sector;
int sector_is_4k;
INT32 flash_mode;
INT32 flash_master_lock;
int device_id;
int maker_id;
emu_timer *timer;
void *flash_memory;
};
static struct flash_chip chips[FLASH_CHIPS_MAX]; intelfsh8_device_config::intelfsh8_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant)
: intelfsh_device_config(mconfig, type, name, tag, owner, clock, variant)
static TIMER_CALLBACK( erase_finished )
{ {
struct flash_chip *c = (struct flash_chip *)ptr; }
switch( c->flash_mode ) intelfsh16_device_config::intelfsh16_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant)
: intelfsh_device_config(mconfig, type, name, tag, owner, clock, variant)
{
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// intelfsh_device - constructor
//-------------------------------------------------
intelfsh_device::intelfsh_device(running_machine &_machine, const intelfsh_device_config &config)
: device_t(_machine, config),
device_nvram_interface(_machine, config, *this),
m_config(config),
m_size(0),
m_bits(config.m_type >> 8),
m_status(0x80),
m_erase_sector(0),
m_sector_is_4k(false),
m_flash_mode(FM_NORMAL),
m_flash_master_lock(false),
m_device_id(0),
m_maker_id(0),
m_timer(NULL),
m_flash_memory(NULL)
{
switch( config.m_type )
{
case intelfsh_device_config::FLASH_INTEL_28F016S5:
case intelfsh_device_config::FLASH_SHARP_LH28F016S:
m_bits = 8;
m_size = 0x200000;
m_maker_id = 0x89;
m_device_id = 0xaa;
break;
case intelfsh_device_config::FLASH_SHARP_LH28F400:
case intelfsh_device_config::FLASH_INTEL_E28F400:
m_bits = 16;
m_size = 0x80000;
m_maker_id = 0xb0;
m_device_id = 0xed;
break;
case intelfsh_device_config::FLASH_FUJITSU_29F016A:
m_bits = 8;
m_size = 0x200000;
m_maker_id = 0x04;
m_device_id = 0xad;
break;
case intelfsh_device_config::FLASH_INTEL_E28F008SA:
m_bits = 8;
m_size = 0x100000;
m_maker_id = 0x89;
m_device_id = 0xa2;
break;
case intelfsh_device_config::FLASH_INTEL_TE28F160:
m_bits = 16;
m_size = 0x200000;
m_maker_id = 0xb0;
m_device_id = 0xd0;
break;
case intelfsh_device_config::FLASH_SHARP_UNK128MBIT:
m_bits = 16;
m_size = 0x800000;
m_maker_id = 0xb0;
m_device_id = 0xb0;
break;
case intelfsh_device_config::FLASH_MACRONIX_29L001MC:
m_bits = 8;
m_size = 0x20000;
m_maker_id = 0xc2;
m_device_id = 0x51;
break;
case intelfsh_device_config::FLASH_PANASONIC_MN63F805MNP:
m_bits = 8;
m_size = 0x10000;
m_maker_id = 0x32;
m_device_id = 0x1b;
m_sector_is_4k = true;
break;
case intelfsh_device_config::FLASH_SANYO_LE26FV10N1TS:
m_bits = 8;
m_size = 0x20000;
m_maker_id = 0x62;
m_device_id = 0x13;
m_sector_is_4k = true;
break;
}
m_flash_memory = auto_alloc_array( &m_machine, UINT8, m_size );
}
intelfsh8_device::intelfsh8_device(running_machine &_machine, const intelfsh_device_config &config)
: intelfsh_device(_machine, config) { }
intelfsh16_device::intelfsh16_device(running_machine &_machine, const intelfsh_device_config &config)
: intelfsh_device(_machine, config) { }
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void intelfsh_device::device_start()
{
m_timer = device_timer_alloc(*this);
state_save_register_device_item( this, 0, m_status );
state_save_register_device_item( this, 0, m_flash_mode );
state_save_register_device_item( this, 0, m_flash_master_lock );
state_save_register_memory( machine, name(), tag(), 0, "m_flash_memory", m_flash_memory, m_bits/8, m_size / (m_bits/8), __FILE__, __LINE__ );
}
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void intelfsh_device::device_timer(emu_timer &timer, int param, void *ptr)
{
switch( m_flash_mode )
{ {
case FM_READSTATUS: case FM_READSTATUS:
c->status = 0x80; m_status = 0x80;
break; break;
case FM_ERASEAMD4: case FM_ERASEAMD4:
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
break; break;
} }
} }
void* intelflash_getmemptr(int chip)
{
struct flash_chip *c;
if( chip >= FLASH_CHIPS_MAX )
{
logerror( "intelflash_init: invalid chip %d\n", chip );
return 0;
}
c = &chips[ chip ];
return c->flash_memory; //-------------------------------------------------
} // nvram_default - called to initialize NVRAM to
// its default state
//-------------------------------------------------
void intelflash_init(running_machine *machine, int chip, int type, void *data) void intelfsh_device::nvram_default()
{ {
struct flash_chip *c; // region always wins
if( chip >= FLASH_CHIPS_MAX ) if (m_region != NULL)
{ {
logerror( "intelflash_init: invalid chip %d\n", chip ); UINT32 bytes = m_region->bytes();
if (bytes > m_size)
bytes = m_size;
memcpy(m_flash_memory, *m_region, bytes);
return; return;
} }
c = &chips[ chip ];
c->type = type; memset( m_flash_memory, 0xff, m_size );
c->sector_is_4k = 0; }
switch( c->type )
//-------------------------------------------------
// nvram_read - called to read NVRAM from the
// .nv file
//-------------------------------------------------
void intelfsh_device::nvram_read(mame_file &file)
{ {
case FLASH_INTEL_28F016S5: mame_fread(&file, m_flash_memory, m_size);
case FLASH_SHARP_LH28F016S:
c->bits = 8;
c->size = 0x200000;
c->maker_id = 0x89;
c->device_id = 0xaa;
break;
case FLASH_SHARP_LH28F400:
case FLASH_INTEL_E28F400:
c->bits = 16;
c->size = 0x80000;
c->maker_id = 0xb0;
c->device_id = 0xed;
break;
case FLASH_FUJITSU_29F016A:
c->bits = 8;
c->size = 0x200000;
c->maker_id = 0x04;
c->device_id = 0xad;
break;
case FLASH_INTEL_E28F008SA:
c->bits = 8;
c->size = 0x100000;
c->maker_id = 0x89;
c->device_id = 0xa2;
break;
case FLASH_INTEL_TE28F160:
c->bits = 16;
c->size = 0x200000;
c->maker_id = 0xb0;
c->device_id = 0xd0;
break;
case FLASH_SHARP_UNK128MBIT:
c->bits = 16;
c->size = 0x800000;
c->maker_id = 0xb0;
c->device_id = 0xb0;
break;
case FLASH_MACRONIX_29L001MC:
c->bits = 8;
c->size = 0x20000;
c->maker_id = 0xc2;
c->device_id = 0x51;
break;
case FLASH_PANASONIC_MN63F805MNP:
c->bits = 8;
c->size = 0x10000;
c->maker_id = 0x32;
c->device_id = 0x1b;
c->sector_is_4k = 1;
break;
case FLASH_SANYO_LE26FV10N1TS:
c->bits = 8;
c->size = 0x20000;
c->maker_id = 0x62;
c->device_id = 0x13;
c->sector_is_4k = 1;
break;
} }
if( data == NULL )
//-------------------------------------------------
// nvram_write - called to write NVRAM to the
// .nv file
//-------------------------------------------------
void intelfsh_device::nvram_write(mame_file &file)
{ {
data = auto_alloc_array( machine, UINT8, c->size ); mame_fwrite(&file, m_flash_memory, m_size);
memset( data, 0xff, c->size );
} }
c->status = 0x80;
c->flash_mode = FM_NORMAL;
c->flash_master_lock = 0;
c->timer = timer_alloc(machine, erase_finished, c);
c->flash_memory = data;
state_save_register_item( machine, "intelfsh", NULL, chip, c->status ); //-------------------------------------------------
state_save_register_item( machine, "intelfsh", NULL, chip, c->flash_mode ); // read_full - generic read, called by the
state_save_register_item( machine, "intelfsh", NULL, chip, c->flash_master_lock ); // bit-width-specific readers
state_save_register_memory( machine, "intelfsh", NULL, chip, "flash_memory", c->flash_memory, c->bits/8, c->size / (c->bits/8), __FILE__, __LINE__ ); //-------------------------------------------------
}
UINT32 intelflash_read(int chip, UINT32 address) UINT32 intelfsh_device::read_full(UINT32 address)
{ {
UINT32 data = 0; UINT32 data = 0;
struct flash_chip *c; switch( m_flash_mode )
if( chip >= FLASH_CHIPS_MAX )
{
logerror( "intelflash_read: invalid chip %d\n", chip );
return 0;
}
c = &chips[ chip ];
switch( c->flash_mode )
{ {
default: default:
case FM_NORMAL: case FM_NORMAL:
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
data = flash_memory[ address ]; data = flash_memory[ address ];
} }
break; break;
case 16: case 16:
{ {
UINT16 *flash_memory = (UINT16 *)c->flash_memory; UINT16 *flash_memory = (UINT16 *)m_flash_memory;
data = flash_memory[ address ]; data = flash_memory[ address ];
} }
break; break;
} }
break; break;
case FM_READSTATUS: case FM_READSTATUS:
data = c->status; data = m_status;
break; break;
case FM_READAMDID3: case FM_READAMDID3:
switch (address) switch (address)
{ {
case 0: data = c->maker_id; break; case 0: data = m_maker_id; break;
case 1: data = c->device_id; break; case 1: data = m_device_id; break;
case 2: data = 0; break; case 2: data = 0; break;
} }
break; break;
@ -218,16 +318,16 @@ UINT32 intelflash_read(int chip, UINT32 address)
switch (address) switch (address)
{ {
case 0: // maker ID case 0: // maker ID
data = c->maker_id; data = m_maker_id;
break; break;
case 1: // chip ID case 1: // chip ID
data = c->device_id; data = m_device_id;
break; break;
case 2: // block lock config case 2: // block lock config
data = 0; // we don't support this yet data = 0; // we don't support this yet
break; break;
case 3: // master lock config case 3: // master lock config
if (c->flash_master_lock) if (m_flash_master_lock)
{ {
data = 1; data = 1;
} }
@ -240,19 +340,19 @@ UINT32 intelflash_read(int chip, UINT32 address)
break; break;
case FM_ERASEAMD4: case FM_ERASEAMD4:
// reads outside of the erasing sector return normal data // reads outside of the erasing sector return normal data
if ((address < c->erase_sector) || (address >= c->erase_sector+(64*1024))) if ((address < m_erase_sector) || (address >= m_erase_sector+(64*1024)))
{ {
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
data = flash_memory[ address ]; data = flash_memory[ address ];
} }
break; break;
case 16: case 16:
{ {
UINT16 *flash_memory = (UINT16 *)c->flash_memory; UINT16 *flash_memory = (UINT16 *)m_flash_memory;
data = flash_memory[ address ]; data = flash_memory[ address ];
} }
break; break;
@ -260,8 +360,8 @@ UINT32 intelflash_read(int chip, UINT32 address)
} }
else else
{ {
c->status ^= ( 1 << 6 ) | ( 1 << 2 ); m_status ^= ( 1 << 6 ) | ( 1 << 2 );
data = c->status; data = m_status;
} }
break; break;
} }
@ -271,19 +371,17 @@ UINT32 intelflash_read(int chip, UINT32 address)
return data; return data;
} }
void intelflash_write(int chip, UINT32 address, UINT32 data)
{
struct flash_chip *c;
if( chip >= FLASH_CHIPS_MAX )
{
logerror( "intelflash_write: invalid chip %d\n", chip );
return;
}
c = &chips[ chip ];
//-------------------------------------------------
// write_full - generic write, called by the
// bit-width-specific writers
//-------------------------------------------------
void intelfsh_device::write_full(UINT32 address, UINT32 data)
{
// logerror( "intelflash_write( %d, %08x, %08x )\n", chip, address, data ); // logerror( "intelflash_write( %d, %08x, %08x )\n", chip, address, data );
switch( c->flash_mode ) switch( m_flash_mode )
{ {
case FM_NORMAL: case FM_NORMAL:
case FM_READSTATUS: case FM_READSTATUS:
@ -293,32 +391,32 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
{ {
case 0xf0: case 0xf0:
case 0xff: // reset chip mode case 0xff: // reset chip mode
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
break; break;
case 0x90: // read ID case 0x90: // read ID
c->flash_mode = FM_READID; m_flash_mode = FM_READID;
break; break;
case 0x40: case 0x40:
case 0x10: // program case 0x10: // program
c->flash_mode = FM_WRITEPART1; m_flash_mode = FM_WRITEPART1;
break; break;
case 0x50: // clear status reg case 0x50: // clear status reg
c->status = 0x80; m_status = 0x80;
c->flash_mode = FM_READSTATUS; m_flash_mode = FM_READSTATUS;
break; break;
case 0x20: // block erase case 0x20: // block erase
c->flash_mode = FM_CLEARPART1; m_flash_mode = FM_CLEARPART1;
break; break;
case 0x60: // set master lock case 0x60: // set master lock
c->flash_mode = FM_SETMASTER; m_flash_mode = FM_SETMASTER;
break; break;
case 0x70: // read status case 0x70: // read status
c->flash_mode = FM_READSTATUS; m_flash_mode = FM_READSTATUS;
break; break;
case 0xaa: // AMD ID select part 1 case 0xaa: // AMD ID select part 1
if( ( address & 0xfff ) == 0x555 ) if( ( address & 0xfff ) == 0x555 )
{ {
c->flash_mode = FM_READAMDID1; m_flash_mode = FM_READAMDID1;
} }
break; break;
default: default:
@ -329,61 +427,61 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
case FM_READAMDID1: case FM_READAMDID1:
if( ( address & 0xffff ) == 0x2aa && ( data & 0xff ) == 0x55 ) if( ( address & 0xffff ) == 0x2aa && ( data & 0xff ) == 0x55 )
{ {
c->flash_mode = FM_READAMDID2; m_flash_mode = FM_READAMDID2;
} }
else if( ( address & 0xffff ) == 0x2aaa && ( data & 0xff ) == 0x55 ) else if( ( address & 0xffff ) == 0x2aaa && ( data & 0xff ) == 0x55 )
{ {
c->flash_mode = FM_READAMDID2; m_flash_mode = FM_READAMDID2;
} }
else else
{ {
logerror( "unexpected %08x=%02x in FM_READAMDID1\n", address, data & 0xff ); logerror( "unexpected %08x=%02x in FM_READAMDID1\n", address, data & 0xff );
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
} }
break; break;
case FM_READAMDID2: case FM_READAMDID2:
if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0x90 ) if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0x90 )
{ {
c->flash_mode = FM_READAMDID3; m_flash_mode = FM_READAMDID3;
} }
else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0x90 ) else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0x90 )
{ {
c->flash_mode = FM_READAMDID3; m_flash_mode = FM_READAMDID3;
} }
else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0x80 ) else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0x80 )
{ {
c->flash_mode = FM_ERASEAMD1; m_flash_mode = FM_ERASEAMD1;
} }
else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0x80 ) else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0x80 )
{ {
c->flash_mode = FM_ERASEAMD1; m_flash_mode = FM_ERASEAMD1;
} }
else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0xa0 ) else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0xa0 )
{ {
c->flash_mode = FM_BYTEPROGRAM; m_flash_mode = FM_BYTEPROGRAM;
} }
else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xa0 ) else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xa0 )
{ {
c->flash_mode = FM_BYTEPROGRAM; m_flash_mode = FM_BYTEPROGRAM;
} }
else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0xf0 ) else if( ( address & 0xffff ) == 0x555 && ( data & 0xff ) == 0xf0 )
{ {
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
} }
else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xf0 ) else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xf0 )
{ {
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
} }
else else
{ {
logerror( "unexpected %08x=%02x in FM_READAMDID2\n", address, data & 0xff ); logerror( "unexpected %08x=%02x in FM_READAMDID2\n", address, data & 0xff );
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
} }
break; break;
case FM_ERASEAMD1: case FM_ERASEAMD1:
if( ( address & 0xfff ) == 0x555 && ( data & 0xff ) == 0xaa ) if( ( address & 0xfff ) == 0x555 && ( data & 0xff ) == 0xaa )
{ {
c->flash_mode = FM_ERASEAMD2; m_flash_mode = FM_ERASEAMD2;
} }
else else
{ {
@ -393,11 +491,11 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
case FM_ERASEAMD2: case FM_ERASEAMD2:
if( ( address & 0xffff ) == 0x2aa && ( data & 0xff ) == 0x55 ) if( ( address & 0xffff ) == 0x2aa && ( data & 0xff ) == 0x55 )
{ {
c->flash_mode = FM_ERASEAMD3; m_flash_mode = FM_ERASEAMD3;
} }
else if( ( address & 0xffff ) == 0x2aaa && ( data & 0xff ) == 0x55 ) else if( ( address & 0xffff ) == 0x2aaa && ( data & 0xff ) == 0x55 )
{ {
c->flash_mode = FM_ERASEAMD3; m_flash_mode = FM_ERASEAMD3;
} }
else else
{ {
@ -408,57 +506,57 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
if( ( address & 0xfff ) == 0x555 && ( data & 0xff ) == 0x10 ) if( ( address & 0xfff ) == 0x555 && ( data & 0xff ) == 0x10 )
{ {
// chip erase // chip erase
memset( c->flash_memory, 0xff, c->size); memset( m_flash_memory, 0xff, m_size);
c->status = 1 << 3; m_status = 1 << 3;
c->flash_mode = FM_ERASEAMD4; m_flash_mode = FM_ERASEAMD4;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_SEC( 17 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_SEC( 17 ), 0 );
} }
else if( ( data & 0xff ) == 0x30 ) else if( ( data & 0xff ) == 0x30 )
{ {
// sector erase // sector erase
// clear the 4k/64k block containing the current address to all 0xffs // clear the 4k/64k block containing the current address to all 0xffs
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
if (c->sector_is_4k) if (m_sector_is_4k)
{ {
memset( &flash_memory[ address & ~0xfff ], 0xff, 4 * 1024 ); memset( &flash_memory[ address & ~0xfff ], 0xff, 4 * 1024 );
c->erase_sector = address & ~0xfff; m_erase_sector = address & ~0xfff;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_MSEC( 125 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_MSEC( 125 ), 0 );
} }
else else
{ {
memset( &flash_memory[ address & ~0xffff ], 0xff, 64 * 1024 ); memset( &flash_memory[ address & ~0xffff ], 0xff, 64 * 1024 );
c->erase_sector = address & ~0xffff; m_erase_sector = address & ~0xffff;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_SEC( 1 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_SEC( 1 ), 0 );
} }
} }
break; break;
case 16: case 16:
{ {
UINT16 *flash_memory = (UINT16 *)c->flash_memory; UINT16 *flash_memory = (UINT16 *)m_flash_memory;
if (c->sector_is_4k) if (m_sector_is_4k)
{ {
memset( &flash_memory[ address & ~0x7ff ], 0xff, 4 * 1024 ); memset( &flash_memory[ address & ~0x7ff ], 0xff, 4 * 1024 );
c->erase_sector = address & ~0x7ff; m_erase_sector = address & ~0x7ff;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_MSEC( 125 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_MSEC( 125 ), 0 );
} }
else else
{ {
memset( &flash_memory[ address & ~0x7fff ], 0xff, 64 * 1024 ); memset( &flash_memory[ address & ~0x7fff ], 0xff, 64 * 1024 );
c->erase_sector = address & ~0x7fff; m_erase_sector = address & ~0x7fff;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_SEC( 1 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_SEC( 1 ), 0 );
} }
} }
break; break;
} }
c->status = 1 << 3; m_status = 1 << 3;
c->flash_mode = FM_ERASEAMD4; m_flash_mode = FM_ERASEAMD4;
} }
else else
{ {
@ -466,68 +564,68 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
} }
break; break;
case FM_BYTEPROGRAM: case FM_BYTEPROGRAM:
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
flash_memory[ address ] = data; flash_memory[ address ] = data;
} }
break; break;
default: default:
logerror( "FM_BYTEPROGRAM not supported when c->bits == %d\n", c->bits ); logerror( "FM_BYTEPROGRAM not supported when m_bits == %d\n", m_bits );
break; break;
} }
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
break; break;
case FM_WRITEPART1: case FM_WRITEPART1:
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
flash_memory[ address ] = data; flash_memory[ address ] = data;
} }
break; break;
case 16: case 16:
{ {
UINT16 *flash_memory = (UINT16 *)c->flash_memory; UINT16 *flash_memory = (UINT16 *)m_flash_memory;
flash_memory[ address ] = data; flash_memory[ address ] = data;
} }
break; break;
default: default:
logerror( "FM_WRITEPART1 not supported when c->bits == %d\n", c->bits ); logerror( "FM_WRITEPART1 not supported when m_bits == %d\n", m_bits );
break; break;
} }
c->status = 0x80; m_status = 0x80;
c->flash_mode = FM_READSTATUS; m_flash_mode = FM_READSTATUS;
break; break;
case FM_CLEARPART1: case FM_CLEARPART1:
if( ( data & 0xff ) == 0xd0 ) if( ( data & 0xff ) == 0xd0 )
{ {
// clear the 64k block containing the current address to all 0xffs // clear the 64k block containing the current address to all 0xffs
switch( c->bits ) switch( m_bits )
{ {
case 8: case 8:
{ {
UINT8 *flash_memory = (UINT8 *)c->flash_memory; UINT8 *flash_memory = (UINT8 *)m_flash_memory;
memset( &flash_memory[ address & ~0xffff ], 0xff, 64 * 1024 ); memset( &flash_memory[ address & ~0xffff ], 0xff, 64 * 1024 );
} }
break; break;
case 16: case 16:
{ {
UINT16 *flash_memory = (UINT16 *)c->flash_memory; UINT16 *flash_memory = (UINT16 *)m_flash_memory;
memset( &flash_memory[ address & ~0x7fff ], 0xff, 64 * 1024 ); memset( &flash_memory[ address & ~0x7fff ], 0xff, 64 * 1024 );
} }
break; break;
default: default:
logerror( "FM_CLEARPART1 not supported when c->bits == %d\n", c->bits ); logerror( "FM_CLEARPART1 not supported when m_bits == %d\n", m_bits );
break; break;
} }
c->status = 0x00; m_status = 0x00;
c->flash_mode = FM_READSTATUS; m_flash_mode = FM_READSTATUS;
timer_adjust_oneshot( c->timer, ATTOTIME_IN_SEC( 1 ), 0 ); timer_adjust_oneshot( m_timer, ATTOTIME_IN_SEC( 1 ), 0 );
break; break;
} }
else else
@ -539,53 +637,16 @@ void intelflash_write(int chip, UINT32 address, UINT32 data)
switch( data & 0xff ) switch( data & 0xff )
{ {
case 0xf1: case 0xf1:
c->flash_master_lock = 1; m_flash_master_lock = true;
break; break;
case 0xd0: case 0xd0:
c->flash_master_lock = 0; m_flash_master_lock = false;
break; break;
default: default:
logerror( "unexpected %08x=%02x in FM_SETMASTER:\n", address, data & 0xff ); logerror( "unexpected %08x=%02x in FM_SETMASTER:\n", address, data & 0xff );
break; break;
} }
c->flash_mode = FM_NORMAL; m_flash_mode = FM_NORMAL;
break;
}
}
void nvram_handler_intelflash(running_machine *machine, int chip,mame_file *file,int read_or_write)
{
struct flash_chip *c;
if( chip >= FLASH_CHIPS_MAX )
{
logerror( "intelflash_nvram: invalid chip %d\n", chip );
return;
}
c = &chips[ chip ];
switch( c->bits )
{
case 8:
if (read_or_write)
{
mame_fwrite( file, c->flash_memory, c->size );
}
else if (file)
{
mame_fread( file, c->flash_memory, c->size );
}
break;
case 16:
if (read_or_write)
{
/// TODO: endian conversion
mame_fwrite( file, c->flash_memory, c->size );
}
else if (file)
{
mame_fread( file, c->flash_memory, c->size );
/// TODO: endian conversion
}
break; break;
} }
} }

View File

@ -5,24 +5,236 @@
#ifndef _INTELFLASH_H_ #ifndef _INTELFLASH_H_
#define _INTELFLASH_H_ #define _INTELFLASH_H_
#define FLASH_CHIPS_MAX ( 56 )
#define FLASH_INTEL_28F016S5 ( 0 ) //**************************************************************************
#define FLASH_SHARP_LH28F400 ( 1 ) // INTERFACE CONFIGURATION MACROS
#define FLASH_FUJITSU_29F016A ( 2 ) //**************************************************************************
#define FLASH_INTEL_E28F008SA ( 3 )
#define FLASH_INTEL_TE28F160 ( 4 ) #define MDRV_INTEL_28F016S5_ADD(_tag) \
#define FLASH_SHARP_LH28F016S ( 5 ) MDRV_DEVICE_ADD(_tag, INTEL_28F016S5, 0)
#define FLASH_INTEL_E28F400 ( 6 )
#define FLASH_SHARP_UNK128MBIT ( 7 ) #define MDRV_SHARP_LH28F016S_ADD(_tag) \
#define FLASH_MACRONIX_29L001MC ( 8 ) MDRV_DEVICE_ADD(_tag, SHARP_LH28F016S, 0)
#define FLASH_PANASONIC_MN63F805MNP ( 9 )
#define FLASH_SANYO_LE26FV10N1TS ( 10 ) #define MDRV_FUJITSU_29F016A_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, FUJITSU_29F016A, 0)
#define MDRV_INTEL_E28F400_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, INTEL_E28F400, 0)
#define MDRV_MACRONIX_29L001MC_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, MACRONIX_29L001MC, 0)
#define MDRV_PANASONIC_MN63F805MNP_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, PANASONIC_MN63F805MNP, 0)
#define MDRV_SANYO_LE26FV10N1TS_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, SANYO_LE26FV10N1TS, 0)
#define MDRV_SHARP_LH28F400_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, SHARP_LH28F400, 0)
#define MDRV_INTEL_E28F008SA_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, INTEL_E28F008SA, 0)
#define MDRV_INTEL_TE28F160_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, INTEL_TE28F160, 0)
#define MDRV_SHARP_UNK128MBIT_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, SHARP_UNK128MBIT, 0)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class intelfsh_device;
// ======================> intelfsh_device_config
class intelfsh_device_config : public device_config,
public device_config_nvram_interface
{
friend class intelfsh_device;
protected:
// constants
enum
{
// 8-bit variants
FLASH_INTEL_28F016S5 = 0x0800,
FLASH_FUJITSU_29F016A,
FLASH_SHARP_LH28F016S,
FLASH_INTEL_E28F400,
FLASH_MACRONIX_29L001MC,
FLASH_PANASONIC_MN63F805MNP,
FLASH_SANYO_LE26FV10N1TS,
// 16-bit variants
FLASH_SHARP_LH28F400 = 0x1000,
FLASH_INTEL_E28F008SA,
FLASH_INTEL_TE28F160,
FLASH_SHARP_UNK128MBIT
};
// construction/destruction
intelfsh_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant);
// internal state
UINT32 m_type;
};
// ======================> intelfsh_device
class intelfsh_device : public device_t,
public device_nvram_interface
{
friend class intelfsh_device_config;
protected:
// construction/destruction
intelfsh_device(running_machine &_machine, const intelfsh_device_config &config);
public:
// helpers
void *memory() const { return m_flash_memory; }
protected:
// device-level overrides
virtual void device_start();
virtual void device_timer(emu_timer &timer, int param, void *ptr);
// device_intelfsh_interface overrides
virtual void nvram_default();
virtual void nvram_read(mame_file &file);
virtual void nvram_write(mame_file &file);
// derived helpers
UINT32 read_full(UINT32 offset);
void write_full(UINT32 offset, UINT32 data);
// internal state
const intelfsh_device_config & m_config;
INT32 m_size;
UINT8 m_bits;
UINT8 m_status;
INT32 m_erase_sector;
bool m_sector_is_4k;
INT32 m_flash_mode;
bool m_flash_master_lock;
UINT8 m_device_id;
UINT8 m_maker_id;
emu_timer * m_timer;
void * m_flash_memory;
};
// ======================> intelfsh8_device_config
class intelfsh8_device_config : public intelfsh_device_config
{
friend class intelfsh8_device;
protected:
// construction/destruction
intelfsh8_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant);
};
// ======================> intelfsh8_device
class intelfsh8_device : public intelfsh_device
{
friend class intelfsh8_device_config;
friend class intel_28f016s5_device_config;
friend class fujitsu_29f016a_device_config;
friend class sharp_lh28f016s_device_config;
friend class intel_e28f008sa_device_config;
friend class macronix_29l001mc_device_config;
friend class panasonic_mn63f805mnp_device_config;
friend class sanyo_le26fv10n1ts_device_config;
protected:
// construction/destruction
intelfsh8_device(running_machine &_machine, const intelfsh_device_config &config);
public:
// public interface
UINT8 read(offs_t offset) { return read_full(offset); }
void write(offs_t offset, UINT8 data) { write_full(offset, data); }
};
// ======================> intelfsh16_device_config
class intelfsh16_device_config : public intelfsh_device_config
{
friend class intelfsh16_device;
protected:
// construction/destruction
intelfsh16_device_config(const machine_config &mconfig, device_type type, const char *name, const char *tag, const device_config *owner, UINT32 clock, UINT32 variant);
};
// ======================> intelfsh16_device
class intelfsh16_device : public intelfsh_device
{
friend class intelfsh16_device_config;
friend class sharp_lh28f400_device_config;
friend class intel_te28f160_device_config;
friend class intel_e28f400_device_config;
friend class sharp_unk128mbit_device_config;
protected:
// construction/destruction
intelfsh16_device(running_machine &_machine, const intelfsh_device_config &config);
public:
// public interface
UINT16 read(offs_t offset) { return read_full(offset); }
void write(offs_t offset, UINT16 data) { write_full(offset, data); }
};
// ======================> trivial variants
// 8-bit variants
DECLARE_TRIVIAL_DERIVED_DEVICE(intel_28f016s5_device_config, intelfsh8_device_config, intel_28f016s5_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(fujitsu_29f016a_device_config, intelfsh8_device_config, fujitsu_29f016a_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f016s_device_config, intelfsh8_device_config, sharp_lh28f016s_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(intel_e28f008sa_device_config, intelfsh8_device_config, intel_e28f008sa_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(macronix_29l001mc_device_config, intelfsh8_device_config, macronix_29l001mc_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(panasonic_mn63f805mnp_device_config, intelfsh8_device_config, panasonic_mn63f805mnp_device, intelfsh8_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(sanyo_le26fv10n1ts_device_config, intelfsh8_device_config, sanyo_le26fv10n1ts_device, intelfsh8_device)
// 16-bit variants
DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_lh28f400_device_config, intelfsh16_device_config, sharp_lh28f400_device, intelfsh16_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(intel_te28f160_device_config, intelfsh16_device_config, intel_te28f160_device, intelfsh16_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(intel_e28f400_device_config, intelfsh16_device_config, intel_e28f400_device, intelfsh16_device)
DECLARE_TRIVIAL_DERIVED_DEVICE(sharp_unk128mbit_device_config, intelfsh16_device_config, sharp_unk128mbit_device, intelfsh16_device)
// device type definition
extern const device_type INTEL_28F016S5;
extern const device_type SHARP_LH28F016S;
extern const device_type FUJITSU_29F016A;
extern const device_type INTEL_E28F400;
extern const device_type MACRONIX_29L001MC;
extern const device_type PANASONIC_MN63F805MNP;
extern const device_type SANYO_LE26FV10N1TS;
extern const device_type SHARP_LH28F400;
extern const device_type INTEL_E28F008SA;
extern const device_type INTEL_TE28F160;
extern const device_type SHARP_UNK128MBIT;
extern void intelflash_init( running_machine *machine, int chip, int type, void *data );
extern UINT32 intelflash_read( int chip, UINT32 address );
extern void intelflash_write( int chip, UINT32 address, UINT32 value );
extern void nvram_handler_intelflash( running_machine *machine, int chip, mame_file *file, int read_or_write );
extern void* intelflash_getmemptr(int chip);
#endif #endif

View File

@ -337,6 +337,8 @@ Notes:
#define DMA_XOR(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,2)) #define DMA_XOR(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,2))
static fujitsu_29f016a_device *flashrom[48];
static UINT32* decrypted_bios; static UINT32* decrypted_bios;
static UINT32* decrypted_gamerom; static UINT32* decrypted_gamerom;
@ -684,8 +686,6 @@ static void cps3_decrypt_bios(running_machine *machine)
static DRIVER_INIT( cps3 ) static DRIVER_INIT( cps3 )
{ {
int i;
// cache pointers to regions // cache pointers to regions
cps3_user4region = memory_region(machine,"user4"); cps3_user4region = memory_region(machine,"user4");
cps3_user5region = memory_region(machine,"user5"); cps3_user5region = memory_region(machine,"user5");
@ -711,9 +711,9 @@ static DRIVER_INIT( cps3 )
main->set_direct_update_handler(direct_update_delegate_create_static(cps3_direct_handler, *machine)); main->set_direct_update_handler(direct_update_delegate_create_static(cps3_direct_handler, *machine));
// flash roms // flash roms
astring tempstr;
for (i=0;i<48;i++) for (int index = 0; index < 48; index++)
intelflash_init( machine, i, FLASH_FUJITSU_29F016A, NULL ); flashrom[index] = machine->device<fujitsu_29f016a_device>(tempstr.format("flash%d", index));
cps3_eeprom = auto_alloc_array(machine, UINT32, 0x400/4); cps3_eeprom = auto_alloc_array(machine, UINT32, 0x400/4);
} }
@ -1363,22 +1363,22 @@ static READ32_HANDLER( cps3_gfxflash_r )
if (ACCESSING_BITS_24_31) // GFX Flash 1 if (ACCESSING_BITS_24_31) // GFX Flash 1
{ {
logerror("read GFX flash chip %d addr %02x\n", flash1-8, (offset<<1)); logerror("read GFX flash chip %d addr %02x\n", flash1-8, (offset<<1));
result |= intelflash_read(flash1, (offset<<1) ) << 24; result |= flashrom[flash1]->read( (offset<<1) ) << 24;
} }
if (ACCESSING_BITS_16_23) // GFX Flash 2 if (ACCESSING_BITS_16_23) // GFX Flash 2
{ {
logerror("read GFX flash chip %d addr %02x\n", flash2-8, (offset<<1)); logerror("read GFX flash chip %d addr %02x\n", flash2-8, (offset<<1));
result |= intelflash_read(flash2, (offset<<1) ) << 16; result |= flashrom[flash2]->read( (offset<<1) ) << 16;
} }
if (ACCESSING_BITS_8_15) // GFX Flash 1 if (ACCESSING_BITS_8_15) // GFX Flash 1
{ {
logerror("read GFX flash chip %d addr %02x\n", flash1-8, (offset<<1)+1); logerror("read GFX flash chip %d addr %02x\n", flash1-8, (offset<<1)+1);
result |= intelflash_read(flash1, (offset<<1)+0x1 ) << 8; result |= flashrom[flash1]->read( (offset<<1)+0x1 ) << 8;
} }
if (ACCESSING_BITS_0_7) // GFX Flash 2 if (ACCESSING_BITS_0_7) // GFX Flash 2
{ {
logerror("read GFX flash chip %d addr %02x\n", flash2-8, (offset<<1)+1); logerror("read GFX flash chip %d addr %02x\n", flash2-8, (offset<<1)+1);
result |= intelflash_read(flash2, (offset<<1)+0x1 ) << 0; result |= flashrom[flash2]->read( (offset<<1)+0x1 ) << 0;
} }
//printf("read GFX flash chips addr %02x returning %08x mem_mask %08x crambank %08x gfxbank %08x\n", offset*2, result,mem_mask, cram_bank, cram_gfxflash_bank ); //printf("read GFX flash chips addr %02x returning %08x mem_mask %08x crambank %08x gfxbank %08x\n", offset*2, result,mem_mask, cram_bank, cram_gfxflash_bank );
@ -1404,25 +1404,25 @@ static WRITE32_HANDLER( cps3_gfxflash_w )
{ {
command = (data >> 24) & 0xff; command = (data >> 24) & 0xff;
logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1), command); logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1), command);
intelflash_write(flash1, (offset<<1), command); flashrom[flash1]->write( (offset<<1), command);
} }
if (ACCESSING_BITS_16_23) // GFX Flash 2 if (ACCESSING_BITS_16_23) // GFX Flash 2
{ {
command = (data >> 16) & 0xff; command = (data >> 16) & 0xff;
logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash2-8, (offset<<1), command); logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash2-8, (offset<<1), command);
intelflash_write(flash2, (offset<<1), command); flashrom[flash2]->write( (offset<<1), command);
} }
if (ACCESSING_BITS_8_15) // GFX Flash 1 if (ACCESSING_BITS_8_15) // GFX Flash 1
{ {
command = (data >> 8) & 0xff; command = (data >> 8) & 0xff;
logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1)+1, command); logerror("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1)+1, command);
intelflash_write(flash1, (offset<<1)+0x1, command); flashrom[flash1]->write( (offset<<1)+0x1, command);
} }
if (ACCESSING_BITS_0_7) // GFX Flash 2 if (ACCESSING_BITS_0_7) // GFX Flash 2
{ {
command = (data >> 0) & 0xff; command = (data >> 0) & 0xff;
//if ( ((offset<<1)+1) != 0x555) printf("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1)+1, command); //if ( ((offset<<1)+1) != 0x555) printf("write to GFX flash chip %d addr %02x cmd %02x\n", flash1-8, (offset<<1)+1, command);
intelflash_write(flash2, (offset<<1)+0x1, command); flashrom[flash2]->write( (offset<<1)+0x1, command);
} }
/* make a copy in the linear memory region we actually use for drawing etc. having it stored in interleaved flash roms isnt' very useful */ /* make a copy in the linear memory region we actually use for drawing etc. having it stored in interleaved flash roms isnt' very useful */
@ -1430,8 +1430,8 @@ static WRITE32_HANDLER( cps3_gfxflash_w )
UINT32* romdata = (UINT32*)cps3_user5region; UINT32* romdata = (UINT32*)cps3_user5region;
int real_offset = 0; int real_offset = 0;
UINT32 newdata; UINT32 newdata;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(flash1); UINT8* ptr1 = (UINT8*)flashrom[flash1]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(flash2); UINT8* ptr2 = (UINT8*)flashrom[flash2]->memory();
real_offset = ((cram_gfxflash_bank&0x3e) * 0x200000) + offset*4; real_offset = ((cram_gfxflash_bank&0x3e) * 0x200000) + offset*4;
@ -1454,22 +1454,22 @@ static UINT32 cps3_flashmain_r(int base, UINT32 offset, UINT32 mem_mask)
if (ACCESSING_BITS_24_31) // Flash 1 if (ACCESSING_BITS_24_31) // Flash 1
{ {
// logerror("read flash chip %d addr %02x\n", base+0, offset*4 ); // logerror("read flash chip %d addr %02x\n", base+0, offset*4 );
result |= (intelflash_read(base+0, offset)<<24); result |= (flashrom[base+0]->read(offset)<<24);
} }
if (ACCESSING_BITS_16_23) // Flash 1 if (ACCESSING_BITS_16_23) // Flash 1
{ {
// logerror("read flash chip %d addr %02x\n", base+1, offset*4 ); // logerror("read flash chip %d addr %02x\n", base+1, offset*4 );
result |= (intelflash_read(base+1, offset)<<16); result |= (flashrom[base+1]->read(offset)<<16);
} }
if (ACCESSING_BITS_8_15) // Flash 1 if (ACCESSING_BITS_8_15) // Flash 1
{ {
// logerror("read flash chip %d addr %02x\n", base+2, offset*4 ); // logerror("read flash chip %d addr %02x\n", base+2, offset*4 );
result |= (intelflash_read(base+2, offset)<<8); result |= (flashrom[base+2]->read(offset)<<8);
} }
if (ACCESSING_BITS_0_7) // Flash 1 if (ACCESSING_BITS_0_7) // Flash 1
{ {
// logerror("read flash chip %d addr %02x\n", base+3, offset*4 ); // logerror("read flash chip %d addr %02x\n", base+3, offset*4 );
result |= (intelflash_read(base+3, offset)<<0); result |= (flashrom[base+3]->read(offset)<<0);
} }
// if (base==4) logerror("read flash chips addr %02x returning %08x\n", offset*4, result ); // if (base==4) logerror("read flash chips addr %02x returning %08x\n", offset*4, result );
@ -1506,25 +1506,25 @@ static void cps3_flashmain_w(running_machine *machine, int base, UINT32 offset,
{ {
command = (data >> 24) & 0xff; command = (data >> 24) & 0xff;
logerror("write to flash chip %d addr %02x cmd %02x\n", base+0, offset, command); logerror("write to flash chip %d addr %02x cmd %02x\n", base+0, offset, command);
intelflash_write(base+0, offset, command); flashrom[base+0]->write(offset, command);
} }
if (ACCESSING_BITS_16_23) // Flash 2 if (ACCESSING_BITS_16_23) // Flash 2
{ {
command = (data >> 16) & 0xff; command = (data >> 16) & 0xff;
logerror("write to flash chip %d addr %02x cmd %02x\n", base+1, offset, command); logerror("write to flash chip %d addr %02x cmd %02x\n", base+1, offset, command);
intelflash_write(base+1, offset, command); flashrom[base+1]->write(offset, command);
} }
if (ACCESSING_BITS_8_15) // Flash 2 if (ACCESSING_BITS_8_15) // Flash 2
{ {
command = (data >> 8) & 0xff; command = (data >> 8) & 0xff;
logerror("write to flash chip %d addr %02x cmd %02x\n", base+2, offset, command); logerror("write to flash chip %d addr %02x cmd %02x\n", base+2, offset, command);
intelflash_write(base+2, offset, command); flashrom[base+2]->write(offset, command);
} }
if (ACCESSING_BITS_0_7) // Flash 2 if (ACCESSING_BITS_0_7) // Flash 2
{ {
command = (data >> 0) & 0xff; command = (data >> 0) & 0xff;
logerror("write to flash chip %d addr %02x cmd %02x\n", base+3, offset, command); logerror("write to flash chip %d addr %02x cmd %02x\n", base+3, offset, command);
intelflash_write(base+3, offset, command); flashrom[base+3]->write(offset, command);
} }
/* copy data into regions to execute from */ /* copy data into regions to execute from */
@ -1533,10 +1533,10 @@ static void cps3_flashmain_w(running_machine *machine, int base, UINT32 offset,
UINT32* romdata2 = (UINT32*)decrypted_gamerom; UINT32* romdata2 = (UINT32*)decrypted_gamerom;
int real_offset = 0; int real_offset = 0;
UINT32 newdata; UINT32 newdata;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(base+0); UINT8* ptr1 = (UINT8*)flashrom[base+0]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(base+1); UINT8* ptr2 = (UINT8*)flashrom[base+1]->memory();
UINT8* ptr3 = (UINT8*)intelflash_getmemptr(base+2); UINT8* ptr3 = (UINT8*)flashrom[base+2]->memory();
UINT8* ptr4 = (UINT8*)intelflash_getmemptr(base+3); UINT8* ptr4 = (UINT8*)flashrom[base+3]->memory();
real_offset = offset * 4; real_offset = offset * 4;
@ -2298,10 +2298,10 @@ static void precopy_to_flash(running_machine *machine)
for (i=0;i<0x800000;i+=4) for (i=0;i<0x800000;i+=4)
{ {
UINT32 data; UINT32 data;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(0); UINT8* ptr1 = (UINT8*)flashrom[0]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(1); UINT8* ptr2 = (UINT8*)flashrom[1]->memory();
UINT8* ptr3 = (UINT8*)intelflash_getmemptr(2); UINT8* ptr3 = (UINT8*)flashrom[2]->memory();
UINT8* ptr4 = (UINT8*)intelflash_getmemptr(3); UINT8* ptr4 = (UINT8*)flashrom[3]->memory();
data = romdata[i/4]; data = romdata[i/4];
@ -2314,10 +2314,10 @@ static void precopy_to_flash(running_machine *machine)
for (i=0;i<0x800000;i+=4) for (i=0;i<0x800000;i+=4)
{ {
UINT32 data; UINT32 data;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(4); UINT8* ptr1 = (UINT8*)flashrom[4]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(5); UINT8* ptr2 = (UINT8*)flashrom[5]->memory();
UINT8* ptr3 = (UINT8*)intelflash_getmemptr(6); UINT8* ptr3 = (UINT8*)flashrom[6]->memory();
UINT8* ptr4 = (UINT8*)intelflash_getmemptr(7); UINT8* ptr4 = (UINT8*)flashrom[7]->memory();
data = romdata[(0x800000+i)/4]; data = romdata[(0x800000+i)/4];
@ -2339,8 +2339,8 @@ static void precopy_to_flash(running_machine *machine)
for (i=0;i<0x200000;i+=2) for (i=0;i<0x200000;i+=2)
{ {
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(flashnum); UINT8* ptr1 = (UINT8*)flashrom[flashnum]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(flashnum+1); UINT8* ptr2 = (UINT8*)flashrom[flashnum+1]->memory();
UINT32 dat = romdata[(thebase+i)/2]; UINT32 dat = romdata[(thebase+i)/2];
ptr1[BYTE_XOR_LE(i+1)] = (dat&0xff000000)>>24; ptr1[BYTE_XOR_LE(i+1)] = (dat&0xff000000)>>24;
@ -2365,10 +2365,10 @@ static void copy_from_nvram(running_machine *machine)
for (i=0;i<0x800000;i+=4) for (i=0;i<0x800000;i+=4)
{ {
UINT32 data; UINT32 data;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(0); UINT8* ptr1 = (UINT8*)flashrom[0]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(1); UINT8* ptr2 = (UINT8*)flashrom[1]->memory();
UINT8* ptr3 = (UINT8*)intelflash_getmemptr(2); UINT8* ptr3 = (UINT8*)flashrom[2]->memory();
UINT8* ptr4 = (UINT8*)intelflash_getmemptr(3); UINT8* ptr4 = (UINT8*)flashrom[3]->memory();
data = ((ptr1[i/4]<<24) | (ptr2[i/4]<<16) | (ptr3[i/4]<<8) | (ptr4[i/4]<<0)); data = ((ptr1[i/4]<<24) | (ptr2[i/4]<<16) | (ptr3[i/4]<<8) | (ptr4[i/4]<<0));
@ -2384,10 +2384,10 @@ static void copy_from_nvram(running_machine *machine)
for (i=0;i<0x800000;i+=4) for (i=0;i<0x800000;i+=4)
{ {
UINT32 data; UINT32 data;
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(4); UINT8* ptr1 = (UINT8*)flashrom[4]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(5); UINT8* ptr2 = (UINT8*)flashrom[5]->memory();
UINT8* ptr3 = (UINT8*)intelflash_getmemptr(6); UINT8* ptr3 = (UINT8*)flashrom[6]->memory();
UINT8* ptr4 = (UINT8*)intelflash_getmemptr(7); UINT8* ptr4 = (UINT8*)flashrom[7]->memory();
data = ((ptr1[i/4]<<24) | (ptr2[i/4]<<16) | (ptr3[i/4]<<8) | (ptr4[i/4]<<0)); data = ((ptr1[i/4]<<24) | (ptr2[i/4]<<16) | (ptr3[i/4]<<8) | (ptr4[i/4]<<0));
@ -2409,8 +2409,8 @@ static void copy_from_nvram(running_machine *machine)
for (i=0;i<0x200000;i+=2) for (i=0;i<0x200000;i+=2)
{ {
UINT8* ptr1 = (UINT8*)intelflash_getmemptr(flashnum); UINT8* ptr1 = (UINT8*)flashrom[flashnum]->memory();
UINT8* ptr2 = (UINT8*)intelflash_getmemptr(flashnum+1); UINT8* ptr2 = (UINT8*)flashrom[flashnum+1]->memory();
UINT32 dat = (ptr1[i+0]<<8) | UINT32 dat = (ptr1[i+0]<<8) |
(ptr1[i+1]<<24) | (ptr1[i+1]<<24) |
(ptr2[i+0]<<0) | (ptr2[i+0]<<0) |
@ -2446,21 +2446,15 @@ static void copy_from_nvram(running_machine *machine)
static NVRAM_HANDLER( cps3 ) static NVRAM_HANDLER( cps3 )
{ {
int i;
if (read_or_write) if (read_or_write)
{ {
//printf("read_write\n"); //printf("read_write\n");
mame_fwrite(file, cps3_eeprom, 0x400); mame_fwrite(file, cps3_eeprom, 0x400);
for (i=0;i<48;i++)
nvram_handler_intelflash( machine, i, file, read_or_write );
} }
else if (file) else if (file)
{ {
//printf("file\n"); //printf("file\n");
mame_fread(file, cps3_eeprom, 0x400); mame_fread(file, cps3_eeprom, 0x400);
for (i=0;i<48;i++)
nvram_handler_intelflash( machine, i, file, read_or_write );
copy_from_nvram(machine); // copy data from flashroms back into user regions + decrypt into regions we execute/draw from. copy_from_nvram(machine); // copy data from flashroms back into user regions + decrypt into regions we execute/draw from.
} }
@ -2562,6 +2556,56 @@ static MACHINE_CONFIG_START( cps3, driver_device )
42.9545MHz / 15.4445kHz = 2781.217 / 6 = 463.536 -> unlikely 42.9545MHz / 15.4445kHz = 2781.217 / 6 = 463.536 -> unlikely
*/ */
// 48 flash chips
MDRV_FUJITSU_29F016A_ADD("flash0")
MDRV_FUJITSU_29F016A_ADD("flash1")
MDRV_FUJITSU_29F016A_ADD("flash2")
MDRV_FUJITSU_29F016A_ADD("flash3")
MDRV_FUJITSU_29F016A_ADD("flash4")
MDRV_FUJITSU_29F016A_ADD("flash5")
MDRV_FUJITSU_29F016A_ADD("flash6")
MDRV_FUJITSU_29F016A_ADD("flash7")
MDRV_FUJITSU_29F016A_ADD("flash8")
MDRV_FUJITSU_29F016A_ADD("flash9")
MDRV_FUJITSU_29F016A_ADD("flash10")
MDRV_FUJITSU_29F016A_ADD("flash11")
MDRV_FUJITSU_29F016A_ADD("flash12")
MDRV_FUJITSU_29F016A_ADD("flash13")
MDRV_FUJITSU_29F016A_ADD("flash14")
MDRV_FUJITSU_29F016A_ADD("flash15")
MDRV_FUJITSU_29F016A_ADD("flash16")
MDRV_FUJITSU_29F016A_ADD("flash17")
MDRV_FUJITSU_29F016A_ADD("flash18")
MDRV_FUJITSU_29F016A_ADD("flash19")
MDRV_FUJITSU_29F016A_ADD("flash20")
MDRV_FUJITSU_29F016A_ADD("flash21")
MDRV_FUJITSU_29F016A_ADD("flash22")
MDRV_FUJITSU_29F016A_ADD("flash23")
MDRV_FUJITSU_29F016A_ADD("flash24")
MDRV_FUJITSU_29F016A_ADD("flash25")
MDRV_FUJITSU_29F016A_ADD("flash26")
MDRV_FUJITSU_29F016A_ADD("flash27")
MDRV_FUJITSU_29F016A_ADD("flash28")
MDRV_FUJITSU_29F016A_ADD("flash29")
MDRV_FUJITSU_29F016A_ADD("flash30")
MDRV_FUJITSU_29F016A_ADD("flash31")
MDRV_FUJITSU_29F016A_ADD("flash32")
MDRV_FUJITSU_29F016A_ADD("flash33")
MDRV_FUJITSU_29F016A_ADD("flash34")
MDRV_FUJITSU_29F016A_ADD("flash35")
MDRV_FUJITSU_29F016A_ADD("flash36")
MDRV_FUJITSU_29F016A_ADD("flash37")
MDRV_FUJITSU_29F016A_ADD("flash38")
MDRV_FUJITSU_29F016A_ADD("flash39")
MDRV_FUJITSU_29F016A_ADD("flash40")
MDRV_FUJITSU_29F016A_ADD("flash41")
MDRV_FUJITSU_29F016A_ADD("flash42")
MDRV_FUJITSU_29F016A_ADD("flash43")
MDRV_FUJITSU_29F016A_ADD("flash44")
MDRV_FUJITSU_29F016A_ADD("flash45")
MDRV_FUJITSU_29F016A_ADD("flash46")
MDRV_FUJITSU_29F016A_ADD("flash47")
MDRV_MACHINE_START(cps3) MDRV_MACHINE_START(cps3)
MDRV_MACHINE_RESET(cps3) MDRV_MACHINE_RESET(cps3)
MDRV_NVRAM_HANDLER( cps3 ) MDRV_NVRAM_HANDLER( cps3 )

View File

@ -135,6 +135,8 @@ static UINT8 extend_board_irq_active;
static emu_timer *keyboard_timer; static emu_timer *keyboard_timer;
static fujitsu_29f016a_device *flash[3];
static GCU_REGS gcu[2]; static GCU_REGS gcu[2];
static VIDEO_START(firebeat) static VIDEO_START(firebeat)
@ -709,19 +711,19 @@ static READ32_HANDLER(flashram_r)
UINT32 r = 0; UINT32 r = 0;
if (ACCESSING_BITS_24_31) if (ACCESSING_BITS_24_31)
{ {
r |= (intelflash_read(0, (offset*4)+0) & 0xff) << 24; r |= (flash[0]->read((offset*4)+0) & 0xff) << 24;
} }
if (ACCESSING_BITS_16_23) if (ACCESSING_BITS_16_23)
{ {
r |= (intelflash_read(0, (offset*4)+1) & 0xff) << 16; r |= (flash[0]->read((offset*4)+1) & 0xff) << 16;
} }
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
r |= (intelflash_read(0, (offset*4)+2) & 0xff) << 8; r |= (flash[0]->read((offset*4)+2) & 0xff) << 8;
} }
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
r |= (intelflash_read(0, (offset*4)+3) & 0xff) << 0; r |= (flash[0]->read((offset*4)+3) & 0xff) << 0;
} }
return r; return r;
} }
@ -730,85 +732,85 @@ static WRITE32_HANDLER(flashram_w)
{ {
if (ACCESSING_BITS_24_31) if (ACCESSING_BITS_24_31)
{ {
intelflash_write(0, (offset*4)+0, (data >> 24) & 0xff); flash[0]->write((offset*4)+0, (data >> 24) & 0xff);
} }
if (ACCESSING_BITS_16_23) if (ACCESSING_BITS_16_23)
{ {
intelflash_write(0, (offset*4)+1, (data >> 16) & 0xff); flash[0]->write((offset*4)+1, (data >> 16) & 0xff);
} }
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
intelflash_write(0, (offset*4)+2, (data >> 8) & 0xff); flash[0]->write((offset*4)+2, (data >> 8) & 0xff);
} }
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
intelflash_write(0, (offset*4)+3, (data >> 0) & 0xff); flash[0]->write((offset*4)+3, (data >> 0) & 0xff);
} }
} }
static READ32_HANDLER(soundflash_r) static READ32_HANDLER(soundflash_r)
{ {
UINT32 r = 0; UINT32 r = 0;
int chip; fujitsu_29f016a_device *chip;
if (offset >= 0 && offset < 0x200000/4) if (offset >= 0 && offset < 0x200000/4)
{ {
chip = 1; chip = flash[1];
} }
else else
{ {
chip = 2; chip = flash[2];
} }
offset &= 0x7ffff; offset &= 0x7ffff;
if (ACCESSING_BITS_24_31) if (ACCESSING_BITS_24_31)
{ {
r |= (intelflash_read(chip, (offset*4)+0) & 0xff) << 24; r |= (chip->read((offset*4)+0) & 0xff) << 24;
} }
if (ACCESSING_BITS_16_23) if (ACCESSING_BITS_16_23)
{ {
r |= (intelflash_read(chip, (offset*4)+1) & 0xff) << 16; r |= (chip->read((offset*4)+1) & 0xff) << 16;
} }
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
r |= (intelflash_read(chip, (offset*4)+2) & 0xff) << 8; r |= (chip->read((offset*4)+2) & 0xff) << 8;
} }
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
r |= (intelflash_read(chip, (offset*4)+3) & 0xff) << 0; r |= (chip->read((offset*4)+3) & 0xff) << 0;
} }
return r; return r;
} }
static WRITE32_HANDLER(soundflash_w) static WRITE32_HANDLER(soundflash_w)
{ {
int chip; fujitsu_29f016a_device *chip;
if (offset >= 0 && offset < 0x200000/4) if (offset >= 0 && offset < 0x200000/4)
{ {
chip = 1; chip = flash[1];
} }
else else
{ {
chip = 2; chip = flash[2];
} }
offset &= 0x7ffff; offset &= 0x7ffff;
if (ACCESSING_BITS_24_31) if (ACCESSING_BITS_24_31)
{ {
intelflash_write(chip, (offset*4)+0, (data >> 24) & 0xff); chip->write((offset*4)+0, (data >> 24) & 0xff);
} }
if (ACCESSING_BITS_16_23) if (ACCESSING_BITS_16_23)
{ {
intelflash_write(chip, (offset*4)+1, (data >> 16) & 0xff); chip->write((offset*4)+1, (data >> 16) & 0xff);
} }
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
intelflash_write(chip, (offset*4)+2, (data >> 8) & 0xff); chip->write((offset*4)+2, (data >> 8) & 0xff);
} }
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
intelflash_write(chip, (offset*4)+3, (data >> 0) & 0xff); chip->write((offset*4)+3, (data >> 0) & 0xff);
} }
} }
@ -1687,6 +1689,10 @@ static MACHINE_START( firebeat )
/* configure fast RAM regions for DRC */ /* configure fast RAM regions for DRC */
ppcdrc_add_fastram(machine->device("maincpu"), 0x00000000, 0x01ffffff, FALSE, work_ram); ppcdrc_add_fastram(machine->device("maincpu"), 0x00000000, 0x01ffffff, FALSE, work_ram);
flash[0] = machine->device<fujitsu_29f016a_device>("flash0");
flash[1] = machine->device<fujitsu_29f016a_device>("flash1");
flash[2] = machine->device<fujitsu_29f016a_device>("flash2");
} }
static ADDRESS_MAP_START( firebeat_map, ADDRESS_SPACE_PROGRAM, 32 ) static ADDRESS_MAP_START( firebeat_map, ADDRESS_SPACE_PROGRAM, 32 )
@ -1724,11 +1730,11 @@ static READ8_DEVICE_HANDLER( soundram_r )
{ {
if (offset >= 0 && offset < 0x200000) if (offset >= 0 && offset < 0x200000)
{ {
return intelflash_read(1, offset & 0x1fffff); return flash[1]->read(offset & 0x1fffff);
} }
else if (offset >= 0x200000 && offset < 0x400000) else if (offset >= 0x200000 && offset < 0x400000)
{ {
return intelflash_read(2, offset & 0x1fffff); return flash[2]->read(offset & 0x1fffff);
} }
return 0; return 0;
} }
@ -1743,13 +1749,6 @@ static const ymz280b_interface ymz280b_intf =
DEVCB_HANDLER(soundram_r) DEVCB_HANDLER(soundram_r)
}; };
static NVRAM_HANDLER(firebeat)
{
nvram_handler_intelflash(machine, 0, file, read_or_write);
nvram_handler_intelflash(machine, 1, file, read_or_write);
nvram_handler_intelflash(machine, 2, file, read_or_write);
}
static INPUT_PORTS_START(ppp) static INPUT_PORTS_START(ppp)
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Left PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Left
@ -1904,8 +1903,8 @@ static MACHINE_RESET( firebeat )
for (i=0; i < 0x200000; i++) for (i=0; i < 0x200000; i++)
{ {
sound[i] = intelflash_read(1, i); sound[i] = flash[1]->read(i);
sound[i+0x200000] = intelflash_read(2, i); sound[i+0x200000] = flash[2]->read(i);
} }
SCSIGetDevice( atapi_device_data[1], &cd ); SCSIGetDevice( atapi_device_data[1], &cd );
@ -1921,10 +1920,13 @@ static MACHINE_CONFIG_START( firebeat, driver_device )
MDRV_MACHINE_START(firebeat) MDRV_MACHINE_START(firebeat)
MDRV_MACHINE_RESET(firebeat) MDRV_MACHINE_RESET(firebeat)
MDRV_NVRAM_HANDLER(firebeat)
MDRV_RTC65271_ADD("rtc", NULL) MDRV_RTC65271_ADD("rtc", NULL)
MDRV_FUJITSU_29F016A_ADD("flash0")
MDRV_FUJITSU_29F016A_ADD("flash1")
MDRV_FUJITSU_29F016A_ADD("flash2")
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -1960,11 +1962,15 @@ static MACHINE_CONFIG_START( firebeat2, driver_device )
MDRV_CPU_PROGRAM_MAP(firebeat_map) MDRV_CPU_PROGRAM_MAP(firebeat_map)
MDRV_CPU_VBLANK_INT("lscreen", firebeat_interrupt) MDRV_CPU_VBLANK_INT("lscreen", firebeat_interrupt)
MDRV_MACHINE_START(firebeat)
MDRV_MACHINE_RESET(firebeat) MDRV_MACHINE_RESET(firebeat)
MDRV_NVRAM_HANDLER(firebeat)
MDRV_RTC65271_ADD("rtc", NULL) MDRV_RTC65271_ADD("rtc", NULL)
MDRV_FUJITSU_29F016A_ADD("flash0")
MDRV_FUJITSU_29F016A_ADD("flash1")
MDRV_FUJITSU_29F016A_ADD("flash2")
/* video hardware */ /* video hardware */
MDRV_PALETTE_LENGTH(32768) MDRV_PALETTE_LENGTH(32768)
MDRV_PALETTE_INIT(RRRRR_GGGGG_BBBBB) MDRV_PALETTE_INIT(RRRRR_GGGGG_BBBBB)
@ -2176,9 +2182,6 @@ static void init_firebeat(running_machine *machine)
UINT8 *rom = memory_region(machine, "user2"); UINT8 *rom = memory_region(machine, "user2");
atapi_init(machine); atapi_init(machine);
intelflash_init(machine, 0, FLASH_FUJITSU_29F016A, NULL);
intelflash_init(machine, 1, FLASH_FUJITSU_29F016A, NULL);
intelflash_init(machine, 2, FLASH_FUJITSU_29F016A, NULL);
pc16552d_init(machine, 0, 19660800, comm_uart_irq_callback, 0); // Network UART pc16552d_init(machine, 0, 19660800, comm_uart_irq_callback, 0); // Network UART
pc16552d_init(machine, 1, 24000000, midi_uart_irq_callback, 0); // MIDI UART pc16552d_init(machine, 1, 24000000, midi_uart_irq_callback, 0); // MIDI UART

View File

@ -132,6 +132,9 @@ static UINT32 trackball_data[ 2 ];
static UINT16 btc_trackball_prev[ 4 ]; static UINT16 btc_trackball_prev[ 4 ];
static UINT32 btc_trackball_data[ 4 ]; static UINT32 btc_trackball_data[ 4 ];
static fujitsu_29f016a_device *flash8[4];
static sharp_lh28f400_device *flash16[4];
/* EEPROM handlers */ /* EEPROM handlers */
static WRITE32_DEVICE_HANDLER( eeprom_w ) static WRITE32_DEVICE_HANDLER( eeprom_w )
@ -365,6 +368,7 @@ static MACHINE_CONFIG_START( konamigv, driver_device )
MDRV_SOUND_ROUTE( 1, "rspeaker", 1.0 ) MDRV_SOUND_ROUTE( 1, "rspeaker", 1.0 )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static INPUT_PORTS_START( konamigv ) static INPUT_PORTS_START( konamigv )
PORT_START("P1") PORT_START("P1")
PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
@ -426,14 +430,6 @@ INPUT_PORTS_END
/* Simpsons Bowling */ /* Simpsons Bowling */
static NVRAM_HANDLER( simpbowl )
{
nvram_handler_intelflash( machine, 0, file, read_or_write );
nvram_handler_intelflash( machine, 1, file, read_or_write );
nvram_handler_intelflash( machine, 2, file, read_or_write );
nvram_handler_intelflash( machine, 3, file, read_or_write );
}
static READ32_HANDLER( flash_r ) static READ32_HANDLER( flash_r )
{ {
int reg = offset*2; int reg = offset*2;
@ -455,8 +451,8 @@ static READ32_HANDLER( flash_r )
int chip = (flash_address >= 0x200000) ? 2 : 0; int chip = (flash_address >= 0x200000) ? 2 : 0;
int ret; int ret;
ret = intelflash_read(chip, flash_address & 0x1fffff) & 0xff; ret = flash8[chip]->read(flash_address & 0x1fffff) & 0xff;
ret |= intelflash_read(chip+1, flash_address & 0x1fffff)<<8; ret |= flash8[chip+1]->read(flash_address & 0x1fffff)<<8;
flash_address++; flash_address++;
return ret; return ret;
@ -479,8 +475,8 @@ static WRITE32_HANDLER( flash_w )
{ {
case 0: case 0:
chip = (flash_address >= 0x200000) ? 2 : 0; chip = (flash_address >= 0x200000) ? 2 : 0;
intelflash_write(chip, flash_address & 0x1fffff, data&0xff); flash8[chip]->write(flash_address & 0x1fffff, data&0xff);
intelflash_write(chip+1, flash_address & 0x1fffff, (data>>8)&0xff); flash8[chip+1]->write(flash_address & 0x1fffff, (data>>8)&0xff);
break; break;
case 1: case 1:
@ -525,10 +521,10 @@ static READ32_HANDLER( unknown_r )
static DRIVER_INIT( simpbowl ) static DRIVER_INIT( simpbowl )
{ {
intelflash_init( machine, 0, FLASH_FUJITSU_29F016A, NULL ); flash8[0] = machine->device<fujitsu_29f016a_device>("flash0");
intelflash_init( machine, 1, FLASH_FUJITSU_29F016A, NULL ); flash8[1] = machine->device<fujitsu_29f016a_device>("flash1");
intelflash_init( machine, 2, FLASH_FUJITSU_29F016A, NULL ); flash8[2] = machine->device<fujitsu_29f016a_device>("flash2");
intelflash_init( machine, 3, FLASH_FUJITSU_29F016A, NULL ); flash8[3] = machine->device<fujitsu_29f016a_device>("flash3");
memory_install_readwrite32_handler( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f68008f, 0, 0, flash_r, flash_w ); memory_install_readwrite32_handler( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f68008f, 0, 0, flash_r, flash_w );
memory_install_read32_handler ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f6800c0, 0x1f6800c7, 0, 0, trackball_r ); memory_install_read32_handler ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f6800c0, 0x1f6800c7, 0, 0, trackball_r );
@ -538,7 +534,10 @@ static DRIVER_INIT( simpbowl )
} }
static MACHINE_CONFIG_DERIVED( simpbowl, konamigv ) static MACHINE_CONFIG_DERIVED( simpbowl, konamigv )
MDRV_NVRAM_HANDLER( simpbowl ) MDRV_FUJITSU_29F016A_ADD("flash0")
MDRV_FUJITSU_29F016A_ADD("flash1")
MDRV_FUJITSU_29F016A_ADD("flash2")
MDRV_FUJITSU_29F016A_ADD("flash3")
MACHINE_CONFIG_END MACHINE_CONFIG_END
static INPUT_PORTS_START( simpbowl ) static INPUT_PORTS_START( simpbowl )
@ -558,11 +557,11 @@ static READ32_HANDLER( btcflash_r )
{ {
if (mem_mask == 0x0000ffff) if (mem_mask == 0x0000ffff)
{ {
return intelflash_read(0, offset*2); return flash16[0]->read(offset*2);
} }
else if (mem_mask == 0xffff0000) else if (mem_mask == 0xffff0000)
{ {
return intelflash_read(0, (offset*2)+1)<<16; return flash16[0]->read((offset*2)+1)<<16;
} }
return 0; return 0;
@ -572,11 +571,11 @@ static WRITE32_HANDLER( btcflash_w )
{ {
if (mem_mask == 0x0000ffff) if (mem_mask == 0x0000ffff)
{ {
intelflash_write(0, offset*2, data&0xffff); flash16[0]->write(offset*2, data&0xffff);
} }
else if (mem_mask == 0xffff0000) else if (mem_mask == 0xffff0000)
{ {
intelflash_write(0, (offset*2)+1, (data>>16)&0xffff); flash16[0]->write((offset*2)+1, (data>>16)&0xffff);
} }
} }
@ -607,14 +606,9 @@ static WRITE32_HANDLER( btc_trackball_w )
// mame_printf_debug( "w %08x %08x %08x %08x\n", cpu_get_pc(space->cpu), offset, data, mem_mask ); // mame_printf_debug( "w %08x %08x %08x %08x\n", cpu_get_pc(space->cpu), offset, data, mem_mask );
} }
static NVRAM_HANDLER( btchamp )
{
nvram_handler_intelflash( machine, 0, file, read_or_write );
}
static DRIVER_INIT( btchamp ) static DRIVER_INIT( btchamp )
{ {
intelflash_init( machine, 0, FLASH_SHARP_LH28F400, NULL ); flash16[0] = machine->device<sharp_lh28f400_device>("flash");
memory_install_readwrite32_handler( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f68008f, 0, 0, btc_trackball_r, btc_trackball_w ); memory_install_readwrite32_handler( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f68008f, 0, 0, btc_trackball_r, btc_trackball_w );
memory_nop_write ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f6800e0, 0x1f6800e3, 0, 0 ); memory_nop_write ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f6800e0, 0x1f6800e3, 0, 0 );
@ -624,7 +618,7 @@ static DRIVER_INIT( btchamp )
} }
static MACHINE_CONFIG_DERIVED( btchamp, konamigv ) static MACHINE_CONFIG_DERIVED( btchamp, konamigv )
MDRV_NVRAM_HANDLER( btchamp ) MDRV_SHARP_LH28F400_ADD("flash")
MACHINE_CONFIG_END MACHINE_CONFIG_END
static INPUT_PORTS_START( btchamp ) static INPUT_PORTS_START( btchamp )
@ -700,7 +694,7 @@ static WRITE32_HANDLER( kdeadeye_0_w )
static DRIVER_INIT( kdeadeye ) static DRIVER_INIT( kdeadeye )
{ {
intelflash_init( machine, 0, FLASH_SHARP_LH28F400, NULL ); flash16[0] = machine->device<sharp_lh28f400_device>("flash");
memory_install_read_port ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f680083, 0, 0, "GUNX1" ); memory_install_read_port ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680080, 0x1f680083, 0, 0, "GUNX1" );
memory_install_read_port ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680090, 0x1f680093, 0, 0, "GUNY1" ); memory_install_read_port ( cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x1f680090, 0x1f680093, 0, 0, "GUNY1" );
@ -714,7 +708,7 @@ static DRIVER_INIT( kdeadeye )
} }
static MACHINE_CONFIG_DERIVED( kdeadeye, konamigv ) static MACHINE_CONFIG_DERIVED( kdeadeye, konamigv )
MDRV_NVRAM_HANDLER( btchamp ) MDRV_SHARP_LH28F400_ADD("flash")
MACHINE_CONFIG_END MACHINE_CONFIG_END
static INPUT_PORTS_START( kdeadeye ) static INPUT_PORTS_START( kdeadeye )

File diff suppressed because it is too large Load Diff

View File

@ -1242,6 +1242,8 @@ Notes:
#define CPU_CLOCK (200000000) #define CPU_CLOCK (200000000)
static UINT32 *dc_sound_ram; static UINT32 *dc_sound_ram;
static macronix_29l001mc_device *awflash;
/* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */ /* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */
static const struct sh4_config sh4cpu_config = { 1, 0, 1, 0, 0, 0, 1, 1, 0, CPU_CLOCK }; static const struct sh4_config sh4cpu_config = { 1, 0, 1, 0, 0, 0, 1, 1, 0, CPU_CLOCK };
@ -1301,13 +1303,6 @@ jvseeprom_default_game[] =
{ "keyboard", { 0x32, 0x7E, 0x10, 0x42, 0x45, 0x42, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x7E, 0x10, 0x42, 0x45, 0x42, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, 0xF0, 0x4A, 0x0C, 0x0C, 0xF0, 0x4A, 0x0C, 0x0C, 0x18, 0x09, 0x01, 0x20, 0x02, 0x00, 0x3C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x18, 0x09, 0x01, 0x20, 0x02, 0x00, 0x3C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } { "keyboard", { 0x32, 0x7E, 0x10, 0x42, 0x45, 0x42, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x7E, 0x10, 0x42, 0x45, 0x42, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, 0xF0, 0x4A, 0x0C, 0x0C, 0xF0, 0x4A, 0x0C, 0x0C, 0x18, 0x09, 0x01, 0x20, 0x02, 0x00, 0x3C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x18, 0x09, 0x01, 0x20, 0x02, 0x00, 0x3C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
}; };
static NVRAM_HANDLER( aw_nvram )
{
nvram_handler_intelflash(machine, 0, file, read_or_write);
// TODO: save AW NVRAM at 00200000
}
static NVRAM_HANDLER( naomi_eeproms ) static NVRAM_HANDLER( naomi_eeproms )
{ {
if (read_or_write) if (read_or_write)
@ -1516,8 +1511,8 @@ ADDRESS_MAP_END
static READ64_HANDLER( aw_flash_r ) static READ64_HANDLER( aw_flash_r )
{ {
return (UINT64)intelflash_read(0, offset*8) | (UINT64)intelflash_read(0, (offset*8)+1)<<8 | (UINT64)intelflash_read(0, (offset*8)+2)<<16 | (UINT64)intelflash_read(0, (offset*8)+3)<<24 | return (UINT64)awflash->read(offset*8) | (UINT64)awflash->read((offset*8)+1)<<8 | (UINT64)awflash->read((offset*8)+2)<<16 | (UINT64)awflash->read((offset*8)+3)<<24 |
(UINT64)intelflash_read(0, (offset*8)+4)<<32 | (UINT64)intelflash_read(0, (offset*8)+5)<<40 | (UINT64)intelflash_read(0, (offset*8)+6)<<48 | (UINT64)intelflash_read(0, (offset*8)+7)<<56; (UINT64)awflash->read((offset*8)+4)<<32 | (UINT64)awflash->read((offset*8)+5)<<40 | (UINT64)awflash->read((offset*8)+6)<<48 | (UINT64)awflash->read((offset*8)+7)<<56;
} }
static WRITE64_HANDLER( aw_flash_w ) static WRITE64_HANDLER( aw_flash_w )
@ -1536,7 +1531,7 @@ static WRITE64_HANDLER( aw_flash_w )
data >>= (i*8); data >>= (i*8);
intelflash_write(0, addr, data); awflash->write(addr, data);
} }
INLINE int decode_reg32_64(running_machine *machine, UINT32 offset, UINT64 mem_mask, UINT64 *shift) INLINE int decode_reg32_64(running_machine *machine, UINT32 offset, UINT64 mem_mask, UINT64 *shift)
@ -1601,8 +1596,8 @@ static WRITE64_HANDLER( aw_modem_w )
static ADDRESS_MAP_START( aw_map, ADDRESS_SPACE_PROGRAM, 64 ) static ADDRESS_MAP_START( aw_map, ADDRESS_SPACE_PROGRAM, 64 )
/* Area 0 */ /* Area 0 */
AM_RANGE(0x00000000, 0x0001ffff) AM_READWRITE( aw_flash_r, aw_flash_w ) AM_RANGE(0x00000000, 0x0001ffff) AM_READWRITE( aw_flash_r, aw_flash_w ) AM_REGION("awflash", 0)
AM_RANGE(0xa0000000, 0xa001ffff) AM_READWRITE( aw_flash_r, aw_flash_w ) AM_RANGE(0xa0000000, 0xa001ffff) AM_READWRITE( aw_flash_r, aw_flash_w ) AM_REGION("awflash", 0)
AM_RANGE(0x00200000, 0x0021ffff) AM_RAM // battery backed up RAM AM_RANGE(0x00200000, 0x0021ffff) AM_RAM // battery backed up RAM
AM_RANGE(0x005f6800, 0x005f69ff) AM_READWRITE( dc_sysctrl_r, dc_sysctrl_w ) AM_RANGE(0x005f6800, 0x005f69ff) AM_READWRITE( dc_sysctrl_r, dc_sysctrl_w )
@ -1989,7 +1984,7 @@ static MACHINE_CONFIG_DERIVED( aw, naomi_base )
// MDRV_DEVICE_REMOVE("main_eeprom") // MDRV_DEVICE_REMOVE("main_eeprom")
MDRV_CPU_MODIFY("maincpu") MDRV_CPU_MODIFY("maincpu")
MDRV_CPU_PROGRAM_MAP(aw_map) MDRV_CPU_PROGRAM_MAP(aw_map)
MDRV_NVRAM_HANDLER(aw_nvram) MDRV_MACRONIX_29L001MC_ADD("awflash")
MDRV_AW_ROM_BOARD_ADD("rom_board", "user1") MDRV_AW_ROM_BOARD_ADD("rom_board", "user1")
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -2264,7 +2259,7 @@ ROM_START( naomi2 )
ROM_END ROM_END
ROM_START( awbios ) ROM_START( awbios )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8400000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8400000, "user1", ROMREGION_ERASE)
@ -6438,7 +6433,7 @@ static const UINT32 salmankt_key = 0x34b74;
static DRIVER_INIT( atomiswave ) static DRIVER_INIT( atomiswave )
{ {
UINT64 *ROM = (UINT64 *)memory_region(machine, "maincpu"); UINT64 *ROM = (UINT64 *)memory_region(machine, "awflash");
#if 0 #if 0
UINT8 *dcdata = (UINT8 *)memory_region(machine, "user1"); UINT8 *dcdata = (UINT8 *)memory_region(machine, "user1");
FILE *f; FILE *f;
@ -6450,7 +6445,7 @@ static DRIVER_INIT( atomiswave )
// patch out long startup delay // patch out long startup delay
ROM[0x98e/8] = (ROM[0x98e/8] & U64(0xffffffffffff)) | (UINT64)0x0009<<48; ROM[0x98e/8] = (ROM[0x98e/8] & U64(0xffffffffffff)) | (UINT64)0x0009<<48;
intelflash_init(machine, 0, FLASH_MACRONIX_29L001MC, memory_region(machine, "maincpu")); awflash = machine->device<macronix_29l001mc_device>("awflash");
} }
#define AW_DRIVER_INIT(DRIVER) \ #define AW_DRIVER_INIT(DRIVER) \
@ -6482,7 +6477,7 @@ AW_DRIVER_INIT(vfurlong)
AW_DRIVER_INIT(salmankt) AW_DRIVER_INIT(salmankt)
ROM_START( fotns ) ROM_START( fotns )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6497,7 +6492,7 @@ ROM_START( fotns )
ROM_END ROM_END
ROM_START( rangrmsn ) ROM_START( rangrmsn )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6510,7 +6505,7 @@ ROM_START( rangrmsn )
ROM_END ROM_END
ROM_START( sprtshot ) ROM_START( sprtshot )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6522,7 +6517,7 @@ ROM_START( sprtshot )
ROM_END ROM_END
ROM_START( xtrmhunt ) ROM_START( xtrmhunt )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6536,7 +6531,7 @@ ROM_START( xtrmhunt )
ROM_END ROM_END
ROM_START( xtrmhnt2 ) ROM_START( xtrmhnt2 )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6555,7 +6550,7 @@ ROM_START( xtrmhnt2 )
ROM_END ROM_END
ROM_START( dolphin ) ROM_START( dolphin )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6568,7 +6563,7 @@ ROM_START( dolphin )
ROM_END ROM_END
ROM_START( demofist ) ROM_START( demofist )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6583,7 +6578,7 @@ ROM_START( demofist )
ROM_END ROM_END
ROM_START( rumblef ) ROM_START( rumblef )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6598,7 +6593,7 @@ ROM_START( rumblef )
ROM_END ROM_END
ROM_START( ngbc ) ROM_START( ngbc )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6606,7 +6601,7 @@ ROM_START( ngbc )
ROM_END ROM_END
ROM_START( kofnw ) ROM_START( kofnw )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6620,7 +6615,7 @@ ROM_START( kofnw )
ROM_END ROM_END
ROM_START( kofnwj ) ROM_START( kofnwj )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6635,7 +6630,7 @@ ROM_START( kofnwj )
ROM_END ROM_END
ROM_START( kov7sprt ) ROM_START( kov7sprt )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE)
@ -6650,7 +6645,7 @@ ROM_START( kov7sprt )
ROM_END ROM_END
ROM_START( ggisuka ) ROM_START( ggisuka )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE)
@ -6666,7 +6661,7 @@ ROM_START( ggisuka )
ROM_END ROM_END
ROM_START( vfurlong ) ROM_START( vfurlong )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE)
@ -6681,7 +6676,7 @@ ROM_START( vfurlong )
ROM_END ROM_END
ROM_START( salmankt ) ROM_START( salmankt )
ROM_REGION( 0x200000, "maincpu", 0) ROM_REGION( 0x200000, "awflash", 0)
AW_BIOS AW_BIOS
ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE) ROM_REGION( 0x9000000, "user1", ROMREGION_ERASE)

View File

@ -740,6 +740,8 @@ Notes:
UINT32 *spimainram; UINT32 *spimainram;
static intel_e28f008sa_device *flash[2];
static UINT8 *z80_rom; static UINT8 *z80_rom;
/********************************************************************/ /********************************************************************/
@ -1085,11 +1087,11 @@ static READ8_DEVICE_HANDLER( flashrom_read )
logerror("Flash Read: %08X\n", offset); logerror("Flash Read: %08X\n", offset);
if( offset < 0x100000 ) if( offset < 0x100000 )
{ {
return intelflash_read(0, offset); return flash[0]->read(offset);
} }
else if( offset < 0x200000 ) else if( offset < 0x200000 )
{ {
return intelflash_read(1, offset - 0x100000 ); return flash[1]->read(offset - 0x100000 );
} }
return 0; return 0;
} }
@ -1099,11 +1101,11 @@ static WRITE8_DEVICE_HANDLER( flashrom_write )
logerror("Flash Write: %08X, %02X\n", offset, data); logerror("Flash Write: %08X, %02X\n", offset, data);
if( offset < 0x100000 ) if( offset < 0x100000 )
{ {
intelflash_write(0, offset + 1, data); flash[0]->write(offset + 1, data);
} }
else if( offset < 0x200000 ) else if( offset < 0x200000 )
{ {
intelflash_write(1, offset - 0x100000 + 1, data); flash[1]->write(offset - 0x100000 + 1, data);
} }
} }
@ -1785,12 +1787,6 @@ GFXDECODE_END
/********************************************************************************/ /********************************************************************************/
static NVRAM_HANDLER( spi )
{
nvram_handler_intelflash(machine, 0, file, read_or_write);
nvram_handler_intelflash(machine, 1, file, read_or_write);
}
/* this is a 93C46 but with reset delay */ /* this is a 93C46 but with reset delay */
static const eeprom_interface eeprom_intf = static const eeprom_interface eeprom_intf =
{ {
@ -1842,19 +1838,19 @@ static MACHINE_RESET( spi )
/* If the first value doesn't match, the game shows a checksum error */ /* If the first value doesn't match, the game shows a checksum error */
/* If any of the other values are wrong, the game goes to update mode */ /* If any of the other values are wrong, the game goes to update mode */
intelflash_write(0, 0, 0xff); flash[0]->write(0, 0xff);
intelflash_write(0, 0, 0x10); flash[0]->write(0, 0x10);
intelflash_write(0, 0, flash_data); /* country code */ flash[0]->write(0, flash_data); /* country code */
for (i=0; i < 0x100000; i++) for (i=0; i < 0x100000; i++)
{ {
intelflash_write(0, 0, 0xff); flash[0]->write(0, 0xff);
sound[i] = intelflash_read(0, i); sound[i] = flash[0]->read(i);
} }
for (i=0; i < 0x100000; i++) for (i=0; i < 0x100000; i++)
{ {
intelflash_write(1, 0, 0xff); flash[1]->write(0, 0xff);
sound[0x100000+i] = intelflash_read(1, i); sound[0x100000+i] = flash[1]->read(i);
} }
} }
@ -1872,12 +1868,14 @@ static MACHINE_CONFIG_START( spi, driver_device )
MDRV_MACHINE_START(spi) MDRV_MACHINE_START(spi)
MDRV_MACHINE_RESET(spi) MDRV_MACHINE_RESET(spi)
MDRV_NVRAM_HANDLER(spi)
MDRV_EEPROM_ADD("eeprom", eeprom_intf) MDRV_EEPROM_ADD("eeprom", eeprom_intf)
MDRV_DS2404_ADD("ds2404", 1995, 1, 1) MDRV_DS2404_ADD("ds2404", 1995, 1, 1)
MDRV_INTEL_E28F008SA_ADD("flash0")
MDRV_INTEL_E28F008SA_ADD("flash1")
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(54) MDRV_SCREEN_REFRESH_RATE(54)
@ -1927,7 +1925,8 @@ static MACHINE_CONFIG_DERIVED( sxx2f, spi ) /* Intel i386DX @ 25MHz, YMF271 @ 16
MDRV_MACHINE_START(sxx2f) MDRV_MACHINE_START(sxx2f)
MDRV_MACHINE_RESET(sxx2f) MDRV_MACHINE_RESET(sxx2f)
MDRV_NVRAM_HANDLER(0) MDRV_DEVICE_REMOVE("flash0")
MDRV_DEVICE_REMOVE("flash1")
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -1948,7 +1947,8 @@ static MACHINE_CONFIG_DERIVED( sxx2g, spi ) /* single board version using measur
MDRV_MACHINE_START(sxx2f) MDRV_MACHINE_START(sxx2f)
MDRV_MACHINE_RESET(sxx2f) MDRV_MACHINE_RESET(sxx2f)
MDRV_NVRAM_HANDLER(0) MDRV_DEVICE_REMOVE("flash0")
MDRV_DEVICE_REMOVE("flash1")
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -2079,8 +2079,8 @@ static READ32_HANDLER ( rfjet_speedup_r )
static void init_spi(running_machine *machine) static void init_spi(running_machine *machine)
{ {
intelflash_init( machine, 0, FLASH_INTEL_E28F008SA, NULL ); flash[0] = machine->device<intel_e28f008sa_device>("flash0");
intelflash_init( machine, 1, FLASH_INTEL_E28F008SA, NULL ); flash[1] = machine->device<intel_e28f008sa_device>("flash1");
seibuspi_text_decrypt(memory_region(machine, "gfx1")); seibuspi_text_decrypt(memory_region(machine, "gfx1"));
seibuspi_bg_decrypt(memory_region(machine, "gfx2"), memory_region_length(machine, "gfx2")); seibuspi_bg_decrypt(memory_region(machine, "gfx2"), memory_region_length(machine, "gfx2"));
@ -2141,8 +2141,8 @@ static DRIVER_INIT( viprp1o )
static void init_rf2(running_machine *machine) static void init_rf2(running_machine *machine)
{ {
intelflash_init( machine, 0, FLASH_INTEL_E28F008SA, NULL ); flash[0] = machine->device<intel_e28f008sa_device>("flash0");
intelflash_init( machine, 1, FLASH_INTEL_E28F008SA, NULL ); flash[1] = machine->device<intel_e28f008sa_device>("flash1");
memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0282AC, 0x0282AF, 0, 0, rf2_speedup_r ); memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x0282AC, 0x0282AF, 0, 0, rf2_speedup_r );
seibuspi_rise10_text_decrypt(memory_region(machine, "gfx1")); seibuspi_rise10_text_decrypt(memory_region(machine, "gfx1"));
@ -2165,8 +2165,8 @@ static DRIVER_INIT( rdft2us )
static void init_rfjet(running_machine *machine) static void init_rfjet(running_machine *machine)
{ {
intelflash_init( machine, 0, FLASH_INTEL_E28F008SA, NULL ); flash[0] = machine->device<intel_e28f008sa_device>("flash0");
intelflash_init( machine, 1, FLASH_INTEL_E28F008SA, NULL ); flash[1] = machine->device<intel_e28f008sa_device>("flash1");
memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x002894c, 0x002894f, 0, 0, rfjet_speedup_r ); memory_install_read32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x002894c, 0x002894f, 0, 0, rfjet_speedup_r );
seibuspi_rise11_text_decrypt(memory_region(machine, "gfx1")); seibuspi_rise11_text_decrypt(memory_region(machine, "gfx1"));

View File

@ -328,6 +328,10 @@ Type 3 (PCMCIA Compact Flash Adaptor + Compact Flash card, sealed together with
#include "sound/psx.h" #include "sound/psx.h"
#include "audio/taito_zm.h" #include "audio/taito_zm.h"
static intel_te28f160_device *biosflash;
static intel_e28f400_device *pgmflash;
static intel_te28f160_device *sndflash[3];
static unsigned char cis[512]; static unsigned char cis[512];
static int locked; static int locked;
@ -438,75 +442,75 @@ static WRITE32_HANDLER(rf5c296_mem_w)
// Flash handling // Flash handling
static UINT32 gen_flash_r(running_machine *machine, int chip, offs_t offset, UINT32 mem_mask) static UINT32 gen_flash_r(intelfsh16_device *device, offs_t offset, UINT32 mem_mask)
{ {
UINT32 res = 0; UINT32 res = 0;
offset *= 2; offset *= 2;
if(ACCESSING_BITS_0_15) if(ACCESSING_BITS_0_15)
res |= intelflash_read(chip, offset); res |= device->read(offset);
if(ACCESSING_BITS_16_31) if(ACCESSING_BITS_16_31)
res |= intelflash_read(chip, offset+1) << 16; res |= device->read(offset+1) << 16;
return res; return res;
} }
static void gen_flash_w(running_machine *machine, int chip, offs_t offset, UINT32 data, UINT32 mem_mask) static void gen_flash_w(intelfsh16_device *device, offs_t offset, UINT32 data, UINT32 mem_mask)
{ {
offset *= 2; offset *= 2;
if(ACCESSING_BITS_0_15) if(ACCESSING_BITS_0_15)
intelflash_write(chip, offset, data); device->write(offset, data);
if(ACCESSING_BITS_16_31) if(ACCESSING_BITS_16_31)
intelflash_write(chip, offset+1, data >> 16); device->write(offset+1, data >> 16);
} }
static READ32_HANDLER(flash_subbios_r) static READ32_HANDLER(flash_subbios_r)
{ {
return gen_flash_r(space->machine, 0, offset, mem_mask); return gen_flash_r(biosflash, offset, mem_mask);
} }
static WRITE32_HANDLER(flash_subbios_w) static WRITE32_HANDLER(flash_subbios_w)
{ {
gen_flash_w(space->machine, 0, offset, data, mem_mask); gen_flash_w(biosflash, offset, data, mem_mask);
} }
static READ32_HANDLER(flash_mn102_r) static READ32_HANDLER(flash_mn102_r)
{ {
return gen_flash_r(space->machine, 1, offset, mem_mask); return gen_flash_r(pgmflash, offset, mem_mask);
} }
static WRITE32_HANDLER(flash_mn102_w) static WRITE32_HANDLER(flash_mn102_w)
{ {
gen_flash_w(space->machine, 1, offset, data, mem_mask); gen_flash_w(pgmflash, offset, data, mem_mask);
} }
static READ32_HANDLER(flash_s1_r) static READ32_HANDLER(flash_s1_r)
{ {
return gen_flash_r(space->machine, 2, offset, mem_mask); return gen_flash_r(sndflash[0], offset, mem_mask);
} }
static WRITE32_HANDLER(flash_s1_w) static WRITE32_HANDLER(flash_s1_w)
{ {
gen_flash_w(space->machine, 2, offset, data, mem_mask); gen_flash_w(sndflash[0], offset, data, mem_mask);
} }
static READ32_HANDLER(flash_s2_r) static READ32_HANDLER(flash_s2_r)
{ {
return gen_flash_r(space->machine, 3, offset, mem_mask); return gen_flash_r(sndflash[1], offset, mem_mask);
} }
static WRITE32_HANDLER(flash_s2_w) static WRITE32_HANDLER(flash_s2_w)
{ {
gen_flash_w(space->machine, 3, offset, data, mem_mask); gen_flash_w(sndflash[1], offset, data, mem_mask);
} }
static READ32_HANDLER(flash_s3_r) static READ32_HANDLER(flash_s3_r)
{ {
return gen_flash_r(space->machine, 4, offset, mem_mask); return gen_flash_r(sndflash[2], offset, mem_mask);
} }
static WRITE32_HANDLER(flash_s3_w) static WRITE32_HANDLER(flash_s3_w)
{ {
gen_flash_w(space->machine, 4, offset, data, mem_mask); gen_flash_w(sndflash[2], offset, data, mem_mask);
} }
@ -800,32 +804,13 @@ static READ32_HANDLER( gnet_mahjong_panel_r )
// Init and reset // Init and reset
static NVRAM_HANDLER( coh3002t )
{
nvram_handler_intelflash(machine, 0, file, read_or_write);
nvram_handler_intelflash(machine, 1, file, read_or_write);
nvram_handler_intelflash(machine, 2, file, read_or_write);
nvram_handler_intelflash(machine, 3, file, read_or_write);
nvram_handler_intelflash(machine, 4, file, read_or_write);
if(!file) {
// Only the subbios needs to preexist for the board to work
memcpy(intelflash_getmemptr(0), memory_region(machine, "subbios"), 0x200000);
}
}
static DRIVER_INIT( coh3002t ) static DRIVER_INIT( coh3002t )
{ {
// Sub-bios (u30) biosflash = machine->device<intel_te28f160_device>("biosflash");
intelflash_init(machine, 0, FLASH_INTEL_TE28F160, 0); pgmflash = machine->device<intel_e28f400_device>("pgmflash");
sndflash[0] = machine->device<intel_te28f160_device>("sndflash0");
// mn102 program flash (u27) sndflash[1] = machine->device<intel_te28f160_device>("sndflash1");
intelflash_init(machine, 1, FLASH_INTEL_E28F400, 0); sndflash[2] = machine->device<intel_te28f160_device>("sndflash2");
// Samples (u29, u55, u56)
intelflash_init(machine, 2, FLASH_INTEL_TE28F160, 0);
intelflash_init(machine, 3, FLASH_INTEL_TE28F160, 0);
intelflash_init(machine, 4, FLASH_INTEL_TE28F160, 0);
psx_driver_init(machine); psx_driver_init(machine);
znsec_init(0, tt10); znsec_init(0, tt10);
@ -948,10 +933,15 @@ static MACHINE_CONFIG_START( coh3002t, driver_device )
MDRV_AT28C16_ADD( "at28c16", 0 ) MDRV_AT28C16_ADD( "at28c16", 0 )
MDRV_IDE_CONTROLLER_ADD( "card", 0 ) MDRV_IDE_CONTROLLER_ADD( "card", 0 )
MDRV_NVRAM_HANDLER( coh3002t )
MDRV_MB3773_ADD("mb3773") MDRV_MB3773_ADD("mb3773")
MDRV_INTEL_TE28F160_ADD("biosflash")
MDRV_INTEL_E28F008SA_ADD("pgmflash")
MDRV_INTEL_TE28F160_ADD("sndflash0")
MDRV_INTEL_TE28F160_ADD("sndflash1")
MDRV_INTEL_TE28F160_ADD("sndflash2")
MDRV_FRAGMENT_ADD( taito_zoom_sound ) MDRV_FRAGMENT_ADD( taito_zoom_sound )
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -1075,7 +1065,7 @@ INPUT_PORTS_END
#define TAITOGNET_BIOS \ #define TAITOGNET_BIOS \
ROM_REGION32_LE( 0x080000, "mainbios", 0 ) \ ROM_REGION32_LE( 0x080000, "mainbios", 0 ) \
ROM_LOAD( "coh-3002t.353", 0x000000, 0x080000, CRC(03967fa7) SHA1(0e17fec2286e4e25deb23d40e41ce0986f373d49) ) \ ROM_LOAD( "coh-3002t.353", 0x000000, 0x080000, CRC(03967fa7) SHA1(0e17fec2286e4e25deb23d40e41ce0986f373d49) ) \
ROM_REGION16_LE( 0x200000, "subbios", 0 ) \ ROM_REGION16_LE( 0x200000, "biosflash", 0 ) \
ROM_SYSTEM_BIOS( 0, "v1", "G-NET Bios v1" ) \ ROM_SYSTEM_BIOS( 0, "v1", "G-NET Bios v1" ) \
ROM_LOAD16_WORD_BIOS(0, "flash.u30", 0x000000, 0x200000, CRC(c48c8236) SHA1(c6dad60266ce2ff635696bc0d91903c543273559) ) \ ROM_LOAD16_WORD_BIOS(0, "flash.u30", 0x000000, 0x200000, CRC(c48c8236) SHA1(c6dad60266ce2ff635696bc0d91903c543273559) ) \
ROM_SYSTEM_BIOS( 1, "v2", "G-NET Bios v2" ) \ ROM_SYSTEM_BIOS( 1, "v2", "G-NET Bios v2" ) \