diff options
Diffstat (limited to 'src/devices/machine/intelfsh.cpp')
| -rw-r--r-- | src/devices/machine/intelfsh.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp index 630469944a7..285d8f1f9ca 100644 --- a/src/devices/machine/intelfsh.cpp +++ b/src/devices/machine/intelfsh.cpp @@ -140,6 +140,7 @@ DEFINE_DEVICE_TYPE(CAT28F020, cat28f020_device, "c DEFINE_DEVICE_TYPE(TC58FVT800, tc58fvt800_device, "tc58fvt800", "Toshiba TC58FVT800 Flash") +DEFINE_DEVICE_TYPE(WINBOND_W29C020C, winbond_w29c020c_device, "winbond_w29c020c", "Winbond W29C020C Flash") //************************************************************************** @@ -340,6 +341,11 @@ tms_29f040_device::tms_29f040_device(const machine_config &mconfig, const char * tc58fvt800_device::tc58fvt800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : intelfsh16_device(mconfig, TC58FVT800, tag, owner, clock, 0x100000, MFG_TOSHIBA, 0x4f) { m_top_boot_sector = true; } +winbond_w29c020c_device::winbond_w29c020c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : intelfsh16_device(mconfig, WINBOND_W29C020C, tag, owner, clock, 0x40000, MFG_WINBOND, 0x45) { + m_addrmask = 0xffff; +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -506,6 +512,23 @@ uint32_t intelfsh_device::read_full(uint32_t address) case 0x1e: data = m_device_id3; break; } } + else if (m_maker_id == MFG_WINBOND) + { + // magistr16 checks that the device ID returns either 0x45 or 0x46, on upper byte + // (repeated in both nibbles? cfr. page 8) + switch (address) + { + case 0: data = m_maker_id << 8; break; + case 1: data = m_device_id << 8; break; + // TODO: lockout mode returns 0xff (unused by magistr16) + case 2: data = 0xfe << 8; break; + default: + // should be address $3fff2 only + logerror("warning: lockout read %06x\n", address); + data = 0xfe << 8; + break; + } + } else { switch (address & 0xff) @@ -958,6 +981,11 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data) m_flash_mode = FM_WRITEPAGEATMEL; m_byte_count = 0; } + else if (m_maker_id == MFG_WINBOND && (data & 0xff) == 0x60 && (( address & 0xffff ) == 0x5555)) + { + m_flash_mode = FM_READAMDID3; + logerror("%s: Winbond enter ID mode\n", machine().describe_context()); + } else { logerror( "unexpected %08x=%02x in FM_ERASEAMD3\n", address, data & 0xff ); |
