From 3fe9c0902b4f17690644afd17cc5967a5f0b4405 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Thu, 22 Aug 2024 20:45:51 +0100 Subject: machine/intelfsh.cpp: Added ST M29W640GB 8K Flash device. (#12675) --- src/devices/machine/intelfsh.cpp | 66 ++++++++++++++++++++++++++++++++++++++-- src/devices/machine/intelfsh.h | 9 ++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp index d4a417567e1..897b1ee55be 100644 --- a/src/devices/machine/intelfsh.cpp +++ b/src/devices/machine/intelfsh.cpp @@ -37,6 +37,8 @@ enum FM_ERASEAMD3, // part 3 of AMD erase sequence FM_ERASEAMD4, // part 4 of AMD erase sequence FM_BYTEPROGRAM, + FM_WORDPROGRAM1, + FM_WORDPROGRAM2, FM_BANKSELECT, FM_WRITEPAGEATMEL, FM_WRITEBUFFER1, // part 1 of write to buffer sequence @@ -105,6 +107,7 @@ DEFINE_DEVICE_TYPE(MACRONIX_29F1610MC, macronix_29f1610mc_device, "m DEFINE_DEVICE_TYPE(MACRONIX_29F1610MC_16BIT, macronix_29f1610mc_16bit_device, "macronix_29f1610mc_16bit", "Macronix 29F1610MC Flash (16-bit)") 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") +DEFINE_DEVICE_TYPE(ST_M29W640GB, st_m29w640gb_device, "st_m29w640gb", "ST M29W640GB Flash") DEFINE_DEVICE_TYPE(TMS_29F040, tms_29f040_device, "tms_29f040", "Texas Instruments 29F040 Flash") DEFINE_DEVICE_TYPE(PANASONIC_MN63F805MNP, panasonic_mn63f805mnp_device, "panasonic_mn63f805mnp", "Panasonic MN63F805MNP Flash") @@ -151,6 +154,8 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type m_bits(bits), m_addrmask(0), m_device_id(device_id), + m_device_id2(0), + m_device_id3(0), m_maker_id(maker_id), m_sector_is_4k(false), m_sector_is_16k(false), @@ -250,6 +255,9 @@ macronix_29l001mc_device::macronix_29l001mc_device(const machine_config &mconfig macronix_29lv160tmc_device::macronix_29lv160tmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : intelfsh8_device(mconfig, MACRONIX_29LV160TMC, tag, owner, clock, 0x20000, MFG_MACRONIX, 0x49) { m_sector_is_16k = true; } +st_m29w640gb_device::st_m29w640gb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : intelfsh8_device(mconfig, ST_M29W640GB, tag, owner, clock, 0x800000, MFG_ST, 0x227e) { m_bot_boot_sector = true; m_device_id2 = 0x2210; m_device_id3 = 0x2200; } + panasonic_mn63f805mnp_device::panasonic_mn63f805mnp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : intelfsh8_device(mconfig, PANASONIC_MN63F805MNP, tag, owner, clock, 0x10000, MFG_PANASONIC, 0x1b) { m_sector_is_4k = true; } @@ -463,6 +471,18 @@ uint32_t intelfsh_device::read_full(uint32_t address) case 4: data = 0; break; } } + else if (m_maker_id == MFG_ST) + { + switch (address & 0xff) + { + case 0x00: data = m_maker_id; break; + case 0x02: data = m_device_id; break; + case 0x04: logerror("Block Protection Status not implemented.\n"); break; + case 0x06: logerror("Extended Memory Block Verify Code not implemented.\n"); break; + case 0x1c: data = m_device_id2; break; + case 0x1e: data = m_device_id3; break; + } + } else { switch (address & 0xff) @@ -574,8 +594,10 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data) m_flash_mode = FM_WRITEPART1; break; case 0x50: // clear status reg - if ((m_maker_id == MFG_SST && m_device_id == 0x61) && (m_flash_mode == FM_NORMAL)) + if (((m_maker_id == MFG_SST && m_device_id == 0x61) || (m_maker_id == MFG_AMD && m_device_id == 0x20)) && (m_flash_mode == FM_NORMAL)) logerror("Invalid flash mode byte %x\n", data & 0xff); + else if (m_maker_id == MFG_ST && (address & 0xfff) == 0xaaa) + m_flash_mode = FM_WORDPROGRAM1; else { m_status = 0x80; @@ -839,7 +861,13 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data) } else if(m_bot_boot_sector && address < (64*1024)) { - if (address < (16*1024)) + if (m_maker_id == MFG_ST) + { + memset(&m_data[base & ~0x1fff], 0xff, 8 * 1024); + m_erase_sector = address & ((m_bits == 16) ? ~0xfff : ~0x1fff); + m_timer->adjust(attotime::from_msec(250)); + } + else if (address < (16*1024)) { memset(&m_data[base & ~0x3fff], 0xff, 16 * 1024); m_erase_sector = address & ((m_bits == 16) ? ~0x1fff : ~0x3fff); @@ -912,6 +940,40 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data) } m_flash_mode = FM_NORMAL; break; + case FM_WORDPROGRAM1: + switch(m_bits) + { + case 8: + m_data[address] = data; + break; + case 16: // 16bit mode not tested + logerror("16-bit mode word programming not tested.\n"); + m_data[address*2] = data >> 8; + m_data[address*2+1] = data; + break; + default: + logerror("FM_WORDPROGRAM not supported when m_bits == %d (address %08x data %04x)\n", m_bits, address, data); + break; + } + m_flash_mode = FM_WORDPROGRAM2; + break; + case FM_WORDPROGRAM2: + switch(m_bits) + { + case 8: + m_data[address] = data; + break; + case 16: + logerror("16-bit mode word programming not tested.\n"); + m_data[address*2] = data >> 8; + m_data[address*2+1] = data; + break; + default: + logerror("FM_WORDPROGRAM not supported when m_bits == %d (address %08x data %04x)\n", m_bits, address, data); + break; + } + m_flash_mode = FM_NORMAL; + break; case FM_WRITEPART1: switch( m_bits ) { diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h index 9f17487c6be..c28a3b586ac 100644 --- a/src/devices/machine/intelfsh.h +++ b/src/devices/machine/intelfsh.h @@ -42,6 +42,8 @@ protected: uint8_t m_bits; uint32_t m_addrmask; uint16_t m_device_id; + uint16_t m_device_id2; + uint16_t m_device_id3; uint8_t m_maker_id; bool m_sector_is_4k; bool m_sector_is_16k; @@ -214,6 +216,12 @@ public: macronix_29lv160tmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); }; +class st_m29w640gb_device : public intelfsh8_device +{ +public: + st_m29w640gb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); +}; + class panasonic_mn63f805mnp_device : public intelfsh8_device { public: @@ -396,6 +404,7 @@ DECLARE_DEVICE_TYPE(MACRONIX_29F1610MC, macronix_29f1610mc_device) DECLARE_DEVICE_TYPE(MACRONIX_29F1610MC_16BIT,macronix_29f1610mc_16bit_device) DECLARE_DEVICE_TYPE(MACRONIX_29L001MC, macronix_29l001mc_device) DECLARE_DEVICE_TYPE(MACRONIX_29LV160TMC, macronix_29lv160tmc_device) +DECLARE_DEVICE_TYPE(ST_M29W640GB, st_m29w640gb_device) DECLARE_DEVICE_TYPE(TMS_29F040, tms_29f040_device) DECLARE_DEVICE_TYPE(PANASONIC_MN63F805MNP, panasonic_mn63f805mnp_device) -- cgit v1.2.3