| 247 | } |
| 248 | |
| 249 | bool MacDolphinProcess::writeToRAM(const u32 offset, const char* buffer, const size_t size, |
| 250 | const bool withBSwap) |
| 251 | { |
| 252 | u64 RAMAddress = 0; |
| 253 | if (m_ARAMAccessible) |
| 254 | { |
| 255 | if (offset >= Common::ARAM_FAKESIZE) |
| 256 | RAMAddress = m_emuRAMAddressStart + offset - Common::ARAM_FAKESIZE; |
| 257 | else |
| 258 | RAMAddress = m_emuARAMAdressStart + offset; |
| 259 | } |
| 260 | else if (offset >= (Common::MEM2_START - Common::MEM1_START)) |
| 261 | { |
| 262 | RAMAddress = m_MEM2AddressStart + offset - (Common::MEM2_START - Common::MEM1_START); |
| 263 | } |
| 264 | else |
| 265 | { |
| 266 | RAMAddress = m_emuRAMAddressStart + offset; |
| 267 | } |
| 268 | |
| 269 | char* bufferCopy = new char[size]; |
| 270 | std::memcpy(bufferCopy, buffer, size); |
| 271 | |
| 272 | if (withBSwap) |
| 273 | { |
| 274 | switch (size) |
| 275 | { |
| 276 | case 2: |
| 277 | { |
| 278 | u16 halfword = 0; |
| 279 | std::memcpy(&halfword, bufferCopy, sizeof(u16)); |
| 280 | halfword = Common::bSwap16(halfword); |
| 281 | std::memcpy(bufferCopy, &halfword, sizeof(u16)); |
| 282 | break; |
| 283 | } |
| 284 | case 4: |
| 285 | { |
| 286 | u32 word = 0; |
| 287 | std::memcpy(&word, bufferCopy, sizeof(u32)); |
| 288 | word = Common::bSwap32(word); |
| 289 | std::memcpy(bufferCopy, &word, sizeof(u32)); |
| 290 | break; |
| 291 | } |
| 292 | case 8: |
| 293 | { |
| 294 | u64 doubleword = 0; |
| 295 | std::memcpy(&doubleword, bufferCopy, sizeof(u64)); |
| 296 | doubleword = Common::bSwap64(doubleword); |
| 297 | std::memcpy(bufferCopy, &doubleword, sizeof(u64)); |
| 298 | break; |
| 299 | } |
| 300 | default: |
| 301 | break; |
| 302 | } |
| 303 | } |
| 304 | |
| 305 | if (vm_write(m_task, RAMAddress, reinterpret_cast<vm_offset_t>(bufferCopy), |
| 306 | static_cast<mach_msg_type_number_t>(size)) != KERN_SUCCESS) |