diff options
Diffstat (limited to 'src/devices/machine/intelfsh.cpp')
-rw-r--r-- | src/devices/machine/intelfsh.cpp | 60 |
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; |