fix memory copies

This commit is contained in:
Garrett Smith 2026-01-18 01:37:18 -08:00
parent 8eaa83204a
commit d990ef0bfc
5 changed files with 41 additions and 27 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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) {