From cbc93d78ca9a1f40542c56a6c15fe8c7fe2bfa20 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Sat, 26 Oct 2024 20:13:09 -0400 Subject: [PATCH] Implement osEepromWrite and osEepromRead, fix implicit casting error in save_write --- librecomp/src/eep.cpp | 22 ++++++++++++++++++++-- librecomp/src/pi.cpp | 4 ++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/librecomp/src/eep.cpp b/librecomp/src/eep.cpp index ee73929..f386d67 100644 --- a/librecomp/src/eep.cpp +++ b/librecomp/src/eep.cpp @@ -16,7 +16,16 @@ extern "C" void osEepromProbe_recomp(uint8_t* rdram, recomp_context* ctx) { } extern "C" void osEepromWrite_recomp(uint8_t* rdram, recomp_context* ctx) { - assert(false);// ctx->r2 = 8; // CONT_NO_RESPONSE_ERROR + uint8_t eep_address = ctx->r5; + gpr buffer = ctx->r6; + int32_t nbytes = eeprom_block_size; + + assert(!(nbytes & 7)); + assert(eep_address * eeprom_block_size + nbytes <= eep16_size); + + save_write(rdram, buffer, eep_address * eeprom_block_size, nbytes); + + ctx->r2 = 0; } extern "C" void osEepromLongWrite_recomp(uint8_t* rdram, recomp_context* ctx) { @@ -33,7 +42,16 @@ extern "C" void osEepromLongWrite_recomp(uint8_t* rdram, recomp_context* ctx) { } extern "C" void osEepromRead_recomp(uint8_t* rdram, recomp_context* ctx) { - assert(false);// ctx->r2 = 8; // CONT_NO_RESPONSE_ERROR + uint8_t eep_address = ctx->r5; + gpr buffer = ctx->r6; + int32_t nbytes = eeprom_block_size; + + assert(!(nbytes & 7)); + assert(eep_address * eeprom_block_size + nbytes <= eep16_size); + + save_read(rdram, buffer, eep_address * eeprom_block_size, nbytes); + + ctx->r2 = 0; } extern "C" void osEepromLongRead_recomp(uint8_t* rdram, recomp_context* ctx) { diff --git a/librecomp/src/pi.cpp b/librecomp/src/pi.cpp index 96e178f..00ab67e 100644 --- a/librecomp/src/pi.cpp +++ b/librecomp/src/pi.cpp @@ -154,7 +154,7 @@ 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) { { std::lock_guard lock { save_context.save_buffer_mutex }; - for (uint32_t i = 0; i < count; i++) { + for (gpr i = 0; i < count; i++) { save_context.save_buffer[offset + i] = MEM_B(i, rdram_address); } } @@ -164,7 +164,7 @@ void save_write(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t cou void save_read(RDRAM_ARG PTR(void) rdram_address, uint32_t offset, uint32_t count) { std::lock_guard lock { save_context.save_buffer_mutex }; - for (size_t i = 0; i < count; i++) { + for (gpr i = 0; i < count; i++) { MEM_B(i, rdram_address) = save_context.save_buffer[offset + i]; } }