mirror of
https://github.com/zeldaret/oot
synced 2026-06-29 11:30:56 -04:00
[ntsc-1.2] LoadFragment2 OK (#2118)
* [ntsc-1.2] LoadFragment2 OK * Add insight about bssSize
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
#include "global.h"
|
||||
|
||||
size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, void* vramEnd, void* allocatedRamAddr) {
|
||||
s32 pad[3];
|
||||
uintptr_t end;
|
||||
OverlayRelocationSection* ovlRelocs;
|
||||
u32 relocSectionOffset = 0;
|
||||
s32 size = vromEnd - vromStart;
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(
|
||||
T("\nダイナミックリンクファンクションのロードを開始します\n", "\nStart loading dynamic link function\n"));
|
||||
}
|
||||
|
||||
size = vromEnd - vromStart;
|
||||
end = (uintptr_t)allocatedRamAddr + size;
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(T("TEXT,DATA,RODATA+relをDMA転送します(%08x-%08x)\n",
|
||||
"DMA transfer of TEXT, DATA, RODATA + rel (%08x-%08x)\n"),
|
||||
allocatedRamAddr, end);
|
||||
}
|
||||
|
||||
// DMA the overlay, wait until transfer completes
|
||||
DmaMgr_RequestSync(allocatedRamAddr, vromStart, size);
|
||||
|
||||
// The overlay file is expected to contain a 32-bit offset from the end of the file to the start of the
|
||||
// relocation section.
|
||||
relocSectionOffset = ((s32*)end)[-1];
|
||||
ovlRelocs = (OverlayRelocationSection*)(end - relocSectionOffset);
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF("TEXT(%08x), DATA(%08x), RODATA(%08x), BSS(%08x)\n", ovlRelocs->textSize, ovlRelocs->dataSize,
|
||||
ovlRelocs->rodataSize, ovlRelocs->bssSize);
|
||||
}
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(T("リロケーションします\n", "Relocate\n"));
|
||||
}
|
||||
|
||||
// Relocate pointers in overlay code and data
|
||||
Overlay_Relocate(allocatedRamAddr, ovlRelocs, vramStart);
|
||||
|
||||
// Clear bss if present, bss is located immediately following the relocations
|
||||
if (ovlRelocs->bssSize != 0) {
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(T("BSS領域をクリアします(%08x-%08x)\n", "Clear BSS area (%08x-%08x)\n"), end,
|
||||
end + ovlRelocs->bssSize);
|
||||
}
|
||||
bzero((void*)end, ovlRelocs->bssSize);
|
||||
}
|
||||
|
||||
size = (uintptr_t)(ovlRelocs->relocations + ovlRelocs->nRelocations) - (uintptr_t)ovlRelocs;
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(T("REL領域をクリアします(%08x-%08x)\n", "Clear REL area (%08x-%08x)\n"), ovlRelocs,
|
||||
(uintptr_t)ovlRelocs + size);
|
||||
}
|
||||
|
||||
// Clear relocations, this space remains allocated and goes unused
|
||||
bzero(ovlRelocs, size);
|
||||
|
||||
// Manually flush caches
|
||||
size = (uintptr_t)vramEnd - (uintptr_t)vramStart;
|
||||
osWritebackDCache(allocatedRamAddr, size);
|
||||
osInvalICache(allocatedRamAddr, size);
|
||||
|
||||
if (gOverlayLogSeverity >= 3) {
|
||||
PRINTF(
|
||||
T("ダイナミックリンクファンクションのロードを終了します\n\n", "Finish loading dynamic link function\n\n"));
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
Reference in New Issue
Block a user