mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-02-02 19:56:13 +00:00
fix memory copies
This commit is contained in:
parent
8eaa83204a
commit
d990ef0bfc
5 changed files with 41 additions and 27 deletions
|
|
@ -5,6 +5,7 @@
|
|||
#include <ultramodern/ultra64.h>
|
||||
|
||||
constexpr int eeprom_block_size = 8;
|
||||
static std::vector<uint8_t> save_buffer;
|
||||
|
||||
extern "C" void osEepromProbe_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||
switch (ultramodern::get_save_type()) {
|
||||
|
|
@ -31,7 +32,11 @@ extern "C" void osEepromWrite_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|||
gpr buffer = ctx->r6;
|
||||
int32_t nbytes = eeprom_block_size;
|
||||
|
||||
ultramodern::save_write(rdram, buffer, eep_address * eeprom_block_size, nbytes);
|
||||
save_buffer.resize(nbytes);
|
||||
for (uint32_t i = 0; i < nbytes; i++) {
|
||||
save_buffer[i] = MEM_B(i, buffer);
|
||||
}
|
||||
ultramodern::save_write_ptr(save_buffer.data(), eep_address * eeprom_block_size, nbytes);
|
||||
|
||||
ctx->r2 = 0;
|
||||
}
|
||||
|
|
@ -48,7 +53,11 @@ extern "C" void osEepromLongWrite_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|||
|
||||
assert((nbytes % eeprom_block_size) == 0);
|
||||
|
||||
ultramodern::save_write(rdram, buffer, eep_address * eeprom_block_size, nbytes);
|
||||
save_buffer.resize(nbytes);
|
||||
for (uint32_t i = 0; i < nbytes; i++) {
|
||||
save_buffer[i] = MEM_B(i, buffer);
|
||||
}
|
||||
ultramodern::save_write_ptr(save_buffer.data(), eep_address * eeprom_block_size, nbytes);
|
||||
|
||||
ctx->r2 = 0;
|
||||
}
|
||||
|
|
@ -63,7 +72,11 @@ extern "C" void osEepromRead_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|||
gpr buffer = ctx->r6;
|
||||
int32_t nbytes = eeprom_block_size;
|
||||
|
||||
ultramodern::save_read(rdram, buffer, eep_address * eeprom_block_size, nbytes);
|
||||
save_buffer.resize(nbytes);
|
||||
ultramodern::save_read_ptr(save_buffer.data(), eep_address * eeprom_block_size, nbytes);
|
||||
for (uint32_t i = 0; i < nbytes; i++) {
|
||||
MEM_B(i, buffer) = save_buffer[i];
|
||||
}
|
||||
|
||||
ctx->r2 = 0;
|
||||
}
|
||||
|
|
@ -80,7 +93,11 @@ extern "C" void osEepromLongRead_recomp(uint8_t* rdram, recomp_context* ctx) {
|
|||
|
||||
assert((nbytes % eeprom_block_size) == 0);
|
||||
|
||||
ultramodern::save_read(rdram, buffer, eep_address * eeprom_block_size, nbytes);
|
||||
save_buffer.resize(nbytes);
|
||||
ultramodern::save_read_ptr(save_buffer.data(), eep_address * eeprom_block_size, nbytes);
|
||||
for (uint32_t i = 0; i < nbytes; i++) {
|
||||
MEM_B(i, buffer) = save_buffer[i];
|
||||
}
|
||||
|
||||
ctx->r2 = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ constexpr uint32_t sector_size = page_size * pages_per_sector;
|
|||
constexpr uint32_t sector_count = flash_size / sector_size;
|
||||
|
||||
std::array<char, page_size> write_buffer;
|
||||
std::vector<uint8_t> save_buffer;
|
||||
|
||||
extern "C" void osFlashInit_recomp(uint8_t * rdram, recomp_context * ctx) {
|
||||
if (!ultramodern::flashram_allowed()) {
|
||||
|
|
@ -186,7 +187,11 @@ extern "C" void osFlashReadArray_recomp(uint8_t * rdram, recomp_context * ctx) {
|
|||
uint32_t count = n_pages * page_size;
|
||||
|
||||
// Read from the save file into the provided buffer
|
||||
ultramodern::save_read(PASS_RDRAM dramAddr, offset, count);
|
||||
save_buffer.resize(count);
|
||||
ultramodern::save_read_ptr(save_buffer.data(), offset, count);
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
MEM_B(i, dramAddr) = save_buffer[i];
|
||||
}
|
||||
|
||||
// Send the message indicating read completion
|
||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <ultramodern/ultramodern.hpp>
|
||||
|
||||
static std::vector<uint8_t> rom;
|
||||
static std::vector<uint8_t> save_buffer;
|
||||
|
||||
bool recomp::is_rom_loaded() {
|
||||
return !rom.empty();
|
||||
|
|
@ -100,7 +101,11 @@ void do_dma(RDRAM_ARG PTR(OSMesgQueue) mq, gpr rdram_address, uint32_t physical_
|
|||
ULTRAMODERN_QUICK_EXIT();
|
||||
}
|
||||
// read sram
|
||||
ultramodern::save_read(rdram, rdram_address, physical_addr - recomp::sram_base, size);
|
||||
save_buffer.resize(size);
|
||||
ultramodern::save_read_ptr(save_buffer.data(), physical_addr - recomp::sram_base, size);
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
MEM_B(i, rdram_address) = save_buffer[i];
|
||||
}
|
||||
|
||||
// Send a message to the mq to indicate that the transfer completed
|
||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
||||
|
|
@ -117,7 +122,11 @@ void do_dma(RDRAM_ARG PTR(OSMesgQueue) mq, gpr rdram_address, uint32_t physical_
|
|||
ULTRAMODERN_QUICK_EXIT();
|
||||
}
|
||||
// write sram
|
||||
ultramodern::save_write(rdram, rdram_address, physical_addr - recomp::sram_base, size);
|
||||
save_buffer.resize(size);
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
save_buffer[i] = MEM_B(i, rdram_address);
|
||||
}
|
||||
ultramodern::save_write_ptr(save_buffer.data(), physical_addr - recomp::sram_base, size);
|
||||
|
||||
// Send a message to the mq to indicate that the transfer completed
|
||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
||||
|
|
|
|||
|
|
@ -26,9 +26,7 @@ namespace ultramodern {
|
|||
|
||||
void save_write_ptr(const void* in, uint32_t offset, uint32_t count);
|
||||
|
||||
void save_write(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count);
|
||||
|
||||
void save_read(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count);
|
||||
void save_read_ptr(void *out, uint32_t offset, uint32_t count);
|
||||
|
||||
void save_clear(uint32_t start, uint32_t size, char value);
|
||||
|
||||
|
|
|
|||
|
|
@ -122,26 +122,11 @@ void ultramodern::save_write_ptr(const void* in, uint32_t offset, uint32_t count
|
|||
save_context.write_sempahore.signal();
|
||||
}
|
||||
|
||||
void ultramodern::save_write(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count) {
|
||||
assert(offset + count <= save_context.save_buffer.size());
|
||||
|
||||
{
|
||||
std::lock_guard lock { save_context.save_buffer_mutex };
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
save_context.save_buffer[offset + i] = MEM_B(i, rdram_address);
|
||||
}
|
||||
}
|
||||
|
||||
save_context.write_sempahore.signal();
|
||||
}
|
||||
|
||||
void ultramodern::save_read(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count) {
|
||||
void ultramodern::save_read_ptr(void *out, uint32_t offset, uint32_t count) {
|
||||
assert(offset + count <= save_context.save_buffer.size());
|
||||
|
||||
std::lock_guard lock { save_context.save_buffer_mutex };
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
MEM_B(i, rdram_address) = save_context.save_buffer[offset + i];
|
||||
}
|
||||
std::memcpy(out, &save_context.save_buffer[offset], count);
|
||||
}
|
||||
|
||||
void ultramodern::save_clear(uint32_t start, uint32_t size, char value) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue