From 07ee4afaba2d35b7089aa41f3f9495cf610b6a5d Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Tue, 15 May 2012 06:56:17 +0000 Subject: [PATCH] objdump doesn't work with VS binaries, so do not run it by Firewave (no whatsnew) fixed uninitialized field in ioport_field.m_chars (fixes stack corruption with three PORT_CHAR definitions) / added some sanity checks for PORT_CHAR adding and lookup by Firewave Intel 28F320J3D flash support by Lukasz Markowski snapquik.c fixed uninitialized variable that causes random assertion failure by Sandro Ronco --- makefile | 2 ++ src/emu/imagedev/snapquik.c | 6 ++-- src/emu/ioport.c | 13 ++++++-- src/emu/machine/intelfsh.c | 61 ++++++++++++++++++++++++++----------- src/emu/machine/intelfsh.h | 13 ++++++-- 5 files changed, 70 insertions(+), 25 deletions(-) diff --git a/makefile b/makefile index 281148300e6..06fa568d22a 100644 --- a/makefile +++ b/makefile @@ -761,9 +761,11 @@ $(EMULATOR): $(VERSIONOBJ) $(EMUINFOOBJ) $(DRIVLISTOBJ) $(DRVLIBS) $(LIBOSD) $(L $(LD) $(LDFLAGS) $(LDFLAGSEMULATOR) $^ $(LIBS) -o $@ ifeq ($(TARGETOS),win32) ifdef SYMBOLS +ifndef MSVC_BUILD $(OBJDUMP) --section=.text --line-numbers --syms --demangle $@ >$(FULLNAME).sym endif endif +endif endif diff --git a/src/emu/imagedev/snapquik.c b/src/emu/imagedev/snapquik.c index 44635507dd2..da87c282611 100644 --- a/src/emu/imagedev/snapquik.c +++ b/src/emu/imagedev/snapquik.c @@ -18,13 +18,15 @@ const device_type SNAPSHOT = &device_creator; snapshot_image_device::snapshot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, SNAPSHOT, "Snapshot", tag, owner, clock), - device_image_interface(mconfig, *this) + device_image_interface(mconfig, *this), + m_delay_attoseconds(0) { } snapshot_image_device::snapshot_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, type, name, tag, owner, clock), - device_image_interface(mconfig, *this) + device_image_interface(mconfig, *this), + m_delay_attoseconds(0) { } //------------------------------------------------- diff --git a/src/emu/ioport.c b/src/emu/ioport.c index 043c69aaddd..d2319558244 100644 --- a/src/emu/ioport.c +++ b/src/emu/ioport.c @@ -1660,7 +1660,7 @@ ioport_field::ioport_field(ioport_port &port, ioport_type type, ioport_value def // reset sequences and chars for (input_seq_type seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; seqtype++) m_seq[seqtype].set_default(); - m_chars[0] = m_chars[1] = m_chars[2] = unicode_char(0); + m_chars[0] = m_chars[1] = m_chars[2] = m_chars[3] = unicode_char(0); // for DIP switches and configs, look for a default value from the owner if (type == IPT_DIPSWITCH || type == IPT_CONFIG) @@ -1832,7 +1832,12 @@ ioport_type_class ioport_field::type_class() const unicode_char ioport_field::keyboard_code(int which) const { - unicode_char ch = m_chars[which]; + unicode_char ch; + + if (which >= ARRAY_LENGTH(m_chars)) + throw emu_fatalerror("Tried to access keyboard_code with out-of-range index %d\n", which); + + ch = m_chars[which]; // special hack to allow for PORT_CODE('\xA3') if (ch >= 0xffffff80 && ch <= 0xffffffff) @@ -3842,8 +3847,10 @@ void ioport_configurer::field_add_char(unicode_char ch) if (m_curfield->m_chars[index] == 0) { m_curfield->m_chars[index] = ch; - break; + return; } + + throw emu_fatalerror("PORT_CHAR(%d) could not be added - maximum amount exceeded\n", ch); } diff --git a/src/emu/machine/intelfsh.c b/src/emu/machine/intelfsh.c index 7eab09f9226..4705ef703fd 100644 --- a/src/emu/machine/intelfsh.c +++ b/src/emu/machine/intelfsh.c @@ -92,6 +92,7 @@ const device_type SHARP_LH28F400 = &device_creator; const device_type INTEL_E28F008SA = &device_creator; const device_type INTEL_TE28F160 = &device_creator; const device_type SHARP_UNK128MBIT = &device_creator; +const device_type INTEL_28F320J3D = &device_creator; static ADDRESS_MAP_START( memory_map8_512Kb, AS_PROGRAM, 8, intelfsh_device ) AM_RANGE(0x00000, 0x00ffff) AM_RAM @@ -122,6 +123,10 @@ static ADDRESS_MAP_START( memory_map16_16Mb, AS_PROGRAM, 16, intelfsh_device ) AM_RANGE(0x00000, 0x0fffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( memory_map16_32Mb, AS_PROGRAM, 16, intelfsh_device ) + AM_RANGE(0x00000, 0x1fffff) AM_RAM +ADDRESS_MAP_END + static ADDRESS_MAP_START( memory_map16_64Mb, AS_PROGRAM, 16, intelfsh_device ) AM_RANGE(0x00000, 0x3fffff) AM_RAM ADDRESS_MAP_END @@ -187,6 +192,14 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type m_device_id = 0xd5; map = ADDRESS_MAP_NAME( memory_map8_8Mb ); break; + case FLASH_INTEL_28F320J3D: + m_bits = 16; + m_size = 0x400000; + m_maker_id = MFG_INTEL; + m_device_id = 0x16; + m_sector_is_4k = true; + map = ADDRESS_MAP_NAME( memory_map16_32Mb ); + break; case FLASH_SHARP_LH28F400: case FLASH_INTEL_E28F400: m_bits = 16; @@ -315,6 +328,8 @@ intel_e28f400_device::intel_e28f400_device(const machine_config &mconfig, const sharp_unk128mbit_device::sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : intelfsh16_device(mconfig, SHARP_UNK128MBIT, "Sharp Unknown 128Mbit Flash", tag, owner, clock, FLASH_SHARP_UNK128MBIT) { } +intel_28f320j3d_device::intel_28f320j3d_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intelfsh16_device(mconfig, INTEL_28F320J3D, "Intel 28F320J3D Flash", tag, owner, clock, FLASH_INTEL_28F320J3D) { } //------------------------------------------------- // device_start - device-specific startup @@ -454,7 +469,7 @@ UINT32 intelfsh_device::read_full(UINT32 address) data = m_status; break; case FM_READAMDID3: - if (m_maker_id == 0x04 && m_device_id == 0x35) + if (m_maker_id == MFG_FUJITSU && m_device_id == 0x35) { //used in Fujitsu 29DL16X 8bits mode switch (address) @@ -475,27 +490,39 @@ UINT32 intelfsh_device::read_full(UINT32 address) } break; case FM_READID: - switch (address) + if (m_maker_id == MFG_INTEL && m_device_id == 0x16) { - case 0: // maker ID - data = m_maker_id; - break; - case 1: // chip ID - data = m_device_id; - break; - case 2: // block lock config - data = 0; // we don't support this yet - break; - case 3: // master lock config - if (m_flash_master_lock) + switch (address) { - data = 1; + case 0: data = m_maker_id; break; + case 2: data = m_device_id; break; + case 4: data = 0; break; } - else + } + else + { + switch (address) { - data = 0; + case 0: // maker ID + data = m_maker_id; + break; + case 1: // chip ID + data = m_device_id; + break; + case 2: // block lock config + data = 0; // we don't support this yet + break; + case 3: // master lock config + if (m_flash_master_lock) + { + data = 1; + } + else + { + data = 0; + } + break; } - break; } break; case FM_ERASEAMD4: diff --git a/src/emu/machine/intelfsh.h b/src/emu/machine/intelfsh.h index 6cb394a7b08..4fbc9517dac 100644 --- a/src/emu/machine/intelfsh.h +++ b/src/emu/machine/intelfsh.h @@ -55,7 +55,8 @@ #define MCFG_SHARP_UNK128MBIT_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, SHARP_UNK128MBIT, 0) - +#define MCFG_INTEL_28F320J3D_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, INTEL_28F320J3D, 0) //************************************************************************** // TYPE DEFINITIONS @@ -90,7 +91,8 @@ public: FLASH_SHARP_LH28F400 = 0x1000, FLASH_INTEL_E28F400, FLASH_INTEL_TE28F160, - FLASH_SHARP_UNK128MBIT + FLASH_SHARP_UNK128MBIT, + FLASH_INTEL_28F320J3D }; protected: @@ -266,6 +268,11 @@ public: sharp_unk128mbit_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); }; +class intel_28f320j3d_device : public intelfsh16_device +{ +public: + intel_28f320j3d_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; // device type definition @@ -285,6 +292,6 @@ extern const device_type SHARP_LH28F400; extern const device_type INTEL_E28F008SA; extern const device_type INTEL_TE28F160; extern const device_type SHARP_UNK128MBIT; - +extern const device_type INTEL_28F320J3D; #endif