diff options
author | 2015-11-08 12:56:12 +0100 | |
---|---|---|
committer | 2015-11-08 12:56:12 +0100 | |
commit | 7c19aac60e12d6f5ea301bdb34d7826a01e0b06f (patch) | |
tree | f310d86aa2c6bfc19d115307dedde4eb0cd52dad /src/devices/machine/serflash.c | |
parent | a57b46ae933badd7441ce1644711dbb851e2b504 (diff) |
Rename *.c -> *.cpp in our source (nw)
Diffstat (limited to 'src/devices/machine/serflash.c')
-rw-r--r-- | src/devices/machine/serflash.c | 411 |
1 files changed, 0 insertions, 411 deletions
diff --git a/src/devices/machine/serflash.c b/src/devices/machine/serflash.c deleted file mode 100644 index 60ff6712a2b..00000000000 --- a/src/devices/machine/serflash.c +++ /dev/null @@ -1,411 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Luca Elia -/* Serial Flash Device */ - -/* todo: cleanup, refactor etc. */ -/* ghosteo.c is similar? */ - -#include "emu.h" -#include "machine/serflash.h" - - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -// device type definition -const device_type SERFLASH = &device_creator<serflash_device>; - -//------------------------------------------------- -// serflash_device - constructor -//------------------------------------------------- - -serflash_device::serflash_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, SERFLASH, "Serial Flash", tag, owner, clock, "serflash", __FILE__), - device_nvram_interface(mconfig, *this), - m_length(0) -{ -} - - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void serflash_device::device_start() -{ - m_length = machine().root_device().memregion( tag() )->bytes(); - m_region = machine().root_device().memregion( tag() )->base(); - - m_flashwritemap.resize(m_length / FLASH_PAGE_SIZE); - memset(&m_flashwritemap[0], 0, m_length / FLASH_PAGE_SIZE); -} - -void serflash_device::device_reset() -{ - m_flash_enab = 0; - flash_hard_reset(machine()); - - m_last_flash_cmd = 0x00; - m_flash_addr_seq = 0; - m_flash_addr = 0; - - m_flash_page_addr = 0; -} - -//------------------------------------------------- -// serflash_default - called to initialize SERFLASH to -// its default state -//------------------------------------------------- - -void serflash_device::nvram_default() -{ -} - - -//------------------------------------------------- -// nvram_read - called to read SERFLASH from the -// .nv file -//------------------------------------------------- - -void serflash_device::nvram_read(emu_file &file) -{ - if (m_length % FLASH_PAGE_SIZE) return; // region size must be multiple of flash page size - int size = m_length / FLASH_PAGE_SIZE; - - - if (file) - { - UINT32 page; - file.read(&page, 4); - while (page < size) - { - m_flashwritemap[page] = 1; - file.read(m_region + page * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE); - file.read(&page, 4); - } - } - -} - - -//------------------------------------------------- -// nvram_write - called to write SERFLASH to the -// .nv file -//------------------------------------------------- - -void serflash_device::nvram_write(emu_file &file) -{ - if (m_length % FLASH_PAGE_SIZE) return; // region size must be multiple of flash page size - int size = m_length / FLASH_PAGE_SIZE; - - UINT32 page = 0; - while (page < size) - { - if (m_flashwritemap[page]) - { - file.write(&page, 4); - file.write(m_region + page * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE); - } - page++; - } - file.write(&page, 4); -} - -void serflash_device::flash_hard_reset(running_machine &machine) -{ -// logerror("%08x FLASH: RESET\n", cpuexec_describe_context(machine)); - - m_flash_state = STATE_READ; - - m_flash_cmd_prev = -1; - m_flash_cmd_seq = 0; - - m_flash_addr_seq = 0; - m_flash_read_seq = 0; - - m_flash_row = 0; - m_flash_col = 0; - - memset(m_flash_page_data, 0, FLASH_PAGE_SIZE); - m_flash_page_addr = 0; - m_flash_page_index = 0; -} - -WRITE8_MEMBER( serflash_device::flash_enab_w ) -{ - //logerror("%08x FLASH: enab = %02X\n", m_maincpu->pc(), data); - m_flash_enab = data; -} - -void serflash_device::flash_change_state(running_machine &machine, flash_state_t state) -{ - m_flash_state = state; - - m_flash_cmd_prev = -1; - m_flash_cmd_seq = 0; - - m_flash_read_seq = 0; - m_flash_addr_seq = 0; - - //logerror("flash_change_state - FLASH: state = %s\n", m_flash_state_name[state]); -} - -WRITE8_MEMBER( serflash_device::flash_cmd_w ) -{ - if (!m_flash_enab) - return; - - //logerror("%08x FLASH: cmd = %02X (prev = %02X)\n", m_maincpu->pc(), data, m_flash_cmd_prev); - - if (m_flash_cmd_prev == -1) - { - m_flash_cmd_prev = data; - - switch (data) - { - case 0x00: // READ - m_flash_addr_seq = 0; - break; - - case 0x60: // BLOCK ERASE - m_flash_addr_seq = 0; - break; - - case 0x70: // READ STATUS - flash_change_state( space.machine(), STATE_READ_STATUS ); - break; - - case 0x80: // PAGE / CACHE PROGRAM - m_flash_addr_seq = 0; - // this actually seems to be set with the next 2 writes? - m_flash_page_addr = 0; - break; - - case 0x90: // READ ID - flash_change_state( space.machine(), STATE_READ_ID ); - break; - - case 0xff: // RESET - flash_change_state( space.machine(), STATE_IDLE ); - break; - - default: - { - //logerror("%08x FLASH: unknown cmd1 = %02X\n", cpu_get_pc(space.device()), data); - } - } - } - else - { - switch (m_flash_cmd_prev) - { - case 0x00: // READ - if (data == 0x30) - { - memcpy(m_flash_page_data, m_region + m_flash_row * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE); - m_flash_page_addr = m_flash_col; - m_flash_page_index = m_flash_row; - - flash_change_state( space.machine(), STATE_READ ); - - //logerror("%08x FLASH: caching page = %04X\n", m_maincpu->pc(), m_flash_row); - } - break; - - case 0x60: // BLOCK ERASE - if (data==0xd0) - { - flash_change_state( space.machine(), STATE_BLOCK_ERASE ); - m_flashwritemap[m_flash_col] |= 1; - memset(m_region + m_flash_col * FLASH_PAGE_SIZE, 0xff, FLASH_PAGE_SIZE); - //logerror("erased block %04x (%08x - %08x)\n", m_flash_col, m_flash_col * FLASH_PAGE_SIZE, ((m_flash_col+1) * FLASH_PAGE_SIZE)-1); - } - else - { - //logerror("unexpected 2nd command after BLOCK ERASE\n"); - } - break; - case 0x80: - if (data==0x10) - { - flash_change_state( space.machine(), STATE_PAGE_PROGRAM ); - m_flashwritemap[m_flash_row] |= (memcmp(m_region + m_flash_row * FLASH_PAGE_SIZE, m_flash_page_data, FLASH_PAGE_SIZE) != 0); - memcpy(m_region + m_flash_row * FLASH_PAGE_SIZE, m_flash_page_data, FLASH_PAGE_SIZE); - //logerror("re-written block %04x (%08x - %08x)\n", m_flash_row, m_flash_row * FLASH_PAGE_SIZE, ((m_flash_row+1) * FLASH_PAGE_SIZE)-1); - - } - else - { - //logerror("unexpected 2nd command after SPAGE PROGRAM\n"); - } - break; - - - default: - { - //logerror("%08x FLASH: unknown cmd2 = %02X (cmd1 = %02X)\n", m_maincpu->pc(), data, m_flash_cmd_prev); - } - } - } -} - -WRITE8_MEMBER( serflash_device::flash_data_w ) -{ - if (!m_flash_enab) - return; - - //logerror("flash data write %04x\n", m_flash_page_addr); - m_flash_page_data[m_flash_page_addr] = data; - m_flash_page_addr++; -} - -WRITE8_MEMBER( serflash_device::flash_addr_w ) -{ - if (!m_flash_enab) - return; - - //logerror("%08x FLASH: addr = %02X (seq = %02X)\n", m_maincpu->pc(), data, m_flash_addr_seq); - - switch( m_flash_addr_seq++ ) - { - case 0: - m_flash_col = (m_flash_col & 0xff00) | data; - break; - case 1: - m_flash_col = (m_flash_col & 0x00ff) | (data << 8); - break; - case 2: - m_flash_row = (m_flash_row & 0xff00) | data; - break; - case 3: - m_flash_row = (m_flash_row & 0x00ff) | (data << 8); - m_flash_addr_seq = 0; - break; - } -} - -READ8_MEMBER( serflash_device::flash_io_r ) -{ - UINT8 data = 0x00; -// UINT32 old; - - if (!m_flash_enab) - return 0xff; - - switch (m_flash_state) - { - case STATE_READ_ID: - //old = m_flash_read_seq; - - switch( m_flash_read_seq++ ) - { - case 0: - data = 0xEC; // Manufacturer - break; - case 1: - data = 0xF1; // Device - break; - case 2: - data = 0x00; // XX - break; - case 3: - data = 0x15; // Flags - m_flash_read_seq = 0; - break; - } - - //logerror("%08x FLASH: read %02X from id(%02X)\n", m_maincpu->pc(), data, old); - break; - - case STATE_READ: - if (m_flash_page_addr > FLASH_PAGE_SIZE-1) - m_flash_page_addr = FLASH_PAGE_SIZE-1; - - //old = m_flash_page_addr; - - data = m_flash_page_data[m_flash_page_addr++]; - - //logerror("%08x FLASH: read data %02X from addr %03X (page %04X)\n", m_maincpu->pc(), data, old, m_flash_page_index); - break; - - case STATE_READ_STATUS: - // bit 7 = writeable, bit 6 = ready, bit 5 = ready/true ready, bit 1 = fail(N-1), bit 0 = fail - data = 0xe0; - //logerror("%08x FLASH: read status %02X\n", m_maincpu->pc(), data); - break; - - default: - { - // logerror("%08x FLASH: unknown read in state %s\n",0x00/*m_maincpu->pc()*/, m_flash_state_name[m_flash_state]); - } - } - - return data; -} - -READ8_MEMBER( serflash_device::flash_ready_r ) -{ - return 1; -} - - - -READ8_MEMBER(serflash_device::n3d_flash_r) -{ - if (m_last_flash_cmd==0x70) return 0xe0; - - if (m_last_flash_cmd==0x00) - { - UINT8 retdat = m_flash_page_data[m_flash_page_addr]; - - //logerror("n3d_flash_r %02x %04x\n", offset, m_flash_page_addr); - - m_flash_page_addr++; - return retdat; - } - - - logerror("n3d_flash_r %02x\n", offset); - return 0x00; - -} - - -WRITE8_MEMBER(serflash_device::n3d_flash_cmd_w) -{ - logerror("n3d_flash_cmd_w %02x %02x\n", offset, data); - m_last_flash_cmd = data; - - if (data==0x00) - { - memcpy(m_flash_page_data, m_region + m_flash_addr * FLASH_PAGE_SIZE, FLASH_PAGE_SIZE); - - } - -} - -WRITE8_MEMBER(serflash_device::n3d_flash_addr_w) -{ -// logerror("n3d_flash_addr_w %02x %02x\n", offset, data); - - m_flash_addr_seq++; - - if (m_flash_addr_seq==3) - m_flash_addr = (m_flash_addr & 0xffff00) | data; - - if (m_flash_addr_seq==4) - m_flash_addr = (m_flash_addr & 0xff00ff) | data << 8; - - if (m_flash_addr_seq==5) - m_flash_addr = (m_flash_addr & 0x00ffff) | data << 16; - - if (m_flash_addr_seq==5) - { - m_flash_addr_seq = 0; - m_flash_page_addr = 0; - logerror("set flash block to %08x\n", m_flash_addr); - } -} |