@@ -974,11 +974,14 @@ drcbe_arm64::drcbe_arm64(drcuml_state &drcuml, device_t &device, drc_cache &cach
974
974
m_drcmap_get_value.set (m_map, &drc_map_variables::get_value);
975
975
if (!m_drcmap_get_value)
976
976
throw emu_fatalerror (" Error resolving map variable get value function!\n " );
977
- m_resolved_accessors .resize (m_space.size ());
977
+ m_memory_accessors .resize (m_space.size ());
978
978
for (int space = 0 ; m_space.size () > space; ++space)
979
979
{
980
980
if (m_space[space])
981
- m_resolved_accessors[space].set (*m_space[space]);
981
+ {
982
+ m_memory_accessors[space].resolved .set (*m_space[space]);
983
+ m_memory_accessors[space].specific = m_space[space]->specific_accessors ();
984
+ }
982
985
}
983
986
}
984
987
@@ -2046,29 +2049,29 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst)
2046
2049
const parameter &spacesizep = inst.param (2 );
2047
2050
assert (spacesizep.is_size_space ());
2048
2051
2049
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
2052
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
2050
2053
2051
2054
mov_reg_param (a, 4 , REG_PARAM2, addrp);
2052
2055
2053
2056
if (spacesizep.size () == SIZE_BYTE)
2054
2057
{
2055
- get_imm_relative (a, REG_PARAM1, resolved.read_byte .obj );
2056
- call_arm_addr (a, resolved.read_byte .func );
2058
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_byte .obj );
2059
+ call_arm_addr (a, accessors. resolved .read_byte .func );
2057
2060
}
2058
2061
else if (spacesizep.size () == SIZE_WORD)
2059
2062
{
2060
- get_imm_relative (a, REG_PARAM1, resolved.read_word .obj );
2061
- call_arm_addr (a, resolved.read_word .func );
2063
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_word .obj );
2064
+ call_arm_addr (a, accessors. resolved .read_word .func );
2062
2065
}
2063
2066
else if (spacesizep.size () == SIZE_DWORD)
2064
2067
{
2065
- get_imm_relative (a, REG_PARAM1, resolved.read_dword .obj );
2066
- call_arm_addr (a, resolved.read_dword .func );
2068
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_dword .obj );
2069
+ call_arm_addr (a, accessors. resolved .read_dword .func );
2067
2070
}
2068
2071
else if (spacesizep.size () == SIZE_QWORD)
2069
2072
{
2070
- get_imm_relative (a, REG_PARAM1, resolved.read_qword .obj );
2071
- call_arm_addr (a, resolved.read_qword .func );
2073
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_qword .obj );
2074
+ call_arm_addr (a, accessors. resolved .read_qword .func );
2072
2075
}
2073
2076
2074
2077
mov_param_reg (a, inst.size (), dstp, REG_PARAM1);
@@ -2086,30 +2089,30 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst)
2086
2089
const parameter &spacesizep = inst.param (3 );
2087
2090
assert (spacesizep.is_size_space ());
2088
2091
2089
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
2092
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
2090
2093
2091
2094
mov_reg_param (a, 4 , REG_PARAM2, addrp);
2092
2095
mov_reg_param (a, inst.size (), REG_PARAM3, maskp);
2093
2096
2094
2097
if (spacesizep.size () == SIZE_BYTE)
2095
2098
{
2096
- get_imm_relative (a, REG_PARAM1, resolved.read_byte_masked .obj );
2097
- call_arm_addr (a, resolved.read_byte_masked .func );
2099
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_byte_masked .obj );
2100
+ call_arm_addr (a, accessors. resolved .read_byte_masked .func );
2098
2101
}
2099
2102
else if (spacesizep.size () == SIZE_WORD)
2100
2103
{
2101
- get_imm_relative (a, REG_PARAM1, resolved.read_word_masked .obj );
2102
- call_arm_addr (a, resolved.read_word_masked .func );
2104
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_word_masked .obj );
2105
+ call_arm_addr (a, accessors. resolved .read_word_masked .func );
2103
2106
}
2104
2107
else if (spacesizep.size () == SIZE_DWORD)
2105
2108
{
2106
- get_imm_relative (a, REG_PARAM1, resolved.read_dword_masked .obj );
2107
- call_arm_addr (a, resolved.read_dword_masked .func );
2109
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_dword_masked .obj );
2110
+ call_arm_addr (a, accessors. resolved .read_dword_masked .func );
2108
2111
}
2109
2112
else if (spacesizep.size () == SIZE_QWORD)
2110
2113
{
2111
- get_imm_relative (a, REG_PARAM1, resolved.read_qword_masked .obj );
2112
- call_arm_addr (a, resolved.read_qword_masked .func );
2114
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_qword_masked .obj );
2115
+ call_arm_addr (a, accessors. resolved .read_qword_masked .func );
2113
2116
}
2114
2117
2115
2118
mov_param_reg (a, inst.size (), dstp, REG_PARAM1);
@@ -2126,30 +2129,30 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst)
2126
2129
const parameter &spacesizep = inst.param (2 );
2127
2130
assert (spacesizep.is_size_space ());
2128
2131
2129
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
2132
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
2130
2133
2131
2134
mov_reg_param (a, 4 , REG_PARAM2, addrp);
2132
2135
mov_reg_param (a, inst.size (), REG_PARAM3, srcp);
2133
2136
2134
2137
if (spacesizep.size () == SIZE_BYTE)
2135
2138
{
2136
- get_imm_relative (a, REG_PARAM1, resolved.write_byte .obj );
2137
- call_arm_addr (a, resolved.write_byte .func );
2139
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_byte .obj );
2140
+ call_arm_addr (a, accessors. resolved .write_byte .func );
2138
2141
}
2139
2142
else if (spacesizep.size () == SIZE_WORD)
2140
2143
{
2141
- get_imm_relative (a, REG_PARAM1, resolved.write_word .obj );
2142
- call_arm_addr (a, resolved.write_word .func );
2144
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_word .obj );
2145
+ call_arm_addr (a, accessors. resolved .write_word .func );
2143
2146
}
2144
2147
else if (spacesizep.size () == SIZE_DWORD)
2145
2148
{
2146
- get_imm_relative (a, REG_PARAM1, resolved.write_dword .obj );
2147
- call_arm_addr (a, resolved.write_dword .func );
2149
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_dword .obj );
2150
+ call_arm_addr (a, accessors. resolved .write_dword .func );
2148
2151
}
2149
2152
else if (spacesizep.size () == SIZE_QWORD)
2150
2153
{
2151
- get_imm_relative (a, REG_PARAM1, resolved.write_qword .obj );
2152
- call_arm_addr (a, resolved.write_qword .func );
2154
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_qword .obj );
2155
+ call_arm_addr (a, accessors. resolved .write_qword .func );
2153
2156
}
2154
2157
}
2155
2158
@@ -2166,31 +2169,31 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst)
2166
2169
assert (spacesizep.is_size_space ());
2167
2170
2168
2171
// set up a call to the write handler
2169
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
2172
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
2170
2173
2171
2174
mov_reg_param (a, 4 , REG_PARAM2, addrp);
2172
2175
mov_reg_param (a, inst.size (), REG_PARAM3, srcp);
2173
2176
mov_reg_param (a, inst.size (), REG_PARAM4, maskp);
2174
2177
2175
2178
if (spacesizep.size () == SIZE_BYTE)
2176
2179
{
2177
- get_imm_relative (a, REG_PARAM1, resolved.write_byte_masked .obj );
2178
- call_arm_addr (a, resolved.write_byte_masked .func );
2180
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_byte_masked .obj );
2181
+ call_arm_addr (a, accessors. resolved .write_byte_masked .func );
2179
2182
}
2180
2183
else if (spacesizep.size () == SIZE_WORD)
2181
2184
{
2182
- get_imm_relative (a, REG_PARAM1, resolved.write_word_masked .obj );
2183
- call_arm_addr (a, resolved.write_word_masked .func );
2185
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_word_masked .obj );
2186
+ call_arm_addr (a, accessors. resolved .write_word_masked .func );
2184
2187
}
2185
2188
else if (spacesizep.size () == SIZE_DWORD)
2186
2189
{
2187
- get_imm_relative (a, REG_PARAM1, resolved.write_dword_masked .obj );
2188
- call_arm_addr (a, resolved.write_dword_masked .func );
2190
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_dword_masked .obj );
2191
+ call_arm_addr (a, accessors. resolved .write_dword_masked .func );
2189
2192
}
2190
2193
else if (spacesizep.size () == SIZE_QWORD)
2191
2194
{
2192
- get_imm_relative (a, REG_PARAM1, resolved.write_qword_masked .obj );
2193
- call_arm_addr (a, resolved.write_qword_masked .func );
2195
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_qword_masked .obj );
2196
+ call_arm_addr (a, accessors. resolved .write_qword_masked .func );
2194
2197
}
2195
2198
}
2196
2199
@@ -3768,21 +3771,21 @@ void drcbe_arm64::op_fread(a64::Assembler &a, const uml::instruction &inst)
3768
3771
assert (spacesizep.is_size_space ());
3769
3772
assert ((1 << spacesizep.size ()) == inst.size ());
3770
3773
3771
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
3774
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
3772
3775
3773
3776
mov_reg_param (a, 4 , REG_PARAM2, addrp);
3774
3777
3775
3778
if (inst.size () == 4 )
3776
3779
{
3777
- get_imm_relative (a, REG_PARAM1, resolved.read_dword .obj );
3778
- call_arm_addr (a, resolved.read_dword .func );
3780
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_dword .obj );
3781
+ call_arm_addr (a, accessors. resolved .read_dword .func );
3779
3782
3780
3783
mov_float_param_int_reg (a, inst.size (), dstp, REG_PARAM1.w ());
3781
3784
}
3782
3785
else if (inst.size () == 8 )
3783
3786
{
3784
- get_imm_relative (a, REG_PARAM1, resolved.read_qword .obj );
3785
- call_arm_addr (a, resolved.read_qword .func );
3787
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .read_qword .obj );
3788
+ call_arm_addr (a, accessors. resolved .read_qword .func );
3786
3789
3787
3790
mov_float_param_int_reg (a, inst.size (), dstp, REG_PARAM1);
3788
3791
}
@@ -3800,7 +3803,7 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst)
3800
3803
assert (spacesizep.is_size_space ());
3801
3804
assert ((1 << spacesizep.size ()) == inst.size ());
3802
3805
3803
- const auto &resolved = m_resolved_accessors [spacesizep.space ()];
3806
+ auto const &accessors = m_memory_accessors [spacesizep.space ()];
3804
3807
3805
3808
mov_reg_param (a, 4 , REG_PARAM2, addrp);
3806
3809
mov_float_reg_param (a, inst.size (), TEMPF_REG1, srcp);
@@ -3809,13 +3812,13 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst)
3809
3812
3810
3813
if (inst.size () == 4 )
3811
3814
{
3812
- get_imm_relative (a, REG_PARAM1, resolved.write_dword .obj );
3813
- call_arm_addr (a, resolved.write_dword .func );
3815
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_dword .obj );
3816
+ call_arm_addr (a, accessors. resolved .write_dword .func );
3814
3817
}
3815
3818
else if (inst.size () == 8 )
3816
3819
{
3817
- get_imm_relative (a, REG_PARAM1, resolved.write_qword .obj );
3818
- call_arm_addr (a, resolved.write_qword .func );
3820
+ get_imm_relative (a, REG_PARAM1, accessors. resolved .write_qword .obj );
3821
+ call_arm_addr (a, accessors. resolved .write_qword .func );
3819
3822
}
3820
3823
}
3821
3824
0 commit comments