1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-05-10 02:54:24 +00:00

[iQue] Match z_sram (#2426)

* [iQue] z_sram: Use iQue-specific read/write macros

* [iQue] z_sram: Make checksum a struct

* [iQue] z_sram: Finish matching

* Call the trigraph usage a bug

* Fix bss

* Sram_iQueReadWrite -> Sram_ReadWriteIQue

* Use SRAM_HEADER_MAGIC for loop bound

* Rename sZeldaMagic -> sSramDefaultHeader and use less char literals
This commit is contained in:
cadmic 2025-01-17 03:56:22 -08:00 committed by GitHub
parent 4a205b9d4c
commit d066586872
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 106 additions and 53 deletions

View file

@ -581,7 +581,7 @@ EGCS_O_FILES += $(BUILD_DIR)/src/code/z_construct.o
# EGCS_O_FILES += $(BUILD_DIR)/src/code/z_kanfont.o # EGCS_O_FILES += $(BUILD_DIR)/src/code/z_kanfont.o
# EGCS_O_FILES += $(BUILD_DIR)/src/code/z_message.o # EGCS_O_FILES += $(BUILD_DIR)/src/code/z_message.o
EGCS_O_FILES += $(BUILD_DIR)/src/code/z_parameter.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_parameter.o
# EGCS_O_FILES += $(BUILD_DIR)/src/code/z_sram.o EGCS_O_FILES += $(BUILD_DIR)/src/code/z_sram.o
EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_En_Mag/z_en_mag.o EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_En_Mag/z_en_mag.o
EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_End_Title/z_end_title.o EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_End_Title/z_end_title.o
EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_Fishing/z_fishing.o EGCS_O_FILES += $(BUILD_DIR)/src/overlays/actors/ovl_Fishing/z_fishing.o

View file

@ -84,6 +84,10 @@ typedef struct Inventory {
/* 0x5C */ s16 gsTokens; /* 0x5C */ s16 gsTokens;
} Inventory; // size = 0x5E } Inventory; // size = 0x5E
typedef struct Checksum {
/* 0x00 */ u16 value;
} Checksum; // size = 0x02
typedef struct SavedSceneFlags { typedef struct SavedSceneFlags {
/* 0x00 */ u32 chest; /* 0x00 */ u32 chest;
/* 0x04 */ u32 swch; /* 0x04 */ u32 swch;
@ -254,7 +258,7 @@ typedef struct SaveInfo {
/* 0x12AA 0x12C6 */ u8 scarecrowSpawnSong[0x80]; /* 0x12AA 0x12C6 */ u8 scarecrowSpawnSong[0x80];
/* 0x132A 0x1346 */ char unk_1346[0x02]; /* 0x132A 0x1346 */ char unk_1346[0x02];
/* 0x132C 0x1348 */ HorseData horseData; /* 0x132C 0x1348 */ HorseData horseData;
/* 0x1336 0x1352 */ u16 checksum; // "check_sum" /* 0x1336 0x1352 */ Checksum checksum; // "check_sum"
} SaveInfo; } SaveInfo;
typedef struct Save { typedef struct Save {

View file

@ -14,7 +14,7 @@ typedef enum SramHeaderField {
/* 0x00 */ SRAM_HEADER_SOUND, /* 0x00 */ SRAM_HEADER_SOUND,
/* 0x01 */ SRAM_HEADER_ZTARGET, /* 0x01 */ SRAM_HEADER_ZTARGET,
/* 0x02 */ SRAM_HEADER_LANGUAGE, /* 0x02 */ SRAM_HEADER_LANGUAGE,
/* 0x03 */ SRAM_HEADER_MAGIC // must be the value of `sZeldaMagic` for save to be considered valid /* 0x03 */ SRAM_HEADER_MAGIC // must be the value in `sSramDefaultHeader` for save to be considered valid
} SramHeaderField; } SramHeaderField;
#endif #endif

View file

@ -28,7 +28,7 @@
#endif #endif
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.2:70 pal-1.0:68 pal-1.1:68" "ntsc-1.2:68 pal-1.0:66 pal-1.1:66"
StackEntry sDmaMgrStackInfo; StackEntry sDmaMgrStackInfo;
OSMesgQueue sDmaMgrMsgQueue; OSMesgQueue sDmaMgrMsgQueue;

View file

@ -24,7 +24,7 @@ extern struct IrqMgr gIrqMgr;
#endif #endif
#pragma increment_block_number "gc-eu:144 gc-eu-mq:144 gc-jp:144 gc-jp-ce:144 gc-jp-mq:144 gc-us:144 gc-us-mq:144" \ #pragma increment_block_number "gc-eu:144 gc-eu-mq:144 gc-jp:144 gc-jp-ce:144 gc-jp-mq:144 gc-us:144 gc-us-mq:144" \
"ntsc-1.0:130 ntsc-1.1:130 ntsc-1.2:130 pal-1.0:128 pal-1.1:128" "ntsc-1.0:127 ntsc-1.1:127 ntsc-1.2:127 pal-1.0:125 pal-1.1:125"
extern u8 _buffersSegmentEnd[]; extern u8 _buffersSegmentEnd[];

View file

@ -3639,7 +3639,7 @@ s32 Camera_KeepOn3(Camera* camera) {
} }
#pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \ #pragma increment_block_number "gc-eu:128 gc-eu-mq:128 gc-jp:128 gc-jp-ce:128 gc-jp-mq:128 gc-us:128 gc-us-mq:128" \
"ntsc-1.0:133 ntsc-1.1:133 ntsc-1.2:133 pal-1.0:131 pal-1.1:131" "ntsc-1.0:130 ntsc-1.1:130 ntsc-1.2:130 pal-1.0:128 pal-1.1:128"
s32 Camera_KeepOn4(Camera* camera) { s32 Camera_KeepOn4(Camera* camera) {
static Vec3f D_8015BD50; static Vec3f D_8015BD50;

View file

@ -1,4 +1,4 @@
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \ #pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
"ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:224 pal-1.1:224" "ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:224 pal-1.1:224"
#include "global.h" #include "global.h"

View file

@ -1,5 +1,5 @@
#pragma increment_block_number "gc-eu:220 gc-eu-mq:220 gc-jp:212 gc-jp-ce:212 gc-jp-mq:212 gc-us:212 gc-us-mq:212" \ #pragma increment_block_number "gc-eu:216 gc-eu-mq:216 gc-jp:212 gc-jp-ce:212 gc-jp-mq:212 gc-us:212 gc-us-mq:212" \
"ntsc-1.0:224 ntsc-1.1:224 ntsc-1.2:224 pal-1.0:228 pal-1.1:228" "ntsc-1.0:208 ntsc-1.1:208 ntsc-1.2:208 pal-1.0:228 pal-1.1:228"
#include "global.h" #include "global.h"
#include "ultra64.h" #include "ultra64.h"

View file

@ -17,6 +17,30 @@
#define SLOT_OFFSET(index) (SRAM_HEADER_SIZE + 0x10 + (index * SLOT_SIZE)) #define SLOT_OFFSET(index) (SRAM_HEADER_SIZE + 0x10 + (index * SLOT_SIZE))
#if !PLATFORM_IQUE
#define SRAM_READ(addr, dramAddr, size) SsSram_ReadWrite(addr, dramAddr, size, OS_READ)
#define SRAM_WRITE(addr, dramAddr, size) SsSram_ReadWrite(addr, dramAddr, size, OS_WRITE)
#else
void Sram_ReadWriteIQue(s32 addr, void* dramAddr, size_t size, s32 direction) {
void* sramAddr;
addr -= OS_K1_TO_PHYSICAL(0xA8000000);
sramAddr = (void*)(__osBbSramAddress + addr);
if (direction == OS_READ) {
bcopy(sramAddr, dramAddr, size);
} else if (direction == OS_WRITE) {
bcopy(dramAddr, sramAddr, size);
}
}
#define SRAM_READ(addr, dramAddr, size) Sram_ReadWriteIQue(addr, dramAddr, size, OS_READ)
#define SRAM_WRITE(addr, dramAddr, size) Sram_ReadWriteIQue(addr, dramAddr, size, OS_WRITE)
#endif
u16 gSramSlotOffsets[] = { u16 gSramSlotOffsets[] = {
SLOT_OFFSET(0), SLOT_OFFSET(0),
SLOT_OFFSET(1), SLOT_OFFSET(1),
@ -27,7 +51,23 @@ u16 gSramSlotOffsets[] = {
SLOT_OFFSET(5), SLOT_OFFSET(5),
}; };
static char sZeldaMagic[] = { '\0', '\0', '\0', '\x98', '\x09', '\x10', '\x21', 'Z', 'E', 'L', 'D', 'A' }; static u8 sSramDefaultHeader[] = {
// TODO: use enums for these
0, // SRAM_HEADER_SOUND
0, // SRAM_HEADER_ZTARGET
0, // SRAM_HEADER_LANGUAGE
// SRAM_HEADER_MAGIC
0x98,
0x09,
0x10,
0x21,
'Z',
'E',
'L',
'D',
'A',
};
static SavePlayerData sNewSavePlayerData = { static SavePlayerData sNewSavePlayerData = {
{ '\0', '\0', '\0', '\0', '\0', '\0' }, // newf { '\0', '\0', '\0', '\0', '\0', '\0' }, // newf
@ -138,15 +178,13 @@ static Inventory sNewSaveInventory = {
0, // gsTokens 0, // gsTokens
}; };
static u16 sNewSaveChecksum = 0; static Checksum sNewSaveChecksum = { 0 };
/** /**
* Initialize new save. * Initialize new save.
* This save has an empty inventory with 3 hearts and single magic. * This save has an empty inventory with 3 hearts and single magic.
*/ */
void Sram_InitNewSave(void) { void Sram_InitNewSave(void) {
SaveContext* temp = &gSaveContext;
bzero(&gSaveContext.save.info, sizeof(SaveInfo)); bzero(&gSaveContext.save.info, sizeof(SaveInfo));
gSaveContext.save.totalDays = 0; gSaveContext.save.totalDays = 0;
gSaveContext.save.bgsDayCount = 0; gSaveContext.save.bgsDayCount = 0;
@ -154,8 +192,8 @@ void Sram_InitNewSave(void) {
gSaveContext.save.info.playerData = sNewSavePlayerData; gSaveContext.save.info.playerData = sNewSavePlayerData;
gSaveContext.save.info.equips = sNewSaveEquips; gSaveContext.save.info.equips = sNewSaveEquips;
gSaveContext.save.info.inventory = sNewSaveInventory; gSaveContext.save.info.inventory = sNewSaveInventory;
gSaveContext.save.info.checksum = sNewSaveChecksum;
temp->save.info.checksum = sNewSaveChecksum;
gSaveContext.save.info.horseData.sceneId = SCENE_HYRULE_FIELD; gSaveContext.save.info.horseData.sceneId = SCENE_HYRULE_FIELD;
gSaveContext.save.info.horseData.pos.x = -1840; gSaveContext.save.info.horseData.pos.x = -1840;
gSaveContext.save.info.horseData.pos.y = 72; gSaveContext.save.info.horseData.pos.y = 72;
@ -297,7 +335,7 @@ static Inventory sDebugSaveInventory = {
0, // gsTokens 0, // gsTokens
}; };
static u16 sDebugSaveChecksum = 0; static Checksum sDebugSaveChecksum = { 0 };
/** /**
* Initialize debug save. This is also used on the Title Screen * Initialize debug save. This is also used on the Title Screen
@ -309,8 +347,6 @@ static u16 sDebugSaveChecksum = 0;
* and set water level in Water Temple to lowest level. * and set water level in Water Temple to lowest level.
*/ */
void Sram_InitDebugSave(void) { void Sram_InitDebugSave(void) {
SaveContext* temp = &gSaveContext;
bzero(&gSaveContext.save.info, sizeof(SaveInfo)); bzero(&gSaveContext.save.info, sizeof(SaveInfo));
gSaveContext.save.totalDays = 0; gSaveContext.save.totalDays = 0;
gSaveContext.save.bgsDayCount = 0; gSaveContext.save.bgsDayCount = 0;
@ -318,8 +354,8 @@ void Sram_InitDebugSave(void) {
gSaveContext.save.info.playerData = sDebugSavePlayerData; gSaveContext.save.info.playerData = sDebugSavePlayerData;
gSaveContext.save.info.equips = sDebugSaveEquips; gSaveContext.save.info.equips = sDebugSaveEquips;
gSaveContext.save.info.inventory = sDebugSaveInventory; gSaveContext.save.info.inventory = sDebugSaveInventory;
gSaveContext.save.info.checksum = sDebugSaveChecksum;
temp->save.info.checksum = sDebugSaveChecksum;
gSaveContext.save.info.horseData.sceneId = SCENE_HYRULE_FIELD; gSaveContext.save.info.horseData.sceneId = SCENE_HYRULE_FIELD;
gSaveContext.save.info.horseData.pos.x = -1840; gSaveContext.save.info.horseData.pos.x = -1840;
gSaveContext.save.info.horseData.pos.y = 72; gSaveContext.save.info.horseData.pos.y = 72;
@ -456,8 +492,11 @@ void Sram_OpenSave(SramContext* sramCtx) {
default: default:
if (gSaveContext.save.info.playerData.savedSceneId != SCENE_LINKS_HOUSE) { if (gSaveContext.save.info.playerData.savedSceneId != SCENE_LINKS_HOUSE) {
gSaveContext.save.entranceIndex = if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
(LINK_AGE_IN_YEARS == YEARS_CHILD) ? ENTR_LINKS_HOUSE_0 : ENTR_TEMPLE_OF_TIME_7; gSaveContext.save.entranceIndex = ENTR_LINKS_HOUSE_0;
} else {
gSaveContext.save.entranceIndex = ENTR_TEMPLE_OF_TIME_7;
}
} else { } else {
gSaveContext.save.entranceIndex = ENTR_LINKS_HOUSE_0; gSaveContext.save.entranceIndex = ENTR_LINKS_HOUSE_0;
} }
@ -505,7 +544,8 @@ void Sram_OpenSave(SramContext* sramCtx) {
// if zelda cutscene has been watched but lullaby was not obtained, restore cutscene and take away letter // if zelda cutscene has been watched but lullaby was not obtained, restore cutscene and take away letter
if (GET_EVENTCHKINF(EVENTCHKINF_40) && !CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) { if (GET_EVENTCHKINF(EVENTCHKINF_40) && !CHECK_QUEST_ITEM(QUEST_SONG_LULLABY)) {
i = gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] & ~EVENTCHKINF_MASK(EVENTCHKINF_40); i = gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40];
i &= ~EVENTCHKINF_MASK(EVENTCHKINF_40);
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] = i; gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_40] = i;
INV_CONTENT(ITEM_ZELDAS_LETTER) = ITEM_CHICKEN; INV_CONTENT(ITEM_ZELDAS_LETTER) = ITEM_CHICKEN;
@ -551,7 +591,7 @@ void Sram_WriteSave(SramContext* sramCtx) {
u16 j; u16 j;
u16* ptr; u16* ptr;
gSaveContext.save.info.checksum = 0; gSaveContext.save.info.checksum.value = 0;
ptr = (u16*)&gSaveContext; ptr = (u16*)&gSaveContext;
checksum = j = 0; checksum = j = 0;
@ -563,7 +603,7 @@ void Sram_WriteSave(SramContext* sramCtx) {
checksum += *ptr++; checksum += *ptr++;
} }
gSaveContext.save.info.checksum = checksum; gSaveContext.save.info.checksum.value = checksum;
ptr = (u16*)&gSaveContext; ptr = (u16*)&gSaveContext;
checksum = 0; checksum = 0;
@ -576,7 +616,7 @@ void Sram_WriteSave(SramContext* sramCtx) {
} }
offset = gSramSlotOffsets[gSaveContext.fileNum]; offset = gSramSlotOffsets[gSaveContext.fileNum];
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE);
ptr = (u16*)&gSaveContext; ptr = (u16*)&gSaveContext;
checksum = 0; checksum = 0;
@ -589,7 +629,7 @@ void Sram_WriteSave(SramContext* sramCtx) {
} }
offset = gSramSlotOffsets[gSaveContext.fileNum + 3]; offset = gSramSlotOffsets[gSaveContext.fileNum + 3];
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE);
} }
/** /**
@ -610,7 +650,7 @@ void Sram_VerifyAndLoadAllSaves(FileSelectState* fileSelect, SramContext* sramCt
PRINTF(" START─LOAD\n"); PRINTF(" START─LOAD\n");
bzero(sramCtx->readBuff, SRAM_SIZE); bzero(sramCtx->readBuff, SRAM_SIZE);
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_READ); SRAM_READ(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
dayTime = ((void)0, gSaveContext.save.dayTime); dayTime = ((void)0, gSaveContext.save.dayTime);
@ -620,8 +660,8 @@ void Sram_VerifyAndLoadAllSaves(FileSelectState* fileSelect, SramContext* sramCt
sizeof(Save)); sizeof(Save));
MemCpy(&gSaveContext, sramCtx->readBuff + offset, sizeof(Save)); MemCpy(&gSaveContext, sramCtx->readBuff + offset, sizeof(Save));
oldChecksum = gSaveContext.save.info.checksum; oldChecksum = gSaveContext.save.info.checksum.value;
gSaveContext.save.info.checksum = 0; gSaveContext.save.info.checksum.value = 0;
ptr = (u16*)&gSaveContext; ptr = (u16*)&gSaveContext;
PRINTF("\n %d \n", slotNum); PRINTF("\n %d \n", slotNum);
@ -645,8 +685,8 @@ void Sram_VerifyAndLoadAllSaves(FileSelectState* fileSelect, SramContext* sramCt
offset = gSramSlotOffsets[slotNum + 3]; offset = gSramSlotOffsets[slotNum + 3];
MemCpy(&gSaveContext, sramCtx->readBuff + offset, sizeof(Save)); MemCpy(&gSaveContext, sramCtx->readBuff + offset, sizeof(Save));
oldChecksum = gSaveContext.save.info.checksum; oldChecksum = gSaveContext.save.info.checksum.value;
gSaveContext.save.info.checksum = 0; gSaveContext.save.info.checksum.value = 0;
ptr = (u16*)&gSaveContext; ptr = (u16*)&gSaveContext;
PRINTF("================= BACK─UP ========================\n"); PRINTF("================= BACK─UP ========================\n");
@ -710,32 +750,33 @@ void Sram_VerifyAndLoadAllSaves(FileSelectState* fileSelect, SramContext* sramCt
newChecksum += *ptr++; newChecksum += *ptr++;
} }
gSaveContext.save.info.checksum = newChecksum; gSaveContext.save.info.checksum.value = newChecksum;
PRINTF("\nCheck_Sum=%x(%x)\n", gSaveContext.save.info.checksum, newChecksum); PRINTF("\nCheck_Sum=%x(%x)\n", gSaveContext.save.info.checksum.value, newChecksum);
i = gSramSlotOffsets[slotNum + 3]; i = gSramSlotOffsets[slotNum + 3];
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + i, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + i, &gSaveContext, SLOT_SIZE);
PRINTF("????#%x,%x,%x,%x,%x,%x\n", gSaveContext.save.info.playerData.newf[0], //! @bug The ??= below is interpreted as a trigraph for # by IDO
PRINTF("??????=%x,%x,%x,%x,%x,%x\n", gSaveContext.save.info.playerData.newf[0],
gSaveContext.save.info.playerData.newf[1], gSaveContext.save.info.playerData.newf[2], gSaveContext.save.info.playerData.newf[1], gSaveContext.save.info.playerData.newf[2],
gSaveContext.save.info.playerData.newf[3], gSaveContext.save.info.playerData.newf[4], gSaveContext.save.info.playerData.newf[3], gSaveContext.save.info.playerData.newf[4],
gSaveContext.save.info.playerData.newf[5]); gSaveContext.save.info.playerData.newf[5]);
PRINTF(T("\nぽいんと=%x(%d+3) check_sum=%x(%x)\n", "\npoints=%x(%d+3) check_sum=%x(%x)\n"), i, PRINTF(T("\nぽいんと=%x(%d+3) check_sum=%x(%x)\n", "\npoints=%x(%d+3) check_sum=%x(%x)\n"), i,
slotNum, gSaveContext.save.info.checksum, newChecksum); slotNum, gSaveContext.save.info.checksum.value, newChecksum);
} }
i = gSramSlotOffsets[slotNum]; i = gSramSlotOffsets[slotNum];
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + i, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + i, &gSaveContext, SLOT_SIZE);
PRINTF(T("ぽいんと=%x(%d) check_sum=%x(%x)\n", "point=%x(%d) check_sum=%x(%x)\n"), i, slotNum, PRINTF(T("ぽいんと=%x(%d) check_sum=%x(%x)\n", "point=%x(%d) check_sum=%x(%x)\n"), i, slotNum,
gSaveContext.save.info.checksum, newChecksum); gSaveContext.save.info.checksum.value, newChecksum);
} else { } else {
PRINTF(T("\nSAVEデータ \n", "\nSAVE data OK!!!!\n")); PRINTF(T("\nSAVEデータ \n", "\nSAVE data OK!!!!\n"));
} }
} }
bzero(sramCtx->readBuff, SRAM_SIZE); bzero(sramCtx->readBuff, SRAM_SIZE);
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_READ); SRAM_READ(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
gSaveContext.save.dayTime = dayTime; gSaveContext.save.dayTime = dayTime;
PRINTF("SAVECT=%x, NAME=%x, LIFE=%x, ITEM=%x, 64DD=%x, HEART=%x\n", DEATHS, NAME, HEALTH_CAP, QUEST, N64DD, PRINTF("SAVECT=%x, NAME=%x, LIFE=%x, ITEM=%x, 64DD=%x, HEART=%x\n", DEATHS, NAME, HEALTH_CAP, QUEST, N64DD,
@ -809,7 +850,14 @@ void Sram_InitSave(FileSelectState* fileSelect, SramContext* sramCtx) {
#endif #endif
for (offset = 0; offset < 8; offset++) { for (offset = 0; offset < 8; offset++) {
#if !PLATFORM_IQUE
gSaveContext.save.info.playerData.playerName[offset] = fileSelect->fileNames[fileSelect->buttonIndex][offset]; gSaveContext.save.info.playerData.playerName[offset] = fileSelect->fileNames[fileSelect->buttonIndex][offset];
#else
// Workaround for EGCS bug
u8* fileName = fileSelect->fileNames[fileSelect->buttonIndex];
gSaveContext.save.info.playerData.playerName[offset] = fileName[offset];
#endif
} }
gSaveContext.save.info.playerData.newf[0] = 'Z'; gSaveContext.save.info.playerData.newf[0] = 'Z';
@ -838,8 +886,8 @@ void Sram_InitSave(FileSelectState* fileSelect, SramContext* sramCtx) {
} }
} }
gSaveContext.save.info.checksum = checksum; gSaveContext.save.info.checksum.value = checksum;
PRINTF(T("\nチェックサム=%x\n", "\nChecksum = %x\n"), gSaveContext.save.info.checksum); PRINTF(T("\nチェックサム=%x\n", "\nChecksum = %x\n"), gSaveContext.save.info.checksum.value);
offset = gSramSlotOffsets[gSaveContext.fileNum]; offset = gSramSlotOffsets[gSaveContext.fileNum];
PRINTF("I=%x no=%d\n", offset, gSaveContext.fileNum); PRINTF("I=%x no=%d\n", offset, gSaveContext.fileNum);
@ -849,7 +897,7 @@ void Sram_InitSave(FileSelectState* fileSelect, SramContext* sramCtx) {
PRINTF("I=%x no=%d\n", offset, gSaveContext.fileNum + 3); PRINTF("I=%x no=%d\n", offset, gSaveContext.fileNum + 3);
MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save)); MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save));
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
PRINTF(T("SAVE終了\n", "SAVE end\n")); PRINTF(T("SAVE終了\n", "SAVE end\n"));
PRINTF("z_common_data.file_no = %d\n", gSaveContext.fileNum); PRINTF("z_common_data.file_no = %d\n", gSaveContext.fileNum);
@ -879,26 +927,26 @@ void Sram_InitSave(FileSelectState* fileSelect, SramContext* sramCtx) {
} }
void Sram_EraseSave(FileSelectState* fileSelect, SramContext* sramCtx) { void Sram_EraseSave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 offset; u16 offset;
Sram_InitNewSave(); Sram_InitNewSave();
offset = gSramSlotOffsets[fileSelect->selectedFileIndex]; offset = gSramSlotOffsets[fileSelect->selectedFileIndex];
MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save)); MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save));
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE);
MemCpy(&fileSelect->n64ddFlags[fileSelect->selectedFileIndex], sramCtx->readBuff + offset + N64DD, MemCpy(&fileSelect->n64ddFlags[fileSelect->selectedFileIndex], sramCtx->readBuff + offset + N64DD,
sizeof(fileSelect->n64ddFlags[0])); sizeof(fileSelect->n64ddFlags[0]));
offset = gSramSlotOffsets[fileSelect->selectedFileIndex + 3]; offset = gSramSlotOffsets[fileSelect->selectedFileIndex + 3];
MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save)); MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save));
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000) + offset, &gSaveContext, SLOT_SIZE);
PRINTF(T("CLEAR終了\n", "CLEAR END\n")); PRINTF(T("CLEAR終了\n", "CLEAR END\n"));
} }
void Sram_CopySave(FileSelectState* fileSelect, SramContext* sramCtx) { void Sram_CopySave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 offset; u16 offset;
PRINTF("=%d(%x) =%d(%x)\n", fileSelect->selectedFileIndex, PRINTF("=%d(%x) =%d(%x)\n", fileSelect->selectedFileIndex,
gSramSlotOffsets[fileSelect->selectedFileIndex], fileSelect->copyDestFileIndex, gSramSlotOffsets[fileSelect->selectedFileIndex], fileSelect->copyDestFileIndex,
@ -913,7 +961,7 @@ void Sram_CopySave(FileSelectState* fileSelect, SramContext* sramCtx) {
offset = gSramSlotOffsets[fileSelect->copyDestFileIndex + 3]; offset = gSramSlotOffsets[fileSelect->copyDestFileIndex + 3];
MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save)); MemCpy(sramCtx->readBuff + offset, &gSaveContext, sizeof(Save));
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
offset = gSramSlotOffsets[fileSelect->copyDestFileIndex]; offset = gSramSlotOffsets[fileSelect->copyDestFileIndex];
@ -943,23 +991,23 @@ void Sram_CopySave(FileSelectState* fileSelect, SramContext* sramCtx) {
* Write the first 16 bytes of the read buffer to the SRAM header * Write the first 16 bytes of the read buffer to the SRAM header
*/ */
void Sram_WriteSramHeader(SramContext* sramCtx) { void Sram_WriteSramHeader(SramContext* sramCtx) {
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_HEADER_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_HEADER_SIZE);
} }
void Sram_InitSram(GameState* gameState, SramContext* sramCtx) { void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
u16 i; u16 i;
PRINTF("sram_initialize( Game *game, Sram *sram )\n"); PRINTF("sram_initialize( Game *game, Sram *sram )\n");
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_READ); SRAM_READ(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
for (i = 0; i < ARRAY_COUNTU(sZeldaMagic) - 3; i++) { for (i = 0; i < ARRAY_COUNTU(sSramDefaultHeader) - SRAM_HEADER_MAGIC; i++) {
if (sZeldaMagic[i + SRAM_HEADER_MAGIC] != sramCtx->readBuff[i + SRAM_HEADER_MAGIC]) { if (sSramDefaultHeader[i + SRAM_HEADER_MAGIC] != sramCtx->readBuff[i + SRAM_HEADER_MAGIC]) {
PRINTF(T("SRAM破壊!!!!!!\n", "SRAM destruction!!!!!!\n")); PRINTF(T("SRAM破壊!!!!!!\n", "SRAM destruction!!!!!!\n"));
#if PLATFORM_GC && OOT_PAL #if PLATFORM_GC && OOT_PAL
gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE]; gSaveContext.language = sramCtx->readBuff[SRAM_HEADER_LANGUAGE];
#endif #endif
MemCpy(sramCtx->readBuff, sZeldaMagic, sizeof(sZeldaMagic)); MemCpy(sramCtx->readBuff, sSramDefaultHeader, sizeof(sSramDefaultHeader));
#if PLATFORM_GC && OOT_PAL #if PLATFORM_GC && OOT_PAL
sramCtx->readBuff[SRAM_HEADER_LANGUAGE] = gSaveContext.language; sramCtx->readBuff[SRAM_HEADER_LANGUAGE] = gSaveContext.language;
@ -986,7 +1034,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
for (i = 0; i < CHECKSUM_SIZE; i++) { for (i = 0; i < CHECKSUM_SIZE; i++) {
sramCtx->readBuff[i] = i; sramCtx->readBuff[i] = i;
} }
SsSram_ReadWrite(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE, OS_WRITE); SRAM_WRITE(OS_K1_TO_PHYSICAL(0xA8000000), sramCtx->readBuff, SRAM_SIZE);
PRINTF(T("SRAM破壊!!!!!!\n", "SRAM destruction!!!!!!\n")); PRINTF(T("SRAM破壊!!!!!!\n", "SRAM destruction!!!!!!\n"));
} }
#endif #endif

View file

@ -35,7 +35,7 @@
#include "cic6105.h" #include "cic6105.h"
#endif #endif
#pragma increment_block_number "gc-eu:167 gc-eu-mq:167 gc-jp:167 gc-jp-ce:167 gc-jp-mq:167 gc-us:167 gc-us-mq:167" \ #pragma increment_block_number "gc-eu:164 gc-eu-mq:164 gc-jp:164 gc-jp-ce:164 gc-jp-mq:164 gc-us:164 gc-us-mq:164" \
"ntsc-1.0:121 ntsc-1.1:121 ntsc-1.2:121 pal-1.0:121 pal-1.1:121" "ntsc-1.0:121 ntsc-1.1:121 ntsc-1.2:121 pal-1.0:121 pal-1.1:121"
#define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED

View file

@ -1824,6 +1824,7 @@ SkinMatrix_MtxFToMtx = 0x80095D40; // type:func
SkinMatrix_MtxFToNewMtx = 0x80095F58; // type:func SkinMatrix_MtxFToNewMtx = 0x80095F58; // type:func
SkinMatrix_SetRotateAxis = 0x80095FA0; // type:func SkinMatrix_SetRotateAxis = 0x80095FA0; // type:func
func_800A8030 = 0x80096110; // type:func func_800A8030 = 0x80096110; // type:func
Sram_ReadWriteIQue = 0x80096280; // type:func
Sram_InitNewSave = 0x800962D0; // type:func Sram_InitNewSave = 0x800962D0; // type:func
Sram_InitDebugSave = 0x80096420; // type:func Sram_InitDebugSave = 0x80096420; // type:func
Sram_OpenSave = 0x800965E8; // type:func Sram_OpenSave = 0x800965E8; // type:func