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
87 lines
1.8 KiB
C
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;
|
|
}
|