diff --git a/libs/RVL_SDK/include/revolution/nand.h b/libs/RVL_SDK/include/revolution/nand.h index 5786f3634..fdf1a15e2 100644 --- a/libs/RVL_SDK/include/revolution/nand.h +++ b/libs/RVL_SDK/include/revolution/nand.h @@ -158,8 +158,12 @@ void nandGetRelativeName(char *, const char *); const char* nandGetHomeDir(); void nandCallback(ISFSError, void *); +s32 NANDPrivateGetStatus(const char *, NANDStatus *); +s32 NANDPrivateDelete(const char *); +s32 NANDPrivateCreate (const char *, u8, u8); + #ifdef __cplusplus } #endif -#endif // NAND_H \ No newline at end of file +#endif // NAND_H diff --git a/libs/RVL_SDK/include/revolution/os/OSFastCast.h b/libs/RVL_SDK/include/revolution/os/OSFastCast.h index 17cef3f9e..c66025c0f 100644 --- a/libs/RVL_SDK/include/revolution/os/OSFastCast.h +++ b/libs/RVL_SDK/include/revolution/os/OSFastCast.h @@ -8,8 +8,32 @@ extern "C" { #define OSf32tou16(in,out) asm volatile ("psq_st %1, 0(%0), 1, 3 " : : "b" (out) , "f" (*(in)) : "memory") #define OSu16tof32(in,out) asm volatile ("psq_l %0, 0(%1), 1, 3 " : "=f" (*(out)) : "b" (in) ) +static inline void OSInitFastCast(void) +{ + #ifdef __MWERKS__ + asm + { + li r3, 4 + oris r3, r3, 4 + mtspr 0x392, r3 + + li r3, 5 + oris r3, r3, 5 + mtspr 0x393, r3 + + li r3, 6 + oris r3, r3, 6 + mtspr 0x394, r3 + + li r3, 7 + oris r3, r3, 7 + mtspr 0x395, r3 + } + #endif +} + #ifdef __cplusplus } #endif -#endif // OSFASTCAST_H \ No newline at end of file +#endif // OSFASTCAST_H diff --git a/libs/RVL_SDK/include/revolution/os/OSNandbootinfo.h b/libs/RVL_SDK/include/revolution/os/OSNandbootinfo.h new file mode 100644 index 000000000..bb5765102 --- /dev/null +++ b/libs/RVL_SDK/include/revolution/os/OSNandbootinfo.h @@ -0,0 +1,41 @@ +#ifndef OSNANDBOOTINFO_H +#define OSNANDBOOTINFO_H + +#include "revolution/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + u32 CheckSum; + u32 ArgOffset; + u8 reserved[2]; + u8 LastAppType; + u8 ReturnType; + u32 ArgValue; + u8 padding[8]; + u64 LastTitleId; + u8 args[0x1000]; +} OSNandbootInfo; + +typedef struct { + u32 CheckSum; + u32 ArgOffset; + u8 reserved[2]; + u8 LastAppType; + u8 ReturnType; + u32 ArgValue; + u8 padding[8]; + u64 LastTitleId; + +} OSNandbootInfoHeader; + +BOOL __OSCreateNandbootInfo(void); +BOOL __OSWriteNandbootInfo(OSNandbootInfo *); + +#ifdef __cplusplus +} +#endif + +#endif // OSNANDBOOTINFO_H diff --git a/libs/nw4r/include/nw4r/lyt/resourceAccessor.h b/libs/nw4r/include/nw4r/lyt/resourceAccessor.h index 49f747f61..7599ef09a 100644 --- a/libs/nw4r/include/nw4r/lyt/resourceAccessor.h +++ b/libs/nw4r/include/nw4r/lyt/resourceAccessor.h @@ -12,6 +12,8 @@ namespace nw4r { class ResourceAccessor { public: + ResourceAccessor(); + virtual ~ResourceAccessor(); virtual void* GetResource(ResType, const char *, u32* ) = 0; virtual ut::Font* GetFont(const char *); diff --git a/src/RVL_SDK/os/OSNandbootInfo.c b/src/RVL_SDK/os/OSNandbootInfo.c new file mode 100644 index 000000000..d0c53727e --- /dev/null +++ b/src/RVL_SDK/os/OSNandbootInfo.c @@ -0,0 +1,73 @@ +#include "revolution/os/OSNandbootinfo.h" +#include "revolution/nand.h" + +static u32 CheckSum(OSNandbootInfo* info) { + u32 *ptr, i, sum; + + ptr = (u32*)&(info->ArgOffset); + sum = 0; + for (i = 0; i < (sizeof(OSNandbootInfo) - 4) / 4; i++) + { + sum = sum + *ptr; + ptr++; + } + + return sum; +} + +BOOL __OSCreateNandbootInfo(void) { + NANDStatus status; + s32 result; + + result = NANDPrivateGetStatus("/shared2/sys/NANDBOOTINFO", &status); + if (result == 0 && status.permission == 0x3F) { + return TRUE; + } + else if (result == 0 && status.permission != 0x3F) { + result = NANDPrivateDelete("/shared2/sys/NANDBOOTINFO"); + + if (result != 0) { + return FALSE; + } + } + else if (result == -12) { + + } + else { + return FALSE; + } + + result = NANDPrivateCreate("/shared2/sys/NANDBOOTINFO", 63, 0); + + if (result != 0) { + return FALSE; + } + + return TRUE; +} + +BOOL __OSWriteNandbootInfo(OSNandbootInfo *info) { + NANDFileInfo fileInfo; + s32 result; + info->CheckSum = CheckSum(info); + result = NANDPrivateOpen("/shared2/sys/NANDBOOTINFO", &fileInfo, 2); + + if (result == 0) { + result = NANDWrite(&fileInfo, info, sizeof(OSNandbootInfo)); + + if (result != sizeof(OSNandbootInfo)) { + NANDClose(&fileInfo); + return FALSE; + } + + result = NANDClose(&fileInfo); + if (result != 0) { + return FALSE; + } + } + else { + return FALSE; + } + + return TRUE; +} diff --git a/src/nw4r/lyt/lyt_init.cpp b/src/nw4r/lyt/lyt_init.cpp new file mode 100644 index 000000000..2d3b2b807 --- /dev/null +++ b/src/nw4r/lyt/lyt_init.cpp @@ -0,0 +1,16 @@ +#include "nw4r/lyt/init.h" +#include "revolution/os.h" +#include "revolution/os/OSFastCast.h" + +namespace { + const char* NW4R_LYT_Version_ = "<< NW4R - LYT \tfinal build: Jul 17 2007 12:25:23 (0x4199_60831) >>"; +}; + +namespace nw4r { + namespace lyt { + void LytInit() { + OSRegisterVersion(NW4R_LYT_Version_); + OSInitFastCast(); + } + }; +}; diff --git a/src/nw4r/lyt/lyt_resourceAccessor.cpp b/src/nw4r/lyt/lyt_resourceAccessor.cpp new file mode 100644 index 000000000..04d6ed4bc --- /dev/null +++ b/src/nw4r/lyt/lyt_resourceAccessor.cpp @@ -0,0 +1,17 @@ +#include "nw4r/lyt/resourceAccessor.h" + +namespace nw4r { + namespace lyt { + ResourceAccessor::~ResourceAccessor() { + + } + + ResourceAccessor::ResourceAccessor() { + + } + + ut::Font* ResourceAccessor::GetFont(const char*) { + return nullptr; + } + }; +};