mirror of
https://github.com/HackerN64/HackerOoT.git
synced 2026-01-21 10:37:37 -08:00
119 lines
4.5 KiB
C
119 lines
4.5 KiB
C
#include "global.h"
|
|
#include "fault.h"
|
|
|
|
#if !ENABLE_F3DEX3
|
|
u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_PosLight_fifoTextStart;
|
|
u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_PosLight_fifoDataStart;
|
|
#endif
|
|
|
|
u64* SysUcode_GetUCodeBoot(void) {
|
|
return rspbootTextStart;
|
|
}
|
|
|
|
size_t SysUcode_GetUCodeBootSize(void) {
|
|
return (size_t)((u8*)rspbootTextEnd - (u8*)rspbootTextStart);
|
|
}
|
|
|
|
#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];
|
|
u32 textSize = sF3DEX3TextRomEndAddrs[ver] - textVrom;
|
|
const u8* dataVrom = sF3DEX3DataRomStartAddrs[ver];
|
|
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
|
|
}
|
|
|
|
u64* SysUcode_GetUCodeData(void) {
|
|
#if ENABLE_F3DEX3
|
|
return (u64*)gF3DEX3DataBuffer;
|
|
#else
|
|
return sDefaultGSPUCodeData;
|
|
#endif
|
|
}
|