mirror of https://github.com/PrimeDecomp/prime.git
CGBASupport (#13)
* Start work on GBASupport * Match update * Almost perfect match * Very close to 100% match * Match & link CGBASupport * Fix some naming * use c-cstle cast and round-up
This commit is contained in:
parent
d410febb1d
commit
d8804b5244
|
@ -7734,7 +7734,7 @@ Update__13SGBALinkFrameFf:
|
||||||
/* 80022024 0001EF84 93 E1 00 14 */ stw r31, 0x14(r1)
|
/* 80022024 0001EF84 93 E1 00 14 */ stw r31, 0x14(r1)
|
||||||
/* 80022028 0001EF88 7C 7F 1B 78 */ mr r31, r3
|
/* 80022028 0001EF88 7C 7F 1B 78 */ mr r31, r3
|
||||||
/* 8002202C 0001EF8C 80 63 00 04 */ lwz r3, 4(r3)
|
/* 8002202C 0001EF8C 80 63 00 04 */ lwz r3, 4(r3)
|
||||||
/* 80022030 0001EF90 48 22 68 E9 */ bl Update__11CGBASupportFv
|
/* 80022030 0001EF90 48 22 68 E9 */ bl Update__11CGBASupportFf
|
||||||
/* 80022034 0001EF94 FC 20 F8 90 */ fmr f1, f31
|
/* 80022034 0001EF94 FC 20 F8 90 */ fmr f1, f31
|
||||||
/* 80022038 0001EF98 80 7F 00 08 */ lwz r3, 8(r31)
|
/* 80022038 0001EF98 80 7F 00 08 */ lwz r3, 8(r31)
|
||||||
/* 8002203C 0001EF9C 48 2A 06 C9 */ bl Update__9CGuiFrameFf
|
/* 8002203C 0001EF9C 48 2A 06 C9 */ bl Update__9CGuiFrameFf
|
||||||
|
|
|
@ -32,8 +32,8 @@ lbl_805A82BC:
|
||||||
.section .sbss, "wa"
|
.section .sbss, "wa"
|
||||||
.balign 8
|
.balign 8
|
||||||
|
|
||||||
.global lbl_805A9110
|
.global g_GBA
|
||||||
lbl_805A9110:
|
g_GBA:
|
||||||
.skip 0x8
|
.skip 0x8
|
||||||
|
|
||||||
.section .text, "ax"
|
.section .text, "ax"
|
||||||
|
@ -545,8 +545,8 @@ lbl_802488F8:
|
||||||
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.global Update__11CGBASupportFv
|
.global Update__11CGBASupportFf
|
||||||
Update__11CGBASupportFv:
|
Update__11CGBASupportFf:
|
||||||
/* 80248918 00245878 94 21 FF D0 */ stwu r1, -0x30(r1)
|
/* 80248918 00245878 94 21 FF D0 */ stwu r1, -0x30(r1)
|
||||||
/* 8024891C 0024587C 7C 08 02 A6 */ mflr r0
|
/* 8024891C 0024587C 7C 08 02 A6 */ mflr r0
|
||||||
/* 80248920 00245880 90 01 00 34 */ stw r0, 0x34(r1)
|
/* 80248920 00245880 90 01 00 34 */ stw r0, 0x34(r1)
|
||||||
|
@ -671,9 +671,9 @@ lbl_80248A5C:
|
||||||
/* 80248A7C 002459DC 48 00 00 D8 */ b Update_default
|
/* 80248A7C 002459DC 48 00 00 D8 */ b Update_default
|
||||||
Update_case4:
|
Update_case4:
|
||||||
/* 80248A80 002459E0 38 00 00 05 */ li r0, 5
|
/* 80248A80 002459E0 38 00 00 05 */ li r0, 5
|
||||||
/* 80248A84 002459E4 3C 60 80 25 */ lis r3, nullsub_130@ha
|
/* 80248A84 002459E4 3C 60 80 25 */ lis r3, joyboot_callback__Fll@ha
|
||||||
/* 80248A88 002459E8 90 1F 00 34 */ stw r0, 0x34(r31)
|
/* 80248A88 002459E8 90 1F 00 34 */ stw r0, 0x34(r31)
|
||||||
/* 80248A8C 002459EC 39 23 8D D8 */ addi r9, r3, nullsub_130@l
|
/* 80248A8C 002459EC 39 23 8D D8 */ addi r9, r3, joyboot_callback__Fll@l
|
||||||
/* 80248A90 002459F0 39 1F 00 3C */ addi r8, r31, 0x3c
|
/* 80248A90 002459F0 39 1F 00 3C */ addi r8, r31, 0x3c
|
||||||
/* 80248A94 002459F4 38 A0 00 02 */ li r5, 2
|
/* 80248A94 002459F4 38 A0 00 02 */ li r5, 2
|
||||||
/* 80248A98 002459F8 80 7F 00 40 */ lwz r3, 0x40(r31)
|
/* 80248A98 002459F8 80 7F 00 40 */ lwz r3, 0x40(r31)
|
||||||
|
@ -904,7 +904,7 @@ __dt__11CGBASupportFv:
|
||||||
/* 80248C98 00245BF8 41 82 00 60 */ beq lbl_80248CF8
|
/* 80248C98 00245BF8 41 82 00 60 */ beq lbl_80248CF8
|
||||||
/* 80248C9C 00245BFC 38 60 00 00 */ li r3, 0
|
/* 80248C9C 00245BFC 38 60 00 00 */ li r3, 0
|
||||||
/* 80248CA0 00245C00 34 1E 00 30 */ addic. r0, r30, 0x30
|
/* 80248CA0 00245C00 34 1E 00 30 */ addic. r0, r30, 0x30
|
||||||
/* 80248CA4 00245C04 90 6D A5 50 */ stw r3, lbl_805A9110@sda21(r13)
|
/* 80248CA4 00245C04 90 6D A5 50 */ stw r3, g_GBA@sda21(r13)
|
||||||
/* 80248CA8 00245C08 41 82 00 24 */ beq lbl_80248CCC
|
/* 80248CA8 00245C08 41 82 00 24 */ beq lbl_80248CCC
|
||||||
/* 80248CAC 00245C0C 80 7E 00 30 */ lwz r3, 0x30(r30)
|
/* 80248CAC 00245C0C 80 7E 00 30 */ lwz r3, 0x30(r30)
|
||||||
/* 80248CB0 00245C10 28 03 00 00 */ cmplwi r3, 0
|
/* 80248CB0 00245C10 28 03 00 00 */ cmplwi r3, 0
|
||||||
|
@ -992,7 +992,7 @@ lbl_80248E38:
|
||||||
/* 80248EB8 00245E18 98 7F 00 44 */ stb r3, 0x44(r31)
|
/* 80248EB8 00245E18 98 7F 00 44 */ stb r3, 0x44(r31)
|
||||||
/* 80248EBC 00245E1C 98 7F 00 45 */ stb r3, 0x45(r31)
|
/* 80248EBC 00245E1C 98 7F 00 45 */ stb r3, 0x45(r31)
|
||||||
/* 80248EC0 00245E20 48 18 08 91 */ bl GBAInit
|
/* 80248EC0 00245E20 48 18 08 91 */ bl GBAInit
|
||||||
/* 80248EC4 00245E24 93 ED A5 50 */ stw r31, lbl_805A9110@sda21(r13)
|
/* 80248EC4 00245E24 93 ED A5 50 */ stw r31, g_GBA@sda21(r13)
|
||||||
/* 80248EC8 00245E28 48 13 81 ED */ bl OSGetFontEncode
|
/* 80248EC8 00245E28 48 13 81 ED */ bl OSGetFontEncode
|
||||||
/* 80248ECC 00245E2C 80 01 00 24 */ lwz r0, 0x24(r1)
|
/* 80248ECC 00245E2C 80 01 00 24 */ lwz r0, 0x24(r1)
|
||||||
/* 80248ED0 00245E30 7F E3 FB 78 */ mr r3, r31
|
/* 80248ED0 00245E30 7F E3 FB 78 */ mr r3, r31
|
||||||
|
@ -1047,7 +1047,7 @@ __ct__11CGBASupportFv:
|
||||||
/* 80248DB0 00245D10 98 7F 00 44 */ stb r3, 0x44(r31)
|
/* 80248DB0 00245D10 98 7F 00 44 */ stb r3, 0x44(r31)
|
||||||
/* 80248DB4 00245D14 98 7F 00 45 */ stb r3, 0x45(r31)
|
/* 80248DB4 00245D14 98 7F 00 45 */ stb r3, 0x45(r31)
|
||||||
/* 80248DB8 00245D18 48 18 08 95 */ bl GBAInit
|
/* 80248DB8 00245D18 48 18 08 95 */ bl GBAInit
|
||||||
/* 80248DBC 00245D1C 93 ED A5 50 */ stw r31, lbl_805A9110@sda21(r13)
|
/* 80248DBC 00245D1C 93 ED A5 50 */ stw r31, g_GBA@sda21(r13)
|
||||||
/* 80248DC0 00245D20 7F E3 FB 78 */ mr r3, r31
|
/* 80248DC0 00245D20 7F E3 FB 78 */ mr r3, r31
|
||||||
/* 80248DC4 00245D24 80 01 00 24 */ lwz r0, 0x24(r1)
|
/* 80248DC4 00245D24 80 01 00 24 */ lwz r0, 0x24(r1)
|
||||||
/* 80248DC8 00245D28 83 E1 00 1C */ lwz r31, 0x1c(r1)
|
/* 80248DC8 00245D28 83 E1 00 1C */ lwz r31, 0x1c(r1)
|
||||||
|
@ -1057,8 +1057,8 @@ __ct__11CGBASupportFv:
|
||||||
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.global nullsub_130
|
.global joyboot_callback__Fll
|
||||||
nullsub_130:
|
joyboot_callback__Fll:
|
||||||
/* 80248DD8 00245D38 4E 80 00 20 */ blr
|
/* 80248DD8 00245D38 4E 80 00 20 */ blr
|
||||||
|
|
||||||
.section .sdata2, "a"
|
.section .sdata2, "a"
|
||||||
|
|
|
@ -12,7 +12,7 @@ parser.add_argument('--version', dest='version',
|
||||||
default='0', help='version to build (0, 1, kor)')
|
default='0', help='version to build (0, 1, kor)')
|
||||||
parser.add_argument('--map', dest='map', action='store_true',
|
parser.add_argument('--map', dest='map', action='store_true',
|
||||||
help='generate map file')
|
help='generate map file')
|
||||||
parser.add_argument('--no-check', dest='check', action='store_false',
|
parser.add_argument('--no-check', dest='check', action='store_false',
|
||||||
help='don\'t check hash of resulting dol')
|
help='don\'t check hash of resulting dol')
|
||||||
parser.add_argument('--static-libs', dest='static_libs', action='store_true',
|
parser.add_argument('--static-libs', dest='static_libs', action='store_true',
|
||||||
help='build and use static libs')
|
help='build and use static libs')
|
||||||
|
@ -343,7 +343,7 @@ LIBS = [
|
||||||
"MetroidPrime/CPauseScreenFrame",
|
"MetroidPrime/CPauseScreenFrame",
|
||||||
"MetroidPrime/Enemies/CAtomicAlpha",
|
"MetroidPrime/Enemies/CAtomicAlpha",
|
||||||
"MetroidPrime/CLogBookScreen",
|
"MetroidPrime/CLogBookScreen",
|
||||||
"MetroidPrime/CGBASupport",
|
["MetroidPrime/CGBASupport", True],
|
||||||
"MetroidPrime/Player/CSaveWorld",
|
"MetroidPrime/Player/CSaveWorld",
|
||||||
"MetroidPrime/ScriptObjects/CScriptCameraHintTrigger",
|
"MetroidPrime/ScriptObjects/CScriptCameraHintTrigger",
|
||||||
"MetroidPrime/Enemies/CAmbientAI",
|
"MetroidPrime/Enemies/CAmbientAI",
|
||||||
|
@ -1193,7 +1193,7 @@ for lib in LIBS:
|
||||||
else:
|
else:
|
||||||
for object in lib["objects"]:
|
for object in lib["objects"]:
|
||||||
completed = False
|
completed = False
|
||||||
|
|
||||||
if type(object) is list:
|
if type(object) is list:
|
||||||
completed = object[1]
|
completed = object[1]
|
||||||
object = object[0]
|
object = object[0]
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "Kyoto/Alloc/IAllocator.hpp"
|
#include "Kyoto/Alloc/IAllocator.hpp"
|
||||||
|
#include "Kyoto/Alloc/CCallStack.hpp"
|
||||||
|
|
||||||
class COsContext;
|
class COsContext;
|
||||||
class CMemory {
|
class CMemory {
|
||||||
|
@ -14,7 +15,9 @@ public:
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
static void SetAllocator(COsContext& ctx, IAllocator& allocator);
|
static void SetAllocator(COsContext& ctx, IAllocator& allocator);
|
||||||
static IAllocator* GetAllocator();
|
static IAllocator* GetAllocator();
|
||||||
static void* Alloc(size_t len, IAllocator::EHint hint, IAllocator::EScope scope, IAllocator::EType type, const CCallStack& callstack);
|
static void* Alloc(size_t len, IAllocator::EHint hint = IAllocator::kHI_None,
|
||||||
|
IAllocator::EScope scope = IAllocator::kSC_Unk1, IAllocator::EType type = IAllocator::kTP_Heap,
|
||||||
|
const CCallStack& callstack = CCallStack(-1, "??(??)"));
|
||||||
static void Free(const void* ptr);
|
static void Free(const void* ptr);
|
||||||
static void SetOutOfMemoryCallback(IAllocator::FOutOfMemoryCb callback, const void* context);
|
static void SetOutOfMemoryCallback(IAllocator::FOutOfMemoryCb callback, const void* context);
|
||||||
static void OffsetFakeStatics(int);
|
static void OffsetFakeStatics(int);
|
||||||
|
|
|
@ -3,12 +3,28 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
class IDvdRequest {
|
||||||
|
public:
|
||||||
|
virtual ~IDvdRequest() = 0; // 8
|
||||||
|
virtual void Unknown1(bool) = 0; // c
|
||||||
|
virtual bool IsComplete() = 0; // 10
|
||||||
|
};
|
||||||
|
|
||||||
class CDvdFile {
|
class CDvdFile {
|
||||||
public:
|
public:
|
||||||
|
CDvdFile(const char* name);
|
||||||
|
~CDvdFile();
|
||||||
|
uint Length() { return x14_size; }
|
||||||
|
|
||||||
|
IDvdRequest* SyncRead(void* buf, uint len);
|
||||||
|
|
||||||
static bool FileExists(const char*);
|
static bool FileExists(const char*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uchar pad[0x28];
|
uchar pad[0x14];
|
||||||
|
uint x14_size;
|
||||||
|
uchar pad2[0x10];
|
||||||
};
|
};
|
||||||
|
CHECK_SIZEOF(CDvdFile, 0x28)
|
||||||
|
|
||||||
#endif // _CDVDFILE
|
#endif // _CDVDFILE
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
#ifndef _CGBASUPPORT
|
||||||
|
#define _CGBASUPPORT
|
||||||
|
|
||||||
|
#include "Kyoto/CDvdFile.hpp"
|
||||||
|
#include "rstl/auto_ptr.hpp"
|
||||||
|
#include "rstl/single_ptr.hpp"
|
||||||
|
#include "rstl/rc_ptr.hpp"
|
||||||
|
|
||||||
|
class CGBASupport {
|
||||||
|
public:
|
||||||
|
enum EPhase {
|
||||||
|
kP_LoadClientPad,
|
||||||
|
kP_Standby,
|
||||||
|
kP_StartProbeTimeout,
|
||||||
|
kP_PollProbe,
|
||||||
|
kP_StartJoyBusBoot,
|
||||||
|
kP_PollJoyBusBoot,
|
||||||
|
kP_DataTransfer,
|
||||||
|
kP_Complete,
|
||||||
|
kP_Failed
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
CDvdFile x0_file;
|
||||||
|
uint x28_fileSize;
|
||||||
|
rstl::single_ptr<uchar> x2c_buffer;
|
||||||
|
rstl::single_ptr<IDvdRequest> x30_dvdReq;
|
||||||
|
EPhase x34_phase;
|
||||||
|
float x38_timeout;
|
||||||
|
uchar x3c_status;
|
||||||
|
uint x40_siChan;
|
||||||
|
bool x44_fusionLinked;
|
||||||
|
bool x45_fusionBeat;
|
||||||
|
|
||||||
|
// this is inlined weirdly... this probably should be handled differently
|
||||||
|
bool CheckReadyStatus();
|
||||||
|
public:
|
||||||
|
static void Initialize();
|
||||||
|
static void GlobalPoll();
|
||||||
|
|
||||||
|
CGBASupport();
|
||||||
|
~CGBASupport();
|
||||||
|
bool PollResponse();
|
||||||
|
void Update(float dt);
|
||||||
|
bool IsReady();
|
||||||
|
void InitializeSupport();
|
||||||
|
void StartLink();
|
||||||
|
EPhase GetPhase() const { return x34_phase; }
|
||||||
|
bool IsFusionLinked() const { return x44_fusionLinked; }
|
||||||
|
bool IsFusionBeat() const { return x45_fusionBeat; }
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CGBASupport* g_GBA;
|
||||||
|
|
||||||
|
#endif // _CGBASUPPORT
|
|
@ -35,6 +35,7 @@ public:
|
||||||
}
|
}
|
||||||
T* operator->() const { return GetPtr(); }
|
T* operator->() const { return GetPtr(); }
|
||||||
T& operator*() const { return *GetPtr(); }
|
T& operator*() const { return *GetPtr(); }
|
||||||
|
operator bool() const { return GetPtr() != nullptr; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CRefData* x0_refData;
|
CRefData* x0_refData;
|
||||||
|
|
40
obj_files.mk
40
obj_files.mk
|
@ -1,6 +1,6 @@
|
||||||
METROTRK_FILES :=\
|
METROTRK_FILES :=\
|
||||||
$(BUILD_DIR)/src/MetroTRK/mslsupp.o
|
$(BUILD_DIR)/src/MetroTRK/mslsupp.o
|
||||||
|
|
||||||
METROIDPRIME :=\
|
METROIDPRIME :=\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/main.o\
|
$(BUILD_DIR)/asm/MetroidPrime/main.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/IRenderer.o\
|
$(BUILD_DIR)/asm/MetroidPrime/IRenderer.o\
|
||||||
|
@ -310,7 +310,7 @@ METROIDPRIME :=\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/CPauseScreenFrame.o\
|
$(BUILD_DIR)/asm/MetroidPrime/CPauseScreenFrame.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CAtomicAlpha.o\
|
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CAtomicAlpha.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/CLogBookScreen.o\
|
$(BUILD_DIR)/asm/MetroidPrime/CLogBookScreen.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/CGBASupport.o\
|
$(BUILD_DIR)/src/MetroidPrime/CGBASupport.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/Player/CSaveWorld.o\
|
$(BUILD_DIR)/asm/MetroidPrime/Player/CSaveWorld.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/ScriptObjects/CScriptCameraHintTrigger.o\
|
$(BUILD_DIR)/asm/MetroidPrime/ScriptObjects/CScriptCameraHintTrigger.o\
|
||||||
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CAmbientAI.o\
|
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CAmbientAI.o\
|
||||||
|
@ -370,7 +370,7 @@ WORLDFORMAT :=\
|
||||||
$(BUILD_DIR)/asm/WorldFormat/CCollidableOBBTreeGroup.o\
|
$(BUILD_DIR)/asm/WorldFormat/CCollidableOBBTreeGroup.o\
|
||||||
$(BUILD_DIR)/asm/WorldFormat/CPVSAreaSet.o\
|
$(BUILD_DIR)/asm/WorldFormat/CPVSAreaSet.o\
|
||||||
$(BUILD_DIR)/asm/WorldFormat/CAreaRenderOctTree.o\
|
$(BUILD_DIR)/asm/WorldFormat/CAreaRenderOctTree.o\
|
||||||
|
|
||||||
WEAPONS :=\
|
WEAPONS :=\
|
||||||
$(BUILD_DIR)/asm/Weapons/CProjectileWeapon.o\
|
$(BUILD_DIR)/asm/Weapons/CProjectileWeapon.o\
|
||||||
$(BUILD_DIR)/asm/Weapons/CProjectileWeaponDataFactory.o\
|
$(BUILD_DIR)/asm/Weapons/CProjectileWeaponDataFactory.o\
|
||||||
|
@ -380,10 +380,10 @@ WEAPONS :=\
|
||||||
$(BUILD_DIR)/asm/Weapons/CDecal.o\
|
$(BUILD_DIR)/asm/Weapons/CDecal.o\
|
||||||
$(BUILD_DIR)/asm/Weapons/CWeaponDescription.o\
|
$(BUILD_DIR)/asm/Weapons/CWeaponDescription.o\
|
||||||
$(BUILD_DIR)/asm/Weapons/CDecalDescription.o\
|
$(BUILD_DIR)/asm/Weapons/CDecalDescription.o\
|
||||||
|
|
||||||
METARENDER :=\
|
METARENDER :=\
|
||||||
$(BUILD_DIR)/asm/MetaRender/CCubeRenderer.o\
|
$(BUILD_DIR)/asm/MetaRender/CCubeRenderer.o\
|
||||||
|
|
||||||
GUISYS :=\
|
GUISYS :=\
|
||||||
$(BUILD_DIR)/asm/GuiSys/CAuiMain.o\
|
$(BUILD_DIR)/asm/GuiSys/CAuiMain.o\
|
||||||
$(BUILD_DIR)/asm/GuiSys/CAuiMeter.o\
|
$(BUILD_DIR)/asm/GuiSys/CAuiMeter.o\
|
||||||
|
@ -631,25 +631,25 @@ KYOTO_2 :=\
|
||||||
$(BUILD_DIR)/src/Kyoto/Audio/g721.o\
|
$(BUILD_DIR)/src/Kyoto/Audio/g721.o\
|
||||||
$(BUILD_DIR)/asm/Kyoto/Audio/CStaticAudioPlayer.o\
|
$(BUILD_DIR)/asm/Kyoto/Audio/CStaticAudioPlayer.o\
|
||||||
$(BUILD_DIR)/asm/Kyoto/CFrameDelayedKiller.o\
|
$(BUILD_DIR)/asm/Kyoto/CFrameDelayedKiller.o\
|
||||||
|
|
||||||
AI_FILES :=\
|
AI_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/ai.o\
|
$(BUILD_DIR)/asm/Dolphin/ai.o\
|
||||||
|
|
||||||
AR_FILES :=\
|
AR_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/ar/ar.o\
|
$(BUILD_DIR)/asm/Dolphin/ar/ar.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/ar/arq.o
|
$(BUILD_DIR)/asm/Dolphin/ar/arq.o
|
||||||
|
|
||||||
BASE_FILES :=\
|
BASE_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/PPCArch.o\
|
$(BUILD_DIR)/src/Dolphin/PPCArch.o\
|
||||||
|
|
||||||
DB_FILES :=\
|
DB_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/db.ep.o\
|
$(BUILD_DIR)/src/Dolphin/db.ep.o\
|
||||||
|
|
||||||
DSP_FILES :=\
|
DSP_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dsp/dsp.o\
|
$(BUILD_DIR)/asm/Dolphin/dsp/dsp.o\
|
||||||
$(BUILD_DIR)/src/Dolphin/dsp/dsp_debug.o\
|
$(BUILD_DIR)/src/Dolphin/dsp/dsp_debug.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dsp/dsp_task.o
|
$(BUILD_DIR)/asm/Dolphin/dsp/dsp_task.o
|
||||||
|
|
||||||
DVD_FILES :=\
|
DVD_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dvd/dvdlow.o\
|
$(BUILD_DIR)/asm/Dolphin/dvd/dvdlow.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dvd/dvdfs.o\
|
$(BUILD_DIR)/asm/Dolphin/dvd/dvdfs.o\
|
||||||
|
@ -659,7 +659,7 @@ DVD_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dvd/dvdidutils.o\
|
$(BUILD_DIR)/asm/Dolphin/dvd/dvdidutils.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dvd/dvdfatal.o\
|
$(BUILD_DIR)/asm/Dolphin/dvd/dvdfatal.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/dvd/fstload.o
|
$(BUILD_DIR)/asm/Dolphin/dvd/fstload.o
|
||||||
|
|
||||||
GX_FILES :=\
|
GX_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/gx/GXInit.o\
|
$(BUILD_DIR)/asm/Dolphin/gx/GXInit.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/gx/GXFifo.o\
|
$(BUILD_DIR)/asm/Dolphin/gx/GXFifo.o\
|
||||||
|
@ -711,10 +711,10 @@ OS_FILES :=\
|
||||||
PAD_FILES :=\
|
PAD_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/pad/PadClamp.ep.o\
|
$(BUILD_DIR)/src/Dolphin/pad/PadClamp.ep.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/pad/pad.o
|
$(BUILD_DIR)/asm/Dolphin/pad/pad.o
|
||||||
|
|
||||||
VI_FILES :=\
|
VI_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/vi.o
|
$(BUILD_DIR)/asm/Dolphin/vi.o
|
||||||
|
|
||||||
MSL_PPCEABI_BARE_H :=\
|
MSL_PPCEABI_BARE_H :=\
|
||||||
$(BUILD_DIR)/src/Runtime/__mem.o\
|
$(BUILD_DIR)/src/Runtime/__mem.o\
|
||||||
$(BUILD_DIR)/src/Runtime/__va_arg.o\
|
$(BUILD_DIR)/src/Runtime/__va_arg.o\
|
||||||
|
@ -782,7 +782,7 @@ MSL_COMMON_MATH :=\
|
||||||
$(BUILD_DIR)/src/Runtime/w_log.o\
|
$(BUILD_DIR)/src/Runtime/w_log.o\
|
||||||
$(BUILD_DIR)/src/Runtime/w_pow.o\
|
$(BUILD_DIR)/src/Runtime/w_pow.o\
|
||||||
$(BUILD_DIR)/src/Runtime/math_ppc.o\
|
$(BUILD_DIR)/src/Runtime/math_ppc.o\
|
||||||
|
|
||||||
MUSYX_FILES :=\
|
MUSYX_FILES :=\
|
||||||
$(BUILD_DIR)/asm/musyx/seq.o\
|
$(BUILD_DIR)/asm/musyx/seq.o\
|
||||||
$(BUILD_DIR)/asm/musyx/synth.o\
|
$(BUILD_DIR)/asm/musyx/synth.o\
|
||||||
|
@ -815,10 +815,10 @@ MUSYX_FILES :=\
|
||||||
$(BUILD_DIR)/asm/musyx/reverb.o\
|
$(BUILD_DIR)/asm/musyx/reverb.o\
|
||||||
$(BUILD_DIR)/src/musyx/delay_fx.o\
|
$(BUILD_DIR)/src/musyx/delay_fx.o\
|
||||||
$(BUILD_DIR)/asm/musyx/chorus_fx.o\
|
$(BUILD_DIR)/asm/musyx/chorus_fx.o\
|
||||||
|
|
||||||
DTK_FILES :=\
|
DTK_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/dtk.o
|
$(BUILD_DIR)/src/Dolphin/dtk.o
|
||||||
|
|
||||||
CARD_FILES :=\
|
CARD_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/card/CARDBios.o\
|
$(BUILD_DIR)/asm/Dolphin/card/CARDBios.o\
|
||||||
$(BUILD_DIR)/src/Dolphin/card/CARDUnlock.ep.o\
|
$(BUILD_DIR)/src/Dolphin/card/CARDUnlock.ep.o\
|
||||||
|
@ -836,11 +836,11 @@ CARD_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/card/CARDStat.ep.o\
|
$(BUILD_DIR)/src/Dolphin/card/CARDStat.ep.o\
|
||||||
$(BUILD_DIR)/src/Dolphin/card/CARDRename.ep.o\
|
$(BUILD_DIR)/src/Dolphin/card/CARDRename.ep.o\
|
||||||
$(BUILD_DIR)/src/Dolphin/card/CARDNet.ep.o
|
$(BUILD_DIR)/src/Dolphin/card/CARDNet.ep.o
|
||||||
|
|
||||||
SI_FILES :=\
|
SI_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/si/SIBios.o\
|
$(BUILD_DIR)/asm/Dolphin/si/SIBios.o\
|
||||||
$(BUILD_DIR)/src/Dolphin/si/SISamplingRate.ep.o
|
$(BUILD_DIR)/src/Dolphin/si/SISamplingRate.ep.o
|
||||||
|
|
||||||
EXI_FILES :=\
|
EXI_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/exi/EXIBios.o\
|
$(BUILD_DIR)/asm/Dolphin/exi/EXIBios.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/exi/EXIUart.o
|
$(BUILD_DIR)/asm/Dolphin/exi/EXIUart.o
|
||||||
|
@ -848,7 +848,7 @@ EXI_FILES :=\
|
||||||
THP_FILES :=\
|
THP_FILES :=\
|
||||||
$(BUILD_DIR)/asm/Dolphin/thp/THPDec.o\
|
$(BUILD_DIR)/asm/Dolphin/thp/THPDec.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/thp/THPAudio.o
|
$(BUILD_DIR)/asm/Dolphin/thp/THPAudio.o
|
||||||
|
|
||||||
GBA_FILES :=\
|
GBA_FILES :=\
|
||||||
$(BUILD_DIR)/src/Dolphin/GBA/GBA.ep.o\
|
$(BUILD_DIR)/src/Dolphin/GBA/GBA.ep.o\
|
||||||
$(BUILD_DIR)/asm/Dolphin/GBA/GBAGetProcessStatus.o\
|
$(BUILD_DIR)/asm/Dolphin/GBA/GBAGetProcessStatus.o\
|
||||||
|
|
|
@ -12,7 +12,7 @@ void WriteProc(s32 chan) {
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 GBAWriteAsync(s32 chan, u8* src, u8* status, GBACallback callback) {
|
s32 GBAWriteAsync(s32 chan, u8* src, u8* status, GBACallback callback) {
|
||||||
GBA* gba;
|
GBA* gba;
|
||||||
s32 ret;
|
s32 ret;
|
||||||
gba = &__GBA[chan];
|
gba = &__GBA[chan];
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
#include "MetroidPrime/CGBASupport.hpp"
|
||||||
|
#include "Kyoto/Alloc/CCallStack.hpp"
|
||||||
|
#include "Kyoto/Alloc/CMemory.hpp"
|
||||||
|
#include "Kyoto/Basics/CBasics.hpp"
|
||||||
|
#include "dolphin/gba.h"
|
||||||
|
#include "dolphin/os.h"
|
||||||
|
#include "dolphin/os/OSSerial.h"
|
||||||
|
#include "rstl/math.hpp"
|
||||||
|
|
||||||
|
void joyboot_callback(s32 chan, s32 ret) {}
|
||||||
|
|
||||||
|
const uint MAGIC = 0x414d5445;
|
||||||
|
|
||||||
|
static CGBASupport* g_GBA;
|
||||||
|
|
||||||
|
CGBASupport::CGBASupport()
|
||||||
|
: x0_file("client_pad.bin")
|
||||||
|
, x28_fileSize(OSRoundUp32B(x0_file.Length()))
|
||||||
|
, x2c_buffer((uchar*)CMemory::Alloc(x28_fileSize, IAllocator::kHI_RoundUpLen))
|
||||||
|
, x30_dvdReq(x0_file.SyncRead(x2c_buffer.get(), x28_fileSize))
|
||||||
|
, x34_phase(kP_LoadClientPad)
|
||||||
|
, x38_timeout(0.f)
|
||||||
|
, x3c_status(0)
|
||||||
|
, x40_siChan(-1)
|
||||||
|
, x44_fusionLinked(false)
|
||||||
|
, x45_fusionBeat(false) {
|
||||||
|
GBAInit();
|
||||||
|
g_GBA = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGBASupport::~CGBASupport() { g_GBA = nullptr; }
|
||||||
|
|
||||||
|
void CGBASupport::InitializeSupport() {
|
||||||
|
x34_phase = kP_Standby;
|
||||||
|
x38_timeout = 0.f;
|
||||||
|
x3c_status = 0;
|
||||||
|
x40_siChan = -1;
|
||||||
|
x44_fusionLinked = false;
|
||||||
|
x45_fusionBeat = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGBASupport::StartLink() {
|
||||||
|
x34_phase = kP_StartProbeTimeout;
|
||||||
|
x40_siChan = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool CGBASupport::CheckReadyStatus() {
|
||||||
|
if (x34_phase != kP_LoadClientPad)
|
||||||
|
return true;
|
||||||
|
if (x30_dvdReq->IsComplete()) {
|
||||||
|
x30_dvdReq = nullptr;
|
||||||
|
x34_phase = kP_Standby;
|
||||||
|
uchar* buff = x2c_buffer.get();
|
||||||
|
u32 tick = OSGetTick();
|
||||||
|
buff[0xc8] = (tick >> 0);
|
||||||
|
buff[0xc9] = (tick >> 8);
|
||||||
|
buff[0xca] = (tick >> 16);
|
||||||
|
buff[0xcb] = (tick >> 24);
|
||||||
|
buff[0xaf] = 'E'; // set region to 'E' instead of 'J'
|
||||||
|
buff[0xbd] = 0xc9;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CGBASupport::IsReady() { return CheckReadyStatus(); }
|
||||||
|
|
||||||
|
void CGBASupport::Update(float dt) {
|
||||||
|
switch (x34_phase) {
|
||||||
|
case kP_LoadClientPad:
|
||||||
|
CheckReadyStatus();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kP_StartProbeTimeout:
|
||||||
|
x38_timeout = 4.f;
|
||||||
|
x34_phase = kP_PollProbe;
|
||||||
|
// [[fallthrough]];
|
||||||
|
|
||||||
|
case kP_PollProbe:
|
||||||
|
int channel = 1;
|
||||||
|
do {
|
||||||
|
uint result = SIProbe(channel);
|
||||||
|
if (result == 0x40000) {
|
||||||
|
x40_siChan = channel;
|
||||||
|
x34_phase = kP_StartJoyBusBoot;
|
||||||
|
x38_timeout = 4.f;
|
||||||
|
goto end_switch;
|
||||||
|
}
|
||||||
|
channel++;
|
||||||
|
} while (channel < 4);
|
||||||
|
float newT = rstl::max_val(0.f, x38_timeout - dt);
|
||||||
|
x38_timeout = newT;
|
||||||
|
if (x38_timeout == 0.f) {
|
||||||
|
x34_phase = kP_Failed;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kP_StartJoyBusBoot:
|
||||||
|
x34_phase = kP_PollJoyBusBoot;
|
||||||
|
GBAJoyBootAsync(x40_siChan, x40_siChan << 1, 2, x2c_buffer.get(), x0_file.Length(),
|
||||||
|
&x3c_status, &joyboot_callback);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kP_PollJoyBusBoot:
|
||||||
|
int status = GBAGetProcessStatus(x40_siChan, &x3c_status);
|
||||||
|
if (status != GBA_BUSY) {
|
||||||
|
if (GBAGetStatus(x40_siChan, &x3c_status) == GBA_NOT_READY) {
|
||||||
|
x34_phase = kP_Failed;
|
||||||
|
} else {
|
||||||
|
x38_timeout = 4.f;
|
||||||
|
x34_phase = kP_DataTransfer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case kP_DataTransfer:
|
||||||
|
if (PollResponse()) {
|
||||||
|
x34_phase = kP_Complete;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x38_timeout = rstl::max_val(0.f, x38_timeout - dt);
|
||||||
|
if (x38_timeout == 0.f)
|
||||||
|
x34_phase = kP_Failed;
|
||||||
|
break;
|
||||||
|
case kP_Complete:
|
||||||
|
case kP_Failed:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
end_switch:;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uchar CalculateFusionJBusChecksum(const uchar* data, uint i) {
|
||||||
|
// const uchar* data = reinterpret_cast< const uchar* >(dataPtr);
|
||||||
|
// uint i = 3;
|
||||||
|
uint sum = -1;
|
||||||
|
do {
|
||||||
|
uchar ch = *data++;
|
||||||
|
sum ^= ch;
|
||||||
|
for (int j = 0; j < 8; ++j) {
|
||||||
|
if ((sum & 1)) {
|
||||||
|
sum >>= 1;
|
||||||
|
sum ^= 0xb010;
|
||||||
|
} else
|
||||||
|
sum >>= 1;
|
||||||
|
}
|
||||||
|
} while (--i);
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CGBASupport::PollResponse() {
|
||||||
|
uchar gbaStatus;
|
||||||
|
uint unk;
|
||||||
|
|
||||||
|
// Not sure why this is called twice
|
||||||
|
if (GBAReset(x40_siChan, &gbaStatus) == GBA_NOT_READY &&
|
||||||
|
GBAReset(x40_siChan, &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (GBAGetStatus(x40_siChan, &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (gbaStatus != 0x28) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint magic;
|
||||||
|
if (GBARead(x40_siChan, reinterpret_cast<u8*>(&magic), &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (magic != 0x414d5445) { // "AMTE"
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (GBAGetStatus(x40_siChan, &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (gbaStatus != 0x20) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (GBAWrite(x40_siChan, (u8*)(&MAGIC), &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (GBAGetStatus(x40_siChan, &gbaStatus) == GBA_NOT_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((gbaStatus & 0x30) != 0x30) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint start = OSGetTick();
|
||||||
|
do {
|
||||||
|
uint current = OSGetTick();
|
||||||
|
if (OSTicksToMicroseconds(current - start) > 500) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
} while ((GBAGetStatus(x40_siChan, &gbaStatus) == GBA_NOT_READY || (gbaStatus & 0x8) == 0) ||
|
||||||
|
(GBAGetStatus(x40_siChan, &gbaStatus) != GBA_READY || gbaStatus != 0x38));
|
||||||
|
|
||||||
|
uint read;
|
||||||
|
uchar fusionStatus[4];
|
||||||
|
if (GBARead(x40_siChan, reinterpret_cast<uchar*>(&read), &gbaStatus) != GBA_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fusionStatus[0] = read >> 24;
|
||||||
|
fusionStatus[1] = read >> 16;
|
||||||
|
fusionStatus[2] = read >> 8;
|
||||||
|
fusionStatus[3] = read;
|
||||||
|
if (fusionStatus[3] != CalculateFusionJBusChecksum(fusionStatus, 3)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
x44_fusionLinked = (fusionStatus[2] & 0x2) == 0;
|
||||||
|
bool fusionBeat = false;
|
||||||
|
if (x44_fusionLinked != false && (fusionStatus[2] & 0x1) > 0) {
|
||||||
|
fusionBeat = true;
|
||||||
|
}
|
||||||
|
x45_fusionBeat = fusionBeat;
|
||||||
|
|
||||||
|
end:
|
||||||
|
return true;
|
||||||
|
}
|
Loading…
Reference in New Issue