diff options
| author | robojumper <robojumper@gmail.com> | 2024-05-20 23:22:31 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-05-20 23:22:31 +0200 |
| commit | c1ca74d657fb11b67435d6e5679ab6482c4c5516 (patch) | |
| tree | d5d4bbf2042007d3b3cdf15b9566cbd8dbe5f837 /include | |
| parent | 725e43dd690968e66631c3e38c3f477c656fd271 (diff) | |
DynamicLink
Diffstat (limited to 'include')
| -rw-r--r-- | include/DynamicLink.h | 96 | ||||
| -rw-r--r-- | include/d/d_dvd.h | 41 | ||||
| -rw-r--r-- | include/d/d_dvd_unk.h | 26 | ||||
| -rw-r--r-- | include/d/d_dylink.h | 12 | ||||
| -rw-r--r-- | include/m/m_dvd.h | 18 | ||||
| -rw-r--r-- | include/rvl/OS/OSLink.h | 109 |
6 files changed, 291 insertions, 11 deletions
diff --git a/include/DynamicLink.h b/include/DynamicLink.h new file mode 100644 index 00000000..109f4821 --- /dev/null +++ b/include/DynamicLink.h @@ -0,0 +1,96 @@ +#ifndef DYNAMICLINK_H +#define DYNAMICLINK_H + +#include <common.h> +#include <m/m_dvd.h> +#include <rvl/OS.h> + +class DbMapFile { +public: + DbMapFile(): unk_0(0) {} + ~DbMapFile(); + + void RegisterOnDvd(const char *, const OSModuleInfo *); + void Unregister(); +private: + UNKWORD unk_0; +}; + +// https://github.com/zeldaret/tp/blob/main/include/DynamicLink.h + +struct DynamicModuleControlBase { + /* 0x00 */ u16 mLinkCount; + /* 0x02 */ u16 mDoLinkCount; + /* 0x04 */ DynamicModuleControlBase* mPrev; + /* 0x08 */ DynamicModuleControlBase* mNext; + + /* 0x0C */ /*vtable*/ + /* 802df100 */ virtual ~DynamicModuleControlBase(); + /* 802df340 */ virtual const char* getModuleName() const; + /* 802df350 */ virtual int getModuleSize() const; + /* 802df360 */ virtual const char* getModuleTypeString() const; + /* 802df370 */ virtual void dump(); + /* 802df380 */ virtual bool do_load(); + /* 802df390 */ virtual BOOL do_load_async(); + /* 802df3a0 */ virtual bool do_unload(); + /* 802df3b0 */ virtual BOOL do_link(); + /* 802df3c0 */ virtual bool do_unlink(); + /* 802df1a0 */ DynamicModuleControlBase(); + /* 802df1f0 */ BOOL link(); + /* 802df290 */ BOOL unlink(); + /* 802df310 */ BOOL load_async(); + + static inline DynamicModuleControlBase* getFirstClass() { return mFirst; } + inline DynamicModuleControlBase* getNextClass() { return mNext; } + bool isLinked() const { return mLinkCount != 0; } + + static DynamicModuleControlBase* mFirst; + static DynamicModuleControlBase* mLast; +}; + +struct DynamicModuleControl : DynamicModuleControlBase { + /* 802df4c0 */ virtual const char* getModuleName() const; + /* 802df450 */ virtual ~DynamicModuleControl(); + /* 802dfb10 */ virtual int getModuleSize() const; + /* 802dfb70 */ virtual const char* getModuleTypeString() const; + /* 802df800 */ virtual void dump(); + /* 802df5d0 */ virtual bool do_load(); + /* 802df710 */ virtual BOOL do_load_async(); + /* 802df7a0 */ virtual bool do_unload(); + /* 802df810 */ virtual BOOL do_link(); + /* 802dfa60 */ virtual bool do_unlink(); + /* 802df3d0 */ DynamicModuleControl(char const*, EGG::ExpHeap *); + /* 802df4d0 */ static void initialize(EGG::ExpHeap *heap); + /* 802df530 */ static bool callback(void*); + void checkHeapStatus(); + + /* 0x10 */ UNKWORD unk_16; + /* 0x14 */ OSModuleHeader *mModule; + /* 0x18 */ void *mBss; + /* 0x1C */ UNKWORD unk_24; + /* 0x20 */ const char *mName; + /* 0x24 */ u8 mResourceType; + /* 0x25 */ u8 unk_33; + /* 0x28 */ UNKWORD unk_40; + /* 0x2C */ mDvd_callback_c *mDvdCallbackRequest; + /* 0x30 */ EGG::ExpHeap *mHeap; + /* 0x34 */ DbMapFile mpRelMapFile; + // Some of these might be members of DbMapFile + UNKWORD unk1; + UNKWORD unk2; + UNKWORD unk3; + UNKWORD unk4; + UNKWORD unk5; + UNKWORD unk6; + + static u32 sAllocBytes; + static mDvd_toMainRam_base_c *sDvdFile; + static EGG::ExpHeap *sDylinkHeap; + static u32 sCurrentAllocatableSize; + static u32 sTotalFreeSize; + static EGG::Archive *sArchive; + + static const char *sRelsDir; +}; + +#endif diff --git a/include/d/d_dvd.h b/include/d/d_dvd.h new file mode 100644 index 00000000..56fb848c --- /dev/null +++ b/include/d/d_dvd.h @@ -0,0 +1,41 @@ +#ifndef D_DVD_H +#define D_DVD_H + +#include <common.h> +#include <egg/core/eggHeap.h> +#include <m/m_dvd.h> + +namespace dDvd { + +// difference to NSMBW: additional heap arg +void create(s32 priority, EGG::Heap*, EGG::Heap*, EGG::Heap*); + +class loader_c { +public: + loader_c(); + /** vtable at 0x805033F0 */ + virtual ~loader_c(); + void *request(const char *path, u8 mountDirection, EGG::Heap *heap); + virtual void remove(); + +private: + u32 mSize; + mDvd_toMainRam_normal_c *mpCommand; + EGG::Heap* mpHeap; + void* mpBuffer; +}; + +class unkstruct_c { +public: + static unkstruct_c *create(EGG::Heap *heap); + void init(); + char getUnk(); + +private: + UNKWORD field_0x0; + char field_0x4; +}; + +} // dDvd + +#endif diff --git a/include/d/d_dvd_unk.h b/include/d/d_dvd_unk.h new file mode 100644 index 00000000..080a6eb6 --- /dev/null +++ b/include/d/d_dvd_unk.h @@ -0,0 +1,26 @@ +#ifndef D_DVD_UNK_H +#define D_DVD_UNK_H + +#include <common.h> +#include <egg/core/eggHeap.h> + +namespace dDvdUnk { + +class unkstruct_c { +public: + static unkstruct_c *create(EGG::Heap *heap); + void draw(); + void execute(); + void init(); + char getUnk(); + + static void createFont(EGG::Heap *heap); + +private: + UNKWORD field_0x0; + char field_0x4; +}; + +} // dDvdUnk + +#endif diff --git a/include/d/d_dylink.h b/include/d/d_dylink.h new file mode 100644 index 00000000..c7a0a6a2 --- /dev/null +++ b/include/d/d_dylink.h @@ -0,0 +1,12 @@ +#ifndef D_DYLINK_H +#define D_DYLINK_H + +#include <common.h> + +namespace dDyl { + +bool Unlink(u16 relId); + +} // dDyl + +#endif diff --git a/include/m/m_dvd.h b/include/m/m_dvd.h index dee59241..86be5449 100644 --- a/include/m/m_dvd.h +++ b/include/m/m_dvd.h @@ -1,6 +1,8 @@ #ifndef M_DVD_H #define M_DVD_H +#include <egg/core/eggArchive.h> +#include <egg/core/eggDecomp.h> #include <egg/core/eggHeap.h> #include <egg/core/eggThread.h> #include <m/m_heap.h> @@ -64,19 +66,19 @@ public: u8 mCompressionType; }; -typedef void *(*dvdReadCallback)(void *); +typedef bool (*dvdReadCallback)(void *); -class mDvdCommandReadCallback_c : public mDvd_command_c { +class mDvd_callback_c : public mDvd_command_c { public: - mDvdCommandReadCallback_c(dvdReadCallback cb, void *cbData); - virtual ~mDvdCommandReadCallback_c(); + mDvd_callback_c(dvdReadCallback cb, void *cbData); + virtual ~mDvd_callback_c(); virtual u32 execute() override; - static mDvdCommandReadCallback_c *create(dvdReadCallback cb, void *cbData); + static mDvd_callback_c *create(dvdReadCallback cb, void *cbData); dvdReadCallback mCallback; void *mCallbackData; - void *mDataPtr; + BOOL mSuccess; }; class mDvd_mountMemArchive_c : public mDvd_command_c { @@ -176,4 +178,8 @@ public: }; } // namespace mDvd +extern "C" void fn_802EF480(mDvd_command_c *cmd); +extern "C" mDvd_toMainRam_normal_c *fn_802F0030(const char *path, int mountDirection, EGG::Heap *heap); +extern "C" mDvd_toMainRam_arc_c *fn_802EFE90(EGG::Archive *arc, const char *path, int mountDirection, EGG::Heap *heap); + #endif diff --git a/include/rvl/OS/OSLink.h b/include/rvl/OS/OSLink.h index 0736a590..aa2a86cf 100644 --- a/include/rvl/OS/OSLink.h +++ b/include/rvl/OS/OSLink.h @@ -1,13 +1,112 @@ -#ifndef RVL_SDK_OS_LINK_H -#define RVL_SDK_OS_LINK_H -#include <common.h> +#ifndef OSLINK_H +#define OSLINK_H + + #ifdef __cplusplus extern "C" { #endif +#define OS_MODULE_VERSION 3 + +typedef struct OSModuleHeader OSModuleHeader; + +typedef u32 OSModuleID; +typedef struct OSModuleQueue OSModuleQueue; +typedef struct OSModuleLink OSModuleLink; +typedef struct OSModuleInfo OSModuleInfo; +typedef struct OSSectionInfo OSSectionInfo; +typedef struct OSImportInfo OSImportInfo; +typedef struct OSRel OSRel; + +// OSModuleQueue __OSModuleList : 0x800030C8; +// void* __OSStringTable : 0x800030D0; +extern OSModuleQueue __OSModuleList; +extern void * __OSStringTable; + +struct OSModuleQueue { + OSModuleInfo* head; + OSModuleInfo* tail; +}; + +struct OSModuleLink { + OSModuleInfo* next; + OSModuleInfo* prev; +}; + +struct OSSectionInfo { + u32 offset; + u32 size; +}; + +struct OSModuleInfo { + OSModuleID id; // unique identifier for the module + OSModuleLink link; // doubly linked list of modules + u32 numSections; // # of sections + u32 sectionInfoOffset; // offset to section info table + u32 nameOffset; // offset to module name + u32 nameSize; // size of module name + u32 version; // version number +}; + +struct OSModuleHeader { + // CAUTION: info must be the 1st member + OSModuleInfo info; + + // OS_MODULE_VERSION == 1 + u32 bssSize; // total size of bss sections in bytes + u32 relOffset; + u32 impOffset; + u32 impSize; // size in bytes + u8 prologSection; // section # for prolog function + u8 epilogSection; // section # for epilog function + u8 unresolvedSection; // section # for unresolved function + u8 bssSection; // section # for bss section (set at run-time) + u32 prolog; // prolog function offset + u32 epilog; // epilog function offset + u32 unresolved; // unresolved function offset + + // OS_MODULE_VERSION == 2 +#if (2 <= OS_MODULE_VERSION) + u32 align; // module alignment constraint + u32 bssAlign; // bss alignment constraint +#endif + + // OS_MODULE_VERSION == 3 +#if (3 <= OS_MODULE_VERSION) + u32 fixSize; +#endif +}; + +#define OSGetSectionInfo(module) ((OSSectionInfo*)(((OSModuleInfo*)(module))->sectionInfoOffset)) + +#define OS_SECTIONINFO_EXEC 0x1 +#define OS_SECTIONINFO_OFFSET(offset) ((offset) & ~0x1) + +struct OSImportInfo { + OSModuleID id; // external module id + u32 offset; // offset to OSRel instructions +}; + +struct OSRel { + u16 offset; // byte offset from the previous entry + u8 type; + u8 section; + u32 addend; +}; + +#define R_DOLPHIN_NOP 201 // C9h current offset += OSRel.offset +#define R_DOLPHIN_SECTION 202 // CAh current section = OSRel.section +#define R_DOLPHIN_END 203 // CBh +#define R_DOLPHIN_MRKREF 204 // CCh + +BOOL OSLink(OSModuleInfo* newModule, void* bss); +BOOL OSLinkFixed(OSModuleInfo* newModule, void* bss); +BOOL OSUnlink(OSModuleInfo* module); +void OSSetStringTable(void* string_table); void __OSModuleInit(void); #ifdef __cplusplus -} -#endif +}; #endif + +#endif /* OSLINK_H */ |
