Decompile objdll and objsysobj.c

This commit is contained in:
gamemasterplc 2024-02-11 16:43:08 -06:00
parent d5569203d7
commit 8eb6593ccf
7 changed files with 368 additions and 13 deletions

172
src/game/objdll.c Normal file
View file

@ -0,0 +1,172 @@
#include "game/object.h"
#include "game/dvd.h"
#include "game/memory.h"
typedef s32 (*DLLProlog)(void);
typedef void (*DLLEpilog)(void);
omDllData *omDLLinfoTbl[OM_DLL_MAX];
static FileListEntry *omDLLFileList;
void omDLLDBGOut(void)
{
OSReport("DLL DBG OUT\n");
}
void omDLLInit(FileListEntry *ovl_list)
{
int i;
OSReport("DLL DBG OUT\n");
for(i=0; i<OM_DLL_MAX; i++) {
omDLLinfoTbl[i] = NULL;
}
omDLLFileList = ovl_list;
}
int omDLLStart(s16 overlay, s16 flag)
{
int dllno;
OSReport("DLLStart %d %d\n", overlay, flag);
dllno = omDLLSearch(overlay);
if(dllno >= 0 && !flag) {
omDllData *dll = omDLLinfoTbl[dllno];
OSReport("objdll>Already Loaded %s(%08x %08x)\n", dll->name, dll->module, dll->bss);
omDLLInfoDump(&dll->module->info);
omDLLHeaderDump(dll->module);
memset(dll->bss, 0, dll->module->bssSize);
HuMemDCFlushAll();
dll->ret = ((DLLProlog)dll->module->prolog)();
OSReport("objdll> %s prolog end\n", dll->name);
return dllno;
} else {
for(dllno=0; dllno<OM_DLL_MAX; dllno++) {
if(omDLLinfoTbl[dllno] == NULL) {
break;
}
}
if(dllno == OM_DLL_MAX) {
return -1;
}
omDLLLink(&omDLLinfoTbl[dllno], overlay, TRUE);
return dllno;
}
}
void omDLLNumEnd(s16 overlay, s16 flag)
{
s16 dllno;
if(overlay < 0) {
OSReport("objdll>omDLLNumEnd Invalid dllno %d\n", overlay);
return;
}
OSReport("objdll>omDLLNumEnd %d %d\n", overlay, flag);
dllno = omDLLSearch(overlay);
if(dllno < 0) {
OSReport("objdll>omDLLNumEnd not found DLL No%d\n", overlay);
return;
}
omDLLEnd(dllno, flag);
}
void omDLLEnd(s16 dllno, s16 flag)
{
OSReport("objdll>omDLLEnd %d %d\n", dllno, flag);
if(flag == 1) {
OSReport("objdll>End DLL:%s\n", omDLLinfoTbl[dllno]->name);
omDLLUnlink(omDLLinfoTbl[dllno], 1);
omDLLinfoTbl[dllno] = NULL;
} else {
omDllData *dll;
dll = omDLLinfoTbl[dllno];
OSReport("objdll>Call Epilog\n");
((DLLEpilog)dll->module->epilog)();
OSReport("objdll>End DLL stayed:%s\n", omDLLinfoTbl[dllno]->name);
}
OSReport("objdll>End DLL finish\n");
}
omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
{
omDllData *dll;
FileListEntry *dllFile = &omDLLFileList[overlay];
OSReport("objdll>Link DLL:%s\n", dllFile->name);
dll = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(omDllData));
*dll_ptr = dll;
dll->name = dllFile->name;
dll->module = HuDvdDataReadDirect(dllFile->name, HEAP_SYSTEM);
dll->bss = HuMemDirectMalloc(HEAP_SYSTEM, dll->module->bssSize);
if(OSLink(&dll->module->info, dll->bss) != TRUE) {
OSReport("objdll>++++++++++++++++ DLL Link Failed\n");
}
omDLLInfoDump(&dll->module->info);
omDLLHeaderDump(dll->module);
OSReport("objdll>LinkOK %08x %08x\n", dll->module, dll->bss);
if(flag == 1) {
OSReport("objdll> %s prolog start\n", dllFile->name);
dll->ret = ((DLLProlog)dll->module->prolog)();
OSReport("objdll> %s prolog end\n", dllFile->name);
}
return dll;
}
void omDLLUnlink(omDllData *dll_ptr, s16 flag)
{
OSReport("odjdll>Unlink DLL:%s\n", dll_ptr->name);
if(flag == 1) {
OSReport("objdll>Unlink DLL epilog\n");
((DLLEpilog)dll_ptr->module->epilog)();
OSReport("objdll>Unlink DLL epilog finish\n");
}
if(OSUnlink(&dll_ptr->module->info) != TRUE) {
OSReport("objdll>+++++++++++++++++ DLL Unlink Failed\n");
}
HuMemDirectFree(dll_ptr->bss);
HuMemDirectFree(dll_ptr->module);
HuMemDirectFree(dll_ptr);
}
s32 omDLLSearch(s16 overlay)
{
s32 i;
FileListEntry *dllFile = &omDLLFileList[overlay];
OSReport("Search:%s\n", dllFile->name);
for(i=0; i<OM_DLL_MAX; i++) {
omDllData *dll = omDLLinfoTbl[i];
if(dll != NULL && strcmp(dll->name, dllFile->name) == 0) {
OSReport("+++++++++++ Find%d: %s\n", i, dll->name);
return i;
}
}
return -1;
}
void omDLLInfoDump(OSModuleInfo *module)
{
OSReport("===== DLL Module Info dump ====\n");
OSReport(" ID:0x%08x\n", module->id);
OSReport(" LinkPrev:0x%08x\n", module->link.prev);
OSReport(" LinkNext:0x%08x\n", module->link.next);
OSReport(" Section num:%d\n", module->numSections);
OSReport("Section info tbl ofst:0x%08x\n", module->sectionInfoOffset);
OSReport(" nameOffset:0x%08x\n", module->nameOffset);
OSReport(" nameSize:%d\n", module->nameSize);
OSReport(" version:0x%08x\n", module->version);
OSReport("===============================\n");
}
void omDLLHeaderDump(OSModuleHeader *module)
{
OSReport("==== DLL Module Header dump ====\n");
OSReport(" bss Size:0x%08x\n", module->bssSize);
OSReport(" rel Offset:0x%08x\n", module->relOffset);
OSReport(" imp Offset:0x%08x\n", module->impOffset);
OSReport(" prolog Section:%d\n", module->prologSection);
OSReport(" epilog Section:%d\n", module->epilogSection);
OSReport("unresolved Section:%d\n", module->unresolvedSection);
OSReport(" prolog func:0x%08x\n", module->prolog);
OSReport(" epilog func:0x%08x\n", module->epilog);
OSReport(" unresolved func:0x%08x\n", module->unresolved);
OSReport("================================\n");
}