diff options
| author | 2025-10-20 22:39:32 +0200 | |
|---|---|---|
| committer | 2025-10-20 22:40:38 +0200 | |
| commit | b57cb4214cf2c3bc42c5dcefadcdfc0757931c55 (patch) | |
| tree | d25196fba6e2bbbf2922d3b2b35400b50ed8f046 | |
| parent | 7b9fc444eba670e7c9bdd4c18ba67ddfb8027aeb (diff) | |
machine/intelfsh.cpp: preliminary Winbond SDP mode
| -rw-r--r-- | src/devices/machine/intelfsh.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp index 285d8f1f9ca..5b41774ad3c 100644 --- a/src/devices/machine/intelfsh.cpp +++ b/src/devices/machine/intelfsh.cpp @@ -44,6 +44,7 @@ enum FM_WRITEBUFFER1, // part 1 of write to buffer sequence FM_WRITEBUFFER2, // part 2 of write to buffer sequence FM_FAST_RESET, + FM_WRITEPAGEWINBOND, }; @@ -344,6 +345,7 @@ tc58fvt800_device::tc58fvt800_device(const machine_config &mconfig, const char * 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; + m_page_size = 0x80; } //------------------------------------------------- @@ -524,7 +526,8 @@ uint32_t intelfsh_device::read_full(uint32_t address) case 2: data = 0xfe << 8; break; default: // should be address $3fff2 only - logerror("warning: lockout read %06x\n", address); + if (!machine().side_effects_disabled()) + logerror("warning: lockout read %06x\n", address); data = 0xfe << 8; break; } @@ -762,6 +765,12 @@ 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) + { + logerror("%s: enter Winbond SDP\n", machine().describe_context()); + m_byte_count = 0; + m_flash_mode = FM_WRITEPAGEWINBOND; + } else { m_flash_mode = FM_BYTEPROGRAM; @@ -1101,6 +1110,29 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data) } } break; + case FM_WRITEPAGEWINBOND: + if ((address & 0xffff) == 0x5555 && (data & 0xff) == 0x20) + { + m_flash_mode = FM_NORMAL; + } + else + { + // TODO: magistr16 writes in byte units, confirm me + // (and propagates due of 68k byte smearing) + m_data[address*2] = data >> 8; + m_data[address*2+1] = data; + + m_byte_count++; + + if (m_byte_count == m_page_size) + { + m_flash_mode = FM_NORMAL; + m_sdp = false; + m_byte_count = 0; + } + } + break; + case FM_CLEARPART1: if( ( data & 0xff ) == 0xd0 ) { |
