Files
HackerOoT/src/code/sys_ucode.c

119 lines
4.5 KiB
C
Raw Normal View History

#include "global.h"
2024-08-28 13:23:54 +02:00
#include "fault.h"
2020-03-17 00:31:30 -04:00
#if !ENABLE_F3DEX3
u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_PosLight_fifoTextStart;
u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_PosLight_fifoDataStart;
#endif
u64* SysUcode_GetUCodeBoot(void) {
return rspbootTextStart;
2020-03-17 00:31:30 -04:00
}
size_t SysUcode_GetUCodeBootSize(void) {
return (size_t)((u8*)rspbootTextEnd - (u8*)rspbootTextStart);
2020-03-17 00:31:30 -04:00
}
#if ENABLE_F3DEX3
DECLARE_ROM_SEGMENT(F3DEX3_BrW_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PA_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PA_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PB_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PB_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PC_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_PC_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PA_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PA_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PB_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PB_Data)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PC_Text)
DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PC_Data)
static const u8* const sF3DEX3TextRomStartAddrs[8] = {
_F3DEX3_BrW_TextSegmentRomStart, _F3DEX3_BrW_PA_TextSegmentRomStart,
_F3DEX3_BrW_PB_TextSegmentRomStart, _F3DEX3_BrW_PC_TextSegmentRomStart,
_F3DEX3_BrW_NOC_TextSegmentRomStart, _F3DEX3_BrW_NOC_PA_TextSegmentRomStart,
_F3DEX3_BrW_NOC_PB_TextSegmentRomStart, _F3DEX3_BrW_NOC_PC_TextSegmentRomStart,
};
static const u8* const sF3DEX3TextRomEndAddrs[8] = {
_F3DEX3_BrW_TextSegmentRomEnd, _F3DEX3_BrW_PA_TextSegmentRomEnd, _F3DEX3_BrW_PB_TextSegmentRomEnd,
_F3DEX3_BrW_PC_TextSegmentRomEnd, _F3DEX3_BrW_NOC_TextSegmentRomEnd, _F3DEX3_BrW_NOC_PA_TextSegmentRomEnd,
_F3DEX3_BrW_NOC_PB_TextSegmentRomEnd, _F3DEX3_BrW_NOC_PC_TextSegmentRomEnd,
};
static const u8* const sF3DEX3DataRomStartAddrs[8] = {
_F3DEX3_BrW_DataSegmentRomStart, _F3DEX3_BrW_PA_DataSegmentRomStart,
_F3DEX3_BrW_PB_DataSegmentRomStart, _F3DEX3_BrW_PC_DataSegmentRomStart,
_F3DEX3_BrW_NOC_DataSegmentRomStart, _F3DEX3_BrW_NOC_PA_DataSegmentRomStart,
_F3DEX3_BrW_NOC_PB_DataSegmentRomStart, _F3DEX3_BrW_NOC_PC_DataSegmentRomStart,
};
static const u8* const sF3DEX3DataRomEndAddrs[8] = {
_F3DEX3_BrW_DataSegmentRomEnd, _F3DEX3_BrW_PA_DataSegmentRomEnd, _F3DEX3_BrW_PB_DataSegmentRomEnd,
_F3DEX3_BrW_PC_DataSegmentRomEnd, _F3DEX3_BrW_NOC_DataSegmentRomEnd, _F3DEX3_BrW_NOC_PA_DataSegmentRomEnd,
_F3DEX3_BrW_NOC_PB_DataSegmentRomEnd, _F3DEX3_BrW_NOC_PC_DataSegmentRomEnd,
};
/* These can't be automatically determined from the files, because that is only
known at link time, whereas these sizes have to be known at compile time. */
#define F3DEX3_TEXT_MAX_SIZE 6400 /* currently 6152 bytes */
#define F3DEX3_DATA_MAX_SIZE 768 /* currently 728 bytes */
__attribute__((aligned(16))) u8 gF3DEX3TextBuffer[F3DEX3_TEXT_MAX_SIZE];
__attribute__((aligned(16))) u8 gF3DEX3DataBuffer[F3DEX3_DATA_MAX_SIZE];
volatile s8 gLoadedF3DEX3Version = -1;
volatile s8 gF3DEX3ProfVersion = 0;
volatile s8 gF3DEX3NOCVersion = 1;
s8 gF3DEX3OccMode = F3DEX3_OCC_MODE_AUTO;
void SysUcode_LoadNewUcodeIfChanged() {
if (gF3DEX3OccMode == F3DEX3_OCC_MODE_ALWAYS) {
gF3DEX3NOCVersion = 0;
} else if (gF3DEX3OccMode == F3DEX3_OCC_MODE_NEVER) {
gF3DEX3NOCVersion = 1;
} // else if AUTO, controlled by occlusion planes system
s8 ver = gF3DEX3ProfVersion | (gF3DEX3NOCVersion << 2);
if (gLoadedF3DEX3Version == ver) {
return;
}
ver &= 7; // make sure valid
const u8* textVrom = sF3DEX3TextRomStartAddrs[ver];
2024-05-26 12:59:43 -07:00
u32 textSize = sF3DEX3TextRomEndAddrs[ver] - textVrom;
const u8* dataVrom = sF3DEX3DataRomStartAddrs[ver];
2024-05-26 12:59:43 -07:00
u32 dataSize = sF3DEX3DataRomEndAddrs[ver] - dataVrom;
if (textSize > F3DEX3_TEXT_MAX_SIZE) {
Fault_AddHungupAndCrash("ucode_text_too_big", __LINE__);
return;
}
if (dataSize > F3DEX3_DATA_MAX_SIZE) {
Fault_AddHungupAndCrash("ucode_data_too_big", __LINE__);
return;
}
DMA_REQUEST_SYNC(gF3DEX3TextBuffer, (u32)textVrom, textSize, "sys_ucode.c", __LINE__);
DMA_REQUEST_SYNC(gF3DEX3DataBuffer, (u32)dataVrom, dataSize, "sys_ucode.c", __LINE__);
gLoadedF3DEX3Version = ver;
}
#endif
u64* SysUcode_GetUCode(void) {
#if ENABLE_F3DEX3
return (u64*)gF3DEX3TextBuffer;
#else
return sDefaultGSPUCodeText;
#endif
2020-03-17 00:31:30 -04:00
}
u64* SysUcode_GetUCodeData(void) {
#if ENABLE_F3DEX3
return (u64*)gF3DEX3DataBuffer;
#else
return sDefaultGSPUCodeData;
#endif
2020-03-17 00:31:30 -04:00
}