summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/intelfsh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/intelfsh.cpp')
-rw-r--r--src/devices/machine/intelfsh.cpp60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp
index c08d9f800ac..0ce7ed8dc53 100644
--- a/src/devices/machine/intelfsh.cpp
+++ b/src/devices/machine/intelfsh.cpp
@@ -92,6 +92,7 @@ DEFINE_DEVICE_TYPE(AMD_29LV200T, amd_29lv200t_device, "amd_29l
DEFINE_DEVICE_TYPE(FUJITSU_29F160T, fujitsu_29f160t_device, "fujitsu_29f160t", "Fujitsu 29F160T Flash")
DEFINE_DEVICE_TYPE(FUJITSU_29F016A, fujitsu_29f016a_device, "fujitsu_29f016a", "Fujitsu 29F016A Flash")
DEFINE_DEVICE_TYPE(FUJITSU_29DL16X, fujitsu_29dl16x_device, "fujitsu_29dl16x", "Fujitsu 29DL16X Flash")
+DEFINE_DEVICE_TYPE(FUJITSU_29LV002TC, fujitsu_29lv002tc_device, "fujitsu_29lv002tc", "Fujitsu 29LV002TC Flash")
DEFINE_DEVICE_TYPE(INTEL_E28F400B, intel_e28f400b_device, "intel_e28f400b", "Intel E28F400B Flash")
DEFINE_DEVICE_TYPE(MACRONIX_29L001MC, macronix_29l001mc_device, "macronix_29l001mc", "Macronix 29L001MC Flash")
DEFINE_DEVICE_TYPE(MACRONIX_29LV160TMC, macronix_29lv160tmc_device, "macronix_29lv160tmc", "Macronix 29LV160TMC Flash")
@@ -110,6 +111,7 @@ DEFINE_DEVICE_TYPE(SHARP_LH28F160S3, sharp_lh28f160s3_device, "sharp_l
DEFINE_DEVICE_TYPE(INTEL_TE28F320, intel_te28f320_device, "intel_te28f320", "Intel TE28F320 Flash")
DEFINE_DEVICE_TYPE(SHARP_LH28F320BF, sharp_lh28f320bf_device, "sharp_lh28f320bf", "Sharp LH28F320BFHE-PBTL Flash")
DEFINE_DEVICE_TYPE(INTEL_28F320J3D, intel_28f320j3d_device, "intel_28f320j3d", "Intel 28F320J3D Flash")
+DEFINE_DEVICE_TYPE(SPANSION_S29GL064S, spansion_s29gl064s_device, "spansion_s29gl064s", "Spansion / Cypress S29GL064S Flash" )
DEFINE_DEVICE_TYPE(INTEL_28F320J5, intel_28f320j5_device, "intel_28f320j5", "Intel 28F320J5 Flash")
DEFINE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device, "sst_39vf400a", "SST 39VF400A Flash")
@@ -117,6 +119,7 @@ DEFINE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device, "sst_39v
DEFINE_DEVICE_TYPE(ATMEL_49F4096, atmel_49f4096_device, "atmel_49f4096", "Atmel AT49F4096 Flash")
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -227,6 +230,13 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
m_device_id = 0x16;
m_sector_is_4k = true;
break;
+ case FLASH_SPANSION_S29GL064S: // senbbs
+ m_bits = 16;
+ m_size = 0x800000;
+ m_maker_id = MFG_SPANSION;
+ m_device_id = 0x227e;
+ m_sector_is_4k = false;
+ break;
case FLASH_INTEL_28F320J5: // funkball
m_bits = 16;
m_size = 0x400000;
@@ -286,6 +296,12 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
m_maker_id = MFG_FUJITSU;
m_device_id = 0x35;
break;
+ case FLASH_FUJITSU_29LV002TC:
+ m_bits = 8;
+ m_size = 0x40000;
+ m_maker_id = MFG_FUJITSU;
+ m_device_id = 0x40;
+ break;
case FLASH_INTEL_E28F008SA:
m_bits = 8;
m_size = 0x100000;
@@ -378,6 +394,9 @@ fujitsu_29f016a_device::fujitsu_29f016a_device(const machine_config &mconfig, co
fujitsu_29dl16x_device::fujitsu_29dl16x_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh8_device(mconfig, FUJITSU_29DL16X, tag, owner, clock, FLASH_FUJITSU_29DL16X) { }
+fujitsu_29lv002tc_device::fujitsu_29lv002tc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : intelfsh8_device(mconfig, FUJITSU_29LV002TC, tag, owner, clock, FLASH_FUJITSU_29LV002TC) { }
+
sharp_lh28f016s_device::sharp_lh28f016s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh8_device(mconfig, SHARP_LH28F016S, tag, owner, clock, FLASH_SHARP_LH28F016S) { }
@@ -447,6 +466,9 @@ sharp_lh28f160s3_device::sharp_lh28f160s3_device(const machine_config &mconfig,
intel_te28f320_device::intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh16_device(mconfig, INTEL_TE28F320, tag, owner, clock, FLASH_INTEL_TE28F320) { }
+spansion_s29gl064s_device::spansion_s29gl064s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : intelfsh16_device(mconfig, SPANSION_S29GL064S, tag, owner, clock, FLASH_SPANSION_S29GL064S) { }
+
intel_e28f400b_device::intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh16_device(mconfig, INTEL_E28F400B, tag, owner, clock, FLASH_INTEL_E28F400B) { }
@@ -883,7 +905,14 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data)
(( address & 0xfff ) == 0xaaa && ( data & 0xff ) == 0x10 ) )
{
// chip erase
- memset(&m_data[0], 0xff, m_size);
+ if (m_maker_id == MFG_FUJITSU && m_device_id == 0x40)
+ {
+ // hardcoded for Dreamcast, TODO properly handle sector protection
+ memset(&m_data[0], 0xff, 0x3A000);
+ memset(&m_data[0x3C000], 0xff, 0x04000);
+ }
+ else
+ memset(&m_data[0], 0xff, m_size);
m_status = 1 << 3;
m_flash_mode = FM_ERASEAMD4;
@@ -939,6 +968,23 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data)
m_timer->adjust( attotime::from_msec( 500 ) );
}
}
+ else if (m_maker_id == MFG_FUJITSU && m_device_id == 0x40)
+ {
+ constexpr u32 sectors[] = { 0x10000, 0x10000, 0x10000, 0x08000, 0x02000, 0x02000, 0x4000 };
+
+ u32 sec_num = 0;
+ u32 toffset = base;
+ while (toffset >= sectors[sec_num])
+ toffset -= sectors[sec_num++];
+ u32 sec_len = sectors[sec_num];
+
+ if (sec_num != 5) // hardcoded for Dreamcast, TODO properly handle sector protection
+ {
+ memset(&m_data[base & ~(sec_len - 1)], 0xff, sec_len);
+ }
+ m_erase_sector = address & ~(sec_len - 1);
+ m_timer->adjust(attotime::from_seconds(1));
+ }
else
{
memset(&m_data[base & ~0xffff], 0xff, 64 * 1024);
@@ -958,12 +1004,20 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data)
switch( m_bits )
{
case 8:
+ if (m_maker_id == MFG_FUJITSU && m_device_id == 0x40)
{
- m_data[address] = data;
+ if (address < 0x3a000 || address >= 0x3c000) // hardcoded for Dreamcast, TODO properly handle sector protection
+ m_data[address] &= data;
}
+ else
+ m_data[address] = data;
+ break;
+ case 16: // senbbs test mode requires this, note, flash type is guessed there based on manufacturer + device ident as markings were erased
+ m_data[address*2] = data >> 8;
+ m_data[address*2+1] = data;
break;
default:
- logerror( "FM_BYTEPROGRAM not supported when m_bits == %d\n", m_bits );
+ logerror( "FM_BYTEPROGRAM not supported when m_bits == %d (address %08x data %04x)\n", m_bits, address, data );
break;
}
m_flash_mode = FM_NORMAL;