summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2008-04-19 19:09:24 +0000
committer Aaron Giles <aaron@aarongiles.com>2008-04-19 19:09:24 +0000
commit9dd3f691ba252c9bc1653a7efdada7041ec609c1 (patch)
tree1b0537929df97cd3782c328a42d672034f49dd12
parent446e65fb98772f68ff762d321d7187a238069524 (diff)
Expanded the set of memory accessor functions. In addition to
direct byte, word, dword, and qword accessors for all bus sizes, there are now masked word, dword, and qword accessors for all bus sizes. IMPORTANT: masks that are passed to the _masked_* functions are NOT inverted. Although inverted masks are still passed to callback functions, when you request a masked read or write the masks should represent the bits you want. Updated the various MIPS cores that use these functions to invert their masks.
-rw-r--r--src/emu/cpu/mips/mdrc64.c72
-rw-r--r--src/emu/cpu/mips/mdrcold.c32
-rw-r--r--src/emu/cpu/mips/mips3.c32
-rw-r--r--src/emu/cpu/mips/mips3com.c70
-rw-r--r--src/emu/cpu/mips/psx.c26
-rw-r--r--src/emu/memory.c1003
-rw-r--r--src/emu/memory.h170
7 files changed, 1102 insertions, 303 deletions
diff --git a/src/emu/cpu/mips/mdrc64.c b/src/emu/cpu/mips/mdrc64.c
index 0340e476e05..52afd04f269 100644
--- a/src/emu/cpu/mips/mdrc64.c
+++ b/src/emu/cpu/mips/mdrc64.c
@@ -1538,12 +1538,12 @@ static void append_direct_ram_write(drc_core *drc, int size, UINT8 flags, void *
else
{
emit_mov_r32_r32(DRCTOP, REG_P4, REG_P3); // mov p4,p3
+ emit_not_r32(DRCTOP, REG_P3); // not p3
+ emit_and_r32_r32(DRCTOP, REG_P4, REG_P2); // and p4,p2
if (raxrel)
emit_and_r32_m32(DRCTOP, REG_P3, MBISD(REG_RAX, REG_P1, 1, 0)); // and p3,[p1 + rax]
else
emit_and_r32_m32(DRCTOP, REG_P3, MDRCISD(adjbase, REG_P1, 1, 0)); // and p3,[p1 + adjbase]
- emit_not_r32(DRCTOP, REG_P4); // not p4
- emit_and_r32_r32(DRCTOP, REG_P4, REG_P2); // and p4,p2
emit_or_r32_r32(DRCTOP, REG_P4, REG_P3); // or p4,p3
if (raxrel)
emit_mov_m32_r32(DRCTOP, MBISD(REG_RAX, REG_P1, 1, 0), REG_P4); // mov [p1 + rax],p4
@@ -1574,12 +1574,12 @@ static void append_direct_ram_write(drc_core *drc, int size, UINT8 flags, void *
if (mips3.core->bigendian)
emit_ror_r64_imm(DRCTOP, REG_P3, 32); // ror p3,32
emit_mov_r64_r64(DRCTOP, REG_P4, REG_P3); // mov p4,p3
+ emit_not_r64(DRCTOP, REG_P3); // not p3
+ emit_and_r64_r64(DRCTOP, REG_P4, REG_P2); // and p4,p2
if (raxrel)
emit_and_r64_m64(DRCTOP, REG_P3, MBISD(REG_RAX, REG_P1, 1, 0)); // and p3,[p1 + rax]
else
emit_and_r64_m64(DRCTOP, REG_P3, MDRCISD(adjbase, REG_P1, 1, 0)); // and p3,[p1 + adjbase]
- emit_not_r64(DRCTOP, REG_P4); // not p4
- emit_and_r64_r64(DRCTOP, REG_P4, REG_P2); // and p4,p2
emit_or_r64_r64(DRCTOP, REG_P4, REG_P3); // or p4,p3
if (raxrel)
emit_mov_m64_r64(DRCTOP, MBISD(REG_RAX, REG_P1, 1, 0), REG_P4); // mov [p1 + rax],p4
@@ -2130,7 +2130,7 @@ static int emit_fixed_word_read(drc_core *drc, compiler_state *compiler, const o
if (fastram == NULL)
{
emit_mov_r32_imm(DRCTOP, REG_P1, address & ~3); // mov p1,address & ~3
- if (mask != 0)
+ if (mask != 0xffffffff)
{
emit_mov_r32_imm(DRCTOP, REG_P2, (INT32)mask); // mov p2,mask
emit_call(DRCTOP, mips3.drcdata->general.read_word_masked); // call read_word_masked
@@ -2187,7 +2187,7 @@ static int emit_fixed_double_read(drc_core *drc, compiler_state *compiler, const
if (fastram == NULL)
{
emit_mov_r32_imm(DRCTOP, REG_P1, address & ~7); // mov p1,address & ~7
- if (mask != 0)
+ if (mask != U64(0xffffffffffffffff))
{
emit_mov_r64_imm(DRCTOP, REG_P2, mask); // mov p2,mask
emit_call(DRCTOP, mips3.drcdata->general.read_double_masked); // call read_double_masked
@@ -2351,7 +2351,7 @@ static int emit_fixed_word_write(drc_core *drc, compiler_state *compiler, const
emit_mov_r64_imm(DRCTOP, REG_P2, CONSTVAL(srcreg)); // mov p2,constval
else if (X86REG(srcreg) != REG_P2)
emit_mov_r64_r64(DRCTOP, REG_P2, X86REG(srcreg)); // mov p2,srcreg
- if (mask == 0)
+ if (mask == 0xffffffff)
emit_call(DRCTOP, mips3.drcdata->general.write_word); // call write_word
else
{
@@ -2370,7 +2370,7 @@ static int emit_fixed_word_write(drc_core *drc, compiler_state *compiler, const
int raxrel = ((INT32)fastdisp != fastdisp);
/* non-masked case */
- if (mask == 0)
+ if (mask == 0xffffffff)
{
/* if we can't fit the delta to fastram within an INT32, load RAX with the full address here */
if (raxrel)
@@ -2404,8 +2404,8 @@ static int emit_fixed_word_write(drc_core *drc, compiler_state *compiler, const
if (ISCONST(srcreg))
{
emit_mov_r32_m32(DRCTOP, REG_P2, MBD(REG_RAX, 0)); // mov p2,[rax]
- emit_and_r32_imm(DRCTOP, REG_P2, mask); // and p2,mask
- emit_or_r32_imm(DRCTOP, REG_P2, CONSTVAL(srcreg) & ~mask); // or p2,constval & ~mask
+ emit_and_r32_imm(DRCTOP, REG_P2, ~mask); // and p2,~mask
+ emit_or_r32_imm(DRCTOP, REG_P2, CONSTVAL(srcreg) & mask); // or p2,constval & mask
emit_mov_m32_r32(DRCTOP, MBD(REG_RAX, 0), REG_P2); // mov [rax],p2
}
else
@@ -2413,8 +2413,8 @@ static int emit_fixed_word_write(drc_core *drc, compiler_state *compiler, const
emit_mov_r32_m32(DRCTOP, REG_P3, MBD(REG_RAX, 0)); // mov p3,[rax]
if (X86REG(srcreg) != REG_P2)
emit_mov_r32_r32(DRCTOP, REG_P2, X86REG(srcreg)); // mov p2,srcreg
- emit_and_r32_imm(DRCTOP, REG_P3, mask); // and p3,mask
- emit_and_r32_imm(DRCTOP, REG_P2, ~mask); // and p2,~mask
+ emit_and_r32_imm(DRCTOP, REG_P3, ~mask); // and p3,~mask
+ emit_and_r32_imm(DRCTOP, REG_P2, mask); // and p2,mask
emit_or_r32_r32(DRCTOP, REG_P3, REG_P2); // or p3,p2
emit_mov_m32_r32(DRCTOP, MBD(REG_RAX, 0), REG_P3); // mov [rax],p3
}
@@ -2444,7 +2444,7 @@ static int emit_fixed_double_write(drc_core *drc, compiler_state *compiler, cons
emit_mov_r64_imm(DRCTOP, REG_P2, CONSTVAL(srcreg)); // mov p2,constval
else if (X86REG(srcreg) != REG_P2)
emit_mov_r64_r64(DRCTOP, REG_P2, X86REG(srcreg)); // mov p2,srcreg
- if (mask == 0)
+ if (mask == U64(0xffffffffffffffff))
emit_call(DRCTOP, mips3.drcdata->general.write_double); // call write_double
else
{
@@ -2478,7 +2478,7 @@ static int emit_fixed_double_write(drc_core *drc, compiler_state *compiler, cons
}
/* non-masked case */
- if (mask == 0)
+ if (mask == U64(0xffffffffffffffff))
{
/* if we can't fit the delta to fastram within an INT32, load RAX with the full address here */
if (raxrel)
@@ -2507,13 +2507,13 @@ static int emit_fixed_double_write(drc_core *drc, compiler_state *compiler, cons
emit_mov_r64_imm(DRCTOP, REG_RAX, (UINT64)fastram); // mov rax,fastram
else
emit_lea_r64_m64(DRCTOP, REG_RAX, MDRC(fastram)); // lea rax,[fastram]
- emit_mov_r64_imm(DRCTOP, REG_P4, mask); // mov p4,mask
+ emit_mov_r64_imm(DRCTOP, REG_P4, ~mask); // mov p4,~mask
/* always write rax-relative */
if (ISCONST(srcreg))
{
emit_and_r64_m64(DRCTOP, REG_P4, MBD(REG_RAX, 0)); // and p4,[rax]
- emit_mov_r64_imm(DRCTOP, REG_P3, constval & ~mask); // mov p3,constval & ~mask
+ emit_mov_r64_imm(DRCTOP, REG_P3, constval & mask); // mov p3,constval & mask
emit_or_r64_r64(DRCTOP, REG_P4, REG_P3); // or p4,p3
emit_mov_m64_r64(DRCTOP, MBD(REG_RAX, 0), REG_P4); // mov [rax],p4
}
@@ -5013,9 +5013,9 @@ static int compile_load(drc_core *drc, compiler_state *compiler, const opcode_de
else if (size == 2)
was_fixed = emit_fixed_half_read(drc, compiler, desc, destreg, is_unsigned, CONSTVAL(rs) + SIMMVAL);
else if (size == 4)
- was_fixed = emit_fixed_word_read(drc, compiler, desc, destreg, is_unsigned, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_word_read(drc, compiler, desc, destreg, is_unsigned, CONSTVAL(rs) + SIMMVAL, 0xffffffff);
else
- was_fixed = emit_fixed_double_read(drc, compiler, desc, destreg, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_double_read(drc, compiler, desc, destreg, CONSTVAL(rs) + SIMMVAL, U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5078,9 +5078,9 @@ static int compile_load_cop(drc_core *drc, compiler_state *compiler, const opcod
{
/* perform a fixed read if we can */
if (size == 4)
- was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, CONSTVAL(rs) + SIMMVAL, 0xffffffff);
else
- was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, CONSTVAL(rs) + SIMMVAL, U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5133,9 +5133,9 @@ static int compile_loadx_cop(drc_core *drc, compiler_state *compiler, const opco
{
/* perform a fixed read if we can */
if (size == 4)
- was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, CONSTVAL(rs) + CONSTVAL(rt), 0);
+ was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, CONSTVAL(rs) + CONSTVAL(rt), 0xffffffff);
else
- was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, CONSTVAL(rs) + CONSTVAL(rt), 0);
+ was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, CONSTVAL(rs) + CONSTVAL(rt), U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5198,7 +5198,7 @@ static int compile_load_word_partial(drc_core *drc, compiler_state *compiler, co
shift ^= 0x18;
/* read the double value into rax, handling exceptions */
- was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, addr, is_right ? (~((UINT32)-1 << shift)) : (~((UINT32)-1 >> shift)));
+ was_fixed = emit_fixed_word_read(drc, compiler, desc, REG_RAX, FALSE, addr, is_right ? ((UINT32)-1 << shift) : ((UINT32)-1 >> shift));
/* handle writing back the register */
if (RTREG != 0)
@@ -5236,7 +5236,6 @@ static int compile_load_word_partial(drc_core *drc, compiler_state *compiler, co
else
emit_shl_r32_cl(DRCTOP, REG_P2); // shl p2,cl
emit_mov_m8_r8(DRCTOP, MBD(REG_RSP, SPOFFS_SAVECL), REG_CL); // mov [sp+savecl],cl
- emit_not_r32(DRCTOP, REG_P2); // not p2
emit_mov_r32_r32(DRCTOP, REG_P1, REG_EAX); // mov p1,eax
emit_call(DRCTOP, mips3.drcdata->general.read_word_masked); // call general.read_word_masked
oob_request_callback(drc, COND_NO_JUMP, oob_exception_cleanup, compiler, desc, mips3.drcdata->generate_tlbload_exception);
@@ -5300,7 +5299,7 @@ static int compile_load_double_partial(drc_core *drc, compiler_state *compiler,
shift ^= 0x38;
/* read the double value into rax, handling exceptions */
- was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, addr, is_right ? (~((UINT64)-1 << shift)) : (~((UINT64)-1 >> shift)));
+ was_fixed = emit_fixed_double_read(drc, compiler, desc, REG_RAX, addr, is_right ? ((UINT64)-1 << shift) : ((UINT64)-1 >> shift));
/* handle writing back the register */
if (RTREG != 0)
@@ -5343,7 +5342,6 @@ static int compile_load_double_partial(drc_core *drc, compiler_state *compiler,
else
emit_shl_r64_cl(DRCTOP, REG_P2); // shl p2,cl
emit_mov_m8_r8(DRCTOP, MBD(REG_RSP, SPOFFS_SAVECL), REG_CL); // mov [sp+savecl],cl
- emit_not_r64(DRCTOP, REG_P2); // not p2
emit_mov_r32_r32(DRCTOP, REG_P1, REG_EAX); // mov p1,eax
emit_call(DRCTOP, mips3.drcdata->general.read_double_masked); // call general.read_double_masked
oob_request_callback(drc, COND_NO_JUMP, oob_exception_cleanup, compiler, desc, mips3.drcdata->generate_tlbload_exception);
@@ -5406,9 +5404,9 @@ static int compile_store(drc_core *drc, compiler_state *compiler, const opcode_d
else if (size == 2)
was_fixed = emit_fixed_half_write(drc, compiler, desc, rt, CONSTVAL(rs) + SIMMVAL);
else if (size == 4)
- was_fixed = emit_fixed_word_write(drc, compiler, desc, rt, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_word_write(drc, compiler, desc, rt, CONSTVAL(rs) + SIMMVAL, 0xffffffff);
else
- was_fixed = emit_fixed_double_write(drc, compiler, desc, rt, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_double_write(drc, compiler, desc, rt, CONSTVAL(rs) + SIMMVAL, U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5467,9 +5465,9 @@ static int compile_store_cop(drc_core *drc, compiler_state *compiler, const opco
{
/* perform a fixed write if we can */
if (size == 4)
- was_fixed = emit_fixed_word_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_word_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + SIMMVAL, 0xffffffff);
else
- was_fixed = emit_fixed_double_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + SIMMVAL, 0);
+ was_fixed = emit_fixed_double_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + SIMMVAL, U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5522,9 +5520,9 @@ static int compile_storex_cop(drc_core *drc, compiler_state *compiler, const opc
{
/* perform a fixed write if we can */
if (size == 4)
- was_fixed = emit_fixed_word_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + CONSTVAL(rt), 0);
+ was_fixed = emit_fixed_word_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + CONSTVAL(rt), 0xffffffff);
else
- was_fixed = emit_fixed_double_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + CONSTVAL(rt), 0);
+ was_fixed = emit_fixed_double_write(drc, compiler, desc, REG_P2, CONSTVAL(rs) + CONSTVAL(rt), U64(0xffffffffffffffff));
}
/* otherwise, we just need to call the appropriate subroutine */
@@ -5594,13 +5592,13 @@ static int compile_store_word_partial(drc_core *drc, compiler_state *compiler, c
{
if (ISCONST(rt))
rt = MAKE_CONST((UINT32)CONSTVAL(rt) >> shift);
- mask = ~((UINT64)-1 >> shift);
+ mask = (UINT32)-1 >> shift;
}
else
{
if (ISCONST(rt))
rt = MAKE_CONST((UINT32)CONSTVAL(rt) << shift);
- mask = ~((UINT64)-1 << shift);
+ mask = (UINT32)-1 << shift;
}
/* perform a fixed write */
@@ -5629,7 +5627,6 @@ static int compile_store_word_partial(drc_core *drc, compiler_state *compiler, c
emit_shl_r32_cl(DRCTOP, REG_P2); // shl p2,cl
}
emit_mov_r32_r32(DRCTOP, REG_P1, REG_EAX); // mov p1,eax
- emit_not_r32(DRCTOP, REG_P3); // not p3
/* perform the write */
emit_call(DRCTOP, mips3.drcdata->general.write_word_masked); // call general.write_word_masked
@@ -5685,13 +5682,13 @@ static int compile_store_double_partial(drc_core *drc, compiler_state *compiler,
{
if (ISCONST(rt))
rt = MAKE_CONST((UINT64)CONSTVAL(rt) >> shift);
- mask = ~((UINT64)-1 >> shift);
+ mask = (UINT64)-1 >> shift;
}
else
{
if (ISCONST(rt))
rt = MAKE_CONST((UINT64)CONSTVAL(rt) << shift);
- mask = ~((UINT64)-1 << shift);
+ mask = (UINT64)-1 << shift;
}
/* perform a fixed write */
@@ -5720,7 +5717,6 @@ static int compile_store_double_partial(drc_core *drc, compiler_state *compiler,
emit_shl_r64_cl(DRCTOP, REG_P2); // shl p2,cl
}
emit_mov_r32_r32(DRCTOP, REG_P1, REG_EAX); // mov p1,eax
- emit_not_r64(DRCTOP, REG_P3); // not p3
/* perform the write */
emit_call(DRCTOP, mips3.drcdata->general.write_double_masked); // call general.write_double_masked
diff --git a/src/emu/cpu/mips/mdrcold.c b/src/emu/cpu/mips/mdrcold.c
index 69c842af28b..e00aa1eece8 100644
--- a/src/emu/cpu/mips/mdrcold.c
+++ b/src/emu/cpu/mips/mdrcold.c
@@ -725,9 +725,9 @@ static void append_readwrite_and_translate(drc_core *drc, int size, UINT8 flags)
{
emit_mov_r32_m32(DRCTOP, REG_ECX, MBD(REG_ESP, 12)); // mov ecx,[esp+12]
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_ECX); // mov eax,ecx
- emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
- emit_not_r32(DRCTOP, REG_EAX); // not eax
+ emit_not_r32(DRCTOP, REG_ECX); // not ecx
emit_and_r32_m32(DRCTOP, REG_EAX, MBD(REG_ESP, 8)); // and eax,[esp+8]
+ emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
emit_or_r32_r32(DRCTOP, REG_EAX, REG_ECX); // or eax,ecx
emit_mov_m32_r32(DRCTOP, MBD(REG_EBX, fastbase), REG_EAX); // mov [ebx+fastbase],eax
}
@@ -757,16 +757,16 @@ static void append_readwrite_and_translate(drc_core *drc, int size, UINT8 flags)
{
emit_mov_r32_m32(DRCTOP, REG_ECX, MBD(REG_ESP, 16)); // mov ecx,[esp+16]
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_ECX); // mov eax,ecx
- emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase+4)); // and ecx,[ebx+fastbase+4]
- emit_not_r32(DRCTOP, REG_EAX); // not eax
+ emit_not_r32(DRCTOP, REG_ECX); // not ecx
emit_and_r32_m32(DRCTOP, REG_EAX, MBD(REG_ESP, 8)); // and eax,[esp+8]
+ emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase+4)); // and ecx,[ebx+fastbase+4]
emit_or_r32_r32(DRCTOP, REG_EAX, REG_ECX); // or eax,ecx
emit_mov_m32_r32(DRCTOP, MBD(REG_EBX, fastbase+4), REG_EAX); // mov [ebx+fastbase+4],eax
emit_mov_r32_m32(DRCTOP, REG_ECX, MBD(REG_ESP, 20)); // mov ecx,[esp+20]
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_ECX); // mov eax,ecx
- emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
- emit_not_r32(DRCTOP, REG_EAX); // not eax
+ emit_not_r32(DRCTOP, REG_ECX); // not ecx
emit_and_r32_m32(DRCTOP, REG_EAX, MBD(REG_ESP, 12)); // and eax,[esp+12]
+ emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
emit_or_r32_r32(DRCTOP, REG_EAX, REG_ECX); // or eax,ecx
emit_mov_m32_r32(DRCTOP, MBD(REG_EBX, fastbase), REG_EAX); // mov [ebx+fastbase],eax
}
@@ -774,16 +774,16 @@ static void append_readwrite_and_translate(drc_core *drc, int size, UINT8 flags)
{
emit_mov_r32_m32(DRCTOP, REG_ECX, MBD(REG_ESP, 16)); // mov ecx,[esp+16]
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_ECX); // mov eax,ecx
- emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
- emit_not_r32(DRCTOP, REG_EAX); // not eax
+ emit_not_r32(DRCTOP, REG_ECX); // not ecx
emit_and_r32_m32(DRCTOP, REG_EAX, MBD(REG_ESP, 8)); // and eax,[esp+8]
+ emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase)); // and ecx,[ebx+fastbase]
emit_or_r32_r32(DRCTOP, REG_EAX, REG_ECX); // or eax,ecx
emit_mov_m32_r32(DRCTOP, MBD(REG_EBX, fastbase), REG_EAX); // mov [ebx+fastbase],eax
emit_mov_r32_m32(DRCTOP, REG_ECX, MBD(REG_ESP, 20)); // mov ecx,[esp+20]
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_ECX); // mov eax,ecx
- emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase+4)); // and ecx,[ebx+fastbase+4]
- emit_not_r32(DRCTOP, REG_EAX); // not eax
+ emit_not_r32(DRCTOP, REG_ECX); // not ecx
emit_and_r32_m32(DRCTOP, REG_EAX, MBD(REG_ESP, 12)); // and eax,[esp+12]
+ emit_and_r32_m32(DRCTOP, REG_ECX, MBD(REG_EBX, fastbase+4)); // and ecx,[ebx+fastbase+4]
emit_or_r32_r32(DRCTOP, REG_EAX, REG_ECX); // or eax,ecx
emit_mov_m32_r32(DRCTOP, MBD(REG_EBX, fastbase+4), REG_EAX); // mov [ebx+fastbase+4],eax
}
@@ -1474,8 +1474,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
emit_shr_r32_cl(DRCTOP, REG_EBP); // shr ebp,cl
emit_shrd_r32_r32_cl(DRCTOP, REG_EBX, REG_EBP); // shrd ebx,ebp,cl
emit_shr_r32_cl(DRCTOP, REG_EBP); // shr ebp,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
- emit_not_r32(DRCTOP, REG_EBP); // not ebp
emit_push_r32(DRCTOP, REG_ECX); // push ecx
emit_push_r32(DRCTOP, REG_EBP); // push ebp
emit_push_r32(DRCTOP, REG_EBX); // push ebx
@@ -1521,8 +1519,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
emit_shld_r32_r32_cl(DRCTOP, REG_EBP, REG_EBX); // shld ebp,ebx,cl
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
- emit_not_r32(DRCTOP, REG_EBP); // not ebp
emit_push_r32(DRCTOP, REG_ECX); // push ecx
emit_push_r32(DRCTOP, REG_EBP); // push ebp
emit_push_r32(DRCTOP, REG_EBX); // push ebx
@@ -1668,7 +1664,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
if (!mips3.core->bigendian)
emit_xor_r32_imm(DRCTOP, REG_ECX, 0x18); // xor ecx,0x18
emit_shr_r32_cl(DRCTOP, REG_EBX); // shr ebx,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_ECX); // push ecx
emit_push_r32(DRCTOP, REG_EBX); // push ebx
emit_push_r32(DRCTOP, REG_EAX); // push eax
@@ -1776,7 +1771,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
if (mips3.core->bigendian)
emit_xor_r32_imm(DRCTOP, REG_ECX, 0x18); // xor ecx,0x18
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_ECX); // push ecx
emit_push_r32(DRCTOP, REG_EBX); // push ebx
emit_push_r32(DRCTOP, REG_EAX); // push eax
@@ -1882,7 +1876,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
if (!mips3.core->bigendian)
emit_xor_r32_imm(DRCTOP, REG_ECX, 0x18); // xor ecx,0x18
emit_shr_r32_cl(DRCTOP, REG_EBX); // shr ebx,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_EBX); // push ebx
if (RTREG != 0)
{
@@ -1937,8 +1930,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
emit_shr_r32_cl(DRCTOP, REG_EBP); // shr ebp,cl
emit_shrd_r32_r32_cl(DRCTOP, REG_EBX, REG_EBP); // shrd ebx,ebp,cl
emit_shr_r32_cl(DRCTOP, REG_EBP); // shr ebp,cl
- emit_not_r32(DRCTOP, REG_EBP); // not ebp
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_EBP); // push ebp
emit_push_r32(DRCTOP, REG_EBX); // push ebx
if (RTREG != 0)
@@ -1979,8 +1970,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
emit_shld_r32_r32_cl(DRCTOP, REG_EBP, REG_EBX); // shld ebp,ebx,cl
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
- emit_not_r32(DRCTOP, REG_EBP); // not ebp
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_EBP); // push ebp
emit_push_r32(DRCTOP, REG_EBX); // push ebx
if (RTREG != 0)
@@ -2018,7 +2007,6 @@ static UINT32 recompile_instruction(drc_core *drc, UINT32 pc, UINT32 physpc)
if (mips3.core->bigendian)
emit_xor_r32_imm(DRCTOP, REG_ECX, 0x18); // xor ecx,0x18
emit_shl_r32_cl(DRCTOP, REG_EBX); // shl ebx,cl
- emit_not_r32(DRCTOP, REG_EBX); // not ebx
emit_push_r32(DRCTOP, REG_EBX); // push ebx
if (RTREG != 0)
{
diff --git a/src/emu/cpu/mips/mips3.c b/src/emu/cpu/mips/mips3.c
index 8fdd5028ee5..ce914b3ce18 100644
--- a/src/emu/cpu/mips/mips3.c
+++ b/src/emu/cpu/mips/mips3.c
@@ -1963,7 +1963,7 @@ static void lwl_be(UINT32 op)
UINT32 mask = 0xffffffffUL << shift;
UINT32 temp;
- if (RWORD_MASKED(offs & ~3, &temp, ~(mask >> shift)) && RTREG)
+ if (RWORD_MASKED(offs & ~3, &temp, mask >> shift) && RTREG)
RTVAL64 = (INT32)((RTVAL32 & ~mask) | (temp << shift));
}
@@ -1974,7 +1974,7 @@ static void lwr_be(UINT32 op)
UINT32 mask = 0xffffffffUL >> shift;
UINT32 temp;
- if (RWORD_MASKED(offs & ~3, &temp, ~(mask << shift)) && RTREG)
+ if (RWORD_MASKED(offs & ~3, &temp, mask << shift) && RTREG)
RTVAL64 = (INT32)((RTVAL32 & ~mask) | (temp >> shift));
}
@@ -1985,7 +1985,7 @@ static void ldl_be(UINT32 op)
UINT64 mask = U64(0xffffffffffffffff) << shift;
UINT64 temp;
- if (RDOUBLE_MASKED(offs & ~7, &temp, ~(mask >> shift)) && RTREG)
+ if (RDOUBLE_MASKED(offs & ~7, &temp, mask >> shift) && RTREG)
RTVAL64 = (RTVAL64 & ~mask) | (temp << shift);
}
@@ -1996,7 +1996,7 @@ static void ldr_be(UINT32 op)
UINT64 mask = U64(0xffffffffffffffff) >> shift;
UINT64 temp;
- if (RDOUBLE_MASKED(offs & ~7, &temp, ~(mask << shift)) && RTREG)
+ if (RDOUBLE_MASKED(offs & ~7, &temp, mask << shift) && RTREG)
RTVAL64 = (RTVAL64 & ~mask) | (temp >> shift);
}
@@ -2004,7 +2004,7 @@ static void swl_be(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (offs & 3);
- UINT32 mask = ~(0xffffffffUL >> shift);
+ UINT32 mask = 0xffffffffUL >> shift;
WWORD_MASKED(offs & ~3, RTVAL32 >> shift, mask);
}
@@ -2012,7 +2012,7 @@ static void swr_be(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (~offs & 3);
- UINT32 mask = ~(0xffffffffUL << shift);
+ UINT32 mask = 0xffffffffUL << shift;
WWORD_MASKED(offs & ~3, RTVAL32 << shift, mask);
}
@@ -2020,7 +2020,7 @@ static void sdl_be(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (offs & 7);
- UINT64 mask = ~(U64(0xffffffffffffffff) >> shift);
+ UINT64 mask = U64(0xffffffffffffffff) >> shift;
WDOUBLE_MASKED(offs & ~7, RTVAL64 >> shift, mask);
}
@@ -2028,7 +2028,7 @@ static void sdr_be(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (~offs & 7);
- UINT64 mask = ~(U64(0xffffffffffffffff) << shift);
+ UINT64 mask = U64(0xffffffffffffffff) << shift;
WDOUBLE_MASKED(offs & ~7, RTVAL64 << shift, mask);
}
@@ -2041,7 +2041,7 @@ static void lwl_le(UINT32 op)
UINT32 mask = 0xffffffffUL << shift;
UINT32 temp;
- if (RWORD_MASKED(offs & ~3, &temp, ~(mask >> shift)) && RTREG)
+ if (RWORD_MASKED(offs & ~3, &temp, mask >> shift) && RTREG)
RTVAL64 = (INT32)((RTVAL32 & ~mask) | (temp << shift));
}
@@ -2052,7 +2052,7 @@ static void lwr_le(UINT32 op)
UINT32 mask = 0xffffffffUL >> shift;
UINT32 temp;
- if (RWORD_MASKED(offs & ~3, &temp, ~(mask << shift)) && RTREG)
+ if (RWORD_MASKED(offs & ~3, &temp, mask << shift) && RTREG)
RTVAL64 = (INT32)((RTVAL32 & ~mask) | (temp >> shift));
}
@@ -2063,7 +2063,7 @@ static void ldl_le(UINT32 op)
UINT64 mask = U64(0xffffffffffffffff) << shift;
UINT64 temp;
- if (RDOUBLE_MASKED(offs & ~7, &temp, ~(mask >> shift)) && RTREG)
+ if (RDOUBLE_MASKED(offs & ~7, &temp, mask >> shift) && RTREG)
RTVAL64 = (RTVAL64 & ~mask) | (temp << shift);
}
@@ -2074,7 +2074,7 @@ static void ldr_le(UINT32 op)
UINT64 mask = U64(0xffffffffffffffff) >> shift;
UINT64 temp;
- if (RDOUBLE_MASKED(offs & ~7, &temp, ~(mask << shift)) && RTREG)
+ if (RDOUBLE_MASKED(offs & ~7, &temp, mask << shift) && RTREG)
RTVAL64 = (RTVAL64 & ~mask) | (temp >> shift);
}
@@ -2082,7 +2082,7 @@ static void swl_le(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (~offs & 3);
- UINT32 mask = ~(0xffffffffUL >> shift);
+ UINT32 mask = 0xffffffffUL >> shift;
WWORD_MASKED(offs & ~3, RTVAL32 >> shift, mask);
}
@@ -2090,7 +2090,7 @@ static void swr_le(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (offs & 3);
- UINT32 mask = ~(0xffffffffUL << shift);
+ UINT32 mask = 0xffffffffUL << shift;
WWORD_MASKED(offs & ~3, RTVAL32 << shift, mask);
}
@@ -2098,7 +2098,7 @@ static void sdl_le(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (~offs & 7);
- UINT64 mask = ~(U64(0xffffffffffffffff) >> shift);
+ UINT64 mask = U64(0xffffffffffffffff) >> shift;
WDOUBLE_MASKED(offs & ~7, RTVAL64 >> shift, mask);
}
@@ -2106,7 +2106,7 @@ static void sdr_le(UINT32 op)
{
offs_t offs = SIMMVAL + RSVAL32;
int shift = 8 * (offs & 7);
- UINT64 mask = ~(U64(0xffffffffffffffff) << shift);
+ UINT64 mask = U64(0xffffffffffffffff) << shift;
WDOUBLE_MASKED(offs & ~7, RTVAL64 << shift, mask);
}
diff --git a/src/emu/cpu/mips/mips3com.c b/src/emu/cpu/mips/mips3com.c
index af3d7132c14..2e10d38d6a4 100644
--- a/src/emu/cpu/mips/mips3com.c
+++ b/src/emu/cpu/mips/mips3com.c
@@ -29,11 +29,6 @@ static UINT32 compute_prid_register(const mips3_state *mips);
static void tlb_write_common(mips3_state *mips, int index);
static void tlb_entry_log_half(mips3_tlb_entry *tlbent, int index, int which);
-static UINT64 program_read_qword_masked_32be(offs_t offset, UINT64 mem_mask);
-static void program_write_qword_masked_32be(offs_t offset, UINT64 data, UINT64 mem_mask);
-static UINT64 program_read_qword_masked_32le(offs_t offset, UINT64 mem_mask);
-static void program_write_qword_masked_32le(offs_t offset, UINT64 data, UINT64 mem_mask);
-
/***************************************************************************
@@ -860,68 +855,3 @@ static void tlb_entry_log_half(mips3_tlb_entry *tlbent, int index, int which)
asid, r, c, (lo & 4) ? 'd' : '.', (lo & 2) ? 'v' : '.', (hi & 0x1000) ? 'g' : '.');
#endif
}
-
-
-
-/***************************************************************************
- DOUBLEWORD READS/WRITES
-***************************************************************************/
-
-/*-------------------------------------------------
- program_read_qword_masked_32be - read a 64-bit
- big-endian value with explicit masking
--------------------------------------------------*/
-
-static UINT64 program_read_qword_masked_32be(offs_t offset, UINT64 mem_mask)
-{
- UINT64 result = 0;
- if (ACCESSING_BITS_32_63)
- result |= (UINT64)program_read_dword_masked_32be(offset, mem_mask >> 32) << 32;
- if (ACCESSING_BITS_0_31)
- result |= program_read_dword_masked_32be(offset + 4, mem_mask);
- return result;
-}
-
-
-/*-------------------------------------------------
- program_read_qword_masked_32le - read a 64-bit
- little-endian value with explicit masking
--------------------------------------------------*/
-
-static UINT64 program_read_qword_masked_32le(offs_t offset, UINT64 mem_mask)
-{
- UINT64 result = 0;
- if (ACCESSING_BITS_0_31)
- result |= program_read_dword_masked_32le(offset, mem_mask);
- if (ACCESSING_BITS_32_63)
- result |= (UINT64)program_read_dword_masked_32le(offset + 4, mem_mask >> 32) << 32;
- return result;
-}
-
-
-/*-------------------------------------------------
- program_write_qword_masked_32be - write a
- 64-bit big-endian value with explicit masking
--------------------------------------------------*/
-
-static void program_write_qword_masked_32be(offs_t offset, UINT64 data, UINT64 mem_mask)
-{
- if (ACCESSING_BITS_32_63)
- program_write_dword_masked_32be(offset, data >> 32, mem_mask >> 32);
- if (ACCESSING_BITS_0_31)
- program_write_dword_masked_32be(offset + 4, data, mem_mask);
-}
-
-
-/*-------------------------------------------------
- program_write_qword_masked_32le - write a
- 64-bit little-endian value with explicit masking
--------------------------------------------------*/
-
-static void program_write_qword_masked_32le(offs_t offset, UINT64 data, UINT64 mem_mask)
-{
- if (ACCESSING_BITS_0_31)
- program_write_dword_masked_32le(offset, data, mem_mask);
- if (ACCESSING_BITS_32_63)
- program_write_dword_masked_32le(offset + 4, data >> 32, mem_mask >> 32);
-}
diff --git a/src/emu/cpu/mips/psx.c b/src/emu/cpu/mips/psx.c
index 9b559be642d..14313395a3d 100644
--- a/src/emu/cpu/mips/psx.c
+++ b/src/emu/cpu/mips/psx.c
@@ -2405,15 +2405,15 @@ static int mips_execute( int cycles )
switch( load_type )
{
case 0:
- data = ( data & 0x00ffffff ) | ( mipscpu.readword_masked( address, 0xff000000 ) << 24 );
+ data = ( data & 0x00ffffff ) | ( mipscpu.readword_masked( address, 0x000000ff ) << 24 );
break;
case 1:
- data = ( data & 0x0000ffff ) | ( mipscpu.readword_masked( address, 0xffff0000 ) << 16 );
+ data = ( data & 0x0000ffff ) | ( mipscpu.readword_masked( address, 0x0000ffff ) << 16 );
break;
case 2:
- data = ( data & 0x000000ff ) | ( mipscpu.readword_masked( address, 0xffffff00 ) << 8 );
+ data = ( data & 0x000000ff ) | ( mipscpu.readword_masked( address, 0x00ffffff ) << 8 );
break;
case 3:
@@ -2548,11 +2548,11 @@ static int mips_execute( int cycles )
break;
case 2:
- data = ( data & 0xffff0000 ) | ( mipscpu.readword_masked( address, 0x0000ffff ) >> 16 );
+ data = ( data & 0xffff0000 ) | ( mipscpu.readword_masked( address, 0xffff0000 ) >> 16 );
break;
case 3:
- data = ( data & 0xffffff00 ) | ( mipscpu.readword_masked( address, 0x000000ff ) >> 24 );
+ data = ( data & 0xffffff00 ) | ( mipscpu.readword_masked( address, 0xff000000 ) >> 24 );
break;
}
@@ -2580,7 +2580,7 @@ static int mips_execute( int cycles )
else
{
int shift = 8 * ( address & 3 );
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << shift, ~( 0xff << shift ) );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << shift, 0xff << shift );
if( breakpoint )
{
@@ -2610,7 +2610,7 @@ static int mips_execute( int cycles )
else
{
int shift = 8 * ( address & 2 );
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << shift, ~( 0xffff << shift ) );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << shift, 0xffff << shift );
if( breakpoint )
{
@@ -2646,15 +2646,15 @@ static int mips_execute( int cycles )
switch( save_type )
{
case 0:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 24, 0xffffff00 );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 24, 0x000000ff );
break;
case 1:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 16, 0xffff0000 );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 16, 0x0000ffff );
break;
case 2:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 8, 0xff000000 );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] >> 8, 0x00ffffff );
break;
case 3:
@@ -2725,15 +2725,15 @@ static int mips_execute( int cycles )
break;
case 1:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 8, 0x000000ff );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 8, 0xffffff00 );
break;
case 2:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 16, 0x0000ffff );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 16, 0xffff0000 );
break;
case 3:
- mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 24, 0x00ffffff );
+ mipscpu.writeword_masked( address, mipscpu.r[ INS_RT( mipscpu.op ) ] << 24, 0xff000000 );
break;
}
diff --git a/src/emu/memory.c b/src/emu/memory.c
index 09cf5c78493..4765f6d9d83 100644
--- a/src/emu/memory.c
+++ b/src/emu/memory.c
@@ -342,66 +342,49 @@ static debug_hook_read_func debug_hook_read; /* pointer to debugger callback
static debug_hook_write_func debug_hook_write; /* pointer to debugger callback for memory writes */
#endif
+#define ACCESSOR_GROUP(type, width) \
+{ \
+ memory_set_opbase, \
+ type##_read_byte_##width, \
+ type##_read_word_##width, \
+ type##_read_word_masked_##width, \
+ type##_read_dword_##width, \
+ type##_read_dword_masked_##width, \
+ type##_read_qword_##width, \
+ type##_read_qword_masked_##width, \
+ type##_write_byte_##width, \
+ type##_write_word_##width, \
+ type##_write_word_masked_##width, \
+ type##_write_dword_##width, \
+ type##_write_dword_masked_##width, \
+ type##_write_qword_##width, \
+ type##_write_qword_masked_##width \
+}
+
static const data_accessors memory_accessors[ADDRESS_SPACES][4][2] =
{
/* program accessors */
{
- {
- { memory_set_opbase, program_read_byte_8le, program_read_word_8le, program_read_dword_8le, NULL, program_read_qword_8le, NULL, program_write_byte_8le, program_write_word_8le, program_write_dword_8le, NULL, program_write_qword_8le, NULL },
- { memory_set_opbase, program_read_byte_8be, program_read_word_8be, program_read_dword_8be, NULL, program_read_qword_8be, NULL, program_write_byte_8be, program_write_word_8be, program_write_dword_8be, NULL, program_write_qword_8be, NULL }
- },
- {
- { memory_set_opbase, program_read_byte_16le, program_read_word_16le, program_read_dword_16le, NULL, program_read_qword_16le, NULL, program_write_byte_16le, program_write_word_16le, program_write_dword_16le, NULL, program_write_qword_16le, NULL },
- { memory_set_opbase, program_read_byte_16be, program_read_word_16be, program_read_dword_16be, NULL, program_read_qword_16be, NULL, program_write_byte_16be, program_write_word_16be, program_write_dword_16be, NULL, program_write_qword_16be, NULL }
- },
- {
- { memory_set_opbase, program_read_byte_32le, program_read_word_32le, program_read_dword_32le, program_read_dword_masked_32le, program_read_qword_32le, NULL, program_write_byte_32le, program_write_word_32le, program_write_dword_32le, program_write_dword_masked_32le, program_write_qword_32le, NULL },
- { memory_set_opbase, program_read_byte_32be, program_read_word_32be, program_read_dword_32be, program_read_dword_masked_32be, program_read_qword_32be, NULL, program_write_byte_32be, program_write_word_32be, program_write_dword_32be, program_write_dword_masked_32be, program_write_qword_32be, NULL }
- },
- {
- { memory_set_opbase, program_read_byte_64le, program_read_word_64le, program_read_dword_64le, NULL, program_read_qword_64le, program_read_qword_masked_64le, program_write_byte_64le, program_write_word_64le, program_write_dword_64le, NULL, program_write_qword_64le, program_write_qword_masked_64le },
- { memory_set_opbase, program_read_byte_64be, program_read_word_64be, program_read_dword_64be, NULL, program_read_qword_64be, program_read_qword_masked_64be, program_write_byte_64be, program_write_word_64be, program_write_dword_64be, NULL, program_write_qword_64be, program_write_qword_masked_64be }
- }
+ { ACCESSOR_GROUP(program, 8le), ACCESSOR_GROUP(program, 8be) },
+ { ACCESSOR_GROUP(program, 16le), ACCESSOR_GROUP(program, 16be) },
+ { ACCESSOR_GROUP(program, 32le), ACCESSOR_GROUP(program, 32be) },
+ { ACCESSOR_GROUP(program, 64le), ACCESSOR_GROUP(program, 64be) }
},
/* data accessors */
{
- {
- { memory_set_opbase, data_read_byte_8le, data_read_word_8le, data_read_dword_8le, NULL, data_read_qword_8le, NULL, data_write_byte_8le, data_write_word_8le, data_write_dword_8le, NULL, data_write_qword_8le, NULL },
- { memory_set_opbase, data_read_byte_8be, data_read_word_8be, data_read_dword_8be, NULL, data_read_qword_8be, NULL, data_write_byte_8be, data_write_word_8be, data_write_dword_8be, NULL, data_write_qword_8be, NULL }
- },
- {
- { memory_set_opbase, data_read_byte_16le, data_read_word_16le, data_read_dword_16le, NULL, data_read_qword_16le, NULL, data_write_byte_16le, data_write_word_16le, data_write_dword_16le, NULL, data_write_qword_16le, NULL },
- { memory_set_opbase, data_read_byte_16be, data_read_word_16be, data_read_dword_16be, NULL, data_read_qword_16be, NULL, data_write_byte_16be, data_write_word_16be, data_write_dword_16be, NULL, data_write_qword_16be, NULL }
- },
- {
- { memory_set_opbase, data_read_byte_32le, data_read_word_32le, data_read_dword_32le, data_read_dword_masked_32le, data_read_qword_32le, NULL, data_write_byte_32le, data_write_word_32le, data_write_dword_32le, data_write_dword_masked_32le, data_write_qword_32le, NULL },
- { memory_set_opbase, data_read_byte_32be, data_read_word_32be, data_read_dword_32be, data_read_dword_masked_32be, data_read_qword_32be, NULL, data_write_byte_32be, data_write_word_32be, data_write_dword_32be, data_write_dword_masked_32be, data_write_qword_32be, NULL }
- },
- {
- { memory_set_opbase, data_read_byte_64le, data_read_word_64le, data_read_dword_64le, NULL, data_read_qword_64le, data_read_qword_masked_64le, data_write_byte_64le, data_write_word_64le, data_write_dword_64le, NULL, data_write_qword_64le, data_write_qword_masked_64le },
- { memory_set_opbase, data_read_byte_64be, data_read_word_64be, data_read_dword_64be, NULL, data_read_qword_64be, data_read_qword_masked_64be, data_write_byte_64be, data_write_word_64be, data_write_dword_64be, NULL, data_write_qword_64be, data_write_qword_masked_64be }
- }
+ { ACCESSOR_GROUP(data, 8le), ACCESSOR_GROUP(data, 8be) },
+ { ACCESSOR_GROUP(data, 16le), ACCESSOR_GROUP(data, 16be) },
+ { ACCESSOR_GROUP(data, 32le), ACCESSOR_GROUP(data, 32be) },
+ { ACCESSOR_GROUP(data, 64le), ACCESSOR_GROUP(data, 64be) }
},
/* I/O accessors */
{
- {
- { memory_set_opbase, io_read_byte_8le, io_read_word_8le, io_read_dword_8le, NULL, io_read_qword_8le, NULL, io_write_byte_8le, io_write_word_8le, io_write_dword_8le, NULL, io_write_qword_8le, NULL },
- { memory_set_opbase, io_read_byte_8be, io_read_word_8be, io_read_dword_8be, NULL, io_read_qword_8be, NULL, io_write_byte_8be, io_write_word_8be, io_write_dword_8be, NULL, io_write_qword_8be, NULL }
- },
- {
- { memory_set_opbase, io_read_byte_16le, io_read_word_16le, io_read_dword_16le, NULL, io_read_qword_16le, NULL, io_write_byte_16le, io_write_word_16le, io_write_dword_16le, NULL, io_write_qword_16le, NULL },
- { memory_set_opbase, io_read_byte_16be, io_read_word_16be, io_read_dword_16be, NULL, io_read_qword_16be, NULL, io_write_byte_16be, io_write_word_16be, io_write_dword_16be, NULL, io_write_qword_16be, NULL }
- },
- {
- { memory_set_opbase, io_read_byte_32le, io_read_word_32le, io_read_dword_32le, io_read_dword_masked_32le, io_read_qword_32le, NULL, io_write_byte_32le, io_write_word_32le, io_write_dword_32le, io_write_dword_masked_32le, io_write_qword_32le, NULL },
- { memory_set_opbase, io_read_byte_32be, io_read_word_32be, io_read_dword_32be, io_read_dword_masked_32be, io_read_qword_32be, NULL, io_write_byte_32be, io_write_word_32be, io_write_dword_32be, io_write_dword_masked_32be, io_write_qword_32be, NULL }
- },
- {
- { memory_set_opbase, io_read_byte_64le, io_read_word_64le, io_read_dword_64le, NULL, io_read_qword_64le, io_read_qword_masked_64le, io_write_byte_64le, io_write_word_64le, io_write_dword_64le, NULL, io_write_qword_64le, io_write_qword_masked_64le },
- { memory_set_opbase, io_read_byte_64be, io_read_word_64be, io_read_dword_64be, NULL, io_read_qword_64be, io_read_qword_masked_64be, io_write_byte_64be, io_write_word_64be, io_write_dword_64be, NULL, io_write_qword_64be, io_write_qword_masked_64be }
- }
+ { ACCESSOR_GROUP(io, 8le), ACCESSOR_GROUP(io, 8be) },
+ { ACCESSOR_GROUP(io, 16le), ACCESSOR_GROUP(io, 16be) },
+ { ACCESSOR_GROUP(io, 32le), ACCESSOR_GROUP(io, 32be) },
+ { ACCESSOR_GROUP(io, 64le), ACCESSOR_GROUP(io, 64be) }
},
};
@@ -3463,36 +3446,84 @@ UINT16 program_read_word_8le(offs_t address)
return result | (program_read_byte_8le(address + 1) << 8);
}
+UINT16 program_read_word_masked_8le(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0x00ff) result |= program_read_byte_8le(address + 0) << 0;
+ if (mask & 0xff00) result |= program_read_byte_8le(address + 1) << 8;
+ return result;
+}
+
UINT16 program_read_word_8be(offs_t address)
{
UINT16 result = program_read_byte_8be(address + 0) << 8;
return result | (program_read_byte_8be(address + 1) << 0);
}
+UINT16 program_read_word_masked_8be(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0xff00) result |= program_read_byte_8be(address + 0) << 8;
+ if (mask & 0x00ff) result |= program_read_byte_8be(address + 1) << 0;
+ return result;
+}
+
UINT32 program_read_dword_8le(offs_t address)
{
UINT32 result = program_read_word_8le(address + 0) << 0;
return result | (program_read_word_8le(address + 2) << 16);
}
+UINT32 program_read_dword_masked_8le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= program_read_word_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= program_read_word_masked_8le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 program_read_dword_8be(offs_t address)
{
UINT32 result = program_read_word_8be(address + 0) << 16;
return result | (program_read_word_8be(address + 2) << 0);
}
+UINT32 program_read_dword_masked_8be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= program_read_word_masked_8be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= program_read_word_masked_8be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 program_read_qword_8le(offs_t address)
{
UINT64 result = (UINT64)program_read_dword_8le(address + 0) << 0;
return result | ((UINT64)program_read_dword_8le(address + 4) << 32);
}
+UINT64 program_read_qword_masked_8le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_8le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 program_read_qword_8be(offs_t address)
{
UINT64 result = (UINT64)program_read_dword_8le(address + 0) << 32;
return result | ((UINT64)program_read_dword_8le(address + 4) << 0);
}
+UINT64 program_read_qword_masked_8be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_8be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_8be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -3514,36 +3545,84 @@ UINT16 data_read_word_8le(offs_t address)
return result | (data_read_byte_8le(address + 1) << 8);
}
+UINT16 data_read_word_masked_8le(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0x00ff) result |= data_read_byte_8le(address + 0) << 0;
+ if (mask & 0xff00) result |= data_read_byte_8le(address + 1) << 8;
+ return result;
+}
+
UINT16 data_read_word_8be(offs_t address)
{
UINT16 result = data_read_byte_8be(address + 0) << 8;
return result | (data_read_byte_8be(address + 1) << 0);
}
+UINT16 data_read_word_masked_8be(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0xff00) result |= data_read_byte_8be(address + 0) << 8;
+ if (mask & 0x00ff) result |= data_read_byte_8be(address + 1) << 0;
+ return result;
+}
+
UINT32 data_read_dword_8le(offs_t address)
{
UINT32 result = data_read_word_8le(address + 0) << 0;
return result | (data_read_word_8le(address + 2) << 16);
}
+UINT32 data_read_dword_masked_8le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= data_read_word_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= data_read_word_masked_8le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 data_read_dword_8be(offs_t address)
{
UINT32 result = data_read_word_8be(address + 0) << 16;
return result | (data_read_word_8be(address + 2) << 0);
}
+UINT32 data_read_dword_masked_8be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= data_read_word_masked_8be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= data_read_word_masked_8be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 data_read_qword_8le(offs_t address)
{
UINT64 result = (UINT64)data_read_dword_8le(address + 0) << 0;
return result | ((UINT64)data_read_dword_8le(address + 4) << 32);
}
+UINT64 data_read_qword_masked_8le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_8le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 data_read_qword_8be(offs_t address)
{
UINT64 result = (UINT64)data_read_dword_8le(address + 0) << 32;
return result | ((UINT64)data_read_dword_8le(address + 4) << 0);
}
+UINT64 data_read_qword_masked_8be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_8be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_8be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -3565,36 +3644,84 @@ UINT16 io_read_word_8le(offs_t address)
return result | (io_read_byte_8le(address + 1) << 8);
}
+UINT16 io_read_word_masked_8le(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0x00ff) result |= io_read_byte_8le(address + 0) << 0;
+ if (mask & 0xff00) result |= io_read_byte_8le(address + 1) << 8;
+ return result;
+}
+
UINT16 io_read_word_8be(offs_t address)
{
UINT16 result = io_read_byte_8be(address + 0) << 8;
return result | (io_read_byte_8be(address + 1) << 0);
}
+UINT16 io_read_word_masked_8be(offs_t address, UINT16 mask)
+{
+ UINT16 result = 0;
+ if (mask & 0xff00) result |= io_read_byte_8be(address + 0) << 8;
+ if (mask & 0x00ff) result |= io_read_byte_8be(address + 1) << 0;
+ return result;
+}
+
UINT32 io_read_dword_8le(offs_t address)
{
UINT32 result = io_read_word_8le(address + 0) << 0;
return result | (io_read_word_8le(address + 2) << 16);
}
+UINT32 io_read_dword_masked_8le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= io_read_word_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= io_read_word_masked_8le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 io_read_dword_8be(offs_t address)
{
UINT32 result = io_read_word_8be(address + 0) << 16;
return result | (io_read_word_8be(address + 2) << 0);
}
+UINT32 io_read_dword_masked_8be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= io_read_word_masked_8be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= io_read_word_masked_8be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 io_read_qword_8le(offs_t address)
{
UINT64 result = (UINT64)io_read_dword_8le(address + 0) << 0;
return result | ((UINT64)io_read_dword_8le(address + 4) << 32);
}
+UINT64 io_read_qword_masked_8le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_8le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_8le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 io_read_qword_8be(offs_t address)
{
UINT64 result = (UINT64)io_read_dword_8le(address + 0) << 32;
return result | ((UINT64)io_read_dword_8le(address + 4) << 0);
}
+UINT64 io_read_qword_masked_8be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_8be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_8be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/***************************************************************************
@@ -3651,36 +3778,72 @@ void program_write_word_8le(offs_t address, UINT16 data)
program_write_byte_8le(address + 1, data >> 8);
}
+void program_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0x00ff) program_write_byte_8le(address + 0, data >> 0);
+ if (mask & 0xff00) program_write_byte_8le(address + 1, data >> 8);
+}
+
void program_write_word_8be(offs_t address, UINT16 data)
{
program_write_byte_8be(address + 0, data >> 8);
program_write_byte_8be(address + 1, data >> 0);
}
+void program_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0xff00) program_write_byte_8be(address + 0, data >> 8);
+ if (mask & 0x00ff) program_write_byte_8be(address + 1, data >> 0);
+}
+
void program_write_dword_8le(offs_t address, UINT32 data)
{
program_write_word_8le(address + 0, data >> 0);
program_write_word_8le(address + 2, data >> 16);
}
+void program_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) program_write_word_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) program_write_word_masked_8le(address + 2, data >> 16, mask >> 16);
+}
+
void program_write_dword_8be(offs_t address, UINT32 data)
{
program_write_word_8be(address + 0, data >> 16);
program_write_word_8be(address + 2, data >> 0);
}
+void program_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) program_write_word_masked_8be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) program_write_word_masked_8be(address + 2, data >> 0, mask >> 0);
+}
+
void program_write_qword_8le(offs_t address, UINT64 data)
{
program_write_dword_8le(address + 0, data >> 0);
program_write_dword_8le(address + 4, data >> 32);
}
+void program_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_8le(address + 4, data >> 32, mask >> 32);
+}
+
void program_write_qword_8be(offs_t address, UINT64 data)
{
program_write_dword_8be(address + 0, data >> 32);
program_write_dword_8be(address + 4, data >> 0);
}
+void program_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_8be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_8be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -3702,36 +3865,72 @@ void data_write_word_8le(offs_t address, UINT16 data)
data_write_byte_8le(address + 1, data >> 8);
}
+void data_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0x00ff) data_write_byte_8le(address + 0, data >> 0);
+ if (mask & 0xff00) data_write_byte_8le(address + 1, data >> 8);
+}
+
void data_write_word_8be(offs_t address, UINT16 data)
{
data_write_byte_8be(address + 0, data >> 8);
data_write_byte_8be(address + 1, data >> 0);
}
+void data_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0xff00) data_write_byte_8be(address + 0, data >> 8);
+ if (mask & 0x00ff) data_write_byte_8be(address + 1, data >> 0);
+}
+
void data_write_dword_8le(offs_t address, UINT32 data)
{
data_write_word_8le(address + 0, data >> 0);
data_write_word_8le(address + 2, data >> 16);
}
+void data_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) data_write_word_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) data_write_word_masked_8le(address + 2, data >> 16, mask >> 16);
+}
+
void data_write_dword_8be(offs_t address, UINT32 data)
{
data_write_word_8be(address + 0, data >> 16);
data_write_word_8be(address + 2, data >> 0);
}
+void data_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) data_write_word_masked_8be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) data_write_word_masked_8be(address + 2, data >> 0, mask >> 0);
+}
+
void data_write_qword_8le(offs_t address, UINT64 data)
{
data_write_dword_8le(address + 0, data >> 0);
data_write_dword_8le(address + 4, data >> 32);
}
+void data_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_8le(address + 4, data >> 32, mask >> 32);
+}
+
void data_write_qword_8be(offs_t address, UINT64 data)
{
data_write_dword_8be(address + 0, data >> 32);
data_write_dword_8be(address + 4, data >> 0);
}
+void data_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_8be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_8be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -3753,36 +3952,72 @@ void io_write_word_8le(offs_t address, UINT16 data)
io_write_byte_8le(address + 1, data >> 8);
}
+void io_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0x00ff) io_write_byte_8le(address + 0, data >> 0);
+ if (mask & 0xff00) io_write_byte_8le(address + 1, data >> 8);
+}
+
void io_write_word_8be(offs_t address, UINT16 data)
{
io_write_byte_8be(address + 0, data >> 8);
io_write_byte_8be(address + 1, data >> 0);
}
+void io_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask)
+{
+ if (mask & 0xff00) io_write_byte_8be(address + 0, data >> 8);
+ if (mask & 0x00ff) io_write_byte_8be(address + 1, data >> 0);
+}
+
void io_write_dword_8le(offs_t address, UINT32 data)
{
io_write_word_8le(address + 0, data >> 0);
io_write_word_8le(address + 2, data >> 16);
}
+void io_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) io_write_word_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) io_write_word_masked_8le(address + 2, data >> 16, mask >> 16);
+}
+
void io_write_dword_8be(offs_t address, UINT32 data)
{
io_write_word_8be(address + 0, data >> 16);
io_write_word_8be(address + 2, data >> 0);
}
+void io_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) io_write_word_masked_8be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) io_write_word_masked_8be(address + 2, data >> 0, mask >> 0);
+}
+
void io_write_qword_8le(offs_t address, UINT64 data)
{
io_write_dword_8le(address + 0, data >> 0);
io_write_dword_8le(address + 4, data >> 32);
}
+void io_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_8le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_8le(address + 4, data >> 32, mask >> 32);
+}
+
void io_write_qword_8be(offs_t address, UINT64 data)
{
io_write_dword_8be(address + 0, data >> 32);
io_write_dword_8be(address + 4, data >> 0);
}
+void io_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_8be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_8be(address + 4, data >> 0, mask >> 0);
+}
+
/***************************************************************************
@@ -3843,35 +4078,77 @@ UINT16 program_read_word_16le(offs_t address)
return read_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
+UINT16 program_read_word_masked_16le(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
+}
+
UINT16 program_read_word_16be(offs_t address)
{
return read_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
+UINT16 program_read_word_masked_16be(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
+}
+
UINT32 program_read_dword_16le(offs_t address)
{
UINT32 result = program_read_word_16le(address + 0) << 0;
return result | (program_read_word_16le(address + 2) << 16);
}
+UINT32 program_read_dword_masked_16le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= program_read_word_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= program_read_word_masked_16le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 program_read_dword_16be(offs_t address)
{
UINT32 result = program_read_word_16be(address + 0) << 16;
return result | (program_read_word_16be(address + 2) << 0);
}
+UINT32 program_read_dword_masked_16be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= program_read_word_masked_16be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= program_read_word_masked_16be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 program_read_qword_16le(offs_t address)
{
UINT64 result = (UINT64)program_read_dword_16le(address + 0) << 0;
return result | ((UINT64)program_read_dword_16le(address + 4) << 32);
}
+UINT64 program_read_qword_masked_16le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_16le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 program_read_qword_16be(offs_t address)
{
UINT64 result = (UINT64)program_read_dword_16le(address + 0) << 32;
return result | ((UINT64)program_read_dword_16le(address + 4) << 0);
}
+UINT64 program_read_qword_masked_16be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_16be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_16be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -3894,35 +4171,77 @@ UINT16 data_read_word_16le(offs_t address)
return read_word_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
+UINT16 data_read_word_masked_16le(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
+}
+
UINT16 data_read_word_16be(offs_t address)
{
return read_word_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
+UINT16 data_read_word_masked_16be(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
+}
+
UINT32 data_read_dword_16le(offs_t address)
{
UINT32 result = data_read_word_16le(address + 0) << 0;
return result | (data_read_word_16le(address + 2) << 16);
}
+UINT32 data_read_dword_masked_16le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= data_read_word_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= data_read_word_masked_16le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 data_read_dword_16be(offs_t address)
{
UINT32 result = data_read_word_16be(address + 0) << 16;
return result | (data_read_word_16be(address + 2) << 0);
}
+UINT32 data_read_dword_masked_16be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= data_read_word_masked_16be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= data_read_word_masked_16be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 data_read_qword_16le(offs_t address)
{
UINT64 result = (UINT64)data_read_dword_16le(address + 0) << 0;
return result | ((UINT64)data_read_dword_16le(address + 4) << 32);
}
+UINT64 data_read_qword_masked_16le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_16le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 data_read_qword_16be(offs_t address)
{
UINT64 result = (UINT64)data_read_dword_16le(address + 0) << 32;
return result | ((UINT64)data_read_dword_16le(address + 4) << 0);
}
+UINT64 data_read_qword_masked_16be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_16be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_16be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -3945,35 +4264,77 @@ UINT16 io_read_word_16le(offs_t address)
return read_word_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
+UINT16 io_read_word_masked_16le(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
+}
+
UINT16 io_read_word_16be(offs_t address)
{
return read_word_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
+UINT16 io_read_word_masked_16be(offs_t address, UINT16 mask)
+{
+ return read_word_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
+}
+
UINT32 io_read_dword_16le(offs_t address)
{
UINT32 result = io_read_word_16le(address + 0) << 0;
return result | (io_read_word_16le(address + 2) << 16);
}
+UINT32 io_read_dword_masked_16le(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0x0000ffff) result |= io_read_word_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & 0xffff0000) result |= io_read_word_masked_16le(address + 2, mask >> 16) << 16;
+ return result;
+}
+
UINT32 io_read_dword_16be(offs_t address)
{
UINT32 result = io_read_word_16be(address + 0) << 16;
return result | (io_read_word_16be(address + 2) << 0);
}
+UINT32 io_read_dword_masked_16be(offs_t address, UINT32 mask)
+{
+ UINT32 result = 0;
+ if (mask & 0xffff0000) result |= io_read_word_masked_16be(address + 0, mask >> 16) << 16;
+ if (mask & 0x0000ffff) result |= io_read_word_masked_16be(address + 2, mask >> 0) << 0;
+ return result;
+}
+
UINT64 io_read_qword_16le(offs_t address)
{
UINT64 result = (UINT64)io_read_dword_16le(address + 0) << 0;
return result | ((UINT64)io_read_dword_16le(address + 4) << 32);
}
+UINT64 io_read_qword_masked_16le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_16le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_16le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 io_read_qword_16be(offs_t address)
{
UINT64 result = (UINT64)io_read_dword_16le(address + 0) << 32;
return result | ((UINT64)io_read_dword_16le(address + 4) << 0);
}
+UINT64 io_read_qword_masked_16be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_16be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_16be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/***************************************************************************
@@ -4034,35 +4395,69 @@ void program_write_word_16le(offs_t address, UINT16 data)
write_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
+void program_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
+}
+
void program_write_word_16be(offs_t address, UINT16 data)
{
write_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
+void program_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
+}
+
void program_write_dword_16le(offs_t address, UINT32 data)
{
program_write_word_16le(address + 0, data >> 0);
program_write_word_16le(address + 2, data >> 16);
}
+void program_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) program_write_word_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) program_write_word_masked_16le(address + 2, data >> 16, mask >> 16);
+}
+
void program_write_dword_16be(offs_t address, UINT32 data)
{
program_write_word_16be(address + 0, data >> 16);
program_write_word_16be(address + 2, data >> 0);
}
+void program_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) program_write_word_masked_16be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) program_write_word_masked_16be(address + 2, data >> 0, mask >> 0);
+}
+
void program_write_qword_16le(offs_t address, UINT64 data)
{
program_write_dword_16le(address + 0, data >> 0);
program_write_dword_16le(address + 4, data >> 32);
}
+void program_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_16le(address + 4, data >> 32, mask >> 32);
+}
+
void program_write_qword_16be(offs_t address, UINT64 data)
{
program_write_dword_16be(address + 0, data >> 32);
program_write_dword_16be(address + 4, data >> 0);
}
+void program_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_16be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_16be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -4085,35 +4480,69 @@ void data_write_word_16le(offs_t address, UINT16 data)
write_word_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
+void data_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
+}
+
void data_write_word_16be(offs_t address, UINT16 data)
{
write_word_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
+void data_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
+}
+
void data_write_dword_16le(offs_t address, UINT32 data)
{
data_write_word_16le(address + 0, data >> 0);
data_write_word_16le(address + 2, data >> 16);
}
+void data_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) data_write_word_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) data_write_word_masked_16le(address + 2, data >> 16, mask >> 16);
+}
+
void data_write_dword_16be(offs_t address, UINT32 data)
{
data_write_word_16be(address + 0, data >> 16);
data_write_word_16be(address + 2, data >> 0);
}
+void data_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) data_write_word_masked_16be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) data_write_word_masked_16be(address + 2, data >> 0, mask >> 0);
+}
+
void data_write_qword_16le(offs_t address, UINT64 data)
{
data_write_dword_16le(address + 0, data >> 0);
data_write_dword_16le(address + 4, data >> 32);
}
+void data_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_16le(address + 4, data >> 32, mask >> 32);
+}
+
void data_write_qword_16be(offs_t address, UINT64 data)
{
data_write_dword_16be(address + 0, data >> 32);
data_write_dword_16be(address + 4, data >> 0);
}
+void data_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_16be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_16be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -4136,35 +4565,69 @@ void io_write_word_16le(offs_t address, UINT16 data)
write_word_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
+void io_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
+}
+
void io_write_word_16be(offs_t address, UINT16 data)
{
write_word_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
+void io_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask)
+{
+ write_word_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
+}
+
void io_write_dword_16le(offs_t address, UINT32 data)
{
io_write_word_16le(address + 0, data >> 0);
io_write_word_16le(address + 2, data >> 16);
}
+void io_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0x0000ffff) io_write_word_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & 0xffff0000) io_write_word_masked_16le(address + 2, data >> 16, mask >> 16);
+}
+
void io_write_dword_16be(offs_t address, UINT32 data)
{
io_write_word_16be(address + 0, data >> 16);
io_write_word_16be(address + 2, data >> 0);
}
+void io_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask)
+{
+ if (mask & 0xffff0000) io_write_word_masked_16be(address + 0, data >> 16, mask >> 16);
+ if (mask & 0x0000ffff) io_write_word_masked_16be(address + 2, data >> 0, mask >> 0);
+}
+
void io_write_qword_16le(offs_t address, UINT64 data)
{
io_write_dword_16le(address + 0, data >> 0);
io_write_dword_16le(address + 4, data >> 32);
}
+void io_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_16le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_16le(address + 4, data >> 32, mask >> 32);
+}
+
void io_write_qword_16be(offs_t address, UINT64 data)
{
io_write_dword_16be(address + 0, data >> 32);
io_write_dword_16be(address + 4, data >> 0);
}
+void io_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_16be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_16be(address + 4, data >> 0, mask >> 0);
+}
+
/***************************************************************************
@@ -4226,30 +4689,42 @@ UINT16 program_read_word_32le(offs_t address)
return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~(0xffff << shift)) >> shift;
}
+UINT16 program_read_word_masked_32le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~(mask << shift)) >> shift;
+}
+
UINT16 program_read_word_32be(offs_t address)
{
UINT32 shift = (~address & 2) * 8;
return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~(0xffff << shift)) >> shift;
}
+UINT16 program_read_word_masked_32be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~(mask << shift)) >> shift;
+}
+
UINT32 program_read_dword_32le(offs_t address)
{
return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
-UINT32 program_read_dword_32be(offs_t address)
+UINT32 program_read_dword_masked_32le(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
+ return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
}
-UINT32 program_read_dword_masked_32le(offs_t address, UINT32 mem_mask)
+UINT32 program_read_dword_32be(offs_t address)
{
- return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
-UINT32 program_read_dword_masked_32be(offs_t address, UINT32 mem_mask)
+UINT32 program_read_dword_masked_32be(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
}
UINT64 program_read_qword_32le(offs_t address)
@@ -4258,12 +4733,28 @@ UINT64 program_read_qword_32le(offs_t address)
return result | ((UINT64)program_read_dword_32le(address + 4) << 32);
}
+UINT64 program_read_qword_masked_32le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_32le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_32le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 program_read_qword_32be(offs_t address)
{
UINT64 result = (UINT64)program_read_dword_32le(address + 0) << 32;
return result | ((UINT64)program_read_dword_32le(address + 4) << 0);
}
+UINT64 program_read_qword_masked_32be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)program_read_dword_masked_32be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)program_read_dword_masked_32be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -4287,30 +4778,42 @@ UINT16 data_read_word_32le(offs_t address)
return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~(0xffff << shift)) >> shift;
}
+UINT16 data_read_word_masked_32le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~(mask << shift)) >> shift;
+}
+
UINT16 data_read_word_32be(offs_t address)
{
UINT32 shift = (~address & 2) * 8;
return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~(0xffff << shift)) >> shift;
}
+UINT16 data_read_word_masked_32be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~(mask << shift)) >> shift;
+}
+
UINT32 data_read_dword_32le(offs_t address)
{
return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
-UINT32 data_read_dword_32be(offs_t address)
+UINT32 data_read_dword_masked_32le(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
+ return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
}
-UINT32 data_read_dword_masked_32le(offs_t address, UINT32 mem_mask)
+UINT32 data_read_dword_32be(offs_t address)
{
- return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
-UINT32 data_read_dword_masked_32be(offs_t address, UINT32 mem_mask)
+UINT32 data_read_dword_masked_32be(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
}
UINT64 data_read_qword_32le(offs_t address)
@@ -4319,12 +4822,28 @@ UINT64 data_read_qword_32le(offs_t address)
return result | ((UINT64)data_read_dword_32le(address + 4) << 32);
}
+UINT64 data_read_qword_masked_32le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_32le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_32le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 data_read_qword_32be(offs_t address)
{
UINT64 result = (UINT64)data_read_dword_32le(address + 0) << 32;
return result | ((UINT64)data_read_dword_32le(address + 4) << 0);
}
+UINT64 data_read_qword_masked_32be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)data_read_dword_masked_32be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)data_read_dword_masked_32be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -4348,30 +4867,42 @@ UINT16 io_read_word_32le(offs_t address)
return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~(0xffff << shift)) >> shift;
}
+UINT16 io_read_word_masked_32le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~(mask << shift)) >> shift;
+}
+
UINT16 io_read_word_32be(offs_t address)
{
UINT32 shift = (~address & 2) * 8;
return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~(0xffff << shift)) >> shift;
}
+UINT16 io_read_word_masked_32be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~(mask << shift)) >> shift;
+}
+
UINT32 io_read_dword_32le(offs_t address)
{
return read_dword_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
-UINT32 io_read_dword_32be(offs_t address)
+UINT32 io_read_dword_masked_32le(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_IO, address, 0);
+ return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
}
-UINT32 io_read_dword_masked_32le(offs_t address, UINT32 mem_mask)
+UINT32 io_read_dword_32be(offs_t address)
{
- return read_dword_masked_generic(ADDRESS_SPACE_IO, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
-UINT32 io_read_dword_masked_32be(offs_t address, UINT32 mem_mask)
+UINT32 io_read_dword_masked_32be(offs_t address, UINT32 mask)
{
- return read_dword_masked_generic(ADDRESS_SPACE_IO, address, mem_mask);
+ return read_dword_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
}
UINT64 io_read_qword_32le(offs_t address)
@@ -4380,12 +4911,28 @@ UINT64 io_read_qword_32le(offs_t address)
return result | ((UINT64)io_read_dword_32le(address + 4) << 32);
}
+UINT64 io_read_qword_masked_32le(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_32le(address + 0, mask >> 0) << 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_32le(address + 4, mask >> 32) << 32;
+ return result;
+}
+
UINT64 io_read_qword_32be(offs_t address)
{
UINT64 result = (UINT64)io_read_dword_32le(address + 0) << 32;
return result | ((UINT64)io_read_dword_32le(address + 4) << 0);
}
+UINT64 io_read_qword_masked_32be(offs_t address, UINT64 mask)
+{
+ UINT64 result = 0;
+ if (mask & U64(0xffffffff00000000)) result |= (UINT64)io_read_dword_masked_32be(address + 0, mask >> 32) << 32;
+ if (mask & U64(0x00000000ffffffff)) result |= (UINT64)io_read_dword_masked_32be(address + 4, mask >> 0) << 0;
+ return result;
+}
+
/***************************************************************************
@@ -4447,30 +4994,42 @@ void program_write_word_32le(offs_t address, UINT16 data)
write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data << shift, ~(0xffff << shift));
}
+void program_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data << shift, ~(mask << shift));
+}
+
void program_write_word_32be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 2) * 8;
write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data << shift, ~(0xffff << shift));
}
+void program_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data << shift, ~(mask << shift));
+}
+
void program_write_dword_32le(offs_t address, UINT32 data)
{
write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
-void program_write_dword_32be(offs_t address, UINT32 data)
+void program_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
+ write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
}
-void program_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask)
+void program_write_dword_32be(offs_t address, UINT32 data)
{
- write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
-void program_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask)
+void program_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
}
void program_write_qword_32le(offs_t address, UINT64 data)
@@ -4479,12 +5038,24 @@ void program_write_qword_32le(offs_t address, UINT64 data)
program_write_dword_32le(address + 4, data >> 32);
}
+void program_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_32le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_32le(address + 4, data >> 32, mask >> 32);
+}
+
void program_write_qword_32be(offs_t address, UINT64 data)
{
program_write_dword_32be(address + 0, data >> 32);
program_write_dword_32be(address + 4, data >> 0);
}
+void program_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) program_write_dword_masked_32be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) program_write_dword_masked_32be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_DATA
@@ -4508,30 +5079,42 @@ void data_write_word_32le(offs_t address, UINT16 data)
write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data << shift, ~(0xffff << shift));
}
+void data_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data << shift, ~(mask << shift));
+}
+
void data_write_word_32be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 2) * 8;
write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data << shift, ~(0xffff << shift));
}
+void data_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data << shift, ~(mask << shift));
+}
+
void data_write_dword_32le(offs_t address, UINT32 data)
{
write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
-void data_write_dword_32be(offs_t address, UINT32 data)
+void data_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
+ write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
}
-void data_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask)
+void data_write_dword_32be(offs_t address, UINT32 data)
{
- write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
-void data_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask)
+void data_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
}
void data_write_qword_32le(offs_t address, UINT64 data)
@@ -4540,12 +5123,24 @@ void data_write_qword_32le(offs_t address, UINT64 data)
data_write_dword_32le(address + 4, data >> 32);
}
+void data_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_32le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_32le(address + 4, data >> 32, mask >> 32);
+}
+
void data_write_qword_32be(offs_t address, UINT64 data)
{
data_write_dword_32be(address + 0, data >> 32);
data_write_dword_32be(address + 4, data >> 0);
}
+void data_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) data_write_dword_masked_32be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) data_write_dword_masked_32be(address + 4, data >> 0, mask >> 0);
+}
+
/*-------------------------------------------------
ADDRESS_SPACE_IO
@@ -4569,30 +5164,42 @@ void io_write_word_32le(offs_t address, UINT16 data)
write_dword_masked_generic(ADDRESS_SPACE_IO, address, data << shift, ~(0xffff << shift));
}
+void io_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_IO, address, data << shift, ~(mask << shift));
+}
+
void io_write_word_32be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 2) * 8;
write_dword_masked_generic(ADDRESS_SPACE_IO, address, data << shift, ~(0xffff << shift));
}
+void io_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 2) * 8;
+ write_dword_masked_generic(ADDRESS_SPACE_IO, address, data << shift, ~(mask << shift));
+}
+
void io_write_dword_32le(offs_t address, UINT32 data)
{
write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
-void io_write_dword_32be(offs_t address, UINT32 data)
+void io_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
+ write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
}
-void io_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask)
+void io_write_dword_32be(offs_t address, UINT32 data)
{
- write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
-void io_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask)
+void io_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask)
{
- write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, mem_mask);
+ write_dword_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
}
void io_write_qword_32le(offs_t address, UINT64 data)
@@ -4601,12 +5208,24 @@ void io_write_qword_32le(offs_t address, UINT64 data)
io_write_dword_32le(address + 4, data >> 32);
}
+void io_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_32le(address + 0, data >> 0, mask >> 0);
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_32le(address + 4, data >> 32, mask >> 32);
+}
+
void io_write_qword_32be(offs_t address, UINT64 data)
{
io_write_dword_32be(address + 0, data >> 32);
io_write_dword_32be(address + 4, data >> 0);
}
+void io_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask)
+{
+ if (mask & U64(0xffffffff00000000)) io_write_dword_masked_32be(address + 0, data >> 32, mask >> 32);
+ if (mask & U64(0x00000000ffffffff)) io_write_dword_masked_32be(address + 4, data >> 0, mask >> 0);
+}
+
/***************************************************************************
@@ -4668,42 +5287,66 @@ UINT16 program_read_word_64le(offs_t address)
return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 program_read_word_masked_64le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT16 program_read_word_64be(offs_t address)
{
UINT32 shift = (~address & 6) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 program_read_word_masked_64be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 program_read_dword_64le(offs_t address)
{
UINT32 shift = (address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 program_read_dword_masked_64le(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 program_read_dword_64be(offs_t address)
{
UINT32 shift = (~address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 program_read_dword_masked_64be(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT64 program_read_qword_64le(offs_t address)
{
return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
-UINT64 program_read_qword_64be(offs_t address)
+UINT64 program_read_qword_masked_64le(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
}
-UINT64 program_read_qword_masked_64le(offs_t address, UINT64 mem_mask)
+UINT64 program_read_qword_64be(offs_t address)
{
- return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, 0);
}
-UINT64 program_read_qword_masked_64be(offs_t address, UINT64 mem_mask)
+UINT64 program_read_qword_masked_64be(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, ~mask);
}
@@ -4729,42 +5372,66 @@ UINT16 data_read_word_64le(offs_t address)
return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 data_read_word_masked_64le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT16 data_read_word_64be(offs_t address)
{
UINT32 shift = (~address & 6) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 data_read_word_masked_64be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 data_read_dword_64le(offs_t address)
{
UINT32 shift = (address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 data_read_dword_masked_64le(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 data_read_dword_64be(offs_t address)
{
UINT32 shift = (~address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 data_read_dword_masked_64be(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT64 data_read_qword_64le(offs_t address)
{
return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
-UINT64 data_read_qword_64be(offs_t address)
+UINT64 data_read_qword_masked_64le(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
}
-UINT64 data_read_qword_masked_64le(offs_t address, UINT64 mem_mask)
+UINT64 data_read_qword_64be(offs_t address)
{
- return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, 0);
}
-UINT64 data_read_qword_masked_64be(offs_t address, UINT64 mem_mask)
+UINT64 data_read_qword_masked_64be(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_DATA, address, ~mask);
}
@@ -4790,42 +5457,66 @@ UINT16 io_read_word_64le(offs_t address)
return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 io_read_word_masked_64le(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT16 io_read_word_64be(offs_t address)
{
UINT32 shift = (~address & 6) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)0xffff << shift)) >> shift;
}
+UINT16 io_read_word_masked_64be(offs_t address, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 io_read_dword_64le(offs_t address)
{
UINT32 shift = (address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 io_read_dword_masked_64le(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT32 io_read_dword_64be(offs_t address)
{
UINT32 shift = (~address & 4) * 8;
return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)0xffffffff << shift)) >> shift;
}
+UINT32 io_read_dword_masked_64be(offs_t address, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~((UINT64)mask << shift)) >> shift;
+}
+
UINT64 io_read_qword_64le(offs_t address)
{
return read_qword_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
-UINT64 io_read_qword_64be(offs_t address)
+UINT64 io_read_qword_masked_64le(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_IO, address, 0);
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
}
-UINT64 io_read_qword_masked_64le(offs_t address, UINT64 mem_mask)
+UINT64 io_read_qword_64be(offs_t address)
{
- return read_qword_masked_generic(ADDRESS_SPACE_IO, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, 0);
}
-UINT64 io_read_qword_masked_64be(offs_t address, UINT64 mem_mask)
+UINT64 io_read_qword_masked_64be(offs_t address, UINT64 mask)
{
- return read_qword_masked_generic(ADDRESS_SPACE_IO, address, mem_mask);
+ return read_qword_masked_generic(ADDRESS_SPACE_IO, address, ~mask);
}
@@ -4889,42 +5580,66 @@ void program_write_word_64le(offs_t address, UINT16 data)
write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void program_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void program_write_word_64be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 6) * 8;
write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void program_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void program_write_dword_64le(offs_t address, UINT32 data)
{
UINT32 shift = (address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void program_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void program_write_dword_64be(offs_t address, UINT32 data)
{
UINT32 shift = (~address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void program_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void program_write_qword_64le(offs_t address, UINT64 data)
{
write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
-void program_write_qword_64be(offs_t address, UINT64 data)
+void program_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
}
-void program_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask)
+void program_write_qword_64be(offs_t address, UINT64 data)
{
- write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, 0);
}
-void program_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask)
+void program_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_PROGRAM, address, data, ~mask);
}
@@ -4950,42 +5665,66 @@ void data_write_word_64le(offs_t address, UINT16 data)
write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void data_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void data_write_word_64be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 6) * 8;
write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void data_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void data_write_dword_64le(offs_t address, UINT32 data)
{
UINT32 shift = (address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void data_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void data_write_dword_64be(offs_t address, UINT32 data)
{
UINT32 shift = (~address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void data_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void data_write_qword_64le(offs_t address, UINT64 data)
{
write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
-void data_write_qword_64be(offs_t address, UINT64 data)
+void data_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
}
-void data_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask)
+void data_write_qword_64be(offs_t address, UINT64 data)
{
- write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, 0);
}
-void data_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask)
+void data_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_DATA, address, data, ~mask);
}
@@ -5011,40 +5750,64 @@ void io_write_word_64le(offs_t address, UINT16 data)
write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void io_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void io_write_word_64be(offs_t address, UINT16 data)
{
UINT32 shift = (~address & 6) * 8;
write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)0xffff << shift));
}
+void io_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask)
+{
+ UINT32 shift = (~address & 6) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void io_write_dword_64le(offs_t address, UINT32 data)
{
UINT32 shift = (address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void io_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void io_write_dword_64be(offs_t address, UINT32 data)
{
UINT32 shift = (~address & 4) * 8;
write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)0xffffffff << shift));
}
+void io_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask)
+{
+ UINT32 shift = (~address & 4) * 8;
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, (UINT64)data << shift, ~((UINT64)mask << shift));
+}
+
void io_write_qword_64le(offs_t address, UINT64 data)
{
write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
-void io_write_qword_64be(offs_t address, UINT64 data)
+void io_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
}
-void io_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask)
+void io_write_qword_64be(offs_t address, UINT64 data)
{
- write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, 0);
}
-void io_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask)
+void io_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask)
{
- write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, mem_mask);
+ write_qword_masked_generic(ADDRESS_SPACE_IO, address, data, ~mask);
}
diff --git a/src/emu/memory.h b/src/emu/memory.h
index 94e6239c203..837ae0f7b00 100644
--- a/src/emu/memory.h
+++ b/src/emu/memory.h
@@ -125,6 +125,7 @@ struct _data_accessors
UINT8 (*read_byte)(offs_t byteaddress);
UINT16 (*read_word)(offs_t byteaddress);
+ UINT16 (*read_word_masked)(offs_t byteaddress, UINT16 mask);
UINT32 (*read_dword)(offs_t byteaddress);
UINT32 (*read_dword_masked)(offs_t byteaddress, UINT32 mask);
UINT64 (*read_qword)(offs_t byteaddress);
@@ -132,6 +133,7 @@ struct _data_accessors
void (*write_byte)(offs_t byteaddress, UINT8 data);
void (*write_word)(offs_t byteaddress, UINT16 data);
+ void (*write_word_masked)(offs_t byteaddress, UINT16 data, UINT16 mask);
void (*write_dword)(offs_t byteaddress, UINT32 data);
void (*write_dword_masked)(offs_t byteaddress, UINT32 data, UINT32 mask);
void (*write_qword)(offs_t byteaddress, UINT64 data);
@@ -957,247 +959,367 @@ INLINE UINT64 cpu_readop_arg64(offs_t byteaddress) { if (address_is_unsafe(bytea
/* declare program address space handlers */
UINT8 program_read_byte_8le(offs_t address);
UINT16 program_read_word_8le(offs_t address);
+UINT16 program_read_word_masked_8le(offs_t address, UINT16 mask);
UINT32 program_read_dword_8le(offs_t address);
+UINT32 program_read_dword_masked_8le(offs_t address, UINT32 mask);
UINT64 program_read_qword_8le(offs_t address);
+UINT64 program_read_qword_masked_8le(offs_t address, UINT64 mask);
void program_write_byte_8le(offs_t address, UINT8 data);
void program_write_word_8le(offs_t address, UINT16 data);
+void program_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_8le(offs_t address, UINT32 data);
+void program_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_8le(offs_t address, UINT64 data);
+void program_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_8be(offs_t address);
UINT16 program_read_word_8be(offs_t address);
+UINT16 program_read_word_masked_8be(offs_t address, UINT16 mask);
UINT32 program_read_dword_8be(offs_t address);
+UINT32 program_read_dword_masked_8be(offs_t address, UINT32 mask);
UINT64 program_read_qword_8be(offs_t address);
+UINT64 program_read_qword_masked_8be(offs_t address, UINT64 mask);
void program_write_byte_8be(offs_t address, UINT8 data);
void program_write_word_8be(offs_t address, UINT16 data);
+void program_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_8be(offs_t address, UINT32 data);
+void program_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_8be(offs_t address, UINT64 data);
+void program_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_16le(offs_t address);
UINT16 program_read_word_16le(offs_t address);
+UINT16 program_read_word_masked_16le(offs_t address, UINT16 mask);
UINT32 program_read_dword_16le(offs_t address);
+UINT32 program_read_dword_masked_16le(offs_t address, UINT32 mask);
UINT64 program_read_qword_16le(offs_t address);
+UINT64 program_read_qword_masked_16le(offs_t address, UINT64 mask);
void program_write_byte_16le(offs_t address, UINT8 data);
void program_write_word_16le(offs_t address, UINT16 data);
+void program_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_16le(offs_t address, UINT32 data);
+void program_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_16le(offs_t address, UINT64 data);
+void program_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_16be(offs_t address);
UINT16 program_read_word_16be(offs_t address);
+UINT16 program_read_word_masked_16be(offs_t address, UINT16 mask);
UINT32 program_read_dword_16be(offs_t address);
+UINT32 program_read_dword_masked_16be(offs_t address, UINT32 mask);
UINT64 program_read_qword_16be(offs_t address);
+UINT64 program_read_qword_masked_16be(offs_t address, UINT64 mask);
void program_write_byte_16be(offs_t address, UINT8 data);
void program_write_word_16be(offs_t address, UINT16 data);
+void program_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_16be(offs_t address, UINT32 data);
+void program_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_16be(offs_t address, UINT64 data);
+void program_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_32le(offs_t address);
UINT16 program_read_word_32le(offs_t address);
+UINT16 program_read_word_masked_32le(offs_t address, UINT16 mask);
UINT32 program_read_dword_32le(offs_t address);
-UINT32 program_read_dword_masked_32le(offs_t address, UINT32 mem_mask);
+UINT32 program_read_dword_masked_32le(offs_t address, UINT32 mask);
UINT64 program_read_qword_32le(offs_t address);
+UINT64 program_read_qword_masked_32le(offs_t address, UINT64 mask);
void program_write_byte_32le(offs_t address, UINT8 data);
void program_write_word_32le(offs_t address, UINT16 data);
+void program_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_32le(offs_t address, UINT32 data);
-void program_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask);
+void program_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_32le(offs_t address, UINT64 data);
+void program_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_32be(offs_t address);
UINT16 program_read_word_32be(offs_t address);
+UINT16 program_read_word_masked_32be(offs_t address, UINT16 mask);
UINT32 program_read_dword_32be(offs_t address);
-UINT32 program_read_dword_masked_32be(offs_t address, UINT32 mem_mask);
+UINT32 program_read_dword_masked_32be(offs_t address, UINT32 mask);
UINT64 program_read_qword_32be(offs_t address);
+UINT64 program_read_qword_masked_32be(offs_t address, UINT64 mask);
void program_write_byte_32be(offs_t address, UINT8 data);
void program_write_word_32be(offs_t address, UINT16 data);
+void program_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_32be(offs_t address, UINT32 data);
-void program_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask);
+void program_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_32be(offs_t address, UINT64 data);
+void program_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_64le(offs_t address);
UINT16 program_read_word_64le(offs_t address);
+UINT16 program_read_word_masked_64le(offs_t address, UINT16 mask);
UINT32 program_read_dword_64le(offs_t address);
+UINT32 program_read_dword_masked_64le(offs_t address, UINT32 mask);
UINT64 program_read_qword_64le(offs_t address);
-UINT64 program_read_qword_masked_64le(offs_t address, UINT64 mem_mask);
+UINT64 program_read_qword_masked_64le(offs_t address, UINT64 mask);
void program_write_byte_64le(offs_t address, UINT8 data);
void program_write_word_64le(offs_t address, UINT16 data);
+void program_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_64le(offs_t address, UINT32 data);
+void program_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_64le(offs_t address, UINT64 data);
-void program_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask);
+void program_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask);
UINT8 program_read_byte_64be(offs_t address);
UINT16 program_read_word_64be(offs_t address);
+UINT16 program_read_word_masked_64be(offs_t address, UINT16 mask);
UINT32 program_read_dword_64be(offs_t address);
+UINT32 program_read_dword_masked_64be(offs_t address, UINT32 mask);
UINT64 program_read_qword_64be(offs_t address);
-UINT64 program_read_qword_masked_64be(offs_t address, UINT64 mem_mask);
+UINT64 program_read_qword_masked_64be(offs_t address, UINT64 mask);
void program_write_byte_64be(offs_t address, UINT8 data);
void program_write_word_64be(offs_t address, UINT16 data);
+void program_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask);
void program_write_dword_64be(offs_t address, UINT32 data);
+void program_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask);
void program_write_qword_64be(offs_t address, UINT64 data);
-void program_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask);
+void program_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask);
/* declare data address space handlers */
UINT8 data_read_byte_8le(offs_t address);
UINT16 data_read_word_8le(offs_t address);
+UINT16 data_read_word_masked_8le(offs_t address, UINT16 mask);
UINT32 data_read_dword_8le(offs_t address);
+UINT32 data_read_dword_masked_8le(offs_t address, UINT32 mask);
UINT64 data_read_qword_8le(offs_t address);
+UINT64 data_read_qword_masked_8le(offs_t address, UINT64 mask);
void data_write_byte_8le(offs_t address, UINT8 data);
void data_write_word_8le(offs_t address, UINT16 data);
+void data_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_8le(offs_t address, UINT32 data);
+void data_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_8le(offs_t address, UINT64 data);
+void data_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_8be(offs_t address);
UINT16 data_read_word_8be(offs_t address);
+UINT16 data_read_word_masked_8be(offs_t address, UINT16 mask);
UINT32 data_read_dword_8be(offs_t address);
+UINT32 data_read_dword_masked_8be(offs_t address, UINT32 mask);
UINT64 data_read_qword_8be(offs_t address);
+UINT64 data_read_qword_masked_8be(offs_t address, UINT64 mask);
void data_write_byte_8be(offs_t address, UINT8 data);
void data_write_word_8be(offs_t address, UINT16 data);
+void data_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_8be(offs_t address, UINT32 data);
+void data_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_8be(offs_t address, UINT64 data);
+void data_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_16le(offs_t address);
UINT16 data_read_word_16le(offs_t address);
+UINT16 data_read_word_masked_16le(offs_t address, UINT16 mask);
UINT32 data_read_dword_16le(offs_t address);
+UINT32 data_read_dword_masked_16le(offs_t address, UINT32 mask);
UINT64 data_read_qword_16le(offs_t address);
+UINT64 data_read_qword_masked_16le(offs_t address, UINT64 mask);
void data_write_byte_16le(offs_t address, UINT8 data);
void data_write_word_16le(offs_t address, UINT16 data);
+void data_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_16le(offs_t address, UINT32 data);
+void data_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_16le(offs_t address, UINT64 data);
+void data_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_16be(offs_t address);
UINT16 data_read_word_16be(offs_t address);
+UINT16 data_read_word_masked_16be(offs_t address, UINT16 mask);
UINT32 data_read_dword_16be(offs_t address);
+UINT32 data_read_dword_masked_16be(offs_t address, UINT32 mask);
UINT64 data_read_qword_16be(offs_t address);
+UINT64 data_read_qword_masked_16be(offs_t address, UINT64 mask);
void data_write_byte_16be(offs_t address, UINT8 data);
void data_write_word_16be(offs_t address, UINT16 data);
+void data_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_16be(offs_t address, UINT32 data);
+void data_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_16be(offs_t address, UINT64 data);
+void data_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_32le(offs_t address);
UINT16 data_read_word_32le(offs_t address);
+UINT16 data_read_word_masked_32le(offs_t address, UINT16 mask);
UINT32 data_read_dword_32le(offs_t address);
-UINT32 data_read_dword_masked_32le(offs_t address, UINT32 mem_mask);
+UINT32 data_read_dword_masked_32le(offs_t address, UINT32 mask);
UINT64 data_read_qword_32le(offs_t address);
+UINT64 data_read_qword_masked_32le(offs_t address, UINT64 mask);
void data_write_byte_32le(offs_t address, UINT8 data);
void data_write_word_32le(offs_t address, UINT16 data);
+void data_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_32le(offs_t address, UINT32 data);
-void data_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask);
+void data_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_32le(offs_t address, UINT64 data);
+void data_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_32be(offs_t address);
UINT16 data_read_word_32be(offs_t address);
+UINT16 data_read_word_masked_32be(offs_t address, UINT16 mask);
UINT32 data_read_dword_32be(offs_t address);
-UINT32 data_read_dword_masked_32be(offs_t address, UINT32 mem_mask);
+UINT32 data_read_dword_masked_32be(offs_t address, UINT32 mask);
UINT64 data_read_qword_32be(offs_t address);
+UINT64 data_read_qword_masked_32be(offs_t address, UINT64 mask);
void data_write_byte_32be(offs_t address, UINT8 data);
void data_write_word_32be(offs_t address, UINT16 data);
+void data_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_32be(offs_t address, UINT32 data);
-void data_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask);
+void data_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_32be(offs_t address, UINT64 data);
+void data_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_64le(offs_t address);
UINT16 data_read_word_64le(offs_t address);
+UINT16 data_read_word_masked_64le(offs_t address, UINT16 mask);
UINT32 data_read_dword_64le(offs_t address);
+UINT32 data_read_dword_masked_64le(offs_t address, UINT32 mask);
UINT64 data_read_qword_64le(offs_t address);
-UINT64 data_read_qword_masked_64le(offs_t address, UINT64 mem_mask);
+UINT64 data_read_qword_masked_64le(offs_t address, UINT64 mask);
void data_write_byte_64le(offs_t address, UINT8 data);
void data_write_word_64le(offs_t address, UINT16 data);
+void data_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_64le(offs_t address, UINT32 data);
+void data_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_64le(offs_t address, UINT64 data);
-void data_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask);
+void data_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask);
UINT8 data_read_byte_64be(offs_t address);
UINT16 data_read_word_64be(offs_t address);
+UINT16 data_read_word_masked_64be(offs_t address, UINT16 mask);
UINT32 data_read_dword_64be(offs_t address);
+UINT32 data_read_dword_masked_64be(offs_t address, UINT32 mask);
UINT64 data_read_qword_64be(offs_t address);
-UINT64 data_read_qword_masked_64be(offs_t address, UINT64 mem_mask);
+UINT64 data_read_qword_masked_64be(offs_t address, UINT64 mask);
void data_write_byte_64be(offs_t address, UINT8 data);
void data_write_word_64be(offs_t address, UINT16 data);
+void data_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask);
void data_write_dword_64be(offs_t address, UINT32 data);
+void data_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask);
void data_write_qword_64be(offs_t address, UINT64 data);
-void data_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask);
+void data_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask);
/* declare io address space handlers */
UINT8 io_read_byte_8le(offs_t address);
UINT16 io_read_word_8le(offs_t address);
+UINT16 io_read_word_masked_8le(offs_t address, UINT16 mask);
UINT32 io_read_dword_8le(offs_t address);
+UINT32 io_read_dword_masked_8le(offs_t address, UINT32 mask);
UINT64 io_read_qword_8le(offs_t address);
+UINT64 io_read_qword_masked_8le(offs_t address, UINT64 mask);
void io_write_byte_8le(offs_t address, UINT8 data);
void io_write_word_8le(offs_t address, UINT16 data);
+void io_write_word_masked_8le(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_8le(offs_t address, UINT32 data);
+void io_write_dword_masked_8le(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_8le(offs_t address, UINT64 data);
+void io_write_qword_masked_8le(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_8be(offs_t address);
UINT16 io_read_word_8be(offs_t address);
+UINT16 io_read_word_masked_8be(offs_t address, UINT16 mask);
UINT32 io_read_dword_8be(offs_t address);
+UINT32 io_read_dword_masked_8be(offs_t address, UINT32 mask);
UINT64 io_read_qword_8be(offs_t address);
+UINT64 io_read_qword_masked_8be(offs_t address, UINT64 mask);
void io_write_byte_8be(offs_t address, UINT8 data);
void io_write_word_8be(offs_t address, UINT16 data);
+void io_write_word_masked_8be(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_8be(offs_t address, UINT32 data);
+void io_write_dword_masked_8be(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_8be(offs_t address, UINT64 data);
+void io_write_qword_masked_8be(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_16le(offs_t address);
UINT16 io_read_word_16le(offs_t address);
+UINT16 io_read_word_masked_16le(offs_t address, UINT16 mask);
UINT32 io_read_dword_16le(offs_t address);
+UINT32 io_read_dword_masked_16le(offs_t address, UINT32 mask);
UINT64 io_read_qword_16le(offs_t address);
+UINT64 io_read_qword_masked_16le(offs_t address, UINT64 mask);
void io_write_byte_16le(offs_t address, UINT8 data);
void io_write_word_16le(offs_t address, UINT16 data);
+void io_write_word_masked_16le(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_16le(offs_t address, UINT32 data);
+void io_write_dword_masked_16le(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_16le(offs_t address, UINT64 data);
+void io_write_qword_masked_16le(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_16be(offs_t address);
UINT16 io_read_word_16be(offs_t address);
+UINT16 io_read_word_masked_16be(offs_t address, UINT16 mask);
UINT32 io_read_dword_16be(offs_t address);
+UINT32 io_read_dword_masked_16be(offs_t address, UINT32 mask);
UINT64 io_read_qword_16be(offs_t address);
+UINT64 io_read_qword_masked_16be(offs_t address, UINT64 mask);
void io_write_byte_16be(offs_t address, UINT8 data);
void io_write_word_16be(offs_t address, UINT16 data);
+void io_write_word_masked_16be(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_16be(offs_t address, UINT32 data);
+void io_write_dword_masked_16be(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_16be(offs_t address, UINT64 data);
+void io_write_qword_masked_16be(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_32le(offs_t address);
UINT16 io_read_word_32le(offs_t address);
+UINT16 io_read_word_masked_32le(offs_t address, UINT16 mask);
UINT32 io_read_dword_32le(offs_t address);
-UINT32 io_read_dword_masked_32le(offs_t address, UINT32 mem_mask);
+UINT32 io_read_dword_masked_32le(offs_t address, UINT32 mask);
UINT64 io_read_qword_32le(offs_t address);
+UINT64 io_read_qword_masked_32le(offs_t address, UINT64 mask);
void io_write_byte_32le(offs_t address, UINT8 data);
void io_write_word_32le(offs_t address, UINT16 data);
+void io_write_word_masked_32le(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_32le(offs_t address, UINT32 data);
-void io_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mem_mask);
+void io_write_dword_masked_32le(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_32le(offs_t address, UINT64 data);
+void io_write_qword_masked_32le(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_32be(offs_t address);
UINT16 io_read_word_32be(offs_t address);
+UINT16 io_read_word_masked_32be(offs_t address, UINT16 mask);
UINT32 io_read_dword_32be(offs_t address);
-UINT32 io_read_dword_masked_32be(offs_t address, UINT32 mem_mask);
+UINT32 io_read_dword_masked_32be(offs_t address, UINT32 mask);
UINT64 io_read_qword_32be(offs_t address);
+UINT64 io_read_qword_masked_32be(offs_t address, UINT64 mask);
void io_write_byte_32be(offs_t address, UINT8 data);
void io_write_word_32be(offs_t address, UINT16 data);
+void io_write_word_masked_32be(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_32be(offs_t address, UINT32 data);
-void io_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mem_mask);
+void io_write_dword_masked_32be(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_32be(offs_t address, UINT64 data);
+void io_write_qword_masked_32be(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_64le(offs_t address);
UINT16 io_read_word_64le(offs_t address);
+UINT16 io_read_word_masked_64le(offs_t address, UINT16 mask);
UINT32 io_read_dword_64le(offs_t address);
+UINT32 io_read_dword_masked_64le(offs_t address, UINT32 mask);
UINT64 io_read_qword_64le(offs_t address);
-UINT64 io_read_qword_masked_64le(offs_t address, UINT64 mem_mask);
+UINT64 io_read_qword_masked_64le(offs_t address, UINT64 mask);
void io_write_byte_64le(offs_t address, UINT8 data);
void io_write_word_64le(offs_t address, UINT16 data);
+void io_write_word_masked_64le(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_64le(offs_t address, UINT32 data);
+void io_write_dword_masked_64le(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_64le(offs_t address, UINT64 data);
-void io_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mem_mask);
+void io_write_qword_masked_64le(offs_t address, UINT64 data, UINT64 mask);
UINT8 io_read_byte_64be(offs_t address);
UINT16 io_read_word_64be(offs_t address);
+UINT16 io_read_word_masked_64be(offs_t address, UINT16 mask);
UINT32 io_read_dword_64be(offs_t address);
+UINT32 io_read_dword_masked_64be(offs_t address, UINT32 mask);
UINT64 io_read_qword_64be(offs_t address);
-UINT64 io_read_qword_masked_64be(offs_t address, UINT64 mem_mask);
+UINT64 io_read_qword_masked_64be(offs_t address, UINT64 mask);
void io_write_byte_64be(offs_t address, UINT8 data);
void io_write_word_64be(offs_t address, UINT16 data);
+void io_write_word_masked_64be(offs_t address, UINT16 data, UINT16 mask);
void io_write_dword_64be(offs_t address, UINT32 data);
+void io_write_dword_masked_64be(offs_t address, UINT32 data, UINT32 mask);
void io_write_qword_64be(offs_t address, UINT64 data);
-void io_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mem_mask);
+void io_write_qword_masked_64be(offs_t address, UINT64 data, UINT64 mask);
#endif /* __MEMORY_H__ */