diff --git a/librecomp/src/eep.cpp b/librecomp/src/eep.cpp index 6cf55fb..94fedf6 100644 --- a/librecomp/src/eep.cpp +++ b/librecomp/src/eep.cpp @@ -5,6 +5,7 @@ #include constexpr int eeprom_block_size = 8; +static std::vector 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; } diff --git a/librecomp/src/flash.cpp b/librecomp/src/flash.cpp index e0de47c..9a877aa 100644 --- a/librecomp/src/flash.cpp +++ b/librecomp/src/flash.cpp @@ -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 write_buffer; +std::vector 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); diff --git a/librecomp/src/pi.cpp b/librecomp/src/pi.cpp index d1d9dab..67cd86d 100644 --- a/librecomp/src/pi.cpp +++ b/librecomp/src/pi.cpp @@ -12,6 +12,7 @@ #include static std::vector rom; +static std::vector 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); diff --git a/ultramodern/include/ultramodern/save.hpp b/ultramodern/include/ultramodern/save.hpp index 74dc683..568b900 100644 --- a/ultramodern/include/ultramodern/save.hpp +++ b/ultramodern/include/ultramodern/save.hpp @@ -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); diff --git a/ultramodern/src/save.cpp b/ultramodern/src/save.cpp index c1199cb..51a3bd8 100644 --- a/ultramodern/src/save.cpp +++ b/ultramodern/src/save.cpp @@ -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) {