From 35d6ec1752b4072dedf59f6ae67dd205dba42307 Mon Sep 17 00:00:00 2001 From: angie Date: Mon, 27 May 2024 15:53:09 -0400 Subject: [PATCH] Finish wiring stuff up --- librecomp/include/recomp_helpers.h | 27 +++++++++++++++-- librecomp/src/pak.cpp | 47 +++++++++++++++++++++++++----- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/librecomp/include/recomp_helpers.h b/librecomp/include/recomp_helpers.h index 624dbda..cec3bac 100644 --- a/librecomp/include/recomp_helpers.h +++ b/librecomp/include/recomp_helpers.h @@ -6,8 +6,31 @@ template T _arg(uint8_t* rdram, recomp_context* ctx) { - static_assert(index < 4, "Only args 0 through 3 supported"); - gpr raw_arg = (&ctx->r4)[index]; + static_assert(index >= 0, ""); + gpr raw_arg; + + switch (index) { + case 0: + raw_arg = ctx->r4; + break; + + case 1: + raw_arg = ctx->r5; + break; + + case 2: + raw_arg = ctx->r6; + break; + + case 3: + raw_arg = ctx->r7; + break; + + default: + raw_arg = MEM_W(4 * index, ctx->r29); + break; + } + if constexpr (std::is_same_v) { if constexpr (index < 2) { static_assert(index != 1, "Floats in arg 1 not supported"); diff --git a/librecomp/src/pak.cpp b/librecomp/src/pak.cpp index ed6ed96..aa6ae23 100644 --- a/librecomp/src/pak.cpp +++ b/librecomp/src/pak.cpp @@ -27,10 +27,9 @@ extern "C" void osPfsAllocateFile_recomp(uint8_t * rdram, recomp_context * ctx) u16 company_code = _arg<1, u16>(rdram, ctx); u32 game_code = _arg<2, u32>(rdram, ctx); PTR(u8) game_name = _arg<3, PTR(u8)>(rdram, ctx); - // TODO - PTR(u8) ext_name = 0; // _arg<4, PTR(u8)>(rdram, ctx); - int file_size_in_bytes = 0; // _arg<5, int>(rdram, ctx); - PTR(s32) file_no = 0; // _arg<6, s32>(rdram, ctx); + PTR(u8) ext_name = _arg<4, PTR(u8)>(rdram, ctx); + int file_size_in_bytes = _arg<5, int>(rdram, ctx); + PTR(s32) file_no = _arg<6, PTR(s32)>(rdram, ctx); s32 ret = osPfsAllocateFile(rdram, pfs, company_code, game_code, game_name, ext_name, file_size_in_bytes, file_no); @@ -38,19 +37,51 @@ extern "C" void osPfsAllocateFile_recomp(uint8_t * rdram, recomp_context * ctx) } extern "C" void osPfsDeleteFile_recomp(uint8_t * rdram, recomp_context * ctx) { - ctx->r2 = 1; // PFS_ERR_NOPACK + PTR(OSPfs) pfs = _arg<0, PTR(OSPfs)>(rdram, ctx); + u16 company_code = _arg<1, u16>(rdram, ctx); + u32 game_code = _arg<2, u32>(rdram, ctx); + PTR(u8) game_name = _arg<3, PTR(u8)>(rdram, ctx); + PTR(u8) ext_name = _arg<4, PTR(u8)>(rdram, ctx); + + s32 ret = osPfsDeleteFile(rdram, pfs, company_code, game_code, game_name, ext_name); + + _return(ctx, ret); } extern "C" void osPfsFileState_recomp(uint8_t * rdram, recomp_context * ctx) { - ctx->r2 = 1; // PFS_ERR_NOPACK + PTR(OSPfs) pfs = _arg<0, PTR(OSPfs)>(rdram, ctx); + s32 file_no = _arg<1, s32>(rdram, ctx); + PTR(OSPfsState) state = _arg<2, PTR(OSPfsState)>(rdram, ctx); + + s32 ret = osPfsFileState(rdram, pfs, file_no, state); + + _return(ctx, ret); } extern "C" void osPfsFindFile_recomp(uint8_t * rdram, recomp_context * ctx) { - ctx->r2 = 1; // PFS_ERR_NOPACK + PTR(OSPfs) pfs = _arg<0, PTR(OSPfs)>(rdram, ctx); + u16 company_code = _arg<1, u16>(rdram, ctx); + u32 game_code = _arg<2, u32>(rdram, ctx); + PTR(u8) game_name = _arg<3, PTR(u8)>(rdram, ctx); + PTR(u8) ext_name = _arg<4, PTR(u8)>(rdram, ctx); + PTR(s32) file_no = _arg<5, PTR(s32)>(rdram, ctx); + + s32 ret = osPfsFindFile(rdram, pfs, company_code, game_code, game_name, ext_name, file_no); + + _return(ctx, ret); } extern "C" void osPfsReadWriteFile_recomp(uint8_t * rdram, recomp_context * ctx) { - ctx->r2 = 1; // PFS_ERR_NOPACK + PTR(OSPfs) pfs = _arg<0, PTR(OSPfs)>(rdram, ctx); + s32 file_no = _arg<1, s32>(rdram, ctx); + u8 flag = _arg<2, u8>(rdram, ctx); + int offset = _arg<3, int>(rdram, ctx); + int size_in_bytes = _arg<4, int>(rdram, ctx); + PTR(u8) data_buffer = _arg<5, PTR(u8)>(rdram, ctx); + + s32 ret = osPfsReadWriteFile(rdram, pfs, file_no, flag, offset, size_in_bytes, data_buffer); + + _return(ctx, ret); } extern "C" void osPfsChecker_recomp(uint8_t * rdram, recomp_context * ctx) {