diff options
author | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-11 19:05:47 -0800 |
---|---|---|
committer | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-11 19:05:47 -0800 |
commit | ae6d7f251ec0c6757fa3b41d50f6a58f8f2dd48c (patch) | |
tree | 4228d3678b615569197747e638daa7583cf12568 /src/flash.c | |
parent | b297f50310ed36f7298e11e0dc85f1b6fac53b89 (diff) |
decompile flash
Diffstat (limited to 'src/flash.c')
-rw-r--r-- | src/flash.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/flash.c b/src/flash.c new file mode 100644 index 0000000..b9ccf40 --- /dev/null +++ b/src/flash.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "gba/flash.h" +#include "flash.h" + +extern u8 gFlashEnabled; + +extern FlashIntrFunc *sub_800B6E8(s32); +extern void MemoryFill8(void *, u8, s32); +extern void MemoryCopy8(void *, void *, s32); + +static u8 TryProgramSector(s32, u8 *); + +void InitFlash(void) +{ + if (!IdentifyFlash() && !SetFlashTimerIntr(2, sub_800B6E8(3))) + gFlashEnabled = TRUE; +} + +void ClearFlashData(void) +{ + if (gFlashEnabled) + EraseFlashChip(); +} + +s32 ReadFlashData(s32 sector, u8 *dest, s32 size) +{ + if (gFlashEnabled) + { + u8 *_dest = dest; + + while (size >= 0x1000) + { + ReadFlash(sector, 0, _dest, 0x1000); + sector++; + _dest += 0x1000; + size -= 0x1000; + } + + if (size > 0) + ReadFlash(sector, 0, _dest, size); + return 0; + } + + return 3; +} + +s32 WriteFlashData(s32 sector, u8 *src, s32 size) +{ + u8 buffer[0x1000]; + + if (gFlashEnabled) + { + u8 flag = TRUE; + u8 *_src = src; + + while (size >= 0x1000) + { + flag = TryProgramSector(sector, _src); + if (!flag) + break; + sector++; + _src += 0x1000; + size -= 0x1000; + } + + if (flag) + { + if (size > 0) + { + MemoryFill8(buffer, 0xFF, 0x1000); + MemoryCopy8(buffer, _src, size); + flag = TryProgramSector(sector, buffer); + } + if (flag) + return 0; + } + } + + return 3; +} + +static u8 TryProgramSector(s32 sector, u8 *src) +{ + s32 tries = 3; + + do + { + if (!ProgramFlashSector(sector, src) && !VerifyFlashSectorNBytes(sector, src, 0x1000)) + return TRUE; + } while (tries-- > 0); + + return FALSE; +} |