pokeemmo/src/agb_flash_1m.c
Hedara 950dbe7897 Merge commit '16357c7' into pret-merge
Conflicts:
	include/battle.h
	include/battle_controllers.h
	include/battle_script_commands.h
	include/contest.h
	include/list_menu.h
	src/battle_controllers.c
	src/battle_gfx_sfx_util.c
	src/battle_main.c
	src/battle_message.c
	src/battle_tower.c
	src/berry_crush.c
	src/contest.c
	src/ereader_helpers.c
	src/evolution_scene.c
	src/hall_of_fame.c
	src/mauville_old_man.c
	src/mystery_gift_menu.c
	src/pokedex.c
	src/pokenav_conditions_search_results.c
	src/pokenav_menu_handler_gfx.c
	src/pokenav_ribbons_list.c
	src/rom_header_gf.c
	src/union_room.c
	src/union_room_battle.c
	src/union_room_player_avatar.c
2025-05-24 19:22:31 +02:00

87 lines
1.8 KiB
C

#include "gba/gba.h"
#include "gba/flash_internal.h"
USED static const char AgbLibFlashVersion[] = "FLASH1M_V103";
static const struct FlashSetupInfo *const sSetupInfos[] =
{
&MX29L010,
&LE26FV10N1TS,
&DefaultFlash
};
u16 IdentifyFlash(void)
{
u16 result;
u16 flashId;
const struct FlashSetupInfo *const *setupInfo;
REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
flashId = ReadFlashId();
setupInfo = sSetupInfos;
result = 1;
for (;;)
{
if ((*setupInfo)->type.ids.separate.makerId == 0)
break;
if (flashId == (*setupInfo)->type.ids.joined)
{
result = 0;
break;
}
setupInfo++;
}
ProgramFlashByte = (*setupInfo)->programFlashByte;
ProgramFlashSector = (*setupInfo)->programFlashSector;
EraseFlashChip = (*setupInfo)->eraseFlashChip;
EraseFlashSector = (*setupInfo)->eraseFlashSector;
WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite;
gFlashMaxTime = (*setupInfo)->maxTime;
gFlash = &(*setupInfo)->type;
return result;
}
u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData)
{
u16 result = 0;
u8 status;
StartFlashTimer(phase);
while ((status = PollFlashStatus(addr)) != lastData)
{
if (status & 0x20)
{
// The write operation exceeded the flash chip's time limit.
if (PollFlashStatus(addr) == lastData)
break;
FLASH_WRITE(0x5555, 0xF0);
result = phase | 0xA000u;
break;
}
if (gFlashTimeoutFlag)
{
if (PollFlashStatus(addr) == lastData)
break;
FLASH_WRITE(0x5555, 0xF0);
result = phase | 0xC000u;
break;
}
}
StopFlashTimer();
return result;
}