声音失真的处理

This commit is contained in:
root 2023-10-16 17:56:55 +08:00
parent 5622b0944a
commit 32c763d8b7
4 changed files with 34 additions and 26 deletions

View File

@ -25,7 +25,7 @@ SOURCES := ../libn3ds/kernel/source ../libn3ds/source ../libn3ds/source/drivers
DATA := DATA :=
INCLUDES := ../libn3ds/include ../libn3ds/include/arm11 ../libn3ds/kernel/include ../libn3ds/thirdparty ../include \ INCLUDES := ../libn3ds/include ../libn3ds/include/arm11 ../libn3ds/kernel/include ../libn3ds/thirdparty ../include \
../thirdparty ../thirdparty
DEFINES := -DARM11 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ DEFINES := -DARM11 -D_3DS -DLIBN3DS_LEGACY=1 -DVERS_STRING=\"$(VERS_STRING)\" \
-DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR)
ASSETS := ASSETS :=

View File

@ -22,7 +22,7 @@ SOURCES := ../libn3ds/source ../libn3ds/source/drivers/mmc ../libn3ds/source/dr
../libn3ds/source/arm9/drivers ../libn3ds/thirdparty/fatfs ../source/arm9 ../libn3ds/source/arm9/drivers ../libn3ds/thirdparty/fatfs ../source/arm9
DATA := DATA :=
INCLUDES := ../libn3ds/include ../libn3ds/include/arm9 ../libn3ds/thirdparty ../include ../thirdparty INCLUDES := ../libn3ds/include ../libn3ds/include/arm9 ../libn3ds/thirdparty ../include ../thirdparty
DEFINES := -DARM9 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ DEFINES := -DARM9 -D_3DS -DLIBN3DS_LEGACY=1 -DVERS_STRING=\"$(VERS_STRING)\" \
-DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR)
ifneq ($(strip $(NO_DEBUG)),) ifneq ($(strip $(NO_DEBUG)),)

View File

@ -217,31 +217,35 @@ static u32 fixRomPadding(u32 romFileSize)
// Pad unused ROM area with 0xFFs (trimmed ROMs). // Pad unused ROM area with 0xFFs (trimmed ROMs).
// Smallest retail ROM chip is 8 Mbit (1 MiB). // Smallest retail ROM chip is 8 Mbit (1 MiB).
u32 romSize = nextPow2(romFileSize); u32 romSize = nextPow2(romFileSize);
if(romSize < 0x100000u) romSize = 0x100000u; if(romSize < 0x100000) romSize = 0x100000;
memset((void*)(LGY_ROM_LOC + romFileSize), 0xFFFFFFFFu, romSize - romFileSize); const uintptr_t romLoc = LGY_ROM_LOC;
memset((void*)(romLoc + romFileSize), 0xFFFFFFFF, romSize - romFileSize);
if(romSize > 0x100000u) // >1 MiB. u32 mirroredSize = romSize;
if(romSize == 0x100000) // 1 MiB.
{ {
// Fake "open bus" padding. // ROM mirroring for Classic NES Series/others with 8 Mbit ROM.
u32 padding = (LGY_ROM_LOC + romSize) / 2; // The ROM is mirrored exactly 4 times.
padding = __pkhbt(padding, padding + 1, 16); // Copy lower half + 1 to upper half. // Thanks to endrift for discovering this.
for(uintptr_t i = LGY_ROM_LOC + romSize; i < LGY_ROM_LOC + LGY_MAX_ROM_SIZE; i += 4) mirroredSize = 0x400000; // 4 MiB.
uintptr_t mirrorLoc = romLoc + romSize;
do
{ {
*(u32*)i = padding; memcpy((void*)mirrorLoc, (void*)romLoc, romSize);
padding = __uadd16(padding, 0x00020002u); // Unsigned parallel halfword-wise addition. mirrorLoc += romSize;
} } while(mirrorLoc < romLoc + mirroredSize);
}
else
{
// ROM mirroring (Classic NES Series/possibly others with 8 Mbit ROM).
// Mirror ROM across the entire 32 MiB area.
for(uintptr_t i = LGY_ROM_LOC + romSize; i < LGY_ROM_LOC + LGY_MAX_ROM_SIZE; i += romSize)
{
//memcpy((void*)i, (void*)(i - romSize), romSize); // 0x23A15DD
memcpy((void*)i, (void*)LGY_ROM_LOC, romSize); // 0x237109B
}
} }
// Fake "open bus" padding.
u32 padding = (romLoc + mirroredSize) / 2;
padding = __pkhbt(padding, padding + 1, 16); // Copy lower half + 1 to upper half.
for(uintptr_t i = romLoc + mirroredSize; i < romLoc + LGY_MAX_ROM_SIZE; i += 4)
{
*(u32*)i = padding;
padding = __uadd16(padding, 0x20002); // Unsigned parallel halfword-wise addition.
}
// We don't return the mirrored size because the db hashes are over unmirrored dumps.
return romSize; return romSize;
} }
@ -284,12 +288,14 @@ static Result loadGbaRom(char * path, u32 *const romSizeOut)
} }
{ {
// @MERGE 231006 END
u8 *ptr = (u8*)LGY_ROM_LOC; u8 *ptr = (u8*)LGY_ROM_LOC;
u32 read; u32 read;
while((res = fRead(f, ptr, 0x100000u, &read)) == RES_OK && read == 0x100000u) // 貌似fatfs更新后fread支持一次调用读取较大size的文件了
ptr += 0x100000u; // 然而经过测试fRead并不能解决acl.c的问题。所以目前继续用fReadSize
res = fRead(f, (void*)ptr, fileSize, &read);
if( res != RES_OK ) return res;
fClose(f); fClose(f);
// @MERGE 231006 END
// use the gbaatm cheat // use the gbaatm cheat
if( g_oafConfig.cheatMode != CHEAT_MODE_DISABLED if( g_oafConfig.cheatMode != CHEAT_MODE_DISABLED

View File

@ -39,7 +39,9 @@ const char* oafResult2String(Result res)
#ifdef ARM11 #ifdef ARM11
void printError(Result res) void printError(Result res)
{ {
ee_printf("Error: %s.\n", oafResult2String(res)); // @MERGE 231006 START
ee_printf("Error<%ld>: %s.\n", res, oafResult2String(res));
// @MERGE 231006 END
} }
void printErrorWaitInput(Result res, u32 waitKeys) void printErrorWaitInput(Result res, u32 waitKeys)