From 351dfca54b17e13f6063cf995f1ea0746d842d0e Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Sep 2024 21:58:49 +0200 Subject: emumem: add support for passing mem_mask parameter on 8-bit handlers --- src/emu/emumem.h | 16 ++++++++++++++++ src/emu/emumem_aspace.cpp | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/emu/emumem.h b/src/emu/emumem.h index ce55ed86a36..4c483559757 100644 --- a/src/emu/emumem.h +++ b/src/emu/emumem.h @@ -75,6 +75,7 @@ using address_map_constructor = named_delegate; struct data_accessors { u8 (*read_byte)(address_space &space, offs_t address); + u8 (*read_byte_masked)(address_space &space, offs_t address, u8 mask); u16 (*read_word)(address_space &space, offs_t address); u16 (*read_word_masked)(address_space &space, offs_t address, u16 mask); u32 (*read_dword)(address_space &space, offs_t address); @@ -83,6 +84,7 @@ struct data_accessors u64 (*read_qword_masked)(address_space &space, offs_t address, u64 mask); void (*write_byte)(address_space &space, offs_t address, u8 data); + void (*write_byte_masked)(address_space &space, offs_t address, u8 data, u8 mask); void (*write_word)(address_space &space, offs_t address, u16 data); void (*write_word_masked)(address_space &space, offs_t address, u16 data, u16 mask); void (*write_dword)(address_space &space, offs_t address, u32 data); @@ -1731,6 +1733,7 @@ public: auto lwopf() { return [this](offs_t offset, NativeType mask) -> u16 { return lookup_write_native_flags(offset, mask); }; } u8 read_byte(offs_t address) { if constexpr(Width == 0) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xff); } + u8 read_byte(offs_t address, u8 mask) { return memory_read_generic(rop(), address, mask); } u16 read_word(offs_t address) { if constexpr(Width == 1) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xffff); } u16 read_word(offs_t address, u16 mask) { return memory_read_generic(rop(), address, mask); } u16 read_word_unaligned(offs_t address) { return memory_read_generic(rop(), address, 0xffff); } @@ -1745,6 +1748,7 @@ public: u64 read_qword_unaligned(offs_t address, u64 mask) { return memory_read_generic(rop(), address, mask); } void write_byte(offs_t address, u8 data) { if constexpr(Width == 0) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xff); } + void write_byte(offs_t address, u8 data, u8 mask) { memory_write_generic(wop(), address, data, mask); } void write_word(offs_t address, u16 data) { if constexpr(Width == 1) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xffff); } void write_word(offs_t address, u16 data, u16 mask) { memory_write_generic(wop(), address, data, mask); } void write_word_unaligned(offs_t address, u16 data) { memory_write_generic(wop(), address, data, 0xffff); } @@ -1760,6 +1764,7 @@ public: std::pair read_byte_flags(offs_t address) { if constexpr(Width == 0) return read_native_flags(address & ~NATIVE_MASK); else return memory_read_generic_flags(ropf(), address, 0xff); } + std::pair read_byte_flags(offs_t address, u8 mask) { return memory_read_generic_flags(ropf(), address, mask); } std::pair read_word_flags(offs_t address) { if constexpr(Width == 1) return read_native_flags(address & ~NATIVE_MASK); else return memory_read_generic_flags(ropf(), address, 0xffff); } std::pair read_word_flags(offs_t address, u16 mask) { return memory_read_generic_flags(ropf(), address, mask); } std::pair read_word_unaligned_flags(offs_t address) { return memory_read_generic_flags(ropf(), address, 0xffff); } @@ -1774,6 +1779,7 @@ public: std::pair read_qword_unaligned_flags(offs_t address, u64 mask) { return memory_read_generic_flags(ropf(), address, mask); } u16 write_byte_flags(offs_t address, u8 data) { if constexpr(Width == 0) return write_native_flags(address & ~NATIVE_MASK, data); else return memory_write_generic_flags(wopf(), address, data, 0xff); } + u16 write_byte_flags(offs_t address, u8 data, u8 mask) { return memory_write_generic_flags(wopf(), address, data, mask); } u16 write_word_flags(offs_t address, u16 data) { if constexpr(Width == 1) return write_native_flags(address & ~NATIVE_MASK, data); else return memory_write_generic_flags(wopf(), address, data, 0xffff); } u16 write_word_flags(offs_t address, u16 data, u16 mask) { return memory_write_generic_flags(wopf(), address, data, mask); } u16 write_word_unaligned_flags(offs_t address, u16 data) { return memory_write_generic_flags(wopf(), address, data, 0xffff); } @@ -1788,6 +1794,7 @@ public: u16 write_qword_unaligned_flags(offs_t address, u64 data, u64 mask) { return memory_write_generic_flags(wopf(), address, data, mask); } u16 lookup_read_byte_flags(offs_t address) { if constexpr(Width == 0) return lookup_read_native_flags(address & ~NATIVE_MASK); else return lookup_memory_read_generic_flags(lropf(), address, 0xff); } + u16 lookup_read_byte_flags(offs_t address, u8 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_read_word_flags(offs_t address) { if constexpr(Width == 1) return lookup_read_native_flags(address & ~NATIVE_MASK); else return lookup_memory_read_generic_flags(lropf(), address, 0xffff); } u16 lookup_read_word_flags(offs_t address, u16 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_read_word_unaligned_flags(offs_t address) { return lookup_memory_read_generic_flags(lropf(), address, 0xffff); } @@ -1802,6 +1809,7 @@ public: u16 lookup_read_qword_unaligned_flags(offs_t address, u64 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_write_byte_flags(offs_t address) { if constexpr(Width == 0) return lookup_write_native_flags(address & ~NATIVE_MASK); else return lookup_memory_write_generic_flags(lwopf(), address, 0xff); } + u16 lookup_write_byte_flags(offs_t address, u8 mask) { return lookup_memory_write_generic_flags(lwopf(), address, mask); } u16 lookup_write_word_flags(offs_t address) { if constexpr(Width == 1) return lookup_write_native_flags(address & ~NATIVE_MASK); else return lookup_memory_write_generic_flags(lwopf(), address, 0xffff); } u16 lookup_write_word_flags(offs_t address, u16 mask) { return lookup_memory_write_generic_flags(lwopf(), address, mask); } u16 lookup_write_word_unaligned_flags(offs_t address) { return lookup_memory_write_generic_flags(lwopf(), address, 0xffff); } @@ -1922,6 +1930,7 @@ public: auto lwopf() { return [this](offs_t offset, NativeType mask) -> u16 { return lookup_write_native_flags(offset, mask); }; } u8 read_byte(offs_t address) { if constexpr(Width == 0) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xff); } + u8 read_byte(offs_t address, u8 mask) { return memory_read_generic(rop(), address, mask); } u16 read_word(offs_t address) { if constexpr(Width == 1) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xffff); } u16 read_word(offs_t address, u16 mask) { return memory_read_generic(rop(), address, mask); } u16 read_word_unaligned(offs_t address) { return memory_read_generic(rop(), address, 0xffff); } @@ -1936,6 +1945,7 @@ public: u64 read_qword_unaligned(offs_t address, u64 mask) { return memory_read_generic(rop(), address, mask); } void write_byte(offs_t address, u8 data) { if constexpr(Width == 0) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xff); } + void write_byte(offs_t address, u8 data, u8 mask) { memory_write_generic(wop(), address, data, mask); } void write_word(offs_t address, u16 data) { if constexpr(Width == 1) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xffff); } void write_word(offs_t address, u16 data, u16 mask) { memory_write_generic(wop(), address, data, mask); } void write_word_unaligned(offs_t address, u16 data) { memory_write_generic(wop(), address, data, 0xffff); } @@ -1951,6 +1961,7 @@ public: std::pair read_byte_flags(offs_t address) { if constexpr(Width == 0) return read_native_flags(address & ~NATIVE_MASK); else return memory_read_generic_flags(ropf(), address, 0xff); } + std::pair read_byte_flags(offs_t address, u8 mask) { return memory_read_generic_flags(ropf(), address, mask); } std::pair read_word_flags(offs_t address) { if constexpr(Width == 1) return read_native_flags(address & ~NATIVE_MASK); else return memory_read_generic_flags(ropf(), address, 0xffff); } std::pair read_word_flags(offs_t address, u16 mask) { return memory_read_generic_flags(ropf(), address, mask); } std::pair read_word_unaligned_flags(offs_t address) { return memory_read_generic_flags(ropf(), address, 0xffff); } @@ -1965,6 +1976,7 @@ public: std::pair read_qword_unaligned_flags(offs_t address, u64 mask) { return memory_read_generic_flags(ropf(), address, mask); } u16 write_byte_flags(offs_t address, u8 data) { if constexpr(Width == 0) return write_native_flags(address & ~NATIVE_MASK, data); else return memory_write_generic_flags(wopf(), address, data, 0xff); } + u16 write_byte_flags(offs_t address, u8 data, u8 mask) { return memory_write_generic_flags(wopf(), address, data, mask); } u16 write_word_flags(offs_t address, u16 data) { if constexpr(Width == 1) return write_native_flags(address & ~NATIVE_MASK, data); else return memory_write_generic_flags(wopf(), address, data, 0xffff); } u16 write_word_flags(offs_t address, u16 data, u16 mask) { return memory_write_generic_flags(wopf(), address, data, mask); } u16 write_word_unaligned_flags(offs_t address, u16 data) { return memory_write_generic_flags(wopf(), address, data, 0xffff); } @@ -1980,6 +1992,7 @@ public: u16 lookup_read_byte_flags(offs_t address) { if constexpr(Width == 0) return lookup_read_native_flags(address & ~NATIVE_MASK); else return lookup_memory_read_generic_flags(lropf(), address, 0xff); } + u16 lookup_read_byte_flags(offs_t address, u8 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_read_word_flags(offs_t address) { if constexpr(Width == 1) return lookup_read_native_flags(address & ~NATIVE_MASK); else return lookup_memory_read_generic_flags(lropf(), address, 0xffff); } u16 lookup_read_word_flags(offs_t address, u16 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_read_word_unaligned_flags(offs_t address) { return lookup_memory_read_generic_flags(lropf(), address, 0xffff); } @@ -1994,6 +2007,7 @@ public: u16 lookup_read_qword_unaligned_flags(offs_t address, u64 mask) { return lookup_memory_read_generic_flags(lropf(), address, mask); } u16 lookup_write_byte_flags(offs_t address) { if constexpr(Width == 0) return lookup_write_native_flags(address & ~NATIVE_MASK); else return lookup_memory_write_generic_flags(lwopf(), address, 0xff); } + u16 lookup_write_byte_flags(offs_t address, u8 mask) { return lookup_memory_write_generic_flags(lwopf(), address, mask); } u16 lookup_write_word_flags(offs_t address) { if constexpr(Width == 1) return lookup_write_native_flags(address & ~NATIVE_MASK); else return lookup_memory_write_generic_flags(lwopf(), address, 0xffff); } u16 lookup_write_word_flags(offs_t address, u16 mask) { return lookup_memory_write_generic_flags(lwopf(), address, mask); } u16 lookup_write_word_unaligned_flags(offs_t address) { return lookup_memory_write_generic_flags(lwopf(), address, 0xffff); } @@ -2412,6 +2426,7 @@ public: // read accessors virtual u8 read_byte(offs_t address) = 0; + virtual u8 read_byte(offs_t address, u8 mask) = 0; virtual u16 read_word(offs_t address) = 0; virtual u16 read_word(offs_t address, u16 mask) = 0; virtual u16 read_word_unaligned(offs_t address) = 0; @@ -2427,6 +2442,7 @@ public: // write accessors virtual void write_byte(offs_t address, u8 data) = 0; + virtual void write_byte(offs_t address, u8 data, u8 mask) = 0; virtual void write_word(offs_t address, u16 data) = 0; virtual void write_word(offs_t address, u16 data, u16 mask) = 0; virtual void write_word_unaligned(offs_t address, u16 data) = 0; diff --git a/src/emu/emumem_aspace.cpp b/src/emu/emumem_aspace.cpp index b0d00d6fca8..656cec8d7d9 100644 --- a/src/emu/emumem_aspace.cpp +++ b/src/emu/emumem_aspace.cpp @@ -314,6 +314,7 @@ public: virtual void accessors(data_accessors &accessors) const override { accessors.read_byte = reinterpret_cast(&read_byte_static); + accessors.read_byte_masked = reinterpret_cast(&read_byte_masked_static); accessors.read_word = reinterpret_cast(&read_word_static); accessors.read_word_masked = reinterpret_cast(&read_word_masked_static); accessors.read_dword = reinterpret_cast(&read_dword_static); @@ -321,6 +322,7 @@ public: accessors.read_qword = reinterpret_cast(&read_qword_static); accessors.read_qword_masked = reinterpret_cast(&read_qword_masked_static); accessors.write_byte = reinterpret_cast(&write_byte_static); + accessors.write_byte_masked = reinterpret_cast(&write_byte_masked_static); accessors.write_word = reinterpret_cast(&write_word_static); accessors.write_word_masked = reinterpret_cast(&write_word_masked_static); accessors.write_dword = reinterpret_cast(&write_dword_static); @@ -370,6 +372,7 @@ public: // virtual access to these functions u8 read_byte(offs_t address) override { if constexpr(Width == 0) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xff); } + u8 read_byte(offs_t address, u8 mask) override { return memory_read_generic(rop(), address, mask); } u16 read_word(offs_t address) override { if constexpr(Width == 1) return read_native(address & ~NATIVE_MASK); else return memory_read_generic(rop(), address, 0xffff); } u16 read_word(offs_t address, u16 mask) override { return memory_read_generic(rop(), address, mask); } u16 read_word_unaligned(offs_t address) override { return memory_read_generic(rop(), address, 0xffff); } @@ -384,6 +387,7 @@ public: u64 read_qword_unaligned(offs_t address, u64 mask) override { return memory_read_generic(rop(), address, mask); } void write_byte(offs_t address, u8 data) override { if constexpr(Width == 0) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xff); } + void write_byte(offs_t address, u8 data, u8 mask) override { memory_write_generic(wop(), address, data, mask); } void write_word(offs_t address, u16 data) override { if constexpr(Width == 1) write_native(address & ~NATIVE_MASK, data); else memory_write_generic(wop(), address, data, 0xffff); } void write_word(offs_t address, u16 data, u16 mask) override { memory_write_generic(wop(), address, data, mask); } void write_word_unaligned(offs_t address, u16 data) override { memory_write_generic(wop(), address, data, 0xffff); } @@ -397,9 +401,9 @@ public: void write_qword_unaligned(offs_t address, u64 data) override { memory_write_generic(wop(), address, data, 0xffffffffffffffffU); } void write_qword_unaligned(offs_t address, u64 data, u64 mask) override { memory_write_generic(wop(), address, data, mask); } - // static access to these functions static u8 read_byte_static(this_type &space, offs_t address) { return Width == 0 ? space.read_native(address & ~NATIVE_MASK) : memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, 0xff); } + static u8 read_byte_masked_static(this_type &space, offs_t address, u8 mask) { return memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, mask); } static u16 read_word_static(this_type &space, offs_t address) { return Width == 1 ? space.read_native(address & ~NATIVE_MASK) : memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, 0xffff); } static u16 read_word_masked_static(this_type &space, offs_t address, u16 mask) { return memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, mask); } static u32 read_dword_static(this_type &space, offs_t address) { return Width == 2 ? space.read_native(address & ~NATIVE_MASK) : memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, 0xffffffff); } @@ -407,6 +411,7 @@ public: static u64 read_qword_static(this_type &space, offs_t address) { return Width == 3 ? space.read_native(address & ~NATIVE_MASK) : memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, 0xffffffffffffffffU); } static u64 read_qword_masked_static(this_type &space, offs_t address, u64 mask) { return memory_read_generic([&space](offs_t offset, NativeType mask) -> NativeType { return space.read_native(offset, mask); }, address, mask); } static void write_byte_static(this_type &space, offs_t address, u8 data) { if (Width == 0) space.write_native(address & ~NATIVE_MASK, data); else memory_write_generic([&space](offs_t offset, NativeType data, NativeType mask) { space.write_native(offset, data, mask); }, address, data, 0xff); } + static void write_byte_masked_static(this_type &space, offs_t address, u8 data, u8 mask) { memory_write_generic([&space](offs_t offset, NativeType data, NativeType mask) { space.write_native(offset, data, mask); }, address, data, mask); } static void write_word_static(this_type &space, offs_t address, u16 data) { if (Width == 1) space.write_native(address & ~NATIVE_MASK, data); else memory_write_generic([&space](offs_t offset, NativeType data, NativeType mask) { space.write_native(offset, data, mask); }, address, data, 0xffff); } static void write_word_masked_static(this_type &space, offs_t address, u16 data, u16 mask) { memory_write_generic([&space](offs_t offset, NativeType data, NativeType mask) { space.write_native(offset, data, mask); }, address, data, mask); } static void write_dword_static(this_type &space, offs_t address, u32 data) { if (Width == 2) space.write_native(address & ~NATIVE_MASK, data); else memory_write_generic([&space](offs_t offset, NativeType data, NativeType mask) { space.write_native(offset, data, mask); }, address, data, 0xffffffff); } -- cgit v1.2.3