From 66f12d92e504d793147bb84b39b15279d3afb834 Mon Sep 17 00:00:00 2001 From: root <182859762@qq.com> Date: Thu, 12 Oct 2023 16:29:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=85=E5=90=88=E5=B9=B6libn3ds=E6=89=80?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=E5=89=8D=E7=AB=AF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arm11/Makefile | 4 +- arm9/Makefile | 2 +- include/oaf_error_codes.h | 44 ++++++++++++ source/arm11/keyremix.c | 12 +++- source/arm11/main.c | 3 + source/arm11/open_agb_firm.c | 127 +++++++++++++++++++++++++++-------- source/oaf_error_codes.c | 66 ++++++++++++++++++ 7 files changed, 226 insertions(+), 32 deletions(-) create mode 100644 include/oaf_error_codes.h create mode 100644 source/oaf_error_codes.c diff --git a/arm11/Makefile b/arm11/Makefile index 6d56637..da84f68 100644 --- a/arm11/Makefile +++ b/arm11/Makefile @@ -21,9 +21,9 @@ BUILD := build SOURCES := ../libn3ds/kernel/source ../libn3ds/source ../libn3ds/source/drivers/mmc \ ../libn3ds/source/drivers ../libn3ds/source/arm11 ../libn3ds/source/arm11/allocator \ ../libn3ds/source/arm11/drivers ../libn3ds/source/arm11/util/rbtree ../source/arm11 \ - ../thirdparty/inih + ../thirdparty/inih ../source DATA := -INCLUDES := ../libn3ds/include ../libn3ds/kernel/include ../libn3ds/thirdparty ../include \ +INCLUDES := ../libn3ds/include ../libn3ds/include/arm11 ../libn3ds/kernel/include ../libn3ds/thirdparty ../include \ ../thirdparty DEFINES := -DARM11 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) diff --git a/arm9/Makefile b/arm9/Makefile index 26cb6cc..bfab345 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -21,7 +21,7 @@ BUILD := build SOURCES := ../libn3ds/source ../libn3ds/source/drivers/mmc ../libn3ds/source/drivers ../libn3ds/source/arm9 \ ../libn3ds/source/arm9/drivers ../libn3ds/thirdparty/fatfs ../source/arm9 DATA := -INCLUDES := ../libn3ds/include ../libn3ds/thirdparty ../include ../thirdparty +INCLUDES := ../libn3ds/include ../libn3ds/include/arm9 ../libn3ds/thirdparty ../include ../thirdparty DEFINES := -DARM9 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) diff --git a/include/oaf_error_codes.h b/include/oaf_error_codes.h new file mode 100644 index 0000000..5f42273 --- /dev/null +++ b/include/oaf_error_codes.h @@ -0,0 +1,44 @@ +#pragma once + +/* + * This file is part of open_agb_firm + * Copyright (C) 2022 derrek, profi200 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "error_codes.h" + + +#define MAKE_CUSTOM_ERR(e) (CUSTOM_ERR_OFFSET + (e)) + +// Keep errors in the range of 0-CUSTOM_ERR_OFFSET - 1. +enum +{ + // Custom errors. + RES_ROM_TOO_BIG = MAKE_CUSTOM_ERR(0u), + RES_INVALID_PATCH = MAKE_CUSTOM_ERR(1u), + + MAX_OAF_RES_VALUE = RES_ROM_TOO_BIG +}; + +#undef MAKE_CUSTOM_ERR + + + +const char* oafResult2String(Result res); +#ifdef ARM11 +void printError(Result res); +void printErrorWaitInput(Result res, u32 waitKeys); +#endif // ifdef ARM11 diff --git a/source/arm11/keyremix.c b/source/arm11/keyremix.c index 931b827..0d59760 100644 --- a/source/arm11/keyremix.c +++ b/source/arm11/keyremix.c @@ -1,7 +1,9 @@ #include #include "fs.h" #include "fsutil.h" -#include "drivers/lgy.h" +// @MERGE 231006 START +#include "drivers/lgy11.h" +// @MERGE 231006 END #include "arm11/keyremix.h" key_remix_t g_keyremixConfig[KEY_REMIX_LIMIT]; @@ -105,7 +107,13 @@ void keyremix_update( uint16_t active_cheatkey ) } else if( frozen_end == frozen_start )// 空白键位设置,走原来流程就好 { - LGY_handleOverrides(); + // @MERGE 231006 START + if( now & KEY_CPAD_MASK ){ + *hid_set = (now>>24) ^ KEY_DPAD_MASK; + *hid_mode = KEY_DPAD_MASK; + } + else *hid_mode = 0; + // @MERGE 231006 END } else { diff --git a/source/arm11/main.c b/source/arm11/main.c index 156ac33..22ddabe 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -25,6 +25,9 @@ #include "arm11/drivers/hid.h" #include "arm11/power.h" #include "arm11/acf.h" +// @MERGE 231006 START +#include "oaf_error_codes.h" +// @MERGE 231006 END static void setBacklight(void) { diff --git a/source/arm11/open_agb_firm.c b/source/arm11/open_agb_firm.c index 9c21562..7335f0d 100644 --- a/source/arm11/open_agb_firm.c +++ b/source/arm11/open_agb_firm.c @@ -24,7 +24,9 @@ #include "util.h" #include "drivers/sha.h" #include "arm11/drivers/hid.h" -#include "drivers/lgy.h" +// @MERGE 231006 START +#include "drivers/lgy_common.h" +// @MERGE 231006 END #include "arm11/drivers/lgyfb.h" #include "arm11/console.h" #include "arm11/fmt.h" @@ -45,6 +47,9 @@ #include "kernel.h" #include "kevent.h" #include "arm11/drivers/codec.h" +// @MERGE 231006 START +#include "oaf_error_codes.h" +// @MERGE 231006 END #define OAF_WORK_DIR "sdmc:/3ds/open_agb_firm" @@ -113,22 +118,22 @@ Result dump_rom( u32 size ) if( (res=fOpen(&file, "dump.gba", FA_OPEN_ALWAYS|FA_WRITE)) != RES_OK ) return res; - u8 *p = ROM_LOC; + u8 *p = LGY_ROM_LOC; u32 len; ee_printf("dumping into dump.gba, file size %ld\n", size); - for( u8 *p=ROM_LOC; size > 0; size-=len, p+=len ) + for( u8 *p=LGY_ROM_LOC; size > 0; size-=len, p+=len ) { res = fWrite( file, p, size < 256 ? size : 256, &len ); if( res != RES_OK ) break; - if( ((u32)p-ROM_LOC) % (1024*4) == 0) + if( ((u32)p-LGY_ROM_LOC) % (1024*4) == 0) { res = fSync( file ); if( res != RES_OK) break; - if( ((u32)p-ROM_LOC) % (1024*64) == 0) + if( ((u32)p-LGY_ROM_LOC) % (1024*64) == 0) ee_printf("\x1b[3;1Hremaining %ld bytes to dump.\n", size); } } @@ -213,14 +218,14 @@ static u32 fixRomPadding(u32 romFileSize) // Smallest retail ROM chip is 8 Mbit (1 MiB). u32 romSize = nextPow2(romFileSize); if(romSize < 0x100000u) romSize = 0x100000u; - memset((void*)(ROM_LOC + romFileSize), 0xFFFFFFFFu, romSize - romFileSize); + memset((void*)(LGY_ROM_LOC + romFileSize), 0xFFFFFFFFu, romSize - romFileSize); if(romSize > 0x100000u) // >1 MiB. { // Fake "open bus" padding. - u32 padding = (ROM_LOC + romSize) / 2; + u32 padding = (LGY_ROM_LOC + romSize) / 2; padding = __pkhbt(padding, padding + 1, 16); // Copy lower half + 1 to upper half. - for(uintptr_t i = ROM_LOC + romSize; i < ROM_LOC + MAX_ROM_SIZE; i += 4) + for(uintptr_t i = LGY_ROM_LOC + romSize; i < LGY_ROM_LOC + LGY_MAX_ROM_SIZE; i += 4) { *(u32*)i = padding; padding = __uadd16(padding, 0x00020002u); // Unsigned parallel halfword-wise addition. @@ -230,10 +235,10 @@ static u32 fixRomPadding(u32 romFileSize) { // ROM mirroring (Classic NES Series/possibly others with 8 Mbit ROM). // Mirror ROM across the entire 32 MiB area. - for(uintptr_t i = ROM_LOC + romSize; i < ROM_LOC + MAX_ROM_SIZE; i += romSize) + 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*)ROM_LOC, romSize); // 0x237109B + memcpy((void*)i, (void*)LGY_ROM_LOC, romSize); // 0x237109B } } @@ -270,10 +275,17 @@ static Result loadGbaRom(const char *const path, u32 *const romSizeOut) FHandle f; if((res = fOpen(&f, path, FA_OPEN_EXISTING | FA_READ)) == RES_OK) { - u32 fileSize; - if((fileSize = fSize(f)) <= MAX_ROM_SIZE) + // @MERGE 231006 START + u32 fileSize = fSize(f); + if(fileSize > LGY_MAX_ROM_SIZE) { - u8 *ptr = (u8*)ROM_LOC; + fileSize = LGY_MAX_ROM_SIZE; + ee_puts("Warning: ROM file is too big. Expect crashes."); + } + + { + // @MERGE 231006 END + u8 *ptr = (u8*)LGY_ROM_LOC; u32 read; while((res = fRead(f, ptr, 0x100000u, &read)) == RES_OK && read == 0x100000u) ptr += 0x100000u; @@ -284,7 +296,7 @@ static Result loadGbaRom(const char *const path, u32 *const romSizeOut) && info_current_cheat(NULL, NULL) == CCHT_OK ) { char gamecode[5]; - memcpy( gamecode, (void*)(ROM_LOC+0xac), 4 ); + memcpy( gamecode, (void*)(LGY_ROM_LOC+0xac), 4 ); gamecode[4] = '\0'; acl_open_lib( "gba.acl" ); acl_select_game( gamecode, 0, NULL ); @@ -302,11 +314,13 @@ static Result loadGbaRom(const char *const path, u32 *const romSizeOut) dump_rom( fileSize ); } #endif - } - else - { - res = RES_ROM_TOO_BIG; - fClose(f); + // @MERGE 231006 START + // else + // { + // res = RES_ROM_TOO_BIG; + // fClose(f); + // } + // @MERGE 231006 END } } @@ -366,7 +380,7 @@ static u16 checkSaveOverride(u32 gameCode) // Save type overrides for modern hom static u16 detectSaveType(u32 romSize) { - const u32 *romPtr = (u32*)ROM_LOC; + const u32 *romPtr = (u32*)LGY_ROM_LOC; u16 saveType; if( g_oafConfig.savePolicy == SAVE_POLICY_SRAM ) { @@ -387,7 +401,7 @@ static u16 detectSaveType(u32 romSize) else saveType = defaultSave; - for(; romPtr < (u32*)(ROM_LOC + romSize); romPtr++) + for(; romPtr < (u32*)(LGY_ROM_LOC + romSize); romPtr++) { u32 tmp = *romPtr; @@ -508,7 +522,7 @@ static u16 getSaveType(u32 romSize, const char *const savePath) //const bool saveExists = fStat(savePath, &fi) == RES_OK; u64 sha1[3]; - sha((u32*)ROM_LOC, romSize, (u32*)sha1, SHA_IN_BIG | SHA_1_MODE, SHA_OUT_BIG); + sha((u32*)LGY_ROM_LOC, romSize, (u32*)sha1, SHA_IN_BIG | SHA_1_MODE, SHA_OUT_BIG); Result res; GameDbEntry dbEntry; @@ -708,7 +722,9 @@ static void gbaGfxHandler(void *args) GFX_swapFramebufs(); //if(hidKeysDown() == (KEY_Y | KEY_SELECT)) dumpFrameTex(); - CODEC_soundSwitchOutput(); + // @MERGE 231006 START + CODEC_runHeadphoneDetection(); + // @MERGE 231006 END } taskExit(); @@ -882,6 +898,57 @@ u16 oafGetBacklightConfig(void) return g_oafConfig.backlight; } +// @MERGE 231006 START +KHandle setupFrameCapture(const u8 scaler) +{ + const bool is240x160 = scaler < 2; + static const s16 matrix[12 * 8] = + { + // Vertical. + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x24B0, 0x4000, 0, 0x24B0, 0x4000, 0, 0, + 0x4000, 0x2000, 0, 0x4000, 0x2000, 0, 0, 0, + 0, -0x4B0, 0, 0, -0x4B0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + // Horizontal. + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x24B0, 0, 0, 0x24B0, 0, 0, + 0x4000, 0x4000, 0x2000, 0x4000, 0x4000, 0x2000, 0, 0, + 0, 0, -0x4B0, 0, 0, -0x4B0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }; + + ScalerCfg gbaCfg; + gbaCfg.w = (is240x160 ? 240 : 360); + gbaCfg.h = (is240x160 ? 160 : 240); + gbaCfg.vLen = 6; + gbaCfg.vPatt = 0b00011011; + memcpy(gbaCfg.vMatrix, matrix, 6 * 8 * 2); + gbaCfg.hLen = 6; + gbaCfg.hPatt = (is240x160 ? 0b00111111 : 0b00011011); + + if(is240x160) + { + memset(gbaCfg.hMatrix, 0, 6 * 8 * 2); + s16 *const identityRow = &gbaCfg.hMatrix[3 * 8]; + for(unsigned i = 0; i < 6; i++) + { + // Set identity entries. + identityRow[i] = 0x4000; + } + } + else + { + memcpy(gbaCfg.hMatrix, &matrix[6 * 8], 6 * 8 * 2); + } + + return LGYFB_init(&gbaCfg); +} +// @MERGE 231006 END + Result oafInitAndRun(void) { Result res; @@ -937,9 +1004,11 @@ Result oafInitAndRun(void) #endif // Initialize the legacy frame buffer and frame handler. - const KHandle frameReadyEvent = createEvent(false); + // @MERGE 231006 START + const KHandle frameReadyEvent = setupFrameCapture(g_oafConfig.scaler); { - LGYFB_init(frameReadyEvent, g_oafConfig.scaler); // 这里把GBA的输出转换成0x18200000处512x512大小的纹理 + //LGYFB_init(frameReadyEvent, g_oafConfig.scaler); // 这里把GBA的输出转换成0x18200000处512x512大小的纹理 + // @MERGE 231006 END patchGbaGpuCmdList(g_oafConfig.scaler); if( g_oafConfig.scaler == 3u ) { @@ -954,7 +1023,9 @@ Result oafInitAndRun(void) // Adjust gamma table and sync LgyFb start with LCD VBlank. adjustGammaTableForGba(); GFX_waitForVBlank0(); - LGY_switchMode(); + // @MERGE 231006 START + LGY11_switchMode(); + // @MERGE 231006 END } } while(0); } @@ -979,5 +1050,7 @@ void oafFinish(void) deleteEvent(g_frameReadyEvent); // gbaGfxHandler() will automatically terminate. g_frameReadyEvent = 0; } - LGY_deinit(); + // @MERGE 231006 START + LGY11_deinit(); + // @MERGE 231006 END } diff --git a/source/oaf_error_codes.c b/source/oaf_error_codes.c new file mode 100644 index 0000000..e62cb3e --- /dev/null +++ b/source/oaf_error_codes.c @@ -0,0 +1,66 @@ +/* + * This file is part of open_agb_firm + * Copyright (C) 2022 derrek, profi200 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "oaf_error_codes.h" +#include "drivers/gfx.h" +#ifdef ARM11 + #include "arm11/fmt.h" + #include "arm11/drivers/hid.h" +#endif + + + +const char* oafResult2String(Result res) +{ + static const char *const oafResultStrings[] = + { + "ROM too big. Max 32 MiB", + "Invalid patch file" + }; + + return (res < CUSTOM_ERR_OFFSET ? result2String(res) : oafResultStrings[res - CUSTOM_ERR_OFFSET]); +} + +#ifdef ARM11 +void printError(Result res) +{ + ee_printf("Error: %s.\n", oafResult2String(res)); +} + +void printErrorWaitInput(Result res, u32 waitKeys) +{ + printError(res); + + // In case we were already in the process of powering off + // don't do so now. Ask the user to press power again. + // Error messages will get lost otherwise. + // Do not clear the power held flag here because the system + // is powering off soon. + (void)hidGetExtraKeys(KEY_POWER); + + while(1) + { + GFX_waitForVBlank0(); + + hidScanInput(); + + if(hidKeysDown() & waitKeys) break; + if(hidGetExtraKeys(0) & (KEY_POWER_HELD | KEY_POWER)) break; + } +} +#endif // ifdef ARM11