summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-05-20 23:22:31 +0200
committerrobojumper <robojumper@gmail.com>2024-05-20 23:22:31 +0200
commitc1ca74d657fb11b67435d6e5679ab6482c4c5516 (patch)
treed5d4bbf2042007d3b3cdf15b9566cbd8dbe5f837 /include
parent725e43dd690968e66631c3e38c3f477c656fd271 (diff)
DynamicLink
Diffstat (limited to 'include')
-rw-r--r--include/DynamicLink.h96
-rw-r--r--include/d/d_dvd.h41
-rw-r--r--include/d/d_dvd_unk.h26
-rw-r--r--include/d/d_dylink.h12
-rw-r--r--include/m/m_dvd.h18
-rw-r--r--include/rvl/OS/OSLink.h109
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 */