Start decompiling save file code

This commit is contained in:
y.demaisonregne 2023-03-02 02:13:08 +01:00
parent 57beb48062
commit 4f25de2a73
28 changed files with 2055 additions and 88 deletions

View File

@ -100,7 +100,7 @@ lbl_08000d10:
ldr r5, lbl_08000d5c @ =0x08754bcc
ldr r1, [r5]
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
adds r4, r0, #0
cmp r4, #0
beq lbl_08000d36
@ -113,7 +113,7 @@ lbl_08000d36:
ldr r2, lbl_08000d54 @ =0x00006d40
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000d4c: .4byte 0x040000d4
@ -129,7 +129,7 @@ lbl_08000d60:
ldr r1, [r1]
adds r1, #0x40
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000d74: .4byte 0x08754bc8
@ -143,7 +143,7 @@ lbl_08000d7c:
ldr r1, [r1]
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000d94: .4byte 0x08754bc8
@ -168,7 +168,7 @@ lbl_08000da0:
adds r1, r1, r2
movs r2, #0x91
lsls r2, r2, #5
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000dcc: .4byte 0x08754bc8
@ -194,7 +194,7 @@ lbl_08000dd8:
adds r1, r1, r2
movs r2, #0x91
lsls r2, r2, #5
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000e04: .4byte 0x08754bc8
@ -211,7 +211,7 @@ lbl_08000e14:
ldr r1, [r1]
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000e2c: .4byte 0x08754bc8
@ -225,7 +225,7 @@ lbl_08000e34:
ldr r1, [r1]
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000e4c: .4byte 0x08754bc8
@ -241,7 +241,7 @@ lbl_08000e58:
ldr r1, [r1]
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000e70: .4byte 0x08754bc8
@ -255,7 +255,7 @@ lbl_08000e78:
ldr r1, [r1]
adds r1, r1, r2
movs r2, #0x40
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000e90: .4byte 0x08754bc8
@ -272,7 +272,7 @@ lbl_08000e9c:
adds r1, r1, r2
movs r2, #0x80
lsls r2, r2, #1
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000eb8: .4byte 0x08754bc8
@ -288,7 +288,7 @@ lbl_08000ec0:
adds r1, r1, r2
movs r2, #0x80
lsls r2, r2, #1
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000edc: .4byte 0x08754bc8
@ -305,7 +305,7 @@ lbl_08000ee4:
movs r7, #0x80
lsls r7, r7, #2
adds r2, r7, #0
bl SRAMWriteChecked
bl SramWriteChecked
adds r4, r0, #0
cmp r4, #0
bne lbl_08000faa
@ -316,7 +316,7 @@ lbl_08000ee4:
ldr r1, [r5]
adds r1, r1, r2
adds r2, r7, #0
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000f18: .4byte 0x08754bc8
@ -325,7 +325,7 @@ lbl_08000f20:
ldr r0, lbl_08000f2c @ =0x0203ff70
ldr r1, lbl_08000f30 @ =0x0e007f70
movs r2, #0x10
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000f2c: .4byte 0x0203ff70
@ -335,7 +335,7 @@ lbl_08000f34:
ldr r1, lbl_08000f48 @ =0x0e007800
movs r2, #0xa0
lsls r2, r2, #2
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_08000fa8
.align 2, 0
lbl_08000f44: .4byte 0x0203f800
@ -346,7 +346,7 @@ lbl_08000f4c:
ldr r1, lbl_08000f5c @ =0x02038000
movs r2, #0x80
lsls r2, r2, #8
bl SRAMWriteUnchecked
bl SramWriteUnchecked
b lbl_08000faa
.align 2, 0
lbl_08000f5c: .4byte 0x02038000
@ -369,7 +369,7 @@ lbl_08000f60:
adds r1, r1, r2
movs r2, #0x91
lsls r2, r2, #5
bl SRAMWriteUnchecked
bl SramWriteUnchecked
b lbl_08000faa
.align 2, 0
lbl_08000f8c: .4byte 0x08754bcc
@ -382,7 +382,7 @@ lbl_08000f98:
ldr r1, [r1]
movs r2, #0x80
lsls r2, r2, #8
bl SRAMCheck
bl SramCheck
lbl_08000fa8:
adds r4, r0, #0
lbl_08000faa:
@ -470,7 +470,7 @@ lbl_0800103c:
adds r1, r1, r2
adds r1, r1, r4
adds r2, r5, #0
bl SRAMWriteChecked
bl SramWriteChecked
b lbl_0800108e
.align 2, 0
lbl_08001054: .4byte 0x08754bc8
@ -497,7 +497,7 @@ lbl_08001064:
adds r1, r1, r2
adds r1, r1, r4
adds r2, r5, #0
bl SRAMWriteUnchecked
bl SramWriteUnchecked
lbl_0800108e:
movs r2, #0
adds r1, r4, r5

View File

@ -2,8 +2,8 @@
.syntax unified
thumb_func_start SRAMWriteUncheckedInternal
SRAMWriteUncheckedInternal: @ 0x080051d4
thumb_func_start SramWriteUncheckedInternal
SramWriteUncheckedInternal: @ 0x080051d4
push {r4, lr}
adds r4, r0, #0
subs r3, r2, #1
@ -25,8 +25,8 @@ lbl_080051f0:
bx r0
.align 2, 0
thumb_func_start SRAMWriteUnchecked
SRAMWriteUnchecked: @ 0x080051f8
thumb_func_start SramWriteUnchecked
SramWriteUnchecked: @ 0x080051f8
push {r4, r5, r6, lr}
sub sp, #0x80
adds r4, r0, #0
@ -39,20 +39,20 @@ SRAMWriteUnchecked: @ 0x080051f8
movs r1, #3
orrs r0, r1
strh r0, [r2]
ldr r3, lbl_0800522c @ =SRAMWriteUncheckedInternal
ldr r3, lbl_0800522c @ =SramWriteUncheckedInternal
movs r0, #1
bics r3, r0
mov r2, sp
ldr r0, lbl_08005230 @ =SRAMWriteUnchecked
ldr r1, lbl_0800522c @ =SRAMWriteUncheckedInternal
ldr r0, lbl_08005230 @ =SramWriteUnchecked
ldr r1, lbl_0800522c @ =SramWriteUncheckedInternal
subs r0, r0, r1
lsls r0, r0, #0xf
b lbl_08005240
.align 2, 0
lbl_08005224: .4byte 0x04000204
lbl_08005228: .4byte 0x0000fffc
lbl_0800522c: .4byte SRAMWriteUncheckedInternal
lbl_08005230: .4byte SRAMWriteUnchecked
lbl_0800522c: .4byte SramWriteUncheckedInternal
lbl_08005230: .4byte SramWriteUnchecked
lbl_08005234:
ldrh r0, [r3]
strh r0, [r2]
@ -75,8 +75,8 @@ lbl_08005240:
pop {r0}
bx r0
thumb_func_start SRAMWrite
SRAMWrite: @ 0x0800525c
thumb_func_start SramWrite
SramWrite: @ 0x0800525c
push {r4, r5, lr}
adds r5, r0, #0
adds r4, r1, #0
@ -141,8 +141,8 @@ lbl_080052c4:
bx r1
.align 2, 0
thumb_func_start SRAMCheck
SRAMCheck: @ 0x080052cc
thumb_func_start SramCheck
SramCheck: @ 0x080052cc
push {r4, r5, r6, lr}
sub sp, #0xc0
adds r4, r0, #0
@ -159,7 +159,7 @@ SRAMCheck: @ 0x080052cc
movs r0, #1
bics r3, r0
mov r2, sp
ldr r0, lbl_08005304 @ =SRAMCheck
ldr r0, lbl_08005304 @ =SramCheck
ldr r1, lbl_08005300 @ =SRAMCheckInternal
subs r0, r0, r1
lsls r0, r0, #0xf
@ -168,7 +168,7 @@ SRAMCheck: @ 0x080052cc
lbl_080052f8: .4byte 0x04000204
lbl_080052fc: .4byte 0x0000fffc
lbl_08005300: .4byte SRAMCheckInternal
lbl_08005304: .4byte SRAMCheck
lbl_08005304: .4byte SramCheck
lbl_08005308:
ldrh r0, [r3]
strh r0, [r2]
@ -191,8 +191,8 @@ lbl_08005314:
pop {r1}
bx r1
thumb_func_start SRAMWriteChecked
SRAMWriteChecked: @ 0x08005330
thumb_func_start SramWriteChecked
SramWriteChecked: @ 0x08005330
push {r4, r5, r6, r7, lr}
adds r6, r0, #0
adds r5, r1, #0
@ -209,11 +209,11 @@ lbl_08005342:
adds r0, r6, #0
adds r1, r5, #0
adds r2, r4, #0
bl SRAMWrite
bl SramWrite
adds r0, r6, #0
adds r1, r5, #0
adds r2, r4, #0
bl SRAMCheck
bl SramCheck
adds r3, r0, #0
cmp r3, #0
bne lbl_0800533c

View File

@ -25010,8 +25010,8 @@ lbl_08073292:
.align 2, 0
lbl_08073298: .4byte 0x08754bc4
thumb_func_start read_sram
read_sram: @ 0x0807329c
thumb_func_start SramRead_All
SramRead_All: @ 0x0807329c
push {r4, r5, lr}
movs r4, #3
ldr r5, lbl_080732b8 @ =0x03000c1c
@ -25265,7 +25265,7 @@ lbl_080734a4:
lbl_080734b0: .4byte 0x08754bc8
lbl_080734b4: .4byte 0x00006d40
lbl_080734b8:
bl EraseSRAM
bl EraseSram
ldr r1, lbl_080734e0 @ =0x0841147c
ldr r2, lbl_080734e4 @ =0x03000014
movs r0, #0x10
@ -26127,8 +26127,8 @@ lbl_08073b9a:
pop {r1}
bx r1
thumb_func_start save_file
save_file: @ 0x08073ba4
thumb_func_start SramSaveFile
SramSaveFile: @ 0x08073ba4
push {lr}
sub sp, #4
ldr r1, lbl_08073bd4 @ =0x03000043
@ -27003,14 +27003,14 @@ sub_08074304: @ 0x08074304
ldr r4, lbl_0807436c @ =0x0e007f80
adds r1, r4, #0
movs r2, #0x10
bl SRAMWriteChecked
bl SramWriteChecked
rsbs r1, r0, #0
orrs r1, r0
lsrs r5, r1, #0x1f
adds r0, r4, #0
mov r1, sp
movs r2, #0x10
bl SRAMWriteUnchecked
bl SramWriteUnchecked
movs r2, #0
lbl_0807432c:
mov r0, sp
@ -27025,7 +27025,7 @@ lbl_0807432c:
mov r0, sp
adds r1, r4, #0
movs r2, #0x10
bl SRAMWriteChecked
bl SramWriteChecked
cmp r0, #0
beq lbl_08074350
movs r0, #2
@ -27034,7 +27034,7 @@ lbl_08074350:
adds r0, r4, #0
mov r1, sp
movs r2, #0x10
bl SRAMWriteUnchecked
bl SramWriteUnchecked
movs r2, #0
mov r0, sp
ldrb r1, [r0]

View File

@ -824,7 +824,7 @@ Blob_34099c_345868.bin;20172;0x34099c;1
Blob_345d00_360130.bin;107568;0x345d00;1
Blob_3602e8_36bdac.bin;47812;0x3602e8;1
Blob_375cc4_386f60.bin;70300;0x375cc4;1
Blob_3f0390_411528.bin;135576;0x3f0390;1
Blob_3f0390_411400.bin;135280;0x3f0390;1
Blob_415460_446d68.bin;203016;0x415460;1
Blob_44f11c_45f45c.bin;66368;0x44f11c;1
Blob_479400_754bb4.bin;2996148;0x479400;1

View File

@ -0,0 +1,30 @@
#ifndef SAVE_FILE_DATA_H
#define SAVE_FILE_DATA_H
#include "types.h"
#include "structs/save_file.h"
extern const u8 sMetZeroSramCheck_Text[SRAM_TEXT_SIZE];
extern const u8 sZERO_MISSION_010_Text[SRAM_TEXT_SIZE];
extern const u8 sPlanetZebes_Text[SRAM_TEXT_SIZE];
extern const u8 sSamusAran_Text[SRAM_TEXT_SIZE];
extern const u8 sJpnVer_Text[20];
extern const u8 sEurVer_Text[20];
extern const u8 sUsaVer_Text[20];
extern const struct FileScreenOptionsUnlocked sFileScreenOptionsUnlocked_Empty;
extern const u8 sMostRecentFileSave_Text[2][SRAM_TEXT_SIZE];
extern const u8 sSoundModeSave_Text[2][SRAM_TEXT_SIZE];
extern const u8 sLanguageSave_Text[2][SRAM_TEXT_SIZE];
extern const u8 sTimeAttackSave_Text[SRAM_TEXT_SIZE * 2 + 8];
extern const struct ButtonAssignments sDefaultButtonAssignments;
extern const struct InGameTimer sInGameTimer_Empty;
extern const struct InGameTimer sBestCompletionTime_Empty;
extern const u8 sUnk_411520[4];
extern const struct StartingInfo sStartingInfo;
#endif /* SAVE_FILE_DATA_H */

View File

@ -3,13 +3,14 @@
#include "types.h"
#include "temp_globals.h"
#include "structs/save_file.h"
extern void* sEwramPointer;
extern void* sBgPalramPointer;
extern void* sObjPalramPointer;
extern u32* sVisitedMinimapTilesPointer;
extern union NonGameplayRAM* sNonGameplayRamPointer;
extern void* sSramEwramPointer;
extern struct Sram* sSramEwramPointer;
extern void* sSramFlashPointer;
#endif /* SHORTCUT_POINTERS_H */

View File

@ -5,7 +5,7 @@
void DMATransfer(u8 channel, void *src, void *dst, u32 len, u8 bitSize);
void init_sound(void);
void read_sram(void);
void SramRead_All(void);
void start_new_demo(void);
int softreset_main(void);
int fileselect_main(void);

View File

@ -28,11 +28,8 @@ union TileData {
///
extern u8 unk_02038000[];
extern struct BG2Movement gBG2Movement;
extern u16 gInterruptCode[0x100];
extern u8 gSRAMCorruptFlag;
extern void *sp_sys;
extern void *sp_irq;

View File

@ -8,7 +8,8 @@
#define bomb_chain_type_to_flag(type) (1 << type)
#define check_samus_turning() ((pData->direction ^ (KEY_RIGHT | KEY_LEFT)) & gButtonInput)
#define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
#define ARRAY_SIZE(a) ((int)(sizeof((a)) / sizeof((a)[0])))
#define OFFSET_OF(type, element) ((int)&(((type *)0)->element))
#define RED(c) ((c) & COLOR_MASK)
#define GREEN(c) (((c) & (COLOR_MASK << 5)) >> 5)

63
include/save_file.h Normal file
View File

@ -0,0 +1,63 @@
#ifndef SAVE_FILE_H
#define SAVE_FILE_H
#include "types.h"
void SramRead_All(void);
void SramWrite_FileScreenOptionsUnlocked(void);
void SramRead_FileScreenOptionsUnlocked(void);
u32 SramCheck_FileScreenOptionsUnlocked(u8 fileNumber);
void SramCopy_FileScreenOptionsUnlocked(void);
u32 SramProcessIntroSave(void);
void SramWrite_HeaderAndGameInfo(void);
u32 SramProcessEndingSave(void);
void SramCheckSetNewBestCompletionTime(void);
void SramCopy_GameCompletion(void);
u32 SramProcessEndingSave_Unused(void);
u32 SramSaveFile(void);
void SramWrite_ToEwram(void);
void SramRead_FromEwram(void);
void StringCopy(u8* dst, const u8* const src, u8 length);
void SramTestFlash(void);
void unk_743a4(void);
void unk_74574(void);
void unk_74624(u8 param_1);
void SramLoadFile(void);
void SramLoadFile_Unused(void);
void SramWrite_Arrays(void);
void SramRead_Arrays(void);
void SramWrite_MostRecentSaveFile(void);
void SramRead_MostRecentSaveFile(void);
void SramWrite_SoundMode(void);
void SramRead_SoundMode(void);
void SramWrite_Language(void);
u32 SramRead_Language(void);
void SramWrite_TimeAttack(void);
void SramRead_TimeAttack(void);
void SramWrite_ToEwram_Unused(void);
void SramLoad_DemoRamValues(void);
u32 SramDeleteFile(u8 file);
u32 SramCopyFile(u8 src, u8 dst);
void SramWrite_FileInfo(void);
void unk_757c8(u8 file);
void unk_7584c(u8 param_1);
void Sram_CheckLoadSaveFile(void);
void Sram_InitSaveFile(void);
void Sram_VblankEmpty(void);
u32 unk_75c04(u8 param_1);
#endif /* SAVE_FILE_H */

View File

@ -3,9 +3,9 @@
#include "types.h"
void SRAMWriteUnchecked(u8 *src, u8 *dest, u32 size);
void SRAMWrite(u8 *src, u8 *dest, u32 size);
u8 *SRAMCheck(u8 *src, u8 *dest, u32 size);
u8 *SRAMWriteChecked(u8 *src, u8 *dest, u32 size);
void SramWriteUnchecked(u8* src, u8* dest, u32 size);
void SramWrite(u8* src, u8* dest, u32 size);
u8* SramCheck(u8* src, u8* dest, u32 size);
u8* SramWriteChecked(u8* src, u8* dest, u32 size);
#endif /* SRAM_SRAM_H */

View File

@ -16,6 +16,9 @@ struct FileScreenOptionsUnlocked {
u16 galleryImages;
u16 fusionGalleryImages;
u8 soundTestAndOgMetroid;
u8 unk_5;
u8 unk_6;
u8 unk_7;
u32 timeAttack;
};
@ -29,6 +32,7 @@ extern u8 gSramErrorFlag;
extern u8 gDisablePause;
extern u8 gDisableScrolling;
extern u8 gShipLandingFlag;
extern u8 gTimeAttackFlag;
extern u16 gButtonInput;
extern u16 gPreviousButtonInput;
extern u16 gChangedInput;
@ -49,4 +53,7 @@ extern i8 gGameModeSub2;
extern i8 gGameModeSub3;
extern u8 gSubGameModeStage;
#endif
extern u8 gHasSaved;
extern i8 gMostRecentSaveFile;
#endif

View File

@ -15,5 +15,6 @@ struct InGameTimer {
extern u8 gMaxInGameTimerFlag;
extern struct InGameTimer gInGameTimer;
extern struct InGameTimer gInGameTimerAtBosses[MAX_AMOUNT_OF_IGT_AT_BOSSES];
extern struct InGameTimer gBestCompletionTimes[12];
#endif

View File

@ -138,6 +138,7 @@ struct SamusEcho {
u8 timer;
u8 position;
u8 distance;
u32 padding_4;
u16 previous64XPositions[64];
u16 previous64YPositions[64];
u16 previousPositionCounter;

234
include/structs/save_file.h Normal file
View File

@ -0,0 +1,234 @@
#ifndef SAVE_FILE_STRUCT_H
#define SAVE_FILE_STRUCT_H
#include "types.h"
#include "structs/game_state.h"
#include "structs/samus.h"
#include "structs/scroll.h"
#include "structs/connection.h"
#include "structs/in_game_timer.h"
#include "structs/time_attack.h"
#include "structs/demo.h"
#define SRAM_TEXT_SIZE 16
#define SRAM_GET_CHECKSUM_SIZE(type, iteration, checksumType) (sizeof(type) / sizeof(checksumType) / iteration - 1)
struct StartingInfo {
u8 startingArea;
u8 unk_1;
u8 unk_2;
u8 unk_3;
};
struct SaveFileInfo {
u8 exists;
u8 unk_1;
u8 currentArea;
u16 currentEnergy;
u16 maxEnergy;
u16 currentMissiles;
u16 maxMissiles;
u8 suitType;
u8 igtHours;
u8 igtMinutes;
u8 igtSconds;
u8 hasSaved;
u8 completedGame;
i8 introPlayed;
i8 language;
u8 difficulty;
u8 timeAttack;
};
struct SaveMusicInfo {
u16 musicTrack;
u16 unk_2;
u8 unk_4;
u8 priority;
};
struct SaveFile {
u8 ZERO_MISSION_010_Text[SRAM_TEXT_SIZE];
i32 checksum;
i32 notChecksum;
struct GameCompletion gameCompletion;
u8 hasSaved;
u8 currentArea;
u8 currentRoom;
u8 LastDoorUsed;
u8 mapX;
u8 mapY;
struct Camera camera;
u16 bg0XPosition;
u16 bg0YPosition;
u16 bg1XPosition;
u16 bg1YPosition;
u16 bg2XPosition;
u16 bg2YPosition;
u16 bg3XPosition;
u16 bg3YPosition;
u8 difficulty;
u8 useMotherShipDoor;
u8 timeAttack;
u8 numberOfNeverReformBlocksBroken[MAX_AMOUNT_OF_AREAS];
u8 numberOfItemsCollected[MAX_AMOUNT_OF_AREAS];
u8 PlanetZebes_Text[SRAM_TEXT_SIZE];
struct SamusData samusData;
struct WeaponInfo samusWeaponInfo;
struct SamusEcho samusEcho;
struct ScrewSpeedAnimation screwSpeedAnimation;
struct Equipment equipment;
struct HazardDamage hazardDamage;
struct EnvironmentalEffect environmentalEffects[5];
u16 preventMovementTimer;
u8 disableDrawingSamusAndScrolling;
u16 alarmTimer;
struct InGameTimer inGameTimer;
struct InGameTimer bestCompletionTimes[12];
struct InGameTimer inGameTimerAtBosses[MAX_AMOUNT_OF_IGT_AT_BOSSES];
struct SaveMusicInfo musicInfo;
u32 unk_248;
u32 unk_24C[1];
u8 SamusAran_Text[SRAM_TEXT_SIZE];
u8 freespace[160];
u32 visitedMinimapTiles[MAX_AMOUNT_OF_AREAS][32];
u8 neverReformBLocksBroken[2048];
u8 itemsCollected[512];
u32 hatchesOpened[MAX_AMOUNT_OF_AREAS][8];
u32 eventsTriggered[8];
};
struct SaveFile_Unused {
u8 currentArea;
u8 lastDoorUsed;
struct SamusData samusData;
struct WeaponInfo samusWeaponInfo;
struct SamusEcho samusEcho;
struct ScrewSpeedAnimation screwSpeedAnimation;
struct Equipment equipment;
struct HazardDamage hazardDamage;
struct EnvironmentalEffect environmentalEffects[5];
u32 visitedMinimapTiles[32];
u32 hatchesOpened[8];
u8 unk_238;
u8 unk_239;
u8 unk_23A;
u8 unk_23B;
u8 unk_23C;
u8 unk_23D;
u8 unk_23E;
u8 unk_23F;
u8 useMotherShipDoors;
u8 padding_241[60];
};
struct SaveFileScreenOptions {
u32 checksum;
u32 notChecksum;
u8 unk_8;
u8 unk_9;
u16 counter;
u16 galleryImages;
u8 soundTestAndOriginalMetroid;
u8 unk_F;
u8 unk_10;
u8 unk_11;
u8 unk_12;
u8 unk_13;
u16 fusionGalleryImages;
u32 timeAttack;
u8 ZeroMissionUSA_Text[20];
u8 padding_2A[16];
};
struct SaveValue {
u8 magicNumber;
u8 counter;
u16 checksum;
u16 notChecksum;
u8 startText[SRAM_TEXT_SIZE];
u8 value;
u8 endText[SRAM_TEXT_SIZE];
u8 padding_27[24];
};
struct SaveTimeAttack {
u8 magicNumber;
u8 padding_1[16];
u16 checksum;
u16 notChecksum;
u8 counter;
u8 startText[SRAM_TEXT_SIZE];
struct TimeAttackRecord value;
u8 endText[SRAM_TEXT_SIZE];
u8 padding_68[152];
};
struct Sram {
struct SaveFileScreenOptions fileScreenOptions_fileA;
struct SaveFileScreenOptions fileScreenOptions_fileB;
struct SaveFile files[3];
struct SaveFile filesCopy[3];
struct SaveFileScreenOptions fileScreenOptions_fileC;
struct SaveValue mostRecentFileSave;
struct SaveValue languagesSave[2];
struct SaveValue soundModeSave;
struct SaveTimeAttack timeAttackSaves[2];
u16 demoInputData[DEMO_MAX_DURATION];
u16 demoInputDuration[DEMO_MAX_DURATION];
u8 padding_7480[896];
struct SaveFile_Unused file_unused;
u8 padding_7a80[1264];
u8 unk_7f70[16];
u8 MetZeroSramCheck_Text[SRAM_TEXT_SIZE];
u8 padding_7f90[112];
};
// Temp
extern u32 gUnk_3000050[1];
extern u8 gSramOperationStage;
extern u8 gSramCorruptFlag;
extern struct Sram gSram;
extern u8 gUnk_3000c20;
extern struct SaveFileInfo gSaveFilesInfo[3];
extern struct StartingInfo gStartingInfo;
#endif /* SAVE_FILE_STRUCT_H */

View File

@ -24,7 +24,7 @@ SECTIONS {
. = 0x00037c00; gHatchesOpened = .;
. = 0x00037e00; gEventsTriggered = .;
. = 0x00037e20; gMinimapTilesGFX = .;
. = 0x00038000; unk_02038000 = .;
. = 0x00038000; gSram = .;
} >ewram
iwram (NOLOAD) : ALIGN(4) {
@ -45,6 +45,7 @@ SECTIONS {
. = 0x0000002B; gSamusOnTopOfBackgrounds = .;
. = 0x0000002C; gDifficulty = .;
. = 0x0000002D; gUseMotherShipDoors = .;
. = 0x0000002E; gTimeAttackFlag = .;
. = 0x0000002F; gCutsceneToSkip = .;
. = 0x00000030; gMusicTrackInfo = .;
. = 0x00000038; gCurrentDemo = .;
@ -153,7 +154,7 @@ SECTIONS {
. = 0x00000c06; gCurrentOamScaling = .;
. = 0x00000c08; gLastAreaNameVisited = .;
. = 0x00000c0c; gCurrentMessage = .;
. = 0x00000c1c; gSRAMCorruptFlag = .;
. = 0x00000c1c; gSramCorruptFlag = .;
. = 0x00000c1d; gIsLoadingFile = .;
. = 0x00000c70; gMainGameMode = .;
. = 0x00000c72; gGameModeSub1 = .;
@ -526,7 +527,8 @@ SECTIONS {
src/data/cutscenes/getting_fully_powered_suit_data.o(.rodata);
src/data/cutscenes/before_charlie_data.o(.rodata);
src/data/cutscenes/statue_opening_data.o(.rodata);
/* 3f0390-411528 */
/* 3f0390-411400 */
src/data/save_file_data.o(.rodata);
src/data/menus/erase_sram_data.o(.rodata);
/* 415460-446d68 */
src/data/menus/title_screen_data.o(.rodata);

View File

@ -77,4 +77,4 @@ const u32 sStatueOpeningRoomGFX[2357] = INCBIN_U32("data/cutscenes/StatueOpening
const u32 sStatueOpeningRoomTileTable[318] = INCBIN_U32("data/cutscenes/StatueOpening/Room.tt");
const u32 sStatueOpening_3effc8[242] = INCBIN_U32("data/cutscenes/StatueOpening/3effc8.tt");
const u8 sTempArray_3f0390[0x21198] = INCBIN_U8("data/Blob_3f0390_411528.bin");
const u8 sTempArray_3f0390[0x21070] = INCBIN_U8("data/Blob_3f0390_411400.bin");

72
src/data/save_file_data.c Normal file
View File

@ -0,0 +1,72 @@
#include "data/save_file_data.h"
#include "gba.h"
#include "constants/connection.h"
const u8 sMetZeroSramCheck_Text[SRAM_TEXT_SIZE] = "MetZeroSramCheck";
const u8 sZERO_MISSION_010_Text[SRAM_TEXT_SIZE] = "ZERO_MISSION_010";
const u8 sPlanetZebes_Text[SRAM_TEXT_SIZE] = "Planet Zebes... ";
const u8 sSamusAran_Text[SRAM_TEXT_SIZE] = " - Samus Aran - ";
const u8 sJpnVer_Text[20] = "ZeroMissionJPNver005";
const u8 sEurVer_Text[20] = "ZeroMissionEURver005";
const u8 sUsaVer_Text[20] = "ZeroMissionUSAver005";
const struct FileScreenOptionsUnlocked sFileScreenOptionsUnlocked_Empty = {
.galleryImages = 0,
.fusionGalleryImages = 0,
.soundTestAndOgMetroid = 0,
.unk_5 = 0,
.unk_6 = 0,
.unk_7 = 0,
.timeAttack = 0
};
const u8 sMostRecentFileSave_Text[2][SRAM_TEXT_SIZE] = {
"SELECTSAVENUM_00",
"ENDDATA_SEL_SAVE"
};
const u8 sSoundModeSave_Text[2][SRAM_TEXT_SIZE] = {
"_SOUNDMODE_SAVE_",
"SoundModeSAVEEND"
};
const u8 sLanguageSave_Text[2][SRAM_TEXT_SIZE] = {
"_SELECT_LANGUAGE",
"ENDKEY_LANGUAGE_"
};
const u8 sTimeAttackSave_Text[SRAM_TEXT_SIZE * 2 + 8] = "SUKPIFZAILU25976_StartKey_198129ATRUNEND";
const struct ButtonAssignments sDefaultButtonAssignments = {
.armMissiles = KEY_R,
.diagonalAim = KEY_L,
.pause = KEY_START,
.swapMissiles = KEY_SELECT
};
const struct InGameTimer sInGameTimer_Empty = {
.hours = 0,
.minutes = 0,
.seconds = 0,
.frames = 0
};
const struct InGameTimer sBestCompletionTime_Empty = {
.hours = UCHAR_MAX,
.minutes = UCHAR_MAX,
.seconds = UCHAR_MAX,
.frames = UCHAR_MAX
};
const u8 sUnk_411520[4] = {
8, 8, 0, 0
};
const struct StartingInfo sStartingInfo = {
.startingArea = AREA_CRATERIA,
.unk_1 = 5,
.unk_2 = 0,
.unk_3 = 0
};

View File

@ -15,7 +15,7 @@ u32* sVisitedMinimapTilesPointer = gVisitedMinimapTiles;
FORCE_RODATA
union NonGameplayRAM* sNonGameplayRamPointer = &gNonGameplayRAM;
FORCE_RODATA
void* sSramEwramPointer = EWRAM_BASE + 0x38000;
struct Sram* sSramEwramPointer = EWRAM_BASE + 0x38000;
FORCE_RODATA
void* sSramFlashPointer = SRAM_BASE;

View File

@ -4,11 +4,12 @@
#include "memory.h"
#include "sram/sram.h"
#include "types.h"
#include "structs/save_file.h"
void EraseSRAM(void)
void EraseSram(void)
{
BitFill(3, 0xffff, &unk_02038000, SRAM_SIZE, 16);
if (gSRAMCorruptFlag == 0) {
SRAMWriteChecked(unk_02038000, SRAM_BASE, SRAM_SIZE);
BitFill(3, 0xffff, &gSram, SRAM_SIZE, 16);
if (!gSramCorruptFlag) {
SramWriteChecked((u8*)&gSram, SRAM_BASE, SRAM_SIZE);
}
}

View File

@ -23,7 +23,7 @@ void InitializeGame(void)
ClearGfxRam();
LoadInterruptCode();
CallbackSetVBlank(SoftresetVBlankCallback);
read_sram();
SramRead_All();
init_sound();
write16(REG_IE, IF_VBLANK | IF_DMA2 | IF_GAMEPAK);

View File

@ -110,7 +110,7 @@ u32 EraseSramSubroutine(void)
case 7:
unk_33dc();
EraseSRAM();
EraseSram();
leaving = TRUE;
}
@ -383,7 +383,7 @@ void EraseSramResetOAM(void)
ERASE_SRAM_DATA.currentOption = ERASE_SRAM_OPTION_QUESTION_NO;
ERASE_SRAM_DATA.nextOption = ERASE_SRAM_OPTION_CHANGED_FLAG | ERASE_SRAM_OPTION_QUESTION_NO;
for (i = 0; i < (int)ARRAY_SIZE(ERASE_SRAM_DATA.oam); i++)
for (i = 0; i < ARRAY_SIZE(ERASE_SRAM_DATA.oam); i++)
{
ERASE_SRAM_DATA.oam[i] = *(struct MenuOamData*)0x840d048;
// FIXME *pOam = sEraseSramMenuOamData_Empty;

View File

@ -446,9 +446,9 @@ void GameOverUpdateLettersPalette(void)
row = GAME_OVER_DATA.dynamicPalette.currentPaletteRow;
i = 0;
while (i < (int)ARRAY_SIZE(GAME_OVER_DATA.dynamicPalette.palette))
while (i < ARRAY_SIZE(GAME_OVER_DATA.dynamicPalette.palette))
{
if (row >= (int)ARRAY_SIZE(GAME_OVER_DATA.dynamicPalette.palette))
if (row >= ARRAY_SIZE(GAME_OVER_DATA.dynamicPalette.palette))
row = 0;
GAME_OVER_DATA.dynamicPalette.palette[i] = src[row];

View File

@ -93,7 +93,7 @@ void TitleScreenResetOAM(void)
pOam = TITLE_SCREEN_DATA.oam;
i = 0;
while (i < (int)ARRAY_SIZE(TITLE_SCREEN_DATA.oam))
while (i < ARRAY_SIZE(TITLE_SCREEN_DATA.oam))
{
*pOam = *(struct MenuOamData*)0x840d028;
// FIXME *pOam = sMenuOamData_Empty;

1557
src/save_file.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -44,7 +44,7 @@ void Softreset(void)
ClearGfxRam();
LoadInterruptCode();
CallbackSetVBlank(SoftresetVBlankCallback);
read_sram();
SramRead_All();
init_sound();
write16(REG_IE, IF_VBLANK | IF_DMA2 | IF_GAMEPAK);

View File

@ -410,7 +410,7 @@ void SaveYesNoCursor(void)
break;
case SAVE_YES_NO_CURSOR_POSE_SAVING:
if (save_file()) // Undefined
if (SramSaveFile())
gCurrentSprite.status = 0x0;
break;
}

View File

@ -3,14 +3,14 @@
#include "gba.h"
#include "io.h"
static void SRAMWriteUncheckedInternal(u8 *src, u8 *dest, u32 size)
static void SramWriteUncheckedInternal(u8 *src, u8 *dest, u32 size)
{
while (size-- != 0) {
*dest++ = *src++;
}
}
void SRAMWriteUnchecked(u8 *src, u8 *dest, u32 size)
void SramWriteUnchecked(u8 *src, u8 *dest, u32 size)
{
u16 code[0x40];
u16 *code_ptr;
@ -22,12 +22,12 @@ void SRAMWriteUnchecked(u8 *src, u8 *dest, u32 size)
REG_WAITCNT,
read16(REG_WAITCNT) & ~WAIT_SRAM_CYCLES_MASK | WAIT_SRAM_8CYCLES);
func_ptr = (u16 *)SRAMWriteUncheckedInternal;
func_ptr = (u16 *)SramWriteUncheckedInternal;
func_ptr = (u16 *)((u32)func_ptr & ~1);
code_ptr = code;
for (csize =
((u32)SRAMWriteUnchecked - (u32)SRAMWriteUncheckedInternal)
((u32)SramWriteUnchecked - (u32)SramWriteUncheckedInternal)
/ 2;
csize > 0;
--csize) {
@ -38,7 +38,7 @@ void SRAMWriteUnchecked(u8 *src, u8 *dest, u32 size)
func(src, dest, size);
}
void SRAMWrite(u8 *src, u8 *dest, u32 size)
void SramWrite(u8 *src, u8 *dest, u32 size)
{
u16 w = read16(REG_WAITCNT) & ~WAIT_SRAM_CYCLES_MASK | WAIT_SRAM_8CYCLES;
write16(REG_WAITCNT, w);
@ -59,7 +59,7 @@ static u8* SRAMCheckInternal(u8 *src, u8 *dest, u32 size)
return NULL;
}
u8* SRAMCheck(u8 *src, u8 *dest, u32 size)
u8* SramCheck(u8 *src, u8 *dest, u32 size)
{
u16 code[0x60];
u16 *code_ptr;
@ -75,7 +75,7 @@ u8* SRAMCheck(u8 *src, u8 *dest, u32 size)
func_ptr = (u16 *)((u32)func_ptr & ~1);
code_ptr = code;
for (csize = ((u32)SRAMCheck - (u32)SRAMCheckInternal) / 2; csize > 0;
for (csize = ((u32)SramCheck - (u32)SRAMCheckInternal) / 2; csize > 0;
--csize) {
*code_ptr++ = *func_ptr++;
}
@ -84,14 +84,14 @@ u8* SRAMCheck(u8 *src, u8 *dest, u32 size)
return func(src, dest, size);
}
u8* SRAMWriteChecked(u8 *src, u8 *dest, u32 size)
u8* SramWriteChecked(u8 *src, u8 *dest, u32 size)
{
u8 *diff;
u8 i;
for (i = 0; i < 3; ++i) {
SRAMWrite(src, dest, size);
diff = SRAMCheck(src, dest, size);
SramWrite(src, dest, size);
diff = SramCheck(src, dest, size);
if (!diff) {
break;
}