From a77adf33c78b888f3d7ea9ac476f79c8717c7281 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 16 Aug 2021 14:04:29 -0400 Subject: dvmemory: Substitute strongly typed enum for magic numbers specifying data format --- src/emu/debug/dvmemory.cpp | 104 ++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 49 deletions(-) (limited to 'src/emu/debug/dvmemory.cpp') diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp index 3ae8008f0a2..299e4c1e439 100644 --- a/src/emu/debug/dvmemory.cpp +++ b/src/emu/debug/dvmemory.cpp @@ -25,22 +25,21 @@ const debug_view_memory::memory_view_pos debug_view_memory::s_memory_pos_table[12] = { - /* 0 bytes per chunk: */ { 0, { 0 } }, - /* 1 byte per chunk: 00 11 22 33 44 55 66 77 */ { 3, { 0x04, 0x00, 0x80 } }, - /* 2 bytes per chunk: 0011 2233 4455 6677 */ { 6, { 0x8c, 0x0c, 0x08, 0x04, 0x00, 0x80 } }, - /* 3 bytes per chunk: */ { 0, { 0 } }, - /* 4 bytes per chunk: 00112233 44556677 */ { 12, { 0x9c, 0x9c, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80 } }, - /* 5 bytes per chunk: */ { 0, { 0 } }, - /* 6 bytes per chunk: */ { 0, { 0 } }, - /* 7 bytes per chunk: */ { 0, { 0 } }, - /* 8 bytes per chunk: 0011223344556677 */ { 24, { 0xbc, 0xbc, 0xbc, 0xbc, 0x3c, 0x38, 0x34, 0x30, 0x2c, 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80, 0x80, 0x80 } }, - /* 32 bit floating point: */ { 16, { 0 } }, - /* 64 bit floating point: */ { 32, { 0 } }, - /* 80 bit floating point: */ { 32, { 0 } }, + /* 0 bytes per chunk: */ { 0, 0, { 0 } }, + /* 1 byte per chunk: 00 11 22 33 44 55 66 77 */ { 1, 3, { 0x04, 0x00, 0x80 } }, + /* 2 bytes per chunk: 0011 2233 4455 6677 */ { 2, 6, { 0x8c, 0x0c, 0x08, 0x04, 0x00, 0x80 } }, + /* 3 bytes per chunk: */ { 0, 0, { 0 } }, + /* 4 bytes per chunk: 00112233 44556677 */ { 4, 12, { 0x9c, 0x9c, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80 } }, + /* 5 bytes per chunk: */ { 0, 0, { 0 } }, + /* 6 bytes per chunk: */ { 0, 0, { 0 } }, + /* 7 bytes per chunk: */ { 0, 0, { 0 } }, + /* 8 bytes per chunk: 0011223344556677 */ { 8, 24, { 0xbc, 0xbc, 0xbc, 0xbc, 0x3c, 0x38, 0x34, 0x30, 0x2c, 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x04, 0x00, 0x80, 0x80, 0x80, 0x80 } }, + /* 32 bit floating point: */ { 4, 16, { 0 } }, + /* 64 bit floating point: */ { 8, 32, { 0 } }, + /* 80 bit floating point: */ { 10, 32, { 0 } }, }; - //************************************************************************** // DEBUG VIEW MEMORY SOURCE //************************************************************************** @@ -107,7 +106,7 @@ debug_view_memory::debug_view_memory(running_machine &machine, debug_view_osd_up m_chunks_per_row(16), m_bytes_per_chunk(1), m_steps_per_chunk(1), - m_data_format(1), + m_data_format(data_format::HEX_8BIT), m_reverse_view(false), m_ascii_view(true), m_no_translation(false), @@ -214,7 +213,24 @@ void debug_view_memory::view_notify(debug_view_notification type) m_bytes_per_chunk = source.m_prefsize; if (m_bytes_per_chunk > 8) m_bytes_per_chunk = 8; - m_data_format = m_bytes_per_chunk; + switch (m_bytes_per_chunk) + { + case 1: + m_data_format = data_format::HEX_8BIT; + break; + + case 2: + m_data_format = data_format::HEX_16BIT; + break; + + case 4: + m_data_format = data_format::HEX_32BIT; + break; + + case 8: + m_data_format = data_format::HEX_64BIT; + break; + } m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk; if (source.m_space != nullptr) m_expression.set_context(&source.m_space->device().debug()->symtable()); @@ -264,7 +280,7 @@ static inline float u64_to_double(u64 value) void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *destmax, debug_view_char *destrow, offs_t address) { // get positional data - const memory_view_pos &posdata = s_memory_pos_table[m_data_format]; + const memory_view_pos &posdata = get_posdata(m_data_format); int spacing = posdata.m_spacing; // generate the address @@ -277,7 +293,7 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char * // generate the data and the ascii string std::string chunkascii; - if (m_data_format <= 8) + if (is_hex_format(m_data_format)) { for (int chunknum = 0; chunknum < m_chunks_per_row; chunknum++) { @@ -310,7 +326,7 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char * extFloat80_t chunkdata80 = { 0, 0 }; bool ismapped; - if (m_data_format != 11) + if (m_data_format != data_format::FLOAT_80BIT) ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata); else ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata80); @@ -318,17 +334,21 @@ void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char * if (ismapped) switch (m_data_format) { - case 9: + case data_format::FLOAT_32BIT: sprintf(valuetext, "%.8g", u32_to_float(u32(chunkdata))); break; - case 10: + case data_format::FLOAT_64BIT: sprintf(valuetext, "%.24g", u64_to_double(chunkdata)); break; - case 11: + case data_format::FLOAT_80BIT: + { float64_t f64 = extF80M_to_f64(&chunkdata80); sprintf(valuetext, "%.24g", u64_to_double(f64.v)); break; } + default: + break; + } else { valuetext[0] = '*'; @@ -621,10 +641,10 @@ void debug_view_memory::recompute() // compute the section widths m_section[0].m_width = 1 + 8 + 1; - if (m_data_format <= 8) + if (is_hex_format(m_data_format)) m_section[1].m_width = 1 + 3 * m_bytes_per_row + 1; else { - const memory_view_pos &posdata = s_memory_pos_table[m_data_format]; + const memory_view_pos &posdata = get_posdata(m_data_format); m_section[1].m_width = 1 + posdata.m_spacing * m_chunks_per_row + 1; } @@ -693,11 +713,11 @@ debug_view_memory::cursor_pos debug_view_memory::get_cursor_pos(const debug_view { // start with the base address for this row cursor_pos pos; - const memory_view_pos &posdata = s_memory_pos_table[m_data_format]; + const memory_view_pos &posdata = get_posdata(m_data_format); pos.m_address = m_byte_offset + cursor.y * m_bytes_per_chunk * m_chunks_per_row; // determine the X position within the middle section, clamping as necessary - if (m_data_format <= 8) { + if (is_hex_format(m_data_format)) { int xposition = cursor.x - m_section[1].m_pos - 1; if (xposition < 0) xposition = 0; @@ -744,7 +764,7 @@ debug_view_memory::cursor_pos debug_view_memory::get_cursor_pos(const debug_view void debug_view_memory::set_cursor_pos(cursor_pos pos) { - const memory_view_pos &posdata = s_memory_pos_table[m_data_format]; + const memory_view_pos &posdata = get_posdata(m_data_format); // offset the address by the byte offset if (pos.m_address < m_byte_offset) @@ -759,7 +779,7 @@ void debug_view_memory::set_cursor_pos(cursor_pos pos) if (m_reverse_view) chunknum = m_chunks_per_row - 1 - chunknum; - if (m_data_format <= 8) { + if (is_hex_format(m_data_format)) { // scan within the chunk to find the shift for (m_cursor.x = 0; m_cursor.x < posdata.m_spacing; m_cursor.x++) if (posdata.m_shift[m_cursor.x] == pos.m_shift) @@ -968,12 +988,12 @@ void debug_view_memory::set_chunks_per_row(u32 rowchunks) // are shown, 1-8 8-64 bits, 9 32bit floating point //------------------------------------------------- -void debug_view_memory::set_data_format(int format) +void debug_view_memory::set_data_format(data_format format) { cursor_pos pos; // should never be - if ((format <= 0) || (format > 11)) + if (!is_valid_format(format)) return; // no need to change if (format == m_data_format) @@ -981,44 +1001,30 @@ void debug_view_memory::set_data_format(int format) pos = begin_update_and_get_cursor_pos(); const debug_view_memory_source &source = downcast(*m_source); - if ((format <= 8) && (m_data_format <= 8)) { - + if (is_hex_format(format) && is_hex_format(m_data_format)) { pos.m_address += (pos.m_shift / 8) ^ ((source.m_endianness == ENDIANNESS_LITTLE) ? 0 : (m_bytes_per_chunk - 1)); pos.m_shift %= 8; - m_bytes_per_chunk = format; + m_bytes_per_chunk = get_posdata(format).m_bytes; m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk; - m_chunks_per_row = m_bytes_per_row / format; + m_chunks_per_row = m_bytes_per_row / m_bytes_per_chunk; if (m_chunks_per_row < 1) m_chunks_per_row = 1; pos.m_shift += 8 * ((pos.m_address % m_bytes_per_chunk) ^ ((source.m_endianness == ENDIANNESS_LITTLE) ? 0 : (m_bytes_per_chunk - 1))); pos.m_address -= pos.m_address % m_bytes_per_chunk; } else { - if (format <= 8) { + if (is_hex_format(format)) { m_supports_cursor = true; m_edit_enabled = true; - - m_bytes_per_chunk = format; } else { m_supports_cursor = false; m_edit_enabled = false; m_cursor_visible = false; - - switch (format) - { - case 9: - m_bytes_per_chunk = 4; - break; - case 10: - m_bytes_per_chunk = 8; - break; - case 11: - m_bytes_per_chunk = 10; - break; - } } + + m_bytes_per_chunk = get_posdata(format).m_bytes; m_chunks_per_row = m_bytes_per_row / m_bytes_per_chunk; m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk; pos.m_shift = 0; -- cgit v1.2.3 From ba60ce78260589929174e16c2bbefdf144246c84 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 16 Aug 2021 14:43:04 -0400 Subject: debugger/win/memorywininfo.cpp: Fix build --- src/emu/debug/dvmemory.cpp | 2 +- src/osd/modules/debugger/win/memorywininfo.cpp | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src/emu/debug/dvmemory.cpp') diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp index 299e4c1e439..1a239419f8d 100644 --- a/src/emu/debug/dvmemory.cpp +++ b/src/emu/debug/dvmemory.cpp @@ -985,7 +985,7 @@ void debug_view_memory::set_chunks_per_row(u32 rowchunks) //------------------------------------------------- // set_data_format - specify what kind of values -// are shown, 1-8 8-64 bits, 9 32bit floating point +// are shown //------------------------------------------------- void debug_view_memory::set_data_format(data_format format) diff --git a/src/osd/modules/debugger/win/memorywininfo.cpp b/src/osd/modules/debugger/win/memorywininfo.cpp index 66e130b0cad..a103b3b353b 100644 --- a/src/osd/modules/debugger/win/memorywininfo.cpp +++ b/src/osd/modules/debugger/win/memorywininfo.cpp @@ -220,31 +220,31 @@ bool memorywin_info::handle_command(WPARAM wparam, LPARAM lparam) switch (LOWORD(wparam)) { case ID_1_BYTE_CHUNKS: - memview->set_data_format(1); + memview->set_data_format(debug_view_memory::data_format::HEX_8BIT); return true; case ID_2_BYTE_CHUNKS: - memview->set_data_format(2); + memview->set_data_format(debug_view_memory::data_format::HEX_16BIT); return true; case ID_4_BYTE_CHUNKS: - memview->set_data_format(4); + memview->set_data_format(debug_view_memory::data_format::HEX_32BIT); return true; case ID_8_BYTE_CHUNKS: - memview->set_data_format(8); + memview->set_data_format(debug_view_memory::data_format::HEX_64BIT); return true; case ID_FLOATING_POINT_32BIT: - memview->set_data_format(9); + memview->set_data_format(debug_view_memory::data_format::FLOAT_32BIT); return true; case ID_FLOATING_POINT_64BIT: - memview->set_data_format(10); + memview->set_data_format(debug_view_memory::data_format::FLOAT_64BIT); return true; case ID_FLOATING_POINT_80BIT: - memview->set_data_format(11); + memview->set_data_format(debug_view_memory::data_format::FLOAT_80BIT); return true; case ID_LOGICAL_ADDRESSES: -- cgit v1.2.3 From 3025c17f20ba2ee67f85ce6bdb77d90465e2d660 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 16 Aug 2021 15:28:52 -0400 Subject: Fix exception in debug memory viewer selecting a floating point format when the number of chunks per row is too small --- src/emu/debug/dvmemory.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/emu/debug/dvmemory.cpp') diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp index 1a239419f8d..fea8def590e 100644 --- a/src/emu/debug/dvmemory.cpp +++ b/src/emu/debug/dvmemory.cpp @@ -1026,6 +1026,8 @@ void debug_view_memory::set_data_format(data_format format) m_bytes_per_chunk = get_posdata(format).m_bytes; m_chunks_per_row = m_bytes_per_row / m_bytes_per_chunk; + if (m_chunks_per_row < 1) + m_chunks_per_row = 1; m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk; pos.m_shift = 0; pos.m_address -= pos.m_address % m_bytes_per_chunk; -- cgit v1.2.3 From ccaa00b3ed00d63b4781270c992e00b63811c85d Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 31 Aug 2021 12:30:11 -0400 Subject: Move endianness type into lib/util header --- scripts/src/lib.lua | 1 + src/devices/cpu/mips/mips1.cpp | 8 ++-- src/emu/debug/dvmemory.cpp | 2 +- src/emu/emucore.cpp | 2 - src/emu/emucore.h | 44 ++++++++++----------- src/emu/emumem.h | 31 +-------------- src/emu/emumem_mud.cpp | 2 +- src/emu/emumem_mud.h | 6 +-- src/emu/memarray.cpp | 54 +++++++++++++------------- src/frontend/mame/luaengine_mem.cpp | 12 +----- src/lib/util/endianness.h | 76 +++++++++++++++++++++++++++++++++++++ src/tools/unidasm.cpp | 6 ++- 12 files changed, 139 insertions(+), 105 deletions(-) create mode 100644 src/lib/util/endianness.h (limited to 'src/emu/debug/dvmemory.cpp') diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua index c24bb015cd4..fd8c5be2c27 100644 --- a/scripts/src/lib.lua +++ b/scripts/src/lib.lua @@ -61,6 +61,7 @@ project "utils" MAME_DIR .. "src/lib/util/delegate.h", MAME_DIR .. "src/lib/util/disasmintf.cpp", MAME_DIR .. "src/lib/util/disasmintf.h", + MAME_DIR .. "src/lib/util/endianness.h", MAME_DIR .. "src/lib/util/flac.cpp", MAME_DIR .. "src/lib/util/flac.h", MAME_DIR .. "src/lib/util/harddisk.cpp", diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp index c5f18b2989e..9b041123d4d 100644 --- a/src/devices/cpu/mips/mips1.cpp +++ b/src/devices/cpu/mips/mips1.cpp @@ -1057,7 +1057,7 @@ void mips1core_device_base::lwl(u32 const op) offs_t const offset = SIMMVAL + m_r[RSREG]; load(offset, [this, op, offset](u32 temp) { - unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3; + unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 3 : 0)) << 3; m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU << shift)) | (temp << shift); }); @@ -1068,7 +1068,7 @@ void mips1core_device_base::lwr(u32 const op) offs_t const offset = SIMMVAL + m_r[RSREG]; load(offset, [this, op, offset](u32 temp) { - unsigned const shift = ((offset & 0x3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3; + unsigned const shift = ((offset & 0x3) ^ (m_endianness == ENDIANNESS_LITTLE ? 0 : 3)) << 3; m_r[RTREG] = (m_r[RTREG] & ~u32(0xffffffffU >> shift)) | (temp >> shift); }); @@ -1077,7 +1077,7 @@ void mips1core_device_base::lwr(u32 const op) void mips1core_device_base::swl(u32 const op) { offs_t const offset = SIMMVAL + m_r[RSREG]; - unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 3, 0)) << 3; + unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 3 : 0)) << 3; store(offset, m_r[RTREG] >> shift, 0xffffffffU >> shift); } @@ -1085,7 +1085,7 @@ void mips1core_device_base::swl(u32 const op) void mips1core_device_base::swr(u32 const op) { offs_t const offset = SIMMVAL + m_r[RSREG]; - unsigned const shift = ((offset & 3) ^ ENDIAN_VALUE_LE_BE(m_endianness, 0, 3)) << 3; + unsigned const shift = ((offset & 3) ^ (m_endianness == ENDIANNESS_LITTLE ? 0 : 3)) << 3; store(offset, m_r[RTREG] << shift, 0xffffffffU << shift); } diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp index fea8def590e..2e384e90866 100644 --- a/src/emu/debug/dvmemory.cpp +++ b/src/emu/debug/dvmemory.cpp @@ -70,7 +70,7 @@ debug_view_memory_source::debug_view_memory_source(std::string &&name, memory_re , m_blocklength(region.bytes()) , m_numblocks(1) , m_blockstride(0) - , m_offsetxor(ENDIAN_VALUE_NE_NNE(region.endianness(), 0, region.bytewidth() - 1)) + , m_offsetxor(region.endianness() == ENDIANNESS_NATIVE ? 0 : region.bytewidth() - 1) , m_endianness(region.endianness()) , m_prefsize(std::min(region.bytewidth(), 8)) { diff --git a/src/emu/emucore.cpp b/src/emu/emucore.cpp index 84eb5cf11c6..bc6139fe3cf 100644 --- a/src/emu/emucore.cpp +++ b/src/emu/emucore.cpp @@ -13,8 +13,6 @@ #include "emucore.h" #include "osdcore.h" -const char *const endianness_names[2] = { "little", "big" }; - emu_fatalerror::emu_fatalerror(util::format_argument_pack const &args) : emu_fatalerror(0, args) { diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 6c446b812b7..2be0f2f4221 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -37,6 +37,7 @@ #include "osdcomm.h" #include "coretmpl.h" #include "bitmap.h" +#include "endianness.h" #include "strformat.h" #include "vecstream.h" @@ -78,6 +79,21 @@ using util::bitswap; using util::iabs; using util::string_format; +using endianness_t = util::endianness; + +using util::BYTE_XOR_BE; +using util::BYTE_XOR_LE; +using util::BYTE4_XOR_BE; +using util::BYTE4_XOR_LE; +using util::WORD_XOR_BE; +using util::WORD_XOR_LE; +using util::BYTE8_XOR_BE; +using util::BYTE8_XOR_LE; +using util::WORD2_XOR_BE; +using util::WORD2_XOR_LE; +using util::DWORD_XOR_BE; +using util::DWORD_XOR_LE; + // pen_t is used to represent pixel values in bitmaps typedef u32 pen_t; @@ -150,21 +166,9 @@ union PAIR64 // COMMON CONSTANTS //************************************************************************** -// constants for expression endianness -enum endianness_t -{ - ENDIANNESS_LITTLE, - ENDIANNESS_BIG -}; - -extern const char *const endianness_names[2]; - -// declare native endianness to be one or the other -#ifdef LSB_FIRST -const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_LITTLE; -#else -const endianness_t ENDIANNESS_NATIVE = ENDIANNESS_BIG; -#endif +constexpr endianness_t ENDIANNESS_LITTLE = util::endianness::little; +constexpr endianness_t ENDIANNESS_BIG = util::endianness::big; +constexpr endianness_t ENDIANNESS_NATIVE = util::endianness::native; // M_PI is not part of the C/C++ standards and is not present on @@ -264,16 +268,6 @@ template constexpr auto RADIAN_TO_DEGREE(T const &x) { return (180. template constexpr auto DEGREE_TO_RADIAN(T const &x) { return (M_PI / 180.0) * x; } -// endian-based value: first value is if 'endian' is little-endian, second is if 'endian' is big-endian -#define ENDIAN_VALUE_LE_BE(endian,leval,beval) (((endian) == ENDIANNESS_LITTLE) ? (leval) : (beval)) - -// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian -#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ENDIAN_VALUE_LE_BE(ENDIANNESS_NATIVE, leval, beval) - -// endian-based value: first value is if 'endian' matches native, second is if 'endian' doesn't match native -#define ENDIAN_VALUE_NE_NNE(endian,neval,nneval) (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval)) - - //************************************************************************** // EXCEPTION CLASSES //************************************************************************** diff --git a/src/emu/emumem.h b/src/emu/emumem.h index b5deae3dd23..9d56a14ce3c 100644 --- a/src/emu/emumem.h +++ b/src/emu/emumem.h @@ -1567,7 +1567,7 @@ public: fatalerror("Requesting cache() with data width %d while the config says %d\n", 8 << Width, m_config.data_width()); if(Endian != m_config.endianness()) fatalerror("Requesting cache() with endianness %s while the config says %s\n", - endianness_names[Endian], endianness_names[m_config.endianness()]); + util::endian_to_string_view(Endian), util::endian_to_string_view(m_config.endianness())); v.set(this, get_cache_info()); } @@ -1581,7 +1581,7 @@ public: fatalerror("Requesting specific() with data width %d while the config says %d\n", 8 << Width, m_config.data_width()); if(Endian != m_config.endianness()) fatalerror("Requesting spefific() with endianness %s while the config says %s\n", - endianness_names[Endian], endianness_names[m_config.endianness()]); + util::endian_to_string_view(Endian), util::endian_to_string_view(m_config.endianness())); v.set(this, get_specific_info()); } @@ -1966,33 +1966,6 @@ private: #define ACCESSING_BITS_32_63 ((mem_mask & 0xffffffff00000000U) != 0) -// macros for accessing bytes and words within larger chunks - -// read/write a byte to a 16-bit space -#define BYTE_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0)) -#define BYTE_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,1)) - -// read/write a byte to a 32-bit space -#define BYTE4_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(3,0)) -#define BYTE4_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,3)) - -// read/write a word to a 32-bit space -#define WORD_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(2,0)) -#define WORD_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,2)) - -// read/write a byte to a 64-bit space -#define BYTE8_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(7,0)) -#define BYTE8_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,7)) - -// read/write a word to a 64-bit space -#define WORD2_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(6,0)) -#define WORD2_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,6)) - -// read/write a dword to a 64-bit space -#define DWORD_XOR_BE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(4,0)) -#define DWORD_XOR_LE(a) ((a) ^ NATIVE_ENDIAN_VALUE_LE_BE(0,4)) - - // helpers for checking address alignment #define WORD_ALIGNED(a) (((a) & 1) == 0) #define DWORD_ALIGNED(a) (((a) & 3) == 0) diff --git a/src/emu/emumem_mud.cpp b/src/emu/emumem_mud.cpp index 094e6663a04..b8fed565eea 100644 --- a/src/emu/emumem_mud.cpp +++ b/src/emu/emumem_mud.cpp @@ -35,7 +35,7 @@ template<> u8 mask_to_ukey(u64 mask) (mask & 0x00000000000000ff ? 0x01 : 0x00); } -template memory_units_descriptor::memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian) +template memory_units_descriptor::memory_units_descriptor(u8 access_width, endianness_t access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, typename emu::detail::handler_entry_size::uX unitmask, int cswidth) : m_handler(handler), m_access_width(access_width), m_access_endian(access_endian) { u32 bits_per_access = 8 << access_width; constexpr u32 NATIVE_MASK = Width + AddrShift >= 0 ? make_bitmask(Width + AddrShift) : 0; diff --git a/src/emu/emumem_mud.h b/src/emu/emumem_mud.h index 5a95af1a49f..12c8cf92eb5 100644 --- a/src/emu/emumem_mud.h +++ b/src/emu/emumem_mud.h @@ -15,7 +15,7 @@ public: u8 m_offset; }; - memory_units_descriptor(u8 access_width, u8 access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, uX unitmask, int cswidth); + memory_units_descriptor(u8 access_width, endianness_t access_endian, handler_entry *handler, offs_t addrstart, offs_t addrend, offs_t mask, uX unitmask, int cswidth); offs_t get_handler_start() const { return m_handler_start; } offs_t get_handler_mask() const { return m_handler_mask; } @@ -24,7 +24,7 @@ public: const std::vector &get_entries_for_key(u8 key) const { return m_entries_for_key.find(key)->second; } u8 get_subunit_width() const { return m_access_width; } - u8 get_subunit_endian() const { return m_access_endian; } + endianness_t get_subunit_endian() const { return m_access_endian; } void set_subunit_handler(handler_entry *handler) { m_handler = handler; } handler_entry *get_subunit_handler() const { return m_handler; } @@ -35,7 +35,7 @@ private: handler_entry *m_handler; std::array m_keymap; u8 m_access_width; - u8 m_access_endian; + endianness_t m_access_endian; void generate(u8 ukey, uX gumask, uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count); }; diff --git a/src/emu/memarray.cpp b/src/emu/memarray.cpp index 48fde5f90ba..22bfa17b80a 100644 --- a/src/emu/memarray.cpp +++ b/src/emu/memarray.cpp @@ -52,34 +52,34 @@ void memory_array::set(void *base, u32 bytes, int membits, endianness_t endianne m_bytes_per_entry = bpe; // derive data - switch (bpe*1000 + membits*10 + endianness) + switch (bpe*1000 + membits*10 + (endianness == ENDIANNESS_LITTLE ? 0 : 1)) { - case 1*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break; - case 1*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break; - case 1*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_16le; m_write_entry = &memory_array::write8_to_16le; break; - case 1*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_16be; m_write_entry = &memory_array::write8_to_16be; break; - case 1*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_32le; m_write_entry = &memory_array::write8_to_32le; break; - case 1*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_32be; m_write_entry = &memory_array::write8_to_32be; break; - case 1*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_64le; m_write_entry = &memory_array::write8_to_64le; break; - case 1*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_64be; m_write_entry = &memory_array::write8_to_64be; break; - - case 2*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_8le; m_write_entry = &memory_array::write16_to_8le; break; - case 2*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_8be; m_write_entry = &memory_array::write16_to_8be; break; - case 2*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break; - case 2*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break; - case 2*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_32le; m_write_entry = &memory_array::write16_to_32le; break; - case 2*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_32be; m_write_entry = &memory_array::write16_to_32be; break; - case 2*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_64le; m_write_entry = &memory_array::write16_to_64le; break; - case 2*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_64be; m_write_entry = &memory_array::write16_to_64be; break; - - case 4*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_8le; m_write_entry = &memory_array::write32_to_8le; break; - case 4*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_8be; m_write_entry = &memory_array::write32_to_8be; break; - case 4*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_16le; m_write_entry = &memory_array::write32_to_16le; break; - case 4*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_16be; m_write_entry = &memory_array::write32_to_16be; break; - case 4*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break; - case 4*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break; - case 4*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_64le; m_write_entry = &memory_array::write32_to_64le; break; - case 4*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_64be; m_write_entry = &memory_array::write32_to_64be; break; + case 1*1000 + 8*10 + 0: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break; + case 1*1000 + 8*10 + 1: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break; + case 1*1000 + 16*10 + 0: m_read_entry = &memory_array::read8_from_16le; m_write_entry = &memory_array::write8_to_16le; break; + case 1*1000 + 16*10 + 1: m_read_entry = &memory_array::read8_from_16be; m_write_entry = &memory_array::write8_to_16be; break; + case 1*1000 + 32*10 + 0: m_read_entry = &memory_array::read8_from_32le; m_write_entry = &memory_array::write8_to_32le; break; + case 1*1000 + 32*10 + 1: m_read_entry = &memory_array::read8_from_32be; m_write_entry = &memory_array::write8_to_32be; break; + case 1*1000 + 64*10 + 0: m_read_entry = &memory_array::read8_from_64le; m_write_entry = &memory_array::write8_to_64le; break; + case 1*1000 + 64*10 + 1: m_read_entry = &memory_array::read8_from_64be; m_write_entry = &memory_array::write8_to_64be; break; + + case 2*1000 + 8*10 + 0: m_read_entry = &memory_array::read16_from_8le; m_write_entry = &memory_array::write16_to_8le; break; + case 2*1000 + 8*10 + 1: m_read_entry = &memory_array::read16_from_8be; m_write_entry = &memory_array::write16_to_8be; break; + case 2*1000 + 16*10 + 0: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break; + case 2*1000 + 16*10 + 1: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break; + case 2*1000 + 32*10 + 0: m_read_entry = &memory_array::read16_from_32le; m_write_entry = &memory_array::write16_to_32le; break; + case 2*1000 + 32*10 + 1: m_read_entry = &memory_array::read16_from_32be; m_write_entry = &memory_array::write16_to_32be; break; + case 2*1000 + 64*10 + 0: m_read_entry = &memory_array::read16_from_64le; m_write_entry = &memory_array::write16_to_64le; break; + case 2*1000 + 64*10 + 1: m_read_entry = &memory_array::read16_from_64be; m_write_entry = &memory_array::write16_to_64be; break; + + case 4*1000 + 8*10 + 0: m_read_entry = &memory_array::read32_from_8le; m_write_entry = &memory_array::write32_to_8le; break; + case 4*1000 + 8*10 + 1: m_read_entry = &memory_array::read32_from_8be; m_write_entry = &memory_array::write32_to_8be; break; + case 4*1000 + 16*10 + 0: m_read_entry = &memory_array::read32_from_16le; m_write_entry = &memory_array::write32_to_16le; break; + case 4*1000 + 16*10 + 1: m_read_entry = &memory_array::read32_from_16be; m_write_entry = &memory_array::write32_to_16be; break; + case 4*1000 + 32*10 + 0: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break; + case 4*1000 + 32*10 + 1: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break; + case 4*1000 + 64*10 + 0: m_read_entry = &memory_array::read32_from_64le; m_write_entry = &memory_array::write32_to_64le; break; + case 4*1000 + 64*10 + 1: m_read_entry = &memory_array::read32_from_64be; m_write_entry = &memory_array::write32_to_64be; break; default: throw emu_fatalerror("Illegal memory bits/bus width combo in memory_array"); } diff --git a/src/frontend/mame/luaengine_mem.cpp b/src/frontend/mame/luaengine_mem.cpp index 4016ce1d20f..f95ebdb37c2 100644 --- a/src/frontend/mame/luaengine_mem.cpp +++ b/src/frontend/mame/luaengine_mem.cpp @@ -179,17 +179,7 @@ int sol_lua_push(sol::types, lua_State *L, map_handler_type && int sol_lua_push(sol::types, lua_State *L, endianness_t &&value) { - char const *endianness = "unknown"; - switch (value) - { - case endianness_t::ENDIANNESS_BIG: - endianness = "big"; - break; - case endianness_t::ENDIANNESS_LITTLE: - endianness = "little"; - break; - } - return sol::stack::push(L, endianness); + return sol::stack::push(L, util::endian_to_string_view(value)); } diff --git a/src/lib/util/endianness.h b/src/lib/util/endianness.h new file mode 100644 index 00000000000..ec9b226ec5a --- /dev/null +++ b/src/lib/util/endianness.h @@ -0,0 +1,76 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + endianness.h + + Endianness types and utility functions. + +***************************************************************************/ + +#ifndef MAME_LIB_UTIL_ENDIANNESS_H +#define MAME_LIB_UTIL_ENDIANNESS_H + +#pragma once + +#include + + +namespace util { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// constants for expression endianness +enum class endianness +{ + little, + big, +#ifdef LSB_FIRST + native = little +#else + native = big +#endif +}; + + +//************************************************************************** +// MACROS AND INLINE FUNCTIONS +//************************************************************************** + +constexpr std::string_view endian_to_string_view(endianness e) { return e == endianness::little ? "little" : "big"; } + +// endian-based value: first value is if native endianness is little-endian, second is if native is big-endian +#define NATIVE_ENDIAN_VALUE_LE_BE(leval,beval) ((util::endianness::native == util::endianness::little) ? (leval) : (beval)) + + +// inline functions for accessing bytes and words within larger chunks + +// read/write a byte to a 16-bit space +template constexpr T BYTE_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(1,0); } +template constexpr T BYTE_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,1); } + +// read/write a byte to a 32-bit space +template constexpr T BYTE4_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(3,0); } +template constexpr T BYTE4_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,3); } + +// read/write a word to a 32-bit space +template constexpr T WORD_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(2,0); } +template constexpr T WORD_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,2); } + +// read/write a byte to a 64-bit space +template constexpr T BYTE8_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(7,0); } +template constexpr T BYTE8_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,7); } + +// read/write a word to a 64-bit space +template constexpr T WORD2_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(6,0); } +template constexpr T WORD2_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,6); } + +// read/write a dword to a 64-bit space +template constexpr T DWORD_XOR_BE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(4,0); } +template constexpr T DWORD_XOR_LE(T a) { return a ^ NATIVE_ENDIAN_VALUE_LE_BE(0,4); } + +} // namespace util + +#endif // MAME_LIB_UTIL_ENDIANNESS_H diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index 5395bc6ae01..a78816f87c9 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -197,6 +197,7 @@ using util::BIT; #include "corefile.h" #include "corestr.h" #include "eminline.h" +#include "endianness.h" #include #include @@ -334,12 +335,13 @@ struct nec_unidasm_t : nec_disassembler::config } nec_unidasm; -enum endianness { le, be }; +static constexpr auto le = util::endianness::little; +static constexpr auto be = util::endianness::big; struct dasm_table_entry { const char * name; - endianness endian; + util::endianness endian; int8_t pcshift; std::function alloc; }; -- cgit v1.2.3