From e4dc4526f2195ca6ed1cd6bf9b56e7dde8d5bc55 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Fri, 10 Mar 2023 16:37:40 -0500 Subject: [PATCH] Fixed flash erase function implementations --- src/flash.cpp | 19 ++++++++++--------- src/pi.cpp | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/flash.cpp b/src/flash.cpp index 070b983..3dcccea 100644 --- a/src/flash.cpp +++ b/src/flash.cpp @@ -7,13 +7,14 @@ constexpr uint32_t flash_size = 1024 * 1024 / 8; // 1Mbit constexpr uint32_t page_size = 128; constexpr uint32_t pages_per_sector = 128; +constexpr uint32_t page_count = flash_size / page_size; constexpr uint32_t sector_size = page_size * pages_per_sector; constexpr uint32_t sector_count = flash_size / sector_size; void save_write_ptr(const void* in, uint32_t offset, uint32_t count); void save_write(uint8_t* rdram, gpr rdram_address, uint32_t offset, uint32_t count); void save_read(uint8_t* rdram, gpr rdram_address, uint32_t offset, uint32_t count); -void save_clear(uint32_t start, uint32_t size); +void save_clear(uint32_t start, uint32_t size, char value); std::array write_buffer; @@ -41,43 +42,43 @@ extern "C" void osFlashClearStatus_recomp(uint8_t * rdram, recomp_context * ctx) } extern "C" void osFlashAllErase_recomp(uint8_t * rdram, recomp_context * ctx) { - save_clear(0, Multilibultra::save_size); + save_clear(0, Multilibultra::save_size, 0xFF); ctx->r2 = 0; } extern "C" void osFlashAllEraseThrough_recomp(uint8_t * rdram, recomp_context * ctx) { - save_clear(0, Multilibultra::save_size); + save_clear(0, Multilibultra::save_size, 0xFF); ctx->r2 = 0; } +// This function is named sector but really means page. extern "C" void osFlashSectorErase_recomp(uint8_t * rdram, recomp_context * ctx) { uint32_t page_num = (uint32_t)ctx->r4; - uint32_t sector_num = page_num / sector_size; // Prevent out of bounds erase - if (sector_num >= sector_size) { + if (page_num >= page_count) { ctx->r2 = -1; return; } - save_clear(sector_num * sector_size, sector_size); + save_clear(page_num * page_size, page_size, 0xFF); ctx->r2 = 0; } +// Same naming issue as above. extern "C" void osFlashSectorEraseThrough_recomp(uint8_t * rdram, recomp_context * ctx) { uint32_t page_num = (uint32_t)ctx->r4; - uint32_t sector_num = page_num / sector_size; // Prevent out of bounds erase - if (sector_num >= sector_size) { + if (page_num >= page_count) { ctx->r2 = -1; return; } - save_clear(sector_num * sector_size, sector_size); + save_clear(page_num * page_size, page_size, 0xFF); ctx->r2 = 0; } diff --git a/src/pi.cpp b/src/pi.cpp index 49bc898..7ebf868 100644 --- a/src/pi.cpp +++ b/src/pi.cpp @@ -76,8 +76,8 @@ void save_read(uint8_t* rdram, gpr rdram_address, uint32_t offset, uint32_t coun } } -void save_clear(uint32_t start, uint32_t size) { - std::fill_n(save_buffer.begin() + start, size, 0); +void save_clear(uint32_t start, uint32_t size, char value) { + std::fill_n(save_buffer.begin() + start, size, value); std::ofstream save_file{ save_filename, std::ios_base::binary }; if (save_file.good()) {