Yoink MetroTRK from Pikmin & Mario Party 4 (thanks!)

This commit is contained in:
Cuyler36
2025-05-25 13:06:26 -04:00
parent ce0aa347ee
commit 657c536ca4
40 changed files with 4095 additions and 350 deletions
@@ -0,0 +1,24 @@
#ifndef ODEMUEXI_DEBUGGER_DRIVER_H
#define ODEMUEXI_DEBUGGER_DRIVER_H
#include <dolphin/os.h>
#ifdef __cplusplus
extern "C" {
#endif
int Hu_IsStub();
void DBInitComm(volatile u8** param_1, __OSInterruptHandler param_2);
void DBInitInterrupts(void);
u32 DBQueryData(void);
int DBRead(void* data, u32 size);
int DBWrite(const void* data, u32 size);
void DBOpen(void);
void DBClose(void);
#ifdef __cplusplus
}
#endif
#endif
@@ -2,15 +2,14 @@
#define TRK_CC_GDEV_H
#include "types.h"
#include <dolphin/os/OSInterrupt.h>
// #include "NdevExi2A/DebuggerDriver.h"
#include "NdevExi2A/DebuggerDriver.h"
// TODO: figure out what these values represent
typedef enum { GDEV_RESULT_10009 = -10009, GDEV_RESULT_10005 = -10005, GDEV_RESULT_10001 = -10001 } UnkGdevEnum;
void OutputData();
BOOL IsInitialized();
int gdev_cc_initialize(u8** flagOut, __OSInterruptHandler handler);
int gdev_cc_initialize(u8** flagOut, OSInterruptHandler handler);
int gdev_cc_shutdown();
int gdev_cc_open();
int gdev_cc_close();
@@ -1,7 +1,7 @@
#ifndef METROTRK_MEM_TRK_H
#define METROTRK_MEM_TRK_H
#include "TRK/dstypes.h"
#include "TRK/trk.h"
#include "PowerPC_EABI_Support/MetroTRK/dstypes.h"
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
typedef struct memRange {
u8* start;
@@ -1,43 +1,56 @@
#ifndef _DOLPHIN_TRK_H
#define _DOLPHIN_TRK_H
#include <dolphin/types.h>
#include "TRK/trktypes.h"
#include "TRK/ppc_reg.h"
#include "types.h"
#include "PowerPC_EABI_Support/MetroTRK/trktypes.h"
#include "PowerPC_EABI_Support/MetroTRK/ppc_reg.h"
#ifdef __cplusplus
extern "C" {
#endif // ifdef __cplusplus
////// MSG HANDLING FUNCTIONS //////
DSError TRKDoConnect(MessageBuffer*);
DSError TRKDoDisconnect(MessageBuffer*);
DSError TRKDoReset(MessageBuffer*);
DSError TRKDoVersions(MessageBuffer*);
DSError TRKDoSupportMask(MessageBuffer*);
DSError TRKDoOverride(MessageBuffer*);
DSError TRKDoReadMemory(MessageBuffer*);
DSError TRKDoWriteMemory(MessageBuffer*);
DSError TRKDoReadRegisters(MessageBuffer*);
DSError TRKDoWriteRegisters(MessageBuffer*);
DSError TRKDoSetOption(MessageBuffer*);
DSError TRKDoContinue(MessageBuffer*);
DSError TRKDoStep(MessageBuffer*);
DSError TRKDoStop(MessageBuffer*);
DSError TRKDoUnsupported(MessageBuffer*);
DSError TRKDoCPUType(MessageBuffer*);
DSError TRKDoFlushCache(MessageBuffer*);
DSError TRKDoConnect(TRKBuffer*);
DSError TRKDoDisconnect(TRKBuffer*);
DSError TRKDoReset(TRKBuffer*);
DSError TRKDoVersions(TRKBuffer*);
DSError TRKDoSupportMask(TRKBuffer*);
DSError TRKDoOverride(TRKBuffer*);
DSError TRKDoReadMemory(TRKBuffer*);
DSError TRKDoWriteMemory(TRKBuffer*);
DSError TRKDoReadRegisters(TRKBuffer*);
DSError TRKDoWriteRegisters(TRKBuffer*);
DSError TRKDoSetOption(TRKBuffer*);
DSError TRKDoContinue(TRKBuffer*);
DSError TRKDoStep(TRKBuffer*);
DSError TRKDoStop(TRKBuffer*);
DSError TRKDoUnsupported(TRKBuffer*);
DSError TRKDoCPUType(TRKBuffer*);
DSError TRKDoFlushCache(TRKBuffer*);
void SetBufferPosition(MessageBuffer*, u32);
void __TRK_copy_vectors();
void SetBufferPosition(TRKBuffer*, u32);
void SetTRKConnected(int);
int GetTRKConnected(void);
DSError TRKGetFreeBuffer(int*, MessageBuffer**);
DSError TRKGetFreeBuffer(int*, TRKBuffer**);
void OutputData(void* data, int length);
void TRKResetBuffer(MessageBuffer* msg, u8 keepData);
void TRKResetBuffer(TRKBuffer* msg, u8 keepData);
DSError TRKReadBuffer1_ui64(MessageBuffer* buffer, u64* data);
DSError TRKAppendBuffer1_ui64(MessageBuffer* buffer, const u64 data);
DSError TRKReadBuffer_ui8(TRKBuffer* buffer, u8* data, int count);
DSError TRKReadBuffer_ui32(TRKBuffer* buffer, u32* data, int count);
DSError TRKReadBuffer1_ui8(TRKBuffer* buffer, u8* data);
DSError TRKReadBuffer1_ui16(TRKBuffer* buffer, u16* data);
DSError TRKReadBuffer1_ui32(TRKBuffer* buffer, u32* data);
DSError TRKReadBuffer1_ui64(TRKBuffer* buffer, u64* data);
DSError TRKAppendBuffer_ui8(TRKBuffer* buffer, const u8* data, int count);
DSError TRKAppendBuffer_ui32(TRKBuffer* buffer, const u32* data, int count);
DSError TRKAppendBuffer1_ui16(TRKBuffer* buffer, const u16 data);
DSError TRKAppendBuffer1_ui32(TRKBuffer* buffer, const u32 data);
DSError TRKAppendBuffer1_ui64(TRKBuffer* buffer, const u64 data);
////////////////////////////////////
/////// DOLPHIN TRK FUNCTIONS //////
@@ -100,7 +113,7 @@ void TRKConstructEvent(TRKEvent* event, int eventType);
void TRKDestructEvent(TRKEvent* event);
DSError TRKPostEvent(TRKEvent* event);
BOOL TRKGetNextEvent(TRKEvent* event);
DSError TRKDispatchMessage(MessageBuffer*);
DSError TRKDispatchMessage(TRKBuffer*);
void* TRKGetBuffer(int);
void TRKReleaseBuffer(int);
void TRKGetInput();
@@ -115,10 +128,10 @@ DSError TRKTargetSupportRequest();
////////////////////////////////////
////// NUB AND MEM FUNCTIONS ///////
DSError TRKAppendBuffer_ui8(MessageBuffer*, const u8*, int);
DSError TRKSetBufferPosition(MessageBuffer*, u32);
DSError TRKAppendBuffer_ui8(TRKBuffer*, const u8*, int);
DSError TRKSetBufferPosition(TRKBuffer*, u32);
DSError TRKMessageSend(MessageBuffer*);
DSError TRKMessageSend(TRKBuffer*);
void TRKSwapAndGo(void);
DSError TRKInitializeNub(void);
DSError TRKTerminateNub(void);
@@ -156,10 +169,16 @@ DSError TRKRequestSend();
u32 TRKAccessFile(u32, u32, u32*, u8*);
////////////////////////////////////
///// SERIAL POLLING FUNCTIONS /////
TRKBufferID TRKTestForPacker();
void TRKGetInput();
void TRKProcessInput(TRKBufferID bufID);
////////////////////////////////////
////////// OTHER FUNCTIONS /////////
DSError TRK_main(void);
UARTError InitializeUART(UARTBaudRate baudRate);
DSError TRKInitializeIntDrivenUART(u32, u32, u32, void*);
DSError TRKInitializeIntDrivenUART(u32, u32, u32, volatile u8**);
int TRKPollUART();
UARTError TRKReadUARTN(void*, u32);
UARTError TRKWriteUARTN(const void* bytes, u32 length);
@@ -167,10 +186,12 @@ void usr_put_initialize();
void TRKTargetSetInputPendingPtr(void*);
void SetUseSerialIO(u8);
u8 GetUseSerialIO(void);
u8 TRKTargetCPUMinorType();
DSError TRKTargetAddStopInfo(MessageBuffer*);
void TRKTargetAddExceptionInfo(MessageBuffer*);
DSError TRKTargetAddStopInfo(TRKBuffer*);
DSError TRKTargetAddExceptionInfo(TRKBuffer*);
void TRKInterruptHandler();
void TRKPostInterruptEvent();
BOOL usr_puts_serial(const char* msg);
////////////////////////////////////
@@ -181,11 +202,11 @@ extern ProcessorState_PPC gTRKCPUState;
extern ProcessorRestoreFlags_PPC gTRKRestoreFlags;
extern u8 gTRKInterruptVectorTable[];
extern TRKState gTRKState;
extern MessageBuffer gTRKMsgBufs[3];
extern TRKBuffer gTRKMsgBufs[3];
////////////////////////////////////
////////// USEFUL STATICS //////////
static inline DSError TRKAppendBuffer1_ui8(MessageBuffer* buffer, const u8 data)
static inline DSError TRKAppendBuffer1_ui8(TRKBuffer* buffer, const u8 data)
{
if (buffer->position >= 0x880) {
return DS_MessageBufferOverflow;
@@ -40,6 +40,17 @@ typedef enum {
DS_Error800 = 0x800,
} DSError;
typedef struct DSCPUType {
u8 cpuMajor;
u8 cpuMinor;
u8 bigEndian;
u8 defaultTypeSize;
u8 fpTypeSize;
u8 extended1TypeSize;
u8 extended2TypeSize;
} DSCPUType;
DSError TRKTargetCPUType(DSCPUType* cpuType);
// Where to read/write.
typedef enum {
DS_Stdin = 0,
@@ -2,8 +2,8 @@
#define _METROTRK_TRKTYPES_H
#include "types.h"
#include <dolphin/os/OSInterrupt.h>
#include "TRK/trkenum.h"
#include "Dolphin/OS/OSInterrupt.h"
#include "PowerPC_EABI_Support/MetroTRK/trkenum.h"
#ifdef __cplusplus
extern "C" {
@@ -12,12 +12,12 @@ extern "C" {
/////// TRK STRUCTS AND TYPES //////
// Function types for DB communications.
typedef int (*DBCommFunc)();
typedef int (*DBCommInitFunc)(void*, __OSInterruptHandler);
typedef int (*DBCommReadFunc)(u8*, int);
typedef int (*DBCommWriteFunc)(const u8*, int);
typedef void (*DBCommInitFunc)(volatile u8**, __OSInterruptHandler);
typedef int (*DBCommReadFunc)(void*, u32);
typedef int (*DBCommWriteFunc)(const void*, u32);
// Message buffer ID type.
typedef int MessageBufferID;
typedef int TRKBufferID;
// Nub event ID type.
typedef u32 NubEventID;
@@ -29,26 +29,23 @@ typedef int UARTError;
#define TRKMSGBUF_SIZE (0x800 + 0x80)
// Struct for sending and receiving messages (size 0x88C).
typedef struct MessageBuffer {
u32 _00; // _00, unknown
typedef struct TRKBuffer {
u32 mutex; // _00
BOOL isInUse; // _04
u32 length; // _08
u32 position; // _0C
u8 data[TRKMSGBUF_SIZE]; // _10
} MessageBuffer;
} TRKBuffer;
// Struct for storing DB communication functions (size 0x28).
// Struct for storing DB communication functions (size 0x1C).
typedef struct DBCommTable {
DBCommInitFunc initialize_func; // _00
DBCommFunc init_interrupts_func; // _04
DBCommFunc shutdown_func; // _08
DBCommFunc peek_func; // _0C
DBCommReadFunc read_func; // _10
DBCommWriteFunc write_func; // _14
DBCommFunc open_func; // _18
DBCommFunc close_func; // _1C
DBCommFunc pre_continue_func; // _20
DBCommFunc post_stop_func; // _24
DBCommFunc peek_func; // _08
DBCommReadFunc read_func; // _0C
DBCommWriteFunc write_func; // _10
DBCommFunc open_func; // _14
DBCommFunc close_func; // _18
} DBCommTable;
// Struct for information on DS versions (kernel and protocol) (size 0x4)
@@ -67,11 +64,11 @@ typedef struct TRKPacketSeq {
// Struct for receiving packets from serial poll (size 0x14).
typedef struct TRKFramingState {
MessageBufferID msgBufID; // _00
MessageBuffer* buffer; // _04
ReceiverState receiveState; // _08
BOOL isEscape; // _0C
u8 fcsType; // _10
TRKBufferID msgBufID; // _00
TRKBuffer* buffer; // _04
u8 receiveState; // _08
BOOL isEscape; // _0C
u8 fcsType; // _10
} TRKFramingState;
// Command reply information (size 0x40).
@@ -91,9 +88,9 @@ typedef struct CommandReply {
// Nub event information (size 0xC).
typedef struct TRKEvent {
u8 eventType; // _00
NubEventID eventID; // _04
MessageBufferID msgBufID; // _08
u8 eventType; // _00
NubEventID eventID; // _04
TRKBufferID msgBufID; // _08
} TRKEvent;
// Event queue (size 0x28).
+27
View File
@@ -0,0 +1,27 @@
#ifndef AMCEXI2STUBS_H
#define AMCEXI2STUBS_H
#include "dolphin/os.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef __OSInterruptHandler AmcEXICallback;
typedef enum { AMC_EXI_NO_ERROR = 0, AMC_EXI_UNSELECTED } AmcExiError;
void EXI2_Init(volatile u8**, AmcEXICallback);
void EXI2_EnableInterrupts(void);
u32 EXI2_Poll(void);
int EXI2_ReadN(void*, u32);
int EXI2_WriteN(const void*, u32);
void EXI2_Reserve(void);
void EXI2_Unreserve(void);
BOOL AMC_IsStub(void);
#ifdef __cplusplus
};
#endif
#endif
+18 -1
View File
@@ -1,13 +1,30 @@
#ifndef DB_H
#define DB_H
#include "types.h"
#ifdef __cplusplus
extern "C"{
#endif
#define OS_DBINTERFACE_ADDR 0x00000040
typedef struct DBInterface
{
u32 bPresent;
u32 exceptionMask;
void (*ExceptionDestination) ( void );
void *exceptionReturn;
} DBInterface;
extern DBInterface* __DBInterface;
void DBInit(void);
void DBInitComm(int* inputFlagPtr, int* mtrCallback);
static void __DBExceptionDestination(void);
void DBPrintf(char* format, ...);
#ifdef __cplusplus
}
#endif
#endif
#endif
+21
View File
@@ -0,0 +1,21 @@
#ifndef _DOLPHIN_TRK_H
#define _DOLPHIN_TRK_H
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif // ifdef __cplusplus
unsigned int TRKTargetContinue(void);
void TRKTargetSetStopped(unsigned int);
void TRKSwapAndGo();
void UnreserveEXI2Port();
void ReserveEXI2Port();
#ifdef __cplusplus
};
#endif // ifdef __cplusplus
#endif