mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-04-27 04:21:52 +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>
|
#include <ultramodern/ultra64.h>
|
||||||
|
|
||||||
constexpr int eeprom_block_size = 8;
|
constexpr int eeprom_block_size = 8;
|
||||||
|
static std::vector<uint8_t> save_buffer;
|
||||||
|
|
||||||
extern "C" void osEepromProbe_recomp(uint8_t* rdram, recomp_context* ctx) {
|
extern "C" void osEepromProbe_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||||
switch (ultramodern::get_save_type()) {
|
switch (ultramodern::get_save_type()) {
|
||||||
|
|
@ -31,7 +32,11 @@ extern "C" void osEepromWrite_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||||
gpr buffer = ctx->r6;
|
gpr buffer = ctx->r6;
|
||||||
int32_t nbytes = eeprom_block_size;
|
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;
|
ctx->r2 = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +53,11 @@ extern "C" void osEepromLongWrite_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||||
|
|
||||||
assert((nbytes % eeprom_block_size) == 0);
|
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;
|
ctx->r2 = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -63,7 +72,11 @@ extern "C" void osEepromRead_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||||
gpr buffer = ctx->r6;
|
gpr buffer = ctx->r6;
|
||||||
int32_t nbytes = eeprom_block_size;
|
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;
|
ctx->r2 = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -80,7 +93,11 @@ extern "C" void osEepromLongRead_recomp(uint8_t* rdram, recomp_context* ctx) {
|
||||||
|
|
||||||
assert((nbytes % eeprom_block_size) == 0);
|
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;
|
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;
|
constexpr uint32_t sector_count = flash_size / sector_size;
|
||||||
|
|
||||||
std::array<char, page_size> write_buffer;
|
std::array<char, page_size> write_buffer;
|
||||||
|
std::vector<uint8_t> save_buffer;
|
||||||
|
|
||||||
extern "C" void osFlashInit_recomp(uint8_t * rdram, recomp_context * ctx) {
|
extern "C" void osFlashInit_recomp(uint8_t * rdram, recomp_context * ctx) {
|
||||||
if (!ultramodern::flashram_allowed()) {
|
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;
|
uint32_t count = n_pages * page_size;
|
||||||
|
|
||||||
// Read from the save file into the provided buffer
|
// 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
|
// Send the message indicating read completion
|
||||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#include <ultramodern/ultramodern.hpp>
|
#include <ultramodern/ultramodern.hpp>
|
||||||
|
|
||||||
static std::vector<uint8_t> rom;
|
static std::vector<uint8_t> rom;
|
||||||
|
static std::vector<uint8_t> save_buffer;
|
||||||
|
|
||||||
bool recomp::is_rom_loaded() {
|
bool recomp::is_rom_loaded() {
|
||||||
return !rom.empty();
|
return !rom.empty();
|
||||||
|
|
@ -100,7 +101,11 @@ void do_dma(RDRAM_ARG PTR(OSMesgQueue) mq, gpr rdram_address, uint32_t physical_
|
||||||
ULTRAMODERN_QUICK_EXIT();
|
ULTRAMODERN_QUICK_EXIT();
|
||||||
}
|
}
|
||||||
// read sram
|
// 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
|
// Send a message to the mq to indicate that the transfer completed
|
||||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
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();
|
ULTRAMODERN_QUICK_EXIT();
|
||||||
}
|
}
|
||||||
// write sram
|
// 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
|
// Send a message to the mq to indicate that the transfer completed
|
||||||
ultramodern::enqueue_external_message_src(mq, 0, false, ultramodern::EventMessageSource::Pi);
|
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_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_ptr(void *out, uint32_t offset, uint32_t count);
|
||||||
|
|
||||||
void save_read(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count);
|
|
||||||
|
|
||||||
void save_clear(uint32_t start, uint32_t size, char value);
|
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();
|
save_context.write_sempahore.signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ultramodern::save_write(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++) {
|
|
||||||
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) {
|
|
||||||
assert(offset + count <= save_context.save_buffer.size());
|
assert(offset + count <= save_context.save_buffer.size());
|
||||||
|
|
||||||
std::lock_guard lock { save_context.save_buffer_mutex };
|
std::lock_guard lock { save_context.save_buffer_mutex };
|
||||||
for (uint32_t i = 0; i < count; i++) {
|
std::memcpy(out, &save_context.save_buffer[offset], count);
|
||||||
MEM_B(i, rdram_address) = save_context.save_buffer[offset + i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ultramodern::save_clear(uint32_t start, uint32_t size, char value) {
|
void ultramodern::save_clear(uint32_t start, uint32_t size, char value) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue