diff --git a/config/dol_slices.yml b/config/dol_slices.yml index 21fd9b2e..a1385b47 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -194,10 +194,14 @@ TRK/mainloop.c: TRK/nubevent.c: .text: [0x800A20EC, 0x800A2314] .bss: [0x802095C8, 0x802095F0] -#TRK/nubinit.c: #breaks .init and .text +#TRK/nubinit.c: #things break, fix later # .text: [0x800A2314, 0x800A2494] # .rodata: [0x800AF750, 0x800AF770] # .bss: [0x802095F0, 0x802095F8] +#TRK/dispatch.c: +# .text: [0x800A34F4, 0x800A3590] +# .data: [0x800E2128, 0x800E21B0] +# .bss: [0x8020AFC0, 0x8020AFC8] dolphin/odenotstub/odenotstub.c: .text: [0x800a9770, 0x800a9780] dolphin/amcstubs/AmcExi2Stubs.c: diff --git a/configure.py b/configure.py index 6a473c84..584d932a 100644 --- a/configure.py +++ b/configure.py @@ -647,7 +647,7 @@ class CSource(Source): self.cc = c.CC self.cflags = c.DOL_CPPFLAGS self.frank = False - elif path == "src/TRK/mainloop.c" or path == "src/TRK/nubevent.c" or path == "src/TRK/nubinit.c": + elif path == "src/TRK/mainloop.c" or path == "src/TRK/nubevent.c" or path == "src/TRK/nubinit.c" or path == "src/TRK/dispatch.c": self.cc = c.CC self.cflags = c.DOL_TRK_CFLAGS self.frank = False diff --git a/include/TRK/msgbuf.h b/include/TRK/msgbuf.h index 27e02237..f41a560f 100644 --- a/include/TRK/msgbuf.h +++ b/include/TRK/msgbuf.h @@ -17,6 +17,8 @@ typedef struct MessageBuffer { MessageBuffer* TRKGetBuffer(int); void TRKReleaseBuffer(int); TRKResult TRKInitializeMessageBuffers(); +void TRKSetBufferPosition(MessageBuffer*, u32); +void TRKReadBuffer1_ui8(MessageBuffer*, u8*); #ifdef __cplusplus } diff --git a/include/TRK/msghndlr.h b/include/TRK/msghndlr.h new file mode 100644 index 00000000..94774e8f --- /dev/null +++ b/include/TRK/msghndlr.h @@ -0,0 +1,41 @@ +#ifndef TRK_MSGHNDLR +#define TRK_MSGHNDLR +#include "types.h" +#include "TRK/trk.h" +#include "TRK/msgbuf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +TRKResult TRKDoUnsupported(MessageBuffer*); +TRKResult TRKDoConnect(MessageBuffer*); +TRKResult TRKDoDisconnect(MessageBuffer*); +TRKResult TRKDoReset(MessageBuffer*); +TRKResult TRKDoVersions(MessageBuffer*); +TRKResult TRKDoSupportMask(MessageBuffer*); +TRKResult TRKDoCPUType(MessageBuffer*); +TRKResult TRKDoReadMemory(MessageBuffer*); +TRKResult TRKDoWriteMemory(MessageBuffer*); +TRKResult TRKDoReadRegisters(MessageBuffer*); +TRKResult TRKDoWriteRegisters(MessageBuffer*); +TRKResult TRKDoFlushCache(MessageBuffer*); +TRKResult TRKDoSetOption(MessageBuffer*); +TRKResult TRKDoContinue(MessageBuffer*); +TRKResult TRKDoStep(MessageBuffer*); +TRKResult TRKDoStop(MessageBuffer*); + + + + + + + + + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/TRK/dispatch.c b/src/TRK/dispatch.c new file mode 100644 index 00000000..54c83acd --- /dev/null +++ b/src/TRK/dispatch.c @@ -0,0 +1,31 @@ +#include "TRK/dispatch.h" +#include "TRK/msghndlr.h" + +u32 gTRKDispatchTableSize; + +TRKResult (*gTRKDispatchTable[])(MessageBuffer*) = {&TRKDoUnsupported, &TRKDoConnect, &TRKDoDisconnect, +&TRKDoReset, &TRKDoVersions, &TRKDoSupportMask, &TRKDoCPUType, &TRKDoUnsupported,&TRKDoUnsupported, +&TRKDoUnsupported,&TRKDoUnsupported,&TRKDoUnsupported,&TRKDoUnsupported,&TRKDoUnsupported, +&TRKDoUnsupported,&TRKDoUnsupported, &TRKDoReadMemory, &TRKDoWriteMemory, &TRKDoReadRegisters, +&TRKDoWriteRegisters, &TRKDoUnsupported,&TRKDoUnsupported, &TRKDoFlushCache, &TRKDoSetOption, +&TRKDoContinue, &TRKDoStep, &TRKDoStop}; + +TRKResult TRKInitializeDispatcher(){ + gTRKDispatchTableSize = 32; + return TRKSuccess; +} + +TRKResult TRKDispatchMessage(MessageBuffer* mbuf){ + + u8 buf; + s16 val; + TRKResult res = TRKError500; + + TRKSetBufferPosition(mbuf, 0); + TRKReadBuffer1_ui8(mbuf, &buf); + val = buf; + if ((val & 0xFF) < gTRKDispatchTableSize){ + res = gTRKDispatchTable[buf](mbuf); + } + return res; +} \ No newline at end of file