diff --git a/config/GQPE78/splits.txt b/config/GQPE78/splits.txt index 4f8b6fd67..dd9a38a4a 100644 --- a/config/GQPE78/splits.txt +++ b/config/GQPE78/splits.txt @@ -2904,7 +2904,7 @@ MSL_C/MSL_Common/arith.c: MSL_C/MSL_Common/buffer_io.c: .text start:0x801E1E30 end:0x801E215C -PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Src/char_io.c: +MSL_C/MSL_Common/char_io.c: .text start:0x801E215C end:0x801E25FC MSL_C/PPC_EABI/critical_regions.gamecube.c: diff --git a/config/GQPE78/symbols.txt b/config/GQPE78/symbols.txt index e039ef79f..975586644 100644 --- a/config/GQPE78/symbols.txt +++ b/config/GQPE78/symbols.txt @@ -12698,7 +12698,7 @@ __AXDSPTask = .bss:0x8036BBA0; // type:object size:0x50 scope:local __AXLocalProfile = .bss:0x8036BBF0; // type:object size:0x38 scope:global __AXStudio = .bss:0x8036BC40; // type:object size:0x36 scope:local data:4byte ...bss.0 = .bss:0x8036BC40; // type:label scope:local -__AXPB = .bss:0x8036BC80; // type:object size:0x3D00 scope:local data:2byte +__AXPB = .bss:0x8036BC80; // type:object size:0x3D00 scope:local align:32 data:2byte ...bss.0 = .bss:0x8036BC80; // type:label scope:local __AXITD = .bss:0x8036F980; // type:object size:0x1000 scope:local __AXUpdates = .bss:0x80370980; // type:object size:0x4000 scope:local diff --git a/configure.py b/configure.py index 24cdc9958..beee995c9 100644 --- a/configure.py +++ b/configure.py @@ -238,6 +238,19 @@ #"-requireprotos" ] +# Renderware library flags +cflags_renderware = [ + *cflags_base, + "-lang=c", + "-fp fmadd", + "-fp_contract off", + "-char signed", + "-str reuse", + "-common off", + "-O4,p", + #"-requireprotos" +] + # REL flags cflags_rel = [ *cflags_base, @@ -307,8 +320,9 @@ def trkLib(lib_name: str, objects: List[Object]) -> Dict[str, Any]: def RenderWareLib(lib_name: str, objects: List[Object]) -> Dict[str, Any]: return { "lib": lib_name, + "src_dir": "libs", "mw_version": "GC/1.3.2", - "cflags": cflags_base, + "cflags": cflags_renderware, "progress_category": "RW", "objects": objects, } @@ -608,7 +622,7 @@ def MatchingFor(*versions): DolphinLib( "ar", [ - Object(NonMatching, "dolphin/ar/ar.c"), + Object(Matching, "dolphin/ar/ar.c"), Object(Matching, "dolphin/ar/arq.c") ] ), @@ -620,7 +634,7 @@ def MatchingFor(*versions): Object(Matching, "dolphin/ax/AXAux.c"), Object(NonMatching, "dolphin/ax/AXCL.c"), Object(NonMatching, "dolphin/ax/AXOut.c"), - Object(NonMatching, "dolphin/ax/AXSPB.c"), + Object(Matching, "dolphin/ax/AXSPB.c"), Object(NonMatching, "dolphin/ax/AXVPB.c"), Object(Matching, "dolphin/ax/AXComp.c"), Object(NonMatching, "dolphin/ax/DSPCode.c"), @@ -672,10 +686,10 @@ def MatchingFor(*versions): "dvd", [ Object(NonMatching, "dolphin/dvd/dvdlow.c"), - Object(NonMatching, "dolphin/dvd/dvdfs.c"), + Object(Matching, "dolphin/dvd/dvdfs.c"), Object(NonMatching, "dolphin/dvd/dvd.c"), Object(Matching, "dolphin/dvd/dvdqueue.c"), - Object(NonMatching, "dolphin/dvd/dvderror.c"), + Object(Matching, "dolphin/dvd/dvderror.c"), Object(Matching, "dolphin/dvd/dvdidutils.c"), Object(Matching, "dolphin/dvd/dvdFatal.c"), Object(Matching, "dolphin/dvd/emu_level2/fstload.c"), @@ -685,7 +699,7 @@ def MatchingFor(*versions): "exi", [ Object(NonMatching, "dolphin/exi/EXIBios.c"), - Object(NonMatching, "dolphin/exi/EXIUart.c") + Object(Matching, "dolphin/exi/EXIUart.c") ] ), DolphinLib( @@ -694,9 +708,9 @@ def MatchingFor(*versions): Object(NonMatching, "dolphin/gx/GXInit.c"), Object(NonMatching, "dolphin/gx/GXFifo.c"), Object(NonMatching, "dolphin/gx/GXAttr.c"), - Object(NonMatching, "dolphin/gx/GXMisc.c"), + Object(Matching, "dolphin/gx/GXMisc.c"), Object(NonMatching, "dolphin/gx/GXGeometry.c"), - Object(NonMatching, "dolphin/gx/GXFrameBuf.c"), + Object(Matching, "dolphin/gx/GXFrameBuf.c"), Object(NonMatching, "dolphin/gx/GXLight.c"), Object(NonMatching, "dolphin/gx/GXTexture.c"), Object(NonMatching, "dolphin/gx/GXBump.c"), @@ -724,7 +738,7 @@ def MatchingFor(*versions): DolphinLib( "OdemuExi2", [ - Object(NonMatching, "dolphin/OdemuExi2/DebuggerDriver.c") + Object(Matching, "dolphin/OdemuExi2/DebuggerDriver.c", extra_cflags=["-inline on, deferred"]) ] ), DolphinLib( @@ -737,11 +751,11 @@ def MatchingFor(*versions): "os", [ Object(NonMatching, "dolphin/os/OS.c"), - Object(NonMatching, "dolphin/os/OSAlarm.c"), + Object(Matching, "dolphin/os/OSAlarm.c"), Object(Matching, "dolphin/os/OSAlloc.c"), Object(Matching, "dolphin/os/OSArena.c"), Object(Matching, "dolphin/os/OSAudioSystem.c"), - Object(NonMatching, "dolphin/os/OSCache.c"), + Object(Matching, "dolphin/os/OSCache.c"), Object(Matching, "dolphin/os/OSContext.c"), Object(NonMatching, "dolphin/os/OSError.c"), Object(NonMatching, "dolphin/os/OSFont.c"), @@ -750,11 +764,11 @@ def MatchingFor(*versions): Object(Matching, "dolphin/os/OSMemory.c"), Object(Matching, "dolphin/os/OSMutex.c"), Object(Matching, "dolphin/os/OSReboot.c"), - Object(NonMatching, "dolphin/os/OSReset.c"), + Object(Matching, "dolphin/os/OSReset.c"), Object(Matching, "dolphin/os/OSResetSW.c"), - Object(NonMatching, "dolphin/os/OSRtc.c"), - Object(NonMatching, "dolphin/os/OSThread.c"), - Object(NonMatching, "dolphin/os/OSTime.c"), + Object(Matching, "dolphin/os/OSRtc.c"), + Object(Matching, "dolphin/os/OSThread.c"), + Object(Matching, "dolphin/os/OSTime.c"), Object(Matching, "dolphin/os/OSSync.c"), Object(NonMatching, "dolphin/os/init/__start.c"), Object(NonMatching, "dolphin/os/init/__ppc_eabi_init.cpp") @@ -763,7 +777,7 @@ def MatchingFor(*versions): DolphinLib( "pad", [ - Object(NonMatching, "dolphin/pad/Padclamp.c"), + Object(Matching, "dolphin/pad/Padclamp.c"), Object(NonMatching, "dolphin/pad/Pad.c") ] ), @@ -777,7 +791,7 @@ def MatchingFor(*versions): DolphinLib( "vi", [ - Object(NonMatching, "dolphin/vi/vi.c"), + Object(Matching, "dolphin/vi/vi.c", extra_cflags=["-DMATCHING"]), ], ), mslLib( @@ -789,9 +803,9 @@ def MatchingFor(*versions): Object(NonMatching, "Runtime/global_destructor_chain.c"), Object(NonMatching, "Runtime/New.cp"), Object(NonMatching, "Runtime/NMWException.cp"), - Object(NonMatching, "Runtime/CPlusLibPPC.cp"), + Object(Matching, "Runtime/CPlusLibPPC.cp"), Object(NonMatching, "Runtime/ptmf.c"), - #Object(NonMatching, "Runtime/runtime.c"), + Object(NonMatching, "Runtime/runtime.c"), Object(NonMatching, "Runtime/__init_cpp_exceptions.cpp"), Object(NonMatching, "Runtime/Gecko_ExceptionPPC.cp"), Object(NonMatching, "Runtime/GCN_mem_alloc.c"), @@ -808,7 +822,7 @@ def MatchingFor(*versions): Object(NonMatching, "MSL_C/MSL_Common/arith.c"), Object(NonMatching, "MSL_C/MSL_Common/bsearch.c"), Object(NonMatching, "MSL_C/MSL_Common/buffer_io.c"), - Object(NonMatching, "MSL_C/PPC_EABI/critical_regions.gamecube.c"), + Object(Matching, "MSL_C/PPC_EABI/critical_regions.gamecube.c"), Object(NonMatching, "MSL_C/MSL_Common/ctype.c"), Object(NonMatching, "MSL_C/MSL_Common/direct_io.c"), Object(Matching, "MSL_C/MSL_Common/errno.c"), @@ -828,8 +842,7 @@ def MatchingFor(*versions): Object(NonMatching, "MSL_C/MSL_Common/strtold.c"), Object(NonMatching, "MSL_C/MSL_Common/strtoul.c"), Object(NonMatching, "MSL_C/MSL_Common/float.c"), - # Causes cyclic dependency error - # Object(NonMatching, "MSL_C/MSL_Common/char_io.c"), + Object(NonMatching, "MSL_C/MSL_Common/char_io.c"), Object(NonMatching, "MSL_C/MSL_Common/wchar_io.c"), Object(NonMatching, "MSL_C/MSL_Common_Embedded/uart_console_io_gcn.c") ] @@ -860,12 +873,12 @@ def MatchingFor(*versions): Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/s_modf.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/s_sin.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/s_tan.c"), - Object(NonMatching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_acos.c"), + Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_acos.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_asin.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_atan2.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_exp.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_fmod.c"), - Object(NonMatching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c"), + Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c"), Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c"), Object(NonMatching, "MSL_C/PPC_EABI/math_ppc.c"), ] @@ -883,20 +896,20 @@ def MatchingFor(*versions): Object(NonMatching, "debugger/embedded/MetroTRK/Portable/dispatch.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msghndlr.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/support.c"), - Object(NonMatching, "debugger/embedded/MetroTRK/Portable/mutex_TRK.c"), + Object(Matching, "debugger/embedded/MetroTRK/Portable/mutex_TRK.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/notify.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/main_TRK.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/mem_TRK.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Portable/string_TRK.c"), - Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c"), + Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c"), #Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s"), Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c"), #Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s"), - Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c"), + Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/usr_put.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk_glue.c"), - Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/targcont.c"), + Object(Matching, "debugger/embedded/MetroTRK/Os/dolphin/targcont.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/target_options.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Os/dolphin/UDP_Stubs.c"), Object(NonMatching, "debugger/embedded/MetroTRK/Export/mslsupp.c"), diff --git a/include/dolphin/os.h b/include/dolphin/os.h index b5952f99f..89da646e0 100644 --- a/include/dolphin/os.h +++ b/include/dolphin/os.h @@ -5,8 +5,7 @@ #include #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif // Upper words of the masks, since UIMM is only 16 bits @@ -23,26 +22,26 @@ extern "C" #define AT_ADDRESS #endif volatile int __OSTVMode AT_ADDRESS(OS_BASE_CACHED | 0xCC); -u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h +u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h u32 __OSCoreClock AT_ADDRESS(OS_BASE_CACHED | 0x00FC); // sync with OSLoMem.h #define OS_BUS_CLOCK (u32) __OSBusClock #define OS_CORE_CLOCK __OSCoreClock #define OS_TIMER_CLOCK (OS_BUS_CLOCK / 4) #ifndef _DEBUG -#define OSPhysicalToCached(paddr) ((void *)((u32)(paddr) + OS_BASE_CACHED)) -#define OSPhysicalToUncached(paddr) ((void *)((u32)(paddr) + OS_BASE_UNCACHED)) -#define OSCachedToPhysical(caddr) ((u32)((u8 *)(caddr)-OS_BASE_CACHED)) -#define OSUncachedToPhysical(ucaddr) ((u32)((u8 *)(ucaddr)-OS_BASE_UNCACHED)) -#define OSCachedToUncached(caddr) ((void *)((u8 *)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED))) -#define OSUncachedToCached(ucaddr) ((void *)((u8 *)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED))) +#define OSPhysicalToCached(paddr) ((void*)((u32)(paddr) + OS_BASE_CACHED)) +#define OSPhysicalToUncached(paddr) ((void*)((u32)(paddr) + OS_BASE_UNCACHED)) +#define OSCachedToPhysical(caddr) ((u32)((u8*)(caddr)-OS_BASE_CACHED)) +#define OSUncachedToPhysical(ucaddr) ((u32)((u8*)(ucaddr)-OS_BASE_UNCACHED)) +#define OSCachedToUncached(caddr) ((void*)((u8*)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED))) +#define OSUncachedToCached(ucaddr) ((void*)((u8*)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED))) #else -u32 OSPhysicalToCached(void *paddr); -u32 OSPhysicalToUncached(void *paddr); -u32 OSCachedToPhysical(void *caddr); -u32 OSUncachedToPhysical(void *ucaddr); -u32 OSCachedToUncached(void *caddr); -u32 OSUncachedToCached(void *ucaddr); +u32 OSPhysicalToCached(void* paddr); +u32 OSPhysicalToUncached(void* paddr); +u32 OSCachedToPhysical(void* caddr); +u32 OSUncachedToPhysical(void* ucaddr); +u32 OSCachedToUncached(void* caddr); +u32 OSUncachedToCached(void* ucaddr); #endif #define OSTicksToCycles(ticks) (((ticks) * ((OS_CORE_CLOCK * 2) / OS_TIMER_CLOCK)) / 2) @@ -60,13 +59,13 @@ u32 OSUncachedToCached(void *ucaddr); #define OSRoundUp32B(v) ((((u32)v + 31) & ~31)) #define OSRoundDown32B(v) (((u32)(v) & ~31)) -void *OSGetArenaHi(void); -void *OSGetArenaLo(void); -void OSSetArenaHi(void *newHi); -void OSSetArenaLo(void *newLo); +void* OSGetArenaHi(void); +void* OSGetArenaLo(void); +void OSSetArenaHi(void* newHi); +void OSSetArenaLo(void* newLo); -void *OSAllocFromArenaLo(u32 size, u32 align); -void *OSAllocFromArenaHi(u32 size, u32 align); +void* OSAllocFromArenaLo(u32 size, u32 align); +void* OSAllocFromArenaHi(u32 size, u32 align); void OSInit(); @@ -122,7 +121,7 @@ void OSSetLanguage(u8 language); u32 OSGetEuRgb60Mode(void); void OSSetEuRgb60Mode(u32 on); -void OSRegisterVersion(const char *id); +void OSRegisterVersion(const char* id); BOOL OSDisableInterrupts(void); BOOL OSEnableInterrupts(void); @@ -145,7 +144,7 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG -#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ +#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ defined(__SN__) #define ASSERTMSG(exp, ...) (void)((exp) || (OSPanic(__FILE__, __LINE__, __VA_ARGS__), 0)) #else @@ -154,23 +153,23 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG1 -#define ASSERTMSG1(exp, msg, param1) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1)), 0)) +#define ASSERTMSG1(exp, msg, param1) \ + (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1)), 0)) #endif #ifndef ASSERTMSG2 -#define ASSERTMSG2(exp, msg, param1, param2) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2)), 0)) +#define ASSERTMSG2(exp, msg, param1, param2) \ + (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2)), 0)) #endif #ifndef ASSERTMSG3 -#define ASSERTMSG3(exp, msg, param1, param2, param3) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3)), 0)) +#define ASSERTMSG3(exp, msg, param1, param2, param3) \ + (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3)), 0)) #endif #ifndef ASSERTMSG4 -#define ASSERTMSG4(exp, msg, param1, param2, param3, param4) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3), (param4)), 0)) +#define ASSERTMSG4(exp, msg, param1, param2, param3, param4) \ + (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3), (param4)), 0)) #endif #else // _DEBUG @@ -180,7 +179,7 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG -#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ +#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ defined(__SN__) #define ASSERTMSG(exp, ...) ((void)0) #else @@ -203,9 +202,9 @@ BOOL OSRestoreInterrupts(BOOL level); #endif // _DEBUG -void OSReport(const char *msg, ...); -void OSPanic(const char *file, int line, const char *msg, ...); -void OSFatal(GXColor fg, GXColor bg, const char *msg); +void OSReport(const char* msg, ...); +void OSPanic(const char* file, int line, const char* msg, ...); +void OSFatal(GXColor fg, GXColor bg, const char* msg); #define OSError(...) OSPanic(__FILE__, __LINE__, __VA_ARGS__) #ifndef MATCHING diff --git a/include/dolphin/os/OSInterrupt.h b/include/dolphin/os/OSInterrupt.h index 9e5d2aa03..8baa37d0b 100644 --- a/include/dolphin/os/OSInterrupt.h +++ b/include/dolphin/os/OSInterrupt.h @@ -45,32 +45,32 @@ extern "C" { #define OS_INTERRUPTMASK_MEM_3 OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_3) #define OS_INTERRUPTMASK_MEM_ADDRESS OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_ADDRESS) #define OS_INTERRUPTMASK_MEM \ - (OS_INTERRUPTMASK_MEM_0 | OS_INTERRUPTMASK_MEM_1 | OS_INTERRUPTMASK_MEM_2 | \ - OS_INTERRUPTMASK_MEM_3 | OS_INTERRUPTMASK_MEM_ADDRESS) + (OS_INTERRUPTMASK_MEM_0 | OS_INTERRUPTMASK_MEM_1 | OS_INTERRUPTMASK_MEM_2 | \ + OS_INTERRUPTMASK_MEM_3 | OS_INTERRUPTMASK_MEM_ADDRESS) #define OS_INTERRUPTMASK_DSP_AI OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_AI) #define OS_INTERRUPTMASK_DSP_ARAM OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_ARAM) #define OS_INTERRUPTMASK_DSP_DSP OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_DSP) #define OS_INTERRUPTMASK_DSP \ - (OS_INTERRUPTMASK_DSP_AI | OS_INTERRUPTMASK_DSP_ARAM | OS_INTERRUPTMASK_DSP_DSP) + (OS_INTERRUPTMASK_DSP_AI | OS_INTERRUPTMASK_DSP_ARAM | OS_INTERRUPTMASK_DSP_DSP) #define OS_INTERRUPTMASK_AI_AI OS_INTERRUPTMASK(__OS_INTERRUPT_AI_AI) #define OS_INTERRUPTMASK_AI (OS_INTERRUPTMASK_AI_AI) #define OS_INTERRUPTMASK_EXI_0_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_EXI) #define OS_INTERRUPTMASK_EXI_0_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_TC) #define OS_INTERRUPTMASK_EXI_0_EXT OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_EXT) #define OS_INTERRUPTMASK_EXI_0 \ - (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT) + (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT) #define OS_INTERRUPTMASK_EXI_1_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_EXI) #define OS_INTERRUPTMASK_EXI_1_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_TC) #define OS_INTERRUPTMASK_EXI_1_EXT OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_EXT) #define OS_INTERRUPTMASK_EXI_1 \ - (OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT) + (OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT) #define OS_INTERRUPTMASK_EXI_2_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_2_EXI) #define OS_INTERRUPTMASK_EXI_2_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_2_TC) #define OS_INTERRUPTMASK_EXI_2 (OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC) #define OS_INTERRUPTMASK_EXI \ - (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT | \ - OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT | \ - OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC) + (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT | \ + OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT | \ + OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC) #define OS_INTERRUPTMASK_PI_PE_TOKEN OS_INTERRUPTMASK(__OS_INTERRUPT_PI_PE_TOKEN) #define OS_INTERRUPTMASK_PI_PE_FINISH OS_INTERRUPTMASK(__OS_INTERRUPT_PI_PE_FINISH) #define OS_INTERRUPTMASK_PI_PE (OS_INTERRUPTMASK_PI_PE_TOKEN | OS_INTERRUPTMASK_PI_PE_FINISH) @@ -83,10 +83,10 @@ extern "C" { #define OS_INTERRUPTMASK_PI_DEBUG OS_INTERRUPTMASK(__OS_INTERRUPT_PI_DEBUG) #define OS_INTERRUPTMASK_PI_HSP OS_INTERRUPTMASK(__OS_INTERRUPT_PI_HSP) #define OS_INTERRUPTMASK_PI \ - (OS_INTERRUPTMASK_PI_CP | OS_INTERRUPTMASK_PI_SI | OS_INTERRUPTMASK_PI_DI | \ - OS_INTERRUPTMASK_PI_RSW | OS_INTERRUPTMASK_PI_ERROR | OS_INTERRUPTMASK_PI_VI | \ - OS_INTERRUPTMASK_PI_PE_TOKEN | OS_INTERRUPTMASK_PI_PE_FINISH | OS_INTERRUPTMASK_PI_DEBUG | \ - OS_INTERRUPTMASK_PI_HSP) + (OS_INTERRUPTMASK_PI_CP | OS_INTERRUPTMASK_PI_SI | OS_INTERRUPTMASK_PI_DI | \ + OS_INTERRUPTMASK_PI_RSW | OS_INTERRUPTMASK_PI_ERROR | OS_INTERRUPTMASK_PI_VI | \ + OS_INTERRUPTMASK_PI_PE_TOKEN | OS_INTERRUPTMASK_PI_PE_FINISH | OS_INTERRUPTMASK_PI_DEBUG | \ + OS_INTERRUPTMASK_PI_HSP) typedef s16 __OSInterrupt; typedef void (*__OSInterruptHandler)(__OSInterrupt interrupt, OSContext* context); @@ -95,13 +95,13 @@ typedef u32 OSInterruptMask; extern volatile __OSInterrupt __OSLastInterrupt; extern volatile u32 __OSLastInterruptSrr0; -extern volatile OSTime __OSLastInterruptTime; +// extern volatile OSTime __OSLastInterruptTime; __OSInterruptHandler __OSSetInterruptHandler(__OSInterrupt interrupt, __OSInterruptHandler handler); __OSInterruptHandler __OSGetInterruptHandler(__OSInterrupt interrupt); -void __OSDispatchInterrupt(__OSException exception, OSContext* context); +//void __OSDispatchInterrupt(__OSException exception, OSContext* context); OSInterruptMask OSGetInterruptMask(void); OSInterruptMask OSSetInterruptMask(OSInterruptMask mask); diff --git a/include/rwsdk/rpworld.h b/include/rwsdk/rpworld.h index d24736c5f..b621b4b25 100644 --- a/include/rwsdk/rpworld.h +++ b/include/rwsdk/rpworld.h @@ -1,7 +1,7 @@ #ifndef RPWORLD_H #define RPWORLD_H -#include "rwcore.h" +#include typedef struct RpLight; diff --git a/include/rwsdk/rtquat.h b/include/rwsdk/rtquat.h index f1e957574..ff402d361 100644 --- a/include/rwsdk/rtquat.h +++ b/include/rwsdk/rtquat.h @@ -1,12 +1,555 @@ #ifndef RTQUAT_H #define RTQUAT_H -#include "rwcore.h" +/** + * \defgroup rtquat RtQuat + * \ingroup mathtools + * + * Quaternion Toolkit for RenderWare. + * + * See also http://www.gamasutra.com/features/19980703/quaternions_01.htm + */ +/* + * See http://www-groups.dcs.st-and.ac.uk/~history/Mathematicians/Hamilton.html + * On 16 October 1843 (a Monday) Hamilton was walking in along the Royal + * Canal with his wife to preside at a Council meeting of the Royal Irish + * Academy. + * + * Although his wife talked to him now and again Hamilton hardly + * heard, for the discovery of the quaternions, the first noncommutative + * algebra to be studied, was taking shape in his mind:- + * + * "And here there dawned on me the notion that we must admit, in + * some sense, a fourth dimension of space for the purpose of calculating + * with triples ... An electric circuit seemed to close, and a spark + * flashed forth." + */ + +/**************************************************************************** + Includes + */ + +#include +/* renderware */ +//#include "rwplcore.h" + +//#include "rtquat.rpe" /* automatically generated header file */ + +#define RW_TOL_ORTHONORMAL ((RwReal)0.01) + +/**************************************************************************** + Global Types + */ + +typedef struct RtQuat RtQuat; +/** + * \ingroup rtquat + * \struct RtQuat + * A structure describing a Quaternion + * +*/ struct RtQuat { - RwV3d imag; - RwReal real; + RwV3d imag; /**< The imaginary part(s) */ + RwReal real; /**< The real part */ }; -#endif \ No newline at end of file +/**************************************************************************** + Defines + */ + +#define RtQuatInitMacro(result, _x, _y, _z, _w) \ + MACRO_START \ + { \ + (result)->real = (_w); \ + (result)->imag.x = (_x); \ + (result)->imag.y = (_y); \ + (result)->imag.z = (_z); \ + } \ + MACRO_STOP + +#if (!defined(RtQuatAssignMacro)) +#define RtQuatAssignMacro(_target, _source) (*(_target) = *(_source)) +#endif /* (!defined(RtQuatAssignMacro)) */ + +#define RtQuatAddMacro(result, q1, q2) \ + MACRO_START \ + { \ + (result)->real = (q1)->real + (q2)->real; \ + RwV3dAddMacro(&(result)->imag, &(q1)->imag, &(q2)->imag); \ + } \ + MACRO_STOP + +#define RtQuatIncrementRealPartMacro(result, s, q) \ + MACRO_START \ + { \ + (result)->real = (q)->real + s; \ + (result)->imag.x = (q)->imag.x; \ + (result)->imag.y = (q)->imag.y; \ + (result)->imag.z = (q)->imag.z; \ + } \ + MACRO_STOP + +#define RtQuatDecrementRealPartMacro(result, s, q) \ + MACRO_START \ + { \ + (result)->real = (q)->real - s; \ + (result)->imag.x = (q)->imag.x; \ + (result)->imag.y = (q)->imag.y; \ + (result)->imag.z = (q)->imag.z; \ + } \ + MACRO_STOP + +#define RtQuatIncrementMacro(result, dq) \ + MACRO_START \ + { \ + (result)->real = (result)->real + (dq)->real; \ + RwV3dAddMacro(&(result)->imag, &(result)->imag, &(dq)->imag); \ + } \ + MACRO_STOP + +#define RtQuatSubMacro(result, q1, q2) \ + MACRO_START \ + { \ + (result)->real = (q1)->real - (q2)->real; \ + RwV3dSubMacro(&(result)->imag, &(q1)->imag, &(q2)->imag); \ + } \ + MACRO_STOP + +#define RtQuatNegateMacro(result, q) \ + MACRO_START \ + { \ + (result)->real = -(q)->real; \ + (result)->imag.x = -(q)->imag.x; \ + (result)->imag.y = -(q)->imag.y; \ + (result)->imag.z = -(q)->imag.z; \ + } \ + MACRO_STOP + +#define RtQuatConjugateMacro(result, q) \ + MACRO_START \ + { \ + (result)->real = (q)->real; \ + (result)->imag.x = -(q)->imag.x; \ + (result)->imag.y = -(q)->imag.y; \ + (result)->imag.z = -(q)->imag.z; \ + } \ + MACRO_STOP + +#define RtQuatScaleMacro(result, q, scale) \ + MACRO_START \ + { \ + (result)->real = (q)->real * scale; \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, scale); \ + } \ + MACRO_STOP + +#define RtQuatModulusSquaredMacro(q) \ + ((q)->real * (q)->real + RwV3dDotProductMacro(&(q)->imag, &(q)->imag)) + +#define RtQuatModulusMacro(result, q) \ + MACRO_START \ + { \ + (result) = RtQuatModulusSquaredMacro(q); \ + rwSqrtMacro(&result, result); \ + } \ + MACRO_STOP + +#define RtQuatMultiplyMacro(result, q1, q2) \ + MACRO_START \ + { \ + /* \ + * Assumes q1 != result != q2 \ + */ \ + (result)->real = (q1)->real * (q2)->real - RwV3dDotProductMacro(&(q1)->imag, &(q2)->imag); \ + RwV3dCrossProductMacro(&(result)->imag, &(q1)->imag, &(q2)->imag); \ + RwV3dIncrementScaledMacro(&(result)->imag, &(q2)->imag, (q1)->real); \ + RwV3dIncrementScaledMacro(&(result)->imag, &(q1)->imag, (q2)->real); \ + } \ + MACRO_STOP + +#define RtQuatReciprocalMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + RwReal val = RtQuatModulusSquaredMacro(q); \ + \ + if (val > (RwReal)0) \ + { \ + val = ((RwReal)1) / val; \ + (result)->real = (q)->real * val; \ + val = -val; \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, val); \ + } \ + } \ + MACRO_STOP + +#define RtQuatSquareMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + RwReal val = ((RwReal)2) * (q)->real; \ + \ + (result)->real = (q)->real * (q)->real - RwV3dDotProductMacro(&(q)->imag, &(q)->imag); \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, val); \ + } \ + MACRO_STOP + +#define RtQuatSquareRootMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + * other root is of course -result \ + */ \ + RwReal val; \ + \ + RtQuatModulusMacro(val, q); \ + val = ((q)->real + val) * ((RwReal)0.5); \ + \ + if (val > ((RwReal)0)) \ + { \ + rwSqrtMacro(&val, val); \ + (result)->real = val; \ + val = ((RwReal)0.5) / val; \ + RwV3dScale(&(result)->imag, &(q)->imag, val); \ + } \ + else \ + { \ + result->imag.x = -(q)->real; \ + rwSqrtMacro(&(result->imag.x), result->imag.x); \ + result->imag.y = ((RwReal)0); \ + result->imag.x = ((RwReal)0); \ + result->real = ((RwReal)0); \ + } \ + } \ + MACRO_STOP + +#define RtQuatLogMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + const RwReal mod2 = RtQuatModulusSquaredMacro(q); \ + RwReal sin_b; \ + RwReal radians; \ + RwReal factor; \ + \ + sin_b = RwV3dDotProduct(&(q)->imag, &(q)->imag); \ + rwSqrtMacro(&sin_b, sin_b); \ + radians = (RwReal)RwATan2(sin_b, (q)->real); \ + factor = (sin_b > (RwReal)0) ? (((RwReal)radians) / sin_b) : 0; \ + \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, factor); \ + (result)->real = ((RwReal)RwLog(mod2)) * ((RwReal)0.5); \ + } \ + MACRO_STOP + +#define RtQuatExpMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + const RwReal exp_a = (RwReal)RwExp((q)->real); \ + RwReal mod_b; \ + RwReal factor; \ + \ + mod_b = RwV3dDotProduct(&(q)->imag, &(q)->imag); \ + rwSqrtMacro(&mod_b, mod_b); \ + factor = ((mod_b > (RwReal)0) ? (exp_a * ((RwReal)RwSin(mod_b)) / mod_b) : 0); \ + \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, factor); \ + (result)->real = exp_a * (RwReal)RwCos(mod_b); \ + } \ + MACRO_STOP + +#define RtQuatPowMacro(result, q, e) \ + MACRO_START \ + { \ + RtQuat qLog; \ + \ + RtQuatLogMacro(&qLog, q); \ + RtQuatScaleMacro(&qLog, &qLog, e); \ + RtQuatExpMacro(result, &qLog); \ + } \ + MACRO_STOP + +#define RtQuatUnitLogMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + RwReal sin_b; \ + RwReal radians; \ + RwReal factor; \ + \ + sin_b = RwV3dDotProduct(&(q)->imag, &(q)->imag); \ + rwSqrtMacro(&sin_b, sin_b); \ + radians = (RwReal)RwATan2(sin_b, (q)->real); \ + factor = (sin_b > (RwReal)0) ? (((RwReal)radians) / sin_b) : 0; \ + \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, factor); \ + (result)->real = (RwReal)0; \ + } \ + MACRO_STOP + +#define RtQuatUnitExpMacro(result, q) \ + MACRO_START \ + { \ + /* \ + * Assumes result != q \ + */ \ + RwReal mod_b; \ + RwReal factor; \ + \ + mod_b = RwV3dDotProduct(&(q)->imag, &(q)->imag); \ + rwSqrtMacro(&mod_b, mod_b); \ + factor = (mod_b > (RwReal)0) ? (((RwReal)RwSin(mod_b)) / mod_b) : 0; \ + \ + RwV3dScaleMacro(&(result)->imag, &(q)->imag, factor); \ + (result)->real = (RwReal)RwCos(mod_b); \ + } \ + MACRO_STOP + +#define RtQuatUnitPowMacro(result, q, e) \ + MACRO_START \ + { \ + RtQuat qLog; \ + \ + RtQuatUnitLogMacro(&qLog, q); \ + RwV3dScaleMacro(&qLog.imag, &qLog.imag, e); \ + RtQuatUnitExpMacro(result, &qLog); \ + } \ + MACRO_STOP + +#define RtQuatConvertToMatrixMacro(qpQuat, mpMatrix) \ + MACRO_START \ + { \ + RwReal rS; \ + RwV3d rV; \ + RwV3d rW; \ + RwV3d square; \ + RwV3d cross; \ + \ + rS = ((RwReal)2) / RtQuatModulusSquaredMacro((qpQuat)); \ + \ + RwV3dScale(&rV, &(qpQuat)->imag, rS); \ + RwV3dScale(&rW, &rV, (qpQuat)->real); \ + \ + square.x = (qpQuat)->imag.x * rV.x; \ + square.y = (qpQuat)->imag.y * rV.y; \ + square.z = (qpQuat)->imag.z * rV.z; \ + \ + cross.x = (qpQuat)->imag.y * rV.z; \ + cross.y = (qpQuat)->imag.z * rV.x; \ + cross.z = (qpQuat)->imag.x * rV.y; \ + \ + (mpMatrix)->right.x = ((RwReal)1) - (square.y + square.z); \ + (mpMatrix)->right.y = cross.z + rW.z; \ + (mpMatrix)->right.z = cross.y - rW.y; \ + \ + (mpMatrix)->up.x = cross.z - rW.z; \ + (mpMatrix)->up.y = ((RwReal)1) - (square.z + square.x); \ + (mpMatrix)->up.z = cross.x + rW.x; \ + \ + (mpMatrix)->at.x = cross.y + rW.y; \ + (mpMatrix)->at.y = cross.x - rW.x; \ + (mpMatrix)->at.z = ((RwReal)1) - (square.x + square.y); \ + \ + /* Set position */ \ + (mpMatrix)->pos.x = ((RwReal)0); \ + (mpMatrix)->pos.y = ((RwReal)0); \ + (mpMatrix)->pos.z = ((RwReal)0); \ + \ + /* Matrix is orthogonal */ \ + rwMatrixSetFlags((mpMatrix), (rwMATRIXTYPEORTHONORMAL & ~rwMATRIXINTERNALIDENTITY)); \ + } \ + MACRO_STOP + +#define RtQuatUnitConvertToMatrixMacro(qpQuat, mpMatrix) \ + MACRO_START \ + { \ + const RwReal x = (qpQuat)->imag.x; \ + const RwReal y = (qpQuat)->imag.y; \ + const RwReal z = (qpQuat)->imag.z; \ + const RwReal w = (qpQuat)->real; \ + RwV3d square; \ + RwV3d cross; \ + RwV3d wimag; \ + \ + square.x = x * x; \ + square.y = y * y; \ + square.z = z * z; \ + \ + cross.x = y * z; \ + cross.y = z * x; \ + cross.z = x * y; \ + \ + wimag.x = w * x; \ + wimag.y = w * y; \ + wimag.z = w * z; \ + \ + (mpMatrix)->right.x = 1 - 2 * (square.y + square.z); \ + (mpMatrix)->right.y = 2 * (cross.z + wimag.z); \ + (mpMatrix)->right.z = 2 * (cross.y - wimag.y); \ + \ + (mpMatrix)->up.x = 2 * (cross.z - wimag.z); \ + (mpMatrix)->up.y = 1 - 2 * (square.x + square.z); \ + (mpMatrix)->up.z = 2 * (cross.x + wimag.x); \ + \ + (mpMatrix)->at.x = 2 * (cross.y + wimag.y); \ + (mpMatrix)->at.y = 2 * (cross.x - wimag.x); \ + (mpMatrix)->at.z = (1 - 2 * (square.x + square.y)); \ + \ + /* Set position */ \ + (mpMatrix)->pos.x = ((RwReal)0); \ + (mpMatrix)->pos.y = ((RwReal)0); \ + (mpMatrix)->pos.z = ((RwReal)0); \ + \ + /* Matrix is orthonormal */ \ + rwMatrixSetFlags((mpMatrix), (rwMATRIXTYPEORTHONORMAL & ~rwMATRIXINTERNALIDENTITY)); \ + } \ + MACRO_STOP + +#if (!(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))) + +#define RtQuatInit(result, _x, _y, _z, _w) RtQuatInitMacro(result, _x, _y, _z, _w) + +#define RtQuatAssign(to, from) RtQuatAssignMacro(to, from) + +#define RtQuatAdd(result, q1, q2) RtQuatAddMacro(result, q1, q2) + +#define RtQuatIncrementRealPart(result, s, q) RtQuatIncrementRealPartMacro(result, s, q) + +#define RtQuatDecrementRealPart(result, s, q) RtQuatDecrementRealPartMacro(result, s, q) + +#define RtQuatIncrement(result, dq) RtQuatIncrementMacro(result, dq) + +#define RtQuatSub(result, q1, q2) RtQuatSubMacro(result, q1, q2) + +#define RtQuatNegate(result, q) RtQuatNegateMacro(result, q) + +#define RtQuatConjugate(result, q) RtQuatConjugateMacro(result, q) + +#define RtQuatScale(result, q, scale) RtQuatScaleMacro(result, q, scale) + +#define RtQuatModulusSquared(q) RtQuatModulusSquaredMacro(q) + +#define RtQuatMultiply(result, q1, q2) RtQuatMultiplyMacro(result, q1, q2) + +#define RtQuatReciprocal(result, q) RtQuatReciprocalMacro(result, q) + +#define RtQuatSquare(result, q) RtQuatSquareMacro(result, q) + +#define RtQuatSquareRoot(result, q) RtQuatSquareRootMacro(result, q) + +#define RtQuatLog(result, q) RtQuatLogMacro(result, q) + +#define RtQuatExp(result, q) RtQuatExpMacro(result, q) + +#define RtQuatPow(result, q, e) RtQuatPowMacro(result, q, e) + +#define RtQuatUnitLog(result, q) RtQuatUnitLogMacro(result, q) + +#define RtQuatUnitExp(result, q) RtQuatUnitExpMacro(result, q) + +#define RtQuatUnitPow(result, q, e) RtQuatUnitPowMacro(result, q, e) + +#define RtQuatConvertToMatrix(qpQuat, mpMatrix) RtQuatConvertToMatrixMacro(qpQuat, mpMatrix) + +#define RtQuatUnitConvertToMatrix(qpQuat, mpMatrix) RtQuatUnitConvertToMatrixMacro(qpQuat, mpMatrix) + +#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */ + +/**************************************************************************** + Function prototypes + */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern RwBool RtQuatConvertFromMatrix(RtQuat* const qpQuat, const RwMatrix* const mpMatrix); + +extern RtQuat* RtQuatRotate(RtQuat* quat, const RwV3d* axis, RwReal angle, + RwOpCombineType combineOp); + +extern const RtQuat* RtQuatQueryRotate(const RtQuat* quat, RwV3d* unitAxis, RwReal* angle); + +extern RwV3d* RtQuatTransformVectors(RwV3d* vectorsOut, const RwV3d* vectorsIn, + const RwInt32 numPoints, const RtQuat* quat); + +extern RwReal RtQuatModulus(RtQuat* q); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +extern void RtQuatInit(RtQuat* result, RwReal x, RwReal y, RwReal z, RwReal w); + +extern void RtQuatAssign(RtQuat* to, RtQuat* from); + +extern void RtQuatAdd(RtQuat* result, RtQuat* q1, RtQuat* q2); + +extern void RtQuatIncrementRealPart(RtQuat* result, RwReal s, RtQuat* q); + +extern void RtQuatDecrementRealPart(RtQuat* result, RwReal s, RtQuat* q); + +extern void RtQuatIncrement(RtQuat* result, RtQuat* dq); + +extern void RtQuatSub(RtQuat* result, RtQuat* q1, RtQuat* q2); + +extern void RtQuatNegate(RtQuat* result, RtQuat* q); + +extern void RtQuatConjugate(RtQuat* result, RtQuat* q); + +extern void RtQuatScale(RtQuat* result, RtQuat* q, RwReal scale); + +extern RwReal RtQuatModulusSquared(RtQuat* q); + +extern void RtQuatMultiply(RtQuat* result, RtQuat* q1, RtQuat* q2); + +extern void RtQuatReciprocal(RtQuat* result, RtQuat* q); + +extern void RtQuatSquare(RtQuat* result, RtQuat* q); + +extern void RtQuatSquareRoot(RtQuat* result, RtQuat* q); + +extern void RtQuatLog(RtQuat* result, RtQuat* q); + +extern void RtQuatExp(RtQuat* result, RtQuat* q); + +extern void RtQuatPow(RtQuat* result, RtQuat* q, RwReal e); + +extern void RtQuatUnitLog(RtQuat* result, RtQuat* q); + +extern void RtQuatUnitExp(RtQuat* result, RtQuat* q); + +extern void RtQuatUnitPow(RtQuat* result, RtQuat* q, RwReal e); + +extern void RtQuatConvertToMatrix(const RtQuat* const qpQuat, RwMatrix* const mpMatrix); + +extern void RtQuatUnitConvertToMatrix(const RtQuat* const qpQuat, RwMatrix* const mpMatrix); + +#endif /* ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* + * Backwards compatibility code + */ + +typedef RtQuat RpQuat; + +#define RpAnimQuatConvertFromMatrix(qpQuat, mpMatrix) RtQuatConvertFromMatrix(qpQuat, mpMatrix) + +#define RpAnimQuatConvertToMatrix(qpQuat, mpMatrix) RtQuatUnitConvertToMatrix(qpQuat, mpMatrix) + +#endif /* RTQUAT_H */ diff --git a/include/rwsdk/rtslerp.h b/include/rwsdk/rtslerp.h index e34d76568..ae07ff8b9 100644 --- a/include/rwsdk/rtslerp.h +++ b/include/rwsdk/rtslerp.h @@ -1,8 +1,9 @@ #ifndef RTSLERP_H #define RTSLERP_H -#include "rwcore.h" -#include "rtquat.h" +#include +#include +#include "rtslerp.h" struct RtQuatSlerpCache { diff --git a/include/rwsdk/rwcore.h b/include/rwsdk/rwcore.h index c35c9e823..311d8bfc1 100644 --- a/include/rwsdk/rwcore.h +++ b/include/rwsdk/rwcore.h @@ -1,7 +1,7 @@ #ifndef RWCORE_H #define RWCORE_H -#include "rwplcore.h" +#include typedef struct _RxObjSpace3DVertex RxObjSpace3DVertex; diff --git a/include/rwsdk/rwplcore.h b/include/rwsdk/rwplcore.h index 6e3b7a5a0..80c5eba6d 100644 --- a/include/rwsdk/rwplcore.h +++ b/include/rwsdk/rwplcore.h @@ -2,13 +2,14 @@ #define RWPLCORE_H #include -//#include +#include #define rwBIGENDIAN typedef long RwFixed; typedef int RwInt32; typedef unsigned int RwUInt32; + typedef short RwInt16; typedef unsigned short RwUInt16; typedef unsigned char RwUInt8; diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/char_io.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/char_io.h new file mode 100644 index 000000000..5ac7be5cc --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/char_io.h @@ -0,0 +1,17 @@ +#ifndef _MSL_COMMON_CHAR_IO_H +#define _MSL_COMMON_CHAR_IO_H + +#include "ansi_files.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int fputs(const char* str, FILE* stream); +int __put_char(int c, FILE* stream); + +#ifdef __cplusplus +} +#endif + +#endif /* _MSL_COMMON_CHAR_IO_H */ \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/math_api.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/math_api.h index 45d502265..d44317150 100644 --- a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/math_api.h +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MSL_C/MSL_Common/math_api.h @@ -16,6 +16,26 @@ int __fpclassifyd(double); #define MATH_INLINE inline #endif +MATH_INLINE float powf(float __x, float __y) +{ + return pow((double)__x, (double)__y); +} + +MATH_INLINE float sinf(float __x) +{ + return sin((double)__x); +} + +MATH_INLINE float cosf(float __x) +{ + return cos((double)__x); +} + +MATH_INLINE float atanf(float __x) +{ + return atan((double)__x); +} + MATH_INLINE int __fpclassifyf(f32 x) { switch ((*(s32*)&x) & 0x7f800000) @@ -64,21 +84,6 @@ MATH_INLINE int __fpclassifyd(f64 x) return 4; } -MATH_INLINE float cosf(float __x) -{ - return cos((double)__x); -} - -MATH_INLINE float sinf(float __x) -{ - return sin((double)__x); -} - -MATH_INLINE float tanf(float __x) -{ - return tan((double)__x); -} - #define fpclassify(x) \ ((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x))) diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/dstypes.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/dstypes.h new file mode 100644 index 000000000..9da077014 --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/dstypes.h @@ -0,0 +1,27 @@ +#ifndef METROTRK_DSTYPES +#define METROTRK_DSTYPES + +#ifdef __cplusplus +extern "C" { +#endif // ifdef __cplusplus + +// typedef unsigned char ui8; +// typedef unsigned short ui16; +// typedef unsigned long ui32; +// typedef unsigned long long ui64; +typedef unsigned char u128[16]; + +// typedef unsigned long size_t; +// typedef unsigned int uint; + +// typedef int bool; + +// #define true 1 +// #define false 0 +// #define NULL 0 + +#ifdef __cplusplus +}; +#endif // ifdef __cplusplus + +#endif diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/memmap.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/memmap.h new file mode 100644 index 000000000..205246646 --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/memmap.h @@ -0,0 +1,15 @@ +#ifndef METROTRK_MEM_TRK_H +#define METROTRK_MEM_TRK_H +#include "PowerPC_EABI_Support/MetroTRK/dstypes.h" +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +typedef struct memRange { + u8* start; + u8* end; + BOOL readable; + BOOL writeable; +} memRange; + +const memRange gTRKMemMap[1] = { { (u8*)0, (u8*)-1, TRUE, TRUE } }; + +#endif diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/ppc_reg.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/ppc_reg.h new file mode 100644 index 000000000..11411a7b1 --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/ppc_reg.h @@ -0,0 +1,242 @@ +#ifndef _PPC_REG_H +#define _PPC_REG_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif // ifdef __cplusplus + +typedef struct Default_PPC { + u32 GPR[32]; + u32 PC; + u32 LR; + u32 CR; + u32 CTR; + u32 XER; +} Default_PPC; + +typedef struct Float_PPC { + u64 FPR[32]; + u64 FPSCR; + u64 FPECR; +} Float_PPC; + +typedef struct Extended1_PPC_6xx_7xx { + // u8 pad[0x168]; + u32 SR[16]; + u32 TBL; + u32 TBU; + u32 HID0_; + u32 HID1; + u32 MSR; + u32 PVR; + u32 IBAT0U; + u32 IBAT0L; + u32 IBAT1U; + u32 IBAT1L; + u32 IBAT2U; + u32 IBAT2L; + u32 IBAT3U; + u32 IBAT3L; + u32 DBAT0U; + u32 DBAT0L; + u32 DBAT1U; + u32 DBAT1L; + u32 DBAT2U; + u32 DBAT2L; + u32 DBAT3U_; + u32 DBAT3L_; + u32 DMISS; + u32 DCMP; + u32 HASH1; + u32 HASH2; + u32 IMISS; + u32 ICMP; + u32 RPA; + u32 SDR1; + u32 DAR; + u32 DSISR; + u32 SPRG0; + u32 SPRG1; + u32 SPRG2; + u32 SPRG3; + u32 DEC; + u32 IABR; + u32 EAR; + u32 DABR; + u32 PMC1; + u32 PMC2; + u32 PMC3; + u32 PMC4; + u32 SIA; + u32 MMCR0; + u32 MMCR1; + u32 THRM1; + u32 THRM2; + u32 THRM3; + u32 ICTC; + u32 L2CR; + u32 UMMCR2; + u32 UBAMR; + u32 UMMCR0; + u32 UPMC1; + u32 UPMC2; + u32 USIA; + u32 UMMCR1; + u32 UPMC3; + u32 UPMC4; + u32 USDA; + u32 MMCR2; + u32 BAMR; + u32 SDA; + u32 MSSCR0; + u32 MSSCR1; + u32 PIR; + u32 exceptionID; + u32 GQR[8]; + u32 HID_G; + u32 WPAR; + u32 DMA_U_; + u32 DMA_L_; +} Extended1_PPC_6xx_7xx; + +typedef struct Extended2_PPC_6xx_7xx { + u32 PSR[32][2]; +} Extended2_PPC_6xx_7xx; + +typedef struct ProcessorState_PPC_6xx_7xx { + Default_PPC Default; + Float_PPC Float; + Extended1_PPC_6xx_7xx Extended1; + Extended2_PPC_6xx_7xx Extended2; + u32 transport_handler_saved_ra; +} ProcessorState_PPC_6xx_7xx; + +typedef ProcessorState_PPC_6xx_7xx ProcessorState_PPC; + +#define SPR_XER 1 +#define SPR_LR 8 +#define SPR_CTR 9 +#define SPR_DSISR 18 +#define SPR_DAR 19 +#define SPR_DEC 22 +#define SPR_SDR1 25 +#define SPR_SRR0 26 +#define SPR_SRR1 27 +#define SPR_SPRG0 272 +#define SPR_SPRG1 273 +#define SPR_SPRG2 274 +#define SPR_SPRG3 275 +#define SPR_EAR 282 +#define SPR_TBL 284 +#define SPR_TBU 285 +#define SPR_PVR 287 +#define SPR_IBAT0U 528 +#define SPR_IBAT0L 529 +#define SPR_IBAT1U 530 +#define SPR_IBAT1L 531 +#define SPR_IBAT2U 532 +#define SPR_IBAT2L 533 +#define SPR_IBAT3U 534 +#define SPR_IBAT3L 535 +#define SPR_IBAT4U 560 +#define SPR_IBAT4L 561 +#define SPR_IBAT5U 562 +#define SPR_IBAT5L 563 +#define SPR_IBAT6U 564 +#define SPR_IBAT6L 565 +#define SPR_IBAT7U 566 +#define SPR_IBAT7L 567 +#define SPR_DBAT0U 536 +#define SPR_DBAT0L 537 +#define SPR_DBAT1U 538 +#define SPR_DBAT1L 539 +#define SPR_DBAT2U 540 +#define SPR_DBAT2L 541 +#define SPR_DBAT3U 542 +#define SPR_DBAT3L 543 +#define SPR_DBAT4U 568 +#define SPR_DBAT4L 569 +#define SPR_DBAT5U 570 +#define SPR_DBAT5L 571 +#define SPR_DBAT6U 572 +#define SPR_DBAT6L 573 +#define SPR_DBAT7U 574 +#define SPR_DBAT7L 575 +#define SPR_GQR0 912 +#define SPR_GQR1 913 +#define SPR_GQR2 914 +#define SPR_GQR3 915 +#define SPR_GQR4 916 +#define SPR_GQR5 917 +#define SPR_GQR6 918 +#define SPR_GQR7 919 +#define SPR_HID2 920 +#define SPR_WPAR 921 +#define SPR_DMA_U 922 +#define SPR_DMA_L 923 +#define SPR_UMMCR0 936 +#define SPR_UPMC1 937 +#define SPR_UPMC2 938 +#define SPR_USIA 939 +#define SPR_UMMCR1 940 +#define SPR_UPMC3 941 +#define SPR_UPMC4 942 +#define SPR_USDA 943 +#define SPR_MMCR0 952 +#define SPR_PMC1 953 +#define SPR_PMC2 954 +#define SPR_SIA 955 +#define SPR_MMCR1 956 +#define SPR_PMC3 957 +#define SPR_PMC4 958 +#define SPR_SDA 959 +#define SPR_HID0 1008 +#define SPR_HID1 1009 +#define SPR_IABR 1010 +#define SPR_HID4 1011 +#define SPR_DABR 1013 +#define SPR_L2CR 1017 +#define SPR_ICTC 1019 +#define SPR_THRM1 1020 +#define SPR_THRM2 1021 +#define SPR_FPECR 1022 + +// PPC exceptions +// 0x000 is reserved +#define PPC_SystemReset 0x100 +#define PPC_MachineCheck 0x200 +#define PPC_DataStorage 0x300 +#define PPC_InstructionStorage 0x400 +#define PPC_ExternalInterrupt 0x500 +#define PPC_Alignment 0x600 +#define PPC_Program 0x700 +#define PPC_FloatingPointUnavaiable 0x800 +#define PPC_Decrementer 0x900 +// 0xA00-0xB00 are reserved +#define PPC_SystemCall 0xC00 +#define PPC_Trace 0xD00 +#define PPC_FloatingPointAssist 0xE00 // unimplemented in 750CL +#define PPC_PerformanceMonitor 0xF00 // Dolphin/Broadway specific +// 0x1000-0x1200 are unimplemented in 750CL +#define PPC_InstructionAddressBreakpoint 0x1300 // Dolphin/Broadway specific +// 0x1400-0x2F00 are reserved, but TRK uses some +#define PPC_SystemManagementInterrupt 0x1400 +// 0x1500-0x1600 are unimplemented in 750CL +#define PPC_ThermalManagementInterrupt 0x1700 +#define PPC_1800Exception 0x1800 +#define PPC_1900Exception 0x1900 +#define PPC_1A00Exception 0x1A00 +#define PPC_1B00Exception 0x1B00 +#define PPC_1C00Exception 0x1C00 // Data breakpoint? +#define PPC_1D00Exception 0x1D00 // Instruction breakpoint? +#define PPC_1E00Exception 0x1E00 // Peripheral breakpoint? +#define PPC_1F00Exception 0x1F00 // Non maskable development port? +#define PPC_2000Exception 0x2000 + +#ifdef __cplusplus +}; +#endif // ifdef __cplusplus + +#endif diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trk.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trk.h index e11a7854c..4bb4788f7 100644 --- a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trk.h +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trk.h @@ -2,215 +2,220 @@ #define _DOLPHIN_TRK_H #include "types.h" -#include "Dolphin/db.h" +#include "PowerPC_EABI_Support/MetroTRK/trktypes.h" +#include "PowerPC_EABI_Support/MetroTRK/ppc_reg.h" #ifdef __cplusplus extern "C" { #endif // ifdef __cplusplus -/* TRK */ - -#define TRK_DISPATCH_CMD_CONNECT 1 /* Connect to the console */ -#define TRK_DISPATCH_CMD_DISCONNECT 2 /* Disconnect from the console */ -#define TRK_DISPATCH_CMD_RESET 3 /* Reset the debugger */ -#define TRK_DISPATCH_CMD_GETVERSION 4 /* Get debugger version */ -#define TRK_DISPATCH_CMD_GETSUPPORTMASK 5 /* Get Support Mask */ -#define TRK_DISPATCH_CMD_OVERRIDE 7 /* Override? */ -#define TRK_DISPATCH_CMD_READMEM 16 /* Reading from memory */ -#define TRK_DISPATCH_CMD_WRITEMEM 17 /* Writing to memory */ -#define TRK_DISPATCH_CMD_READREGS 18 /* Read a register value */ -#define TRK_DISPATCH_CMD_WRITEREGS 19 /* Set a register */ -#define TRK_DISPATCH_CMD_SETOPTION 23 /* Set an option? */ -#define TRK_DISPATCH_CMD_CONTINUE 24 /* Continue debugging */ -#define TRK_DISPATCH_CMD_STEP 25 /* Step through an instruction */ -#define TRK_DISPATCH_CMD_STOP 26 /* Stop the debugger */ - -typedef struct _TRK_Msg { - u8 _00[8]; // _00 - u32 mMsgLength; // _08 - u32 _0C; // _0C - u32 mMsg; // _10 -} TRK_Msg; - -/** - * @size{0xC} - */ -typedef struct TRKEvent { - int mEventType; - int _04; - int mBufferIndex; -} TRKEvent; - -/** - * @size{0x28} - */ -typedef struct TRKEventQueue { - u8 _00[4]; - int mCurrEvtID; - int mNextSlotToOverwrite; - TRKEvent mEvents[2]; - u32 _24; /* max of 0x100? */ -} TRKEventQueue; - -/** - * @size{0xA4} - */ -typedef struct TRKState { - u32 _00; - u32 _04; - u32 _08; - u32 _0C; - u32 _10; - u32 _14; - u32 _18; - u32 _1C; - u32 _20; - u32 _24; - u32 _28; - u32 _2C; - u32 _30; - u32 _34; - u32 _38; - u32 _3C; - u32 _40; - u32 _44; - u32 _48; - u32 _4C; - u32 _50; - u32 _54; - u32 _58; - u32 _5C; - u32 _60; - u32 _64; - u32 _68; - u32 _6C; - u32 _70; - u32 _74; - u32 _78; - u32 _7C; - u32 _80; - u32 _84; - u32 _88; - u32 _8C; - u32 _90; - u32 _94; - BOOL mIsStopped; - u32 _9C; - u32 _A0; - u32 _A4; - u32 _A8; - u32 _AC; -} TRKState; - -typedef struct TRKBuffer { - u8 _00[4]; - u32 _04; - s32 _08; - u32 _0C; - u32 _10; - u8 mBuffer[0x87C]; /* _10 */ -} TRKBuffer; -typedef enum { TRKSuccess = 0, TRKError100 = 0x100, TRKError301 = 0x301, TRKError302 = 0x302 } TRKResult; - -extern BOOL gTRKBigEndian; - -u32 TRKDoConnect(TRKBuffer*); -u32 TRKDoDisconnect(TRKBuffer*); -u32 TRKDoReset(TRKBuffer*); -u32 TRKDoVersions(TRKBuffer*); -u32 TRKDoSupportMask(TRKBuffer*); -u32 TRKDoOverride(TRKBuffer*); -u32 TRKDoReadMemory(TRKBuffer*); -u32 TRKDoWriteMemory(TRKBuffer*); -u32 TRKDoReadRegisters(TRKBuffer*); -u32 TRKDoWriteRegisters(TRKBuffer*); -u32 TRKDoSetOption(TRKBuffer*); -u32 TRKDoContinue(TRKBuffer*); -u32 TRKDoStep(TRKBuffer*); -u32 TRKDoStop(TRKBuffer*); - +////// MSG HANDLING FUNCTIONS ////// +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 __TRK_copy_vectors(); + +void SetBufferPosition(TRKBuffer*, u32); +void SetTRKConnected(int); +int GetTRKConnected(void); + +DSError TRKGetFreeBuffer(int*, TRKBuffer**); +void OutputData(void* data, int length); +void TRKResetBuffer(TRKBuffer* msg, u8 keepData); + +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 ////// void InitMetroTRK(void); void InitMetroTRK_BBA(void); void EnableMetroTRKInterrupts(void); -void TRKDestructEvent(TRKEvent*); -TRKResult TRKDispatchMessage(TRKBuffer*); +void TRKLoadContext(OSContext* ctx, u32); +void TRKSaveExtended1Block(); +void TRKRestoreExtended1Block(); +int InitMetroTRKCommTable(int); +void TRK_board_display(char*); +//////////////////////////////////// + +////////// GDEV FUNCTIONS ////////// +int gdev_cc_initialize(void* flagOut, __OSInterruptHandler handler); +int gdev_cc_shutdown(); +int gdev_cc_open(); +int gdev_cc_close(); +int gdev_cc_read(u8* dest, int size); +int gdev_cc_write(const u8* src, int size); +int gdev_cc_pre_continue(); +int gdev_cc_post_stop(); +int gdev_cc_peek(); +int gdev_cc_initinterrupts(); +//////////////////////////////////// + +/////////// UDP FUNCTIONS ////////// +int udp_cc_initialize(void* flagOut, __OSInterruptHandler handler); +int udp_cc_shutdown(); +int udp_cc_open(); +int udp_cc_close(); +int udp_cc_read(u8* dest, int size); +int udp_cc_write(const u8* src, int size); +int udp_cc_pre_continue(); +int udp_cc_post_stop(); +int udp_cc_peek(); +int udp_cc_initinterrupts(); +//////////////////////////////////// + +/////////// DDH FUNCTIONS ////////// +#define DDH_ERR_NOT_INITIALIZED -0x2711 +#define DDH_ERR_ALREADY_INITIALIZED -0x2715 +#define DDH_ERR_READ_ERROR -0x2719 + +int ddh_cc_initialize(void* flagOut, __OSInterruptHandler handler); +int ddh_cc_shutdown(); +int ddh_cc_open(); +int ddh_cc_close(); +int ddh_cc_read(u8* dest, int size); +int ddh_cc_write(const u8* src, int size); +int ddh_cc_pre_continue(); +int ddh_cc_post_stop(); +int ddh_cc_peek(); +int ddh_cc_initinterrupts(); +//////////////////////////////////// + +////////// EVENT FUNCTIONS ///////// +void TRKConstructEvent(TRKEvent* event, int eventType); +void TRKDestructEvent(TRKEvent* event); +DSError TRKPostEvent(TRKEvent* event); +BOOL TRKGetNextEvent(TRKEvent* event); +DSError TRKDispatchMessage(TRKBuffer*); void* TRKGetBuffer(int); void TRKReleaseBuffer(int); void TRKGetInput(); -BOOL TRKGetNextEvent(TRKEvent*); +//////////////////////////////////// -TRKResult TRKTargetContinue(void); -TRKResult TRKTargetInterrupt(TRKEvent*); +///////// TARGET FUNCTIONS ///////// +DSError TRKTargetContinue(void); +DSError TRKTargetInterrupt(TRKEvent*); BOOL TRKTargetStopped(); void TRKTargetSetStopped(uint); -TRKResult TRKTargetSupportRequest(); +DSError TRKTargetSupportRequest(); +//////////////////////////////////// -TRKResult TRKAppendBuffer_ui8(TRKBuffer*, u8*, int); -TRKResult TRKSetBufferPosition(TRKBuffer*, u32); +////// NUB AND MEM FUNCTIONS /////// +DSError TRKAppendBuffer_ui8(TRKBuffer*, const u8*, int); +DSError TRKSetBufferPosition(TRKBuffer*, u32); -TRKResult TRKMessageSend(TRK_Msg*); +DSError TRKMessageSend(TRKBuffer*); void TRKSwapAndGo(void); -TRKResult TRKWriteUARTN(const void* bytes, u32 length); -TRKResult TRKInitializeNub(void); -TRKResult TRKTerminateNub(void); +DSError TRKInitializeNub(void); +DSError TRKTerminateNub(void); void TRKNubWelcome(void); void TRKNubMainLoop(void); -TRKResult TRKInitializeMutex(void*); -TRKResult TRKAcquireMutex(void*); -TRKResult TRKReleaseMutex(void*); +DSError TRKInitializeMutex(void*); +DSError TRKAcquireMutex(void*); +DSError TRKReleaseMutex(void*); void* TRK_memcpy(void* dst, const void* src, size_t n); - -TRKResult TRKInitializeEventQueue(); -TRKResult TRKInitializeMessageBuffers(); -TRKResult TRKInitializeDispatcher(); -TRKResult InitializeProgramEndTrap(); -TRKResult TRKInitializeSerialHandler(); -TRKResult TRKInitializeTarget(); - +//////////////////////////////////// + +/////// INITIALIZE FUNCTIONS /////// +DSError TRKInitializeEventQueue(); +DSError TRKInitializeMessageBuffers(); +DSError TRKInitializeDispatcher(); +DSError InitializeProgramEndTrap(); +DSError TRKInitializeSerialHandler(); +DSError TRKTerminateSerialHandler(); +DSError TRKInitializeTarget(); +//////////////////////////////////// + +////////// EXI2 FUNCTIONS ////////// /* EXI2 */ void UnreserveEXI2Port(void); void ReserveEXI2Port(void); +//////////////////////////////////// -/* MW */ +/////////// MW FUNCTIONS /////////// void MWTRACE(u8, char*, ...); +//////////////////////////////////// -/* UART */ -typedef int UARTError; +//////// SUPPORT FUNCTIONS ///////// +DSError TRKRequestSend(); +u32 TRKAccessFile(u32, u32, u32*, u8*); +//////////////////////////////////// -enum { - kUARTNoError = 0, - kUARTUnknownBaudRate, - kUARTConfigurationError, - kUARTBufferOverflow, /* specified buffer was too small */ - kUARTNoData /* no data available from polling */ -}; - -typedef enum { - kBaudHWSet = -1, /* use HW settings such as DIP switches */ - kBaud300 = 300, /* valid baud rates */ - kBaud600 = 600, - kBaud1200 = 1200, - kBaud1800 = 1800, - kBaud2000 = 2000, - kBaud2400 = 2400, - kBaud3600 = 3600, - kBaud4800 = 4800, - kBaud7200 = 7200, - kBaud9600 = 9600, - kBaud19200 = 19200, - kBaud38400 = 38400, - kBaud57600 = 57600, - kBaud115200 = 115200, - kBaud230400 = 230400 -} UARTBaudRate; +///// SERIAL POLLING FUNCTIONS ///// +TRKBufferID TRKTestForPacker(); +void TRKGetInput(); +void TRKProcessInput(TRKBufferID bufID); +//////////////////////////////////// +////////// OTHER FUNCTIONS ///////// +DSError TRK_main(void); UARTError InitializeUART(UARTBaudRate baudRate); -TRKResult TRKInitializeIntDrivenUART(unknown, unknown, unknown, void*); +DSError TRKInitializeIntDrivenUART(u32, u32, u32, volatile u8**); +int TRKPollUART(); +UARTError TRKReadUARTN(void*, u32); +UARTError TRKWriteUARTN(const void* bytes, u32 length); void usr_put_initialize(); void TRKTargetSetInputPendingPtr(void*); +void SetUseSerialIO(u8); +u8 GetUseSerialIO(void); +u8 TRKTargetCPUMinorType(); + +DSError TRKTargetAddStopInfo(TRKBuffer*); +DSError TRKTargetAddExceptionInfo(TRKBuffer*); +void TRKInterruptHandler(); +BOOL usr_puts_serial(const char* msg); +//////////////////////////////////// + +//////// EXTERNAL DECLARES ///////// +extern BOOL gTRKBigEndian; extern void* gTRKInputPendingPtr; +extern ProcessorState_PPC gTRKCPUState; +extern ProcessorRestoreFlags_PPC gTRKRestoreFlags; +extern u8 gTRKInterruptVectorTable[]; +extern TRKState gTRKState; +extern TRKBuffer gTRKMsgBufs[3]; +//////////////////////////////////// + +////////// USEFUL STATICS ////////// +static inline DSError TRKAppendBuffer1_ui8(TRKBuffer* buffer, const u8 data) +{ + if (buffer->position >= 0x880) { + return DS_MessageBufferOverflow; + } + + buffer->data[buffer->position++] = data; + buffer->length++; + return DS_NoError; +} +//////////////////////////////////// #ifdef __cplusplus }; diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trkenum.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trkenum.h new file mode 100644 index 000000000..6755a48b0 --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trkenum.h @@ -0,0 +1,212 @@ +#ifndef _METROTRK_TRKENUM_H +#define _METROTRK_TRKENUM_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif // ifdef __cplusplus + +//////////// TRK ENUMS ///////////// +// Hardware types. +typedef enum { + HARDWARE_AMC_DDH = 0, + HARDWARE_GDEV = 1, + HARDWARE_BBA = 2, +} HardwareType; + +// DS Error returns. +typedef enum { + DS_NoError = 0x0, + DS_StepError = 0x1, + DS_ParameterError = 0x2, + + DS_EventQueueFull = 0x100, + + DS_NoMessageBufferAvailable = 0x300, + DS_MessageBufferOverflow = 0x301, + DS_MessageBufferReadError = 0x302, + + DS_DispatchError = 0x500, + + DS_InvalidMemory = 0x700, + DS_InvalidRegister = 0x701, + DS_CWDSException = 0x702, + DS_UnsupportedError = 0x703, + DS_InvalidProcessID = 0x704, + DS_InvalidThreadID = 0x705, + DS_OSError = 0x706, + + 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, + DS_Stdout = 1, + DS_Stderr = 2, +} DSFileHandle; + +// IO returns. +typedef enum { + DS_IONoError = 0, + DS_IOError = 1, + DS_IOEOF = 2, +} DSIOResult; + +// Message command IDs +typedef enum { + DSMSG_Ping = 0x0, + DSMSG_Connect = 0x1, + DSMSG_Disconnect = 0x2, + DSMSG_Reset = 0x3, + DSMSG_Versions = 0x4, + DSMSG_SupportMask = 0x5, + DSMSG_Override = 0x7, + + DSMSG_ReadMemory = 0x10, + DSMSG_WriteMemory = 0x11, + DSMSG_ReadRegisters = 0x12, + DSMSG_WriteRegisters = 0x13, + DSMSG_SetOption = 0x17, + DSMSG_Continue = 0x18, + DSMSG_Step = 0x19, + DSMSG_Stop = 0x1A, + + DSMSG_ReplyACK = 0x80, + + DSMSG_NotifyStopped = 0x90, + DSMSG_NotifyException = 0x91, + + DSMSG_WriteFile = 0xD0, + DSMSG_ReadFile = 0xD1, + DSMSG_OpenFile = 0xD2, + DSMSG_CloseFile = 0xD3, + DSMSG_PositionFile = 0xD4, + + DSMSG_ReplyNAK = 0xFF, +} MessageCommandID; + +// Register commands. +typedef enum { + DSREG_Default = 0, + DSREG_FP = 1, + DSREG_Extended1 = 2, + DSREG_Extended2 = 3, +} DSMessageRegisterOptions; + +// Step commands. +typedef enum { + DSSTEP_IntoCount = 0x0, + DSSTEP_IntoRange = 0x1, + DSSTEP_OverCount = 0x10, + DSSTEP_OverRange = 0x11, +} DSMessageStepOptions; + +typedef enum { + DSREPLY_NoError = 0x0, + DSREPLY_Error = 0x1, + DSREPLY_PacketSizeError = 0x2, + DSREPLY_CWDSError = 0x3, + DSREPLY_EscapeError = 0x4, + DSREPLY_BadFCS = 0x5, + DSREPLY_Overflow = 0x6, + DSREPLY_SequenceMissing = 0x7, + + DSREPLY_UnsupportedCommandError = 0x10, + DSREPLY_ParameterError = 0x11, + DSREPLY_UnsupportedOptionError = 0x12, + DSREPLY_InvalidMemoryRange = 0x13, + DSREPLY_InvalidRegisterRange = 0x14, + DSREPLY_CWDSException = 0x15, + DSREPLY_NotStopped = 0x16, + DSREPLY_BreakpointsFull = 0x17, + DSREPLY_BreakpointConflict = 0x18, + + DSREPLY_OSError = 0x20, + DSREPLY_InvalidProcessID = 0x21, + DSREPLY_InvalidThreadID = 0x22, + DSREPLY_DebugSecurityError = 0x23, +} DSReplyError; + +typedef enum { + DSRECV_Wait = 0, + DSRECV_Found = 1, + DSRECV_InFrame = 2, + DSRECV_FrameOverflow = 3, +} ReceiverState; + +typedef enum { + DSMSGMEMORY_Segmented = 0x01, /* non-flat addr space */ + DSMSGMEMORY_Extended = 0x02, /* > 32-bit data addr */ + DSMSGMEMORY_Protected = 0x04, /* non-user memory */ + DSMSGMEMORY_Userview = 0x08, /* breakpoints are invisible */ + DSMSGMEMORY_Space_program = 0x00, + DSMSGMEMORY_Space_data = 0x40, + DSMSGMEMORY_Space_io = 0x80 +}; + +typedef enum { + NUBEVENT_Null = 0, + NUBEVENT_Shutdown = 1, + NUBEVENT_Request = 2, + NUBEVENT_Breakpoint = 3, + NUBEVENT_Exception = 4, + NUBEVENT_Support = 5, +} NubEventType; + +typedef enum { + VALIDMEM_Readable = 0, + VALIDMEM_Writeable = 1, +} ValidMemoryOptions; + +typedef enum { + MEMACCESS_UserMemory = 0, + MEMACCESS_DebuggerMemory = 1, +} MemoryAccessOptions; + +typedef enum { + UART_NoError = 0, + UART_UnknownBaudRate = 1, + UART_ConfigurationError = 2, + UART_BufferOverflow = 3, // specified buffer was too small + UART_NoData = 4, // no data available from polling +} UARTErrorOptions; + +typedef enum { + kBaudHWSet = -1, // use HW settings such as DIP switches + kBaud300 = 300, // valid baud rates + kBaud600 = 600, + kBaud1200 = 1200, + kBaud1800 = 1800, + kBaud2000 = 2000, + kBaud2400 = 2400, + kBaud3600 = 3600, + kBaud4800 = 4800, + kBaud7200 = 7200, + kBaud9600 = 9600, + kBaud19200 = 19200, + kBaud38400 = 38400, + kBaud57600 = 57600, + kBaud115200 = 115200, + kBaud230400 = 230400 +} UARTBaudRate; + +//////////////////////////////////// + +#ifdef __cplusplus +}; +#endif // ifdef __cplusplus + +#endif diff --git a/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trktypes.h b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trktypes.h new file mode 100644 index 000000000..d7f071062 --- /dev/null +++ b/libs/PowerPC_EABI_Support/include/PowerPC_EABI_Support/MetroTRK/trktypes.h @@ -0,0 +1,144 @@ +#ifndef _METROTRK_TRKTYPES_H +#define _METROTRK_TRKTYPES_H + +#include "types.h" +#include "Dolphin/OS/OSInterrupt.h" +#include "PowerPC_EABI_Support/MetroTRK/trkenum.h" + +#ifdef __cplusplus +extern "C" { +#endif // ifdef __cplusplus + +/////// TRK STRUCTS AND TYPES ////// +// Function types for DB communications. +typedef int (*DBCommFunc)(); +typedef void (*DBCommInitFunc)(volatile u8**, __OSInterruptHandler); +typedef int (*DBCommReadFunc)(void*, u32); +typedef int (*DBCommWriteFunc)(const void*, u32); + +// Message buffer ID type. +typedef int TRKBufferID; + +// Nub event ID type. +typedef u32 NubEventID; + +// UART Error type. +typedef int UARTError; + +// Size of message buffer. +#define TRKMSGBUF_SIZE (0x800 + 0x80) + +// Struct for sending and receiving messages (size 0x88C). +typedef struct TRKBuffer { + u32 mutex; // _00 + BOOL isInUse; // _04 + u32 length; // _08 + u32 position; // _0C + u8 data[TRKMSGBUF_SIZE]; // _10 +} TRKBuffer; + +// Struct for storing DB communication functions (size 0x1C). +typedef struct DBCommTable { + DBCommInitFunc initialize_func; // _00 + DBCommFunc init_interrupts_func; // _04 + 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) +typedef struct DSVersions { + u8 kernelMajor; // _00 + u8 kernelMinor; // _01 + u8 protocolMajor; // _02 + u8 protocolMinor; // _03 +} DSVersions; + +// Struct for packet information (size 0x8). +typedef struct TRKPacketSeq { + u16 _00; // _00, unknown + u8 _02[6]; // _02, unknown +} TRKPacketSeq; + +// Struct for receiving packets from serial poll (size 0x14). +typedef struct TRKFramingState { + TRKBufferID msgBufID; // _00 + TRKBuffer* buffer; // _04 + u8 receiveState; // _08 + BOOL isEscape; // _0C + u8 fcsType; // _10 +} TRKFramingState; + +// Command reply information (size 0x40). +typedef struct CommandReply { + u32 _00; // _00 + union { + u8 b; + MessageCommandID m; + } commandID; // _04, use MessageCommandID enum + union { + u8 b; + DSReplyError r; + } replyError; // _08, use DSReplyError enum - should be enum type? check size. + u32 _0C; // _0C + u8 _10[0x30]; // _10, unknown +} CommandReply; + +// Nub event information (size 0xC). +typedef struct TRKEvent { + u8 eventType; // _00 + NubEventID eventID; // _04 + TRKBufferID msgBufID; // _08 +} TRKEvent; + +// Event queue (size 0x28). +typedef struct TRKEventQueue { + u8 _00[4]; // _00, unknown + int count; // _04, number of events in queue + int next; // _08, next event in `events` to handle (0 or 1) + TRKEvent events[2]; // _0C + NubEventID eventID; // _24, ID to assign next event, min 0x100 +} TRKEventQueue; + +// Struct for state information (size 0xB0). +typedef struct TRKState { + u32 gpr[32]; // _00 + u32 lr; // _80 + u32 ctr; // _84 + u32 xer; // _88 + u32 msr; // _8C + u32 dar; // _90 + u32 dsisr; // _94 + BOOL isStopped; // _98 + BOOL inputActivated; // _9C + void* inputPendingPtr; // _A0 +} TRKState; + +typedef struct TRKState_PPC { + u32 GPR[32]; // 0x0 + u32 LR; // 0x80 + u32 CTR; // 0x84 + u32 XER; // 0x88 + u32 MSR; // 0x8c + u32 DAR; // 0x90 + u32 DSISR; // 0x94 + BOOL stopped; // 0x98 + BOOL inputActivated; // 0x9c + u8* inputPendingPtr; // 0xA0 +} TRKState_PPC; + +typedef struct ProcessorRestoreFlags_PPC { + u8 TBR; + u8 DEC; + u8 linker_padding[0x9 - 0x2]; +} ProcessorRestoreFlags_PPC; + +//////////////////////////////////// + +#ifdef __cplusplus +}; +#endif // ifdef __cplusplus + +#endif diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/alloc.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/alloc.c index 016240ad6..e3dae74c4 100644 --- a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/alloc.c +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/alloc.c @@ -1,83 +1,95 @@ #include "PowerPC_EABI_Support/MSL_C/MSL_Common/alloc.h" #include "PowerPC_EABI_Support/MSL_C/MSL_Common/critical_regions.h" -typedef struct Block { - struct Block* prev; - struct Block* next; - unsigned long max_size; - unsigned long size; +typedef struct Block +{ + struct Block* prev; + struct Block* next; + unsigned long max_size; + unsigned long size; } Block; -typedef struct SubBlock { - unsigned long size; - Block* block; - struct SubBlock* prev; - struct SubBlock* next; +typedef struct SubBlock +{ + unsigned long size; + Block* block; + struct SubBlock* prev; + struct SubBlock* next; } SubBlock; struct FixSubBlock; -typedef struct FixBlock { - struct FixBlock* prev_; - struct FixBlock* next_; - unsigned long client_size_; - struct FixSubBlock* start_; - unsigned long n_allocated_; +typedef struct FixBlock +{ + struct FixBlock* prev_; + struct FixBlock* next_; + unsigned long client_size_; + struct FixSubBlock* start_; + unsigned long n_allocated_; } FixBlock; -typedef struct FixSubBlock { - FixBlock* block_; - struct FixSubBlock* next_; +typedef struct FixSubBlock +{ + FixBlock* block_; + struct FixSubBlock* next_; } FixSubBlock; -typedef struct FixStart { - FixBlock* tail_; - FixBlock* head_; +typedef struct FixStart +{ + FixBlock* tail_; + FixBlock* head_; } FixStart; -typedef struct __mem_pool_obj { - Block* start_; - FixStart fix_start[6]; +typedef struct __mem_pool_obj +{ + Block* start_; + FixStart fix_start[6]; } __mem_pool_obj; -typedef struct __mem_pool { - void* reserved[14]; +typedef struct __mem_pool +{ + void* reserved[14]; } __mem_pool; typedef signed long tag_word; -typedef struct block_header { - tag_word tag; - struct block_header* prev; - struct block_header* next; +typedef struct block_header +{ + tag_word tag; + struct block_header* prev; + struct block_header* next; } block_header; -typedef struct list_header { - block_header* rover; - block_header header; +typedef struct list_header +{ + block_header* rover; + block_header header; } list_header; -typedef struct heap_header { - struct heap_header* prev; - struct heap_header* next; +typedef struct heap_header +{ + struct heap_header* prev; + struct heap_header* next; } heap_header; struct mem_pool_obj; typedef void* (*sys_alloc_ptr)(unsigned long, struct mem_pool_obj*); typedef void (*sys_free_ptr)(void*, struct mem_pool_obj*); -typedef struct pool_options { - sys_alloc_ptr sys_alloc_func; - sys_free_ptr sys_free_func; - unsigned long min_heap_size; - int always_search_first; +typedef struct pool_options +{ + sys_alloc_ptr sys_alloc_func; + sys_free_ptr sys_free_func; + unsigned long min_heap_size; + int always_search_first; } pool_options; -typedef struct mem_pool_obj { - list_header free_list; - pool_options options; - heap_header* heap_list; - void* userData; +typedef struct mem_pool_obj +{ + list_header free_list; + pool_options options; + heap_header* heap_list; + void* userData; } mem_pool_obj; @@ -89,364 +101,400 @@ static void SubBlock_merge_next(SubBlock*, SubBlock**); static const unsigned long fix_pool_sizes[] = { 4, 12, 20, 36, 52, 68 }; -#define SubBlock_size(ths) ((ths)->size & 0xFFFFFFF8) +#define SubBlock_size(ths) ((ths)->size & 0xFFFFFFF8) #define SubBlock_block(ths) ((Block*)((unsigned long)((ths)->block) & ~0x1)) -#define Block_size(ths) ((ths)->size & 0xFFFFFFF8) -#define Block_start(ths) (*(SubBlock**)((char*)(ths) + Block_size((ths)) - sizeof(unsigned long))) +#define Block_size(ths) ((ths)->size & 0xFFFFFFF8) +#define Block_start(ths) (*(SubBlock**)((char*)(ths) + Block_size((ths)) - sizeof(unsigned long))) -#define SubBlock_set_free(ths) \ - unsigned long this_size = SubBlock_size((ths)); \ - (ths)->size &= ~0x2; \ - *(unsigned long*)((char*)(ths) + this_size) &= ~0x4; \ - *(unsigned long*)((char*)(ths) + this_size - sizeof(unsigned long)) = this_size +#define SubBlock_set_free(ths) \ + unsigned long this_size = SubBlock_size((ths)); \ + (ths)->size &= ~0x2; \ + *(unsigned long*)((char*)(ths) + this_size) &= ~0x4; \ + *(unsigned long*)((char*)(ths) + this_size - sizeof(unsigned long)) = this_size #define SubBlock_is_free(ths) !((ths)->size & 2) -#define SubBlock_set_size(ths, sz) \ - (ths)->size &= ~0xFFFFFFF8; \ - (ths)->size |= (sz)&0xFFFFFFF8; \ - if (SubBlock_is_free((ths))) \ - *(unsigned long*)((char*)(ths) + (sz) - sizeof(unsigned long)) = (sz) +#define SubBlock_set_size(ths, sz) \ + (ths)->size &= ~0xFFFFFFF8; \ + (ths)->size |= (sz)&0xFFFFFFF8; \ + if (SubBlock_is_free((ths))) \ + *(unsigned long*)((char*)(ths) + (sz) - sizeof(unsigned long)) = (sz) -#define SubBlock_from_pointer(ptr) ((SubBlock*)((char*)(ptr)-8)) +#define SubBlock_from_pointer(ptr) ((SubBlock*)((char*)(ptr)-8)) #define FixSubBlock_from_pointer(ptr) ((FixSubBlock*)((char*)(ptr)-4)) #define FixBlock_client_size(ths) ((ths)->client_size_) -#define FixSubBlock_size(ths) (FixBlock_client_size((ths)->block_)) +#define FixSubBlock_size(ths) (FixBlock_client_size((ths)->block_)) #define classify(ptr) (*(unsigned long*)((char*)(ptr) - sizeof(unsigned long)) & 1) -#define __msize_inline(ptr) \ - (!classify(ptr) ? FixSubBlock_size(FixSubBlock_from_pointer(ptr)) : SubBlock_size(SubBlock_from_pointer(ptr)) - 8) +#define __msize_inline(ptr) \ + (!classify(ptr) ? FixSubBlock_size(FixSubBlock_from_pointer(ptr)) : \ + SubBlock_size(SubBlock_from_pointer(ptr)) - 8) -#define Block_empty(ths) (_sb = (SubBlock*)((char*)(ths) + 16)), SubBlock_is_free(_sb) && SubBlock_size(_sb) == Block_size((ths)) - 24 +#define Block_empty(ths) \ + (_sb = (SubBlock*)((char*)(ths) + 16)), \ + SubBlock_is_free(_sb) && SubBlock_size(_sb) == Block_size((ths)) - 24 void Block_construct(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void Block_subBlock(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void Block_link(Block* ths, SubBlock* sb) { - SubBlock** st; - SubBlock_set_free(sb); - st = &Block_start(ths); - - if (*st != 0) { - sb->prev = (*st)->prev; - sb->prev->next = sb; - sb->next = *st; - (*st)->prev = sb; - *st = sb; - *st = SubBlock_merge_prev(*st, st); - SubBlock_merge_next(*st, st); - } else { - *st = sb; - sb->prev = sb; - sb->next = sb; - } - if (ths->max_size < SubBlock_size(*st)) - ths->max_size = SubBlock_size(*st); + SubBlock** st; + SubBlock_set_free(sb); + st = &Block_start(ths); + + if (*st != 0) + { + sb->prev = (*st)->prev; + sb->prev->next = sb; + sb->next = *st; + (*st)->prev = sb; + *st = sb; + *st = SubBlock_merge_prev(*st, st); + SubBlock_merge_next(*st, st); + } + else + { + *st = sb; + sb->prev = sb; + sb->next = sb; + } + if (ths->max_size < SubBlock_size(*st)) + ths->max_size = SubBlock_size(*st); } void Block_unlink(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void Block_report(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void SubBlock_construct(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void SubBlock_split(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } static SubBlock* SubBlock_merge_prev(SubBlock* ths, SubBlock** start) { - unsigned long prevsz; - SubBlock* p; + unsigned long prevsz; + SubBlock* p; - if (!(ths->size & 0x04)) { - prevsz = *(unsigned long*)((char*)ths - sizeof(unsigned long)); - if (prevsz & 0x2) - return ths; - p = (SubBlock*)((char*)ths - prevsz); - SubBlock_set_size(p, prevsz + SubBlock_size(ths)); + if (!(ths->size & 0x04)) + { + prevsz = *(unsigned long*)((char*)ths - sizeof(unsigned long)); + if (prevsz & 0x2) + return ths; + p = (SubBlock*)((char*)ths - prevsz); + SubBlock_set_size(p, prevsz + SubBlock_size(ths)); - if (*start == ths) - *start = (*start)->next; - ths->next->prev = ths->prev; - ths->next->prev->next = ths->next; - return p; - } - return ths; + if (*start == ths) + *start = (*start)->next; + ths->next->prev = ths->prev; + ths->next->prev->next = ths->next; + return p; + } + return ths; } static void SubBlock_merge_next(SubBlock* pBlock, SubBlock** pStart) { - SubBlock* next_sub_block; - unsigned long this_cur_size; + SubBlock* next_sub_block; + unsigned long this_cur_size; - next_sub_block = (SubBlock*)((char*)pBlock + (pBlock->size & 0xFFFFFFF8)); + next_sub_block = (SubBlock*)((char*)pBlock + (pBlock->size & 0xFFFFFFF8)); - if (!(next_sub_block->size & 2)) { - this_cur_size = (pBlock->size & 0xFFFFFFF8) + (next_sub_block->size & 0xFFFFFFF8); + if (!(next_sub_block->size & 2)) + { + this_cur_size = (pBlock->size & 0xFFFFFFF8) + (next_sub_block->size & 0xFFFFFFF8); - pBlock->size &= ~0xFFFFFFF8; - pBlock->size |= this_cur_size & 0xFFFFFFF8; + pBlock->size &= ~0xFFFFFFF8; + pBlock->size |= this_cur_size & 0xFFFFFFF8; - if (!(pBlock->size & 2)) { - *(unsigned long*)((char*)(pBlock) + (this_cur_size)-4) = (this_cur_size); - } + if (!(pBlock->size & 2)) + { + *(unsigned long*)((char*)(pBlock) + (this_cur_size)-4) = (this_cur_size); + } - if (!(pBlock->size & 2)) { - *(unsigned long*)((char*)pBlock + this_cur_size) &= ~4; - } else { - *(unsigned long*)((char*)pBlock + this_cur_size) |= 4; - } + if (!(pBlock->size & 2)) + { + *(unsigned long*)((char*)pBlock + this_cur_size) &= ~4; + } + else + { + *(unsigned long*)((char*)pBlock + this_cur_size) |= 4; + } - if (*pStart == next_sub_block) { - *pStart = (*pStart)->next; - } + if (*pStart == next_sub_block) + { + *pStart = (*pStart)->next; + } - if (*pStart == next_sub_block) { - *pStart = 0; - } + if (*pStart == next_sub_block) + { + *pStart = 0; + } - next_sub_block->next->prev = next_sub_block->prev; - next_sub_block->prev->next = next_sub_block->next; - } + next_sub_block->next->prev = next_sub_block->prev; + next_sub_block->prev->next = next_sub_block->next; + } } void SubBlock_report(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void link(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } static Block* __unlink(__mem_pool_obj* pool_obj, Block* bp) { - Block* result = bp->next; - if (result == bp) { - result = 0; - } + Block* result = bp->next; + if (result == bp) + { + result = 0; + } - if (pool_obj->start_ == bp) { - pool_obj->start_ = result; - } + if (pool_obj->start_ == bp) + { + pool_obj->start_ = result; + } - if (result != 0) { - result->prev = bp->prev; - result->prev->next = result; - } + if (result != 0) + { + result->prev = bp->prev; + result->prev->next = result; + } - bp->next = 0; - bp->prev = 0; - return result; + bp->next = 0; + bp->prev = 0; + return result; } void link_new_block(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void allocate_from_var_pools(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void soft_allocate_from_var_pools(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } static void deallocate_from_var_pools(__mem_pool_obj* pool_obj, void* ptr) { - SubBlock* sb = SubBlock_from_pointer(ptr); - SubBlock* _sb; + SubBlock* sb = SubBlock_from_pointer(ptr); + SubBlock* _sb; - Block* bp = SubBlock_block(sb); - Block_link(bp, sb); + Block* bp = SubBlock_block(sb); + Block_link(bp, sb); - if (Block_empty(bp)) { - __unlink(pool_obj, bp); - __sys_free(bp); - } + if (Block_empty(bp)) + { + __unlink(pool_obj, bp); + __sys_free(bp); + } } void FixBlock_construct(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } -void __init_pool_obj(__mem_pool* pool_obj) { memset(pool_obj, 0, sizeof(__mem_pool_obj)); } +void __init_pool_obj(__mem_pool* pool_obj) +{ + memset(pool_obj, 0, sizeof(__mem_pool_obj)); +} static __mem_pool* get_malloc_pool(void) { - static __mem_pool protopool; - static unsigned char init = 0; - if (!init) { - __init_pool_obj(&protopool); - init = 1; - } + static __mem_pool protopool; + static unsigned char init = 0; + if (!init) + { + __init_pool_obj(&protopool); + init = 1; + } - return &protopool; + return &protopool; } void allocate_from_fixed_pools(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void deallocate_from_fixed_pools(__mem_pool_obj* pool_obj, void* ptr, unsigned long size) { - unsigned long i = 0; - FixSubBlock* p; - FixBlock* b; - FixStart* fs; - - while (size > fix_pool_sizes[i]) { - ++i; - } - - fs = &pool_obj->fix_start[i]; - p = FixSubBlock_from_pointer(ptr); - b = p->block_; - - if (b->start_ == 0 && fs->head_ != b) { - if (fs->tail_ == b) { - fs->head_ = fs->head_->prev_; - fs->tail_ = fs->tail_->prev_; - } else { - b->prev_->next_ = b->next_; - b->next_->prev_ = b->prev_; - b->next_ = fs->head_; - b->prev_ = b->next_->prev_; - b->prev_->next_ = b; - b->next_->prev_ = b; - fs->head_ = b; - } - } - - p->next_ = b->start_; - b->start_ = p; - - if (--b->n_allocated_ == 0) { - if (fs->head_ == b) { - fs->head_ = b->next_; - } - - if (fs->tail_ == b) { - fs->tail_ = b->prev_; - } - - b->prev_->next_ = b->next_; - b->next_->prev_ = b->prev_; - - if (fs->head_ == b) { - fs->head_ = 0; - } - - if (fs->tail_ == b) { - fs->tail_ = 0; - } - - deallocate_from_var_pools(pool_obj, b); - } + unsigned long i = 0; + FixSubBlock* p; + FixBlock* b; + FixStart* fs; + + while (size > fix_pool_sizes[i]) + { + ++i; + } + + fs = &pool_obj->fix_start[i]; + p = FixSubBlock_from_pointer(ptr); + b = p->block_; + + if (b->start_ == 0 && fs->head_ != b) + { + if (fs->tail_ == b) + { + fs->head_ = fs->head_->prev_; + fs->tail_ = fs->tail_->prev_; + } + else + { + b->prev_->next_ = b->next_; + b->next_->prev_ = b->prev_; + b->next_ = fs->head_; + b->prev_ = b->next_->prev_; + b->prev_->next_ = b; + b->next_->prev_ = b; + fs->head_ = b; + } + } + + p->next_ = b->start_; + b->start_ = p; + + if (--b->n_allocated_ == 0) + { + if (fs->head_ == b) + { + fs->head_ = b->next_; + } + + if (fs->tail_ == b) + { + fs->tail_ = b->prev_; + } + + b->prev_->next_ = b->next_; + b->next_->prev_ = b->prev_; + + if (fs->head_ == b) + { + fs->head_ = 0; + } + + if (fs->tail_ == b) + { + fs->tail_ = 0; + } + + deallocate_from_var_pools(pool_obj, b); + } } void __report_on_pool_heap(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __report_on_heap(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __msize(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __pool_alloc(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __pool_free(__mem_pool* pool, void* ptr) { - __mem_pool_obj* pool_obj; - unsigned long size; + __mem_pool_obj* pool_obj; + unsigned long size; - if (ptr == 0) { - return; - } + if (ptr == 0) + { + return; + } - pool_obj = (__mem_pool_obj*)pool; - size = __msize_inline(ptr); + pool_obj = (__mem_pool_obj*)pool; + size = __msize_inline(ptr); - if (size <= 68) { - deallocate_from_fixed_pools(pool_obj, ptr, size); - } else { - deallocate_from_var_pools(pool_obj, ptr); - } + if (size <= 68) + { + deallocate_from_fixed_pools(pool_obj, ptr, size); + } + else + { + deallocate_from_var_pools(pool_obj, ptr); + } } void __pool_realloc(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __pool_alloc_clear(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void malloc(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void free(void* ptr) { - __begin_critical_region(malloc_pool_access); - __pool_free(get_malloc_pool(), ptr); - __end_critical_region(malloc_pool_access); + __begin_critical_region(malloc_pool_access); + __pool_free(get_malloc_pool(), ptr); + __end_critical_region(malloc_pool_access); } void realloc(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void calloc(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __pool_free_all(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } void __malloc_free_all(void) { - // UNUSED FUNCTION + // UNUSED FUNCTION } \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/ansi_files.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/ansi_files.c index a210e106f..84b3063ef 100644 --- a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/ansi_files.c +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/ansi_files.c @@ -115,40 +115,45 @@ FILE __files[4] = void __close_all() { - FILE* p = &__files[0]; - FILE* plast; + FILE* p = &__files[0]; + FILE* plast; - __begin_critical_region(stdin_access); + __begin_critical_region(stdin_access); - while (p) { - if (p->mMode.file_kind != __closed_file) { - fclose(p); - } + while (p) + { + if (p->mMode.file_kind != __closed_file) + { + fclose(p); + } - plast = p; - p = p->mNextFile; - if (plast->mIsDynamicallyAllocated) - free(plast); - else { - plast->mMode.file_kind = __unavailable_file; - if ((p != NULL) && p->mIsDynamicallyAllocated) - plast->mNextFile = nullptr; - } - } + plast = p; + p = p->mNextFile; + if (plast->mIsDynamicallyAllocated) + free(plast); + else + { + plast->mMode.file_kind = __unavailable_file; + if ((p != NULL) && p->mIsDynamicallyAllocated) + plast->mNextFile = nullptr; + } + } - __end_critical_region(stdin_access); + __end_critical_region(stdin_access); } u32 __flush_all() { - u32 retval = 0; - FILE* __stream; - __stream = &__files[0]; - while (__stream) { - if ((__stream->mMode.file_kind) && (fflush(__stream))) { - retval = -1; - } - __stream = __stream->mNextFile; - }; - return retval; + u32 retval = 0; + FILE* __stream; + __stream = &__files[0]; + while (__stream) + { + if ((__stream->mMode.file_kind) && (fflush(__stream))) + { + retval = -1; + } + __stream = __stream->mNextFile; + }; + return retval; } diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/char_io.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/char_io.c new file mode 100644 index 000000000..a960f8103 --- /dev/null +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common/char_io.c @@ -0,0 +1,115 @@ +#include "PowerPC_EABI_Support/MSL_C/MSL_Common/char_io.h" +#include "PowerPC_EABI_Support/MSL_C/MSL_Common/critical_regions.h" +#include "PowerPC_EABI_Support/MSL_C/MSL_Common/misc_io.h" +#include "PowerPC_EABI_Support/MSL_C/MSL_Common/wchar_io.h" + +// int __put_char(int c, FILE* stream) +// { +// int ret; + +// int file_kind = stream->file_mode.file_kind; +// stream->buffer_length = 0; + +// if (stream->file_state.error != 0 || file_kind == __closed_file) +// { +// return -1; +// } + +// if (file_kind == __console_file) +// { +// __stdio_atexit(); +// } + +// if (stream->file_state.io_state == __neutral && (stream->file_mode.io_mode & __write)) +// { +// if ((stream->file_mode.io_mode & __append) && fseek(stream, 0, 2) != 0) +// { +// return 0; +// } + +// stream->file_state.io_state = __writing; +// __prep_buffer(stream); +// } + +// if (stream->file_state.io_state != __writing) +// { +// stream->file_state.error = 1; +// ret = -1; +// stream->buffer_length = 0; +// } +// else if ((stream->file_mode.buffer_mode == 2 || +// stream->buffer_size == +// (unsigned int)stream->buffer_ptr - (unsigned int)stream->buffer) && +// __flush_buffer(stream, NULL) != 0) +// { +// stream->file_state.error = 1; +// ret = -1; +// stream->buffer_length = 0; +// } +// else +// { +// stream->buffer_length--; +// *stream->buffer_ptr++ = c; + +// if (stream->file_mode.buffer_mode != 2) +// { +// if ((stream->file_mode.buffer_mode == 0 || c == 10) && +// __flush_buffer(stream, NULL) != 0) +// { +// stream->file_state.error = 1; +// ret = -1; +// stream->buffer_length = 0; +// goto exit; +// } +// stream->buffer_length = 0; +// } + +// ret = c & 0xFF; +// } + +// exit: +// return ret; +// } + +// int fputs(const char* s, FILE* stream) +// { +// char c; +// int var_r3; +// unsigned long len; +// int ret = 0; + +// __begin_critical_region(stdin_access); +// while (c = *s++, c != 0) +// { +// if (fwide(stream, -1) >= 0) +// { +// var_r3 = -1; +// } +// else +// { +// len = stream->buffer_length; +// stream->buffer_length = len - 1; + +// if (len != 0) +// { +// char* buf = (char*)stream->buffer_ptr; +// stream->buffer_ptr++; + +// *buf = var_r3 = c & 0xFF; +// } +// else +// { +// var_r3 = __put_char(c, stream); +// } +// } + +// if (var_r3 == -1) +// { +// ret = -1; +// break; +// } +// } +// __end_critical_region(stdin_access); + +// return ret; +// } \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/e_acos.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/e_acos.c new file mode 100644 index 000000000..1bbd7a6e3 --- /dev/null +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/e_acos.c @@ -0,0 +1,105 @@ + +/* @(#)e_acos.c 1.3 95/01/18 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* __ieee754_acos(x) + * Method : + * acos(x) = pi/2 - asin(x) + * acos(-x) = pi/2 + asin(x) + * For |x|<=0.5 + * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c) + * For x>0.5 + * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2))) + * = 2asin(sqrt((1-x)/2)) + * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z) + * = 2f + (2c + 2s*z*R(z)) + * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term + * for f so that f+c ~ sqrt(z). + * For x<-0.5 + * acos(x) = pi - 2asin(sqrt((1-|x|)/2)) + * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z) + * + * Special cases: + * if x is NaN, return x itself; + * if |x|>1, return NaN with invalid signal. + * + * Function needed: sqrt + */ + +#include "math.h" + +#ifdef __STDC__ +static const double +#else +static double +#endif +one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ +pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ +pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ +pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ +pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ +pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ +pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ +pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ +pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ +pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ +qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ +qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ +qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ +qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ + +#ifdef __STDC__ + double __ieee754_acos(double x) +#else + double __ieee754_acos(x) + double x; +#endif +{ + double z,p,q,r,w,s,c,df; + int hx,ix; + hx = __HI(x); + ix = hx&0x7fffffff; + if(ix>=0x3ff00000) { /* |x| >= 1 */ + if(((ix-0x3ff00000)|__LO(x))==0) { /* |x|==1 */ + if(hx>0) return 0.0; /* acos(1) = 0 */ + else return pi+2.0*pio2_lo; /* acos(-1)= pi */ + } + return NAN; /* acos(|x|>1) is NaN */ + } + if(ix<0x3fe00000) { /* |x| < 0.5 */ + if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/ + z = x*x; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + return pio2_hi - (x - (pio2_lo-x*r)); + } else if (hx<0) { /* x < -0.5 */ + z = (one+x)*0.5; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + s = sqrt(z); + r = p/q; + w = r*s-pio2_lo; + return pi - 2.0*(s+w); + } else { /* x > 0.5 */ + z = (one-x)*0.5; + s = sqrt(z); + df = s; + __LO(df) = 0; + c = (z-df*df)/(s+df); + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + w = r*s+c; + return 2.0*(df+w); + } +} \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_acos.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_acos.c new file mode 100644 index 000000000..4a127f1e4 --- /dev/null +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_acos.c @@ -0,0 +1,6 @@ +#include "fdlibm.h" + +double acos(double x) +{ + return __ieee754_acos(x); +} \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c new file mode 100644 index 000000000..aab55a899 --- /dev/null +++ b/libs/PowerPC_EABI_Support/src/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c @@ -0,0 +1,7 @@ + +#include "fdlibm.h" + +double log(double x) +{ + return __ieee754_log(x); +} \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/abort_exit.c b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/abort_exit.c index 634c65d93..4da38d45f 100644 --- a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/abort_exit.c +++ b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/abort_exit.c @@ -16,55 +16,62 @@ static void (*__atexit_funcs[64])(void); void abort(void) { - raise(1); - __aborting = 1; - exit(1); -} + raise(1); + __aborting = 1; + __begin_critical_region(atexit_funcs_access); -void atexit(void) -{ - // UNUSED FUNCTION -} + while (__atexit_curr_func > 0) + __atexit_funcs[--__atexit_curr_func](); -void __atexit(void) -{ - // UNUSED FUNCTION + __end_critical_region(atexit_funcs_access); + __kill_critical_regions(); + + if (__console_exit != NULL) + { + __console_exit(); + __console_exit = NULL; + } + + _ExitProcess(); } void exit(int status) { - int i; - void (**dtor)(void); - - if (!__aborting) { - __begin_critical_region(atexit_funcs_access); - __end_critical_region(atexit_funcs_access); - __destroy_global_chain(); - dtor = _dtors; - while (*dtor != NULL) { - (*dtor)(); - dtor++; - } - if (__stdio_exit != NULL) { - __stdio_exit(); - __stdio_exit = NULL; - } - } - __exit(status); -} + int i; + void (**dtor)(void); -void __exit(int status) -{ - __begin_critical_region(atexit_funcs_access); - while (__atexit_curr_func > 0) - __atexit_funcs[--__atexit_curr_func](); - __end_critical_region(atexit_funcs_access); - __kill_critical_regions(); - if (__console_exit != NULL) - { - - __console_exit(); - __console_exit = NULL; - } - _ExitProcess(); + if (!__aborting) + { + __begin_critical_region(atexit_funcs_access); + __end_critical_region(atexit_funcs_access); + __destroy_global_chain(); + + dtor = _dtors; + while (*dtor != NULL) + { + (*dtor)(); + dtor++; + } + + if (__stdio_exit != NULL) + { + __stdio_exit(); + __stdio_exit = NULL; + } + } + + __begin_critical_region(atexit_funcs_access); + while (__atexit_curr_func > 0) + __atexit_funcs[--__atexit_curr_func](); + + __end_critical_region(atexit_funcs_access); + __kill_critical_regions(); + + if (__console_exit != NULL) + { + __console_exit(); + __console_exit = NULL; + } + + _ExitProcess(); } diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/critical_regions.gamecube.c b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/critical_regions.gamecube.c index 9cbd811b7..a339ca04c 100644 --- a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/critical_regions.gamecube.c +++ b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/critical_regions.gamecube.c @@ -1,10 +1,17 @@ #include "types.h" #include "PowerPC_EABI_Support/MSL_C/MSL_Common/critical_regions.h" -void __init_critical_regions(void) { return; } +void __end_critical_region(int region) +{ + return; +} -void __kill_critical_regions(void) { return; } +void __begin_critical_region(int region) +{ + return; +} -void __begin_critical_region(int region) { return; } - -void __end_critical_region(int region) { return; } +void __kill_critical_regions(void) +{ + return; +} diff --git a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/math_ppc.c b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/math_ppc.c index ae9047d99..d8b2edb5e 100644 --- a/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/math_ppc.c +++ b/libs/PowerPC_EABI_Support/src/MSL_C/PPC_EABI/math_ppc.c @@ -283,7 +283,6 @@ void atan2f(void) // UNUSED FUNCTION }*/ - /*void coshf(void) { // UNUSED FUNCTION diff --git a/libs/PowerPC_EABI_Support/src/Runtime/CPlusLibPPC.cp b/libs/PowerPC_EABI_Support/src/Runtime/CPlusLibPPC.cp index b9efdad8b..05e5f9fb0 100644 --- a/libs/PowerPC_EABI_Support/src/Runtime/CPlusLibPPC.cp +++ b/libs/PowerPC_EABI_Support/src/Runtime/CPlusLibPPC.cp @@ -18,24 +18,6 @@ void* __copy(char *dest, char *src, size_t size) return(dest); } -void __init_arr(void) -{ - // UNUSED FUNCTION -} - -void __new_arr(void) -{ - // UNUSED FUNCTION -} -void __del_arr(void) -{ - // UNUSED FUNCTION -} - -void __dc_arr(void) -{ - // UNUSED FUNCTION -} } diff --git a/libs/PowerPC_EABI_Support/src/Runtime/New.cp b/libs/PowerPC_EABI_Support/src/Runtime/New.cp new file mode 100644 index 000000000..e5e2d5986 --- /dev/null +++ b/libs/PowerPC_EABI_Support/src/Runtime/New.cp @@ -0,0 +1,5 @@ +#include "PowerPC_EABI_Support/Runtime/Gecko_ExceptionPPC.h" +#include "PowerPC_EABI_Support/Runtime/MWCPlusPlusLib.h" +#include "PowerPC_EABI_Support/Runtime/NMWException.h" +#include "PowerPC_EABI_Support/Runtime/__ppc_eabi_linker.h" + diff --git a/libs/PowerPC_EABI_Support/src/Runtime/__mem.c b/libs/PowerPC_EABI_Support/src/Runtime/__mem.c index 51d788a94..a9a4a5a67 100644 --- a/libs/PowerPC_EABI_Support/src/Runtime/__mem.c +++ b/libs/PowerPC_EABI_Support/src/Runtime/__mem.c @@ -1,44 +1,21 @@ #include #include -void *memcpy(void *dst, const void *src, size_t n) +void* memset(void* dst, int c, size_t n) { - u8 *__src; - u8 *__dst; - int i; - - if (src >= dst) - { - __src = ((u8 *)src) - 1; - __dst = ((u8 *)dst) - 1; - i = n + 1; - while (--i) - { - *((u8 *)++__dst) = *((u8 *)++__src); - } - return dst; - } - else - { - __src = ((u8 *)src) + n; - __dst = ((u8 *)dst) + n; - i = n + 1; - while (--i) - { - *((u8 *)--__dst) = *((u8 *)--__src); - } - return dst; - } + __fill_mem(dst, c, n); + return dst; } -void __fill_mem(void *dst, int c, size_t n) + +void __fill_mem(void* dst, int c, size_t n) { - u8 *cdest; - u32 *idest; + u8* cdest; + u32* idest; u32 i; u32 cval; cval = (u8)c; - cdest = (u8 *)dst - 1; + cdest = (u8*)dst - 1; if (n >= 32) { @@ -56,19 +33,19 @@ void __fill_mem(void *dst, int c, size_t n) cval = cval << 24 | cval << 16 | cval << 8 | cval; } - idest = (u32 *)(cdest - 3); + idest = (u32*)(cdest - 3); i = n >> 5; if (i != 0) { do { - idest[1] = cval; // 4 - idest[2] = cval; // 8 - idest[3] = cval; // c - idest[4] = cval; // 10 - idest[5] = cval; // 14 - idest[6] = cval; // 18 - idest[7] = cval; // 1c + idest[1] = cval; // 4 + idest[2] = cval; // 8 + idest[3] = cval; // c + idest[4] = cval; // 10 + idest[5] = cval; // 14 + idest[6] = cval; // 18 + idest[7] = cval; // 1c *(idest += 8) = cval; // 20 } while (--i); } @@ -83,7 +60,7 @@ void __fill_mem(void *dst, int c, size_t n) } while (--i); } - cdest = (u8 *)idest + 3; + cdest = (u8*)idest + 3; n &= 3; } if (n != 0) @@ -95,8 +72,32 @@ void __fill_mem(void *dst, int c, size_t n) } } -void *memset(void *dst, int c, size_t n) +void* memcpy(void* dst, const void* src, size_t n) { - __fill_mem(dst, c, n); - return dst; -} \ No newline at end of file + u8* __src; + u8* __dst; + int i; + + if (src >= dst) + { + __src = ((u8*)src) - 1; + __dst = ((u8*)dst) - 1; + i = n + 1; + while (--i) + { + *((u8*)++__dst) = *((u8*)++__src); + } + return dst; + } + else + { + __src = ((u8*)src) + n; + __dst = ((u8*)dst) + n; + i = n + 1; + while (--i) + { + *((u8*)--__dst) = *((u8*)--__src); + } + return dst; + } +} diff --git a/libs/PowerPC_EABI_Support/src/Runtime/global_destructor_chain.c b/libs/PowerPC_EABI_Support/src/Runtime/global_destructor_chain.c index c017fde19..b09b0fa2a 100644 --- a/libs/PowerPC_EABI_Support/src/Runtime/global_destructor_chain.c +++ b/libs/PowerPC_EABI_Support/src/Runtime/global_destructor_chain.c @@ -1,32 +1,18 @@ #include "PowerPC_EABI_Support/Runtime/global_destructor_chain.h" #include "PowerPC_EABI_Support/Runtime/MWCPlusPlusLib.h" -DestructorChain *__global_destructor_chain; - -void *__register_global_object(void *object, void *destructor, void *regmem) -{ - ((DestructorChain *)regmem)->next = __global_destructor_chain; - ((DestructorChain *)regmem)->destructor = destructor; - ((DestructorChain *)regmem)->object = object; - __global_destructor_chain = (DestructorChain *)regmem; - - return object; -} +DestructorChain* __global_destructor_chain; void __destroy_global_chain(void) { - DestructorChain *iter; + DestructorChain* iter; - while ((iter = __global_destructor_chain) != 0) - { - __global_destructor_chain = iter->next; - DTORCALL_COMPLETE(iter->destructor, iter->object); - } -} - -// unused -int __register_atexit(void (*func)(void)) -{ + while ((iter = __global_destructor_chain) != 0) + { + __global_destructor_chain = iter->next; + DTORCALL_COMPLETE(iter->destructor, iter->object); + } } -__declspec(section ".dtors") static void *const __destroy_global_chain_reference = __destroy_global_chain; +__declspec(section + ".dtors") static void* const __destroy_global_chain_reference = __destroy_global_chain; diff --git a/libs/PowerPC_EABI_Support/src/Runtime/runtime.c b/libs/PowerPC_EABI_Support/src/Runtime/runtime.c index 68cb136c6..94da236b7 100644 --- a/libs/PowerPC_EABI_Support/src/Runtime/runtime.c +++ b/libs/PowerPC_EABI_Support/src/Runtime/runtime.c @@ -147,188 +147,275 @@ static const unsigned long __constants[] = { asm unsigned long __cvt_fp2unsigned(register double d) { - nofralloc stwu r1, -16(r1)lis r4, __constants @h ori r4, r4, __constants @l li r3, 0 lfd fp0, - 0(r4)lfd fp3, 8(r4)lfd fp4, 16(r4)fcmpu cr0, fp1, fp0 fcmpu cr6, fp1, fp3 blt cr0, - @exit addi r3, r3, -1 bge cr6, @exit fcmpu cr7, fp1, fp4 fmr fp2, fp1 blt cr7, @1 fsub fp2, - fp1, fp4 @1 fctiwz fp2, fp2 stfd fp2, 8(r1)lwz r3, 12(r1)blt cr7, @exit addis r3, r3, - -0x8000 @exit : addi r1, r1, 16 blr + nofralloc; + stwu r1, -16(r1); + lis r4, __constants @h; + ori r4, r4, __constants @l; + li r3, 0; + lfd fp0, 0(r4); + lfd fp3, 8(r4); + lfd fp4, 16(r4); + fcmpu cr0, fp1, fp0; + fcmpu cr6, fp1, fp3; + blt cr0, @exit; + addi r3, r3, -1; + bge cr6, @exit; + fcmpu cr7, fp1, fp4; + fmr fp2, fp1; + blt cr7, @1; + fsub fp2, fp1, fp4; + @1; + fctiwz fp2, fp2; + stfd fp2, 8(r1); + lwz r3, 12(r1); + blt cr7, @exit; + addis r3, r3, -0x8000; + @exit:; + addi r1, r1, 16; + blr } static asm void __save_fpr(void) { - nofralloc ENTRY_SAVE_FPR(14) ENTRY_SAVE_FPR2(14) stfd fp14, - -144(save_restore_reg)ENTRY_SAVE_FPR(15) ENTRY_SAVE_FPR2(15) stfd fp15, - -136(save_restore_reg)ENTRY_SAVE_FPR(16) ENTRY_SAVE_FPR2(16) stfd fp16, - -128(save_restore_reg)ENTRY_SAVE_FPR(17) ENTRY_SAVE_FPR2(17) stfd fp17, - -120(save_restore_reg)ENTRY_SAVE_FPR(18) ENTRY_SAVE_FPR2(18) stfd fp18, - -112(save_restore_reg)ENTRY_SAVE_FPR(19) ENTRY_SAVE_FPR2(19) stfd fp19, - -104(save_restore_reg)ENTRY_SAVE_FPR(20) ENTRY_SAVE_FPR2(20) stfd fp20, - -96(save_restore_reg)ENTRY_SAVE_FPR(21) ENTRY_SAVE_FPR2(21) stfd fp21, - -88(save_restore_reg)ENTRY_SAVE_FPR(22) ENTRY_SAVE_FPR2(22) stfd fp22, - -80(save_restore_reg)ENTRY_SAVE_FPR(23) ENTRY_SAVE_FPR2(23) stfd fp23, - -72(save_restore_reg)ENTRY_SAVE_FPR(24) ENTRY_SAVE_FPR2(24) stfd fp24, - -64(save_restore_reg)ENTRY_SAVE_FPR(25) ENTRY_SAVE_FPR2(25) stfd fp25, - -56(save_restore_reg)ENTRY_SAVE_FPR(26) ENTRY_SAVE_FPR2(26) stfd fp26, - -48(save_restore_reg)ENTRY_SAVE_FPR(27) ENTRY_SAVE_FPR2(27) stfd fp27, - -40(save_restore_reg)ENTRY_SAVE_FPR(28) ENTRY_SAVE_FPR2(28) stfd fp28, - -32(save_restore_reg)ENTRY_SAVE_FPR(29) ENTRY_SAVE_FPR2(29) stfd fp29, - -24(save_restore_reg)ENTRY_SAVE_FPR(30) ENTRY_SAVE_FPR2(30) stfd fp30, - -16(save_restore_reg)ENTRY_SAVE_FPR(31) ENTRY_SAVE_FPR2(31) stfd fp31, - -8(save_restore_reg)blr + nofralloc; + ENTRY_SAVE_FPR(14) + ENTRY_SAVE_FPR2(14) + stfd fp14, -144(save_restore_reg); + ENTRY_SAVE_FPR(15) + ENTRY_SAVE_FPR2(15) + stfd fp15, -136(save_restore_reg); + ENTRY_SAVE_FPR(16); + ENTRY_SAVE_FPR2(16) stfd fp16, -128(save_restore_reg); + ENTRY_SAVE_FPR(17); + ENTRY_SAVE_FPR2(17) stfd fp17, -120(save_restore_reg); + ENTRY_SAVE_FPR(18); + ENTRY_SAVE_FPR2(18) stfd fp18, -112(save_restore_reg); + ENTRY_SAVE_FPR(19); + ENTRY_SAVE_FPR2(19) stfd fp19, -104(save_restore_reg); + ENTRY_SAVE_FPR(20); + ENTRY_SAVE_FPR2(20) stfd fp20, -96(save_restore_reg); + ENTRY_SAVE_FPR(21); + ENTRY_SAVE_FPR2(21) stfd fp21, -88(save_restore_reg); + ENTRY_SAVE_FPR(22); + ENTRY_SAVE_FPR2(22) stfd fp22, -80(save_restore_reg); + ENTRY_SAVE_FPR(23); + ENTRY_SAVE_FPR2(23) stfd fp23, -72(save_restore_reg); + ENTRY_SAVE_FPR(24); + ENTRY_SAVE_FPR2(24) stfd fp24, -64(save_restore_reg); + ENTRY_SAVE_FPR(25); + ENTRY_SAVE_FPR2(25) stfd fp25, -56(save_restore_reg); + ENTRY_SAVE_FPR(26); + ENTRY_SAVE_FPR2(26) stfd fp26, -48(save_restore_reg); + ENTRY_SAVE_FPR(27); + ENTRY_SAVE_FPR2(27) stfd fp27, -40(save_restore_reg); + ENTRY_SAVE_FPR(28); + ENTRY_SAVE_FPR2(28) stfd fp28, -32(save_restore_reg); + ENTRY_SAVE_FPR(29); + ENTRY_SAVE_FPR2(29) stfd fp29, -24(save_restore_reg); + ENTRY_SAVE_FPR(30); + ENTRY_SAVE_FPR2(30) stfd fp30, -16(save_restore_reg); + ENTRY_SAVE_FPR(31); + ENTRY_SAVE_FPR2(31) stfd fp31, -8(save_restore_reg); + blr } static asm void __restore_fpr(void) { - nofralloc ENTRY_RESTORE_FPR(14) ENTRY_RESTORE_FPR2(14) lfd fp14, - -144(save_restore_reg)ENTRY_RESTORE_FPR(15) ENTRY_RESTORE_FPR2(15) lfd fp15, - -136(save_restore_reg)ENTRY_RESTORE_FPR(16) ENTRY_RESTORE_FPR2(16) lfd fp16, - -128(save_restore_reg)ENTRY_RESTORE_FPR(17) ENTRY_RESTORE_FPR2(17) lfd fp17, - -120(save_restore_reg)ENTRY_RESTORE_FPR(18) ENTRY_RESTORE_FPR2(18) lfd fp18, - -112(save_restore_reg)ENTRY_RESTORE_FPR(19) ENTRY_RESTORE_FPR2(19) lfd fp19, - -104(save_restore_reg)ENTRY_RESTORE_FPR(20) ENTRY_RESTORE_FPR2(20) lfd fp20, - -96(save_restore_reg)ENTRY_RESTORE_FPR(21) ENTRY_RESTORE_FPR2(21) lfd fp21, - -88(save_restore_reg)ENTRY_RESTORE_FPR(22) ENTRY_RESTORE_FPR2(22) lfd fp22, - -80(save_restore_reg)ENTRY_RESTORE_FPR(23) ENTRY_RESTORE_FPR2(23) lfd fp23, - -72(save_restore_reg)ENTRY_RESTORE_FPR(24) ENTRY_RESTORE_FPR2(24) lfd fp24, - -64(save_restore_reg)ENTRY_RESTORE_FPR(25) ENTRY_RESTORE_FPR2(25) lfd fp25, - -56(save_restore_reg)ENTRY_RESTORE_FPR(26) ENTRY_RESTORE_FPR2(26) lfd fp26, - -48(save_restore_reg)ENTRY_RESTORE_FPR(27) ENTRY_RESTORE_FPR2(27) lfd fp27, - -40(save_restore_reg)ENTRY_RESTORE_FPR(28) ENTRY_RESTORE_FPR2(28) lfd fp28, - -32(save_restore_reg)ENTRY_RESTORE_FPR(29) ENTRY_RESTORE_FPR2(29) lfd fp29, - -24(save_restore_reg)ENTRY_RESTORE_FPR(30) ENTRY_RESTORE_FPR2(30) lfd fp30, - -16(save_restore_reg)ENTRY_RESTORE_FPR(31) ENTRY_RESTORE_FPR2(31) lfd fp31, - -8(save_restore_reg)blr + nofralloc; + ENTRY_RESTORE_FPR(14); + ENTRY_RESTORE_FPR2(14) lfd fp14, -144(save_restore_reg); + ENTRY_RESTORE_FPR(15); + ENTRY_RESTORE_FPR2(15) lfd fp15, -136(save_restore_reg); + ENTRY_RESTORE_FPR(16); + ENTRY_RESTORE_FPR2(16) lfd fp16, -128(save_restore_reg); + ENTRY_RESTORE_FPR(17); + ENTRY_RESTORE_FPR2(17) lfd fp17, -120(save_restore_reg); + ENTRY_RESTORE_FPR(18); + ENTRY_RESTORE_FPR2(18) lfd fp18, -112(save_restore_reg); + ENTRY_RESTORE_FPR(19); + ENTRY_RESTORE_FPR2(19) lfd fp19, -104(save_restore_reg); + ENTRY_RESTORE_FPR(20); + ENTRY_RESTORE_FPR2(20) lfd fp20, -96(save_restore_reg); + ENTRY_RESTORE_FPR(21); + ENTRY_RESTORE_FPR2(21) lfd fp21, -88(save_restore_reg); + ENTRY_RESTORE_FPR(22); + ENTRY_RESTORE_FPR2(22) lfd fp22, -80(save_restore_reg); + ENTRY_RESTORE_FPR(23); + ENTRY_RESTORE_FPR2(23) lfd fp23, -72(save_restore_reg); + ENTRY_RESTORE_FPR(24); + ENTRY_RESTORE_FPR2(24) lfd fp24, -64(save_restore_reg); + ENTRY_RESTORE_FPR(25); + ENTRY_RESTORE_FPR2(25) lfd fp25, -56(save_restore_reg); + ENTRY_RESTORE_FPR(26); + ENTRY_RESTORE_FPR2(26) lfd fp26, -48(save_restore_reg); + ENTRY_RESTORE_FPR(27); + ENTRY_RESTORE_FPR2(27) lfd fp27, -40(save_restore_reg); + ENTRY_RESTORE_FPR(28); + ENTRY_RESTORE_FPR2(28) lfd fp28, -32(save_restore_reg); + ENTRY_RESTORE_FPR(29); + ENTRY_RESTORE_FPR2(29) lfd fp29, -24(save_restore_reg); + ENTRY_RESTORE_FPR(30); + ENTRY_RESTORE_FPR2(30) lfd fp30, -16(save_restore_reg); + ENTRY_RESTORE_FPR(31); + ENTRY_RESTORE_FPR2(31) lfd fp31, -8(save_restore_reg); + blr } static asm void __save_gpr(void) { - nofralloc ENTRY_SAVE_GPR(14) stw r14, -72(save_restore_reg)ENTRY_SAVE_GPR(15) stw r15, - -68(save_restore_reg)ENTRY_SAVE_GPR(16) stw r16, - -64(save_restore_reg)ENTRY_SAVE_GPR(17) stw r17, - -60(save_restore_reg)ENTRY_SAVE_GPR(18) stw r18, - -56(save_restore_reg)ENTRY_SAVE_GPR(19) stw r19, - -52(save_restore_reg)ENTRY_SAVE_GPR(20) stw r20, - -48(save_restore_reg)ENTRY_SAVE_GPR(21) stw r21, - -44(save_restore_reg)ENTRY_SAVE_GPR(22) stw r22, - -40(save_restore_reg)ENTRY_SAVE_GPR(23) stw r23, - -36(save_restore_reg)ENTRY_SAVE_GPR(24) stw r24, - -32(save_restore_reg)ENTRY_SAVE_GPR(25) stw r25, - -28(save_restore_reg)ENTRY_SAVE_GPR(26) stw r26, - -24(save_restore_reg)ENTRY_SAVE_GPR(27) stw r27, - -20(save_restore_reg)ENTRY_SAVE_GPR(28) stw r28, - -16(save_restore_reg)ENTRY_SAVE_GPR(29) stw r29, - -12(save_restore_reg)ENTRY_SAVE_GPR(30) stw r30, - -8(save_restore_reg)ENTRY_SAVE_GPR(31) stw r31, -4(save_restore_reg)blr + nofralloc; + ENTRY_SAVE_GPR(14); + stw r14, -72(save_restore_reg); + ENTRY_SAVE_GPR(15); + stw r15, -68(save_restore_reg); + ENTRY_SAVE_GPR(16); + stw r16, -64(save_restore_reg); + ENTRY_SAVE_GPR(17); + stw r17, -60(save_restore_reg); + ENTRY_SAVE_GPR(18); + stw r18, -56(save_restore_reg); + ENTRY_SAVE_GPR(19); + stw r19, -52(save_restore_reg); + ENTRY_SAVE_GPR(20); + stw r20, -48(save_restore_reg); + ENTRY_SAVE_GPR(21); + stw r21, -44(save_restore_reg); + ENTRY_SAVE_GPR(22); + stw r22, -40(save_restore_reg); + ENTRY_SAVE_GPR(23); + stw r23, -36(save_restore_reg); + ENTRY_SAVE_GPR(24); + stw r24, -32(save_restore_reg); + ENTRY_SAVE_GPR(25); + stw r25, -28(save_restore_reg); + ENTRY_SAVE_GPR(26); + stw r26, -24(save_restore_reg); + ENTRY_SAVE_GPR(27); + stw r27, -20(save_restore_reg); + ENTRY_SAVE_GPR(28); + stw r28, -16(save_restore_reg); + ENTRY_SAVE_GPR(29); + stw r29, -12(save_restore_reg); + ENTRY_SAVE_GPR(30); + stw r30, -8(save_restore_reg); + ENTRY_SAVE_GPR(31); + stw r31, -4(save_restore_reg); + blr } static asm void __restore_gpr(void) { - nofralloc ENTRY_RESTORE_GPR(14) lwz r14, -72(save_restore_reg)ENTRY_RESTORE_GPR(15) lwz r15, - -68(save_restore_reg)ENTRY_RESTORE_GPR(16) lwz r16, - -64(save_restore_reg)ENTRY_RESTORE_GPR(17) lwz r17, - -60(save_restore_reg)ENTRY_RESTORE_GPR(18) lwz r18, - -56(save_restore_reg)ENTRY_RESTORE_GPR(19) lwz r19, - -52(save_restore_reg)ENTRY_RESTORE_GPR(20) lwz r20, - -48(save_restore_reg)ENTRY_RESTORE_GPR(21) lwz r21, - -44(save_restore_reg)ENTRY_RESTORE_GPR(22) lwz r22, - -40(save_restore_reg)ENTRY_RESTORE_GPR(23) lwz r23, - -36(save_restore_reg)ENTRY_RESTORE_GPR(24) lwz r24, - -32(save_restore_reg)ENTRY_RESTORE_GPR(25) lwz r25, - -28(save_restore_reg)ENTRY_RESTORE_GPR(26) lwz r26, - -24(save_restore_reg)ENTRY_RESTORE_GPR(27) lwz r27, - -20(save_restore_reg)ENTRY_RESTORE_GPR(28) lwz r28, - -16(save_restore_reg)ENTRY_RESTORE_GPR(29) lwz r29, - -12(save_restore_reg)ENTRY_RESTORE_GPR(30) lwz r30, - -8(save_restore_reg)ENTRY_RESTORE_GPR(31) lwz r31, -4(save_restore_reg)blr + nofralloc; + ENTRY_RESTORE_GPR(14); + lwz r14, -72(save_restore_reg); + ENTRY_RESTORE_GPR(15); + lwz r15, -68(save_restore_reg); + ENTRY_RESTORE_GPR(16); + lwz r16, -64(save_restore_reg); + ENTRY_RESTORE_GPR(17); + lwz r17, -60(save_restore_reg); + ENTRY_RESTORE_GPR(18); + lwz r18, -56(save_restore_reg); + ENTRY_RESTORE_GPR(19); + lwz r19, -52(save_restore_reg); + ENTRY_RESTORE_GPR(20); + lwz r20, -48(save_restore_reg); + ENTRY_RESTORE_GPR(21); + lwz r21, -44(save_restore_reg); + ENTRY_RESTORE_GPR(22); + lwz r22, -40(save_restore_reg); + ENTRY_RESTORE_GPR(23); + lwz r23, -36(save_restore_reg); + ENTRY_RESTORE_GPR(24); + lwz r24, -32(save_restore_reg); + ENTRY_RESTORE_GPR(25); + lwz r25, -28(save_restore_reg); + ENTRY_RESTORE_GPR(26); + lwz r26, -24(save_restore_reg); + ENTRY_RESTORE_GPR(27); + lwz r27, -20(save_restore_reg); + ENTRY_RESTORE_GPR(28); + lwz r28, -16(save_restore_reg); + ENTRY_RESTORE_GPR(29); + lwz r29, -12(save_restore_reg); + ENTRY_RESTORE_GPR(30); + lwz r30, -8(save_restore_reg); + ENTRY_RESTORE_GPR(31); + lwz r31, -4(save_restore_reg); + blr } asm void __div2u(void) { - nofralloc cmpwi cr0, r3, 0 cntlzw r0, r3 cntlzw r9, r4 bne cr0, lab1 addi r0, r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 - : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 adde r4, - r4, - r4 adde r3, - r3, - r3 blr lab9 : li r4, - 0 li r3, - 0 blr + nofralloc; + cmpwi cr0, r3, 0; + cntlzw r0, r3; + cntlzw r9, r4; + bne cr0, lab1; + addi r0, r9, 32; +lab1:; + cmpwi cr0, r5, 0; + cntlzw r9, r5; + cntlzw r10, r6; + bne cr0, lab2; + addi r9, r10, 32; +lab2:; + cmpw cr0, r0, r9; + subfic r10, r0, 64; + bgt cr0, lab9; + addi r9, r9, 1; + subfic r9, r9, 64; + add r0, r0, r9; + subf r9, r9, r10; + mtctr r9; + cmpwi cr0, r9, 32; + addi r7, r9, -32; + blt cr0, lab3; + srw r8, r3, r7; + li r7, 0; + b lab4; +lab3:; + srw r8, r4, r9; + subfic r7, r9, 32; + slw r7, r3, r7; + or r8, r8, r7; + srw r7, r3, r9; +lab4:; + cmpwi cr0, r0, 32; + addic r9, r0, -32; + blt cr0, lab5; + slw r3, r4, r9; + li r4, 0; + b lab6; +lab5:; + slw r3, r3, r0; + subfic r9, r0, 32; + srw r9, r4, r9; + or r3, r3, r9; + slw r4, r4, r0; +lab6:; + li r10, -1; + addic r7, r7, 0; +lab7: + adde r4, r4, r4; + adde r3, r3, r3; + adde r8, r8, r8; + adde r7, r7, r7; + subfc r0, r6, r8; + subfe.r9, r5, r7; + blt cr0, lab8; + mr r8, r0; + mr r7, r9; + addic r0, r10, 1; +lab8:; + bdnz lab7; + adde r4, r4, r4; + adde r3, r3, r3; + blr; +lab9:; + li r4, 0; + li r3, 0; + blr } #pragma push @@ -336,123 +423,98 @@ asm void __div2u(void) #pragma optimizewithasm off asm void __div2i(void) { - nofralloc stwu r1, -16(r1)rlwinm.r9, r3, 0, 0, 0 beq cr0, positive1 subfic r4, r4, 0 subfze r3, - r3 positive1 : stw r9, - 8(r1)rlwinm.r10, - r5, - 0, - 0, - 0 beq cr0, - positive2 subfic r6, - r6, - 0 subfze r5, - r5 positive2 : stw r10, - 12(r1)cmpwi cr0, - r3, - 0 cntlzw r0, - r3 cntlzw r9, - r4 bne cr0, - lab1 addi r0, - r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 - : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 adde r4, - r4, - r4 adde r3, - r3, - r3 lwz r9, - 8(r1)lwz r10, - 12(r1) xor.r7, - r9, - r10 beq func_end cmpwi cr0, - r9, - 0 subfic r4, - r4, - 0 subfze r3, - r3 - - no_adjust : b func_end - - lab9 : li r4, - 0 li r3, - 0 func_end : addi r1, - r1, - 16 blr + nofralloc; + stwu r1, -16(r1); + rlwinm.r9, r3, 0, 0, 0; + beq cr0, positive1; + subfic r4, r4, 0; + subfze r3, r3; +positive1:; + stw r9, 8(r1); + rlwinm.r10, r5, 0, 0, 0; + beq cr0, positive2; + subfic r6, r6, 0; + subfze r5, r5; +positive2:; + stw r10, 12(r1); + cmpwi cr0, r3, 0; + cntlzw r0, r3; + cntlzw r9, r4; + bne cr0, lab1; + addi r0, r9, 32; +lab1:; + cmpwi cr0, r5, 0; + cntlzw r9, r5; + cntlzw r10, r6; + bne cr0, lab2; + addi r9, r10, 32; +lab2:; + cmpw cr0, r0, r9; + subfic r10, r0, 64; + bgt cr0, lab9; + addi r9, r9, 1; + subfic r9, r9, 64; + add r0, r0, r9; + subf r9, r9, r10; + mtctr r9; + cmpwi cr0, r9, 32; + addi r7, r9, -32; + blt cr0, lab3; + srw r8, r3, r7; + li r7, 0; + b lab4; +lab3:; + srw r8, r4, r9; + subfic r7, r9, 32; + slw r7, r3, r7; + or r8, r8, r7; + srw r7, r3, r9; +lab4:; + cmpwi cr0, r0, 32; + addic r9, r0, -32; + blt cr0, lab5; + slw r3, r4, r9; + li r4, 0; + b lab6; +lab5:; + slw r3, r3, r0; + subfic r9, r0, 32; + srw r9, r4, r9; + or r3, r3, r9; + slw r4, r4, r0; +lab6:; + li r10, -1; + addic r7, r7, 0; +lab7:; + adde r4, r4, r4; + adde r3, r3, r3; + adde r8, r8, r8; + adde r7, r7, r7; + subfc r0, r6, r8; + subfe.r9, r5, r7; + blt cr0, lab8; + mr r8, r0; + mr r7, r9; + addic r0, r10, 1; +lab8:; + bdnz lab7; + adde r4, r4, r4; + adde r3, r3, r3; + lwz r9, 8(r1); + lwz r10, 12(r1); + xor.r7, r9, r10; + beq func_end; + cmpwi cr0, r9, 0; + subfic r4, r4, 0; + subfze r3, r3; +no_adjust: + b func_end; +lab9:; + li r4, 0; + li r3, 0; +func_end:; + addi r1, r1, 16; + blr } #pragma pop @@ -461,86 +523,73 @@ asm void __div2i(void) #pragma optimizewithasm off asm void __mod2u(void) { - nofralloc cmpwi cr0, r3, 0 cntlzw r0, r3 cntlzw r9, r4 bne cr0, lab1 addi r0, r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgtlr cr0 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 - : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 mr r4, - r8 mr r3, - r7 blr lab9 : blr + nofralloc; + cmpwi cr0, r3, 0; + cntlzw r0, r3; + cntlzw r9, r4; + bne cr0, lab1; + addi r0, r9, 32; +lab1:; + cmpwi cr0, r5, 0; + cntlzw r9, r5; + cntlzw r10, r6; + bne cr0, lab2; + addi r9, r10, 32; +lab2:; + cmpw cr0, r0, r9; + subfic r10, r0, 64; + bgtlr cr0; + addi r9, r9, 1; + subfic r9, r9, 64; + add r0, r0, r9; + subf r9, r9, r10; + mtctr r9; + cmpwi cr0, r9, 32; + addi r7, r9, -32; + blt cr0, lab3; + srw r8, r3, r7; + li r7, 0; + b lab4; +lab3:; + srw r8, r4, r9; + subfic r7, r9, 32; + slw r7, r3, r7; + or r8, r8, r7; + srw r7, r3, r9; +lab4:; + cmpwi cr0, r0, 32; + addic r9, r0, -32; + blt cr0, lab5; + slw r3, r4, r9; + li r4, 0; + b lab6; +lab5:; + slw r3, r3, r0; + subfic r9, r0, 32; + srw r9, r4, r9; + or r3, r3, r9; + slw r4, r4, r0; +lab6:; + li r10, -1; + addic r7, r7, 0; +lab7:; + adde r4, r4, r4; + adde r3, r3, r3; + adde r8, r8, r8; + adde r7, r7, r7; + subfc r0, r6, r8; + subfe.r9, r5, r7; + blt cr0, lab8; + mr r8, r0; + mr r7, r9; + addic r0, r10, 1; +lab8:; + bdnz lab7; + mr r4, r8; + mr r3, r7; + blr; +lab9:; + blr } #pragma pop @@ -551,124 +600,131 @@ asm void __mod2i(void) { nofralloc - cmpwi cr7, - r3, 0 bge cr7, positive1 subfic r4, r4, 0 subfze r3, - r3 positive1 : cmpwi cr0, - r5, - 0 bge cr0, - positive2 subfic r6, - r6, - 0 subfze r5, - r5 positive2 : cmpwi cr0, - r3, - 0 cntlzw r0, - r3 cntlzw r9, - r4 bne cr0, - lab1 addi r0, - r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 - : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 mr r4, - r8 mr r3, - r7 lab9 : bgelr cr7 subfic r4, - r4, - 0 subfze r3, - r3 no_adjust : blr + ; + cmpwi cr7, r3, 0; + bge cr7, positive1; + subfic r4, r4, 0; + subfze r3, r3; +positive1:; + cmpwi cr0, r5, 0; + bge cr0, positive2; + subfic r6, r6, 0; + subfze r5, r5; +positive2:; + cmpwi cr0, r3, 0; + cntlzw r0, r3; + cntlzw r9, r4; + bne cr0, lab1; + addi r0, r9, 32; +lab1:; + cmpwi cr0, r5, 0; + cntlzw r9, r5; + cntlzw r10, r6; + bne cr0, lab2; + addi r9, r10, 32; +lab2:; + cmpw cr0, r0, r9; + subfic r10, r0, 64; + bgt cr0, lab9; + addi r9, r9, 1; + subfic r9, r9, 64; + add r0, r0, r9; + subf r9, r9, r10; + mtctr r9; + cmpwi cr0, r9, 32; + addi r7, r9, -32; + blt cr0, lab3; + srw r8, r3, r7; + li r7, 0; + b lab4; +lab3:; + srw r8, r4, r9; + subfic r7, r9, 32; + slw r7, r3, r7; + or r8, r8, r7; + srw r7, r3, r9; +lab4:; + cmpwi cr0, r0, 32; + addic r9, r0, -32; + blt cr0, lab5; + slw r3, r4, r9; + li r4, 0; + b lab6; +lab5:; + slw r3, r3, r0; + subfic r9, r0, 32; + srw r9, r4, r9; + or r3, r3, r9; + slw r4, r4, r0; +lab6:; + li r10, -1; + addic r7, r7, 0; +lab7:; + adde r4, r4, r4; + adde r3, r3, r3; + adde r8, r8, r8; + adde r7, r7, r7; + subfc r0, r6, r8; + subfe.r9, r5, r7; + blt cr0, lab8; + mr r8, r0; + mr r7, r9; + addic r0, r10, 1; +lab8:; + bdnz lab7; + mr r4, r8; + mr r3, r7; +lab9:; + bgelr cr7; + subfic r4, r4, 0; + subfze r3, r3; +no_adjust:; + blr } #pragma pop asm void __shl2i(void) { - nofralloc subfic r8, r5, 32 subic r9, r5, 32 slw r3, r3, r5 srw r10, r4, r8 or r3, r3, - r10 slw r10, r4, r9 or r3, r3, r10 slw r4, r4, r5 blr + nofralloc; + subfic r8, r5, 32; + subic r9, r5, 32; + slw r3, r3, r5; + srw r10, r4, r8; + or r3, r3, r10; + slw r10, r4, r9; + or r3, r3, r10; + slw r4, r4, r5; + blr } //unused asm void __shr2u(void) { - nofralloc subfic r8, r5, 32 subic r9, r5, 32 srw r4, r4, r5 slw r10, r3, r8 or r4, r4, - r10 srw r10, r3, r9 or r4, r4, r10 srw r3, r3, r5 blr + nofralloc; + subfic r8, r5, 32; + subic r9, r5, 32; + srw r4, r4, r5; + slw r10, r3, r8; + or r4, r4, r10; + srw r10, r3, r9; + or r4, r4, r10; + srw r3, r3, r5; + blr } asm void __shr2i(void) { - subfic r8, r5, 0x20 addic.r9, r5, -0x20 srw r4, r4, r5 slw r10, r3, r8 or r4, r4, r10 sraw r10, - r3, r9 ble L_802BA610 or r4, r4, r10 L_802BA610 : sraw r3, r3, r5 blr + subfic r8, r5, 0x20; + addic.r9, r5, -0x20; + srw r4, r4, r5; + slw r10, r3, r8; + or r4, r4, r10; + sraw r10, r3, r9; + ble L_802BA610; + or r4, r4, r10; +L_802BA610:; + sraw r3, r3, r5; + blr } asm void __cvt_sll_dbl(void) @@ -733,38 +789,56 @@ asm void __cvt_ull_dbl(void) asm void __cvt_sll_flt(void) { - stwu r1, -0x10(r1)clrrwi.r5, r3, 31 beq L_802BA62C subfic r4, r4, 0x0 subfze r3, - r3 L_802BA62C : or.r7, r3, r4 li r6, 0x0 beq L_802BA6B4 cntlzw r7, r3 cntlzw r8, - r4 extlwi r9, r7, 5, 26 srawi r9, r9, 31 and r9, r9, r8 add r7, r7, r9 subfic r8, r7, - 0x20 addic r9, r7, -0x20 slw r3, r3, r7 srw r10, r4, r8 or r3, r3, r10 slw r10, r4, - r9 or r3, r3, r10 slw r4, r4, r7 subf r6, r7, r6 clrlwi r7, r4, 21 cmpwi r7, 0x400 addi r6, - r6, 0x43e blt L_802BA69C bgt L_802BA690 rlwinm.r7, r4, 0, 20, - 20 beq L_802BA69C L_802BA690 : addic r4, - r4, - 0x800 addze r3, - r3 addze r6, - r6 L_802BA69C : rotrwi r4, - r4, - 11 rlwimi r4, - r3, - 21, - 0, - 10 extrwi r3, - r3, - 20, - 1 slwi r6, - r6, - 20 or r3, - r6, - r3 or r3, - r5, - r3 L_802BA6B4 : stw r3, - 0x8(r1)stw r4, - 0xc(r1)lfd f1, - 0x8(r1)frsp f1, - f1 addi r1, - r1, - 0x10 blr + stwu r1, -0x10(r1); + clrrwi.r5, r3, 31; + beq L_802BA62C; + subfic r4, r4, 0x0; + subfze r3, r3; +L_802BA62C:; + or.r7, r3, r4; + li r6, 0x0; + beq L_802BA6B4; + cntlzw r7, r3; + cntlzw r8, r4; + extlwi r9, r7, 5, 26; + srawi r9, r9, 31; + and r9, r9, r8; + add r7, r7, r9; + subfic r8, r7, 0x20; + addic r9, r7, -0x20; + slw r3, r3, r7; + srw r10, r4, r8; + or r3, r3, r10; + slw r10, r4, r9; + or r3, r3, r10; + slw r4, r4, r7; + subf r6, r7, r6; + clrlwi r7, r4, 21; + cmpwi r7, 0x400; + addi r6, r6, 0x43e; + blt L_802BA69C; + bgt L_802BA690; + rlwinm.r7, r4, 0, 20, 20; + beq L_802BA69C; +L_802BA690:; + addic r4, r4, 0x800; + addze r3, r3; + addze r6, r6; +L_802BA69C:; + rotrwi r4, r4, 11; + rlwimi r4, r3, 21, 0, 10; + extrwi r3, r3, 20, 1; + slwi r6, r6, 20; + or r3, r6, r3; + or r3, r5, r3; +L_802BA6B4:; + stw r3, 0x8(r1); + stw r4, 0xc(r1); + lfd f1, 0x8(r1); + frsp f1, f1; + addi r1, r1, 0x10; + frfree; // Build error said to add this + blr } //unused @@ -775,144 +849,121 @@ asm void __cvt_ull_flt(void) //unused asm void __cvt_dbl_usll(void) { - nofralloc stwu r1, -16(r1)stfd f1, 8(r1)lwz r3, 8(r1)lwz r4, 12(r1)rlwinm r5, r3, 12, 21, - 31 cmpli cr0, 0, r5, 1023 bge cr0, not_fraction li r3, 0 li r4, - 0 b func_end not_fraction : mr r6, - r3 rlwinm r3, - r3, - 0, - 12, - 31 oris r3, - r3, - 0x0010 addi r5, - r5, - -1075 cmpwi cr0, - r5, - 0 bge cr0, - left neg r5, - r5 subfic r8, - r5, - 32 subic r9, - r5, - 32 srw r4, - r4, - r5 slw r10, - r3, - r8 or r4, - r4, - r10 srw r10, - r3, - r9 or r4, - r4, - r10 srw r3, - r3, - r5 b around left : cmpwi cr0, - r5, - 10 ble + no_overflow rlwinm.r6, - r6, - 0, - 0, - 0 beq cr0, - max_positive lis r3, - 0x8000 li r4, - 0 b func_end max_positive - : lis r3, - 0x7FFF ori r3, - r3, - 0xFFFF li r4, - -1 b func_end no_overflow : subfic r8, - r5, - 32 subic r9, - r5, - 32 slw r3, - r3, - r5 srw r10, - r4, - r8 or r3, - r3, - r10 slw r10, - r4, - r9 or r3, - r3, - r10 slw r4, - r4, - r5 around : rlwinm.r6, - r6, - 0, - 0, - 0 beq cr0, - positive subfic r4, - r4, - 0 subfze r3, - r3 positive : func_end : addi r1, - r1, - 16 blr + nofralloc; + stwu r1, -16(r1); + stfd f1, 8(r1); + lwz r3, 8(r1); + lwz r4, 12(r1); + rlwinm r5, r3, 12, 21, 31; + cmpli cr0, 0, r5, 1023; + bge cr0, not_fraction; + li r3, 0; + li r4, 0; + b func_end; +not_fraction:; + mr r6, r3; + rlwinm r3, r3, 0, 12, 31; + oris r3, r3, 0x0010; + addi r5, r5, -1075; + cmpwi cr0, r5, 0; + bge cr0, left; + neg r5, r5; + subfic r8, r5, 32; + subic r9, r5, 32; + srw r4, r4, r5; + slw r10, r3, r8; + or r4, r4, r10; + srw r10, r3, r9; + or r4, r4, r10; + srw r3, r3, r5; + b around; +left:; + cmpwi cr0, r5, 10; + ble + no_overflow; + rlwinm.r6, r6, 0, 0, 0; + beq cr0, max_positive; + lis r3, 0x8000; + li r4, 0; + b func_end; +max_positive:; + lis r3, 0x7FFF; + ori r3, r3, 0xFFFF; + li r4, -1; + b func_end; +no_overflow:; + subfic r8, r5, 32; + subic r9, r5, 32; + slw r3, r3, r5; + srw r10, r4, r8; + or r3, r3, r10; + slw r10, r4, r9; + or r3, r3, r10; + slw r4, r4, r5; +around:; + rlwinm.r6, r6, 0, 0, 0; + beq cr0, positive; + subfic r4, r4, 0; + subfze r3, r3; +positive: +func_end:; + addi r1, r1, 16; + blr } void __cvt_dbl_ull(void) { - nofralloc stwu r1, -0x10(r1)stfd f1, 8(r1)lwz r3, 8(r1)lwz r4, 0xC(r1)extrwi r5, r3, 11, - 1 cmplwi r5, - 0x3FF bge loc_80518FB4 - - loc_80518FA8 : li r3, - 0 li r4, - 0 b end - - loc_80518FB4 : clrrwi.r6, - r3, - 31 bne loc_80518FA8 clrlwi r3, - r3, - 12 oris r3, - r3, - 0x10 addi r5, - r5, - -0x433 cmpwi r5, - 0 bge loc_80518FF8 neg r5, - r5 subfic r8, - r5, - 0x20 addic r9, - r5, - -0x20 srw r4, - r4, - r5 slw r10, - r3, - r8 or r4, - r4, - r10 srw r10, - r3, - r9 or r4, - r4, - r10 srw r3, - r3, - r5 b end - - loc_80518FF8 : cmpwi r5, - 0xB ble + loc_8051900C li r3, - -1 li r4, - -1 b end - - loc_8051900C : subfic r8, - r5, - 0x20 addic r9, - r5, - -0x20 slw r3, - r3, - r5 srw r10, - r4, - r8 or r3, - r3, - r10 slw r10, - r4, - r9 or r3, - r3, - r10 slw r4, - r4, - r5 - - end : addi r1, - r1, - 0x10 blr + nofralloc; + stwu r1, -0x10(r1); + stfd f1, 8(r1); + lwz r3, 8(r1); + lwz r4, 0xC(r1); + extrwi r5, r3, 11, 1; + cmplwi r5, 0x3FF; + bge loc_80518FB4 + + loc_80518FA8:; + li r3, 0; + li r4, 0; + b end + + loc_80518FB4:; + clrrwi.r6, r3, 31; + bne loc_80518FA8; + clrlwi r3, r3, 12; + oris r3, r3, 0x10; + addi r5, r5, -0x433; + cmpwi r5, 0; + bge loc_80518FF8; + neg r5, r5; + subfic r8, r5, 0x20; + addic r9, r5, -0x20; + srw r4, r4, r5; + slw r10, r3, r8; + or r4, r4, r10; + srw r10, r3, r9; + or r4, r4, r10; + srw r3, r3, r5; + b end + + loc_80518FF8:; + cmpwi r5, 0xB; + ble + loc_8051900C; + li r3, -1; + li r4, -1; + b end + + loc_8051900C:; + subfic r8, r5, 0x20; + addic r9, r5, -0x20; + slw r3, r3, r5; + srw r10, r4, r8; + or r3, r3, r10; + slw r10, r4, r9; + or r3, r3, r10; + slw r4, r4, r5; +end:; + addi r1, r1, 0x10; + blr } #ifdef __cplusplus diff --git a/libs/PowerPC_EABI_Support/src/runtime3/READ_ME.txt b/libs/PowerPC_EABI_Support/src/runtime3/READ_ME.txt deleted file mode 100644 index b2a060cb8..000000000 --- a/libs/PowerPC_EABI_Support/src/runtime3/READ_ME.txt +++ /dev/null @@ -1,6 +0,0 @@ -These files are files that have issues that need to be fixed before the file can be -added back into the "Runtime" folder. - -These are outside of the scope of what I am aiming to do at the moment. - -- Colin \ No newline at end of file diff --git a/libs/PowerPC_EABI_Support/src/runtime3/runtime.c b/libs/PowerPC_EABI_Support/src/runtime3/runtime.c deleted file mode 100644 index 68cb136c6..000000000 --- a/libs/PowerPC_EABI_Support/src/runtime3/runtime.c +++ /dev/null @@ -1,920 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -/* macros for GPR/FPR resting and saving */ -#define SAVE_FPR(reg) _savefpr_##reg -#define RESTORE_FPR(reg) _restfpr_##reg -#define SAVE_GPR(reg) _savegpr_##reg -#define RESTORE_GPR(reg) _restgpr_##reg -#define ENTRY_SAVE_FPR(reg) entry SAVE_FPR(reg) -#define ENTRY_RESTORE_FPR(reg) entry RESTORE_FPR(reg) -#define ENTRY_SAVE_GPR(reg) entry SAVE_GPR(reg) -#define ENTRY_RESTORE_GPR(reg) entry RESTORE_GPR(reg) -#define SAVE_FPR2(reg) _savef##reg -#define RESTORE_FPR2(reg) _restf##reg -#define ENTRY_SAVE_FPR2(reg) -#define ENTRY_RESTORE_FPR2(reg) - -#define save_restore_reg r11 - -asm void __div2u(void); -asm void __div2i(void); -asm void __mod2u(void); -asm void __mod2i(void); -asm void __shl2i(void); -asm void __shr2u(void); -asm void __shr2i(void); -asm void __cvt_sll_dbl(void); -asm void __cvt_ull_dbl(void); -asm void __cvt_sll_flt(void); -asm void __cvt_ull_flt(void); -asm void __cvt_dbl_usll(void); -asm void __cvt_dbl_ull(void); - -void SAVE_FPR(14)(void); -void SAVE_FPR(15)(void); -void SAVE_FPR(16)(void); -void SAVE_FPR(17)(void); -void SAVE_FPR(18)(void); -void SAVE_FPR(19)(void); -void SAVE_FPR(20)(void); -void SAVE_FPR(21)(void); -void SAVE_FPR(22)(void); -void SAVE_FPR(23)(void); -void SAVE_FPR(24)(void); -void SAVE_FPR(25)(void); -void SAVE_FPR(26)(void); -void SAVE_FPR(27)(void); -void SAVE_FPR(28)(void); -void SAVE_FPR(29)(void); -void SAVE_FPR(30)(void); -void SAVE_FPR(31)(void); -void SAVE_FPR2(14)(void); -void SAVE_FPR2(15)(void); -void SAVE_FPR2(16)(void); -void SAVE_FPR2(17)(void); -void SAVE_FPR2(18)(void); -void SAVE_FPR2(19)(void); -void SAVE_FPR2(20)(void); -void SAVE_FPR2(21)(void); -void SAVE_FPR2(22)(void); -void SAVE_FPR2(23)(void); -void SAVE_FPR2(24)(void); -void SAVE_FPR2(25)(void); -void SAVE_FPR2(26)(void); -void SAVE_FPR2(27)(void); -void SAVE_FPR2(28)(void); -void SAVE_FPR2(29)(void); -void SAVE_FPR2(30)(void); -void SAVE_FPR2(31)(void); -void RESTORE_FPR(14)(void); -void RESTORE_FPR(15)(void); -void RESTORE_FPR(16)(void); -void RESTORE_FPR(17)(void); -void RESTORE_FPR(18)(void); -void RESTORE_FPR(19)(void); -void RESTORE_FPR(20)(void); -void RESTORE_FPR(21)(void); -void RESTORE_FPR(22)(void); -void RESTORE_FPR(23)(void); -void RESTORE_FPR(24)(void); -void RESTORE_FPR(25)(void); -void RESTORE_FPR(26)(void); -void RESTORE_FPR(27)(void); -void RESTORE_FPR(28)(void); -void RESTORE_FPR(29)(void); -void RESTORE_FPR(30)(void); -void RESTORE_FPR(31)(void); -void RESTORE_FPR2(14)(void); -void RESTORE_FPR2(15)(void); -void RESTORE_FPR2(16)(void); -void RESTORE_FPR2(17)(void); -void RESTORE_FPR2(18)(void); -void RESTORE_FPR2(19)(void); -void RESTORE_FPR2(20)(void); -void RESTORE_FPR2(21)(void); -void RESTORE_FPR2(22)(void); -void RESTORE_FPR2(23)(void); -void RESTORE_FPR2(24)(void); -void RESTORE_FPR2(25)(void); -void RESTORE_FPR2(26)(void); -void RESTORE_FPR2(27)(void); -void RESTORE_FPR2(28)(void); -void RESTORE_FPR2(29)(void); -void RESTORE_FPR2(30)(void); -void RESTORE_FPR2(31)(void); -void SAVE_GPR(14)(void); -void SAVE_GPR(15)(void); -void SAVE_GPR(16)(void); -void SAVE_GPR(17)(void); -void SAVE_GPR(18)(void); -void SAVE_GPR(19)(void); -void SAVE_GPR(20)(void); -void SAVE_GPR(21)(void); -void SAVE_GPR(22)(void); -void SAVE_GPR(23)(void); -void SAVE_GPR(24)(void); -void SAVE_GPR(25)(void); -void SAVE_GPR(26)(void); -void SAVE_GPR(27)(void); -void SAVE_GPR(28)(void); -void SAVE_GPR(29)(void); -void SAVE_GPR(30)(void); -void SAVE_GPR(31)(void); -void RESTORE_GPR(14)(void); -void RESTORE_GPR(15)(void); -void RESTORE_GPR(16)(void); -void RESTORE_GPR(17)(void); -void RESTORE_GPR(18)(void); -void RESTORE_GPR(19)(void); -void RESTORE_GPR(20)(void); -void RESTORE_GPR(21)(void); -void RESTORE_GPR(22)(void); -void RESTORE_GPR(23)(void); -void RESTORE_GPR(24)(void); -void RESTORE_GPR(25)(void); -void RESTORE_GPR(26)(void); -void RESTORE_GPR(27)(void); -void RESTORE_GPR(28)(void); -void RESTORE_GPR(29)(void); -void RESTORE_GPR(30)(void); -void RESTORE_GPR(31)(void); - -static const unsigned long __constants[] = { - 0x00000000, 0x00000000, 0x41F00000, 0x00000000, 0x41E00000, 0x00000000, -}; - -asm unsigned long __cvt_fp2unsigned(register double d) -{ - nofralloc stwu r1, -16(r1)lis r4, __constants @h ori r4, r4, __constants @l li r3, 0 lfd fp0, - 0(r4)lfd fp3, 8(r4)lfd fp4, 16(r4)fcmpu cr0, fp1, fp0 fcmpu cr6, fp1, fp3 blt cr0, - @exit addi r3, r3, -1 bge cr6, @exit fcmpu cr7, fp1, fp4 fmr fp2, fp1 blt cr7, @1 fsub fp2, - fp1, fp4 @1 fctiwz fp2, fp2 stfd fp2, 8(r1)lwz r3, 12(r1)blt cr7, @exit addis r3, r3, - -0x8000 @exit : addi r1, r1, 16 blr -} - -static asm void __save_fpr(void) -{ - nofralloc ENTRY_SAVE_FPR(14) ENTRY_SAVE_FPR2(14) stfd fp14, - -144(save_restore_reg)ENTRY_SAVE_FPR(15) ENTRY_SAVE_FPR2(15) stfd fp15, - -136(save_restore_reg)ENTRY_SAVE_FPR(16) ENTRY_SAVE_FPR2(16) stfd fp16, - -128(save_restore_reg)ENTRY_SAVE_FPR(17) ENTRY_SAVE_FPR2(17) stfd fp17, - -120(save_restore_reg)ENTRY_SAVE_FPR(18) ENTRY_SAVE_FPR2(18) stfd fp18, - -112(save_restore_reg)ENTRY_SAVE_FPR(19) ENTRY_SAVE_FPR2(19) stfd fp19, - -104(save_restore_reg)ENTRY_SAVE_FPR(20) ENTRY_SAVE_FPR2(20) stfd fp20, - -96(save_restore_reg)ENTRY_SAVE_FPR(21) ENTRY_SAVE_FPR2(21) stfd fp21, - -88(save_restore_reg)ENTRY_SAVE_FPR(22) ENTRY_SAVE_FPR2(22) stfd fp22, - -80(save_restore_reg)ENTRY_SAVE_FPR(23) ENTRY_SAVE_FPR2(23) stfd fp23, - -72(save_restore_reg)ENTRY_SAVE_FPR(24) ENTRY_SAVE_FPR2(24) stfd fp24, - -64(save_restore_reg)ENTRY_SAVE_FPR(25) ENTRY_SAVE_FPR2(25) stfd fp25, - -56(save_restore_reg)ENTRY_SAVE_FPR(26) ENTRY_SAVE_FPR2(26) stfd fp26, - -48(save_restore_reg)ENTRY_SAVE_FPR(27) ENTRY_SAVE_FPR2(27) stfd fp27, - -40(save_restore_reg)ENTRY_SAVE_FPR(28) ENTRY_SAVE_FPR2(28) stfd fp28, - -32(save_restore_reg)ENTRY_SAVE_FPR(29) ENTRY_SAVE_FPR2(29) stfd fp29, - -24(save_restore_reg)ENTRY_SAVE_FPR(30) ENTRY_SAVE_FPR2(30) stfd fp30, - -16(save_restore_reg)ENTRY_SAVE_FPR(31) ENTRY_SAVE_FPR2(31) stfd fp31, - -8(save_restore_reg)blr -} - -static asm void __restore_fpr(void) -{ - nofralloc ENTRY_RESTORE_FPR(14) ENTRY_RESTORE_FPR2(14) lfd fp14, - -144(save_restore_reg)ENTRY_RESTORE_FPR(15) ENTRY_RESTORE_FPR2(15) lfd fp15, - -136(save_restore_reg)ENTRY_RESTORE_FPR(16) ENTRY_RESTORE_FPR2(16) lfd fp16, - -128(save_restore_reg)ENTRY_RESTORE_FPR(17) ENTRY_RESTORE_FPR2(17) lfd fp17, - -120(save_restore_reg)ENTRY_RESTORE_FPR(18) ENTRY_RESTORE_FPR2(18) lfd fp18, - -112(save_restore_reg)ENTRY_RESTORE_FPR(19) ENTRY_RESTORE_FPR2(19) lfd fp19, - -104(save_restore_reg)ENTRY_RESTORE_FPR(20) ENTRY_RESTORE_FPR2(20) lfd fp20, - -96(save_restore_reg)ENTRY_RESTORE_FPR(21) ENTRY_RESTORE_FPR2(21) lfd fp21, - -88(save_restore_reg)ENTRY_RESTORE_FPR(22) ENTRY_RESTORE_FPR2(22) lfd fp22, - -80(save_restore_reg)ENTRY_RESTORE_FPR(23) ENTRY_RESTORE_FPR2(23) lfd fp23, - -72(save_restore_reg)ENTRY_RESTORE_FPR(24) ENTRY_RESTORE_FPR2(24) lfd fp24, - -64(save_restore_reg)ENTRY_RESTORE_FPR(25) ENTRY_RESTORE_FPR2(25) lfd fp25, - -56(save_restore_reg)ENTRY_RESTORE_FPR(26) ENTRY_RESTORE_FPR2(26) lfd fp26, - -48(save_restore_reg)ENTRY_RESTORE_FPR(27) ENTRY_RESTORE_FPR2(27) lfd fp27, - -40(save_restore_reg)ENTRY_RESTORE_FPR(28) ENTRY_RESTORE_FPR2(28) lfd fp28, - -32(save_restore_reg)ENTRY_RESTORE_FPR(29) ENTRY_RESTORE_FPR2(29) lfd fp29, - -24(save_restore_reg)ENTRY_RESTORE_FPR(30) ENTRY_RESTORE_FPR2(30) lfd fp30, - -16(save_restore_reg)ENTRY_RESTORE_FPR(31) ENTRY_RESTORE_FPR2(31) lfd fp31, - -8(save_restore_reg)blr -} - -static asm void __save_gpr(void) -{ - nofralloc ENTRY_SAVE_GPR(14) stw r14, -72(save_restore_reg)ENTRY_SAVE_GPR(15) stw r15, - -68(save_restore_reg)ENTRY_SAVE_GPR(16) stw r16, - -64(save_restore_reg)ENTRY_SAVE_GPR(17) stw r17, - -60(save_restore_reg)ENTRY_SAVE_GPR(18) stw r18, - -56(save_restore_reg)ENTRY_SAVE_GPR(19) stw r19, - -52(save_restore_reg)ENTRY_SAVE_GPR(20) stw r20, - -48(save_restore_reg)ENTRY_SAVE_GPR(21) stw r21, - -44(save_restore_reg)ENTRY_SAVE_GPR(22) stw r22, - -40(save_restore_reg)ENTRY_SAVE_GPR(23) stw r23, - -36(save_restore_reg)ENTRY_SAVE_GPR(24) stw r24, - -32(save_restore_reg)ENTRY_SAVE_GPR(25) stw r25, - -28(save_restore_reg)ENTRY_SAVE_GPR(26) stw r26, - -24(save_restore_reg)ENTRY_SAVE_GPR(27) stw r27, - -20(save_restore_reg)ENTRY_SAVE_GPR(28) stw r28, - -16(save_restore_reg)ENTRY_SAVE_GPR(29) stw r29, - -12(save_restore_reg)ENTRY_SAVE_GPR(30) stw r30, - -8(save_restore_reg)ENTRY_SAVE_GPR(31) stw r31, -4(save_restore_reg)blr -} - -static asm void __restore_gpr(void) -{ - nofralloc ENTRY_RESTORE_GPR(14) lwz r14, -72(save_restore_reg)ENTRY_RESTORE_GPR(15) lwz r15, - -68(save_restore_reg)ENTRY_RESTORE_GPR(16) lwz r16, - -64(save_restore_reg)ENTRY_RESTORE_GPR(17) lwz r17, - -60(save_restore_reg)ENTRY_RESTORE_GPR(18) lwz r18, - -56(save_restore_reg)ENTRY_RESTORE_GPR(19) lwz r19, - -52(save_restore_reg)ENTRY_RESTORE_GPR(20) lwz r20, - -48(save_restore_reg)ENTRY_RESTORE_GPR(21) lwz r21, - -44(save_restore_reg)ENTRY_RESTORE_GPR(22) lwz r22, - -40(save_restore_reg)ENTRY_RESTORE_GPR(23) lwz r23, - -36(save_restore_reg)ENTRY_RESTORE_GPR(24) lwz r24, - -32(save_restore_reg)ENTRY_RESTORE_GPR(25) lwz r25, - -28(save_restore_reg)ENTRY_RESTORE_GPR(26) lwz r26, - -24(save_restore_reg)ENTRY_RESTORE_GPR(27) lwz r27, - -20(save_restore_reg)ENTRY_RESTORE_GPR(28) lwz r28, - -16(save_restore_reg)ENTRY_RESTORE_GPR(29) lwz r29, - -12(save_restore_reg)ENTRY_RESTORE_GPR(30) lwz r30, - -8(save_restore_reg)ENTRY_RESTORE_GPR(31) lwz r31, -4(save_restore_reg)blr -} - -asm void __div2u(void) -{ - nofralloc cmpwi cr0, r3, 0 cntlzw r0, r3 cntlzw r9, r4 bne cr0, lab1 addi r0, r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 - : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 adde r4, - r4, - r4 adde r3, - r3, - r3 blr lab9 : li r4, - 0 li r3, - 0 blr -} - -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void __div2i(void) -{ - nofralloc stwu r1, -16(r1)rlwinm.r9, r3, 0, 0, 0 beq cr0, positive1 subfic r4, r4, 0 subfze r3, - r3 positive1 : stw r9, - 8(r1)rlwinm.r10, - r5, - 0, - 0, - 0 beq cr0, - positive2 subfic r6, - r6, - 0 subfze r5, - r5 positive2 : stw r10, - 12(r1)cmpwi cr0, - r3, - 0 cntlzw r0, - r3 cntlzw r9, - r4 bne cr0, - lab1 addi r0, - r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 - : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 adde r4, - r4, - r4 adde r3, - r3, - r3 lwz r9, - 8(r1)lwz r10, - 12(r1) xor.r7, - r9, - r10 beq func_end cmpwi cr0, - r9, - 0 subfic r4, - r4, - 0 subfze r3, - r3 - - no_adjust : b func_end - - lab9 : li r4, - 0 li r3, - 0 func_end : addi r1, - r1, - 16 blr -} -#pragma pop - -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void __mod2u(void) -{ - nofralloc cmpwi cr0, r3, 0 cntlzw r0, r3 cntlzw r9, r4 bne cr0, lab1 addi r0, r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgtlr cr0 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 - : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 mr r4, - r8 mr r3, - r7 blr lab9 : blr -} -#pragma pop - -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void __mod2i(void) -{ - nofralloc - - cmpwi cr7, - r3, 0 bge cr7, positive1 subfic r4, r4, 0 subfze r3, - r3 positive1 : cmpwi cr0, - r5, - 0 bge cr0, - positive2 subfic r6, - r6, - 0 subfze r5, - r5 positive2 : cmpwi cr0, - r3, - 0 cntlzw r0, - r3 cntlzw r9, - r4 bne cr0, - lab1 addi r0, - r9, - 32 lab1 : cmpwi cr0, - r5, - 0 cntlzw r9, - r5 cntlzw r10, - r6 bne cr0, - lab2 addi r9, - r10, - 32 lab2 : cmpw cr0, - r0, - r9 subfic r10, - r0, - 64 bgt cr0, - lab9 addi r9, - r9, - 1 subfic r9, - r9, - 64 add r0, - r0, - r9 subf r9, - r9, - r10 mtctr r9 cmpwi cr0, - r9, - 32 addi r7, - r9, - -32 blt cr0, - lab3 srw r8, - r3, - r7 li r7, - 0 b lab4 lab3 : srw r8, - r4, - r9 subfic r7, - r9, - 32 slw r7, - r3, - r7 or r8, - r8, - r7 srw r7, - r3, - r9 lab4 : cmpwi cr0, - r0, - 32 addic r9, - r0, - -32 blt cr0, - lab5 slw r3, - r4, - r9 li r4, - 0 b lab6 lab5 - : slw r3, - r3, - r0 subfic r9, - r0, - 32 srw r9, - r4, - r9 or r3, - r3, - r9 slw r4, - r4, - r0 lab6 : li r10, - -1 addic r7, - r7, - 0 lab7 : adde r4, - r4, - r4 adde r3, - r3, - r3 adde r8, - r8, - r8 adde r7, - r7, - r7 subfc r0, - r6, - r8 subfe.r9, - r5, - r7 blt cr0, - lab8 mr r8, - r0 mr r7, - r9 addic r0, - r10, - 1 lab8 : bdnz lab7 mr r4, - r8 mr r3, - r7 lab9 : bgelr cr7 subfic r4, - r4, - 0 subfze r3, - r3 no_adjust : blr -} -#pragma pop - -asm void __shl2i(void) -{ - nofralloc subfic r8, r5, 32 subic r9, r5, 32 slw r3, r3, r5 srw r10, r4, r8 or r3, r3, - r10 slw r10, r4, r9 or r3, r3, r10 slw r4, r4, r5 blr -} - -//unused -asm void __shr2u(void) -{ - nofralloc subfic r8, r5, 32 subic r9, r5, 32 srw r4, r4, r5 slw r10, r3, r8 or r4, r4, - r10 srw r10, r3, r9 or r4, r4, r10 srw r3, r3, r5 blr -} - -asm void __shr2i(void) -{ - subfic r8, r5, 0x20 addic.r9, r5, -0x20 srw r4, r4, r5 slw r10, r3, r8 or r4, r4, r10 sraw r10, - r3, r9 ble L_802BA610 or r4, r4, r10 L_802BA610 : sraw r3, r3, r5 blr -} - -asm void __cvt_sll_dbl(void) -{ - // clang-format off - stwu r1, -0x10(r1) - rlwinm. r5, r3, 0, 0, 0 - beq- lbl_802b2b1c - subfic r4, r4, 0x0 - subfze r3, r3 -lbl_802b2b1c: - or. r7, r3, r4 - li r6, 0x0 - beq- lbl_802b2ba4 - cntlzw r7, r3 - cntlzw r8, r4 - rlwinm r9, r7, 0x1a, 0, 4 - srawi r9, r9, 0x1f - and r9, r9, r8 - add r7, r7, r9 - subfic r8, r7, 0x20 - addic r9, r7, -0x20 - slw r3, r3, r7 - srw r10, r4, r8 - or r3, r3, r10 - slw r10, r4, r9 - or r3, r3, r10 - slw r4, r4, r7 - subf r6, r7, r6 - clrlwi r7, r4, 0x15 - cmpwi r7, 0x400 - addi r6, r6, 0x43e - blt- lbl_802b2b8c - bgt- lbl_802b2b80 - rlwinm. r7, r4, 0, 0x14, 0x14 - beq- lbl_802b2b8c -lbl_802b2b80: - addic r4, r4, 0x800 - addze r3, r3 - addze r6, r6 -lbl_802b2b8c: - rotlwi r4, r4, 0x15 - rlwimi r4, r3, 0x15, 0, 0xa - rlwinm r3, r3, 0x15, 0xc, 0x1f - slwi r6, r6, 0x14 - or r3, r6, r3 - or r3, r5, r3 -lbl_802b2ba4: - stw r3, 8(r1) - stw r4, 0xc(r1) - lfd f1, 8(r1) - addi r1, r1, 0x10 - frfree - blr - // clang-format on -} - -//unused -asm void __cvt_ull_dbl(void) -{ -} - -asm void __cvt_sll_flt(void) -{ - stwu r1, -0x10(r1)clrrwi.r5, r3, 31 beq L_802BA62C subfic r4, r4, 0x0 subfze r3, - r3 L_802BA62C : or.r7, r3, r4 li r6, 0x0 beq L_802BA6B4 cntlzw r7, r3 cntlzw r8, - r4 extlwi r9, r7, 5, 26 srawi r9, r9, 31 and r9, r9, r8 add r7, r7, r9 subfic r8, r7, - 0x20 addic r9, r7, -0x20 slw r3, r3, r7 srw r10, r4, r8 or r3, r3, r10 slw r10, r4, - r9 or r3, r3, r10 slw r4, r4, r7 subf r6, r7, r6 clrlwi r7, r4, 21 cmpwi r7, 0x400 addi r6, - r6, 0x43e blt L_802BA69C bgt L_802BA690 rlwinm.r7, r4, 0, 20, - 20 beq L_802BA69C L_802BA690 : addic r4, - r4, - 0x800 addze r3, - r3 addze r6, - r6 L_802BA69C : rotrwi r4, - r4, - 11 rlwimi r4, - r3, - 21, - 0, - 10 extrwi r3, - r3, - 20, - 1 slwi r6, - r6, - 20 or r3, - r6, - r3 or r3, - r5, - r3 L_802BA6B4 : stw r3, - 0x8(r1)stw r4, - 0xc(r1)lfd f1, - 0x8(r1)frsp f1, - f1 addi r1, - r1, - 0x10 blr -} - -//unused -asm void __cvt_ull_flt(void) -{ -} - -//unused -asm void __cvt_dbl_usll(void) -{ - nofralloc stwu r1, -16(r1)stfd f1, 8(r1)lwz r3, 8(r1)lwz r4, 12(r1)rlwinm r5, r3, 12, 21, - 31 cmpli cr0, 0, r5, 1023 bge cr0, not_fraction li r3, 0 li r4, - 0 b func_end not_fraction : mr r6, - r3 rlwinm r3, - r3, - 0, - 12, - 31 oris r3, - r3, - 0x0010 addi r5, - r5, - -1075 cmpwi cr0, - r5, - 0 bge cr0, - left neg r5, - r5 subfic r8, - r5, - 32 subic r9, - r5, - 32 srw r4, - r4, - r5 slw r10, - r3, - r8 or r4, - r4, - r10 srw r10, - r3, - r9 or r4, - r4, - r10 srw r3, - r3, - r5 b around left : cmpwi cr0, - r5, - 10 ble + no_overflow rlwinm.r6, - r6, - 0, - 0, - 0 beq cr0, - max_positive lis r3, - 0x8000 li r4, - 0 b func_end max_positive - : lis r3, - 0x7FFF ori r3, - r3, - 0xFFFF li r4, - -1 b func_end no_overflow : subfic r8, - r5, - 32 subic r9, - r5, - 32 slw r3, - r3, - r5 srw r10, - r4, - r8 or r3, - r3, - r10 slw r10, - r4, - r9 or r3, - r3, - r10 slw r4, - r4, - r5 around : rlwinm.r6, - r6, - 0, - 0, - 0 beq cr0, - positive subfic r4, - r4, - 0 subfze r3, - r3 positive : func_end : addi r1, - r1, - 16 blr -} - -void __cvt_dbl_ull(void) -{ - nofralloc stwu r1, -0x10(r1)stfd f1, 8(r1)lwz r3, 8(r1)lwz r4, 0xC(r1)extrwi r5, r3, 11, - 1 cmplwi r5, - 0x3FF bge loc_80518FB4 - - loc_80518FA8 : li r3, - 0 li r4, - 0 b end - - loc_80518FB4 : clrrwi.r6, - r3, - 31 bne loc_80518FA8 clrlwi r3, - r3, - 12 oris r3, - r3, - 0x10 addi r5, - r5, - -0x433 cmpwi r5, - 0 bge loc_80518FF8 neg r5, - r5 subfic r8, - r5, - 0x20 addic r9, - r5, - -0x20 srw r4, - r4, - r5 slw r10, - r3, - r8 or r4, - r4, - r10 srw r10, - r3, - r9 or r4, - r4, - r10 srw r3, - r3, - r5 b end - - loc_80518FF8 : cmpwi r5, - 0xB ble + loc_8051900C li r3, - -1 li r4, - -1 b end - - loc_8051900C : subfic r8, - r5, - 0x20 addic r9, - r5, - -0x20 slw r3, - r3, - r5 srw r10, - r4, - r8 or r3, - r3, - r10 slw r10, - r4, - r9 or r3, - r3, - r10 slw r4, - r4, - r5 - - end : addi r1, - r1, - 0x10 blr -} - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/libs/dolphin/OdemuExi2/DebuggerDriver.c b/libs/dolphin/OdemuExi2/DebuggerDriver.c index c2c5e7c3d..e5377fc63 100644 --- a/libs/dolphin/OdemuExi2/DebuggerDriver.c +++ b/libs/dolphin/OdemuExi2/DebuggerDriver.c @@ -19,7 +19,7 @@ static u8 SendCount = 0x80; #define IS_FALSE(x) !IS_TRUE(x) #define ROUND_UP(x, align) (((x) + (align)-1) & (-(align))) -void DBGEXIInit() +inline void DBGEXIInit() { __OSMaskInterrupts(0x18000); __EXIRegs[10] = 0; @@ -31,7 +31,7 @@ void DBGEXIInit() * Size: 000028 */ -static u32 DBGEXISelect(u32 v) +inline u32 DBGEXISelect(u32 v) { u32 regs = __EXIRegs[10]; regs &= 0x405; @@ -45,7 +45,7 @@ static u32 DBGEXISelect(u32 v) * Address: ........ * Size: 00001C */ -BOOL DBGEXIDeselect(void) +inline BOOL DBGEXIDeselect(void) { __EXIRegs[10] &= 0x405; return TRUE; @@ -56,7 +56,7 @@ BOOL DBGEXIDeselect(void) * Address: ........ * Size: 00001C */ -static BOOL DBGEXISync() +inline BOOL DBGEXISync() { while (__EXIRegs[13] & 1) ; @@ -108,7 +108,7 @@ static BOOL DBGEXIImm(void* buffer, s32 bytecounter, u32 write) * Address: ........ * Size: 00008C */ -static BOOL DBGWriteMailbox(u32 p1) +inline BOOL DBGWriteMailbox(u32 p1) { BOOL total = FALSE; u32 v; @@ -326,7 +326,7 @@ void DBInitInterrupts(void) * Address: ........ * Size: 000150 */ -static void CheckMailBox(void) +inline void CheckMailBox(void) { u32 v; DBGReadStatus(&v); @@ -358,8 +358,8 @@ u32 DBQueryData(void) { interrupts = OSDisableInterrupts(); CheckMailBox(); + OSRestoreInterrupts(interrupts); } - OSRestoreInterrupts(interrupts); return RecvDataLeng; } diff --git a/libs/dolphin/amcstubs/AmcExi2Stubs.c b/libs/dolphin/amcstubs/AmcExi2Stubs.c index 99073a34c..1deed475a 100644 --- a/libs/dolphin/amcstubs/AmcExi2Stubs.c +++ b/libs/dolphin/amcstubs/AmcExi2Stubs.c @@ -4,26 +4,38 @@ // prototypes int AMC_IsStub(void); -void EXI2_Init(volatile unsigned char **inputPendingPtrRef, EXICallback monitorCallback) {} +void EXI2_Init(volatile unsigned char** inputPendingPtrRef, EXICallback monitorCallback) +{ +} -void EXI2_EnableInterrupts(void) {} +void EXI2_EnableInterrupts(void) +{ +} -int EXI2_Poll(void) { +int EXI2_Poll(void) +{ return 0; } -AmcExiError EXI2_ReadN(void *bytes, unsigned long length) { +AmcExiError EXI2_ReadN(void* bytes, unsigned long length) +{ return AMC_EXI_NO_ERROR; } -AmcExiError EXI2_WriteN(const void *bytes, unsigned long length) { +AmcExiError EXI2_WriteN(const void* bytes, unsigned long length) +{ return AMC_EXI_NO_ERROR; } -void EXI2_Reserve(void) {} +void EXI2_Reserve(void) +{ +} -void EXI2_Unreserve(void) {} +void EXI2_Unreserve(void) +{ +} -int AMC_IsStub(void) { +int AMC_IsStub(void) +{ return 1; -} +} \ No newline at end of file diff --git a/libs/dolphin/ar/ar.c b/libs/dolphin/ar/ar.c index c3ed78946..f1b0a0b03 100644 --- a/libs/dolphin/ar/ar.c +++ b/libs/dolphin/ar/ar.c @@ -145,7 +145,7 @@ static void __ARHandler(__OSInterrupt interrupt, OSContext* context) #define RoundUP32(x) (((u32)(x) + 32 - 1) & ~(32 - 1)) -static void __ARWriteDMA(u32 mmem_addr, u32 aram_addr, u32 length) +inline void __ARWriteDMA(u32 mmem_addr, u32 aram_addr, u32 length) { u16 tmp; __DSPRegs[16] = (u16)((__DSPRegs[16] & ~0x03ff) | (u16)(mmem_addr >> 16)); @@ -168,7 +168,7 @@ static void __ARWriteDMA(u32 mmem_addr, u32 aram_addr, u32 length) __DSPRegs[5] = tmp; } -static void __ARReadDMA(u32 mmem_addr, u32 aram_addr, u32 length) +inline void __ARReadDMA(u32 mmem_addr, u32 aram_addr, u32 length) { u16 tmp; __DSPRegs[16] = (u16)((__DSPRegs[16] & ~0x03ff) | (u16)(mmem_addr >> 16)); diff --git a/libs/dolphin/ax/AXSPB.c b/libs/dolphin/ax/AXSPB.c index 9a22f943c..141bdafbd 100644 --- a/libs/dolphin/ax/AXSPB.c +++ b/libs/dolphin/ax/AXSPB.c @@ -22,7 +22,7 @@ u32 __AXGetStudio(void) return (u32)&__AXStudio; } -void __AXDepopFade(long* hostSum, long* dspVolume, s16* dspDelta) +inline void __AXDepopFade(long* hostSum, long* dspVolume, s16* dspDelta) { int frames; long delta; diff --git a/libs/dolphin/card/CARDNet.c b/libs/dolphin/card/CARDNet.c index 17d61f429..a99df9e62 100644 --- a/libs/dolphin/card/CARDNet.c +++ b/libs/dolphin/card/CARDNet.c @@ -8,38 +8,38 @@ u16 __CARDVendorID = 0xFFFF; u8 __CARDPermMask = 28; -// s32 CARDSetAttributesAsync(s32 chan, s32 fileNo, u8 attr, CARDCallback callback) -// { -// CARDDir dirent; -// s32 result; - -// if (attr & ~__CARDPermMask) -// { -// return CARD_RESULT_NOPERM; -// } - -// result = __CARDGetStatusEx(chan, fileNo, &dirent); -// if (result < 0) -// { -// return result; -// } - -// if ((CARDCheckAttr(dirent.permission, 0x20) && !CARDCheckAttr(attr, 0x20)) || -// (CARDCheckAttr(dirent.permission, 0x40) && !CARDCheckAttr(attr, 0x40))) -// { -// return CARD_RESULT_NOPERM; -// } - -// if ((CARDCheckAttr(attr, 0x20) && CARDCheckAttr(attr, 0x40)) || -// (CARDCheckAttr(attr, 0x20) && CARDCheckAttr(dirent.permission, 0x40)) || -// (CARDCheckAttr(attr, 0x40) && CARDCheckAttr(dirent.permission, 0x20))) -// { -// return CARD_RESULT_NOPERM; -// } - -// dirent.permission = attr; -// return __CARDSetStatusExAsync(chan, fileNo, &dirent, callback); -// } +s32 CARDSetAttributesAsync(s32 chan, s32 fileNo, u8 attr, CARDCallback callback) +{ + CARDDir dirent; + s32 result; + + if (attr & ~__CARDPermMask) + { + return CARD_RESULT_NOPERM; + } + + result = __CARDGetStatusEx(chan, fileNo, &dirent); + if (result < 0) + { + return result; + } + + if ((CARDCheckAttr(dirent.permission, 0x20) && !CARDCheckAttr(attr, 0x20)) || + (CARDCheckAttr(dirent.permission, 0x40) && !CARDCheckAttr(attr, 0x40))) + { + return CARD_RESULT_NOPERM; + } + + if ((CARDCheckAttr(attr, 0x20) && CARDCheckAttr(attr, 0x40)) || + (CARDCheckAttr(attr, 0x20) && CARDCheckAttr(dirent.permission, 0x40)) || + (CARDCheckAttr(attr, 0x40) && CARDCheckAttr(dirent.permission, 0x20))) + { + return CARD_RESULT_NOPERM; + } + + dirent.permission = attr; + return __CARDSetStatusExAsync(chan, fileNo, &dirent, callback); +} s32 CARDSetAttributes(s32 chan, s32 fileNo, u8 attr) { diff --git a/libs/dolphin/dsp/dsp.c b/libs/dolphin/dsp/dsp.c index 7459587bb..2d794337a 100644 --- a/libs/dolphin/dsp/dsp.c +++ b/libs/dolphin/dsp/dsp.c @@ -18,6 +18,8 @@ extern DSPTaskInfo* __DSP_tmp_task; extern DSPTaskInfo* __DSP_last_task; extern DSPTaskInfo* __DSP_first_task; extern DSPTaskInfo* __DSP_curr_task; +extern DSPTaskInfo* __DSP_rude_task; +extern s32 __DSP_rude_task_pending; extern void __DSPHandler(__OSInterrupt, OSContext*); extern void __DSP_debug_printf(const char* fmt, ...); @@ -110,6 +112,37 @@ DSPTaskInfo* DSPCancelTask(DSPTaskInfo* task) return task; } +DSPTaskInfo* DSPAssertTask(DSPTaskInfo* task) +{ + s32 old; + + old = OSDisableInterrupts(); + + if (__DSP_curr_task == task) + { + __DSP_rude_task = task; + __DSP_rude_task_pending = 1; + OSRestoreInterrupts(old); + return task; + } + + if (task->priority < __DSP_curr_task->priority) + { + __DSP_rude_task = task; + __DSP_rude_task_pending = 1; + if (__DSP_curr_task->state == 1) + { + OSDisableInterrupts(); + OSRestoreInterrupts(FALSE); + } + OSRestoreInterrupts(old); + return task; + } + + OSRestoreInterrupts(old); + return NULL; +} + #ifdef __cplusplus } #endif diff --git a/libs/dolphin/dvd/dvderror.c b/libs/dolphin/dvd/dvderror.c index 259e8a5bf..7e292e4ee 100644 --- a/libs/dolphin/dvd/dvderror.c +++ b/libs/dolphin/dvd/dvderror.c @@ -27,7 +27,7 @@ static u8 ErrorCode2Num(u32 errorCode) return 29; } -static u8 Convert(u32 error) +inline u8 Convert(u32 error) { u32 statusCode; u32 errorCode; diff --git a/libs/dolphin/dvd/dvdfs.c b/libs/dolphin/dvd/dvdfs.c index 27e75e9df..021b4d579 100644 --- a/libs/dolphin/dvd/dvdfs.c +++ b/libs/dolphin/dvd/dvdfs.c @@ -46,7 +46,7 @@ void __DVDFSInit() #define filePosition(i) (FstStart[i].parentOrPosition) #define fileLength(i) (FstStart[i].nextEntryOrLength) -static BOOL isSame(const char* path, const char* string) +inline BOOL isSame(const char* path, const char* string) { while (*string != '\0') { @@ -239,7 +239,7 @@ BOOL DVDClose(DVDFileInfo* fileInfo) return TRUE; } -static u32 myStrncpy(char* dest, char* src, u32 maxlen) +inline u32 myStrncpy(char* dest, char* src, u32 maxlen) { u32 i = maxlen; @@ -278,7 +278,7 @@ static u32 entryToPath(u32 entry, char* path, u32 maxlen) return loc; } -static BOOL DVDConvertEntrynumToPath(s32 entrynum, char* path, u32 maxlen) +inline BOOL DVDConvertEntrynumToPath(s32 entrynum, char* path, u32 maxlen) { u32 loc; @@ -310,20 +310,6 @@ BOOL DVDGetCurrentDir(char* path, u32 maxlen) return DVDConvertEntrynumToPath((s32)currentDirectory, path, maxlen); } -BOOL DVDChangeDir(char* dirName) -{ - s32 entry; - entry = DVDConvertPathToEntrynum(dirName); - if ((entry < 0) || (entryIsDir(entry) == FALSE)) - { - return FALSE; - } - - currentDirectory = (u32)entry; - - return TRUE; -} - BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, DVDCallback callback, s32 prio) { @@ -449,307 +435,3 @@ static void cbForSeekAsync(s32 result, DVDCommandBlock* block) (fileInfo->callback)(result, fileInfo); } } -/* This is based on the revolution SDK, these may not match in all cases */ -s32 DVDSeekPrio(DVDFileInfo* fileInfo, s32 offset, s32 prio) -{ - BOOL result; - DVDCommandBlock* block; - s32 state; - BOOL enabled; - s32 retVal; - - block = &(fileInfo->cb); - - result = DVDSeekAbsAsyncPrio(block, (s32)(fileInfo->startAddr + offset), cbForSeekSync, prio); - - if (result == FALSE) - { - return -1; - } - - enabled = OSDisableInterrupts(); - - while (1) - { - state = ((volatile DVDCommandBlock*)block)->state; - - if (state == DVD_STATE_END) - { - retVal = 0; - break; - } - if (state == DVD_STATE_FATAL_ERROR) - { - retVal = DVD_RESULT_FATAL_ERROR; - break; - } - if (state == DVD_STATE_CANCELED) - { - retVal = DVD_RESULT_CANCELED; - break; - } - - OSSleepThread(&__DVDThreadQueue); - } - - OSRestoreInterrupts(enabled); - return retVal; -} -/* This is based on the revolution SDK, these may not match in all cases */ -static void cbForSeekSync(s32 result, DVDCommandBlock* block) -{ - OSWakeupThread(&__DVDThreadQueue); -} - -/* This is based on the revolution SDK, these may not match in all cases */ -s32 DVDGetFileInfoStatus(DVDFileInfo* fileInfo) -{ - return DVDGetCommandBlockStatus(&fileInfo->cb); -} - -/* This is based on the revolution SDK, these may not match in all cases */ -BOOL DVDFastOpenDir(s32 entrynum, DVDDir* dir) -{ - if ((entrynum < 0) || (entrynum >= MaxEntryNum) || !entryIsDir(entrynum)) - { - return FALSE; - } - - dir->entryNum = (u32)entrynum; - dir->location = (u32)entrynum + 1; - dir->next = nextDir(entrynum); - - return TRUE; -} - -/* This is based on the revolution SDK, these may not match in all cases */ -BOOL DVDOpenDir(char* dirName, DVDDir* dir) -{ - s32 entry; - char currentDir[128]; - entry = DVDConvertPathToEntrynum(dirName); - - if (entry < 0) - { - DVDGetCurrentDir(currentDir, 128); - OSReport("Warning: DVDOpenDir(): file '%s' was not found under %s.\n", dirName, currentDir); - return FALSE; - } - - if (!entryIsDir(entry)) - { - return FALSE; - } - - dir->entryNum = (u32)entry; - dir->location = (u32)entry + 1; - dir->next = nextDir(entry); - - return TRUE; -} - -BOOL DVDReadDir(DVDDir* dir, DVDDirEntry* dirent) -{ - u32 loc = dir->location; - if ((loc <= dir->entryNum) || (dir->next <= loc)) - return FALSE; - - dirent->entryNum = loc; - dirent->isDir = entryIsDir(loc); - dirent->name = FstStringStart + stringOff(loc); - - dir->location = entryIsDir(loc) ? nextDir(loc) : (loc + 1); - - return TRUE; -} - -/* This is based on the revolution SDK, these may not match in all cases */ -BOOL DVDCloseDir(DVDDir* dir) -{ - return TRUE; -} - -/* This is based on the revolution SDK, these may not match in all cases */ -void DVDRewindDir(DVDDir* dir) -{ - dir->location = dir->entryNum + 1; -} - -/* This is based on the revolution SDK, these may not match in all cases */ -void* DVDGetFSTLocation(void) -{ - return BootInfo->FSTLocation; -} - -#define RoundUp32KB(x) (((u32)(x) + 32 * 1024 - 1) & ~(32 * 1024 - 1)) -#define Is32KBAligned(x) (((u32)(x) & (32 * 1024 - 1)) == 0) - -BOOL DVDPrepareStreamAsync(DVDFileInfo* fileInfo, u32 length, u32 offset, DVDCallback callback) -{ - u32 start; - - start = fileInfo->startAddr + offset; - - if (!Is32KBAligned(start)) - { - OSPanic( - __FILE__, 1189, - "DVDPrepareStreamAsync(): Specified start address (filestart(0x%x) + offset(0x%x)) is " - "not 32KB aligned", - fileInfo->startAddr, offset); - } - - if (length == 0) - length = fileInfo->length - offset; - - if (!Is32KBAligned(length)) - { - OSPanic( - __FILE__, 1199, - "DVDPrepareStreamAsync(): Specified length (0x%x) is not a multiple of 32768(32*1024)", - length); - } - - if (!((offset < fileInfo->length) && (offset + length <= fileInfo->length))) - { - OSPanic( - __FILE__, 1207, - "DVDPrepareStreamAsync(): The area specified (offset(0x%x), length(0x%x)) is out of " - "the file", - offset, length); - } - - fileInfo->callback = callback; - return DVDPrepareStreamAbsAsync(&(fileInfo->cb), length, fileInfo->startAddr + offset, - cbForPrepareStreamAsync); -} - -static void cbForPrepareStreamAsync(s32 result, DVDCommandBlock* block) -{ - DVDFileInfo* fileInfo; - - fileInfo = (DVDFileInfo*)((char*)block - offsetof(DVDFileInfo, cb)); - - if (fileInfo->callback) - { - (fileInfo->callback)(result, fileInfo); - } -} - -/* This is based on the revolution SDK, these may not match in all cases */ -s32 DVDPrepareStream(DVDFileInfo* fileInfo, u32 length, u32 offset) -{ - BOOL result; - DVDCommandBlock* block; - s32 state; - BOOL enabled; - s32 retVal; - u32 start; - start = fileInfo->startAddr + offset; - - if (!Is32KBAligned(start)) - { - OSPanic( - __FILE__, 0, - "DVDPrepareStream(): Specified start address (filestart(0x%x) + offset(0x%x)) is not " - "32KB aligned", - fileInfo->startAddr, offset); - } - - if (length == 0) - length = fileInfo->length - offset; - - if (!Is32KBAligned(length)) - { - OSPanic(__FILE__, 0, - "DVDPrepareStream(): Specified length (0x%x) is not a multiple of 32768(32*1024)", - length); - } - - if (!((offset <= fileInfo->length) && (offset + length <= fileInfo->length))) - { - OSPanic( - __FILE__, 0, - "DVDPrepareStream(): The area specified (offset(0x%x), length(0x%x)) is out of the file", - offset, length); - } - - block = &(fileInfo->cb); - result = DVDPrepareStreamAbsAsync(block, length, start, cbForPrepareStreamSync); - - if (result == FALSE) - { - return -1; - } - - enabled = OSDisableInterrupts(); - - while (1) - { - state = ((volatile DVDCommandBlock*)block)->state; - - if (state == DVD_STATE_END) - { - retVal = 0; - break; - } - if (state == DVD_STATE_FATAL_ERROR) - { - retVal = DVD_RESULT_FATAL_ERROR; - break; - } - if (state == DVD_STATE_CANCELED) - { - retVal = DVD_RESULT_CANCELED; - break; - } - - OSSleepThread(&__DVDThreadQueue); - } - - OSRestoreInterrupts(enabled); - return retVal; -} - -/* This is based on the revolution SDK, these may not match in all cases */ -static void cbForPrepareStreamSync(s32 result, DVDCommandBlock* block) -{ - OSWakeupThread(&__DVDThreadQueue); -} - -/* This is based on the revolution SDK, these may not match in all cases */ -s32 DVDGetTransferredSize(DVDFileInfo* fileinfo) -{ - s32 bytes; - DVDCommandBlock* cb; - - cb = &(fileinfo->cb); - - switch (cb->state) - { - case DVD_STATE_END: - case DVD_STATE_COVER_CLOSED: - case DVD_STATE_NO_DISK: - case DVD_STATE_COVER_OPEN: - case DVD_STATE_WRONG_DISK: - case DVD_STATE_FATAL_ERROR: - case DVD_STATE_MOTOR_STOPPED: - case DVD_STATE_CANCELED: - case DVD_STATE_RETRY: - bytes = (s32)cb->transferredSize; - break; - - case DVD_STATE_WAITING: - bytes = 0; - break; - - case DVD_STATE_BUSY: - bytes = (s32)(cb->transferredSize + (cb->currTransferSize - DVDLowGetLength())); - break; - - default: - break; - } - - return bytes; -} \ No newline at end of file diff --git a/libs/dolphin/dvd/dvdlow.c b/libs/dolphin/dvd/dvdlow.c index 3c2aab44b..55baa4e3f 100644 --- a/libs/dolphin/dvd/dvdlow.c +++ b/libs/dolphin/dvd/dvdlow.c @@ -50,7 +50,7 @@ void __DVDInitWA() static void Read(void* addr, u32 length, u32 offset, DVDLowCallback callback); -static BOOL ProcessNextCommand() +inline BOOL ProcessNextCommand() { s32 n = NextCommandNumber; ASSERT(n < 3); @@ -218,7 +218,7 @@ static void AlarmHandlerForTimeout(OSAlarm* alarm, OSContext* context) OSSetCurrentContext(context); } -static void SetTimeoutAlarm(OSTime timeout) +inline void SetTimeoutAlarm(OSTime timeout) { OSCreateAlarm(&AlarmForTimeout); OSSetAlarm(&AlarmForTimeout, timeout, AlarmHandlerForTimeout); @@ -249,7 +249,7 @@ static void Read(void* addr, u32 length, u32 offset, DVDLowCallback callback) } } -BOOL HitCache(DVDBuffer* cur, DVDBuffer* prev) +inline BOOL HitCache(DVDBuffer* cur, DVDBuffer* prev) { u32 uVar1 = (prev->offset + prev->length - 1) >> 15; u32 uVar2 = (cur->offset >> 15); @@ -262,7 +262,7 @@ BOOL HitCache(DVDBuffer* cur, DVDBuffer* prev) return FALSE; } -static void DoJustRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) +inline void DoJustRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) { CommandList[0].cmd = -1; NextCommandNumber = 0; @@ -293,7 +293,7 @@ static void SeekTwiceBeforeRead(void* addr, u32 length, u32 offset, DVDLowCallba DVDLowSeek(newOffset, callback); } -static void WaitBeforeRead(void* addr, u32 length, u32 offset, DVDLowCallback callback, +inline void WaitBeforeRead(void* addr, u32 length, u32 offset, DVDLowCallback callback, OSTime timeout) { CommandList[0].cmd = 1; @@ -504,16 +504,16 @@ void __DVDLowSetWAType(u32 type, u32 location) OSRestoreInterrupts(enabled); } -BOOL __DVDLowTestAlarm(OSAlarm* alarm) -{ - if (alarm == &AlarmForBreak) - { - return TRUE; - } - if (alarm == &AlarmForTimeout) - { - return TRUE; - } - - return FALSE; -} \ No newline at end of file +// BOOL __DVDLowTestAlarm(OSAlarm* alarm) +// { +// if (alarm == &AlarmForBreak) +// { +// return TRUE; +// } +// if (alarm == &AlarmForTimeout) +// { +// return TRUE; +// } + +// return FALSE; +// } \ No newline at end of file diff --git a/libs/dolphin/eth/base64.c b/libs/dolphin/eth/base64.c new file mode 100644 index 000000000..a2c6b0053 --- /dev/null +++ b/libs/dolphin/eth/base64.c @@ -0,0 +1,70 @@ +#include + +static const char Base64[] = { + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" +}; + +char *__IPEncodeToBase64(void *_src, s32 len , char *dst) { + const u8 *src; + int i; + char *p; + + src = _src; + p = dst; + for (i = 0; i < len - len % 3; i += 3) { + *p++ = Base64[(src[i+0] >> 2) & 0x3f]; + *p++ = Base64[((src[i+0] & 0x3) << 4) | ((src[i+1] >> 4) & 0xf)]; + *p++ = Base64[((src[i+1] & 0xf) << 2) | ((src[i+2] >> 6) & 0x3)]; + *p++ = Base64[src[i+2] & 0x3f]; + } + + i = len - len % 3; + // Encode remaining characters + switch (len % 3) { + case 2: { + *p++ = Base64[(src[i+0] >> 2) & 0x3f]; + *p++ = Base64[((src[i+0] & 0x3) << 4) | ((src[i+1] >> 4) & 0xf)]; + *p++ = Base64[((src[i+1] & 0xf) << 2)]; + *p++ = '='; + break; + } + case 1: { + *p++ = Base64[(src[i+0] >> 2) & 0x3f]; + *p++ = Base64[((src[i+0] & 0x3) << 4)]; + *p++ = '='; + *p++ = '='; + break; + } + } + + return p; +} + +void *__IPDecodeFromBase64(const char *src, long len , void *_dst) { + u8 *dst; + int i; + u8 *p; + + dst = _dst; + p = dst; + for (i = 0; i < len; i += 4) { + int n0; + int n1; + int n2; + int n3; + n0 = strchr(Base64, src[i+0]) - Base64; + n1 = strchr(Base64, src[i+1]) - Base64; + *p++ = (n0 << 2) | (n1 >> 4) & 0x3; + + if (src[i+2] == '=') break; + + n2 = strchr(Base64, src[i+2]) - Base64; + *p++ = ((n1 << 4) & 0xff) | (n2 >> 2) & 0xf; + + if (src[i+3] == '=') break; + + n3 = strchr(Base64, src[i+3]) - Base64; + *p++ = ((n2 << 6) & 0xff) | (n3 & 0x3f); + } + return p; +} diff --git a/libs/dolphin/eth/eth.c b/libs/dolphin/eth/eth.c new file mode 100644 index 000000000..871352662 --- /dev/null +++ b/libs/dolphin/eth/eth.c @@ -0,0 +1,1031 @@ +#include + +#include +#include +#include +#include + +#include "types.h" + +#ifdef DEBUG +const char* __ETHVersion = "<< Dolphin SDK - ETH\tdebug build: Aug 5 2003 17:18:42 (0x2301) >>"; +#else +const char* __ETHVersion = "<< Dolphin SDK - ETH\trelease build: Aug 5 2003 17:18:42 (0x2301) >>"; +#endif + +static u8 broadcastheader[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; +static u8 private_macaddr[6]; +static u8 __revid = 0; +static u16 __devid = 0xD107; +static u8 __acstart = 0x4E; +static OSThreadQueue threadQ; +static BOOL lockUpdate = FALSE; +static BOOL __sendbusy = FALSE; +static BOOL sendUpdate = FALSE; +static ETHStat ethstat; +static u16* protoarray = NULL; +static s32 protonum = 0; +static void* (*recvcallback0)(u16, s32, u8) = NULL; +static void (*recvcallback1)(u8*, s32) = NULL; +static BOOL recvcallbackUpdate = FALSE; +static void (*__sendcallback)(u8) = NULL; +static BOOL __recvpriorityflag = FALSE; +static u8* __sendadr = NULL; +static s32 __sendlen = 0; +static s32 __senddmalen = 0; +static s32 __sendimmlen = 0; +static u8 tmppool0[1536] ATTRIBUTE_ALIGN(32); +static u8 tmppool1[1536] ATTRIBUTE_ALIGN(32); +static u32 recvlen0 = 0; +static u32 recvlen1 = 0; + +typedef struct Descriptor { + u8 nextpacketL; + u8 packetlengthL : 4; + u8 nextpacketH : 4; + u8 packetLengthH; + u8 status; +} Descriptor; + +typedef struct Descriptor2 { + u16 nextpacket; + u16 packetlength; + u8 status; +} Descriptor2; + +static Descriptor2 d2; + +static u8* recvaddr = NULL; +static u16 rwp = 0; +static u16 rrp = 0; +static u8 mcastmap[8]; +static BOOL mcastUpdate = FALSE; + + +static BOOL lock(void); +static void unlock(void); + +static void recvsub0(void); +static void recvsub1(void); + +static void sendsub0(void); +static void sendsub1(s32 chan, OSContext* context); + +static void readbuffer0(u16 cmd); +static void readbuffer1(s32 chan, OSContext* context); +static void readbuffersub(s32 chan, OSContext* context); + +static void exiinthandler(s32 chan, OSContext* context); + +static inline u16 swap16(u16 val) { + u16 ret = __lhbrx(&val, 0); + return ret; +} + +static inline u8 higher(u16 val) { + return (val >> 8) & 0xff; +} + +static inline u8 lower(u16 val) { + return val & 0xff; +} + +static void waitexilock(void) { + BOOL enabled; + + enabled = OSDisableInterrupts(); + while (TRUE) { + if (lock() != FALSE) { + OSRestoreInterrupts(enabled); + return; + } + + lockUpdate = TRUE; + OSSleepThread(&threadQ); + OSRestoreInterrupts(enabled); + } +} + +static void waitmicro(s32 usec) { + OSTick start; + OSTick interval; + + start = OSGetTick(); + interval = OSMicrosecondsToTicks(usec); + + while (TRUE) { + if (OSGetTick() - start >= interval) { + break; + } + } +} + +static u8 readEXIcmd(u8 cmd) { + u16 ethcmd; + u8 rdata; + + ethcmd = 0x0000 | (cmd << 8); + EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImm(0, &rdata, sizeof(rdata), EXI_READ, NULL); + EXISync(0); + EXIDeselect(0); + return rdata; +} + +static u8 readEXIcmdWait200Micro(u8 cmd) { + u16 ethcmd; + u8 rdata; + + ethcmd = 0x0000 | (cmd << 8); + EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImm(0, &rdata, sizeof(rdata), EXI_READ, NULL); + EXISync(0); + waitmicro(200); + EXIDeselect(0); + return rdata; +} + +static void writeEXIcmd(u8 cmd, u8 imr) { + BOOL ret; + u16 ethcmd; + + ethcmd = 0x4000 | (cmd << 8); + ret = EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImm(0, &imr, sizeof(imr), EXI_WRITE, NULL); + EXISync(0); + EXIDeselect(0); +} + +static void readEXIcmdLong(u8 cmd, void* address, s32 length) { + u16 ethcmd; + + ethcmd = cmd << 8; + EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImmEx(0, address, length, EXI_READ); + EXIDeselect(0); +} + +static void writeEXIcmdLong(u8 cmd, void* address, s32 length) { + BOOL ret; + u16 ethcmd; + + ethcmd = 0x4000 | (cmd << 8); + ret = EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImmEx(0, address, length, EXI_WRITE); + EXIDeselect(0); +} + +static void readcmdLong(u16 cmd, void* addr, s32 length) { + u32 ethcmd; + + ethcmd = 0x80000000 | (cmd << 8); + EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImmEx(0, addr, length, EXI_READ); + EXIDeselect(0); +} + +static void writecmdLong(u16 cmd, void* addr, s32 length) { + u32 ethcmd = 0xC0000000 | (cmd << 8); + EXISelect(0, 2, 5); + EXIImm(0, ðcmd, sizeof(ethcmd), EXI_WRITE, NULL); + EXISync(0); + EXIImmEx(0, addr, length, EXI_WRITE); + EXIDeselect(0); +} + +static u8 readcmd(u16 cmd) { + u8 val; + + readcmdLong(cmd, &val, sizeof(val)); + return val; +} + +static void writecmd(u16 cmd, u8 val) { + writecmdLong(cmd, &val, sizeof(val)); +} + +static void StaOutput(unsigned int bit) { + writecmd(0x0060, bit * 2); + writecmd(0x0060, 8 + bit * 2); + writecmd(0x0060, 8 + bit * 2); + writecmd(0x0060, bit * 2); +} + +static u8 StaInput(void) { + unsigned char bit; + + writecmd(0x0060, 0x0C); + bit = readcmd(0x0060); + bit &= 1; + writecmd(0x0060, 0x04); + writecmd(0x0060, 0x04); + return bit; +} + +static u16 PhyRead(unsigned int regNo) { + int i; + u16 value; + + /* Clear command */ + for (i = 0; i < 32; i++) { + StaOutput(1); + } + + /* Enter read mode */ + StaOutput(0); + StaOutput(1); + StaOutput(1); + StaOutput(0); + StaOutput(0); + StaOutput(0); + StaOutput(0); + StaOutput(0); + StaOutput(0); + + /* Set register */ + StaOutput((regNo >> 4) & 1); + StaOutput((regNo >> 3) & 1); + StaOutput((regNo >> 2) & 1); + StaOutput((regNo >> 1) & 1); + StaOutput((regNo >> 0) & 1); + writecmd(0x0060, 4); + value = StaInput(); + value = StaInput(); + + /* Read value */ + value = 0; + for (i = 0; i < 16; i++) { + value = value + (StaInput() << (15 - i)); + } + + /* Clear command */ + for (i = 0; i < 32; i++) { + StaOutput(1); + } + + return value; +} + +static void PhyWrite(unsigned int regNo, u16 value) { + int i; + + /* Clear command */ + for (i = 0; i < 32; i++) { + StaOutput(1); + } + + /* Enter write mode */ + StaOutput(0); + StaOutput(1); + StaOutput(0); + StaOutput(1); + StaOutput(0); + StaOutput(0); + StaOutput(0); + StaOutput(0); + StaOutput(0); + + /* Set register */ + StaOutput((regNo >> 4) & 1); + StaOutput((regNo >> 3) & 1); + StaOutput((regNo >> 2) & 1); + StaOutput((regNo >> 1) & 1); + StaOutput((regNo >> 0) & 1); + + StaOutput(1); + StaOutput(0); + + /* Write value */ + for (i = 0; i < 16; i++) { + StaOutput((u8)((value >> (15 - i)) & 1)); + } + + /* Clear command */ + for (i = 0; i < 32; i++) { + StaOutput(1); + } +} + +static void reset(void) { + writecmd(0x0060, 0); + waitmicro(10000); + readEXIcmdWait200Micro(0x0F); + waitmicro(10000); + writecmd(0x0000, 1); + writecmd(0x0000, 0); +} + +static void recvinit(void) { + u8 ncrb; + u16 swapped; + + swapped = higher(0x0001) | (lower(0x0001) << 8); + writecmdLong(0x000A, &swapped, sizeof(swapped)); + writecmdLong(0x0016, &swapped, sizeof(swapped)); + writecmdLong(0x0018, &swapped, sizeof(swapped)); + + swapped = higher(0x000F) | (lower(0x000F) << 8); + writecmdLong(0x001A, &swapped, sizeof(swapped)); + + ncrb = readcmd(0x0001); + ncrb &= ~0b00000011; // ~3 + ncrb |= 0b00010000; // | 0x10 + writecmd(0x0001, ncrb); + writecmd(0x0000, 0x08); + writecmd(0x0032, 0x08); +} + +static void getdescriptor(u16 address) { + Descriptor d; + + readcmdLong(address, &d, sizeof(d)); + d2.nextpacket = (d.nextpacketH << 8) | d.nextpacketL; + d2.packetlength = (d.packetLengthH << 4) | d.packetlengthL; + d2.status = d.status; +} + +static u16 readcmd16(u8 cmd) { + u16 tmp16; + + readcmdLong(cmd, &tmp16, sizeof(tmp16)); + + return swap16(tmp16); +} + +static void writecmd16(u8 cmd, u16 val) { + u16 tmp16; + + tmp16 = swap16(val); + writecmdLong(cmd, &tmp16, sizeof(tmp16)); +} + +static void recvsub0(void) { + rwp = readcmd16(0x16); + rrp = readcmd16(0x18); + recvsub1(); +} + +static void recvsub1(void) { + u16 packettype; + s32 i; + u8 lrps; + u16 address; + + recvlen0 = recvlen1 = 0; + do { + while (rrp != rwp) { + address = (rrp & 0xFF) << 8; + getdescriptor(address); + readcmdLong(address + 0x10U, &packettype, sizeof(packettype)); + + if (protonum > 0) { + for (i = 0; i < protonum; i++) { + if (packettype == protoarray[i]) { + break; + } + } + + if (i == protonum) { + goto update_pointers; + } + } + + if (recvcallback0) { + lrps = d2.status; + recvaddr = (*recvcallback0)(packettype, d2.packetlength, lrps); + + if (recvaddr != NULL) { + if (address + 4U + d2.packetlength > 0x1000U) { + recvlen1 = address - 0x0FFCU + d2.packetlength; + recvlen0 = d2.packetlength - recvlen1; + } else { + recvlen0 = d2.packetlength; + recvlen1 = 0; + } + + readbuffer0(address + 4U); + return; + } + } + +update_pointers: + rrp = d2.nextpacket; + rwp = readcmd16(0x16); + } + + writecmd16(0x18, rwp); + writecmd(0x0009, 0x02); + rwp = readcmd16(0x16); + rrp = readcmd16(0x18); + } while (rwp != rrp); + + writeEXIcmd(0x02, 0xF8); + unlock(); +} + +static void readbuffer0(u16 cmd) { + u32 etcmd; + u32 length; + + length = OSRoundUp32B(recvlen0); + etcmd = 0x80000000 | (cmd << 8); + + EXISelect(0, 2, 5); + EXIImm(0, &etcmd, sizeof(etcmd), EXI_WRITE, NULL); + EXISync(0); + EXIDma(0, tmppool0, length, EXI_READ, recvlen1 != 0 ? &readbuffersub : &readbuffer1); +} + +static void readbuffersub(s32 chan, OSContext* context) { + u32 etcmd; + u32 length; + + length = OSRoundUp32B(recvlen1); + EXIDeselect(0); + + etcmd = 0x80000000 | (0x0100 << 8); + EXISelect(0, 2, 5); + EXIImm(0, &etcmd, sizeof(etcmd), EXI_WRITE, NULL); + EXISync(0); + EXIDma(0, tmppool1, length, EXI_READ, readbuffer1); + __ETHInterruptTime = OSGetTime() - __OSLastInterruptTime; +} + +static void readbuffer1(s32 chan, OSContext* context) { + EXIDeselect(0); + + DCInvalidateRange(tmppool0, OSRoundUp32B(recvlen0)); + if (recvlen1 != 0) { + DCInvalidateRange(tmppool1, OSRoundUp32B(recvlen1)); + } + + if (recvcallback1) { + memcpy(recvaddr, tmppool0, recvlen0); + if (recvlen1 != 0) { + memcpy(recvaddr + recvlen0, tmppool1, recvlen1); + } + __ETHFilter(recvaddr, d2.packetlength); + (*recvcallback1)(recvaddr, d2.packetlength); + } + + rrp = d2.nextpacket; + rwp = readcmd16(0x16); + recvsub1(); + __ETHInterruptTime = OSGetTime() - __OSLastInterruptTime; +} + +#include + +static void patchthru(void) { + u32 rnda; + u32 fa; + + writeEXIcmd(0x05, __acstart); + readEXIcmdLong(0x08, &rnda, sizeof(rnda)); + fa = hashfunc(rnda); + writeEXIcmdLong(0x09, &fa, sizeof(fa)); +} + +static void exiinthandler(s32 chan, OSContext* context) { + u8 ir; + u8 exiisr; + BOOL ret; + BOOL sendcbflag; + u8 ltps; + u8 lrps; + u8 result; + void (*callback)(u8); + + sendcbflag = FALSE; + ret = EXILock(0, 2, &exiinthandler); + if (ret != FALSE) { + exiisr = readEXIcmd(0x03); + writeEXIcmd(0x02, 0x00); + + switch (__cntlzw(exiisr)) { + case 0x18: { + writeEXIcmd(0x03, 0x80); + break; + } + + case 0x1A: { + writeEXIcmd(0x03, 0x20); + writeEXIcmd(0x02, 0xF8); + unlock(); + #ifdef DEBUG + OSPanic(__FILE__, 765, "exi cmderr\n"); + #endif + return; + } + + case 0x19: { + writeEXIcmd(0x03, 0x40); + writeEXIcmd(0x02, 0xF8); + unlock(); + return; + } + + case 0x1B: { + patchthru(); + writeEXIcmd(0x03, 0x10); + writeEXIcmd(0x02, 0xF8); + unlock(); + return; + } + + case 0x1C: { + result = readEXIcmd(0x0B); + writeEXIcmd(0x03, 0x08); + writeEXIcmd(0x02, 0xF8); + unlock(); + + if (result != 1) { + #ifdef DEBUG + OSPanic(__FILE__, 785, "ETHLIB: hash func error\n"); + #endif + } + + return; + } + } + + ir = readcmd(0x0009); + if (__recvpriorityflag == TRUE && (ir & 2) != 0) { + ethstat.rcvcount++; + recvsub0(); + __ETHInterruptTime = OSGetTime() - __OSLastInterruptTime; + } else { + switch (__cntlzw(ir)) { + case 0x18: { + ethstat.rbf++; + writecmd(0x0009, 0x80); + break; + } + + case 0x19: { + writecmd(0x0009, 0x40); + break; + } + + case 0x1A: { + ethstat.fifoe++; + writecmd(0x0009, 0x20); + break; + } + + case 0x1B: { + ethstat.te++; + //ASSERTLINE(816, __sendbusy); + __sendbusy = FALSE; + ltps = readcmd(0x0004); + + if ((ltps & 0x10) != 0) { + ethstat.tx_crs++; + } + + if ((ltps & 0x20) != 0) { + ethstat.tx_uf++; + } + + if ((ltps & 0x40) != 0) { + ethstat.tx_owc++; + } + + sendcbflag = TRUE; + writecmd(0x0009, 0x10); + break; + } + + case 0x1C: { + ethstat.re++; + + lrps = readcmd(0x0005); + if ((lrps & 1) != 0) { + ethstat.rx_bf++; + } + + if ((lrps & 2) != 0) { + ethstat.rx_crc++; + } + + if ((lrps & 4) != 0) { + ethstat.rx_fae++; + } + + if ((lrps & 8) != 0) { + ethstat.rx_fo++; + } + + if ((lrps & 0x10) != 0) { + ethstat.rx_rw++; + } + + if ((lrps & 0x40) != 0) { + ethstat.rx_rf++; + } + + writecmd(0x0009, 0x08); + break; + } + + case 0x1D: { + //ASSERTLINE(868, __sendbusy); + ethstat.sendcount++; + __sendbusy = FALSE; + sendcbflag = TRUE; + ltps = readcmd(0x0004); + writecmd(0x0009, 0x04); + break; + } + + case 0x1E: { + ethstat.rcvcount++; + recvsub0(); + return; + } + + case 0x1F: { + ethstat.cntof++; + writecmd(0x0009, 0x01); + break; + } + } + + writeEXIcmd(0x02, 0xF8); + unlock(); + + if (sendcbflag) { + callback = __sendcallback; + __sendcallback = NULL; + __ETHPostSend(ltps, callback, __sendadr); + } + + __ETHInterruptTime = OSGetTime() - __OSLastInterruptTime; + } + } +} + +s32 ETHInit(s32 mode) { + static BOOL initialized = FALSE; + u32 cid; + u8 fcsr; + u8 phy0r; + + if (initialized == FALSE) { + initialized = TRUE; + OSRegisterVersion(__ETHVersion); + } + + OSInitThreadQueue(&threadQ); + __SIRegs[15] = __SIRegs[15] & ~0x80000000; // turn on 32MHz EXI clock setting allowance + waitexilock(); + __sendbusy = FALSE; + memset(ðstat, 0, sizeof(ethstat)); + protoarray = NULL; + protonum = 0; + recvcallback0 = NULL; + recvcallback1 = NULL; + + cid = 0; + EXIGetID(0, 2, &cid); + if (cid != EXI_ETHER) { + unlock(); + OSReport("cid = %08x\n", cid); + return -1; + } else { + reset(); + readcmdLong(0x0020, private_macaddr, sizeof(private_macaddr)); + __revid = readEXIcmd(0x01); + writeEXIcmdLong(0x04, &__devid, sizeof(__devid)); + writeEXIcmd(0x05, __acstart); + + fcsr = readcmd(0x005B); + fcsr &= ~0x80; + writecmd(0x005B, fcsr); + writecmd(0x005E, 0x01); + + phy0r = readcmd(0x005C); + phy0r |= 0x04; + writecmd(0x005C, phy0r); + + writecmd(0x0001, 0x00); + writecmd(0x0003, 0x2E); + writecmd(0x0050, 0x80); + writecmd(0x0008, 0x00); + writeEXIcmd(0x02, 0xF8); + EXISetExiCallback(2, (EXICallback)&exiinthandler); + unlock(); + + return ETH_OK; + } +} + +void ETHSendAsync(void* addr, s32 length, void (*callback2)(u8)) { + BOOL disabled; + + //ASSERTLINE(985, !__sendbusy); + //ASSERTLINE(986, ((u32) addr % 32) == 0); + DCStoreRange(addr, length); + + disabled = OSDisableInterrupts(); + __sendbusy = TRUE; + __sendadr = addr; + __sendlen = length < 60 ? 60 : length; + __sendcallback = callback2; + sendUpdate = TRUE; + + if (lock()) { + unlock(); + } + + OSRestoreInterrupts(disabled); +} + +static void sendsub0(void) { + u32 etcmd; + + __senddmalen = OSRoundDown32B(__sendlen); + __sendimmlen = __sendlen - __senddmalen; + + etcmd = 0xC0000000 | (0x0048 << 8); + EXISelect(0, 2, 5); + EXIImm(0, &etcmd, sizeof(etcmd), EXI_WRITE, NULL); + EXISync(0); + EXIDma(0, __sendadr, __senddmalen, EXI_WRITE, &sendsub1); +} + +static void sendsub1(s32 chan, OSContext* context) { + u8 ncra; + + if (__sendimmlen != 0) { + EXIImmEx(0, __sendadr + __senddmalen, __sendimmlen, EXI_WRITE); + } + + EXIDeselect(0); + ncra = readcmd(0x0000); + //ASSERTLINE(1033, (ncra & ME_NCRA_TXFIFO) == 0); + ncra |= ME_NCRA_TXFIFO; + writecmd(0x0000, ncra); + unlock(); +} + +void ETHGetMACAddr(u8* macaddr) { + memcpy(macaddr, private_macaddr, sizeof(private_macaddr)); +} + +void ETHSetMACAddr(u8* macaddr) { + memcpy(private_macaddr, macaddr, sizeof(private_macaddr)); + waitexilock(); + writecmdLong(0x0020, private_macaddr, sizeof(private_macaddr)); + unlock(); +} + +void ETHSetRecvCallback(void* (*cb0)(u16, s32, u8), void (*cb1)(u8*, s32)) { + BOOL disabled; + + disabled = OSDisableInterrupts(); + recvcallback0 = cb0; + recvcallback1 = cb1; + recvcallbackUpdate = TRUE; + + if (lock()) { + unlock(); + } + + OSRestoreInterrupts(disabled); +} + +static BOOL linkState(void) { + u8 nways; + + nways = readcmd(0x0031); + if ((nways & 1) != 0 || (nways & 2) != 0) { + return TRUE; + } + + return FALSE; +} + +static BOOL ETHGetLinkState(void) { + BOOL ret; + + waitexilock(); + ret = linkState(); + unlock(); + return ret; +} + +static BOOL linkStateAsyncMain(BOOL* linkstateptr) { + if (EXILock(0, 2, NULL)) { + *linkstateptr = linkState(); + unlock(); + return TRUE; + } + + return FALSE; +} + +BOOL ETHGetLinkStateAsync(BOOL* status) { + //ASSERTLINE(1104, status); + return linkStateAsyncMain(status); +} + +s32 ETHGetNWAYMode(void) { + u8 nways; + + waitexilock(); + nways = readcmd(0x0031); + unlock(); + + if ((nways & 0x10) != 0) { + return 1; + } + + if ((nways & 0x20) != 0) { + return 2; + } + + if ((nways & 0x40) != 0) { + return 3; + } + + if ((nways & 0x80) != 0) { + return 4; + } + + return 5; +} + +void ETHSetProtoType(u16* array, s32 num) { + BOOL flag; + + //ASSERTLINE(1139, (num != 0 && array != NULL) || (num == 0 && array == NULL)); + flag = OSDisableInterrupts(); + protoarray = array; + protonum = num; + OSRestoreInterrupts(flag); +} + +void ETHGetStatus(ETHStat* stat) { + BOOL flag; + + //ASSERTLINE(1150, stat); + flag = OSDisableInterrupts(); + *stat = ethstat; + OSRestoreInterrupts(flag); +} + +s32 ETHGetLibraryVersion(void) { + return 0x506; +} + +s32 ETHGetBBAType(void) { + return 2; +} + +static u16 HashIndex(const u8* address) { + u32 crc; + u16 index; + u32 msb; + u8 byte; + s32 byteLen; + s32 bit; + s32 shift; + + crc = 0xFFFFFFFF; + index = 0; + + for (byteLen = 0; byteLen < 6; byteLen++, address++) { + byte = *address; + bit = 0; + for (bit = 0; bit < 8; bit++, byte >>= 1) { + msb = (crc >> 31) & 1; + crc = crc << 1; + + if (msb ^ (byte & 1)) { + crc ^= 0x04C11DB6; + crc |= 1; + } + } + } + + bit = 31; + for (shift = 5; shift >= 0; shift--, bit--) { + index |= ((crc >> bit) & 1) << shift; + } + + return index; +} + +void ETHAddMulticastAddress(const u8* macaddr) { + BOOL disabled; + u16 index; + u8 marNo; + u8 bitNo; + u8 ncrb; + + if (memcmp(macaddr, broadcastheader, sizeof(broadcastheader)) == 0) { + waitexilock(); + ncrb = readcmd(0x0001); + ncrb |= 4; + writecmd(0x0001, ncrb); + unlock(); + } else { + index = HashIndex(macaddr); + marNo = index / 8; + bitNo = index % 8; + disabled = OSDisableInterrupts(); + mcastmap[marNo] |= 1 << bitNo; + mcastUpdate = TRUE; + + if (lock()) { + unlock(); + } + + OSRestoreInterrupts(disabled); + } +} + +void ETHChangeIntPriority(BOOL flag) { + __recvpriorityflag = flag; +} + +u32 ETHGetREVID(void) { + u32 revid; + + waitexilock(); + revid = readEXIcmd(0x01); + unlock(); + return revid; +} + +void ETHClearMulticastAddresses(void) { + BOOL disabled; + + disabled = OSDisableInterrupts(); + memset(mcastmap, 0, sizeof(mcastmap)); + mcastUpdate = TRUE; + if (lock()) { + unlock(); + } + OSRestoreInterrupts(disabled); +} + +static void unlockcallback(s32 chan, OSContext* context) { + if (lock()) { + unlock(); + } +} + +static BOOL lock() { + return EXILock(0, 2, &unlockcallback); +} + +static void unlock(void) { + BOOL disabled; + + disabled = OSDisableInterrupts(); + + if (mcastUpdate) { + mcastUpdate = FALSE; + writecmdLong(0x0026, mcastmap, sizeof(mcastmap)); + } + + if (recvcallbackUpdate) { + recvcallbackUpdate = FALSE; + + if (recvcallback0 == NULL) { + writecmd(0x0000, 0x00); + writecmd(0x0008, 0x14); + } else { + //ASSERTLINE(1308, recvcallback0 != NULL && recvcallback1 != NULL); + writecmd(0x0008, 0xFF); + recvinit(); + } + } + + if (sendUpdate) { + sendUpdate = FALSE; + sendsub0(); + } else { + EXIUnlock(0); + if (lockUpdate) { + lockUpdate = FALSE; + OSWakeupThread(&threadQ); + } + } + + OSRestoreInterrupts(disabled); +} diff --git a/libs/dolphin/eth/ethsec.c b/libs/dolphin/eth/ethsec.c new file mode 100644 index 000000000..b86953b5e --- /dev/null +++ b/libs/dolphin/eth/ethsec.c @@ -0,0 +1,344 @@ +#include +#include +#include +#include +#include + +#include + +#define IP_MIN_HLEN (s32)sizeof(IPHeader) +#define TCP_MIN_HLEN (s32)sizeof(TCPHeader) + +static TCPResetInfo Ri; +static u8 SendBuf[82]; +static const u8 NintendoAddr[6] = { 0,9,191,0,0,0 }; + +extern u32 __OSGetDIConfig(void); +vu16 __OSDeviceCode : (OS_BASE_CACHED | 0x30E6); + +static inline BOOL CheckConsoleType() { + if (__OSGetDIConfig() == 0xFF) { + switch (__OSDeviceCode) { + case 0x8200: { + return TRUE; + } + case 0x8001: { + if (OSGetPhysicalMemSize() == 0x3000000) { + return TRUE; + } + return FALSE; + } + } + return FALSE; + } + + if ((OSGetConsoleType() & OS_CONSOLE_MASK) == 0) { + return FALSE; + } + + return TRUE; +} + +static s16 AT_IP4_IsMyAddrMask(u8 val) { return 0; } + +/*static inline BOOL IPIsLocalAddr(u32, const u8 *addr) { + return AT_IP4_IsMyAddrMask(*addr) != -1; +}*/ + +static u16 CalcIpCheckSum(IPHeader *ip) { + int len; + u32 sum; + u16 *p; + + sum = 0; + len = (ip->verlen & 0xf) << 2; + p = (u16*)ip; + + while (len > 0) { + sum += *p++; + len -= 2; + } + + sum = (sum & 0xffff) + (sum >> 16); + sum = ((sum & 0xffff) + (sum >> 16)); + return sum ^ 0xffff; +} + +static u16 CalcTcpCheckSum(IPHeader *ip, s32 len) { + s32 hlen; + u16 *p; + u32 sum = 0; + +#line 212 + ASSERT(IP_MIN_HLEN + TCP_MIN_HLEN <= len); +#line 215 + ASSERT(ip->proto == IP_PROTO_TCP); + + hlen = (ip->verlen & 0xf) << 2; + sum += ((u16*)ip->src)[0]; + sum += ((u16*)ip->src)[1]; + sum += ((u16*)ip->dst)[0]; + sum += ((u16*)ip->dst)[1]; + sum += 6; + sum += (u32)len - (u32)hlen; + + p = (u16*)((u32)ip+hlen); + len = len - hlen; + while (len > 1) { + sum += *p++; + len -= 2; + } + + if (len == 1) { + sum += *((u8*)p) * 0x100; + } + + sum = (sum & 0xffff) + (sum >> 16); + sum = (sum & 0xffff) + (sum >> 16); + return sum ^ 0xffff; +} + +static s32 GetTcpSegLen(IPHeader *ip, TCPHeader *tcp) { + s32 len = ip->len - ((ip->verlen & 0xf) << 2) - (s32)(((tcp->flag & 0xf000) >> 10)); + + if (tcp->flag & 2) { + len += 1; + } + + if (tcp->flag & 1) { + len += 1; + } + + return len; +} + +static BOOL VerifyPacket(IPHeader *ip) { + if(ip->verlen >> 4 != 4 || ip->len < ((ip->verlen & 0xf) << 2)) { + return TRUE; + } + + if (CalcIpCheckSum(ip) != 0) { + return TRUE; + } + + if ((ip->dst[0] & 0xf0) == 0xe0 || (ip->src[0] & 0xf0) == 0xe0 || + (ip->dst[0] & 0xf8) == 0xf0 || (ip->src[0] & 0xf8) == 0xf0) { + return TRUE; + } + + ASSERT(ip->proto == IP_PROTO_TCP); + if (CalcTcpCheckSum(ip, ip->len) != 0) { + return TRUE; + } + + return FALSE; +} + +static void CalcDigest(u8 *digest, TCPHeader *tcp) { + MD5Context context; + u64 secret; + + MD5Init(&context); + MD5Update(&context,(u8*)&tcp->seq,sizeof(tcp->seq)); + MD5Update(&context,(u8*)&tcp->ack,sizeof(tcp->ack)); + + secret = ((tcp->seq ^ tcp->ack) * 0x5DEECE66Dll + 0xb) % 0x1000000000000ll; + MD5Update(&context,(u8 *)&secret + 2, sizeof(secret) - 2); + MD5Final(digest,&context); +} + +BOOL __ETHFilter(u8 *buf, s32 len) { + ETHHeader *eh; + IPHeader *ip; + TCPHeader *tcp; + TCPResetInfo *ri; + u8 digest1[16]; + u8 digest2[16]; + + ri = &Ri; + if (CheckConsoleType()) { + return TRUE; + } + + eh = (ETHHeader *)buf; + if (eh->type != 0x800) { + return TRUE; + } + + if (memcmp(eh->src, NintendoAddr, 3) == 0) { + return TRUE; + } + + len = len - sizeof(ETHHeader); + ip = (IPHeader *)(eh + 1); + if (len < IP_MIN_HLEN || len < ip->len) { + return TRUE; + } + + if(ip->proto != IP_PROTO_TCP) { + return TRUE; + } + + tcp = (TCPHeader *)((u32)ip + ((ip->verlen & 0xf) << 2)); + if ((s32)(((tcp->flag & 0xf000) >> 10)) < TCP_MIN_HLEN) { + return TRUE; + } + + if (ip->len < ((ip->verlen & 0xf) << 2) + (s32)(((tcp->flag & 0xf000) >> 10))) { + return TRUE; + } + + if ((tcp->flag & 3) == 2) { + switch(tcp->src) { + case 0x76c: + case 0x35: + return TRUE; + } + + switch (tcp->dst) { + case 0x76c: + return TRUE; + } + + if (IPIsLocalAddr(0, ip->src) == FALSE) { + return TRUE; + } + + if (tcp->flag & 4) { + return TRUE; + } + + if (VerifyPacket(ip)) { + return TRUE; + } + + if (ri->flag == 0) { + memmove(ri->addr, eh->src, sizeof(ri->addr)); + memmove(ri->dstAddr, ip->dst, sizeof(ri->dstAddr)); + memmove(ri->srcAddr, ip->src, sizeof(ri->dstAddr)); + ri->dstPort = tcp->dst; + ri->srcPort = tcp->src; + + if ((tcp->flag & 0x10) == 0) { + ri->seq = 0; + ri->ack = tcp->seq + GetTcpSegLen(ip, tcp); + ri->flag = (0x10 | 0x2 | 0x1); + } + else { + ri->seq = tcp->ack; + ri->ack = 0; + ri->flag = (0x2 | 0x1); + } + ri->id = 0; + return TRUE; + } + ip->len = 0; + return FALSE; + } + + if ((tcp->flag & 3) == 3) { + if ((s32)(((tcp->flag & 0xf000) >> 10)) != TCP_MIN_HLEN) { + return TRUE; + } + + if (ip->len != 0x40) { + return TRUE; + } + + if (IPIsLocalAddr(0, ip->src) == FALSE) { + return TRUE; + } + + if (VerifyPacket(ip)) { + return TRUE; + } + + CalcDigest(digest1, tcp); + __IPDecodeFromBase64(tcp + 1, 0x18, digest2); + + if (memcmp(digest1, digest2, sizeof(digest1))) { + return TRUE; + } + ip->len = 0; + return FALSE; + } + return TRUE; +} + +BOOL __ETHPostSend(u8 ltps , void (*callback)(u8), void *prev) { + ETHHeader *eh; + IPHeader *ip; + TCPHeader *tcp; + TCPResetInfo *ri; + u8 digest[16]; + + ri = &Ri; + + if (ri->flag == 0) { + ri = NULL; + } + else if (prev != SendBuf) { + eh = prev; + ip = (IPHeader *)(eh + 1); + tcp = (TCPHeader *)(ip + 1); + if (*((u32*)ip->dst) == *((u32*)ri->srcAddr) && *((u32*)ip->src) == *((u32*)ri->dstAddr) + && tcp->src == ri->dstPort && tcp->dst == ri->srcPort) { + + if (tcp->flag & 4) { + ri->flag = 0; + ri = NULL; + } + else { + ri->seq = tcp->seq + GetTcpSegLen(ip, tcp); + ri->ack = tcp->ack; + ri->flag |= tcp->flag & 0x10; + + ri->id = ip->id - 0x4000; + if (ri->id == 0) { + ri->id = 1; + } + } + } + } + + if (ri != NULL && ri->id != 0) { + eh = (ETHHeader *)SendBuf; + ip = (IPHeader *)(eh + 1); + eh->type = 0x800; + memmove(SendBuf, ri, 6); + ETHGetMACAddr(eh->src); + + ip->verlen = 0x45; + ip->tos = 0; + ip->len = 0x40; + ip->id = ri->id; + ip->frag = 0x4000; + ip->ttl = 0xff; + ip->proto = IP_PROTO_TCP; + ip->sum = 0; + memmove(ip->dst, ri->srcAddr, sizeof(ip->dst)); + memmove(ip->src, ri->dstAddr, sizeof(ip->src)); + + + tcp = (TCPHeader *)((u32)ip + ((ip->verlen & 0xf) << 2)); + tcp->src = ri->dstPort; + tcp->dst = ri->srcPort; + tcp->seq = ri->seq; + tcp->ack = ri->ack; + tcp->flag = ri->flag & 0x3f | 0x5000; + tcp->win = 0; + tcp->sum = 0; + tcp->urg = 0; + + CalcDigest(digest, tcp); + __IPEncodeToBase64(digest, sizeof(digest), tcp + 1); + ip->sum = CalcIpCheckSum(ip); + tcp->sum = CalcTcpCheckSum(ip, ip->len); + ri->flag = 0; + ETHSendAsync(SendBuf, 0x4e, callback); + } + else if (callback) { + (*callback)(ltps); + } + return ETH_OK; +} diff --git a/libs/dolphin/eth/md5.c b/libs/dolphin/eth/md5.c new file mode 100644 index 000000000..11c6c616d --- /dev/null +++ b/libs/dolphin/eth/md5.c @@ -0,0 +1,285 @@ +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +#include +#include + +/* Constants for MD5Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform (u32 state[4], u8 block[64]); +static void Encode(u8* output, u32* input, u32 len); +static void Decode(u32* output, u8* input, u32 len); + +static u8 PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (u32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (u32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (u32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (u32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init(MD5_CTX *context) +/* context: context */ +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update(MD5_CTX *context, u8 *input, u32 inputLen) +/* context: context */ +/* input: input block */ +/* inputlen: length of input block */ +{ + u32 i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (u32)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((u32)inputLen << 3)) < ((u32)inputLen << 3)) + context->count[1]++; + context->count[1] += ((u32)inputLen >> 29); + partLen = 64 - index; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + memcpy(&context->buffer[index], input, partLen); + MD5Transform(context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) { + MD5Transform (context->state, &input[i]); + } + + index = 0; + } else { + i = 0; + } + + /* Buffer remaining input */ + memcpy(&context->buffer[index], &input[i], inputLen - i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void MD5Final(u8 digest[16], MD5_CTX *context) +/* digest: message digest */ +/* context: context */ +{ + u8 bits[8]; + u32 index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + index = (u32)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. */ + memset(context, 0, sizeof(*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (u32 state[4], u8 block[64]) +{ + u32 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. */ + memset(x, 0, sizeof(x)); +} + +/* Encodes input (u32) into output (u8). Assumes len is + a multiple of 4. + */ +static void Encode(u8* output, u32* input, u32 len) +{ + u32 i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (u8)(input[i] & 0xff); + output[j+1] = (u8)((input[i] >> 8) & 0xff); + output[j+2] = (u8)((input[i] >> 16) & 0xff); + output[j+3] = (u8)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (u8) into output (u32). Assumes len is + a multiple of 4. + */ +static void Decode(u32* output, u8* input, u32 len) +{ + u32 i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((u32)input[j]) | (((u32)input[j+1]) << 8) | + (((u32)input[j+2]) << 16) | (((u32)input[j+3]) << 24); +} diff --git a/libs/dolphin/exi/EXIBios.c b/libs/dolphin/exi/EXIBios.c index 3b50ca02d..0e34b6154 100644 --- a/libs/dolphin/exi/EXIBios.c +++ b/libs/dolphin/exi/EXIBios.c @@ -89,7 +89,7 @@ static void SetExiInterruptMask(s32 chan, EXIControl* exi) } } -static void CompleteTransfer(s32 chan) +inline void CompleteTransfer(s32 chan) { EXIControl* exi = &Ecb[chan]; u8* buf; @@ -366,7 +366,7 @@ s32 EXIProbeEx(s32 chan) } } -static BOOL __EXIAttach(s32 chan, EXICallback extCallback) +inline BOOL __EXIAttach(s32 chan, EXICallback extCallback) { EXIControl* exi = &Ecb[chan]; BOOL enabled; diff --git a/libs/dolphin/exi/EXIUart.c b/libs/dolphin/exi/EXIUart.c index 73efc2cef..4f3b88b2b 100644 --- a/libs/dolphin/exi/EXIUart.c +++ b/libs/dolphin/exi/EXIUart.c @@ -111,7 +111,7 @@ u32 InitializeUART(u32 baudRate) } } -static int QueueLength(void) +inline int QueueLength(void) { u32 cmd; diff --git a/libs/dolphin/gd/GDBase.c b/libs/dolphin/gd/GDBase.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/gd/GDGeometry.c b/libs/dolphin/gd/GDGeometry.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/gx/GXFrameBuf.c b/libs/dolphin/gx/GXFrameBuf.c index b6a32d569..a4a41105a 100644 --- a/libs/dolphin/gx/GXFrameBuf.c +++ b/libs/dolphin/gx/GXFrameBuf.c @@ -176,7 +176,7 @@ void GXSetCopyClamp(GXFBClamp clamp) SET_REG_FIELD(1439, __GXData->cpTex, 1, 1, clmpB); } -static u32 __GXGetNumXfbLines(u32 efbHt, u32 iScale) +inline u32 __GXGetNumXfbLines(u32 efbHt, u32 iScale) { u32 count; u32 realHt; diff --git a/libs/dolphin/gx/GXMisc.c b/libs/dolphin/gx/GXMisc.c index e3c11f1c5..2337ed9bc 100644 --- a/libs/dolphin/gx/GXMisc.c +++ b/libs/dolphin/gx/GXMisc.c @@ -62,7 +62,7 @@ void GXFlush(void) PPCSync(); } -static void __GXAbortWait(u32 clocks) +inline void __GXAbortWait(u32 clocks) { OSTime time0; OSTime time1; @@ -74,7 +74,7 @@ static void __GXAbortWait(u32 clocks) } while (time1 - time0 <= (clocks / 4)); } -static void __GXAbortWaitPECopyDone(void) +inline void __GXAbortWaitPECopyDone(void) { u32 peCnt0; u32 peCnt1; @@ -126,7 +126,7 @@ u16 GXReadDrawSync(void) return token; } -void GXSetDrawDone(void) +inline void GXSetDrawDone(void) { u32 reg; BOOL enabled; @@ -140,7 +140,7 @@ void GXSetDrawDone(void) OSRestoreInterrupts(enabled); } -void GXWaitDrawDone(void) +inline void GXWaitDrawDone(void) { BOOL enabled; diff --git a/libs/dolphin/hio/hio.c b/libs/dolphin/hio/hio.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IFFifo.c b/libs/dolphin/ip/IFFifo.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IFRing.c b/libs/dolphin/ip/IFRing.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IP.c b/libs/dolphin/ip/IP.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPArp.c b/libs/dolphin/ip/IPArp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPChap.c b/libs/dolphin/ip/IPChap.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPDhcp.c b/libs/dolphin/ip/IPDhcp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPDns.c b/libs/dolphin/ip/IPDns.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPEther.c b/libs/dolphin/ip/IPEther.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPFrag.c b/libs/dolphin/ip/IPFrag.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPIcmp.c b/libs/dolphin/ip/IPIcmp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPIgmp.c b/libs/dolphin/ip/IPIgmp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPIpcp.c b/libs/dolphin/ip/IPIpcp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPLcp.c b/libs/dolphin/ip/IPLcp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPOpt.c b/libs/dolphin/ip/IPOpt.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPPPP.c b/libs/dolphin/ip/IPPPP.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPPPPoE.c b/libs/dolphin/ip/IPPPPoE.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPPap.c b/libs/dolphin/ip/IPPap.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPRoute.c b/libs/dolphin/ip/IPRoute.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPSocket.c b/libs/dolphin/ip/IPSocket.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPTcp.c b/libs/dolphin/ip/IPTcp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPTcpOutput.c b/libs/dolphin/ip/IPTcpOutput.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPTcpTimeWait.c b/libs/dolphin/ip/IPTcpTimeWait.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPTcpTimer.c b/libs/dolphin/ip/IPTcpTimer.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPTcpUser.c b/libs/dolphin/ip/IPTcpUser.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPUdp.c b/libs/dolphin/ip/IPUdp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPUuid.c b/libs/dolphin/ip/IPUuid.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/ip/IPZero.c b/libs/dolphin/ip/IPZero.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/lg/allsrc.c b/libs/dolphin/lg/allsrc.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/os/OSAlarm.c b/libs/dolphin/os/OSAlarm.c index 46eeff622..ae99ea535 100644 --- a/libs/dolphin/os/OSAlarm.c +++ b/libs/dolphin/os/OSAlarm.c @@ -11,7 +11,7 @@ static struct OSAlarmQueue static void DecrementerExceptionHandler(__OSException exception, OSContext* context); static BOOL OnReset(BOOL final); -static void SetTimer(OSAlarm* alarm) +inline void SetTimer(OSAlarm* alarm) { OSTime delta; diff --git a/libs/dolphin/os/OSCache.c b/libs/dolphin/os/OSCache.c index 11ba9094f..c38d0a402 100644 --- a/libs/dolphin/os/OSCache.c +++ b/libs/dolphin/os/OSCache.c @@ -152,7 +152,7 @@ asm void LCDisable() { /* clang-format off */ /* clang-format on */ -static void L2Disable(void) +inline void L2Disable(void) { __sync(); PPCMtl2cr(PPCMfl2cr() & ~0x80000000); @@ -172,7 +172,7 @@ void L2GlobalInvalidate(void) } } -static void L2Init(void) +inline void L2Init(void) { u32 oldMSR; oldMSR = PPCMfmsr(); diff --git a/libs/dolphin/os/OSError.c b/libs/dolphin/os/OSError.c index ec942ba48..dfb4ae31c 100644 --- a/libs/dolphin/os/OSError.c +++ b/libs/dolphin/os/OSError.c @@ -10,6 +10,7 @@ volatile OSContext* __OSFPUContext : (OS_BASE_CACHED | 0x00D8); OSErrorHandler __OSErrorTable[OS_ERROR_MAX]; #define FPSCR_ENABLE (FPSCR_VE | FPSCR_OE | FPSCR_UE | FPSCR_ZE | FPSCR_XE) u32 __OSFpscrEnableBits = FPSCR_ENABLE; +extern volatile OSTime __OSLastInterruptTime; __declspec(weak) void OSReport(const char* msg, ...) { @@ -19,7 +20,7 @@ __declspec(weak) void OSReport(const char* msg, ...) va_end(args); } -__declspec(weak) void OSVReport(const char* msg, va_list list) +__declspec(weak) static void OSVReport(const char* msg, va_list list) { vprintf(msg, list); } diff --git a/libs/dolphin/os/OSFont.c b/libs/dolphin/os/OSFont.c index aaf0a51a6..1457efe4f 100644 --- a/libs/dolphin/os/OSFont.c +++ b/libs/dolphin/os/OSFont.c @@ -1,7 +1,6 @@ #include #include -#include #include typedef char* (*ParseStringCallback)(u16, char*, OSFontHeader**, int*); diff --git a/libs/dolphin/os/OSReset.c b/libs/dolphin/os/OSReset.c index 8a9a2bd34..2b87ffd2a 100644 --- a/libs/dolphin/os/OSReset.c +++ b/libs/dolphin/os/OSReset.c @@ -66,7 +66,7 @@ void OSRegisterResetFunction(OSResetFunctionInfo* func) tmp->next = func; } -BOOL __OSCallResetFunctions(u32 arg0) +inline BOOL __OSCallResetFunctions(u32 arg0) { OSResetFunctionInfo* info; s32 err = 0; @@ -129,7 +129,7 @@ asm void Reset(register s32 resetCode) OSThreadQueue __OSActiveThreadQueue : (OS_BASE_CACHED | 0x00DC); -static void KillThreads(void) +inline void KillThreads(void) { OSThread* thread; OSThread* next; diff --git a/libs/dolphin/os/OSRtc.c b/libs/dolphin/os/OSRtc.c index eab1d5301..7a329c87f 100644 --- a/libs/dolphin/os/OSRtc.c +++ b/libs/dolphin/os/OSRtc.c @@ -23,7 +23,7 @@ typedef struct SramControlBlock static SramControlBlock Scb ALIGN(32); -static BOOL ReadSram(void* buffer) +inline BOOL ReadSram(void* buffer) { BOOL err; u32 cmd; @@ -98,7 +98,7 @@ void __OSInitSram() OSSetGbsMode(OSGetGbsMode()); } -static void* LockSram(u32 offset) +inline void* LockSram(u32 offset) { BOOL enabled; enabled = OSDisableInterrupts(); @@ -252,74 +252,6 @@ void OSSetSoundMode(u32 mode) __OSUnlockSram(TRUE); } -u32 OSGetProgressiveMode() -{ - OSSram* sram; - u32 mode; - - sram = __OSLockSramHACK(); - mode = (sram->flags & 0x80) >> 7; - __OSUnlockSram(FALSE); - return mode; -} - -void OSSetProgressiveMode(u32 mode) -{ - OSSram* sram; - mode <<= 7; - mode &= 0x80; - - sram = __OSLockSramHACK(); - if (mode == (sram->flags & 0x80)) - { - __OSUnlockSram(FALSE); - return; - } - - sram->flags &= ~0x80; - sram->flags |= mode; - __OSUnlockSram(TRUE); -} - -u8 OSGetLanguage() -{ - OSSram* sram; - u8 language; - - sram = __OSLockSramHACK(); - language = sram->language; - __OSUnlockSram(FALSE); - return language; -} - -u32 OSGetEuRgb60Mode() -{ - OSSram* sram; - u32 on; - sram = __OSLockSramHACK(); - on = (sram->ntd >> 6) & 0x1; - __OSUnlockSram(FALSE); - return on; -} - -void OSSetEuRgb60Mode(u32 mode) -{ - OSSram* sram; - mode <<= 6; - mode &= 0x40; - - sram = __OSLockSramHACK(); - if (mode == (sram->ntd & 0x40)) - { - __OSUnlockSram(FALSE); - return; - } - - sram->ntd &= ~0x40; - sram->ntd |= mode; - __OSUnlockSram(TRUE); -} - u16 OSGetWirelessID(s32 channel) { OSSramEx* sram; @@ -370,7 +302,7 @@ void OSSetGbsMode(u16 mode) sram = __OSLockSramEx(); if (mode == sram->gbs) { - __OSUnlockSramEx(FALSE); + UnlockSram(FALSE, FALSE); return; } diff --git a/libs/dolphin/os/OSThread.c b/libs/dolphin/os/OSThread.c index e0a46b506..4d3dddf37 100644 --- a/libs/dolphin/os/OSThread.c +++ b/libs/dolphin/os/OSThread.c @@ -149,7 +149,7 @@ OSThread* OSGetCurrentThread() return __OSCurrentThread; } -static void __OSSwitchThread(OSThread* nextThread) +inline void __OSSwitchThread(OSThread* nextThread) { OSSetCurrentThread(nextThread); OSSetCurrentContext(&nextThread->context); @@ -178,7 +178,7 @@ s32 OSEnableScheduler() return count; } -static void SetRun(OSThread* thread) +inline void SetRun(OSThread* thread) { thread->queue = &RunQueue[thread->priority]; AddTail(thread->queue, thread, link); @@ -241,7 +241,7 @@ static OSThread* SetEffectivePriority(OSThread* thread, OSPriority priority) return NULL; } -static void UpdatePriority(OSThread* thread) +inline void UpdatePriority(OSThread* thread) { OSPriority priority; diff --git a/libs/dolphin/os/OSTime.c b/libs/dolphin/os/OSTime.c index 7f893c0a5..33e58ad71 100644 --- a/libs/dolphin/os/OSTime.c +++ b/libs/dolphin/os/OSTime.c @@ -65,17 +65,17 @@ OSTime __OSTimeToSystemTime(OSTime time) return result; } -static BOOL IsLeapYear(s32 year) +inline BOOL IsLeapYear(s32 year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } -static s32 GetYearDays(s32 year, s32 mon) +inline s32 GetYearDays(s32 year, s32 mon) { return (IsLeapYear(year) ? LeapYearDays : YearDays)[mon]; } -static s32 GetLeapDays(s32 year) +inline s32 GetLeapDays(s32 year) { if (year < 1) { diff --git a/libs/dolphin/os/__os.h b/libs/dolphin/os/__os.h deleted file mode 100644 index 9808a40da..000000000 --- a/libs/dolphin/os/__os.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef _DOLPHIN_OS_INTERNAL_H_ -#define _DOLPHIN_OS_INTERNAL_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// OS -extern char* __OSExceptionNames[17]; // D ONLY - -u32 __OSIsDebuggerPresent(void); -void __OSPSInit(void); - -// OSAlloc -extern volatile int __OSCurrHeap; - -// OSAudioSystem -void __OSInitAudioSystem(void); -void __OSStopAudioSystem(void); - -// OSCache -void __OSCacheInit(void); - -// OSContext -void __OSContextInit(void); - -// OSError -void __OSUnhandledException(__OSException exception, OSContext* context, u32 dsisr, u32 dar); - -// OSExec -void __OSGetExecParams(OSExecParams* params); -void __OSSetExecParams(const OSExecParams* params, OSExecParams* addr); -void __OSBootDolSimple(u32 doloffset, u32 restartCode, void* regionStart, void* regionEnd, - BOOL argsUseDefault, s32 argc, char** argv); -void __OSBootDol(u32 doloffset, u32 restartCode, const char** argv); - -// OSInterrupt -extern void __RAS_OSDisableInterrupts_begin(void); -extern void __RAS_OSDisableInterrupts_end(void); - -extern u64 __OSSpuriousInterrupts; // D ONLY -extern char* __OSInterruptNames[33]; // D ONLY -extern char* __OSPIErrors[8]; // D ONLY - -__OSInterruptHandler __OSSetInterruptHandler(__OSInterrupt interrupt, __OSInterruptHandler handler); -__OSInterruptHandler __OSGetInterruptHandler(__OSInterrupt interrupt); -void __OSInterruptInit(void); -OSInterruptMask __OSMaskInterrupts(OSInterruptMask global); -OSInterruptMask __OSUnmaskInterrupts(OSInterruptMask global); -void __OSDispatchInterrupt(__OSException exception, OSContext* context); -void __OSModuleInit(void); - -// OSMemory -void __OSInitMemoryProtection(void); - -// OSMutex -void __OSUnlockAllMutex(OSThread* thread); -int __OSCheckDeadLock(OSThread* thread); -int __OSCheckMutexes(OSThread* thread); - -// OSReset -void __OSDoHotReset(u32 resetCode); -void __OSShutdownDevices(BOOL doRecal); -int __OSCallResetFunctions(BOOL final); - -// OSResetSW -void __OSResetSWInterruptHandler(s16 exception, OSContext* context); -void __OSSetResetButtonTimer(u8 min); - -// OSRtc -int __OSGetRTC(u32* rtc); -int __OSSetRTC(u32 rtc); -void __OSInitSram(void); -OSSram* __OSLockSram(void); -OSSramEx* __OSLockSramEx(void); -int __OSUnlockSram(BOOL commit); -int __OSUnlockSramEx(BOOL commit); -int __OSSyncSram(void); -int __OSCheckSram(void); -int __OSReadROM(void* buffer, s32 length, s32 offset); -int __OSReadROMAsync(void* buffer, s32 length, s32 offset, void (*callback)()); -u8 __OSGetBootMode(void); -void __OSSetBootMode(u8 ntd); - -// OSSync -extern void __OSSystemCallVectorStart(); -extern void __OSSystemCallVectorEnd(); - -void __OSInitSystemCall(void); - -// OSThread -void __OSThreadInit(void); -s32 __OSGetEffectivePriority(OSThread* thread); -void __OSPromoteThread(OSThread* thread, s32 priority); -void __OSReschedule(void); - -// OSTime -void __OSSetTime(OSTime time); -OSTime __OSGetSystemTime(); -void __OSSetTick(register OSTick newTicks); -OSTime __OSTimeToSystemTime(OSTime time); - -// ppc_eabi_init -__declspec(section ".init") asm void __init_hardware(void); -__declspec(section ".init") asm void __flush_cache(void* address, unsigned int size); -void __init_user(void); -void _ExitProcess(void); - -// start -__declspec(weak) void InitMetroTRK_BBA(); - -__declspec(section ".init") void __start(void); - -__declspec(section ".init") extern void __start(void); -__declspec(section ".init") void __copy_rom_section(void* dst, const void* src, u32 size); -__declspec(section ".init") void __init_bss_section(void* dst, u32 size); -__declspec(section ".init") extern void __init_registers(void); -__declspec(section ".init") extern void __init_data(void); - -// time.dolphin -OSTime __get_clock(void); -u32 __get_time(void); -int __to_gm_time(void); - -#ifdef __cplusplus -} -#endif - -#endif // _DOLPHIN_OS_INTERNAL_H_ diff --git a/libs/dolphin/os/init/__ppc_eabi_init.cpp b/libs/dolphin/os/init/__ppc_eabi_init.cpp index e276d4a6b..6f5b2765a 100644 --- a/libs/dolphin/os/init/__ppc_eabi_init.cpp +++ b/libs/dolphin/os/init/__ppc_eabi_init.cpp @@ -16,35 +16,37 @@ __declspec(section ".dtors") extern voidfunctionptr _dtors[]; static void __init_cpp(void); // clang-format off -__declspec(section ".init") asm void __init_hardware(void) { +__declspec(section ".init") asm void __init_hardware(void) +{ // clang-format off nofralloc mfmsr r0 - ori r0,r0,0x2000 + ori r0,r0,MSR_FP mtmsr r0 - mflr r31 - bl __OSPSInit - bl __OSFPRInit - bl __OSCacheInit - mtlr r31 + mflr r31 + bl __OSPSInit + bl __OSFPRInit + bl __OSCacheInit + mtlr r31 blr } -__declspec(section ".init") asm void __flush_cache(void) { - nofralloc - lis r5, 0xFFFFFFF1@h - ori r5, r5, 0xFFFFFFF1@l - and r5, r5, r3 - subf r3, r5, r3 - add r4, r4, r3 -loop: - dcbst 0, r5 - sync - icbi 0, r5 - addic r5, r5, 8 - addic. r4, r4, -8 - bge loop - isync - blr +__declspec(section ".init") asm void __flush_cache(void *address, unsigned int size) +{ // clang-format off + nofralloc + lis r5, 0xffff + ori r5, r5, 0xfff1 + and r5, r5, r3 + subf r3, r5, r3 + add r4, r4, r3 +rept: + dcbst 0,r5 + sync + icbi 0,r5 + addic r5,r5,0x8 + subic. r4,r4,0x8 + bge rept + isync + blr } // clang-format on diff --git a/libs/dolphin/pad/Padclamp.c b/libs/dolphin/pad/Padclamp.c index e6165d56a..2b6de379c 100644 --- a/libs/dolphin/pad/Padclamp.c +++ b/libs/dolphin/pad/Padclamp.c @@ -96,7 +96,7 @@ static void ClampStick(s8* px, s8* py, s8 max, s8 xy, s8 min) *py = (s8)(signY * y); } -static void ClampTrigger(u8* trigger, u8 min, u8 max) +inline void ClampTrigger(u8* trigger, u8 min, u8 max) { if (*trigger <= min) { diff --git a/libs/dolphin/thp/THPAudio.c b/libs/dolphin/thp/THPAudio.c new file mode 100644 index 000000000..147d62180 --- /dev/null +++ b/libs/dolphin/thp/THPAudio.c @@ -0,0 +1,202 @@ +#include + +u32 THPAudioDecode(s16 *audioBuffer, u8 *audioFrame, s32 flag) +{ + THPAudioRecordHeader *header; + THPAudioDecodeInfo decInfo; + u8 *left, *right; + s16 *decLeftPtr, *decRightPtr; + s16 yn1, yn2; + s32 i; + s32 step; + s32 sample; + s64 yn; + + if (audioBuffer == NULL || audioFrame == NULL) + { + return 0; + } + + header = (THPAudioRecordHeader *)audioFrame; + left = audioFrame + sizeof(THPAudioRecordHeader); + right = left + header->offsetNextChannel; + + if (flag == 1) + { + decRightPtr = audioBuffer; + decLeftPtr = audioBuffer + header->sampleSize; + step = 1; + } + else + { + decRightPtr = audioBuffer; + decLeftPtr = audioBuffer + 1; + step = 2; + } + + if (header->offsetNextChannel == 0) + { + __THPAudioInitialize(&decInfo, left); + + yn1 = header->lYn1; + yn2 = header->lYn2; + + for (i = 0; i < header->sampleSize; i++) + { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->lCoef[decInfo.predictor][1] * yn2; + yn += header->lCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; + + if ((u16)(yn & 0xffff) > 0x8000) + { + yn += 0x10000; + } + else if ((u16)(yn & 0xffff) == 0x8000) + { + if ((yn & 0x10000)) + yn += 0x10000; + } + + if (yn > 2147483647LL) + { + yn = 2147483647LL; + } + + if (yn < -2147483648LL) + { + yn = -2147483648LL; + } + + *decLeftPtr = (s16)(yn >> 16); + decLeftPtr += step; + *decRightPtr = (s16)(yn >> 16); + decRightPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } + } + else + { + __THPAudioInitialize(&decInfo, left); + + yn1 = header->lYn1; + yn2 = header->lYn2; + + for (i = 0; i < header->sampleSize; i++) + { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->lCoef[decInfo.predictor][1] * yn2; + yn += header->lCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; + if ((u16)(yn & 0xffff) > 0x8000) + { + yn += 0x10000; + } + else + { + if ((u16)(yn & 0xffff) == 0x8000) + { + if ((yn & 0x10000)) + yn += 0x10000; + } + } + + if (yn > 2147483647LL) + { + yn = 2147483647LL; + } + + if (yn < -2147483648LL) + { + yn = -2147483648LL; + } + + *decLeftPtr = (s16)(yn >> 16); + decLeftPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } + + __THPAudioInitialize(&decInfo, right); + + yn1 = header->rYn1; + yn2 = header->rYn2; + + for (i = 0; i < header->sampleSize; i++) + { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->rCoef[decInfo.predictor][1] * yn2; + yn += header->rCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; + + if ((u16)(yn & 0xffff) > 0x8000) + { + yn += 0x10000; + } + else + { + if ((u16)(yn & 0xffff) == 0x8000) + { + if ((yn & 0x10000)) + yn += 0x10000; + } + } + + if (yn > 2147483647LL) + { + yn = 2147483647LL; + } + + if (yn < -2147483648LL) + { + yn = -2147483648LL; + } + + *decRightPtr = (s16)(yn >> 16); + decRightPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } + } + + return header->sampleSize; +} + +static s32 __THPAudioGetNewSample(THPAudioDecodeInfo *info) +{ + s32 sample; + + if (!(info->offsetNibbles & 0x0f)) + { + info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); + info->scale = (u8)((*(info->encodeData) & 0xF)); + info->encodeData++; + info->offsetNibbles += 2; + } + + if (info->offsetNibbles & 0x1) + { + sample = (s32)((*(info->encodeData) & 0xF) << 28) >> 28; + info->encodeData++; + } + else + { + sample = (s32)((*(info->encodeData) & 0xF0) << 24) >> 28; + } + + info->offsetNibbles++; + return sample; +} + +static void __THPAudioInitialize(THPAudioDecodeInfo *info, u8 *ptr) +{ + info->encodeData = ptr; + info->offsetNibbles = 2; + info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); + info->scale = (u8)((*(info->encodeData) & 0xF)); + info->encodeData++; +} \ No newline at end of file diff --git a/libs/dolphin/thp/THPDec.c b/libs/dolphin/thp/THPDec.c new file mode 100644 index 000000000..10ceb6189 --- /dev/null +++ b/libs/dolphin/thp/THPDec.c @@ -0,0 +1,2316 @@ +#include +#include + +const char *__THPVersion = "<< Dolphin SDK - THP\trelease build: Aug 27 2002 20:42:01 >>"; + +static THPHuffmanTab *Ydchuff __attribute__((aligned(32))); +static THPHuffmanTab *Udchuff __attribute__((aligned(32))); +static THPHuffmanTab *Vdchuff __attribute__((aligned(32))); +static THPHuffmanTab *Yachuff __attribute__((aligned(32))); +static THPHuffmanTab *Uachuff __attribute__((aligned(32))); +static THPHuffmanTab *Vachuff __attribute__((aligned(32))); +static f32 __THPIDCTWorkspace[64] __attribute__((aligned(32))); +static u8 *__THPHuffmanBits; +static u8 *__THPHuffmanSizeTab; +static u16 *__THPHuffmanCodeTab; +static THPSample *Gbase __attribute__((aligned(32))); +static u32 Gwid __attribute__((aligned(32))); +static f32 *Gq __attribute__((aligned(32))); +static u8 *__THPLCWork512[3]; +static u8 *__THPLCWork672[3]; +static u32 __THPOldGQR5; +static u32 __THPOldGQR6; +static u8 *__THPWorkArea; +static THPCoeff *__THPMCUBuffer[6]; +static THPFileInfo *__THPInfo; +static BOOL __THPInitFlag = FALSE; + +#define ROUNDUP(a, b) ((((s32)(a)) + ((s32)(b)-1L)) / ((s32)(b))) + +void __THPInverseDCTY8(register THPCoeff *, register u32); + +s32 THPVideoDecode(void *file, void *tileY, void *tileU, void *tileV, void *work) +{ + u8 all_done, status; + s32 errorCode; + + if (!file) + { + goto _err_no_input; + } + + if (tileY == NULL || tileU == NULL || tileV == NULL) + { + goto _err_no_output; + } + + if (!work) + { + goto _err_no_work; + } + + if (!(PPCMfhid2() & 0x10000000)) + { + goto _err_lc_not_enabled; + } + + if (__THPInitFlag == FALSE) + { + goto _err_not_initialized; + } + + __THPWorkArea = (u8 *)work; + __THPInfo = (THPFileInfo *)OSRoundUp32B(__THPWorkArea); + __THPWorkArea = (u8 *)OSRoundUp32B(__THPWorkArea) + sizeof(THPFileInfo); + DCZeroRange(__THPInfo, sizeof(THPFileInfo)); + __THPInfo->cnt = 33; + __THPInfo->decompressedY = 0; + __THPInfo->c = (u8 *)file; + all_done = FALSE; + + for (;;) + { + if ((*(__THPInfo->c)++) != 255) + { + goto _err_bad_syntax; + } + + while (*__THPInfo->c == 255) + { + ((__THPInfo->c)++); + } + + status = (*(__THPInfo->c)++); + + if (status <= 0xD7) + { + if (status == 196) + { + status = __THPReadHuffmanTableSpecification(); + if (status != 0) + { + goto _err_bad_status; + } + } + + else if (status == 192) + { + status = __THPReadFrameHeader(); + if (status != 0) + { + goto _err_bad_status; + } + } + + else + { + goto _err_unsupported_marker; + } + } + + else if (0xD8 <= status && status <= 0xDF) + { + if (status == 221) + { + __THPRestartDefinition(); + } + + else if (status == 219) + { + status = __THPReadQuantizationTable(); + if (status != 0) + { + goto _err_bad_status; + } + } + + else if (status == 218) + { + status = __THPReadScaneHeader(); + if (status != 0) + { + goto _err_bad_status; + } + + all_done = TRUE; + } + else if (status == 216) + { + // empty but required for match + } + else + { + goto _err_unsupported_marker; + } + } + + else if (0xE0 <= status) + { + if ((224 <= status && status <= 239) || status == 254) + { + __THPInfo->c += (__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]; + } + else + { + goto _err_unsupported_marker; + } + } + + if (all_done) + { + break; + } + } + + __THPSetupBuffers(); + __THPDecompressYUV(tileY, tileU, tileV); + return 0; + +_err_no_input: + errorCode = 25; + goto _err_exit; + +_err_no_output: + errorCode = 27; + goto _err_exit; + +_err_no_work: + errorCode = 26; + goto _err_exit; + +_err_unsupported_marker: + errorCode = 11; + goto _err_exit; + +_err_bad_resource: + errorCode = 1; + goto _err_exit; + +_err_no_mem: + errorCode = 6; + goto _err_exit; + +_err_bad_syntax: + errorCode = 3; + goto _err_exit; + +_err_bad_status: + errorCode = status; + goto _err_exit; + +_err_lc_not_enabled: + errorCode = 28; + goto _err_exit; + +_err_not_initialized: + errorCode = 29; + goto _err_exit; + +_err_exit: + return errorCode; +} + +static void __THPSetupBuffers(void) +{ + u8 i; + THPCoeff *buffer; + + buffer = (THPCoeff *)OSRoundUp32B(__THPWorkArea); + + for (i = 0; i < 6; i++) + { + __THPMCUBuffer[i] = &buffer[i * 64]; + } +} + +u8 __THPReadFrameHeader(void) +{ + u8 i, utmp8; + + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + + if (utmp8 != 8) + { + return 10; + } + + __THPInfo->yPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + __THPInfo->xPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + if (utmp8 != 3) + { + return 12; + } + + for (i = 0; i < 3; i++) + { + utmp8 = (*(__THPInfo->c)++); + utmp8 = (*(__THPInfo->c)++); + if ((i == 0 && utmp8 != 0x22) || (i > 0 && utmp8 != 0x11)) + { + return 19; + } + + __THPInfo->components[i].quantizationTableSelector = (*(__THPInfo->c)++); + } + + return 0; +} + +/* there is an EXTREMELY tiny schedule swap but otherwise matching */ +u8 __THPReadScaneHeader(void) +{ + u8 i, utmp8; + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + + if (utmp8 != 3) + { + return 12; + } + + for (i = 0; i < 3; i++) + { + utmp8 = (*(__THPInfo->c)++); + + utmp8 = (*(__THPInfo->c)++); + __THPInfo->components[i].DCTableSelector = (u8)(utmp8 >> 4); + __THPInfo->components[i].ACTableSelector = (u8)(utmp8 & 15); + + if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 >> 4)))) == 0) + { + return 15; + } + + if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 & 15) + 1))) == 0) + { + return 15; + } + } + + __THPInfo->c += 3; + __THPInfo->MCUsPerRow = (u16)ROUNDUP(__THPInfo->xPixelSize, 16); + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + return 0; +} + +u8 __THPReadQuantizationTable(void) +{ + u16 length, id, i, row, col; + f32 q_temp[64]; + + length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + length -= 2; + + for (;;) + { + id = (*(__THPInfo->c)++); + + for (i = 0; i < 64; i++) + { + q_temp[__THPJpegNaturalOrder[i]] = (f32)(*(__THPInfo->c)++); + } + + i = 0; + for (row = 0; row < 8; row++) + { + for (col = 0; col < 8; col++) + { + __THPInfo->quantTabs[id][i] = (f32)((f64)q_temp[i] * __THPAANScaleFactor[row] * __THPAANScaleFactor[col]); + i++; + } + } + + length -= 65; + if (!length) + { + break; + } + } + + return 0; +} + +u8 __THPReadHuffmanTableSpecification(void) +{ + u8 t_class, id, i, tab_index; + u16 length, num_Vij; + + __THPHuffmanSizeTab = __THPWorkArea; + __THPHuffmanCodeTab = (u16 *)((u32)__THPWorkArea + 256 + 1); + length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + length -= 2; + + for (;;) + { + i = (*(__THPInfo->c)++); + id = (u8)(i & 15); + t_class = (u8)(i >> 4); + __THPHuffmanBits = __THPInfo->c; + tab_index = (u8)((id << 1) + t_class); + num_Vij = 0; + + for (i = 0; i < 16; i++) + { + num_Vij += (*(__THPInfo->c)++); + } + + __THPInfo->huffmanTabs[tab_index].Vij = __THPInfo->c; + __THPInfo->c += num_Vij; + __THPHuffGenerateSizeTable(); + __THPHuffGenerateCodeTable(); + __THPHuffGenerateDecoderTables(tab_index); + __THPInfo->validHuffmanTabs |= 1 << tab_index; + length -= 17 + num_Vij; + + if (length == 0) + { + break; + } + } + + return 0; +} + +static void __THPHuffGenerateSizeTable(void) +{ + s32 p, l, i; + p = 0; + + for (l = 1; l <= 16; l++) + { + i = (s32)__THPHuffmanBits[l - 1]; + while (i--) + { + __THPHuffmanSizeTab[p++] = (u8)l; + } + } + + __THPHuffmanSizeTab[p] = 0; +} + +static void __THPHuffGenerateCodeTable(void) +{ + u8 si; + u16 p, code; + + p = 0; + code = 0; + si = __THPHuffmanSizeTab[0]; + + while (__THPHuffmanSizeTab[p]) + { + while (__THPHuffmanSizeTab[p] == si) + { + __THPHuffmanCodeTab[p++] = code; + code++; + } + + code <<= 1; + si++; + } +} + +static void __THPHuffGenerateDecoderTables(u8 tabIndex) +{ + s32 p, l; + THPHuffmanTab *h; + + p = 0; + h = &__THPInfo->huffmanTabs[tabIndex]; + for (l = 1; l <= 16; l++) + { + if (__THPHuffmanBits[l - 1]) + { + h->valPtr[l] = p - __THPHuffmanCodeTab[p]; + p += __THPHuffmanBits[l - 1]; + h->maxCode[l] = __THPHuffmanCodeTab[p - 1]; + } + else + { + h->maxCode[l] = -1; + h->valPtr[l] = -1; + } + } + + h->maxCode[17] = 0xfffffL; +} + +static void __THPRestartDefinition(void) +{ + __THPInfo->RST = TRUE; + __THPInfo->c += 2; + __THPInfo->nMCU = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + __THPInfo->currMCU = __THPInfo->nMCU; +} + +static inline void __THPGQRSetup(void) +{ + register u32 tmp1, tmp2; + + asm { + mfspr tmp1, GQR5; + mfspr tmp2, GQR6; + } + + __THPOldGQR5 = tmp1; + __THPOldGQR6 = tmp2; + + asm { + li r3, 0x0007 + oris r3, r3, 0x0007 + mtspr GQR5, r3 + li r3, 0x3D04 + oris r3, r3, 0x3D04 + mtspr GQR6, r3 + } +} + +static inline void __THPGQRRestore(void) +{ + register u32 tmp1, tmp2; + tmp1 = __THPOldGQR5; + tmp2 = __THPOldGQR6; + + asm { + mtspr GQR5, tmp1; + mtspr GQR6, tmp2; + } +} + +void __THPPrepBitStream(void) +{ + u32 *ptr; + u32 offset, i, j, k; + + ptr = (u32 *)((u32)__THPInfo->c & 0xFFFFFFFC); + offset = (u32)__THPInfo->c & 3; + + if (__THPInfo->cnt != 33) + { + __THPInfo->cnt -= (3 - offset) * 8; + } + else + { + __THPInfo->cnt = (offset * 8) + 1; + } + + __THPInfo->c = (u8 *)ptr; + __THPInfo->currByte = *ptr; + + for (i = 0; i < 4; i++) + { + if (__THPInfo->validHuffmanTabs & (1 << i)) + { + for (j = 0; j < 32; j++) + { + __THPInfo->huffmanTabs[i].quick[j] = 0xFF; + + for (k = 0; k < 5; k++) + { + s32 code = (s32)(j >> (5 - k - 1)); + + if (code <= __THPInfo->huffmanTabs[i].maxCode[k + 1]) + { + __THPInfo->huffmanTabs[i].quick[j] = __THPInfo->huffmanTabs[i].Vij[(s32)(code + __THPInfo->huffmanTabs[i].valPtr[k + 1])]; + __THPInfo->huffmanTabs[i].increment[j] = (u8)(k + 1); + k = 99; + } + else + { + } + } + } + } + } + + { + s32 YdcTab, UdcTab, VdcTab, YacTab, UacTab, VacTab; + + YdcTab = (__THPInfo->components[0].DCTableSelector << 1); + UdcTab = (__THPInfo->components[1].DCTableSelector << 1); + VdcTab = (__THPInfo->components[2].DCTableSelector << 1); + + YacTab = (__THPInfo->components[0].ACTableSelector << 1) + 1; + UacTab = (__THPInfo->components[1].ACTableSelector << 1) + 1; + VacTab = (__THPInfo->components[2].ACTableSelector << 1) + 1; + + Ydchuff = &__THPInfo->huffmanTabs[YdcTab]; + Udchuff = &__THPInfo->huffmanTabs[UdcTab]; + Vdchuff = &__THPInfo->huffmanTabs[VdcTab]; + + Yachuff = &__THPInfo->huffmanTabs[YacTab]; + Uachuff = &__THPInfo->huffmanTabs[UacTab]; + Vachuff = &__THPInfo->huffmanTabs[VacTab]; + } +} + +void __THPDecompressYUV(void *tileY, void *tileU, void *tileV) +{ + u16 currentY, targetY; + __THPInfo->dLC[0] = tileY; + __THPInfo->dLC[1] = tileU; + __THPInfo->dLC[2] = tileV; + + currentY = __THPInfo->decompressedY; + targetY = __THPInfo->yPixelSize; + + __THPGQRSetup(); + __THPPrepBitStream(); + + if (__THPInfo->xPixelSize == 512 && targetY == 448) + { + while (currentY < targetY) + { + __THPDecompressiMCURow512x448(); + currentY += 16; + } + } + else if (__THPInfo->xPixelSize == 640 && targetY == 480) + { + while (currentY < targetY) + { + __THPDecompressiMCURow640x480(); + currentY += 16; + } + } + else + { + while (currentY < targetY) + { + __THPDecompressiMCURowNxN(); + currentY += 16; + } + } + + __THPGQRRestore(); +} + +inline void __THPInverseDCTNoYPos(register THPCoeff *in, register u32 xPos) +{ + register f32 *q, *ws; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; + register f32 tmp10, tmp11, tmp12, tmp13; + register f32 tmp20, tmp21, tmp22, tmp23; + register f32 cc4 = 1.414213562F; + register f32 cc2 = 1.847759065F; + register f32 cc2c6s = 1.082392200F; + register f32 cc2c6a = -2.613125930F; + register f32 bias = 1024.0F; + q = Gq; + ws = &__THPIDCTWorkspace[0] - 2; + + { + register u32 itmp0, itmp1, itmp2, itmp3; + asm { + li itmp2, 8 + mtctr itmp2 + + _loopHead0: + psq_l tmp10, 0(in), 0, 5 + psq_l tmp11, 0(q), 0, 0 + lwz itmp0, 12(in) + lwz itmp3, 8(in) + ps_mul tmp10, tmp10, tmp11 + lwz itmp1, 4(in) + lhz itmp2, 2(in) + or. itmp0, itmp0, itmp3 + + _loopHead1: + cmpwi itmp0, 0 + bne _regularIDCT + ps_merge00 tmp0, tmp10, tmp10 + cmpwi itmp1, 0 + psq_st tmp0, 8(ws), 0, 0 + bne _halfIDCT + psq_st tmp0, 16(ws), 0, 0 + cmpwi itmp2, 0 + psq_st tmp0, 24(ws), 0, 0 + bne _quarterIDCT + addi q, q, 8*sizeof(f32) + psq_stu tmp0, 32(ws), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + bdnz _loopHead0 + b _loopEnd + + _quarterIDCT: + addi in, in, 8*sizeof(THPCoeff) + ps_msub tmp2, tmp10, cc2, tmp10 + addi q, q, 8*sizeof(f32) + ps_merge00 tmp9, tmp10, tmp10 + lwz itmp1, 4(in) + ps_sub tmp1, cc2, cc2c6s + ps_msub tmp3, tmp10, cc4, tmp2 + lhz itmp2, 2(in) + ps_merge11 tmp5, tmp10, tmp2 + psq_l tmp11, 0(q), 0, 0 + ps_nmsub tmp4, tmp10, tmp1, tmp3 + ps_add tmp7, tmp9, tmp5 + psq_l tmp10, 0(in), 0, 5 + ps_merge11 tmp6, tmp3, tmp4 + ps_sub tmp5, tmp9, tmp5 + lwz itmp0, 12(in) + ps_add tmp8, tmp9, tmp6 + lwz itmp3, 8(in) + ps_sub tmp6, tmp9, tmp6 + psq_stu tmp7, 8(ws), 0, 0 + ps_merge10 tmp6, tmp6, tmp6 + psq_stu tmp8, 8(ws), 0, 0 + ps_merge10 tmp5, tmp5, tmp5 + or itmp0, itmp0, itmp3 + psq_stu tmp6, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp5, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _halfIDCT: + psq_l tmp1, 4(in), 0, 5 + psq_l tmp9, 8(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_mul tmp1, tmp1, tmp9 + addi q, q, 8*sizeof(f32) + ps_sub tmp3, tmp10, tmp1 + ps_add tmp2, tmp10, tmp1 + lwz itmp0, 12(in) + ps_madd tmp4, tmp1, cc4, tmp3 + ps_nmsub tmp5, tmp1, cc4, tmp2 + ps_mul tmp8, tmp3, cc2 + ps_merge00 tmp4, tmp2, tmp4 + lwz itmp3, 8(in) + ps_nmsub tmp6, tmp1, cc2c6a, tmp8 + ps_merge00 tmp5, tmp5, tmp3 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp2 + ps_nmsub tmp7, tmp10, cc2c6s, tmp8 + lhz itmp2, 2(in) + ps_merge11 tmp2, tmp2, tmp6 + ps_msub tmp8, tmp3, cc4, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_add tmp9, tmp4, tmp2 + ps_sub tmp7, tmp7, tmp8 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp3, tmp8, tmp7 + ps_sub tmp4, tmp4, tmp2 + psq_stu tmp9, 8(ws), 0, 0 + ps_add tmp0, tmp5, tmp3 + ps_sub tmp1, tmp5, tmp3 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + ps_merge10 tmp1, tmp1, tmp1 + ps_merge10 tmp4, tmp4, tmp4 + psq_stu tmp1, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp4, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _regularIDCT: + psq_l tmp9, 4(in), 0, 5 + psq_l tmp5, 8(q), 0, 0 + ps_mul tmp9, tmp9, tmp5 + psq_l tmp2, 8(in), 0, 5 + psq_l tmp6, 16(q), 0, 0 + ps_merge01 tmp0, tmp10, tmp9 + psq_l tmp3, 12(in), 0, 5 + ps_merge01 tmp1, tmp9, tmp10 + psq_l tmp7, 24(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_madd tmp4, tmp2, tmp6, tmp0 + ps_nmsub tmp5, tmp2, tmp6, tmp0 + ps_madd tmp6, tmp3, tmp7, tmp1 + ps_nmsub tmp7, tmp3, tmp7, tmp1 + addi q, q, 8*sizeof(f32) + ps_add tmp0, tmp4, tmp6 + ps_sub tmp3, tmp4, tmp6 + ps_msub tmp2, tmp7, cc4, tmp6 + lwz itmp0, 12(in) + ps_sub tmp8, tmp7, tmp5 + ps_add tmp1, tmp5, tmp2 + ps_sub tmp2, tmp5, tmp2 + ps_mul tmp8, tmp8, cc2 + lwz itmp3, 8(in) + ps_merge00 tmp1, tmp0, tmp1 + ps_nmsub tmp6, tmp5, cc2c6a, tmp8 + ps_msub tmp4, tmp7, cc2c6s, tmp8 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp0 + ps_merge00 tmp2, tmp2, tmp3 + lhz itmp2, 2(in) + ps_madd tmp5, tmp3, cc4, tmp6 + ps_merge11 tmp7, tmp0, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_sub tmp4, tmp4, tmp5 + ps_add tmp3, tmp1, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp4, tmp5, tmp4 + ps_sub tmp0, tmp1, tmp7 + ps_mul tmp10, tmp10, tmp11 + ps_add tmp5, tmp2, tmp4 + ps_sub tmp6, tmp2, tmp4 + ps_merge10 tmp5, tmp5, tmp5 + psq_stu tmp3, 8(ws), 0, 0 + ps_merge10 tmp0, tmp0, tmp0 + psq_stu tmp6, 8(ws), 0, 0 + psq_stu tmp5, 8(ws), 0, 0 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + bdnz _loopHead1 + + _loopEnd: + + } + } + + ws = &__THPIDCTWorkspace[0]; + + { + register THPSample *obase = Gbase; + register u32 wid = Gwid; + + register u32 itmp0, off0, off1; + register THPSample *out0, *out1; + + asm { + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + slwi xPos, xPos, 2 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + slwi off1, wid, 2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + mr off0, xPos + ps_add tmp6, tmp10, tmp11 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp8, tmp10, tmp11 + add off1, off0, off1 + ps_add tmp6, tmp6, bias + li itmp0, 3 + ps_add tmp7, tmp12, tmp13 + add out0, obase, off0 + ps_sub tmp9, tmp12, tmp13 + ps_add tmp0, tmp6, tmp7 + add out1, obase, off1 + ps_add tmp8, tmp8, bias + mtctr itmp0 + + _loopHead10: + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + addi ws, ws, 2*sizeof(f32) + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp6, tmp6, tmp7 + addi off0, off0, 2*sizeof(THPSample) + psq_st tmp9, 0(out0), 0, 6 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + addi off1, off1, 2*sizeof(THPSample) + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + ps_add tmp6, tmp10, tmp11 + psq_st tmp20, 0(out1), 0, 6 + ps_sub tmp8, tmp10, tmp11 + ps_add tmp6, tmp6, bias + psq_st tmp21, 8(out1), 0, 6 + ps_add tmp7, tmp12, tmp13 + ps_sub tmp9, tmp12, tmp13 + psq_st tmp22, 16(out1), 0, 6 + add out0, obase, off0 + ps_add tmp0, tmp6, tmp7 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp8, tmp8, bias + add out1, obase, off1 + bdnz _loopHead10 + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_st tmp9, 0(out0), 0, 6 + ps_sub tmp6, tmp6, tmp7 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp22, 16(out1), 0, 6 + psq_st tmp8, 16(out0), 0, 6 + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + psq_st tmp20, 0(out1), 0, 6 + psq_st tmp21, 8(out1), 0, 6 + } + } +} + +inline void __THPInverseDCTY8(register THPCoeff *in, register u32 xPos) +{ + register f32 *q, *ws; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; + register f32 tmp10, tmp11, tmp12, tmp13; + register f32 tmp20, tmp21, tmp22, tmp23; + register f32 cc4 = 1.414213562F; + register f32 cc2 = 1.847759065F; + register f32 cc2c6s = 1.082392200F; + register f32 cc2c6a = -2.613125930F; + register f32 bias = 1024.0F; + + q = Gq; + ws = &__THPIDCTWorkspace[0] - 2; + + { + register u32 itmp0, itmp1, itmp2, itmp3; + + asm { + li itmp2, 8 + mtctr itmp2 + + _loopHead0: + psq_l tmp10, 0(in), 0, 5 + psq_l tmp11, 0(q), 0, 0 + lwz itmp0, 12(in) + lwz itmp3, 8(in) + ps_mul tmp10, tmp10, tmp11 + lwz itmp1, 4(in) + lhz itmp2, 2(in) + or itmp0, itmp0, itmp3 + + _loopHead1: + cmpwi itmp0, 0 + bne _regularIDCT + ps_merge00 tmp0, tmp10, tmp10 + cmpwi itmp1, 0 + psq_st tmp0, 8(ws), 0, 0 + bne _halfIDCT + psq_st tmp0, 16(ws), 0, 0 + cmpwi itmp2, 0 + psq_st tmp0, 24(ws), 0, 0 + bne _quarterIDCT + addi q, q, 8*sizeof(f32) + psq_stu tmp0, 32(ws), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + bdnz _loopHead0 + b _loopEnd + + _quarterIDCT: + ps_msub tmp2, tmp10, cc2, tmp10 + addi in, in, 8*sizeof(THPCoeff) + ps_merge00 tmp9, tmp10, tmp10 + addi q, q, 8*sizeof(f32) + ps_sub tmp1, cc2, cc2c6s + lwz itmp1, 4(in) + ps_msub tmp3, tmp10, cc4, tmp2 + lhz itmp2, 2(in) + ps_merge11 tmp5, tmp10, tmp2 + psq_l tmp11, 0(q), 0, 0 + ps_nmsub tmp4, tmp10, tmp1, tmp3 + ps_add tmp7, tmp9, tmp5 + psq_l tmp10, 0(in), 0, 5 + ps_merge11 tmp6, tmp3, tmp4 + ps_sub tmp5, tmp9, tmp5 + lwz itmp0, 12(in) + ps_add tmp8, tmp9, tmp6 + lwz itmp3, 8(in) + ps_sub tmp6, tmp9, tmp6 + psq_stu tmp7, 8(ws), 0, 0 + ps_merge10 tmp6, tmp6, tmp6 + psq_stu tmp8, 8(ws), 0, 0 + ps_merge10 tmp5, tmp5, tmp5 + or itmp0, itmp0, itmp3 + psq_stu tmp6, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp5, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _halfIDCT: + psq_l tmp1, 4(in), 0, 5 + psq_l tmp9, 8(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_mul tmp1, tmp1, tmp9 + addi q, q, 8*sizeof(f32) + ps_sub tmp3, tmp10, tmp1 + ps_add tmp2, tmp10, tmp1 + lwz itmp0, 12(in) + ps_madd tmp4, tmp1, cc4, tmp3 + ps_nmsub tmp5, tmp1, cc4, tmp2 + ps_mul tmp8, tmp3, cc2 + ps_merge00 tmp4, tmp2, tmp4 + lwz itmp3, 8(in) + ps_nmsub tmp6, tmp1, cc2c6a, tmp8 + ps_merge00 tmp5, tmp5, tmp3 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp2 + ps_nmsub tmp7, tmp10, cc2c6s, tmp8 + lhz itmp2, 2(in) + ps_merge11 tmp2, tmp2, tmp6 + ps_msub tmp8, tmp3, cc4, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_add tmp9, tmp4, tmp2 + ps_sub tmp7, tmp7, tmp8 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp3, tmp8, tmp7 + ps_sub tmp4, tmp4, tmp2 + psq_stu tmp9, 8(ws), 0, 0 + ps_add tmp0, tmp5, tmp3 + ps_sub tmp1, tmp5, tmp3 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + ps_merge10 tmp1, tmp1, tmp1 + ps_merge10 tmp4, tmp4, tmp4 + psq_stu tmp1, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp4, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _regularIDCT: + psq_l tmp9, 4(in), 0, 5 + psq_l tmp5, 8(q), 0, 0 + ps_mul tmp9, tmp9, tmp5 + psq_l tmp2, 8(in), 0, 5 + psq_l tmp6, 16(q), 0, 0 + ps_merge01 tmp0, tmp10, tmp9 + psq_l tmp3, 12(in), 0, 5 + ps_merge01 tmp1, tmp9, tmp10 + psq_l tmp7, 24(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_madd tmp4, tmp2, tmp6, tmp0 + ps_nmsub tmp5, tmp2, tmp6, tmp0 + ps_madd tmp6, tmp3, tmp7, tmp1 + ps_nmsub tmp7, tmp3, tmp7, tmp1 + addi q, q, 8*sizeof(f32) + ps_add tmp0, tmp4, tmp6 + ps_sub tmp3, tmp4, tmp6 + ps_msub tmp2, tmp7, cc4, tmp6 + lwz itmp0, 12(in) + ps_sub tmp8, tmp7, tmp5 + ps_add tmp1, tmp5, tmp2 + ps_sub tmp2, tmp5, tmp2 + ps_mul tmp8, tmp8, cc2 + lwz itmp3, 8(in) + ps_merge00 tmp1, tmp0, tmp1 + ps_nmsub tmp6, tmp5, cc2c6a, tmp8 + ps_msub tmp4, tmp7, cc2c6s, tmp8 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp0 + ps_merge00 tmp2, tmp2, tmp3 + lhz itmp2, 2(in) + ps_madd tmp5, tmp3, cc4, tmp6 + ps_merge11 tmp7, tmp0, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_sub tmp4, tmp4, tmp5 + ps_add tmp3, tmp1, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp4, tmp5, tmp4 + ps_sub tmp0, tmp1, tmp7 + ps_mul tmp10, tmp10, tmp11 + ps_add tmp5, tmp2, tmp4 + ps_sub tmp6, tmp2, tmp4 + ps_merge10 tmp5, tmp5, tmp5 + psq_stu tmp3, 8(ws), 0, 0 + ps_merge10 tmp0, tmp0, tmp0 + psq_stu tmp6, 8(ws), 0, 0 + psq_stu tmp5, 8(ws), 0, 0 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + bdnz _loopHead1 + + _loopEnd: + + } + } + + ws = &__THPIDCTWorkspace[0]; + + { + register THPSample *obase = Gbase; + register u32 wid = Gwid; + + register u32 itmp0, off0, off1; + register THPSample *out0, *out1; + + asm { + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + slwi off0, wid, 3; + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + slwi xPos, xPos, 2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + slwi off1, wid, 2 + ps_add tmp6, tmp10, tmp11 + add off0, off0, xPos + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp8, tmp10, tmp11 + add off1, off0, off1 + ps_add tmp6, tmp6, bias + li itmp0, 3 + ps_add tmp7, tmp12, tmp13 + add out0, obase, off0 + ps_sub tmp9, tmp12, tmp13 + ps_add tmp0, tmp6, tmp7 + add out1, obase, off1 + ps_add tmp8, tmp8, bias + mtctr itmp0 + + _loopHead10: + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + addi ws, ws, 2*sizeof(f32) + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp6, tmp6, tmp7 + addi off0, off0, 2*sizeof(THPSample) + psq_st tmp9, 0(out0), 0, 6 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + addi off1, off1, 2*sizeof(THPSample) + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + ps_add tmp6, tmp10, tmp11 + psq_st tmp20, 0(out1), 0, 6 + ps_sub tmp8, tmp10, tmp11 + ps_add tmp6, tmp6, bias + psq_st tmp21, 8(out1), 0, 6 + ps_add tmp7, tmp12, tmp13 + ps_sub tmp9, tmp12, tmp13 + psq_st tmp22, 16(out1), 0, 6 + add out0, obase, off0 + ps_add tmp0, tmp6, tmp7 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp8, tmp8, bias + add out1, obase, off1 + + bdnz _loopHead10 + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_st tmp9, 0(out0), 0, 6 + ps_sub tmp6, tmp6, tmp7 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + ps_sub tmp9, tmp3, tmp4 + psq_st tmp22, 16(out1), 0, 6 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + psq_st tmp20, 0(out1), 0, 6 + psq_st tmp21, 8(out1), 0, 6 + + } + } +} + +void __THPDecompressiMCURow512x448(void) +{ + u8 cl_num; + u32 x_pos; + THPComponent *comp; + + LCQueueWait(3); + + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) + { + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork512[0]; + Gwid = 512; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork512[1]; + Gwid = 256; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork512[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) + { + if ((--__THPInfo->currMCU) == 0) + { + __THPInfo->currMCU = __THPInfo->nMCU; + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 33) + { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork512[0], 0x2000); + LCStoreData(__THPInfo->dLC[1], __THPLCWork512[1], 0x800); + LCStoreData(__THPInfo->dLC[2], __THPLCWork512[2], 0x800); + + __THPInfo->dLC[0] += 0x2000; + __THPInfo->dLC[1] += 0x800; + __THPInfo->dLC[2] += 0x800; +} + +inline s32 __THPHuffDecodeTab(register THPFileInfo *info, register THPHuffmanTab *h) +{ + register s32 code; + register u32 cnt; + register s32 cb; + register u32 increment; + register s32 tmp; + +#define cnt4 code + asm + { + lwz cnt, info->cnt; + addi increment, h, 32; + lwz cb, info->currByte; + addi cnt4, cnt, 4; + cmpwi cnt, 28; + rlwnm tmp, cb, cnt4, 27, 31; + bgt _notEnoughBits; + lbzx code, h, tmp; + lbzx increment, increment, tmp; + cmpwi code, 0xFF; + beq _FailedCheckEnoughBits; + add cnt, cnt, increment; + stw cnt, info->cnt; + } +_done: + return code; + + { + register u32 maxcodebase; + register u32 tmp2; + + _FailedCheckEnoughBits: + maxcodebase = (u32) & (h->maxCode); + cnt += 5; + + asm { + li tmp2, sizeof(s32)*(5); + li code, 5; + add maxcodebase, maxcodebase, tmp2; + __WHILE_START: + cmpwi cnt, 33; + slwi tmp, tmp, 1 + + beq _FCEB_faster; + rlwnm increment, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, increment + addi cnt, cnt, 1; + b __WHILE_CHECK; + + _FCEB_faster: + lwz increment, info->c; + li cnt, 1; + lwzu cb, 4(increment); + lwzu tmp2, 4(maxcodebase); + + stw increment, info->c; + rlwimi tmp, cb, 1,31,31; + stw cb, info->currByte; + b __FL_WHILE_CHECK; + + __FL_WHILE_START: + slwi tmp, tmp, 1; + rlwnm increment, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, increment; + + __FL_WHILE_CHECK: + cmpw tmp,tmp2 + addi cnt, cnt, 1; + addi code, code, 1 + bgt __FL_WHILE_START; + b _FCEB_Done; + + __WHILE_CHECK: + cmpw tmp,tmp2 + addi code, code, 1 + bgt __WHILE_START; + } + } +_FCEB_Done: + info->cnt = cnt; + return (h->Vij[(s32)(tmp + h->valPtr[code])]); + + asm + { // 6684 + _notEnoughBits: + cmpwi cnt, 33; + lwz tmp, info->c; + beq _getfullword; + + cmpwi cnt, 32; + rlwnm code, cb, cnt4, 27, 31 + beq _1bitleft; + + lbzx tmp, h, code; + lbzx increment, increment, code; + cmpwi tmp, 0xFF; + add code, cnt, increment; + beq _FailedCheckNoBits0; + + cmpwi code, 33; + stw code, info->cnt; + bgt _FailedCheckNoBits1; + } + return tmp; + + asm + { + _1bitleft: + lwzu cb, 4(tmp); + + stw tmp, info->c; + rlwimi code, cb, 4, 28, 31; + lbzx tmp, h, code; + lbzx increment, increment, code + stw cb, info->currByte; + cmpwi tmp, 0xFF + stw increment, info->cnt; + beq _DammitRead4; + + } + return tmp; + +_DammitRead4: +{ + register u32 maxcodebase = (u32) & (h->maxCode); + register u32 tmp2; + + asm + { + li cnt, sizeof(s32)*5; + add maxcodebase, maxcodebase, cnt; + + slwi tmp, code, 32-5; + li cnt,5; + rlwimi tmp, cb, 32-1, 1,31; + + __DR4_WHILE_START: + + subfic cb, cnt, 31; + lwzu tmp2, 4(maxcodebase); + srw code, tmp, cb; + __DR4_WHILE_CHECK: + cmpw code, tmp2 + addi cnt, cnt, 1 + bgt __DR4_WHILE_START; + + } +} + + info->cnt = cnt; +__CODE_PLUS_VP_CNT: + return (h->Vij[(s32)(code + h->valPtr[cnt])]); + +_getfullword: + asm + { + lwzu cb, 4(tmp); + + rlwinm code, cb, 5, 27, 31 + stw tmp, info->c; + lbzx cnt, h, code; + lbzx increment, increment, code; + cmpwi cnt, 0xFF + stw cb, info->currByte; + addi increment, increment, 1 + beq _FailedCheckEnoughbits_Updated; + + stw increment, info->cnt; + } + return (s32)cnt; + +_FailedCheckEnoughbits_Updated: + + cnt = 5; + do + { + asm + { + subfic tmp, cnt, 31; + addi cnt, cnt, 1; + srw code, cb, tmp; + } + } while (code > h->maxCode[cnt]); + + info->cnt = cnt + 1; + goto __CODE_PLUS_VP_CNT; + +#undef cnt4 + +_FailedCheckNoBits0: +_FailedCheckNoBits1: + +{ + register u32 mask = 0xFFFFFFFF << (33 - cnt); + register u32 tmp2; + + code = (s32)(cb & (~mask)); + mask = (u32) & (h->maxCode); + + asm + { + lwz tmp, info->c; + subfic tmp2, cnt, 33; + addi cnt, tmp2, 1; + slwi tmp2, tmp2, 2; + lwzu cb, 4(tmp); + add mask,mask, tmp2; + stw tmp, info->c; + slwi code, code, 1; + stw cb, info->currByte; + rlwimi code, cb, 1, 31, 31; + lwzu tmp2, 4(mask); + li tmp, 2; + b __FCNB1_WHILE_CHECK; + + __FCNB1_WHILE_START: + slwi code, code, 1; + + addi cnt, cnt, 1; + lwzu tmp2, 4(mask); + add code, code, increment; + addi tmp, tmp, 1; + + __FCNB1_WHILE_CHECK: + cmpw code, tmp2; + rlwnm increment, cb, tmp, 31, 31; + bgt __FCNB1_WHILE_START; + + } +} + + info->cnt = (u32)tmp; + return (h->Vij[(s32)(code + h->valPtr[cnt])]); +} + +void __THPDecompressiMCURow640x480(void) +{ + u8 cl_num; + u32 x_pos; + THPComponent *comp; + + LCQueueWait(3); + + { + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) + { + THPFileInfo *um = __THPInfo; + __THPHuffDecodeDCTCompY(um, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork672[0]; + Gwid = 640; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork672[1]; + Gwid = 320; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork672[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) + { + __THPInfo->currMCU--; + if (__THPInfo->currMCU == 0) + { + __THPInfo->currMCU = __THPInfo->nMCU; + + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 32) + { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork672[0], 0x2800); + LCStoreData(__THPInfo->dLC[1], __THPLCWork672[1], 0xA00); + LCStoreData(__THPInfo->dLC[2], __THPLCWork672[2], 0xA00); + + __THPInfo->dLC[0] += 0x2800; + __THPInfo->dLC[1] += 0xA00; + __THPInfo->dLC[2] += 0xA00; +} + +void __THPDecompressiMCURowNxN(void) +{ + u8 cl_num; + u32 x_pos, x; + THPComponent *comp; + + x = __THPInfo->xPixelSize; + + LCQueueWait(3); + + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) + { + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork672[0]; + Gwid = x; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork672[1]; + Gwid = x / 2; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork672[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) + { + __THPInfo->currMCU--; + if (__THPInfo->currMCU == 0) + { + __THPInfo->currMCU = __THPInfo->nMCU; + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 32) + { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork672[0], ((4 * sizeof(u8) * 64) * (x / 16))); + LCStoreData(__THPInfo->dLC[1], __THPLCWork672[1], ((sizeof(u8) * 64) * (x / 16))); + LCStoreData(__THPInfo->dLC[2], __THPLCWork672[2], ((sizeof(u8) * 64) * (x / 16))); + __THPInfo->dLC[0] += ((4 * sizeof(u8) * 64) * (x / 16)); + __THPInfo->dLC[1] += ((sizeof(u8) * 64) * (x / 16)); + __THPInfo->dLC[2] += ((sizeof(u8) * 64) * (x / 16)); +} + +void __THPHuffDecodeDCTCompY(register THPFileInfo *info, THPCoeff *block) +{ + { + register s32 t; + THPCoeff dc; + register THPCoeff diff; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Ydchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) + { + { + register s32 v; + register u32 cb; + register u32 cnt; + register u32 cnt33; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + asm { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + + subfc. tmp, cnt33, t; + subi cnt1,cnt,1; + + bgt _notEnoughBitsDIFF; + add v,cnt,t; + + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + } + + if (__cntlzw((u32)diff) > 32 - t) + { + diff += ((0xFFFFFFFF << t) + 1); + } + }; + + __dcbz((void *)block, 96); + dc = (s16)(info->components[0].predDC + diff); + block[0] = info->components[0].predDC = dc; + } + + { + register s32 k; + register s32 code; + register u32 cnt; + register u32 cb; + register u32 increment; + register s32 tmp; + register THPHuffmanTab *h = Yachuff; + +#define cnt4 code + asm + { + lwz cnt, info->cnt; + addi increment, h, 32; + lwz cb, info->currByte; + } + + for (k = 1; k < 64; k++) + { + register s32 ssss; + register s32 rrrr; + + asm { + addi cnt4, cnt, 4; + cmpwi cnt, 28; + rlwnm tmp, cb, cnt4, 27, 31; + bgt _notEnoughBits; + + lbzx ssss, h, tmp; + lbzx code, increment, tmp; + cmpwi ssss, 0xFF; + + beq _FailedCheckEnoughBits; + add cnt, cnt, code; + b _DoneDecodeTab; + } + + { + register u32 maxcodebase; + register u32 tmp2; + + _FailedCheckEnoughBits: + cnt += 5; + maxcodebase = (u32) & (h->maxCode); + asm { + li tmp2, sizeof(s32)*(5); + li code, 5; + add maxcodebase, maxcodebase, tmp2; + __WHILE_START: + cmpwi cnt, 33; + slwi tmp, tmp, 1 + + beq _FCEB_faster; + rlwnm ssss, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, ssss + addi cnt, cnt, 1; + b __WHILE_CHECK; + + _FCEB_faster: + lwz ssss, info->c; + li cnt, 1; + lwzu cb, 4(ssss); + + lwzu tmp2, 4(maxcodebase); + + stw ssss, info->c; + rlwimi tmp, cb, 1,31,31; + b __FL_WHILE_CHECK; + + __FL_WHILE_START: + slwi tmp, tmp, 1; + + rlwnm ssss, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, ssss; + + __FL_WHILE_CHECK: + cmpw tmp,tmp2 + addi cnt, cnt, 1; + addi code, code, 1 + bgt __FL_WHILE_START; + b _FCEB_Done; + + __WHILE_CHECK: + cmpw tmp,tmp2 + addi code, code, 1 + bgt __WHILE_START; + } + } + _FCEB_Done: + ssss = (h->Vij[(s32)(tmp + h->valPtr[code])]); + goto _DoneDecodeTab; + + _notEnoughBits: + asm + { + cmpwi cnt, 33; + lwz tmp, info->c; + beq _getfullword; + + cmpwi cnt, 32; + rlwnm code, cb, cnt4, 27, 31 + beq _1bitleft; + + lbzx ssss, h, code; + lbzx rrrr, increment, code; + cmpwi ssss, 0xFF; + add code, cnt, rrrr; + beq _FailedCheckNoBits0; + + cmpwi code, 33; + bgt _FailedCheckNoBits1; + } + cnt = (u32)code; + goto _DoneDecodeTab; + + _getfullword: + { + asm + { + lwzu cb, 4(tmp); + rlwinm code, cb, 5, 27, 31 + stw tmp, info->c; + lbzx ssss, h, code; + lbzx tmp, increment, code; + cmpwi ssss, 0xFF + addi cnt, tmp, 1 + beq _FailedCheckEnoughbits_Updated; + } + } + goto _DoneDecodeTab; + + _FailedCheckEnoughbits_Updated: + ssss = 5; + do + { + asm + { + subfic tmp, ssss, 31; + addi ssss, ssss, 1; + srw code, cb, tmp; + } + } while (code > h->maxCode[ssss]); + + cnt = (u32)(ssss + 1); + ssss = (h->Vij[(s32)(code + h->valPtr[ssss])]); + + goto _DoneDecodeTab; + + _1bitleft: + asm { + lwzu cb, 4(tmp); + + stw tmp, info->c; + rlwimi code, cb, 4, 28, 31; + lbzx ssss, h, code; + lbzx cnt, increment, code + cmpwi ssss, 0xFF + beq _DammitRead4; + + } + + goto _DoneDecodeTab; + + _DammitRead4: + { + register u32 maxcodebase = (u32) & (h->maxCode); + register u32 tmp2; + + asm { + li cnt, sizeof(s32)*5; + add maxcodebase, maxcodebase, cnt; + + slwi tmp, code, 32-5; + li cnt,5; + rlwimi tmp, cb, 32-1, 1,31; + + __DR4_WHILE_START: + + subfic ssss, cnt, 31; + lwzu tmp2, 4(maxcodebase); + srw code, tmp, ssss; + __DR4_WHILE_CHECK: + cmpw code, tmp2 + addi cnt, cnt, 1 + bgt __DR4_WHILE_START; + + } + } + ssss = (h->Vij[(s32)(code + h->valPtr[cnt])]); + goto _DoneDecodeTab; + + _FailedCheckNoBits0: + _FailedCheckNoBits1: + _REALFAILEDCHECKNOBITS: + { + register u32 mask = 0xFFFFFFFF << (33 - cnt); + register u32 tmp2; + register u32 tmp3; + code = (s32)(cb & (~mask)); + mask = (u32) & (h->maxCode); + + asm { + lwz tmp, info->c; + subfic tmp2, cnt, 33; + addi tmp3, tmp2, 1; + slwi tmp2, tmp2, 2; + lwzu cb, 4(tmp); + add mask,mask, tmp2; + stw tmp, info->c; + slwi code, code, 1; + rlwimi code, cb, 1, 31, 31; + lwzu tmp2, 4(mask); + li cnt, 2; + b __FCNB1_WHILE_CHECK; + + __FCNB1_WHILE_START: + slwi code, code, 1; + + addi tmp3, tmp3, 1; + lwzu tmp2, 4(mask); + add code, code, rrrr; + addi cnt, cnt, 1; + + __FCNB1_WHILE_CHECK: + cmpw code, tmp2; + rlwnm rrrr, cb, cnt, 31, 31; + bgt __FCNB1_WHILE_START; + + } + ssss = (h->Vij[(s32)(code + h->valPtr[tmp3])]); + } + + goto _DoneDecodeTab; + + _DoneDecodeTab: + asm { + andi. rrrr, ssss, 15; + srawi ssss, ssss, 4; + beq _RECV_SSSS_ZERO; + } + + { + k += ssss; + { + register s32 v; +#define cnt33 code + register u32 cnt1; + register u32 tmp1; + asm + { + subfic cnt33,cnt,33; + subfc. tmp, cnt33, rrrr; + subi cnt1,cnt,1; + bgt _RECVnotEnoughBits; + add cnt,cnt,rrrr; + slw tmp1,cb,cnt1; + subfic v,rrrr,32; + srw ssss,tmp1,v; + } + asm + { + b _RECVDone; + _RECVnotEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi cnt, tmp, 1; + stw tmp1, info->c; + srw tmp1, cb, cnt33; + + add v, tmp1, v; + subfic tmp, rrrr, 32; + srw ssss, v, tmp; + _RECVDone: + } + } + +#undef cnt33 + + if (__cntlzw((u32)ssss) > 32 - rrrr) + { + ssss += ((0xFFFFFFFF << rrrr) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)ssss; + goto _RECV_END; + } + + { + _RECV_SSSS_ZERO: + if (ssss != 15) + { + break; + } + + k += 15; + }; + + asm + { + _RECV_END: + } + } + info->cnt = cnt; + info->currByte = cb; + } +#undef cnt4 +} + +void __THPHuffDecodeDCTCompU(register THPFileInfo *info, THPCoeff *block) +{ + register s32 t; + register THPCoeff diff; + THPCoeff dc; + register s32 v; + register u32 cb; + register u32 cnt; + register u32 cnt33; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + register s32 k; + register s32 ssss; + register s32 rrrr; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Udchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) + { + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subfc. tmp, cnt33, t; + subi cnt1,cnt,1; + bgt _notEnoughBitsDIFF; + add v,cnt,t; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + + if (__cntlzw((u32)diff) > 32 - t) + { + diff += ((0xFFFFFFFF << t) + 1); + } + } + + __dcbz((void *)block, 96); + dc = (s16)(info->components[1].predDC + diff); + block[0] = info->components[1].predDC = dc; + + for (k = 1; k < 64; k++) + { + ssss = __THPHuffDecodeTab(info, Uachuff); + rrrr = ssss >> 4; + ssss &= 15; + + if (ssss) + { + k += rrrr; + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subf. tmp, cnt33, ssss; + subi cnt1,cnt,1; + bgt _notEnoughBits; + add v,cnt,ssss; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,ssss,32; + srw rrrr,cnt,v; + } + + asm + { + b _Done; + _notEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, ssss, 32; + srw rrrr, v, tmp; + _Done: + } + + if (__cntlzw((u32)rrrr) > 32 - ssss) + { + rrrr += ((0xFFFFFFFF << ssss) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)rrrr; + } + + else + { + if (rrrr != 15) + break; + k += 15; + } + } +} + +void __THPHuffDecodeDCTCompV(register THPFileInfo *info, THPCoeff *block) +{ + register s32 t; + register THPCoeff diff; + THPCoeff dc; + register s32 v; + register u32 cb; + register u32 cnt; + register u32 cnt33; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + register s32 k; + register s32 ssss; + register s32 rrrr; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Vdchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) + { + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subf. tmp, cnt33, t; + subi cnt1,cnt,1; + bgt _notEnoughBitsDIFF; + add v,cnt,t; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + + if (__cntlzw((u32)diff) > 32 - t) + { + diff += ((0xFFFFFFFF << t) + 1); + } + } + + __dcbz((void *)block, 96); + + dc = (s16)(info->components[2].predDC + diff); + block[0] = info->components[2].predDC = dc; + + for (k = 1; k < 64; k++) + { + ssss = __THPHuffDecodeTab(info, Vachuff); + rrrr = ssss >> 4; + ssss &= 15; + + if (ssss) + { + k += rrrr; + + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + + subf. tmp, cnt33, ssss; + subi cnt1,cnt,1; + + bgt _notEnoughBits; + add v,cnt,ssss; + + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,ssss,32; + srw rrrr,cnt,v; + } + + asm + { + b _Done; + _notEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, ssss, 32; + srw rrrr, v, tmp; + _Done: + } + + if (__cntlzw((u32)rrrr) > 32 - ssss) + { + rrrr += ((0xFFFFFFFF << ssss) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)rrrr; + } + else + { + if (rrrr != 15) + break; + k += 15; + } + } +} + +BOOL THPInit(void) +{ + u8 *base; + OSRegisterVersion(__THPVersion); + base = (u8 *)(0xE000 << 16); // lc base + + __THPLCWork512[0] = base; + base += 0x2000; + __THPLCWork512[1] = base; + base += 0x800; + __THPLCWork512[2] = base; + base += 0x200; + + base = (u8 *)(0xE000 << 16); // lc base + __THPLCWork672[0] = base; + base += 0x2800; + __THPLCWork672[1] = base; + base += 0xA00; + __THPLCWork672[2] = base; + base += 0xA80; + + OSInitFastCast(); + + __THPInitFlag = TRUE; + return TRUE; +} \ No newline at end of file diff --git a/libs/dolphin/upnp/UPnP.c b/libs/dolphin/upnp/UPnP.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPHttp.c b/libs/dolphin/upnp/UPnPHttp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPHttpd.c b/libs/dolphin/upnp/UPnPHttpd.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPHttpdResponse.c b/libs/dolphin/upnp/UPnPHttpdResponse.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPSsdp.c b/libs/dolphin/upnp/UPnPSsdp.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPUri.c b/libs/dolphin/upnp/UPnPUri.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/upnp/UPnPUuid.c b/libs/dolphin/upnp/UPnPUuid.c new file mode 100644 index 000000000..e69de29bb diff --git a/libs/dolphin/vi/vi.c b/libs/dolphin/vi/vi.c index 61ed43d58..9d47b7d89 100644 --- a/libs/dolphin/vi/vi.c +++ b/libs/dolphin/vi/vi.c @@ -6,9 +6,9 @@ #include // Useful macros. -#define IS_LOWER_16MB(x) ((x) < 16 * 1024 * 1024) -#define ToPhysical(fb) (u32)(((u32)(fb)) & 0x3FFFFFFF) -#define ONES(x) ((1 << (x)) - 1) +#define IS_LOWER_16MB(x) ((x) < 16 * 1024 * 1024) +#define ToPhysical(fb) (u32)(((u32)(fb)) & 0x3FFFFFFF) +#define ONES(x) ((1 << (x)) - 1) #define VI_BITMASK(index) (1ull << (63 - (index))) const char* __VIVersion = "<< Dolphin SDK - VI\trelease build: Apr 17 2003 12:33:22 (0x2301) >>"; @@ -78,47 +78,46 @@ static VITimingInfo timing[10] = { }; // clang-format on -static u16 taps[25] = { 496, 476, 430, 372, 297, 219, 142, 70, 12, 226, 203, 192, 196, 207, 222, 236, 252, 8, 15, 19, 19, 15, 12, 8, 1 }; +static u16 taps[25] = { 496, 476, 430, 372, 297, 219, 142, 70, 12, 226, 203, 192, 196, + 207, 222, 236, 252, 8, 15, 19, 19, 15, 12, 8, 1 }; // forward declaring statics static u32 getCurrentFieldEvenOdd(); -static void getEncoderType(void) -{ - // UNUSED FUNCTION -} - -static int cntlzd(u64 bit) +inline int cntlzd(u64 bit) { u32 hi, lo; int value; - hi = (u32)(bit >> 32); - lo = (u32)(bit & 0xFFFFFFFF); + hi = (u32)(bit >> 32); + lo = (u32)(bit & 0xFFFFFFFF); value = __cntlzw(hi); - if (value < 32) { + if (value < 32) + { return value; } return (32 + __cntlzw(lo)); } -static BOOL VISetRegs(void) +inline BOOL VISetRegs(void) { int regIndex; - if (!((shdwChangeMode == 1) && (getCurrentFieldEvenOdd() == 0))) { - while (shdwChanged) { - regIndex = cntlzd(shdwChanged); + if (!((shdwChangeMode == 1) && (getCurrentFieldEvenOdd() == 0))) + { + while (shdwChanged) + { + regIndex = cntlzd(shdwChanged); __VIRegs[regIndex] = shdwRegs[regIndex]; shdwChanged &= ~(VI_BITMASK(regIndex)); } shdwChangeMode = 0; - CurrTiming = HorVer.timing; - CurrTvMode = HorVer.tv; - CurrBufAddr = NextBufAddr; + CurrTiming = HorVer.timing; + CurrTvMode = HorVer.tv; + CurrBufAddr = NextBufAddr; return TRUE; } @@ -132,33 +131,39 @@ static void __VIRetraceHandler(__OSInterrupt interrupt, OSContext* context) u32 inter = 0; viReg = __VIRegs[VI_DISP_INT_0]; - if (viReg & 0x8000) { + if (viReg & 0x8000) + { __VIRegs[VI_DISP_INT_0] = (u16)(viReg & ~0x8000); inter |= 1; } viReg = __VIRegs[VI_DISP_INT_1]; - if (viReg & 0x8000) { + if (viReg & 0x8000) + { __VIRegs[VI_DISP_INT_1] = (u16)(viReg & ~0x8000); inter |= 2; } viReg = __VIRegs[VI_DISP_INT_2]; - if (viReg & 0x8000) { + if (viReg & 0x8000) + { __VIRegs[VI_DISP_INT_2] = (u16)(viReg & ~0x8000); inter |= 4; } viReg = __VIRegs[VI_DISP_INT_3]; - if (viReg & 0x8000) { + if (viReg & 0x8000) + { __VIRegs[VI_DISP_INT_3] = (u16)(viReg & ~0x8000); inter |= 8; } - if ((inter & 4) || (inter & 8)) { + if ((inter & 4) || (inter & 8)) + { OSClearContext(&exceptionContext); OSSetCurrentContext(&exceptionContext); - if (PositionCallback) { + if (PositionCallback) + { s16 x, y; __VIGetCurrentPosition(&x, &y); (*PositionCallback)(x, y); @@ -172,18 +177,22 @@ static void __VIRetraceHandler(__OSInterrupt interrupt, OSContext* context) OSClearContext(&exceptionContext); OSSetCurrentContext(&exceptionContext); - if (PreCB) { + if (PreCB) + { (*PreCB)(retraceCount); } - if (flushFlag) { - if (VISetRegs()) { + if (flushFlag) + { + if (VISetRegs()) + { flushFlag = 0; SIRefreshSamplingRate(); } } - if (PostCB) { + if (PostCB) + { OSClearContext(&exceptionContext); (*PostCB)(retraceCount); } @@ -201,7 +210,7 @@ VIRetraceCallback VISetPreRetraceCallback(VIRetraceCallback callback) oldCallback = PreCB; interrupt = OSDisableInterrupts(); - PreCB = callback; + PreCB = callback; OSRestoreInterrupts(interrupt); return oldCallback; @@ -215,7 +224,7 @@ VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback) oldCallback = PostCB; interrupt = OSDisableInterrupts(); - PostCB = callback; + PostCB = callback; OSRestoreInterrupts(interrupt); return oldCallback; @@ -223,7 +232,8 @@ VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback) static VITimingInfo* getTiming(VITVMode mode) { - switch (mode) { + switch (mode) + { case VI_TVMODE_NTSC_INT: return &timing[0]; case VI_TVMODE_NTSC_DS: @@ -273,14 +283,15 @@ void __VIInit(VITVMode mode) u16 hct, vct; nonInter = mode & 2; - tv = (u32)mode >> 2; + tv = (u32)mode >> 2; *(u32*)OSPhysicalToCached(0xCC) = tv; tm = getTiming(mode); __VIRegs[VI_DISP_CONFIG] = 2; - for (a = 0; a < 1000; a++) { + for (a = 0; a < 1000; a++) + { ; } @@ -295,58 +306,71 @@ void __VIInit(VITVMode mode) __VIRegs[VI_VERT_TIMING] = (tm->equ << 0) | (0 << 4); __VIRegs[VI_VERT_TIMING_ODD_U] = (tm->prbOdd + tm->acv * 2 - 2) << 0; - __VIRegs[VI_VERT_TIMING_ODD] = tm->psbOdd + 2 << 0; + __VIRegs[VI_VERT_TIMING_ODD] = tm->psbOdd + 2 << 0; __VIRegs[VI_VERT_TIMING_EVEN_U] = (tm->prbEven + tm->acv * 2 - 2) << 0; - __VIRegs[VI_VERT_TIMING_EVEN] = tm->psbEven + 2 << 0; + __VIRegs[VI_VERT_TIMING_EVEN] = tm->psbEven + 2 << 0; __VIRegs[VI_BBI_ODD_U] = (tm->bs1 << 0) | (tm->be1 << 5); - __VIRegs[VI_BBI_ODD] = (tm->bs3 << 0) | (tm->be3 << 5); + __VIRegs[VI_BBI_ODD] = (tm->bs3 << 0) | (tm->be3 << 5); __VIRegs[VI_BBI_EVEN_U] = (tm->bs2 << 0) | (tm->be2 << 5); - __VIRegs[VI_BBI_EVEN] = (tm->bs4 << 0) | (tm->be4 << 5); + __VIRegs[VI_BBI_EVEN] = (tm->bs4 << 0) | (tm->be4 << 5); __VIRegs[VI_HSW] = (40 << 0) | (40 << 8); __VIRegs[VI_DISP_INT_1U] = 1; - __VIRegs[VI_DISP_INT_1] = (1 << 0) | (1 << 12) | (0 << 15); + __VIRegs[VI_DISP_INT_1] = (1 << 0) | (1 << 12) | (0 << 15); - hct = (tm->hlw + 1); - vct = (tm->numHalfLines / 2 + 1) | (1 << 12) | (0 << 15); + hct = (tm->hlw + 1); + vct = (tm->numHalfLines / 2 + 1) | (1 << 12) | (0 << 15); __VIRegs[VI_DISP_INT_0U] = hct << 0; - __VIRegs[VI_DISP_INT_0] = vct; - - if (mode != VI_TVMODE_NTSC_PROG && mode != VI_TVMODE_NTSC_3D && mode != VI_TVMODE_GCA_PROG) { - __VIRegs[VI_DISP_CONFIG] = (1 << 0) | (0 << 1) | (nonInter << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); - __VIRegs[VI_CLOCK_SEL] = 0; + __VIRegs[VI_DISP_INT_0] = vct; - } else { - __VIRegs[VI_DISP_CONFIG] = (1 << 0) | (0 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); - __VIRegs[VI_CLOCK_SEL] = 1; + if (mode != VI_TVMODE_NTSC_PROG && mode != VI_TVMODE_NTSC_3D && mode != VI_TVMODE_GCA_PROG) + { + __VIRegs[VI_DISP_CONFIG] = + (1 << 0) | (0 << 1) | (nonInter << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); + __VIRegs[VI_CLOCK_SEL] = 0; + } + else + { + __VIRegs[VI_DISP_CONFIG] = + (1 << 0) | (0 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); + __VIRegs[VI_CLOCK_SEL] = 1; } } -static void AdjustPosition(u16 acv) +inline void AdjustPosition(u16 acv) { s32 coeff, frac; - HorVer.adjDispPosX = (u16)CLAMP(0, 720 - HorVer.dispSizeX, (s16)HorVer.dispPosX + displayOffsetH); + HorVer.adjDispPosX = + (u16)CLAMP(0, 720 - HorVer.dispSizeX, (s16)HorVer.dispPosX + displayOffsetH); coeff = (HorVer.xfbMode == VI_XFBMODE_SF) ? 2 : 1; - frac = HorVer.dispPosY & 1; + frac = HorVer.dispPosY & 1; HorVer.adjDispPosY = (u16)MAX((s16)HorVer.dispPosY + displayOffsetV, frac); - HorVer.adjDispSizeY = (u16)(HorVer.dispSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) - - MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - ((s16)acv * 2 - frac), 0)); - - HorVer.adjPanPosY = (u16)(HorVer.panPosY - MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff); - - HorVer.adjPanSizeY = (u16)(HorVer.panSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff - - MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - ((s16)acv * 2 - frac), 0) / coeff); + HorVer.adjDispSizeY = + (u16)(HorVer.dispSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) - + MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - + ((s16)acv * 2 - frac), + 0)); + + HorVer.adjPanPosY = + (u16)(HorVer.panPosY - MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff); + + HorVer.adjPanSizeY = + (u16)(HorVer.panSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff - + MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - + ((s16)acv * 2 - frac), + 0) / + coeff); } -static void ImportAdjustingValues(void) +inline void ImportAdjustingValues(void) { displayOffsetH = __OSLockSram()->displayOffsetH; displayOffsetV = 0; @@ -358,54 +382,57 @@ void VIInit(void) u16 dspCfg; u32 value, tv, tvInBootrom; - if (IsInitialized) { + if (IsInitialized) + { return; } OSRegisterVersion(__VIVersion); IsInitialized = TRUE; - encoderType = 1; + encoderType = 1; - if (!(__VIRegs[VI_DISP_CONFIG] & 1)) { + if (!(__VIRegs[VI_DISP_CONFIG] & 1)) + { __VIInit(VI_TVMODE_NTSC_INT); } - retraceCount = 0; - changed = 0; - shdwChanged = 0; - changeMode = 0; + retraceCount = 0; + changed = 0; + shdwChanged = 0; + changeMode = 0; shdwChangeMode = 0; - flushFlag = 0; + flushFlag = 0; __VIRegs[VI_FCT_0U] = ((((taps[0])) << 0) | (((taps[1] & ((1 << (6)) - 1))) << 10)); - __VIRegs[VI_FCT_0] = ((((taps[1] >> 6)) << 0) | (((taps[2])) << 4)); + __VIRegs[VI_FCT_0] = ((((taps[1] >> 6)) << 0) | (((taps[2])) << 4)); __VIRegs[VI_FCT_1U] = ((((taps[3])) << 0) | (((taps[4] & ((1 << (6)) - 1))) << 10)); - __VIRegs[VI_FCT_1] = ((((taps[4] >> 6)) << 0) | (((taps[5])) << 4)); + __VIRegs[VI_FCT_1] = ((((taps[4] >> 6)) << 0) | (((taps[5])) << 4)); __VIRegs[VI_FCT_2U] = ((((taps[6])) << 0) | (((taps[7] & ((1 << (6)) - 1))) << 10)); - __VIRegs[VI_FCT_2] = ((((taps[7] >> 6)) << 0) | (((taps[8])) << 4)); + __VIRegs[VI_FCT_2] = ((((taps[7] >> 6)) << 0) | (((taps[8])) << 4)); __VIRegs[VI_FCT_3U] = ((((taps[9])) << 0) | (((taps[10])) << 8)); - __VIRegs[VI_FCT_3] = ((((taps[11])) << 0) | (((taps[12])) << 8)); + __VIRegs[VI_FCT_3] = ((((taps[11])) << 0) | (((taps[12])) << 8)); __VIRegs[VI_FCT_4U] = ((((taps[13])) << 0) | (((taps[14])) << 8)); - __VIRegs[VI_FCT_4] = ((((taps[15])) << 0) | (((taps[16])) << 8)); + __VIRegs[VI_FCT_4] = ((((taps[15])) << 0) | (((taps[16])) << 8)); __VIRegs[VI_FCT_5U] = ((((taps[17])) << 0) | (((taps[18])) << 8)); - __VIRegs[VI_FCT_5] = ((((taps[19])) << 0) | (((taps[20])) << 8)); + __VIRegs[VI_FCT_5] = ((((taps[19])) << 0) | (((taps[20])) << 8)); __VIRegs[VI_FCT_6U] = ((((taps[21])) << 0) | (((taps[22])) << 8)); - __VIRegs[VI_FCT_6] = ((((taps[23])) << 0) | (((taps[24])) << 8)); + __VIRegs[VI_FCT_6] = ((((taps[23])) << 0) | (((taps[24])) << 8)); __VIRegs[VI_WIDTH] = 640; ImportAdjustingValues(); tvInBootrom = *(u32*)OSPhysicalToCached(0xCC); - dspCfg = __VIRegs[VI_DISP_CONFIG]; + dspCfg = __VIRegs[VI_DISP_CONFIG]; HorVer.nonInter = ((((u32)(dspCfg)) >> 2 & 0x00000001)); - HorVer.tv = ((((u32)(dspCfg)) & 0x00000300) >> 8); + HorVer.tv = ((((u32)(dspCfg)) & 0x00000300) >> 8); - if ((tvInBootrom == VI_PAL) && (HorVer.tv == VI_NTSC)) { + if ((tvInBootrom == VI_PAL) && (HorVer.tv == VI_NTSC)) + { HorVer.tv = VI_EURGB60; } - tv = (HorVer.tv == VI_DEBUG) ? VI_NTSC : HorVer.tv; - HorVer.timing = getTiming((VITVMode)VI_TVMODE(tv, HorVer.nonInter)); + tv = (HorVer.tv == VI_DEBUG) ? VI_NTSC : HorVer.tv; + HorVer.timing = getTiming((VITVMode)VI_TVMODE(tv, HorVer.nonInter)); regs[VI_DISP_CONFIG] = dspCfg; CurrTiming = HorVer.timing; @@ -413,36 +440,36 @@ void VIInit(void) HorVer.dispSizeX = 640; HorVer.dispSizeY = (u16)(CurrTiming->acv * 2); - HorVer.dispPosX = (u16)((720 - HorVer.dispSizeX) / 2); - HorVer.dispPosY = 0; + HorVer.dispPosX = (u16)((720 - HorVer.dispSizeX) / 2); + HorVer.dispPosY = 0; AdjustPosition(CurrTiming->acv); - HorVer.fbSizeX = 640; - HorVer.fbSizeY = (u16)(CurrTiming->acv * 2); - HorVer.panPosX = 0; - HorVer.panPosY = 0; - HorVer.panSizeX = 640; - HorVer.panSizeY = (u16)(CurrTiming->acv * 2); - HorVer.xfbMode = VI_XFBMODE_SF; + HorVer.fbSizeX = 640; + HorVer.fbSizeY = (u16)(CurrTiming->acv * 2); + HorVer.panPosX = 0; + HorVer.panPosY = 0; + HorVer.panSizeX = 640; + HorVer.panSizeY = (u16)(CurrTiming->acv * 2); + HorVer.xfbMode = VI_XFBMODE_SF; HorVer.wordPerLine = 40; - HorVer.std = 40; - HorVer.wpl = 40; - HorVer.xof = 0; - HorVer.isBlack = TRUE; - HorVer.is3D = FALSE; + HorVer.std = 40; + HorVer.wpl = 40; + HorVer.xof = 0; + HorVer.isBlack = TRUE; + HorVer.is3D = FALSE; OSInitThreadQueue(&retraceQueue); - value = __VIRegs[VI_DISP_INT_0]; - value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); + value = __VIRegs[VI_DISP_INT_0]; + value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); __VIRegs[VI_DISP_INT_0] = value; - value = __VIRegs[VI_DISP_INT_1]; - value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); + value = __VIRegs[VI_DISP_INT_1]; + value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); __VIRegs[VI_DISP_INT_1] = value; - PreCB = nullptr; + PreCB = nullptr; PostCB = nullptr; __OSSetInterruptHandler(24, __VIRetraceHandler); @@ -454,21 +481,22 @@ void VIWaitForRetrace(void) int interrupt; u32 startCount; - interrupt = OSDisableInterrupts(); + interrupt = OSDisableInterrupts(); startCount = retraceCount; - do { + do + { OSSleepThread(&retraceQueue); } while (startCount == retraceCount); OSRestoreInterrupts(interrupt); } -static void setInterruptRegs(VITimingInfo* tm) +inline void setInterruptRegs(VITimingInfo* tm) { u16 vct, hct, borrow; - vct = (u16)(tm->numHalfLines / 2); + vct = (u16)(tm->numHalfLines / 2); borrow = (u16)(tm->numHalfLines % 2); - hct = (u16)((borrow) ? tm->hlw : (u16)0); + hct = (u16)((borrow) ? tm->hlw : (u16)0); vct++; hct++; @@ -480,45 +508,47 @@ static void setInterruptRegs(VITimingInfo* tm) changed |= VI_BITMASK(VI_DISP_INT_0); } -static void setPicConfig(u16 fbSizeX, VIXFBMode xfbMode, u16 panPosX, u16 panSizeX, u8* wordPerLine, u8* std, u8* wpl, u8* xof) +inline void setPicConfig(u16 fbSizeX, VIXFBMode xfbMode, u16 panPosX, u16 panSizeX, u8* wordPerLine, + u8* std, u8* wpl, u8* xof) { *wordPerLine = (u8)((fbSizeX + 15) / 16); - *std = (u8)((xfbMode == VI_XFBMODE_SF) ? *wordPerLine : (u8)(2 * *wordPerLine)); - *xof = (u8)(panPosX % 16); - *wpl = (u8)((*xof + panSizeX + 15) / 16); + *std = (u8)((xfbMode == VI_XFBMODE_SF) ? *wordPerLine : (u8)(2 * *wordPerLine)); + *xof = (u8)(panPosX % 16); + *wpl = (u8)((*xof + panSizeX + 15) / 16); regs[VI_HSW] = (u16)((((u32)(*std))) | (((u32)(*wpl)) << 8)); changed |= VI_BITMASK(VI_HSW); } -static void setBBIntervalRegs(VITimingInfo* tm) +inline void setBBIntervalRegs(VITimingInfo* tm) { u16 val; - val = (u16)((((u32)(tm->bs1))) | (((u32)(tm->be1)) << 5)); + val = (u16)((((u32)(tm->bs1))) | (((u32)(tm->be1)) << 5)); regs[VI_BBI_ODD_U] = val; changed |= VI_BITMASK(VI_BBI_ODD_U); - val = (u16)((((u32)(tm->bs3))) | (((u32)(tm->be3)) << 5)); + val = (u16)((((u32)(tm->bs3))) | (((u32)(tm->be3)) << 5)); regs[VI_BBI_ODD] = val; changed |= VI_BITMASK(VI_BBI_ODD); - val = (u16)((((u32)(tm->bs2))) | (((u32)(tm->be2)) << 5)); + val = (u16)((((u32)(tm->bs2))) | (((u32)(tm->be2)) << 5)); regs[VI_BBI_EVEN_U] = val; changed |= VI_BITMASK(VI_BBI_EVEN_U); - val = (u16)((((u32)(tm->bs4))) | (((u32)(tm->be4)) << 5)); + val = (u16)((((u32)(tm->bs4))) | (((u32)(tm->be4)) << 5)); regs[VI_BBI_EVEN] = val; changed |= VI_BITMASK(VI_BBI_EVEN); } -static void setScalingRegs(u16 panSizeX, u16 dispSizeX, BOOL is3D) +inline void setScalingRegs(u16 panSizeX, u16 dispSizeX, BOOL is3D) { u32 scale; panSizeX = (u16)(is3D ? panSizeX * 2 : panSizeX); - if (panSizeX < dispSizeX) { + if (panSizeX < dispSizeX) + { scale = (256 * (u32)panSizeX + (u32)dispSizeX - 1) / (u32)dispSizeX; regs[VI_HSR] = (u16)((((u32)(scale))) | (((u32)(1)) << 12)); @@ -526,25 +556,29 @@ static void setScalingRegs(u16 panSizeX, u16 dispSizeX, BOOL is3D) regs[VI_WIDTH] = (u16)((((u32)(panSizeX)))); changed |= VI_BITMASK(VI_WIDTH); - } else { + } + else + { regs[VI_HSR] = (u16)((((u32)(256))) | (((u32)(0)) << 12)); changed |= VI_BITMASK(VI_HSR); } } -static void calcFbbs(u32 bufAddr, u16 panPosX, u16 panPosY, u8 wordPerLine, VIXFBMode xfbMode, u16 dispPosY, u32* tfbb, u32* bfbb) +inline void calcFbbs(u32 bufAddr, u16 panPosX, u16 panPosY, u8 wordPerLine, VIXFBMode xfbMode, + u16 dispPosY, u32* tfbb, u32* bfbb) { u32 bytesPerLine, xoffInWords; - xoffInWords = (u32)panPosX / 16; + xoffInWords = (u32)panPosX / 16; bytesPerLine = (u32)wordPerLine * 32; *tfbb = bufAddr + xoffInWords * 32 + bytesPerLine * panPosY; *bfbb = (xfbMode == VI_XFBMODE_SF) ? *tfbb : (*tfbb + bytesPerLine); - if (dispPosY % 2 == 1) { + if (dispPosY % 2 == 1) + { u32 tmp = *tfbb; - *tfbb = *bfbb; - *bfbb = tmp; + *tfbb = *bfbb; + *bfbb = tmp; } *tfbb = ToPhysical(*tfbb); @@ -554,19 +588,27 @@ static void calcFbbs(u32 bufAddr, u16 panPosX, u16 panPosY, u8 wordPerLine, VIXF static void setFbbRegs(VIPositionInfo* hv, u32* tfbb, u32* bfbb, u32* rtfbb, u32* rbfbb) { u32 shifted; - calcFbbs(hv->bufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, hv->adjDispPosY, tfbb, bfbb); + calcFbbs(hv->bufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, + hv->adjDispPosY, tfbb, bfbb); - if (hv->is3D) { - calcFbbs(hv->rbufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, hv->adjDispPosY, rtfbb, rbfbb); + if (hv->is3D) + { + calcFbbs(hv->rbufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, + hv->adjDispPosY, rtfbb, rbfbb); } - if (IS_LOWER_16MB(*tfbb) && IS_LOWER_16MB(*bfbb) && IS_LOWER_16MB(*rtfbb) && IS_LOWER_16MB(*rbfbb)) { + if (IS_LOWER_16MB(*tfbb) && IS_LOWER_16MB(*bfbb) && IS_LOWER_16MB(*rtfbb) && + IS_LOWER_16MB(*rbfbb)) + { shifted = 0; - } else { + } + else + { shifted = 1; } - if (shifted) { + if (shifted) + { *tfbb >>= 5; *bfbb >>= 5; *rtfbb >>= 5; @@ -585,7 +627,8 @@ static void setFbbRegs(VIPositionInfo* hv, u32* tfbb, u32* bfbb, u32* rtfbb, u32 regs[VI_BTTM_FIELD_BASE_LEFT] = (u16)(*bfbb >> 16); changed |= VI_BITMASK(VI_BTTM_FIELD_BASE_LEFT); - if (hv->is3D) { + if (hv->is3D) + { regs[VI_TOP_FIELD_BASE_RIGHT_U] = *rtfbb & 0xffff; changed |= VI_BITMASK(VI_TOP_FIELD_BASE_RIGHT_U); @@ -600,7 +643,7 @@ static void setFbbRegs(VIPositionInfo* hv, u32* tfbb, u32* bfbb, u32* rtfbb, u32 } } -static void setHorizontalRegs(VITimingInfo* tm, u16 dispPosX, u16 dispSizeX) +inline void setHorizontalRegs(VITimingInfo* tm, u16 dispPosX, u16 dispSizeX) { u32 hbe, hbs, hbeLo, hbeHi; @@ -623,33 +666,41 @@ static void setHorizontalRegs(VITimingInfo* tm, u16 dispPosX, u16 dispSizeX) changed |= VI_BITMASK(VI_HORIZ_TIMING_1L); } -static void setVerticalRegs(u16 dispPosY, u16 dispSizeY, u8 equ, u16 acv, u16 prbOdd, u16 prbEven, u16 psbOdd, u16 psbEven, BOOL black) +static void setVerticalRegs(u16 dispPosY, u16 dispSizeY, u8 equ, u16 acv, u16 prbOdd, u16 prbEven, + u16 psbOdd, u16 psbEven, BOOL black) { u16 actualPrbOdd, actualPrbEven, actualPsbOdd, actualPsbEven, actualAcv, c, d; - if (regs[VI_CLOCK_SEL] & 1) { + if (regs[VI_CLOCK_SEL] & 1) + { c = 1; d = 2; - } else { + } + else + { c = 2; d = 1; } - if (dispPosY % 2 == 0) { - actualPrbOdd = (u16)(prbOdd + d * dispPosY); - actualPsbOdd = (u16)(psbOdd + d * ((c * acv - dispSizeY) - dispPosY)); + if (dispPosY % 2 == 0) + { + actualPrbOdd = (u16)(prbOdd + d * dispPosY); + actualPsbOdd = (u16)(psbOdd + d * ((c * acv - dispSizeY) - dispPosY)); actualPrbEven = (u16)(prbEven + d * dispPosY); actualPsbEven = (u16)(psbEven + d * ((c * acv - dispSizeY) - dispPosY)); - } else { - actualPrbOdd = (u16)(prbEven + d * dispPosY); - actualPsbOdd = (u16)(psbEven + d * ((c * acv - dispSizeY) - dispPosY)); + } + else + { + actualPrbOdd = (u16)(prbEven + d * dispPosY); + actualPsbOdd = (u16)(psbEven + d * ((c * acv - dispSizeY) - dispPosY)); actualPrbEven = (u16)(prbOdd + d * dispPosY); actualPsbEven = (u16)(psbOdd + d * ((c * acv - dispSizeY) - dispPosY)); } actualAcv = (u16)(dispSizeY / c); - if (black) { + if (black) + { actualPrbOdd += 2 * actualAcv - 2; actualPsbOdd += 2; actualPrbEven += 2 * actualAcv - 2; @@ -673,22 +724,6 @@ static void setVerticalRegs(u16 dispPosY, u16 dispSizeY, u8 equ, u16 acv, u16 pr changed |= VI_BITMASK(VI_VERT_TIMING_EVEN); } -static void PrintDebugPalCaution(void) -{ - static u32 message = 0; - - if (message == 0) { - message = 1; - OSReport("***************************************\n"); - OSReport(" ! ! ! C A U T I O N ! ! ! \n"); - OSReport("This TV format \"DEBUG_PAL\" is only for \n"); - OSReport("temporary solution until PAL DAC board \n"); - OSReport("is available. Please do NOT use this \n"); - OSReport("mode in real games!!! \n"); - OSReport("***************************************\n"); - } -} - void VIConfigure(const GXRenderModeObj* obj) { VITimingInfo* tm; @@ -696,37 +731,56 @@ void VIConfigure(const GXRenderModeObj* obj) BOOL enabled; u32 newNonInter, tvInBootrom, tvInGame; - enabled = OSDisableInterrupts(); + enabled = OSDisableInterrupts(); newNonInter = (u32)obj->viTVmode & 3; - if (HorVer.nonInter != newNonInter) { - changeMode = 1; + if (HorVer.nonInter != newNonInter) + { + changeMode = 1; HorVer.nonInter = newNonInter; } - tvInGame = (u32)obj->viTVmode >> 2; + tvInGame = (u32)obj->viTVmode >> 2; tvInBootrom = *(u32*)OSPhysicalToCached(0xCC); - if (tvInGame == VI_DEBUG_PAL) { - PrintDebugPalCaution(); + if (tvInGame == VI_DEBUG_PAL) + { + static u32 message = 0; + + if (message == 0) + { + message = 1; + OSReport("***************************************\n"); + OSReport(" ! ! ! C A U T I O N ! ! ! \n"); + OSReport("This TV format \"DEBUG_PAL\" is only for \n"); + OSReport("temporary solution until PAL DAC board \n"); + OSReport("is available. Please do NOT use this \n"); + OSReport("mode in real games!!! \n"); + OSReport("***************************************\n"); + } } - switch (tvInBootrom) { + switch (tvInBootrom) + { case VI_MPAL: case VI_NTSC: case VI_GCA: - if (tvInGame == VI_NTSC || tvInGame == VI_MPAL || tvInGame == VI_GCA) { + if (tvInGame == VI_NTSC || tvInGame == VI_MPAL || tvInGame == VI_GCA) + { break; } goto panic; case VI_PAL: case VI_EURGB60: - if (tvInGame == VI_PAL || tvInGame == VI_EURGB60) { + if (tvInGame == VI_PAL || tvInGame == VI_EURGB60) + { break; } default: panic: - OSErrorLine(1908, "VIConfigure(): Tried to change mode from (%d) to (%d), which is forbidden\n", tvInBootrom, tvInGame); + OSErrorLine(1908, + "VIConfigure(): Tried to change mode from (%d) to (%d), which is forbidden\n", + tvInBootrom, tvInGame); } // if (((tvInBootrom != VI_PAL && tvInBootrom != VI_EURGB60) && (tvInGame == VI_PAL || tvInGame == VI_EURGB60)) // || ((tvInBootrom == VI_PAL || tvInBootrom == VI_EURGB60) && (tvInGame != VI_PAL && tvInGame != VI_EURGB60))) { @@ -734,52 +788,63 @@ void VIConfigure(const GXRenderModeObj* obj) // OSErrorLine(1908, "VIConfigure(): Tried to change mode from (%d) to (%d), which is forbidden\n", tvInBootrom, tvInGame); // } - if ((tvInGame == VI_NTSC) || (tvInGame == VI_MPAL)) { + if ((tvInGame == VI_NTSC) || (tvInGame == VI_MPAL)) + { HorVer.tv = tvInBootrom; - } else { + } + else + { HorVer.tv = tvInGame; } - HorVer.dispPosX = obj->viXOrigin; - HorVer.dispPosY = (u16)((HorVer.nonInter == VI_NON_INTERLACE) ? (u16)(obj->viYOrigin * 2) : obj->viYOrigin); + HorVer.dispPosX = obj->viXOrigin; + HorVer.dispPosY = + (u16)((HorVer.nonInter == VI_NON_INTERLACE) ? (u16)(obj->viYOrigin * 2) : obj->viYOrigin); HorVer.dispSizeX = obj->viWidth; - HorVer.fbSizeX = obj->fbWidth; - HorVer.fbSizeY = obj->xfbHeight; - HorVer.xfbMode = obj->xFBmode; - HorVer.panSizeX = HorVer.fbSizeX; - HorVer.panSizeY = HorVer.fbSizeY; - HorVer.panPosX = 0; - HorVer.panPosY = 0; - - HorVer.dispSizeY = (u16)((HorVer.nonInter == VI_PROGRESSIVE) ? HorVer.panSizeY - : (HorVer.nonInter == VI_3D) ? HorVer.panSizeY - : (HorVer.xfbMode == VI_XFBMODE_SF) ? (u16)(2 * HorVer.panSizeY) - : HorVer.panSizeY); + HorVer.fbSizeX = obj->fbWidth; + HorVer.fbSizeY = obj->xfbHeight; + HorVer.xfbMode = obj->xFBmode; + HorVer.panSizeX = HorVer.fbSizeX; + HorVer.panSizeY = HorVer.fbSizeY; + HorVer.panPosX = 0; + HorVer.panPosY = 0; + + HorVer.dispSizeY = (u16)((HorVer.nonInter == VI_PROGRESSIVE) ? HorVer.panSizeY : + (HorVer.nonInter == VI_3D) ? HorVer.panSizeY : + (HorVer.xfbMode == VI_XFBMODE_SF) ? (u16)(2 * HorVer.panSizeY) : + HorVer.panSizeY); HorVer.is3D = (HorVer.nonInter == VI_3D) ? TRUE : FALSE; - tm = getTiming((VITVMode)VI_TVMODE(HorVer.tv, HorVer.nonInter)); + tm = getTiming((VITVMode)VI_TVMODE(HorVer.tv, HorVer.nonInter)); HorVer.timing = tm; AdjustPosition(tm->acv); - if (encoderType == 0) { + if (encoderType == 0) + { HorVer.tv = VI_DEBUG; } setInterruptRegs(tm); regDspCfg = regs[VI_DISP_CONFIG]; // TODO: USE BIT MACROS OR SOMETHING - if ((HorVer.nonInter == VI_PROGRESSIVE) || (HorVer.nonInter == VI_3D)) { + if ((HorVer.nonInter == VI_PROGRESSIVE) || (HorVer.nonInter == VI_3D)) + { regDspCfg = (((u32)(regDspCfg)) & ~0x00000004) | (((u32)(1)) << 2); - } else { + } + else + { regDspCfg = (((u32)(regDspCfg)) & ~0x00000004) | (((u32)(HorVer.nonInter & 1)) << 2); } regDspCfg = (((u32)(regDspCfg)) & ~0x00000008) | (((u32)(HorVer.is3D)) << 3); - if ((HorVer.tv == VI_DEBUG_PAL) || (HorVer.tv == VI_EURGB60) || (HorVer.tv == VI_GCA)) { + if ((HorVer.tv == VI_DEBUG_PAL) || (HorVer.tv == VI_EURGB60) || (HorVer.tv == VI_GCA)) + { regDspCfg = (((u32)(regDspCfg)) & ~0x00000300); - } else { + } + else + { regDspCfg = (((u32)(regDspCfg)) & ~0x00000300) | (((u32)(HorVer.tv)) << 8); } @@ -787,9 +852,13 @@ void VIConfigure(const GXRenderModeObj* obj) changed |= VI_BITMASK(0x01); regDspCfg = regs[VI_CLOCK_SEL]; - if (obj->viTVmode == VI_TVMODE_NTSC_PROG || obj->viTVmode == VI_TVMODE_NTSC_3D || obj->viTVmode == VI_TVMODE_GCA_PROG) { + if (obj->viTVmode == VI_TVMODE_NTSC_PROG || obj->viTVmode == VI_TVMODE_NTSC_3D || + obj->viTVmode == VI_TVMODE_GCA_PROG) + { regDspCfg = (u32)(regDspCfg & ~0x1) | 1; - } else { + } + else + { regDspCfg = (u32)(regDspCfg & ~0x1); } @@ -800,23 +869,19 @@ void VIConfigure(const GXRenderModeObj* obj) setScalingRegs(HorVer.panSizeX, HorVer.dispSizeX, HorVer.is3D); setHorizontalRegs(tm, HorVer.adjDispPosX, HorVer.dispSizeX); setBBIntervalRegs(tm); - setPicConfig(HorVer.fbSizeX, HorVer.xfbMode, HorVer.panPosX, HorVer.panSizeX, &HorVer.wordPerLine, &HorVer.std, &HorVer.wpl, - &HorVer.xof); + setPicConfig(HorVer.fbSizeX, HorVer.xfbMode, HorVer.panPosX, HorVer.panSizeX, + &HorVer.wordPerLine, &HorVer.std, &HorVer.wpl, &HorVer.xof); - if (FBSet) { + if (FBSet) + { setFbbRegs(&HorVer, &HorVer.tfbb, &HorVer.bfbb, &HorVer.rtfbb, &HorVer.rbfbb); } - setVerticalRegs(HorVer.adjDispPosY, HorVer.adjDispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, tm->psbOdd, tm->psbEven, - HorVer.isBlack); + setVerticalRegs(HorVer.adjDispPosY, HorVer.adjDispSizeY, tm->equ, tm->acv, tm->prbOdd, + tm->prbEven, tm->psbOdd, tm->psbEven, HorVer.isBlack); OSRestoreInterrupts(enabled); } -void VIConfigurePan(u16 panPosX, u16 panPosY, u16 panSizeX, u16 panSizeY) -{ - // UNUSED FUNCTION -} - void VIFlush(void) { BOOL enabled; @@ -828,71 +893,57 @@ void VIFlush(void) changeMode = 0; shdwChanged |= changed; - while (changed) { - regIndex = cntlzd(changed); + while (changed) + { + regIndex = cntlzd(changed); shdwRegs[regIndex] = regs[regIndex]; changed &= ~VI_BITMASK(regIndex); } - flushFlag = 1; + flushFlag = 1; NextBufAddr = HorVer.bufAddr; OSRestoreInterrupts(enabled); } void VISetNextFrameBuffer(void* fb) { - BOOL enabled = OSDisableInterrupts(); + BOOL enabled = OSDisableInterrupts(); HorVer.bufAddr = (u32)fb; - FBSet = 1; + FBSet = 1; setFbbRegs(&HorVer, &HorVer.tfbb, &HorVer.bfbb, &HorVer.rtfbb, &HorVer.rbfbb); OSRestoreInterrupts(enabled); } -void* VIGetNextFrameBuffer(void) { return (void*)NextBufAddr; } - -void* VIGetCurrentFrameBuffer(void) { return (void*)CurrBufAddr; } - -void VISetNextRightFrameBuffer(void* fb) -{ - // UNUSED FUNCTION -} - void VISetBlack(BOOL isBlack) { int interrupt; VITimingInfo* tm; - interrupt = OSDisableInterrupts(); + interrupt = OSDisableInterrupts(); HorVer.isBlack = isBlack; - tm = HorVer.timing; - setVerticalRegs(HorVer.adjDispPosY, HorVer.dispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, tm->psbOdd, tm->psbEven, - HorVer.isBlack); + tm = HorVer.timing; + setVerticalRegs(HorVer.adjDispPosY, HorVer.dispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, + tm->psbOdd, tm->psbEven, HorVer.isBlack); OSRestoreInterrupts(interrupt); } -void VISet3D(void) -{ - // UNUSED FUNCTION -} - -u32 VIGetRetraceCount(void) { return retraceCount; } - static void GetCurrentDisplayPosition(u32* hct, u32* vct) { u32 hcount, vcount0, vcount; vcount = __VIRegs[VI_VERT_COUNT] & 0x7FF; - do { + do + { vcount0 = vcount; - hcount = __VIRegs[VI_HORIZ_COUNT] & 0x7FF; - vcount = __VIRegs[VI_VERT_COUNT] & 0x7FF; + hcount = __VIRegs[VI_HORIZ_COUNT] & 0x7FF; + vcount = __VIRegs[VI_VERT_COUNT] & 0x7FF; } while (vcount0 != vcount); *hct = hcount; *vct = vcount; } -static u32 getCurrentHalfLine(void) +inline u32 getCurrentHalfLine(void) { u32 hcount, vcount; GetCurrentDisplayPosition(&hcount, &vcount); @@ -900,7 +951,10 @@ static u32 getCurrentHalfLine(void) return ((vcount - 1) << 1) + ((hcount - 1) / CurrTiming->hlw); } -static u32 getCurrentFieldEvenOdd() { return (getCurrentHalfLine() < CurrTiming->numHalfLines) ? 1 : 0; } +static u32 getCurrentFieldEvenOdd() +{ + return (getCurrentHalfLine() < CurrTiming->numHalfLines) ? 1 : 0; +} u32 VIGetNextField(void) { @@ -919,12 +973,13 @@ u32 VIGetCurrentLine(void) VITimingInfo* tm; int interrupt; - tm = CurrTiming; + tm = CurrTiming; interrupt = OSDisableInterrupts(); - line = getCurrentHalfLine(); + line = getCurrentHalfLine(); OSRestoreInterrupts(interrupt); - if (line >= tm->numHalfLines) { + if (line >= tm->numHalfLines) + { line -= tm->numHalfLines; } @@ -938,7 +993,8 @@ u32 VIGetTvFormat(void) interrupt = OSDisableInterrupts(); - switch (CurrTvMode) { + switch (CurrTvMode) + { case VI_NTSC: case VI_DEBUG: case VI_GCA: @@ -958,70 +1014,95 @@ u32 VIGetTvFormat(void) return fmt; } -u32 VIGetDTVStatus(void) -{ - u32 stat; - int interrupt; - - interrupt = OSDisableInterrupts(); - stat = (__VIRegs[VI_DTV_STAT] & 3); - OSRestoreInterrupts(interrupt); - return (stat & 1); -} - void __VIDisplayPositionToXY(u32 hcount, u32 vcount, s16* x, s16* y) { u32 halfLine = ((vcount - 1) << 1) + ((hcount - 1) / CurrTiming->hlw); - if (HorVer.nonInter == VI_INTERLACE) { - if (halfLine < CurrTiming->numHalfLines) { - if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) { + if (HorVer.nonInter == VI_INTERLACE) + { + if (halfLine < CurrTiming->numHalfLines) + { + if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) + { *y = -1; - } else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) { + } + else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) + { *y = -1; - } else { + } + else + { *y = (s16)((halfLine - CurrTiming->equ * 3 - CurrTiming->prbOdd) & ~1); } - } else { + } + else + { halfLine -= CurrTiming->numHalfLines; - if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbEven) { + if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbEven) + { *y = -1; - } else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbEven) { + } + else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbEven) + { *y = -1; - } else { + } + else + { *y = (s16)(((halfLine - CurrTiming->equ * 3 - CurrTiming->prbEven) & ~1) + 1); } } - } else if (HorVer.nonInter == VI_NON_INTERLACE) { - if (halfLine >= CurrTiming->numHalfLines) { + } + else if (HorVer.nonInter == VI_NON_INTERLACE) + { + if (halfLine >= CurrTiming->numHalfLines) + { halfLine -= CurrTiming->numHalfLines; } - if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) { + if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) + { *y = -1; - } else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) { + } + else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) + { *y = -1; - } else { + } + else + { *y = (s16)((halfLine - CurrTiming->equ * 3 - CurrTiming->prbOdd) & ~1); } - } else if (HorVer.nonInter == VI_PROGRESSIVE) { - if (halfLine < CurrTiming->numHalfLines) { - if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) { + } + else if (HorVer.nonInter == VI_PROGRESSIVE) + { + if (halfLine < CurrTiming->numHalfLines) + { + if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbOdd) + { *y = -1; - } else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) { + } + else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbOdd) + { *y = -1; - } else { + } + else + { *y = (s16)(halfLine - CurrTiming->equ * 3 - CurrTiming->prbOdd); } - } else { + } + else + { halfLine -= CurrTiming->numHalfLines; - if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbEven) { + if (halfLine < CurrTiming->equ * 3 + CurrTiming->prbEven) + { *y = -1; - } else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbEven) { + } + else if (halfLine >= CurrTiming->numHalfLines - CurrTiming->psbEven) + { *y = -1; - } else + } + else *y = (s16)((halfLine - CurrTiming->equ * 3 - CurrTiming->prbEven) & ~1); } } diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Export/mslsupp.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Export/mslsupp.c index e69de29bb..cfe60633e 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Export/mslsupp.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Export/mslsupp.c @@ -0,0 +1,65 @@ +#include +#include "runtime_libs\debugger\embedded\MetroTRK\Os\dolphin\target_options.h" +#include "runtime_libs\debugger\embedded\MetroTRK\Processor\ppc\Export\targsupp.h" + +DSIOResult __read_file(u32 handle, u8* buffer, size_t* count, void* ref_con); +DSIOResult __write_file(u32 handle, u8* buffer, size_t* count, void* ref_con); +DSIOResult __close_file(u32 handle, u8* buffer, size_t* count, void* ref_con); +DSIOResult __access_file(u32 handle, u8* buffer, size_t* count, void* ref_con, + MessageCommandID cmd); + +/* 80372258-80372314 36CB98 00BC+00 0/0 1/0 0/0 .text __read_console */ +DSIOResult __read_console(u32 handle, u8* buffer, size_t* count, void* ref_con) +{ + if (GetUseSerialIO() == 0) + { + return DS_IOError; + } + return __read_file(DS_Stdin, buffer, count, ref_con); +} + +/* 8037219C-80372258 36CADC 00BC+00 0/0 1/1 0/0 .text __TRK_write_console */ +DSIOResult __TRK_write_console(u32 handle, u8* buffer, size_t* count, void* ref_con) +{ + if (GetUseSerialIO() == 0) + { + return DS_IOError; + } + return __write_file(DS_Stdout, buffer, count, ref_con); +} + +static DSIOResult __read_file(u32 handle, u8* buffer, size_t* count, void* ref_con) +{ + return __access_file(handle, buffer, count, ref_con, DSMSG_ReadFile); +} + +static DSIOResult __write_file(u32 handle, u8* buffer, size_t* count, void* ref_con) +{ + return __access_file(handle, buffer, count, ref_con, DSMSG_WriteFile); +} + +static DSIOResult __access_file(u32 handle, u8* buffer, size_t* count, void* ref_con, + MessageCommandID cmd) +{ + size_t countTemp; + u32 r0; + + if (GetTRKConnected() == DS_NoError) + { + return DS_IOError; + } + + countTemp = *count; + r0 = TRKAccessFile(cmd, handle, &countTemp, buffer); + *count = countTemp; + + switch ((u8)r0) + { + case DS_IONoError: + return DS_IONoError; + case DS_IOEOF: + return DS_IOEOF; + } + + return DS_IOError; +} \ No newline at end of file diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk.c index e69de29bb..f690ba9f7 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk.c @@ -0,0 +1,168 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +#define EXCEPTIONMASK_ADDR 0x80000044 + +static u32 lc_base; +extern u32 _db_stack_addr; + +static u32 TRK_ISR_OFFSETS[15] = { PPC_SystemReset, + PPC_MachineCheck, + PPC_DataStorage, + PPC_InstructionStorage, + PPC_ExternalInterrupt, + PPC_Alignment, + PPC_Program, + PPC_FloatingPointUnavaiable, + PPC_Decrementer, + PPC_SystemCall, + PPC_Trace, + PPC_PerformanceMonitor, + PPC_InstructionAddressBreakpoint, + PPC_SystemManagementInterrupt, + PPC_ThermalManagementInterrupt }; + +void __TRK_reset() +{ + __TRK_copy_vectors(); +} + +/* + * --INFO-- + * Address: 8021FE60 + * Size: 000094 + */ +ASM void InitMetroTRK() +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + + addi r1, r1, -4 + stw r3, 0(r1) + lis r3, gTRKCPUState@h + ori r3, r3, gTRKCPUState@l + stmw r0, ProcessorState_PPC.Default.GPR(r3) //Save the gprs + lwz r4, 0(r1) + addi r1, r1, 4 + stw r1, ProcessorState_PPC.Default.GPR[1](r3) + stw r4, ProcessorState_PPC.Default.GPR[3](r3) + mflr r4 + stw r4, ProcessorState_PPC.Default.LR(r3) + stw r4, ProcessorState_PPC.Default.PC(r3) + mfcr r4 + stw r4, ProcessorState_PPC.Default.CR(r3) + //??? + mfmsr r4 + ori r3, r4, (1 << (31 - 16)) + xori r3, r3, (1 << (31 - 16)) + mtmsr r3 + mtsrr1 r4 //Copy msr to srr1 + //Save misc registers to gTRKCPUState + bl TRKSaveExtended1Block + lis r3, gTRKCPUState@h + ori r3, r3, gTRKCPUState@l + lmw r0, ProcessorState_PPC.Default.GPR(r3) //Restore the gprs + //Reset IABR and DABR + li r0, 0 + mtspr 0x3f2, r0 + mtspr 0x3f5, r0 + //Restore stack pointer + lis r1, _db_stack_addr@h + ori r1, r1, _db_stack_addr@l + mr r3, r5 + bl InitMetroTRKCommTable //Initialize comm table + /* + If InitMetroTRKCommTable returned 1 (failure), an invalid hardware + id or the id for GDEV was somehow passed. Since only BBA or NDEV + are supported, we return early. Otherwise, we proceed with + starting up TRK. + */ + cmpwi r3, 1 + bne initCommTableSuccess + /* + BUG: The code probably orginally reloaded gTRKCPUState here, but + as is it will read the returned value of InitMetroTRKCommTable + as a TRKCPUState struct pointer, causing the CPU to return to + a garbage code address. + */ + lwz r4, ProcessorState_PPC.Default.LR(r3) + mtlr r4 + lmw r0, ProcessorState_PPC.Default.GPR(r3) //Restore the gprs + blr +initCommTableSuccess: + b TRK_main //Jump to TRK_main +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021FEF4 + * Size: 000020 + */ +void EnableMetroTRKInterrupts(void) +{ + EnableEXI2Interrupts(); +} + +/* + * --INFO-- + * Address: 8021FF14 + * Size: 000048 + */ +u32 TRKTargetTranslate(u32 param_0) +{ + if (param_0 >= lc_base) + { + if ((param_0 < lc_base + 0x4000) && ((gTRKCPUState.Extended1.DBAT3U_ & 3) != 0)) + { + return param_0; + } + } + + return param_0 & 0x3FFFFFFF | 0x80000000; +} + +/* + * --INFO-- + * Address: 8021FF5C + * Size: 000060 + */ +void TRK_copy_vector(u32 offset) +{ + void* destPtr = (void*)TRKTargetTranslate(offset); + TRK_memcpy(destPtr, gTRKInterruptVectorTable + offset, 0x100); + TRK_flush_cache(destPtr, 0x100); +} + +/* + * --INFO-- + * Address: 8021FFBC + * Size: 000094 + */ +void __TRK_copy_vectors(void) +{ + int i; + u32 mask; + + mask = *(u32*)TRKTargetTranslate(0x44); + + for (i = 0; i <= 14; ++i) + { + if (mask & (1 << i)) + { + TRK_copy_vector(TRK_ISR_OFFSETS[i]); + } + } +} + +/* + * --INFO-- + * Address: 80220050 + * Size: 000050 + */ +DSError TRKInitializeTarget() +{ + gTRKState.isStopped = TRUE; + gTRKState.msr = __TRK_get_MSR(); + lc_base = 0xE0000000; + return DS_NoError; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk_glue.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk_glue.c index e69de29bb..21a02e78b 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk_glue.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/dolphin_trk_glue.c @@ -0,0 +1,259 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" +#include "Dolphin/db.h" + +#define BUFF_LEN 4362 + +u8 gWriteBuf[BUFF_LEN]; +u8 gReadBuf[BUFF_LEN]; +s32 _MetroTRK_Has_Framing; +s32 gReadCount; +s32 gReadPos; +s32 gWritePos; + +DBCommTable gDBCommTable = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; + +/* + * --INFO-- + * Address: 80220460 + * Size: 000088 + */ +ASM void TRKLoadContext(OSContext* ctx, u32 a) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + lwz r0, OSContext.gpr[0](r3) + lwz r1, OSContext.gpr[1](r3) + lwz r2, OSContext.gpr[2](r3) + lhz r5, OSContext.state(r3) + rlwinm. r6, r5, 0, 0x1e, 0x1e + beq lbl_80371C1C + rlwinm r5, r5, 0, 0x1f, 0x1d + sth r5, OSContext.state(r3) + lmw r5, OSContext.gpr[5](r3) + b lbl_80371C20 +lbl_80371C1C: + lmw r13, OSContext.gpr[13](r3) +lbl_80371C20: + mr r31, r3 + mr r3, r4 + lwz r4, OSContext.cr(r31) + mtcrf 0xff, r4 + lwz r4, OSContext.lr(r31) + mtlr r4 + lwz r4, OSContext.ctr(r31) + mtctr r4 + lwz r4, OSContext.xer(r31) + mtxer r4 + mfmsr r4 + rlwinm r4, r4, 0, 0x11, 0xf //Turn off external exceptions + rlwinm r4, r4, 0, 0x1f, 0x1d //Turn off recoverable exception flag + mtmsr r4 + mtsprg 1, r2 + lwz r4, OSContext.gpr[3](r31) + mtsprg 2, r4 + lwz r4, OSContext.gpr[4](r31) + mtsprg 3, r4 + lwz r2, OSContext.srr0(r31) + lwz r4, OSContext.srr1(r31) + lwz r31, OSContext.gpr[31](r31) + b TRKInterruptHandler +#endif // clang-format on +} +/* + * --INFO-- + * Address: 802204E8 + * Size: 000038 + */ +void TRKEXICallBack(__OSInterrupt param_0, OSContext* ctx) +{ + OSEnableScheduler(); + TRKLoadContext(ctx, 0x500); +} + +// int InitMetroTRKCommTable(int hwId) +// { +// int result; + +// if (hwId == HARDWARE_GDEV) { +// result = Hu_IsStub(); + +// gDBCommTable.initialize_func = (DBCommInitFunc)DBInitComm; +// gDBCommTable.init_interrupts_func = (DBCommFunc)DBInitInterrupts; +// gDBCommTable.peek_func = (DBCommFunc)DBQueryData; +// gDBCommTable.read_func = (DBCommReadFunc)DBRead; +// gDBCommTable.write_func = (DBCommWriteFunc)DBWrite; +// gDBCommTable.open_func = (DBCommFunc)DBOpen; +// gDBCommTable.close_func = (DBCommFunc)DBClose; +// } else { +// result = AMC_IsStub(); + +// gDBCommTable.initialize_func = (DBCommInitFunc)EXI2_Init; +// gDBCommTable.init_interrupts_func = (DBCommFunc)EXI2_EnableInterrupts; +// gDBCommTable.peek_func = (DBCommFunc)EXI2_Poll; +// gDBCommTable.read_func = (DBCommReadFunc)EXI2_ReadN; +// gDBCommTable.write_func = (DBCommWriteFunc)EXI2_WriteN; +// gDBCommTable.open_func = (DBCommFunc)EXI2_Reserve; +// gDBCommTable.close_func = (DBCommFunc)EXI2_Unreserve; +// } + +// return result; +// } + +/* + * --INFO-- + * Address: 80220608 + * Size: 000004 + */ +void TRKUARTInterruptHandler(void) +{ +} + +/* + * --INFO-- + * Address: 8022060C + * Size: 000040 + */ +DSError TRKInitializeIntDrivenUART(u32 param_0, u32 param_1, u32 param_2, volatile u8** param_3) +{ + gDBCommTable.initialize_func(param_3, TRKEXICallBack); + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8022064C + * Size: 000030 + */ +void EnableEXI2Interrupts(void) +{ + gDBCommTable.init_interrupts_func(); +} + +/* + * --INFO-- + * Address: 8022067C + * Size: 000030 + */ +int TRKPollUART(void) +{ + return gDBCommTable.peek_func(); +} + +/* + * --INFO-- + * Address: 802206AC + * Size: 000044 + */ +UARTError TRKReadUARTN(void* bytes, u32 length) +{ + int readErr = gDBCommTable.read_func(bytes, length); + return readErr == 0 ? 0 : -1; +} + +/* + * --INFO-- + * Address: 802206F0 + * Size: 000044 + */ +UARTError TRKWriteUARTN(const void* bytes, u32 length) +{ + int writeErr = gDBCommTable.write_func(bytes, length); + return writeErr == 0 ? 0 : -1; +} + +/* + * --INFO-- + * Address: ........ + * Size: 000050 + */ +UARTError WriteUARTFlush(void) +{ + UARTError readErr = 0; + + while (gWritePos < 0x800) + { + gWriteBuf[gWritePos] = 0; + gWritePos++; + } + if (gWritePos != 0) + { + readErr = TRKWriteUARTN(gWriteBuf, gWritePos); + gWritePos = 0; + } + return readErr; +} +/* + * --INFO-- + * Address: ........ + * Size: 00002C + */ +UARTError WriteUART1(u8 arg0) +{ + gWriteBuf[gWritePos++] = arg0; + return 0; +} + +/* + * --INFO-- + * Address: ........ + * Size: 0000F8 + */ +UARTError TRKReadUARTPoll(u8* arg0) +{ + UARTError readErr = 4; + s32 cnt; + + if (gReadPos >= gReadCount) + { + gReadPos = 0; + cnt = gReadCount = TRKPollUART(); + if (cnt > 0) + { + if (cnt > BUFF_LEN) + { + gReadCount = BUFF_LEN; + } + readErr = TRKReadUARTN(gReadBuf, gReadCount); + if (readErr != 0) + { + gReadCount = 0; + } + } + } + if (gReadPos < gReadCount) + { + *arg0 = gReadBuf[gReadPos++]; + readErr = 0; + } + return readErr; +} + +/* + * --INFO-- + * Address: 80220734 + * Size: 000030 + */ +void ReserveEXI2Port(void) +{ + gDBCommTable.open_func(); +} + +/* + * --INFO-- + * Address: 80220764 + * Size: 000030 + */ +void UnreserveEXI2Port(void) +{ + gDBCommTable.close_func(); +} + +/* + * --INFO-- + * Address: 80220794 + * Size: 000024 + */ +void TRK_board_display(char* str) +{ + OSReport(str); +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/targcont.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/targcont.c index e69de29bb..6bbff90b7 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/targcont.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/targcont.c @@ -0,0 +1,16 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: 802207B8 + * Size: 000034 + */ + +DSError TRKTargetContinue(void) +{ + TRKTargetSetStopped(0); + UnreserveEXI2Port(); + TRKSwapAndGo(); + ReserveEXI2Port(); + return 0; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/target_options.h b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/target_options.h new file mode 100644 index 000000000..c77c54b2b --- /dev/null +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/target_options.h @@ -0,0 +1,17 @@ +#ifndef OS_DOLPHIN_TARGET_OPTIONS_H +#define OS_DOLPHIN_TARGET_OPTIONS_H + +#include "dolphin/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +u8 GetUseSerialIO(void); +void SetUseSerialIO(u8); + +#ifdef __cplusplus +} +#endif + +#endif /* OS_DOLPHIN_TARGET_OPTIONS_H */ diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/usr_put.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/usr_put.c index e69de29bb..084bd755e 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/usr_put.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Os/dolphin/usr_put.c @@ -0,0 +1,140 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: ........ + * Size: 000038 + */ +void usr_putchar_serial(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000050 + */ +BOOL usr_puts_serial(const char* msg) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000004 + */ +void usr_put_initialize_ram(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void usr_putchar_ram(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000044 + */ +void usr_puts_ram(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CEDC + * Size: 000004 + */ +void usr_put_initialize(void) +{ +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void usr_putchar(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void usr_puts(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000024 + */ +void __do_putchar(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000020 + */ +void __do_puts(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 0001B8 + */ +void __do_puthex32(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 0000CC + */ +void __do_puthex8(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000098 + */ +void __do_puthex4(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000068 + */ +void __do_puthex2(void) +{ + // UNUSED FUNCTION +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/dispatch.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/dispatch.c index e69de29bb..cc766cb34 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/dispatch.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/dispatch.c @@ -0,0 +1,60 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +u32 gTRKDispatchTableSize; + +struct DispatchEntry { + DSError (*fn)(TRKBuffer*); +}; + +struct DispatchEntry gTRKDispatchTable[33] = { + { &TRKDoUnsupported }, { &TRKDoConnect }, { &TRKDoDisconnect }, { &TRKDoReset }, { &TRKDoVersions }, + { &TRKDoSupportMask }, { &TRKDoCPUType }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, + { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, + { &TRKDoUnsupported }, { &TRKDoReadMemory }, { &TRKDoWriteMemory }, { &TRKDoReadRegisters }, { &TRKDoWriteRegisters }, + { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoFlushCache }, { &TRKDoUnsupported }, { &TRKDoContinue }, + { &TRKDoStep }, { &TRKDoStop }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported }, + { &TRKDoUnsupported }, { &TRKDoUnsupported }, +}; + +/* + * --INFO-- + * Address: 8021CEE0 + * Size: 000014 + */ +DSError TRKInitializeDispatcher() +{ + gTRKDispatchTableSize = 32; + return DS_NoError; +} + +/* + * --INFO-- + * Address: ........ + * Size: 0000A0 + */ +DSError TRKOverrideDispatch(TRKBuffer* buffer) +{ + return DS_NoError; + + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CEF4 + * Size: 000084 + */ +DSError TRKDispatchMessage(TRKBuffer* buffer) +{ + DSError error; + u8 command; + + error = DS_DispatchError; + TRKSetBufferPosition(buffer, 0); + TRKReadBuffer1_ui8(buffer, &command); + command &= 0xFF; + if (command < gTRKDispatchTableSize) { + error = gTRKDispatchTable[command].fn(buffer); + } + return error; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/main_TRK.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/main_TRK.c index e69de29bb..59da56194 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/main_TRK.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/main_TRK.c @@ -0,0 +1,20 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +static DSError TRK_mainError; + +/* + * --INFO-- + * Address: 80220418 + * Size: 000048 + */ +DSError TRK_main(void) +{ + TRK_mainError = TRKInitializeNub(); + + if (TRK_mainError == DS_NoError) { + TRKNubWelcome(); + TRKNubMainLoop(); + } + + return TRK_mainError = TRKTerminateNub(); +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mainloop.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mainloop.c index e69de29bb..b3796184a 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mainloop.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mainloop.c @@ -0,0 +1,76 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +extern TRKEventQueue gTRKEventQueue; +extern TRKState gTRKState; + +void TRKHandleRequestEvent(TRKEvent* event) +{ + TRKBuffer* buffer = TRKGetBuffer(event->msgBufID); + TRKDispatchMessage(buffer); +} + +void TRKHandleSupportEvent(TRKEvent* event) +{ + TRKTargetSupportRequest(); +} + +void TRKIdle() +{ + if (TRKTargetStopped() == FALSE) + { + TRKTargetContinue(); + } +} + +void TRKNubMainLoop(void) +{ + TRKEvent event; + BOOL isShutdownRequested; + BOOL isNewInput; + + isShutdownRequested = FALSE; + isNewInput = FALSE; + while (isShutdownRequested == FALSE) + { + if (TRKGetNextEvent(&event) != FALSE) + { + isNewInput = FALSE; + + switch (event.eventType) + { + case NUBEVENT_Null: + break; + + case NUBEVENT_Request: + TRKHandleRequestEvent(&event); + break; + + case NUBEVENT_Shutdown: + isShutdownRequested = TRUE; + break; + + case NUBEVENT_Breakpoint: + case NUBEVENT_Exception: + TRKTargetInterrupt(&event); + break; + + case NUBEVENT_Support: + TRKHandleSupportEvent(&event); + break; + } + + TRKDestructEvent(&event); + continue; + } + + if ((isNewInput == FALSE) || (*(u8*)gTRKInputPendingPtr != '\0')) + { + isNewInput = TRUE; + TRKGetInput(); + continue; + } + + TRKIdle(); + isNewInput = FALSE; + } +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mem_TRK.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mem_TRK.c index e69de29bb..29ead0b78 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mem_TRK.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mem_TRK.c @@ -0,0 +1,96 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +static void TRK_fill_mem(void* dest, int val, size_t count); + +void* TRK_memcpy(void* dest, const void* src, size_t count) +{ + u8* s = (u8*)src - 1; + u8* d = (u8*)dest - 1; + + count++; + + while (--count) + { + *++d = *++s; + } +} + +void* TRK_memset(void* dest, int val, size_t count) +{ + TRK_fill_mem(dest, val, count); + return dest; +} + +static void TRK_fill_mem(void* dest, int value, size_t length) +{ +#define cDest ((u8*)dest) +#define lDest ((u32*)dest) + u32 val = (u8)value; + u32 i; + lDest = (u32*)dest; + cDest = (u8*)dest; + + cDest--; + + if (length >= 32) + { + i = ~(u32)dest & 3; + + if (i) + { + length -= i; + do + { + *++cDest = val; + } while (--i); + } + + if (val) + { + val |= val << 24 | val << 16 | val << 8; + } + + lDest = (u32*)(cDest + 1) - 1; + + i = length >> 5; + if (i) + { + do + { + *++lDest = val; + *++lDest = val; + *++lDest = val; + *++lDest = val; + *++lDest = val; + *++lDest = val; + *++lDest = val; + *++lDest = val; + } while (--i); + } + + i = (length & 31) >> 2; + + if (i) + { + do + { + *++lDest = val; + } while (--i); + } + + cDest = (u8*)(lDest + 1) - 1; + + length &= 3; + } + + if (length) + { + do + { + *++cDest = val; + } while (--length); + } + +#undef cDest +#undef lDest +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msg.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msg.c index e69de29bb..29533094d 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msg.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msg.c @@ -0,0 +1,33 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: ........ + * Size: 00002C + */ +/* +void TRKMessageAdd(void) +{ + // UNUSED FUNCTION +} +*/ +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +/* +void TRKMessageGet(void) +{ + // UNUSED FUNCTION +} +*/ +/* + * --INFO-- + * Address: 8021C4A4 + * Size: 000028 + */ +DSError TRKMessageSend(TRKBuffer* param_1) +{ + return TRKWriteUARTN(param_1->data, param_1->length); +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msgbuf.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msgbuf.c index e69de29bb..cce3a6339 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msgbuf.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msgbuf.c @@ -0,0 +1,536 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +TRKBuffer gTRKMsgBufs[3]; + +/* + * --INFO-- + * Address: 8021C4CC + * Size: 000008 + */ +static void TRKSetBufferUsed(TRKBuffer* msg, BOOL state) +{ + msg->isInUse = state; +} + +/* + * --INFO-- + * Address: 8021C4D4 + * Size: 000078 + */ +DSError TRKInitializeMessageBuffers(void) +{ + int i; + for (i = 0; i < 3; i++) { + TRKInitializeMutex(&gTRKMsgBufs[i]); + TRKAcquireMutex(&gTRKMsgBufs[i]); + TRKSetBufferUsed(&gTRKMsgBufs[i], FALSE); + TRKReleaseMutex(&gTRKMsgBufs[i]); + } + + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021C54C + * Size: 00009C + */ +DSError TRKGetFreeBuffer(int* msgID, TRKBuffer** outMsg) +{ + DSError error = DS_NoMessageBufferAvailable; + int i; + *outMsg = NULL; + + for (i = 0; i < 3; i++) { + TRKBuffer* buf = TRKGetBuffer(i); + + TRKAcquireMutex(buf); + if (!buf->isInUse) { + TRKResetBuffer(buf, 1); + TRKSetBufferUsed(buf, TRUE); + error = DS_NoError; + *outMsg = buf; + *msgID = i; + i = 3; // why not break? weird choice + } + TRKReleaseMutex(buf); + } + + return error; +} + +/* + * --INFO-- + * Address: 8021C5E8 + * Size: 00002C + */ +void* TRKGetBuffer(int idx) +{ + TRKBuffer* buf = NULL; + if (idx >= 0 && idx < 3) { + buf = &gTRKMsgBufs[idx]; + } + + return buf; +} + +/* + * --INFO-- + * Address: 8021C614 + * Size: 000068 + */ +void TRKReleaseBuffer(int idx) +{ + TRKBuffer* msg; + if (idx != -1 && idx >= 0 && idx < 3) { + msg = &gTRKMsgBufs[idx]; + TRKAcquireMutex(msg); + TRKSetBufferUsed(msg, FALSE); + TRKReleaseMutex(msg); + } +} + +/* + * --INFO-- + * Address: 8021C67C + * Size: 000040 + */ +void TRKResetBuffer(TRKBuffer* msg, u8 keepData) +{ + msg->length = 0; + msg->position = 0; + + if (!keepData) { + TRK_memset(msg->data, 0, TRKMSGBUF_SIZE); + } +} + +/* + * --INFO-- + * Address: 8021C6BC + * Size: 000030 + */ +DSError TRKSetBufferPosition(TRKBuffer* msg, u32 pos) +{ + DSError error = DS_NoError; + + if (pos > 0x880) { + error = DS_MessageBufferOverflow; + } else { + msg->position = pos; + // If the new position is past the current length, + // update the length + if (pos > msg->length) { + msg->length = pos; + } + } + + return error; +} + +/* + * --INFO-- + * Address: 8021C6EC + * Size: 0000A4 + */ +#pragma dont_inline on +DSError TRKAppendBuffer(TRKBuffer* msg, const void* data, size_t length) +{ + DSError error = DS_NoError; // r31 + u32 bytesLeft; + + // Return if no bytes to append + if (length == 0) { + return DS_NoError; + } + + bytesLeft = 0x880 - msg->position; + + // If there isn't enough space left in the buffer, change the number + // of bytes to append to the remaning number of bytes + if (bytesLeft < length) { + error = DS_MessageBufferOverflow; + length = bytesLeft; + } + + if (length == 1) { + // If the length of bytes to append is 1, just copy the byte over + msg->data[msg->position] = ((u8*)data)[0]; + } else { + // Otherwise, use memcpy + TRK_memcpy(msg->data + msg->position, data, length); + } + + // Update the position and length + msg->position += length; + msg->length = msg->position; + + return error; +} +#pragma dont_inline reset + +/* + * --INFO-- + * Address: 8021C790 + * Size: 00008C + */ +DSError TRKReadBuffer(TRKBuffer* msg, void* data, size_t length) +{ + DSError error = DS_NoError; + unsigned int bytesLeft; // this has to be unsigned int not u32 to match lmfao. + + // Return if no bytes to read + if (length == 0) { + return DS_NoError; + } + + bytesLeft = msg->length - msg->position; + + // If the number of bytes to read exceeds the buffer length, change + // the length to the remaining number of bytes + if (length > bytesLeft) { + error = DS_MessageBufferReadError; + length = bytesLeft; + } + + TRK_memcpy(data, msg->data + msg->position, length); + msg->position += length; + return error; +} + +/* + * --INFO-- + * Address: 8021C81C + * Size: 000054 + */ +DSError TRKAppendBuffer1_ui16(TRKBuffer* buffer, const u16 data) +{ + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + + if (gTRKBigEndian) { + bigEndianData = (u8*)&data; + } else { + byteData = (u8*)&data; + bigEndianData = swapBuffer; + + bigEndianData[0] = byteData[1]; + bigEndianData[1] = byteData[0]; + } + + return TRKAppendBuffer(buffer, (const void*)bigEndianData, sizeof(data)); +} + +/* + * --INFO-- + * Address: 8021C870 + * Size: 000064 + */ +DSError TRKAppendBuffer1_ui32(TRKBuffer* buffer, const u32 data) +{ + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + + if (gTRKBigEndian) { + bigEndianData = (u8*)&data; + } else { + byteData = (u8*)&data; + bigEndianData = swapBuffer; + + bigEndianData[0] = byteData[3]; + bigEndianData[1] = byteData[2]; + bigEndianData[2] = byteData[1]; + bigEndianData[3] = byteData[0]; + } + + return TRKAppendBuffer(buffer, (const void*)bigEndianData, sizeof(data)); +} +/* + * --INFO-- + * Address: 8021C8D4 + * Size: 000088 + */ +DSError TRKAppendBuffer1_ui64(TRKBuffer* buffer, const u64 data) +{ + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + if (gTRKBigEndian) { + bigEndianData = (u8*)&data; + } else { + byteData = (u8*)&data; + bigEndianData = swapBuffer; + + bigEndianData[0] = byteData[7]; + bigEndianData[1] = byteData[6]; + bigEndianData[2] = byteData[5]; + bigEndianData[3] = byteData[4]; + bigEndianData[4] = byteData[3]; + bigEndianData[5] = byteData[2]; + bigEndianData[6] = byteData[1]; + bigEndianData[7] = byteData[0]; + } + + return TRKAppendBuffer(buffer, (const void*)bigEndianData, sizeof(data)); +} + +/* + * --INFO-- + * Address: ........ + * Size: 0000C4 + */ +void TRKAppendBuffer1_ui128(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021C95C + * Size: 000068 + */ +DSError TRKAppendBuffer_ui8(TRKBuffer* buffer, const u8* data, int count) +{ + DSError err; + int i; + + for (i = 0, err = DS_NoError; err == DS_NoError && i < count; i++) { + err = TRKAppendBuffer1_ui8(buffer, data[i]); + } + + return err; +} + +/* + * --INFO-- + * Address: ........ + * Size: 00007C + */ +void TRKAppendBuffer_ui16(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021C9C4 + * Size: 00007C + */ +DSError TRKAppendBuffer_ui32(TRKBuffer* buffer, const u32* data, int count) +{ + DSError err; + int i; + + for (i = 0, err = DS_NoError; err == DS_NoError && i < count; i++) { + err = TRKAppendBuffer1_ui32(buffer, data[i]); + } + + return err; +} + +/* + * --INFO-- + * Address: ........ + * Size: 000080 + */ +void TRKAppendBuffer_ui64(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 00007C + */ +void TRKAppendBuffer_ui128(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CA40 + * Size: 000024 + */ +DSError TRKReadBuffer1_ui8(TRKBuffer* buffer, u8* data) +{ + return TRKReadBuffer(buffer, (void*)data, 1); +} + +/* + * --INFO-- + * Address: 8021CA64 + * Size: 000080 + */ +DSError TRKReadBuffer1_ui16(TRKBuffer* buffer, u16* data) +{ + DSError err; + + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + + if (gTRKBigEndian) { + bigEndianData = (u8*)data; + } else { + bigEndianData = swapBuffer; + } + + err = TRKReadBuffer(buffer, (void*)bigEndianData, sizeof(*data)); + + if (!gTRKBigEndian && err == DS_NoError) { + byteData = (u8*)data; + + byteData[0] = bigEndianData[1]; + byteData[1] = bigEndianData[0]; + } + + return err; +} + +/* + * --INFO-- + * Address: 8021CAE4 + * Size: 000090 + */ +DSError TRKReadBuffer1_ui32(TRKBuffer* buffer, u32* data) +{ + DSError err; + + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + + if (gTRKBigEndian) { + bigEndianData = (u8*)data; + } else { + bigEndianData = swapBuffer; + } + + err = TRKReadBuffer(buffer, (void*)bigEndianData, sizeof(*data)); + + if (!gTRKBigEndian && err == DS_NoError) { + byteData = (u8*)data; + + byteData[0] = bigEndianData[3]; + byteData[1] = bigEndianData[2]; + byteData[2] = bigEndianData[1]; + byteData[3] = bigEndianData[0]; + } + + return err; +} + +/* + * --INFO-- + * Address: 8021CB74 + * Size: 0000B0 + */ +DSError TRKReadBuffer1_ui64(TRKBuffer* buffer, u64* data) +{ + DSError err; + + u8* bigEndianData; + u8* byteData; + u8 swapBuffer[sizeof(data)]; + + if (gTRKBigEndian) { + bigEndianData = (u8*)data; + } else { + bigEndianData = swapBuffer; + } + + err = TRKReadBuffer(buffer, (void*)bigEndianData, sizeof(*data)); + + if (!gTRKBigEndian && err == 0) { + byteData = (u8*)data; + + byteData[0] = bigEndianData[7]; + byteData[1] = bigEndianData[6]; + byteData[2] = bigEndianData[5]; + byteData[3] = bigEndianData[4]; + byteData[4] = bigEndianData[3]; + byteData[5] = bigEndianData[2]; + byteData[6] = bigEndianData[1]; + byteData[7] = bigEndianData[0]; + } + + return err; +} + +/* + * --INFO-- + * Address: ........ + * Size: 0000F0 + */ +void TRKReadBuffer1_ui128(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CC24 + * Size: 000074 + */ +DSError TRKReadBuffer_ui8(TRKBuffer* buffer, u8* data, int count) +{ + DSError err; + int i; + + for (i = 0, err = DS_NoError; err == DS_NoError && i < count; i++) { + err = TRKReadBuffer1_ui8(buffer, &(data[i])); + } + + return err; +} + +/* + * --INFO-- + * Address: ........ + * Size: 00007C + */ +void TRKReadBuffer_ui16(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CC98 + * Size: 00007C + */ +DSError TRKReadBuffer_ui32(TRKBuffer* buffer, u32* data, int count) +{ + DSError err; + s32 i; + + for (i = 0, err = DS_NoError; err == DS_NoError && i < count; i++) { + err = TRKReadBuffer1_ui32(buffer, &(data[i])); + } + + return err; +} + +/* + * --INFO-- + * Address: ........ + * Size: 00007C + */ +void TRKReadBuffer_ui64(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 00007C + */ +void TRKReadBuffer_ui128(void) +{ + // UNUSED FUNCTION +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.c index e69de29bb..b13760a05 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.c @@ -0,0 +1,741 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +typedef struct _TRK_Msg { + u8 _00[8]; + u32 m_msgLength; + u32 _0C; + u8 m_msg[4]; // TODO: unknown array length +} TRK_Msg; + +/* + * --INFO-- + * Address: 8021CF78 + * Size: 000098 + */ +void TRKMessageIntoReply(TRKBuffer* buffer, MessageCommandID ackCmd, DSReplyError errSentInAck) +{ + TRKResetBuffer(buffer, 1); + + TRKAppendBuffer1_ui8(buffer, ackCmd); + TRKAppendBuffer1_ui8(buffer, errSentInAck); +} + +/* + * --INFO-- + * Address: 8021D010 + * Size: 000050 + */ +DSError TRKSendACK(TRKBuffer* buffer) +{ + DSError err; + int ackTries; + + ackTries = 3; + do { + err = TRKMessageSend(buffer); + --ackTries; + } while (err != DS_NoError && ackTries > 0); + + return err; +} + +/* + * --INFO-- + * Address: 8021D060 + * Size: 000034 + */ +DSError TRKStandardACK(TRKBuffer* buffer, MessageCommandID commandID, DSReplyError replyError) +{ + TRKMessageIntoReply(buffer, commandID, replyError); + return TRKSendACK(buffer); +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void TRKDoError(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021D094 + * Size: 000028 + */ +DSError TRKDoUnsupported(TRKBuffer* buffer) +{ + return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_UnsupportedCommandError); +} + +/* + * --INFO-- + * Address: 8021D0BC + * Size: 000028 + */ +DSError TRKDoConnect(TRKBuffer* buffer) +{ + return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError); +} + +/* + * --INFO-- + * Address: 8021D0E4 + * Size: 000050 + */ +DSError TRKDoDisconnect(TRKBuffer* buffer) +{ + DSError error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + TRKEvent event; + + if (error == DS_NoError) { + TRKConstructEvent(&event, 1); + TRKPostEvent(&event); + } + return error; +} + +/* + * --INFO-- + * Address: 8021D134 + * Size: 000030 + */ +DSError TRKDoReset(TRKBuffer* buffer) +{ + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + __TRK_reset(); + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021D164 + * Size: 000184 + */ +DSError TRKDoVersions(TRKBuffer* buffer) +{ + DSError error; + DSVersions versions; + + if (buffer->length != 1) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + } else { + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + error = TRKTargetVersions(&versions); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, versions.kernelMajor); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, versions.kernelMinor); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, versions.protocolMajor); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, versions.protocolMinor); + + if (error != DS_NoError) + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_CWDSError); + else + error = TRKSendACK(buffer); + } +} + +/* + * --INFO-- + * Address: 8021D2E8 + * Size: 0000DC + */ +DSError TRKDoSupportMask(TRKBuffer* buffer) +{ + DSError error; + u8 mask[32]; + + if (buffer->length != 1) { + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + } else { + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + error = TRKTargetSupportMask(mask); + + if (error == DS_NoError) + error = TRKAppendBuffer(buffer, mask, 32); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, 2); + + if (error != DS_NoError) + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_CWDSError); + else + TRKSendACK(buffer); + } +} + +/* + * --INFO-- + * Address: 8021D3C4 + * Size: 000244 + */ +DSError TRKDoCPUType(TRKBuffer* buffer) +{ + DSError error; + DSCPUType cputype; + + if (buffer->length != 1) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + error = TRKTargetCPUType(&cputype); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.cpuMajor); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.cpuMinor); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.bigEndian); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.defaultTypeSize); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.fpTypeSize); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.extended1TypeSize); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, cputype.extended2TypeSize); + + if (error != DS_NoError) + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_CWDSError); + else + error = TRKSendACK(buffer); +} + +/* + * --INFO-- + * Address: 8021D608 + * Size: 0001E8 + */ +DSError TRKDoReadMemory(TRKBuffer* buffer) +{ + u8 tempBuf[0x800] ATTRIBUTE_ALIGN(32); + u32 length; + u32 msg_start; + u16 msg_length; + u8 msg_options; + u8 msg_command; + DSReplyError replyError; + DSError error; + + if (buffer->length != 8) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return error; + } + + TRKSetBufferPosition(buffer, DSREPLY_NoError); + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_length); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_start); + + if (msg_options & 2) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_UnsupportedOptionError); + return error; + } + + if (msg_length > 0x800) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError); + return error; + } + + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + if (error == DS_NoError) { + length = (u32)msg_length; + error = TRKTargetAccessMemory(tempBuf, msg_start, &length, (msg_options & 8) ? MEMACCESS_UserMemory : MEMACCESS_DebuggerMemory, 1); + msg_length = (u16)length; + if (error == DS_NoError) + error = TRKAppendBuffer1_ui16(buffer, msg_length); + if (error == DS_NoError) + error = TRKAppendBuffer(buffer, tempBuf, length); + } + + if (error != DS_NoError) { + switch (error) { + case DS_CWDSException: + replyError = DSREPLY_CWDSException; + break; + case DS_InvalidMemory: + replyError = DSREPLY_InvalidMemoryRange; + break; + case DS_InvalidProcessID: + replyError = DSREPLY_InvalidProcessID; + break; + case DS_InvalidThreadID: + replyError = DSREPLY_InvalidThreadID; + break; + case DS_OSError: + replyError = DSREPLY_OSError; + break; + default: + replyError = DSREPLY_CWDSError; + break; + } + error = TRKStandardACK(buffer, DSMSG_ReplyACK, replyError); + } else { + error = TRKSendACK(buffer); + } + + return error; +} + +/* + * --INFO-- + * Address: 8021D7F0 + * Size: 0001FC + */ +DSError TRKDoWriteMemory(TRKBuffer* buffer) +{ + u8 tmpBuffer[0x800] ATTRIBUTE_ALIGN(32); + u32 length; + u32 msg_start; + u16 msg_length; + u8 msg_options; + u8 msg_command; + DSReplyError replyError; + DSError error; + + if (buffer->length <= 8) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return error; + } + + TRKSetBufferPosition(buffer, DSREPLY_NoError); + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_length); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_start); + + if (msg_options & 2) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_UnsupportedOptionError); + return error; + } + + if ((buffer->length != msg_length + 8) || (msg_length > 0x800)) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError); + } else { + if (error == DS_NoError) { + length = (u32)msg_length; + error = TRKReadBuffer(buffer, tmpBuffer, length); + if (error == DS_NoError) { + error = TRKTargetAccessMemory(tmpBuffer, msg_start, &length, + (msg_options & 8) ? MEMACCESS_UserMemory : MEMACCESS_DebuggerMemory, FALSE); + } + msg_length = (u16)length; + } + + if (error == DS_NoError) + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui16(buffer, msg_length); + + if (error != DS_NoError) { + switch (error) { + case DS_CWDSException: + replyError = DSREPLY_CWDSException; + break; + case DS_InvalidMemory: + replyError = DSREPLY_InvalidMemoryRange; + break; + case DS_InvalidProcessID: + replyError = DSREPLY_InvalidProcessID; + break; + case DS_InvalidThreadID: + replyError = DSREPLY_InvalidThreadID; + break; + case DS_OSError: + replyError = DSREPLY_OSError; + break; + default: + replyError = DSREPLY_CWDSError; + break; + } + error = TRKStandardACK(buffer, DSMSG_ReplyACK, replyError); + } else { + error = TRKSendACK(buffer); + } + } + + return error; +} + +/* + * --INFO-- + * Address: 8021D9EC + * Size: 000204 + */ +DSError TRKDoReadRegisters(TRKBuffer* buffer) +{ + DSMessageRegisterOptions options; + u32 registerDataLength; + u16 msg_lastRegister; + u16 msg_firstRegister; + u8 msg_options; + u8 msg_command; + DSError error; + DSReplyError replyError; + + if (buffer->length != 6) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + TRKSetBufferPosition(buffer, DSREPLY_NoError); + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_firstRegister); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_lastRegister); + + if (msg_firstRegister > msg_lastRegister) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_InvalidRegisterRange); + return; + } + + if (error == DS_NoError) + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + options = (DSMessageRegisterOptions)(msg_options & 7); + switch (options) { + case DSREG_Default: + error = TRKTargetAccessDefault(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, TRUE); + break; + case DSREG_FP: + error = TRKTargetAccessFP(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, TRUE); + break; + case DSREG_Extended1: + error = TRKTargetAccessExtended1(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, TRUE); + break; + case DSREG_Extended2: + error = TRKTargetAccessExtended2(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, TRUE); + break; + default: + error = DS_UnsupportedError; + break; + } + + if (error != DS_NoError) { + switch (error) { + case DS_UnsupportedError: + replyError = DSREPLY_UnsupportedOptionError; + break; + case DS_InvalidRegister: + replyError = DSREPLY_InvalidRegisterRange; + break; + case DS_CWDSException: + replyError = DSREPLY_CWDSException; + break; + case DS_InvalidProcessID: + replyError = DSREPLY_InvalidProcessID; + break; + case DS_InvalidThreadID: + replyError = DSREPLY_InvalidThreadID; + break; + case DS_OSError: + replyError = DSREPLY_OSError; + break; + default: + replyError = DSREPLY_CWDSError; + } + + error = TRKStandardACK(buffer, DSMSG_ReplyACK, replyError); + } else { + error = TRKSendACK(buffer); + } +} + +/* + * --INFO-- + * Address: 8021DBF0 + * Size: 000208 + */ +DSError TRKDoWriteRegisters(TRKBuffer* buffer) +{ + DSMessageRegisterOptions options; + u32 registerDataLength; + u16 msg_lastRegister; + u16 msg_firstRegister; + u8 msg_options; + u8 msg_command; + DSError error; + DSReplyError replyError; + + if (buffer->length <= 6) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + TRKSetBufferPosition(buffer, DSREPLY_NoError); + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_firstRegister); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(buffer, &msg_lastRegister); + + if (msg_firstRegister > msg_lastRegister) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_InvalidRegisterRange); + return; + } + + options = (DSMessageRegisterOptions)msg_options; + switch (options) { + case DSREG_Default: + error = TRKTargetAccessDefault(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, FALSE); + break; + case DSREG_FP: + error = TRKTargetAccessFP(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, FALSE); + break; + case DSREG_Extended1: + error = TRKTargetAccessExtended1(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, FALSE); + break; + case DSREG_Extended2: + error = TRKTargetAccessExtended2(msg_firstRegister, msg_lastRegister, buffer, ®isterDataLength, FALSE); + break; + default: + error = DS_UnsupportedError; + break; + } + + if (error == DS_NoError) + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + if (error != DS_NoError) { + switch (error) { + case DS_UnsupportedError: + replyError = DSREPLY_UnsupportedOptionError; + break; + case DS_InvalidRegister: + replyError = DSREPLY_InvalidRegisterRange; + break; + case DS_MessageBufferReadError: + replyError = DSREPLY_PacketSizeError; + break; + case DS_CWDSException: + replyError = DSREPLY_CWDSException; + break; + case DS_InvalidProcessID: + replyError = DSREPLY_InvalidProcessID; + break; + case DS_InvalidThreadID: + replyError = DSREPLY_InvalidThreadID; + break; + case DS_OSError: + replyError = DSREPLY_OSError; + break; + default: + replyError = DSREPLY_CWDSError; + } + + error = TRKStandardACK(buffer, DSMSG_ReplyACK, replyError); + } else { + error = TRKSendACK(buffer); + } +} + +/* + * --INFO-- + * Address: 8021DDF8 + * Size: 000138 + */ +DSError TRKDoFlushCache(TRKBuffer* buffer) +{ + u32 msg_end; + u32 msg_start; + u8 msg_options; + u8 msg_command; + DSError error; + DSReplyError replyErr; + + if (buffer->length != 10) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + + TRKSetBufferPosition(buffer, DSREPLY_NoError); + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_start); + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_end); + + if (msg_start > msg_end) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_InvalidMemoryRange); + return; + } + + if (error == DS_NoError) + error = TRKTargetFlushCache(msg_options, (void*)msg_start, (void*)msg_end); + + if (error == DS_NoError) + TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + + if (error != DS_NoError) { + switch (error) { + case DS_UnsupportedError: + replyErr = DSREPLY_UnsupportedOptionError; + break; + default: + replyErr = DSREPLY_CWDSError; + break; + } + + error = TRKStandardACK(buffer, DSMSG_ReplyACK, replyErr); + } else { + error = TRKSendACK(buffer); + } +} + +/* + * --INFO-- + * Address: 8021DF30 + * Size: 000064 + */ +DSError TRKDoContinue(TRKBuffer* buffer) +{ + DSError error; + + error = TRKTargetStopped(); + if (error == DS_NoError) { + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NotStopped); + return; + } + + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + if (error == DS_NoError) + error = TRKTargetContinue(); +} + +/* + * --INFO-- + * Address: 8021DF94 + * Size: 000204 + */ +DSError TRKDoStep(TRKBuffer* buffer) +{ + DSError error; + u32 msg_rangeEnd; + u32 msg_rangeStart; + u8 msg_count; + u8 msg_options; + u8 msg_command; + u32 pc; + + if (buffer->length < 3) { + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + + TRKSetBufferPosition(buffer, DSREPLY_NoError); + + error = TRKReadBuffer1_ui8(buffer, &msg_command); + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(buffer, &msg_options); + + switch (msg_options) { + case DSSTEP_IntoCount: + case DSSTEP_OverCount: + if (error == DS_NoError) + TRKReadBuffer1_ui8(buffer, &msg_count); + if (msg_count >= 1) { + break; + } + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError); + return; + case DSSTEP_IntoRange: + case DSSTEP_OverRange: + if (buffer->length != 10) { + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError); + return; + } + + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_rangeStart); + if (error == DS_NoError) + error = TRKReadBuffer1_ui32(buffer, &msg_rangeEnd); + + pc = TRKTargetGetPC(); + if (pc >= msg_rangeStart && pc <= msg_rangeEnd) { + break; + } + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError); + return; + default: + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_UnsupportedOptionError); + return; + } + + if (!TRKTargetStopped()) { + TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NotStopped); + return; + } + + error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError); + if (error == DS_NoError) + switch (msg_options) { + case DSSTEP_IntoCount: + case DSSTEP_OverCount: + error = TRKTargetSingleStep(msg_count, (msg_options == DSSTEP_OverCount)); + break; + case DSSTEP_IntoRange: + case DSSTEP_OverRange: + error = TRKTargetStepOutOfRange(msg_rangeStart, msg_rangeEnd, (msg_options == DSSTEP_OverRange)); + break; + } +} + +/* + * --INFO-- + * Address: 8021E198 + * Size: 000084 + */ +DSError TRKDoStop(TRKBuffer* b) +{ + DSReplyError replyError; + + switch (TRKTargetStop()) { + case DS_NoError: + replyError = DSREPLY_NoError; + break; + case DS_InvalidProcessID: + replyError = DSREPLY_InvalidProcessID; + break; + case DS_InvalidThreadID: + replyError = DSREPLY_InvalidThreadID; + break; + case DS_OSError: + replyError = DSREPLY_OSError; + break; + default: + replyError = DSREPLY_Error; + break; + } + + return TRKStandardACK(b, DSMSG_ReplyACK, replyError); +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.h b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.h new file mode 100644 index 000000000..7d1432852 --- /dev/null +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/msghndlr.h @@ -0,0 +1,23 @@ +#ifndef METROTRK_PORTABLE_MSGHNDLR_H +#define METROTRK_PORTABLE_MSGHNDLR_H + +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +void SetTRKConnected(BOOL); +BOOL GetTRKConnected(void); +DSError TRKDoSetOption(TRKBuffer*); +DSError TRKDoStop(TRKBuffer*); +DSError TRKDoStep(TRKBuffer*); +DSError TRKDoContinue(TRKBuffer*); +DSError TRKDoWriteRegisters(TRKBuffer*); +DSError TRKDoReadRegisters(TRKBuffer*); +DSError TRKDoWriteMemory(TRKBuffer*); +DSError TRKDoReadMemory(TRKBuffer*); +DSError TRKDoSupportMask(TRKBuffer*); +DSError TRKDoVersions(TRKBuffer*); +DSError TRKDoOverride(TRKBuffer*); +DSError TRKDoReset(TRKBuffer*); +DSError TRKDoDisconnect(TRKBuffer*); +DSError TRKDoConnect(TRKBuffer*); + +#endif /* METROTRK_PORTABLE_MSGHNDLR_H */ diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mutex_TRK.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mutex_TRK.c index e69de29bb..ad8d6e656 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mutex_TRK.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/mutex_TRK.c @@ -0,0 +1,16 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +DSError TRKReleaseMutex(void*) +{ + return DS_NoError; +} + +DSError TRKAcquireMutex(void*) +{ + return DS_NoError; +} + +DSError TRKInitializeMutex(void*) +{ + return DS_NoError; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/notify.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/notify.c index e69de29bb..cccdd005b 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/notify.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/notify.c @@ -0,0 +1,51 @@ + +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +inline DSError TRKWaitForACK(TRKBuffer* msg, MessageCommandID cmd) +{ + if (msg->position >= 0x880) + { + return DS_MessageBufferOverflow; + } + msg->data[msg->position++] = cmd; + msg->length += 1; + return DS_NoError; +} + +DSError TRKDoNotifyStopped(u8 cmd) +{ + DSError err; + int reqIdx; + TRKBuffer* msg; + int bufIdx; + + // &msg + // &bufIdx + + err = TRKGetFreeBuffer(&bufIdx, &msg); + if (err == DS_NoError) + { + err = TRKWaitForACK(msg, cmd); + + if (err == DS_NoError) + { + if (cmd == DSMSG_NotifyStopped) + { + TRKTargetAddStopInfo(msg); + } + else + { + TRKTargetAddExceptionInfo(msg); + } + } + + err = TRKRequestSend(msg, &reqIdx, 2, 3, 1); + if (err == DS_NoError) + { + TRKReleaseBuffer(reqIdx); + } + TRKReleaseBuffer(bufIdx); + } + + return err; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubevent.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubevent.c index e69de29bb..75c3caddd 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubevent.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubevent.c @@ -0,0 +1,106 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +TRKEventQueue gTRKEventQueue; + +/* + * --INFO-- + * Address: 8021C0B4 + * Size: 00005C + */ +DSError TRKInitializeEventQueue() +{ + TRKInitializeMutex(&gTRKEventQueue); + TRKAcquireMutex(&gTRKEventQueue); + gTRKEventQueue.count = 0; + gTRKEventQueue.next = 0; + gTRKEventQueue.eventID = 0x100; + TRKReleaseMutex(&gTRKEventQueue); + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021C110 + * Size: 000024 + */ +void TRKCopyEvent(TRKEvent* dstEvent, const TRKEvent* srcEvent) +{ + TRK_memcpy(dstEvent, srcEvent, sizeof(TRKEvent)); +} + +/* + * --INFO-- + * Address: 8021C134 + * Size: 0000C0 + */ +BOOL TRKGetNextEvent(TRKEvent* event) +{ + BOOL status = 0; + TRKAcquireMutex(&gTRKEventQueue); + if (0 < gTRKEventQueue.count) + { + TRKCopyEvent(event, &gTRKEventQueue.events[gTRKEventQueue.next]); + gTRKEventQueue.count--; + gTRKEventQueue.next++; + if (gTRKEventQueue.next == 2) + gTRKEventQueue.next = 0; + + status = 1; + } + TRKReleaseMutex(&gTRKEventQueue); + return status; +} + +/* + * --INFO-- + * Address: 8021C1F4 + * Size: 0000E0 + */ +DSError TRKPostEvent(TRKEvent* event) +{ + DSError ret = DS_NoError; + int nextEventID; + + TRKAcquireMutex(&gTRKEventQueue); + + if (gTRKEventQueue.count == 2) + { + ret = DS_EventQueueFull; + } + else + { + nextEventID = (gTRKEventQueue.next + gTRKEventQueue.count) % 2; + TRKCopyEvent(&gTRKEventQueue.events[nextEventID], event); + gTRKEventQueue.events[nextEventID].eventID = gTRKEventQueue.eventID; + gTRKEventQueue.eventID++; + if (gTRKEventQueue.eventID < 0x100) + gTRKEventQueue.eventID = 0x100; + + gTRKEventQueue.count++; + } + + TRKReleaseMutex(&gTRKEventQueue); + return ret; +} + +/* + * --INFO-- + * Address: 8021C2D4 + * Size: 000018 + */ +void TRKConstructEvent(TRKEvent* event, int eventType) +{ + event->eventType = eventType; + event->eventID = 0; + event->msgBufID = -1; +} + +/* + * --INFO-- + * Address: 8021C2EC + * Size: 000024 + */ +void TRKDestructEvent(TRKEvent* event) +{ + TRKReleaseBuffer(event->msgBufID); +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubinit.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubinit.c index e69de29bb..04b5568e1 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubinit.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/nubinit.c @@ -0,0 +1,88 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +BOOL gTRKBigEndian; + +/* + * --INFO-- + * Address: 8021C310 + * Size: 0000D4 + */ +DSError TRKInitializeNub(void) +{ + DSError ret; + DSError uartErr; + + ret = TRKInitializeEndian(); + + if (ret == DS_NoError) + usr_put_initialize(); + if (ret == DS_NoError) + ret = TRKInitializeEventQueue(); + if (ret == DS_NoError) + ret = TRKInitializeMessageBuffers(); + if (ret == DS_NoError) + ret = TRKInitializeDispatcher(); + + if (ret == DS_NoError) { + uartErr = TRKInitializeIntDrivenUART(0x0000e100, 1, 0, (volatile u8**)&gTRKInputPendingPtr); + TRKTargetSetInputPendingPtr(gTRKInputPendingPtr); + if (uartErr != DS_NoError) { + ret = uartErr; + } + } + + if (ret == DS_NoError) + ret = TRKInitializeSerialHandler(); + if (ret == DS_NoError) + ret = TRKInitializeTarget(); + + return ret; +} + +/* + * --INFO-- + * Address: 8021C3E4 + * Size: 000024 + */ +DSError TRKTerminateNub(void) +{ + TRKTerminateSerialHandler(); + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021C408 + * Size: 000028 + */ +void TRKNubWelcome(void) +{ + TRK_board_display("MetroTRK for Dolphin v0.8"); + return; +} + +/* + * --INFO-- + * Address: 8021C430 + * Size: 000074 + */ +BOOL TRKInitializeEndian(void) +{ + u8 bendian[4]; + BOOL result = FALSE; + gTRKBigEndian = TRUE; + + bendian[0] = 0x12; + bendian[1] = 0x34; + bendian[2] = 0x56; + bendian[3] = 0x78; + + if (*(u32*)bendian == 0x12345678) { + gTRKBigEndian = TRUE; + } else if (*(u32*)bendian == 0x78563412) { + gTRKBigEndian = FALSE; + } else { + result = TRUE; + } + return result; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/serpoll.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/serpoll.c index e69de29bb..06947aaa7 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/serpoll.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/serpoll.c @@ -0,0 +1,135 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +void* gTRKInputPendingPtr; +static TRKFramingState gTRKFramingState; + +/* + * --INFO-- + * Address: ........ + * Size: 00004C + */ +void TRKDiscardFrame(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000040 + */ +void TRKRejectFrame(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CD14 + * Size: 0000D0 + */ +TRKBufferID TRKTestForPacket(void) +{ + int bytes; + int batch; + DSError err; + TRKBuffer* b; + int id; + + bytes = TRKPollUART(); + + if (bytes > 0) { + TRKGetFreeBuffer(&id, &b); + if (bytes > 0x880) { + for (; bytes > 0; bytes -= batch) { + batch = bytes > 0x880 ? 0x880 : bytes; + TRKReadUARTN(b->data, batch); + } + TRKStandardACK(b, DSMSG_ReplyNAK, 6); + } else { + err = TRKReadUARTN(b->data, bytes); + if (err == DS_NoError) { + b->length = bytes; + return id; + } + } + } + + if (id != -1) { + TRKReleaseBuffer(id); + } + return -1; +} + +/* + * --INFO-- + * Address: ........ + * Size: 000070 + */ +void TRKProcessFrame(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021CDE4 + * Size: 00007C + */ +void TRKGetInput(void) +{ + TRKBuffer* msgbuffer; + int bufID; + u8 command; + + bufID = TRKTestForPacket(); + + if (bufID != -1) { + msgbuffer = TRKGetBuffer(bufID); + TRKSetBufferPosition(msgbuffer, 0); + TRKReadBuffer1_ui8(msgbuffer, &command); + if (command < 0x80) { + TRKProcessInput(bufID); + } else { + TRKReleaseBuffer(bufID); + } + } +} + +/* + * --INFO-- + * Address: 8021CE60 + * Size: 000050 + */ +void TRKProcessInput(TRKBufferID bufID) +{ + TRKEvent event; + + TRKConstructEvent(&event, 2); + event.msgBufID = bufID; + gTRKFramingState.msgBufID = -1; + TRKPostEvent(&event); +} + +/* + * --INFO-- + * Address: 8021CEB0 + * Size: 000024 + */ +DSError TRKInitializeSerialHandler(void) +{ + gTRKFramingState.msgBufID = -1; + gTRKFramingState.receiveState = 0; + gTRKFramingState.isEscape = 0; + return 0; +} + +/* + * --INFO-- + * Address: 8021CED4 + * Size: 000008 + */ +DSError TRKTerminateSerialHandler(void) +{ + return 0; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/support.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/support.c index e69de29bb..cc1997e3f 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/support.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Portable/support.c @@ -0,0 +1,174 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: 8021E21C + * Size: 0002D8 + */ +DSError TRKSuppAccessFile(u32 file_handle, u8* data, size_t* count, u8* io_result, BOOL need_reply, BOOL read) +{ + TRKBuffer* replyBuffer; + int replyBufferId; + u32 length; + TRKBuffer* buffer; + int bufferId; + DSError error; + u32 done; + u16 replyLength; + u8 replyIOResult; + BOOL exit; + + if (data == NULL || *count == 0) { + return DS_ParameterError; + } + + exit = FALSE; + *io_result = DS_IONoError; + done = 0; + error = DS_NoError; + while (!exit && done < *count && error == DS_NoError && *io_result == DS_IONoError) { + if (*count - done > 0x800) { + length = 0x800; + } else { + length = *count - done; + } + + error = TRKGetFreeBuffer(&bufferId, &buffer); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui8(buffer, read ? DSMSG_ReadFile : DSMSG_WriteFile); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui32(buffer, file_handle); + + if (error == DS_NoError) + error = TRKAppendBuffer1_ui16(buffer, length); + + if (!read && error == DS_NoError) + error = TRKAppendBuffer_ui8(buffer, data + done, length); + + if (error == DS_NoError) { + if (need_reply) { + replyLength = 0; + replyIOResult = 0; + + error = (0, TRKRequestSend(buffer, &replyBufferId, read ? 5 : 5, 3, !(read && file_handle == 0))); + if (error == DS_NoError) { + replyBuffer = (TRKBuffer*)TRKGetBuffer(replyBufferId); + TRKSetBufferPosition(replyBuffer, 2); + } + + if (error == DS_NoError) + error = TRKReadBuffer1_ui8(replyBuffer, &replyIOResult); + + if (error == DS_NoError) + error = TRKReadBuffer1_ui16(replyBuffer, &replyLength); + + if (read && error == DS_NoError) { + if (replyBuffer->length != replyLength + 5) { + replyLength = replyBuffer->length - 5; + if (replyIOResult == 0) + replyIOResult = 1; + } + + if (replyLength <= length) + error = TRKReadBuffer_ui8(replyBuffer, data + done, replyLength); + } + + if (replyLength != length) { + if ((!read || replyLength >= length) && replyIOResult == 0) + replyIOResult = 1; + length = replyLength; + exit = TRUE; + } + + *io_result = (DSIOResult)replyIOResult; + TRKReleaseBuffer(replyBufferId); + } else { + error = TRKMessageSend(buffer); + } + } + + TRKReleaseBuffer(bufferId); + done += length; + } + + *count = done; + return error; +} + +/* + * --INFO-- + * Address: 8021E4F4 + * Size: 0001A4 + */ +DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2, int p3) +{ + int error = DS_NoError; + TRKBuffer* buffer; + u32 timer; + int tries; + u8 msg_error; + u8 msg_command; + BOOL badReply = TRUE; + + *bufferId = -1; + + for (tries = p2 + 1; tries != 0 && *bufferId == -1 && error == DS_NoError; tries--) { + error = TRKMessageSend(msgBuf); + if (error == DS_NoError) { + if (p3) { + timer = 0; + } + + while (TRUE) { + do { + *bufferId = TRKTestForPacket(); + if (*bufferId != -1) + break; + } while (!p3 || ++timer < 79999980); + + if (*bufferId == -1) + break; + + badReply = FALSE; + + buffer = TRKGetBuffer(*bufferId); + TRKSetBufferPosition(buffer, 0); + + if ((error = TRKReadBuffer1_ui8(buffer, &msg_command)) != DS_NoError) + break; + + if (msg_command >= DSMSG_ReplyACK) + break; + + TRKProcessInput(*bufferId); + *bufferId = -1; + } + + if (*bufferId != -1) { + if (buffer->length < p1) { + badReply = TRUE; + } + if (error == DS_NoError && !badReply) { + error = TRKReadBuffer1_ui8(buffer, &msg_error); + } + if (error == DS_NoError && !badReply) { + if (msg_command != DSMSG_ReplyACK || msg_error != DSREPLY_NoError) { + badReply = TRUE; + } + } + if (error != DS_NoError || badReply) { + TRKReleaseBuffer(*bufferId); + *bufferId = -1; + } + } + } + } + + if (*bufferId == -1) { + error = DS_Error800; + } + + return error; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.h b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.h new file mode 100644 index 000000000..bf0e9b928 --- /dev/null +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.h @@ -0,0 +1,19 @@ +#ifndef PPC_EXPORT_TARGSUPP_H +#define PPC_EXPORT_TARGSUPP_H + +#include "dolphin/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +u32 TRKAccessFile(u32, u32, u32*, u8*); +u32 TRKOpenFile(u32, u32, u32*, u8*); +u32 TRKCloseFile(u32, u32); +u32 TRKPositionFile(u32, u32, u32*, u8*); + +#ifdef __cplusplus +} +#endif + +#endif /* PPC_EXPORT_TARGSUPP_H */ diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s index e69de29bb..0d3813d08 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s @@ -0,0 +1,25 @@ +.include "macros.inc" +# .file "targsupp.s" + +.text +.balign 16 + +.fn TRKAccessFile, global + twui r0, 0x0 + blr +.endfn TRKAccessFile + +.fn TRKOpenFile, global + twui r0, 0x0 + blr +.endfn TRKOpenFile + +.fn TRKCloseFile, global + twui r0, 0x0 + blr +.endfn TRKCloseFile + +.fn TRKPositionFile, global + twui r0, 0x0 + blr +.endfn TRKPositionFile diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s index e69de29bb..c29d815c9 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s @@ -0,0 +1,1998 @@ +.include "macros.inc" + +.section .init, "ax" # 0x80003100 - 0x800054C0 +.global gTRKInterruptVectorTable +gTRKInterruptVectorTable: +.asciz "Metrowerks Target Resident Kernel for PowerPC" +.balign 4 +/* 800034E8 000004E8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800034EC 000004EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800034F0 000004F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800034F4 000004F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800034F8 000004F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800034FC 000004FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003500 00000500 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003504 00000504 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003508 00000508 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000350C 0000050C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003510 00000510 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003514 00000514 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003518 00000518 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000351C 0000051C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003520 00000520 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003524 00000524 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003528 00000528 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000352C 0000052C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003530 00000530 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003534 00000534 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003538 00000538 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000353C 0000053C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003540 00000540 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003544 00000544 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003548 00000548 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000354C 0000054C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003550 00000550 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003554 00000554 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003558 00000558 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000355C 0000055C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003560 00000560 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003564 00000564 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003568 00000568 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000356C 0000056C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003570 00000570 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003574 00000574 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003578 00000578 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000357C 0000057C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003580 00000580 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003584 00000584 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003588 00000588 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000358C 0000058C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003590 00000590 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003594 00000594 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003598 00000598 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000359C 0000059C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035A0 000005A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035A4 000005A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035A8 000005A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035AC 000005AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035B0 000005B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035B4 000005B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035B8 000005B8 48 00 1E 34 */ b __TRK_reset +/* 800035BC 000005BC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035C0 000005C0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035C4 000005C4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035C8 000005C8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035CC 000005CC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035D0 000005D0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035D4 000005D4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035D8 000005D8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035DC 000005DC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035E0 000005E0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035E4 000005E4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035E8 000005E8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035EC 000005EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035F0 000005F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035F4 000005F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035F8 000005F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800035FC 000005FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003600 00000600 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003604 00000604 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003608 00000608 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000360C 0000060C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003610 00000610 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003614 00000614 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003618 00000618 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000361C 0000061C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003620 00000620 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003624 00000624 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003628 00000628 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000362C 0000062C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003630 00000630 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003634 00000634 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003638 00000638 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000363C 0000063C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003640 00000640 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003644 00000644 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003648 00000648 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000364C 0000064C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003650 00000650 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003654 00000654 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003658 00000658 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000365C 0000065C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003660 00000660 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003664 00000664 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003668 00000668 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000366C 0000066C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003670 00000670 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003674 00000674 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003678 00000678 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000367C 0000067C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003680 00000680 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003684 00000684 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003688 00000688 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000368C 0000068C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003690 00000690 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003694 00000694 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003698 00000698 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000369C 0000069C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036A0 000006A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036A4 000006A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036A8 000006A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036AC 000006AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036B0 000006B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036B4 000006B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800036B8 000006B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800036BC 000006BC 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800036C0 000006C0 7C 00 17 AC */ icbi 0, r2 +/* 800036C4 000006C4 7C 53 02 A6 */ mfdar r2 +/* 800036C8 000006C8 7C 00 13 AC */ dcbi 0, r2 +/* 800036CC 000006CC 7C 51 42 A6 */ mfspr r2, 0x111 +/* 800036D0 000006D0 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800036D4 000006D4 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800036D8 000006D8 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800036DC 000006DC 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800036E0 000006E0 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800036E4 000006E4 7C 60 00 A6 */ mfmsr r3 +/* 800036E8 000006E8 60 63 00 30 */ ori r3, r3, 0x30 +/* 800036EC 000006EC 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800036F0 000006F0 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800036F4 000006F4 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800036F8 000006F8 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800036FC 000006FC 38 60 02 00 */ li r3, 0x200 +/* 80003700 00000700 4C 00 00 64 */ rfi +/* 80003704 00000704 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003708 00000708 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000370C 0000070C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003710 00000710 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003714 00000714 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003718 00000718 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000371C 0000071C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003720 00000720 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003724 00000724 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003728 00000728 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000372C 0000072C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003730 00000730 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003734 00000734 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003738 00000738 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000373C 0000073C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003740 00000740 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003744 00000744 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003748 00000748 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000374C 0000074C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003750 00000750 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003754 00000754 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003758 00000758 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000375C 0000075C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003760 00000760 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003764 00000764 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003768 00000768 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000376C 0000076C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003770 00000770 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003774 00000774 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003778 00000778 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000377C 0000077C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003780 00000780 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003784 00000784 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003788 00000788 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000378C 0000078C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003790 00000790 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003794 00000794 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003798 00000798 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000379C 0000079C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037A0 000007A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037A4 000007A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037A8 000007A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037AC 000007AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037B0 000007B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037B4 000007B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037B8 000007B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800037BC 000007BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800037C0 000007C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800037C4 000007C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800037C8 000007C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800037CC 000007CC 7C 60 00 A6 */ mfmsr r3 +/* 800037D0 000007D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800037D4 000007D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800037D8 000007D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800037DC 000007DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800037E0 000007E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800037E4 000007E4 38 60 03 00 */ li r3, 0x300 +/* 800037E8 000007E8 4C 00 00 64 */ rfi +/* 800037EC 000007EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037F0 000007F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037F4 000007F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037F8 000007F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800037FC 000007FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003800 00000800 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003804 00000804 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003808 00000808 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000380C 0000080C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003810 00000810 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003814 00000814 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003818 00000818 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000381C 0000081C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003820 00000820 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003824 00000824 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003828 00000828 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000382C 0000082C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003830 00000830 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003834 00000834 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003838 00000838 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000383C 0000083C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003840 00000840 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003844 00000844 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003848 00000848 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000384C 0000084C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003850 00000850 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003854 00000854 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003858 00000858 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000385C 0000085C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003860 00000860 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003864 00000864 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003868 00000868 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000386C 0000086C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003870 00000870 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003874 00000874 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003878 00000878 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000387C 0000087C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003880 00000880 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003884 00000884 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003888 00000888 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000388C 0000088C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003890 00000890 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003894 00000894 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003898 00000898 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000389C 0000089C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038A0 000008A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038A4 000008A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038A8 000008A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038AC 000008AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038B0 000008B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038B4 000008B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038B8 000008B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800038BC 000008BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800038C0 000008C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800038C4 000008C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800038C8 000008C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800038CC 000008CC 7C 60 00 A6 */ mfmsr r3 +/* 800038D0 000008D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800038D4 000008D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800038D8 000008D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800038DC 000008DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800038E0 000008E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800038E4 000008E4 38 60 04 00 */ li r3, 0x400 +/* 800038E8 000008E8 4C 00 00 64 */ rfi +/* 800038EC 000008EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038F0 000008F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038F4 000008F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038F8 000008F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800038FC 000008FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003900 00000900 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003904 00000904 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003908 00000908 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000390C 0000090C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003910 00000910 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003914 00000914 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003918 00000918 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000391C 0000091C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003920 00000920 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003924 00000924 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003928 00000928 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000392C 0000092C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003930 00000930 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003934 00000934 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003938 00000938 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000393C 0000093C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003940 00000940 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003944 00000944 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003948 00000948 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000394C 0000094C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003950 00000950 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003954 00000954 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003958 00000958 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000395C 0000095C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003960 00000960 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003964 00000964 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003968 00000968 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000396C 0000096C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003970 00000970 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003974 00000974 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003978 00000978 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000397C 0000097C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003980 00000980 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003984 00000984 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003988 00000988 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000398C 0000098C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003990 00000990 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003994 00000994 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003998 00000998 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000399C 0000099C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039A0 000009A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039A4 000009A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039A8 000009A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039AC 000009AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039B0 000009B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039B4 000009B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039B8 000009B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800039BC 000009BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800039C0 000009C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800039C4 000009C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800039C8 000009C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800039CC 000009CC 7C 60 00 A6 */ mfmsr r3 +/* 800039D0 000009D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800039D4 000009D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800039D8 000009D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800039DC 000009DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800039E0 000009E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800039E4 000009E4 38 60 05 00 */ li r3, 0x500 +/* 800039E8 000009E8 4C 00 00 64 */ rfi +/* 800039EC 000009EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039F0 000009F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039F4 000009F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039F8 000009F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800039FC 000009FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A00 00000A00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A04 00000A04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A08 00000A08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A0C 00000A0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A10 00000A10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A14 00000A14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A18 00000A18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A1C 00000A1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A20 00000A20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A24 00000A24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A28 00000A28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A2C 00000A2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A30 00000A30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A34 00000A34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A38 00000A38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A3C 00000A3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A40 00000A40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A44 00000A44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A48 00000A48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A4C 00000A4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A50 00000A50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A54 00000A54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A58 00000A58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A5C 00000A5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A60 00000A60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A64 00000A64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A68 00000A68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A6C 00000A6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A70 00000A70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A74 00000A74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A78 00000A78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A7C 00000A7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A80 00000A80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A84 00000A84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A88 00000A88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A8C 00000A8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A90 00000A90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A94 00000A94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A98 00000A98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003A9C 00000A9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AA0 00000AA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AA4 00000AA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AA8 00000AA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AAC 00000AAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AB0 00000AB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AB4 00000AB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AB8 00000AB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80003ABC 00000ABC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80003AC0 00000AC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80003AC4 00000AC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80003AC8 00000AC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80003ACC 00000ACC 7C 60 00 A6 */ mfmsr r3 +/* 80003AD0 00000AD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80003AD4 00000AD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80003AD8 00000AD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80003ADC 00000ADC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80003AE0 00000AE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80003AE4 00000AE4 38 60 06 00 */ li r3, 0x600 +/* 80003AE8 00000AE8 4C 00 00 64 */ rfi +/* 80003AEC 00000AEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AF0 00000AF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AF4 00000AF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AF8 00000AF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003AFC 00000AFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B00 00000B00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B04 00000B04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B08 00000B08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B0C 00000B0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B10 00000B10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B14 00000B14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B18 00000B18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B1C 00000B1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B20 00000B20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B24 00000B24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B28 00000B28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B2C 00000B2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B30 00000B30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B34 00000B34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B38 00000B38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B3C 00000B3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B40 00000B40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B44 00000B44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B48 00000B48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B4C 00000B4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B50 00000B50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B54 00000B54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B58 00000B58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B5C 00000B5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B60 00000B60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B64 00000B64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B68 00000B68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B6C 00000B6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B70 00000B70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B74 00000B74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B78 00000B78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B7C 00000B7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B80 00000B80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B84 00000B84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B88 00000B88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B8C 00000B8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B90 00000B90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B94 00000B94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B98 00000B98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003B9C 00000B9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BA0 00000BA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BA4 00000BA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BA8 00000BA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BAC 00000BAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BB0 00000BB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BB4 00000BB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BB8 00000BB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80003BBC 00000BBC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80003BC0 00000BC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80003BC4 00000BC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80003BC8 00000BC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80003BCC 00000BCC 7C 60 00 A6 */ mfmsr r3 +/* 80003BD0 00000BD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80003BD4 00000BD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80003BD8 00000BD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80003BDC 00000BDC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80003BE0 00000BE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80003BE4 00000BE4 38 60 07 00 */ li r3, 0x700 +/* 80003BE8 00000BE8 4C 00 00 64 */ rfi +/* 80003BEC 00000BEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BF0 00000BF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BF4 00000BF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BF8 00000BF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003BFC 00000BFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C00 00000C00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C04 00000C04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C08 00000C08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C0C 00000C0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C10 00000C10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C14 00000C14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C18 00000C18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C1C 00000C1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C20 00000C20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C24 00000C24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C28 00000C28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C2C 00000C2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C30 00000C30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C34 00000C34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C38 00000C38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C3C 00000C3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C40 00000C40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C44 00000C44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C48 00000C48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C4C 00000C4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C50 00000C50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C54 00000C54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C58 00000C58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C5C 00000C5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C60 00000C60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C64 00000C64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C68 00000C68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C6C 00000C6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C70 00000C70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C74 00000C74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C78 00000C78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C7C 00000C7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C80 00000C80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C84 00000C84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C88 00000C88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C8C 00000C8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C90 00000C90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C94 00000C94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C98 00000C98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003C9C 00000C9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CA0 00000CA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CA4 00000CA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CA8 00000CA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CAC 00000CAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CB0 00000CB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CB4 00000CB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CB8 00000CB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80003CBC 00000CBC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80003CC0 00000CC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80003CC4 00000CC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80003CC8 00000CC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80003CCC 00000CCC 7C 60 00 A6 */ mfmsr r3 +/* 80003CD0 00000CD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80003CD4 00000CD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80003CD8 00000CD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80003CDC 00000CDC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80003CE0 00000CE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80003CE4 00000CE4 38 60 08 00 */ li r3, 0x800 +/* 80003CE8 00000CE8 4C 00 00 64 */ rfi +/* 80003CEC 00000CEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CF0 00000CF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CF4 00000CF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CF8 00000CF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003CFC 00000CFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D00 00000D00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D04 00000D04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D08 00000D08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D0C 00000D0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D10 00000D10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D14 00000D14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D18 00000D18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D1C 00000D1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D20 00000D20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D24 00000D24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D28 00000D28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D2C 00000D2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D30 00000D30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D34 00000D34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D38 00000D38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D3C 00000D3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D40 00000D40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D44 00000D44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D48 00000D48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D4C 00000D4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D50 00000D50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D54 00000D54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D58 00000D58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D5C 00000D5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D60 00000D60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D64 00000D64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D68 00000D68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D6C 00000D6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D70 00000D70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D74 00000D74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D78 00000D78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D7C 00000D7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D80 00000D80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D84 00000D84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D88 00000D88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D8C 00000D8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D90 00000D90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D94 00000D94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D98 00000D98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003D9C 00000D9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DA0 00000DA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DA4 00000DA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DA8 00000DA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DAC 00000DAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DB0 00000DB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DB4 00000DB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DB8 00000DB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80003DBC 00000DBC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80003DC0 00000DC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80003DC4 00000DC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80003DC8 00000DC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80003DCC 00000DCC 7C 60 00 A6 */ mfmsr r3 +/* 80003DD0 00000DD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80003DD4 00000DD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80003DD8 00000DD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80003DDC 00000DDC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80003DE0 00000DE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80003DE4 00000DE4 38 60 09 00 */ li r3, 0x900 +/* 80003DE8 00000DE8 4C 00 00 64 */ rfi +/* 80003DEC 00000DEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DF0 00000DF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DF4 00000DF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DF8 00000DF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003DFC 00000DFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E00 00000E00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E04 00000E04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E08 00000E08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E0C 00000E0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E10 00000E10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E14 00000E14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E18 00000E18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E1C 00000E1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E20 00000E20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E24 00000E24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E28 00000E28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E2C 00000E2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E30 00000E30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E34 00000E34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E38 00000E38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E3C 00000E3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E40 00000E40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E44 00000E44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E48 00000E48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E4C 00000E4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E50 00000E50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E54 00000E54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E58 00000E58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E5C 00000E5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E60 00000E60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E64 00000E64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E68 00000E68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E6C 00000E6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E70 00000E70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E74 00000E74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E78 00000E78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E7C 00000E7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E80 00000E80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E84 00000E84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E88 00000E88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E8C 00000E8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E90 00000E90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E94 00000E94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E98 00000E98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003E9C 00000E9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EA0 00000EA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EA4 00000EA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EA8 00000EA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EAC 00000EAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EB0 00000EB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EB4 00000EB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EB8 00000EB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EBC 00000EBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EC0 00000EC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EC4 00000EC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EC8 00000EC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003ECC 00000ECC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003ED0 00000ED0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003ED4 00000ED4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003ED8 00000ED8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EDC 00000EDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EE0 00000EE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EE4 00000EE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EE8 00000EE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EEC 00000EEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EF0 00000EF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EF4 00000EF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EF8 00000EF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003EFC 00000EFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F00 00000F00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F04 00000F04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F08 00000F08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F0C 00000F0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F10 00000F10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F14 00000F14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F18 00000F18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F1C 00000F1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F20 00000F20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F24 00000F24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F28 00000F28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F2C 00000F2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F30 00000F30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F34 00000F34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F38 00000F38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F3C 00000F3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F40 00000F40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F44 00000F44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F48 00000F48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F4C 00000F4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F50 00000F50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F54 00000F54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F58 00000F58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F5C 00000F5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F60 00000F60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F64 00000F64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F68 00000F68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F6C 00000F6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F70 00000F70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F74 00000F74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F78 00000F78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F7C 00000F7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F80 00000F80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F84 00000F84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F88 00000F88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F8C 00000F8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F90 00000F90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F94 00000F94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F98 00000F98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003F9C 00000F9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FA0 00000FA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FA4 00000FA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FA8 00000FA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FAC 00000FAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FB0 00000FB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FB4 00000FB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FB8 00000FB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FBC 00000FBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FC0 00000FC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FC4 00000FC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FC8 00000FC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FCC 00000FCC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FD0 00000FD0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FD4 00000FD4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FD8 00000FD8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FDC 00000FDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FE0 00000FE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FE4 00000FE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FE8 00000FE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FEC 00000FEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FF0 00000FF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FF4 00000FF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FF8 00000FF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80003FFC 00000FFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004000 00001000 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004004 00001004 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004008 00001008 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000400C 0000100C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004010 00001010 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004014 00001014 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004018 00001018 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000401C 0000101C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004020 00001020 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004024 00001024 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004028 00001028 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000402C 0000102C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004030 00001030 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004034 00001034 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004038 00001038 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000403C 0000103C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004040 00001040 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004044 00001044 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004048 00001048 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000404C 0000104C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004050 00001050 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004054 00001054 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004058 00001058 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000405C 0000105C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004060 00001060 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004064 00001064 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004068 00001068 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000406C 0000106C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004070 00001070 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004074 00001074 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004078 00001078 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000407C 0000107C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004080 00001080 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004084 00001084 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004088 00001088 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000408C 0000108C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004090 00001090 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004094 00001094 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004098 00001098 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000409C 0000109C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040A0 000010A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040A4 000010A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040A8 000010A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040AC 000010AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040B0 000010B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040B4 000010B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040B8 000010B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800040BC 000010BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800040C0 000010C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800040C4 000010C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800040C8 000010C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800040CC 000010CC 7C 60 00 A6 */ mfmsr r3 +/* 800040D0 000010D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800040D4 000010D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800040D8 000010D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800040DC 000010DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800040E0 000010E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800040E4 000010E4 38 60 0C 00 */ li r3, 0xc00 +/* 800040E8 000010E8 4C 00 00 64 */ rfi +/* 800040EC 000010EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040F0 000010F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040F4 000010F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040F8 000010F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800040FC 000010FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004100 00001100 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004104 00001104 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004108 00001108 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000410C 0000110C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004110 00001110 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004114 00001114 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004118 00001118 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000411C 0000111C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004120 00001120 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004124 00001124 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004128 00001128 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000412C 0000112C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004130 00001130 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004134 00001134 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004138 00001138 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000413C 0000113C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004140 00001140 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004144 00001144 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004148 00001148 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000414C 0000114C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004150 00001150 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004154 00001154 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004158 00001158 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000415C 0000115C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004160 00001160 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004164 00001164 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004168 00001168 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000416C 0000116C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004170 00001170 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004174 00001174 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004178 00001178 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000417C 0000117C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004180 00001180 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004184 00001184 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004188 00001188 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000418C 0000118C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004190 00001190 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004194 00001194 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004198 00001198 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000419C 0000119C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041A0 000011A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041A4 000011A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041A8 000011A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041AC 000011AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041B0 000011B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041B4 000011B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041B8 000011B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800041BC 000011BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800041C0 000011C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800041C4 000011C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800041C8 000011C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800041CC 000011CC 7C 60 00 A6 */ mfmsr r3 +/* 800041D0 000011D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800041D4 000011D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800041D8 000011D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800041DC 000011DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800041E0 000011E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800041E4 000011E4 38 60 0D 00 */ li r3, 0xd00 +/* 800041E8 000011E8 4C 00 00 64 */ rfi +/* 800041EC 000011EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041F0 000011F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041F4 000011F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041F8 000011F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800041FC 000011FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004200 00001200 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004204 00001204 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004208 00001208 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000420C 0000120C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004210 00001210 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004214 00001214 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004218 00001218 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000421C 0000121C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004220 00001220 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004224 00001224 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004228 00001228 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000422C 0000122C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004230 00001230 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004234 00001234 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004238 00001238 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000423C 0000123C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004240 00001240 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004244 00001244 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004248 00001248 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000424C 0000124C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004250 00001250 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004254 00001254 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004258 00001258 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000425C 0000125C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004260 00001260 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004264 00001264 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004268 00001268 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000426C 0000126C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004270 00001270 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004274 00001274 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004278 00001278 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000427C 0000127C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004280 00001280 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004284 00001284 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004288 00001288 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000428C 0000128C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004290 00001290 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004294 00001294 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004298 00001298 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000429C 0000129C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042A0 000012A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042A4 000012A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042A8 000012A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042AC 000012AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042B0 000012B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042B4 000012B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042B8 000012B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800042BC 000012BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800042C0 000012C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800042C4 000012C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800042C8 000012C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800042CC 000012CC 7C 60 00 A6 */ mfmsr r3 +/* 800042D0 000012D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800042D4 000012D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800042D8 000012D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800042DC 000012DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800042E0 000012E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800042E4 000012E4 38 60 0E 00 */ li r3, 0xe00 +/* 800042E8 000012E8 4C 00 00 64 */ rfi +/* 800042EC 000012EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042F0 000012F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042F4 000012F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042F8 000012F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800042FC 000012FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004300 00001300 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004304 00001304 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004308 00001308 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000430C 0000130C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004310 00001310 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004314 00001314 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004318 00001318 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000431C 0000131C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004320 00001320 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004324 00001324 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004328 00001328 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000432C 0000132C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004330 00001330 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004334 00001334 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004338 00001338 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000433C 0000133C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004340 00001340 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004344 00001344 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004348 00001348 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000434C 0000134C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004350 00001350 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004354 00001354 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004358 00001358 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000435C 0000135C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004360 00001360 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004364 00001364 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004368 00001368 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000436C 0000136C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004370 00001370 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004374 00001374 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004378 00001378 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000437C 0000137C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004380 00001380 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004384 00001384 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004388 00001388 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000438C 0000138C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004390 00001390 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004394 00001394 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004398 00001398 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000439C 0000139C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043A0 000013A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043A4 000013A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043A8 000013A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043AC 000013AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043B0 000013B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043B4 000013B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043B8 000013B8 48 00 00 54 */ b .L_8000440C +/* 800043BC 000013BC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043C0 000013C0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043C4 000013C4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043C8 000013C8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043CC 000013CC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043D0 000013D0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043D4 000013D4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800043D8 000013D8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800043DC 000013DC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800043E0 000013E0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800043E4 000013E4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800043E8 000013E8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800043EC 000013EC 7C 60 00 A6 */ mfmsr r3 +/* 800043F0 000013F0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800043F4 000013F4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800043F8 000013F8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800043FC 000013FC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80004400 00001400 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004404 00001404 38 60 0F 20 */ li r3, 0xf20 +/* 80004408 00001408 4C 00 00 64 */ rfi +.L_8000440C: +/* 8000440C 0000140C 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80004410 00001410 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80004414 00001414 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004418 00001418 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 8000441C 0000141C 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004420 00001420 7C 60 00 A6 */ mfmsr r3 +/* 80004424 00001424 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004428 00001428 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 8000442C 0000142C 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004430 00001430 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80004434 00001434 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004438 00001438 38 60 0F 00 */ li r3, 0xf00 +/* 8000443C 0000143C 4C 00 00 64 */ rfi +/* 80004440 00001440 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004444 00001444 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004448 00001448 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000444C 0000144C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004450 00001450 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004454 00001454 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004458 00001458 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000445C 0000145C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004460 00001460 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004464 00001464 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004468 00001468 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000446C 0000146C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004470 00001470 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004474 00001474 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004478 00001478 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000447C 0000147C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004480 00001480 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004484 00001484 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004488 00001488 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000448C 0000148C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004490 00001490 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004494 00001494 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004498 00001498 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000449C 0000149C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044A0 000014A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044A4 000014A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044A8 000014A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044AC 000014AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044B0 000014B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044B4 000014B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800044B8 000014B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800044BC 000014BC 7C 40 00 26 */ mfcr r2 +/* 800044C0 000014C0 7C 52 43 A6 */ mtspr 0x112, r2 +/* 800044C4 000014C4 7C 40 00 A6 */ mfmsr r2 +/* 800044C8 000014C8 74 42 00 02 */ andis. r2, r2, 2 +/* 800044CC 000014CC 41 82 00 1C */ beq .L_800044E8 +/* 800044D0 000014D0 7C 40 00 A6 */ mfmsr r2 +/* 800044D4 000014D4 6C 42 00 02 */ xoris r2, r2, 2 +/* 800044D8 000014D8 7C 00 04 AC */ sync 0 +/* 800044DC 000014DC 7C 40 01 24 */ mtmsr r2 +/* 800044E0 000014E0 7C 00 04 AC */ sync 0 +/* 800044E4 000014E4 7C 51 43 A6 */ mtspr 0x111, r2 +.L_800044E8: +/* 800044E8 000014E8 7C 52 42 A6 */ mfspr r2, 0x112 +/* 800044EC 000014EC 7C 4F F1 20 */ mtcrf 0xff, r2 +/* 800044F0 000014F0 7C 51 42 A6 */ mfspr r2, 0x111 +/* 800044F4 000014F4 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800044F8 000014F8 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800044FC 000014FC 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004500 00001500 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80004504 00001504 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004508 00001508 7C 60 00 A6 */ mfmsr r3 +/* 8000450C 0000150C 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004510 00001510 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80004514 00001514 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004518 00001518 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 8000451C 0000151C 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004520 00001520 38 60 10 00 */ li r3, 0x1000 +/* 80004524 00001524 4C 00 00 64 */ rfi +/* 80004528 00001528 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000452C 0000152C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004530 00001530 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004534 00001534 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004538 00001538 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000453C 0000153C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004540 00001540 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004544 00001544 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004548 00001548 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000454C 0000154C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004550 00001550 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004554 00001554 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004558 00001558 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000455C 0000155C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004560 00001560 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004564 00001564 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004568 00001568 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000456C 0000156C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004570 00001570 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004574 00001574 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004578 00001578 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000457C 0000157C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004580 00001580 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004584 00001584 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004588 00001588 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000458C 0000158C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004590 00001590 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004594 00001594 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004598 00001598 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000459C 0000159C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045A0 000015A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045A4 000015A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045A8 000015A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045AC 000015AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045B0 000015B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045B4 000015B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800045B8 000015B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800045BC 000015BC 7C 40 00 26 */ mfcr r2 +/* 800045C0 000015C0 7C 52 43 A6 */ mtspr 0x112, r2 +/* 800045C4 000015C4 7C 40 00 A6 */ mfmsr r2 +/* 800045C8 000015C8 74 42 00 02 */ andis. r2, r2, 2 +/* 800045CC 000015CC 41 82 00 1C */ beq .L_800045E8 +/* 800045D0 000015D0 7C 40 00 A6 */ mfmsr r2 +/* 800045D4 000015D4 6C 42 00 02 */ xoris r2, r2, 2 +/* 800045D8 000015D8 7C 00 04 AC */ sync 0 +/* 800045DC 000015DC 7C 40 01 24 */ mtmsr r2 +/* 800045E0 000015E0 7C 00 04 AC */ sync 0 +/* 800045E4 000015E4 7C 51 43 A6 */ mtspr 0x111, r2 +.L_800045E8: +/* 800045E8 000015E8 7C 52 42 A6 */ mfspr r2, 0x112 +/* 800045EC 000015EC 7C 4F F1 20 */ mtcrf 0xff, r2 +/* 800045F0 000015F0 7C 51 42 A6 */ mfspr r2, 0x111 +/* 800045F4 000015F4 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800045F8 000015F8 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800045FC 000015FC 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004600 00001600 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80004604 00001604 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004608 00001608 7C 60 00 A6 */ mfmsr r3 +/* 8000460C 0000160C 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004610 00001610 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80004614 00001614 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004618 00001618 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 8000461C 0000161C 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004620 00001620 38 60 11 00 */ li r3, 0x1100 +/* 80004624 00001624 4C 00 00 64 */ rfi +/* 80004628 00001628 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000462C 0000162C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004630 00001630 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004634 00001634 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004638 00001638 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000463C 0000163C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004640 00001640 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004644 00001644 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004648 00001648 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000464C 0000164C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004650 00001650 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004654 00001654 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004658 00001658 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000465C 0000165C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004660 00001660 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004664 00001664 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004668 00001668 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000466C 0000166C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004670 00001670 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004674 00001674 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004678 00001678 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000467C 0000167C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004680 00001680 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004684 00001684 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004688 00001688 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000468C 0000168C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004690 00001690 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004694 00001694 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004698 00001698 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000469C 0000169C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046A0 000016A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046A4 000016A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046A8 000016A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046AC 000016AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046B0 000016B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046B4 000016B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800046B8 000016B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800046BC 000016BC 7C 40 00 26 */ mfcr r2 +/* 800046C0 000016C0 7C 52 43 A6 */ mtspr 0x112, r2 +/* 800046C4 000016C4 7C 40 00 A6 */ mfmsr r2 +/* 800046C8 000016C8 74 42 00 02 */ andis. r2, r2, 2 +/* 800046CC 000016CC 41 82 00 1C */ beq .L_800046E8 +/* 800046D0 000016D0 7C 40 00 A6 */ mfmsr r2 +/* 800046D4 000016D4 6C 42 00 02 */ xoris r2, r2, 2 +/* 800046D8 000016D8 7C 00 04 AC */ sync 0 +/* 800046DC 000016DC 7C 40 01 24 */ mtmsr r2 +/* 800046E0 000016E0 7C 00 04 AC */ sync 0 +/* 800046E4 000016E4 7C 51 43 A6 */ mtspr 0x111, r2 +.L_800046E8: +/* 800046E8 000016E8 7C 52 42 A6 */ mfspr r2, 0x112 +/* 800046EC 000016EC 7C 4F F1 20 */ mtcrf 0xff, r2 +/* 800046F0 000016F0 7C 51 42 A6 */ mfspr r2, 0x111 +/* 800046F4 000016F4 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800046F8 000016F8 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800046FC 000016FC 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004700 00001700 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80004704 00001704 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004708 00001708 7C 60 00 A6 */ mfmsr r3 +/* 8000470C 0000170C 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004710 00001710 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80004714 00001714 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004718 00001718 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 8000471C 0000171C 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004720 00001720 38 60 12 00 */ li r3, 0x1200 +/* 80004724 00001724 4C 00 00 64 */ rfi +/* 80004728 00001728 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000472C 0000172C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004730 00001730 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004734 00001734 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004738 00001738 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000473C 0000173C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004740 00001740 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004744 00001744 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004748 00001748 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000474C 0000174C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004750 00001750 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004754 00001754 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004758 00001758 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000475C 0000175C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004760 00001760 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004764 00001764 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004768 00001768 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000476C 0000176C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004770 00001770 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004774 00001774 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004778 00001778 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000477C 0000177C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004780 00001780 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004784 00001784 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004788 00001788 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000478C 0000178C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004790 00001790 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004794 00001794 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004798 00001798 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000479C 0000179C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047A0 000017A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047A4 000017A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047A8 000017A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047AC 000017AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047B0 000017B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047B4 000017B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047B8 000017B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800047BC 000017BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800047C0 000017C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800047C4 000017C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800047C8 000017C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800047CC 000017CC 7C 60 00 A6 */ mfmsr r3 +/* 800047D0 000017D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800047D4 000017D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800047D8 000017D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800047DC 000017DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800047E0 000017E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800047E4 000017E4 38 60 13 00 */ li r3, 0x1300 +/* 800047E8 000017E8 4C 00 00 64 */ rfi +/* 800047EC 000017EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047F0 000017F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047F4 000017F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047F8 000017F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800047FC 000017FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004800 00001800 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004804 00001804 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004808 00001808 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000480C 0000180C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004810 00001810 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004814 00001814 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004818 00001818 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000481C 0000181C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004820 00001820 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004824 00001824 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004828 00001828 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000482C 0000182C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004830 00001830 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004834 00001834 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004838 00001838 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000483C 0000183C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004840 00001840 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004844 00001844 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004848 00001848 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000484C 0000184C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004850 00001850 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004854 00001854 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004858 00001858 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000485C 0000185C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004860 00001860 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004864 00001864 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004868 00001868 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000486C 0000186C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004870 00001870 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004874 00001874 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004878 00001878 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000487C 0000187C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004880 00001880 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004884 00001884 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004888 00001888 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000488C 0000188C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004890 00001890 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004894 00001894 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004898 00001898 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000489C 0000189C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048A0 000018A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048A4 000018A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048A8 000018A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048AC 000018AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048B0 000018B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048B4 000018B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048B8 000018B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800048BC 000018BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800048C0 000018C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800048C4 000018C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800048C8 000018C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800048CC 000018CC 7C 60 00 A6 */ mfmsr r3 +/* 800048D0 000018D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800048D4 000018D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800048D8 000018D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800048DC 000018DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800048E0 000018E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800048E4 000018E4 38 60 14 00 */ li r3, 0x1400 +/* 800048E8 000018E8 4C 00 00 64 */ rfi +/* 800048EC 000018EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048F0 000018F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048F4 000018F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048F8 000018F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800048FC 000018FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004900 00001900 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004904 00001904 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004908 00001908 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000490C 0000190C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004910 00001910 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004914 00001914 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004918 00001918 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000491C 0000191C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004920 00001920 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004924 00001924 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004928 00001928 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000492C 0000192C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004930 00001930 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004934 00001934 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004938 00001938 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000493C 0000193C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004940 00001940 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004944 00001944 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004948 00001948 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000494C 0000194C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004950 00001950 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004954 00001954 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004958 00001958 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000495C 0000195C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004960 00001960 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004964 00001964 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004968 00001968 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000496C 0000196C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004970 00001970 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004974 00001974 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004978 00001978 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000497C 0000197C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004980 00001980 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004984 00001984 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004988 00001988 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000498C 0000198C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004990 00001990 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004994 00001994 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004998 00001998 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000499C 0000199C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049A0 000019A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049A4 000019A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049A8 000019A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049AC 000019AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049B0 000019B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049B4 000019B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049B8 000019B8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049BC 000019BC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049C0 000019C0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049C4 000019C4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049C8 000019C8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049CC 000019CC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049D0 000019D0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049D4 000019D4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049D8 000019D8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049DC 000019DC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049E0 000019E0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049E4 000019E4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049E8 000019E8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049EC 000019EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049F0 000019F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049F4 000019F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049F8 000019F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800049FC 000019FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A00 00001A00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A04 00001A04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A08 00001A08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A0C 00001A0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A10 00001A10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A14 00001A14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A18 00001A18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A1C 00001A1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A20 00001A20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A24 00001A24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A28 00001A28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A2C 00001A2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A30 00001A30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A34 00001A34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A38 00001A38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A3C 00001A3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A40 00001A40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A44 00001A44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A48 00001A48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A4C 00001A4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A50 00001A50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A54 00001A54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A58 00001A58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A5C 00001A5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A60 00001A60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A64 00001A64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A68 00001A68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A6C 00001A6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A70 00001A70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A74 00001A74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A78 00001A78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A7C 00001A7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A80 00001A80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A84 00001A84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A88 00001A88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A8C 00001A8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A90 00001A90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A94 00001A94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A98 00001A98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004A9C 00001A9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AA0 00001AA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AA4 00001AA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AA8 00001AA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AAC 00001AAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AB0 00001AB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AB4 00001AB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AB8 00001AB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80004ABC 00001ABC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80004AC0 00001AC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004AC4 00001AC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80004AC8 00001AC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004ACC 00001ACC 7C 60 00 A6 */ mfmsr r3 +/* 80004AD0 00001AD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004AD4 00001AD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80004AD8 00001AD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004ADC 00001ADC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80004AE0 00001AE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004AE4 00001AE4 38 60 16 00 */ li r3, 0x1600 +/* 80004AE8 00001AE8 4C 00 00 64 */ rfi +/* 80004AEC 00001AEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AF0 00001AF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AF4 00001AF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AF8 00001AF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004AFC 00001AFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B00 00001B00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B04 00001B04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B08 00001B08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B0C 00001B0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B10 00001B10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B14 00001B14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B18 00001B18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B1C 00001B1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B20 00001B20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B24 00001B24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B28 00001B28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B2C 00001B2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B30 00001B30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B34 00001B34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B38 00001B38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B3C 00001B3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B40 00001B40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B44 00001B44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B48 00001B48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B4C 00001B4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B50 00001B50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B54 00001B54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B58 00001B58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B5C 00001B5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B60 00001B60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B64 00001B64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B68 00001B68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B6C 00001B6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B70 00001B70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B74 00001B74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B78 00001B78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B7C 00001B7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B80 00001B80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B84 00001B84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B88 00001B88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B8C 00001B8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B90 00001B90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B94 00001B94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B98 00001B98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004B9C 00001B9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BA0 00001BA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BA4 00001BA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BA8 00001BA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BAC 00001BAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BB0 00001BB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BB4 00001BB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BB8 00001BB8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 80004BBC 00001BBC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 80004BC0 00001BC0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 80004BC4 00001BC4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 80004BC8 00001BC8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 80004BCC 00001BCC 7C 60 00 A6 */ mfmsr r3 +/* 80004BD0 00001BD0 60 63 00 30 */ ori r3, r3, 0x30 +/* 80004BD4 00001BD4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 80004BD8 00001BD8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 80004BDC 00001BDC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 80004BE0 00001BE0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 80004BE4 00001BE4 38 60 17 00 */ li r3, 0x1700 +/* 80004BE8 00001BE8 4C 00 00 64 */ rfi +/* 80004BEC 00001BEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BF0 00001BF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BF4 00001BF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BF8 00001BF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004BFC 00001BFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C00 00001C00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C04 00001C04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C08 00001C08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C0C 00001C0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C10 00001C10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C14 00001C14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C18 00001C18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C1C 00001C1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C20 00001C20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C24 00001C24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C28 00001C28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C2C 00001C2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C30 00001C30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C34 00001C34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C38 00001C38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C3C 00001C3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C40 00001C40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C44 00001C44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C48 00001C48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C4C 00001C4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C50 00001C50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C54 00001C54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C58 00001C58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C5C 00001C5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C60 00001C60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C64 00001C64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C68 00001C68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C6C 00001C6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C70 00001C70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C74 00001C74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C78 00001C78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C7C 00001C7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C80 00001C80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C84 00001C84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C88 00001C88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C8C 00001C8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C90 00001C90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C94 00001C94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C98 00001C98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004C9C 00001C9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CA0 00001CA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CA4 00001CA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CA8 00001CA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CAC 00001CAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CB0 00001CB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CB4 00001CB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CB8 00001CB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CBC 00001CBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CC0 00001CC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CC4 00001CC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CC8 00001CC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CCC 00001CCC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CD0 00001CD0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CD4 00001CD4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CD8 00001CD8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CDC 00001CDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CE0 00001CE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CE4 00001CE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CE8 00001CE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CEC 00001CEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CF0 00001CF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CF4 00001CF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CF8 00001CF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004CFC 00001CFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D00 00001D00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D04 00001D04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D08 00001D08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D0C 00001D0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D10 00001D10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D14 00001D14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D18 00001D18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D1C 00001D1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D20 00001D20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D24 00001D24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D28 00001D28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D2C 00001D2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D30 00001D30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D34 00001D34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D38 00001D38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D3C 00001D3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D40 00001D40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D44 00001D44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D48 00001D48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D4C 00001D4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D50 00001D50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D54 00001D54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D58 00001D58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D5C 00001D5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D60 00001D60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D64 00001D64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D68 00001D68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D6C 00001D6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D70 00001D70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D74 00001D74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D78 00001D78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D7C 00001D7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D80 00001D80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D84 00001D84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D88 00001D88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D8C 00001D8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D90 00001D90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D94 00001D94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D98 00001D98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004D9C 00001D9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DA0 00001DA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DA4 00001DA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DA8 00001DA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DAC 00001DAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DB0 00001DB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DB4 00001DB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DB8 00001DB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DBC 00001DBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DC0 00001DC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DC4 00001DC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DC8 00001DC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DCC 00001DCC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DD0 00001DD0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DD4 00001DD4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DD8 00001DD8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DDC 00001DDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DE0 00001DE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DE4 00001DE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DE8 00001DE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DEC 00001DEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DF0 00001DF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DF4 00001DF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DF8 00001DF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004DFC 00001DFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E00 00001E00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E04 00001E04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E08 00001E08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E0C 00001E0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E10 00001E10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E14 00001E14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E18 00001E18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E1C 00001E1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E20 00001E20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E24 00001E24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E28 00001E28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E2C 00001E2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E30 00001E30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E34 00001E34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E38 00001E38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E3C 00001E3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E40 00001E40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E44 00001E44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E48 00001E48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E4C 00001E4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E50 00001E50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E54 00001E54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E58 00001E58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E5C 00001E5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E60 00001E60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E64 00001E64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E68 00001E68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E6C 00001E6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E70 00001E70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E74 00001E74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E78 00001E78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E7C 00001E7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E80 00001E80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E84 00001E84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E88 00001E88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E8C 00001E8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E90 00001E90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E94 00001E94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E98 00001E98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004E9C 00001E9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EA0 00001EA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EA4 00001EA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EA8 00001EA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EAC 00001EAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EB0 00001EB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EB4 00001EB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EB8 00001EB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EBC 00001EBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EC0 00001EC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EC4 00001EC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EC8 00001EC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004ECC 00001ECC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004ED0 00001ED0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004ED4 00001ED4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004ED8 00001ED8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EDC 00001EDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EE0 00001EE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EE4 00001EE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EE8 00001EE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EEC 00001EEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EF0 00001EF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EF4 00001EF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EF8 00001EF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004EFC 00001EFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F00 00001F00 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F04 00001F04 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F08 00001F08 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F0C 00001F0C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F10 00001F10 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F14 00001F14 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F18 00001F18 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F1C 00001F1C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F20 00001F20 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F24 00001F24 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F28 00001F28 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F2C 00001F2C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F30 00001F30 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F34 00001F34 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F38 00001F38 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F3C 00001F3C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F40 00001F40 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F44 00001F44 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F48 00001F48 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F4C 00001F4C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F50 00001F50 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F54 00001F54 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F58 00001F58 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F5C 00001F5C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F60 00001F60 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F64 00001F64 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F68 00001F68 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F6C 00001F6C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F70 00001F70 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F74 00001F74 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F78 00001F78 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F7C 00001F7C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F80 00001F80 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F84 00001F84 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F88 00001F88 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F8C 00001F8C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F90 00001F90 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F94 00001F94 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F98 00001F98 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004F9C 00001F9C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FA0 00001FA0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FA4 00001FA4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FA8 00001FA8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FAC 00001FAC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FB0 00001FB0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FB4 00001FB4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FB8 00001FB8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FBC 00001FBC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FC0 00001FC0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FC4 00001FC4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FC8 00001FC8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FCC 00001FCC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FD0 00001FD0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FD4 00001FD4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FD8 00001FD8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FDC 00001FDC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FE0 00001FE0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FE4 00001FE4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FE8 00001FE8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FEC 00001FEC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FF0 00001FF0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FF4 00001FF4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FF8 00001FF8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80004FFC 00001FFC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005000 00002000 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005004 00002004 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005008 00002008 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000500C 0000200C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005010 00002010 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005014 00002014 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005018 00002018 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000501C 0000201C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005020 00002020 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005024 00002024 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005028 00002028 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000502C 0000202C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005030 00002030 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005034 00002034 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005038 00002038 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000503C 0000203C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005040 00002040 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005044 00002044 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005048 00002048 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000504C 0000204C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005050 00002050 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005054 00002054 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005058 00002058 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000505C 0000205C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005060 00002060 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005064 00002064 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005068 00002068 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000506C 0000206C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005070 00002070 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005074 00002074 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005078 00002078 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000507C 0000207C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005080 00002080 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005084 00002084 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005088 00002088 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000508C 0000208C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005090 00002090 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005094 00002094 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005098 00002098 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000509C 0000209C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050A0 000020A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050A4 000020A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050A8 000020A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050AC 000020AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050B0 000020B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050B4 000020B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050B8 000020B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800050BC 000020BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800050C0 000020C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800050C4 000020C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800050C8 000020C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800050CC 000020CC 7C 60 00 A6 */ mfmsr r3 +/* 800050D0 000020D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800050D4 000020D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800050D8 000020D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800050DC 000020DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800050E0 000020E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800050E4 000020E4 38 60 1C 00 */ li r3, 0x1c00 +/* 800050E8 000020E8 4C 00 00 64 */ rfi +/* 800050EC 000020EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050F0 000020F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050F4 000020F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050F8 000020F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800050FC 000020FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005100 00002100 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005104 00002104 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005108 00002108 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000510C 0000210C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005110 00002110 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005114 00002114 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005118 00002118 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000511C 0000211C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005120 00002120 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005124 00002124 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005128 00002128 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000512C 0000212C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005130 00002130 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005134 00002134 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005138 00002138 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000513C 0000213C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005140 00002140 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005144 00002144 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005148 00002148 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000514C 0000214C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005150 00002150 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005154 00002154 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005158 00002158 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000515C 0000215C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005160 00002160 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005164 00002164 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005168 00002168 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000516C 0000216C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005170 00002170 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005174 00002174 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005178 00002178 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000517C 0000217C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005180 00002180 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005184 00002184 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005188 00002188 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000518C 0000218C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005190 00002190 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005194 00002194 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005198 00002198 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000519C 0000219C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051A0 000021A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051A4 000021A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051A8 000021A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051AC 000021AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051B0 000021B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051B4 000021B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051B8 000021B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800051BC 000021BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800051C0 000021C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800051C4 000021C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800051C8 000021C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800051CC 000021CC 7C 60 00 A6 */ mfmsr r3 +/* 800051D0 000021D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800051D4 000021D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800051D8 000021D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800051DC 000021DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800051E0 000021E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800051E4 000021E4 38 60 1D 00 */ li r3, 0x1d00 +/* 800051E8 000021E8 4C 00 00 64 */ rfi +/* 800051EC 000021EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051F0 000021F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051F4 000021F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051F8 000021F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800051FC 000021FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005200 00002200 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005204 00002204 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005208 00002208 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000520C 0000220C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005210 00002210 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005214 00002214 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005218 00002218 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000521C 0000221C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005220 00002220 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005224 00002224 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005228 00002228 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000522C 0000222C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005230 00002230 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005234 00002234 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005238 00002238 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000523C 0000223C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005240 00002240 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005244 00002244 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005248 00002248 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000524C 0000224C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005250 00002250 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005254 00002254 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005258 00002258 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000525C 0000225C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005260 00002260 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005264 00002264 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005268 00002268 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000526C 0000226C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005270 00002270 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005274 00002274 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005278 00002278 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000527C 0000227C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005280 00002280 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005284 00002284 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005288 00002288 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000528C 0000228C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005290 00002290 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005294 00002294 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005298 00002298 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000529C 0000229C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052A0 000022A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052A4 000022A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052A8 000022A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052AC 000022AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052B0 000022B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052B4 000022B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052B8 000022B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800052BC 000022BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800052C0 000022C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800052C4 000022C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800052C8 000022C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800052CC 000022CC 7C 60 00 A6 */ mfmsr r3 +/* 800052D0 000022D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800052D4 000022D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800052D8 000022D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800052DC 000022DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800052E0 000022E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800052E4 000022E4 38 60 1E 00 */ li r3, 0x1e00 +/* 800052E8 000022E8 4C 00 00 64 */ rfi +/* 800052EC 000022EC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052F0 000022F0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052F4 000022F4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052F8 000022F8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800052FC 000022FC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005300 00002300 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005304 00002304 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005308 00002308 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000530C 0000230C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005310 00002310 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005314 00002314 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005318 00002318 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000531C 0000231C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005320 00002320 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005324 00002324 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005328 00002328 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000532C 0000232C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005330 00002330 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005334 00002334 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005338 00002338 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000533C 0000233C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005340 00002340 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005344 00002344 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005348 00002348 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000534C 0000234C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005350 00002350 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005354 00002354 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005358 00002358 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000535C 0000235C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005360 00002360 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005364 00002364 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005368 00002368 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000536C 0000236C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005370 00002370 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005374 00002374 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005378 00002378 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000537C 0000237C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005380 00002380 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005384 00002384 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005388 00002388 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000538C 0000238C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005390 00002390 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005394 00002394 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 80005398 00002398 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 8000539C 0000239C 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053A0 000023A0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053A4 000023A4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053A8 000023A8 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053AC 000023AC 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053B0 000023B0 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053B4 000023B4 00 00 00 00 */ .4byte 0x00000000 /* unknown instruction */ +/* 800053B8 000023B8 7C 51 43 A6 */ mtspr 0x111, r2 +/* 800053BC 000023BC 7C 72 43 A6 */ mtspr 0x112, r3 +/* 800053C0 000023C0 7C 93 43 A6 */ mtspr 0x113, r4 +/* 800053C4 000023C4 7C 5A 02 A6 */ mfspr r2, 0x1a +/* 800053C8 000023C8 7C 9B 02 A6 */ mfspr r4, 0x1b +/* 800053CC 000023CC 7C 60 00 A6 */ mfmsr r3 +/* 800053D0 000023D0 60 63 00 30 */ ori r3, r3, 0x30 +/* 800053D4 000023D4 7C 7B 03 A6 */ mtspr 0x1b, r3 +/* 800053D8 000023D8 3C 60 80 21 */ lis r3, TRKInterruptHandler@h +/* 800053DC 000023DC 60 63 F2 24 */ ori r3, r3, TRKInterruptHandler@l +/* 800053E0 000023E0 7C 7A 03 A6 */ mtspr 0x1a, r3 +/* 800053E4 000023E4 38 60 1F 00 */ li r3, 0x1f00 +/* 800053E8 000023E8 4C 00 00 64 */ rfi +.global gTRKInterruptVectorTableEnd +gTRKInterruptVectorTableEnd: diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c index e69de29bb..56ba33a11 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c @@ -0,0 +1,31 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: 8021E788 + * Size: 000038 + */ +ASM void TRK_flush_cache(register void* param_1, register int param_2) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + + lis r5, 0xFFFF + ori r5, r5, 0xFFF1 + and r5, r5, param_1 + subf r3, r5, param_1 + add r4, param_2, r3 + + loop: + dcbst 0, r5 + dcbf 0, r5 + sync + icbi 0, r5 + addic r5, r5, 8 + addic. r4, r4, -8 + bge loop + + isync + blr + #endif // clang-format on +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c index e69de29bb..5858f4a17 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c @@ -0,0 +1,263 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +/* + * --INFO-- + * Address: 802200A0 + * Size: 0001B8 + */ +ASM void TRKSaveExtended1Block() +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + lis r2, gTRKCPUState@h /* 0x8044F338@h */ + ori r2, r2, gTRKCPUState@l /* 0x8044F338@l */ + mfsr r16, 0 + mfsr r17, 1 + mfsr r18, 2 + mfsr r19, 3 + mfsr r20, 4 + mfsr r21, 5 + mfsr r22, 6 + mfsr r23, 7 + mfsr r24, 8 + mfsr r25, 9 + mfsr r26, 0xa + mfsr r27, 0xb + mfsr r28, 0xc + mfsr r29, 0xd + mfsr r30, 0xe + mfsr r31, 0xf + stmw r16, 0x1a8(r2) + mftb r10, 0x10c + mftbu r11 + mfspr r12, 0x3f0 + mfspr r13, 0x3f1 + mfspr r14, 0x1b + mfpvr r15 + mfibatu r16, 0 + mfibatl r17, 0 + mfibatu r18, 1 + mfibatl r19, 1 + mfibatu r20, 2 + mfibatl r21, 2 + mfibatu r22, 3 + mfibatl r23, 3 + mfdbatu r24, 0 + mfdbatl r25, 0 + mfdbatu r26, 1 + mfdbatl r27, 1 + mfdbatu r28, 2 + mfdbatl r29, 2 + mfdbatu r30, 3 + mfdbatl r31, 3 + stmw r10, 0x1e8(r2) + mfspr r22, 0x19 + mfdar r23 + mfdsisr r24 + mfspr r25, 0x110 + mfspr r26, 0x111 + mfspr r27, 0x112 + mfspr r28, 0x113 + li r29, 0 + mfspr r30, 0x3f2 + mfspr r31, 0x11a + stmw r22, 0x25c(r2) + mfspr r20, 0x390 + mfspr r21, 0x391 + mfspr r22, 0x392 + mfspr r23, 0x393 + mfspr r24, 0x394 + mfspr r25, 0x395 + mfspr r26, 0x396 + mfspr r27, 0x397 + mfspr r28, 0x398 + mfspr r29, 0x399 + mfspr r30, 0x39a + mfspr r31, 0x39b + stmw r20, 0x2fc(r2) + b lbl_80371340 + mfspr r16, 0x3a0 + mfspr r17, 0x3a7 + mfspr r18, 0x3a8 + mfspr r19, 0x3a9 + mfspr r20, 0x3aa + mfspr r21, 0x3ab + mfspr r22, 0x3ac + mfspr r23, 0x3ad + mfspr r24, 0x3ae + mfspr r25, 0x3af + mfspr r26, 0x3b0 + mfspr r27, 0x3b7 + mfspr r28, 0x3bf + mfspr r29, 0x3f6 + mfspr r30, 0x3f7 + mfspr r31, 0x3ff + stmw r16, 0x2b8(r2) + +lbl_80371340: + mfspr r19, 0x3f5 + mfspr r20, 0x3b9 + mfspr r21, 0x3ba + mfspr r22, 0x3bd + mfspr r23, 0x3be + mfspr r24, 0x3bb + mfspr r25, 0x3b8 + mfspr r26, 0x3bc + mfspr r27, 0x3fc + mfspr r28, 0x3fd + mfspr r29, 0x3fe + mfspr r30, 0x3FB + mfspr r31, 0x3f9 + stmw r19, 0x284(r2) + b end + + mfspr r25, 0x3d0 + mfspr r26, 0x3d1 + mfspr r27, 0x3d2 + mfspr r28, 0x3d3 + mfspr r29, 0x3D4 + mfspr r30, 0x3D5 + mfspr r31, 0x3d6 + stmw r25, 0x240(r2) + mfspr r31, 0x16 + stw r31, 0x278(r2) +end: + blr +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 80220258 + * Size: 0001B8 + */ +ASM void TRKRestoreExtended1Block() +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + lis r2, gTRKCPUState@h /* 0x8044F338@h */ + ori r2, r2, gTRKCPUState@l /* 0x8044F338@l */ + lis r5, gTRKRestoreFlags@h /* 0x803D3238@h */ + ori r5, r5, gTRKRestoreFlags@l /* 0x803D3238@l */ + lbz r3, 0(r5) + lbz r6, 1(r5) + li r0, 0 + stb r0, 0(r5) + stb r0, 1(r5) + cmpwi r3, 0 + beq lbl_803713E4 + lwz r24, 0x1e8(r2) + lwz r25, 0x1ec(r2) + mttbl r24 + mttbu r25 +lbl_803713E4: + lmw r20, 0x2fc(r2) + mtspr 0x390, r20 + mtspr 0x391, r21 + mtspr 0x392, r22 + mtspr 0x393, r23 + mtspr 0x394, r24 + mtspr 0x395, r25 + mtspr 0x396, r26 + mtspr 0x397, r27 + mtspr 0x398, r28 + mtspr 0x39a, r30 + mtspr 0x39b, r31 + b lbl_80371430 + lmw r26, 0x2e0(r2) + mtspr 0x3b0, r26 + mtspr 0x3b7, r27 + mtspr 0x3f6, r29 + mtspr 0x3f7, r30 + mtspr 0x3ff, r31 +lbl_80371430: + lmw r19, 0x284(r2) + mtspr 0x3f5, r19 + mtspr 0x3b9, r20 + mtspr 0x3ba, r21 + mtspr 0x3bd, r22 + mtspr 0x3be, r23 + mtspr 0x3bb, r24 + mtspr 0x3b8, r25 + mtspr 0x3bc, r26 + mtspr 0x3fc, r27 + mtspr 0x3fd, r28 + mtspr 0x3fe, r29 + mtspr 0x3FB, r30 + mtspr 0x3f9, r31 + b lbl_8037149C + cmpwi r6, 0 + beq lbl_8037147C + lwz r26, 0x278(r2) + mtspr 0x16, r26 +lbl_8037147C: + lmw r25, 0x240(r2) + mtspr 0x3d0, r25 + mtspr 0x3d1, r26 + mtspr 0x3d2, r27 + mtspr 0x3d3, r28 + mtspr 0x3D4, r29 + mtspr 0x3D5, r30 + mtspr 0x3d6, r31 +lbl_8037149C: + lmw r16, 0x1a8(r2) + mtsr 0, r16 + mtsr 1, r17 + mtsr 2, r18 + mtsr 3, r19 + mtsr 4, r20 + mtsr 5, r21 + mtsr 6, r22 + mtsr 7, r23 + mtsr 8, r24 + mtsr 9, r25 + mtsr 0xa, r26 + mtsr 0xb, r27 + mtsr 0xc, r28 + mtsr 0xd, r29 + mtsr 0xe, r30 + mtsr 0xf, r31 + lmw r12, 0x1f0(r2) + mtspr 0x3f0, r12 + mtspr 0x3f1, r13 + mtspr 0x1b, r14 + mtspr 0x11f, r15 + mtibatu 0, r16 + mtibatl 0, r17 + mtibatu 1, r18 + mtibatl 1, r19 + mtibatu 2, r20 + mtibatl 2, r21 + mtibatu 3, r22 + mtibatl 3, r23 + mtdbatu 0, r24 + mtdbatl 0, r25 + mtdbatu 1, r26 + mtdbatl 1, r27 + mtdbatu 2, r28 + mtdbatl 2, r29 + mtdbatu 3, r30 + mtdbatl 3, r31 + lmw r22, 0x25c(r2) + mtspr 0x19, r22 + mtdar r23 + mtdsisr r24 + mtspr 0x110, r25 + mtspr 0x111, r26 + mtspr 0x112, r27 + mtspr 0x113, r28 + mtspr 0x3f2, r30 + mtspr 0x11a, r31 + blr +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 80220410 + * Size: 000008 + */ +u8 TRKTargetCPUMinorType(void) +{ + return 0x54; +} diff --git a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c index e69de29bb..77ea47844 100644 --- a/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c +++ b/libs/runtime_libs/debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c @@ -0,0 +1,1494 @@ +#include "PowerPC_EABI_Support/MetroTRK/trk.h" + +typedef struct memRange { + u8* start; + u8* end; + BOOL readable; + BOOL writeable; +} memRange; + +const memRange gTRKMemMap[1] = { { (u8*)0, (u8*)-1, TRUE, TRUE } }; + +typedef struct StopInfo_PPC { + u32 PC; + u32 PCInstruction; + u16 exceptionID; +} StopInfo_PPC; +typedef struct TRKExceptionStatus { + StopInfo_PPC exceptionInfo; + u8 inTRK; + u8 exceptionDetected; +} TRKExceptionStatus; +typedef struct TRKStepStatus { + BOOL active; // 0x0 + u8 type; // 0x4 + u32 count; // 0x8 + u32 rangeStart; // 0xC + u32 rangeEnd; // 0x10 +} TRKStepStatus; + +// Instruction macros +#define INSTR_NOP 0x60000000 +#define INSTR_BLR 0x4E800020 +#define DSFetch_u32(_p_) (*((u32*)_p_)) +#define DSFetch_u64(_p_) (*((u64*)_p_)) +#define INSTR_PSQ_ST(psr, offset, rDest, w, gqr) (0xF0000000 | (psr << 21) | (rDest << 16) | (w << 15) | (gqr << 12) | offset) +#define INSTR_PSQ_L(psr, offset, rSrc, w, gqr) (0xE0000000 | (psr << 21) | (rSrc << 16) | (w << 15) | (gqr << 12) | offset) +#define INSTR_STW(rSrc, offset, rDest) (0x90000000 | (rSrc << 21) | (rDest << 16) | offset) +#define INSTR_LWZ(rDest, offset, rSrc) (0x80000000 | (rDest << 21) | (rSrc << 16) | offset) +#define INSTR_STFD(fprSrc, offset, rDest) (0xD8000000 | (fprSrc << 21) | (rDest << 16) | offset) +#define INSTR_LFD(fprDest, offset, rSrc) (0xC8000000 | (fprDest << 21) | (rSrc << 16) | offset) +#define INSTR_MFSPR(rDest, spr) (0x7C000000 | (rDest << 21) | ((spr & 0xFE0) << 6) | ((spr & 0x1F) << 16) | 0x2A6) +#define INSTR_MTSPR(spr, rSrc) (0x7C000000 | (rSrc << 21) | ((spr & 0xFE0) << 6) | ((spr & 0x1F) << 16) | 0x3A6) + +ProcessorRestoreFlags_PPC gTRKRestoreFlags = { FALSE, FALSE }; +static TRKExceptionStatus gTRKExceptionStatus = { { 0, 0, 0 }, TRUE, 0 }; +static TRKStepStatus gTRKStepStatus = { FALSE, DSSTEP_IntoCount, 0, 0 }; +static u16 TRK_saved_exceptionID = 0; +ProcessorState_PPC gTRKCPUState; +TRKState gTRKState; + +typedef unsigned char u128[16]; +u128 TRKvalue128_temp; + +Default_PPC gTRKSaveState; +void TRKPostInterruptEvent(void); +void TRKExceptionHandler(u16 a); +void TRKUARTInterruptHandler(void); +void TRKInterruptHandlerEnableInterrupts(void); +DSError TRKPPCAccessSPR(void*, u32, BOOL); +DSError TRKPPCAccessPairedSingleRegister(void*, u32, BOOL); +DSError TRKPPCAccessFPRegister(void*, u32, BOOL); +DSError TRKPPCAccessSpecialReg(void*, u32*, BOOL); + +static BOOL TRKTargetCheckStep(); + +/* + * --INFO-- + * Address: 8021E884 + * Size: 000008 + */ +ASM u32 __TRK_get_MSR() { +#ifdef __MWERKS__ // clang-format off + nofralloc + mfmsr r3 + blr +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021E88C + * Size: 000008 + */ +ASM void __TRK_set_MSR(register u32 msr) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + mtmsr msr + blr + #endif // clang-format on +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_PVR(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT0U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT0L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT1U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT1L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT2U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT2L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT3U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_IBAT3L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT0U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT0L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT1U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT1L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT2U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT2L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT3U(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void __TRK_get_DBAT3L(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021E894 + * Size: 000138 + */ +DSError TRKValidMemory32(const void* addr, size_t length, ValidMemoryOptions readWriteable) +{ + DSError err = DS_InvalidMemory; /* assume range is invalid */ + + const u8* start; + const u8* end; + + int i; + + /* + ** Get start and end addresses for the memory range and + ** verify that they are reasonable. + */ + + start = (const u8*)addr; + end = ((const u8*)addr + (length - 1)); + + if (end < start) + return DS_InvalidMemory; + + /* + ** Iterate through the gTRKMemMap array to determine if the requested + ** range falls within the valid ranges in the map. + */ + + for (i = 0; (i < (s32)(sizeof(gTRKMemMap) / sizeof(memRange))); i++) { + /* + ** If the requested range is not completely above + ** the valid range AND it is not completely below + ** the valid range then it must overlap somewhere. + ** If the requested range overlaps with one of the + ** valid ranges, do some additional checking. + ** + */ + + if ((start <= (const u8*)gTRKMemMap[i].end) && (end >= (const u8*)gTRKMemMap[i].start)) { + /* + ** First, verify that the read/write attributes are + ** acceptable. If so, then recursively check any + ** part of the requested range that falls before or + ** after the valid range. + */ + + if ((((u8)readWriteable == VALIDMEM_Readable) && !gTRKMemMap[i].readable) + || (((u8)readWriteable == VALIDMEM_Writeable) && !gTRKMemMap[i].writeable)) { + err = DS_InvalidMemory; + } else { + err = DS_NoError; + + /* + ** If a portion of the requested range falls before + ** the current valid range, then recursively + ** check it. + */ + + if (start < (const u8*)gTRKMemMap[i].start) + err = TRKValidMemory32(start, (u32)((const u8*)gTRKMemMap[i].start - start), readWriteable); + + /* + ** If a portion of the requested range falls after + ** the current valid range, then recursively + ** check it. + ** Note: Only do this step if the previous check + ** did not detect invalid access. + */ + + if ((err == DS_NoError) && (end > (const u8*)gTRKMemMap[i].end)) + err = TRKValidMemory32((const u8*)gTRKMemMap[i].end, (u32)(end - (const u8*)gTRKMemMap[i].end), readWriteable); + } + + break; + } + } + + return err; +} + +/* + * --INFO-- + * Address: 8021E9CC + * Size: 00003C + */ +static ASM void TRK_ppc_memcpy(register void* dest, register const void* src, register int n, register u32 param_4, register u32 param_5) { +#ifdef __MWERKS__ // clang-format off +#define msr r8 +#define byte r9 +#define count r10 +nofralloc + +mfmsr msr +li count, 0 + +top_loop: +cmpw count, n +beq out_loop + +mtmsr param_5 +sync + +lbzx byte, count, src + +mtmsr param_4 +sync + +stbx byte, count, dest + +addi count, count, 1 + +b top_loop +out_loop: +mtmsr msr +sync + +blr +#undef count +#undef byte +#undef msr +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021EA08 + * Size: 000164 + */ +DSError TRKTargetAccessMemory(void* data, u32 start, size_t* length, MemoryAccessOptions accessOptions, BOOL read) +{ + DSError error; + u32 target_msr; + void* addr; + u32 trk_msr; + TRKExceptionStatus tempExceptionStatus = gTRKExceptionStatus; + gTRKExceptionStatus.exceptionDetected = FALSE; + + addr = (void*)TRKTargetTranslate(start); + error = TRKValidMemory32(addr, *length, read ? VALIDMEM_Readable : VALIDMEM_Writeable); + + if (error != DS_NoError) { + *length = 0; + } else { + target_msr = __TRK_get_MSR(); + trk_msr = target_msr | gTRKCPUState.Extended1.MSR & 0x10; + + if (read) { + TRK_ppc_memcpy(data, addr, *length, target_msr, trk_msr); + } else { + TRK_ppc_memcpy(addr, data, *length, trk_msr, target_msr); + TRK_flush_cache(addr, *length); + if ((void*)start != addr) { + TRK_flush_cache((void*)start, *length); + } + } + } + + if (gTRKExceptionStatus.exceptionDetected) { + *length = 0; + error = DS_CWDSException; + } + + gTRKExceptionStatus = tempExceptionStatus; + return error; +} + +/* + * --INFO-- + * Address: 8021EB6C + * Size: 00004C + */ +DSError TRKTargetReadInstruction(void* data, u32 start) +{ + DSError error; + size_t registersLength = 4; + + error = TRKTargetAccessMemory(data, start, ®istersLength, MEMACCESS_UserMemory, TRUE); + + if (error == DS_NoError && registersLength != 4) { + error = DS_InvalidMemory; + } + + return error; +} + +/* + * --INFO-- + * Address: 8021EBB8 + * Size: 0000FC + */ +DSError TRKTargetAccessDefault(u32 firstRegister, u32 lastRegister, TRKBuffer* b, size_t* registersLengthPtr, BOOL read) +{ + DSError error; + u32 count; + u32* data; + TRKExceptionStatus tempExceptionStatus; + + if (lastRegister > 0x24) { + return DS_InvalidRegister; + } + + tempExceptionStatus = gTRKExceptionStatus; + + gTRKExceptionStatus.exceptionDetected = FALSE; + + data = gTRKCPUState.Default.GPR + firstRegister; + + count = (lastRegister - firstRegister) + 1; + + *registersLengthPtr = count * sizeof(u32); + + if (read) { + error = TRKAppendBuffer_ui32(b, data, count); + } else { + error = TRKReadBuffer_ui32(b, data, count); + } + + if (gTRKExceptionStatus.exceptionDetected) { + *registersLengthPtr = 0; + error = DS_CWDSException; + } + + gTRKExceptionStatus = tempExceptionStatus; + return error; +} + +/* + * --INFO-- + * Address: 8021ECB4 + * Size: 000148 + */ +DSError TRKTargetAccessFP(u32 firstRegister, u32 lastRegister, TRKBuffer* b, size_t* registersLengthPtr, BOOL read) +{ + u64 temp; + DSError error; + TRKExceptionStatus tempExceptionStatus; + u32 current; + + if (lastRegister > 0x21) { + return DS_InvalidRegister; + } + + tempExceptionStatus = gTRKExceptionStatus; + gTRKExceptionStatus.exceptionDetected = FALSE; + + __TRK_set_MSR(__TRK_get_MSR() | 0x2000); + + *registersLengthPtr = 0; + error = DS_NoError; + + for (current = firstRegister; (current <= lastRegister) && (error == DS_NoError); current++, *registersLengthPtr += sizeof(f64)) { + if (read) { + TRKPPCAccessFPRegister(&temp, current, read); + error = TRKAppendBuffer1_ui64(b, temp); + } else { + TRKReadBuffer1_ui64(b, &temp); + error = TRKPPCAccessFPRegister(&temp, current, read); + } + } + + if (gTRKExceptionStatus.exceptionDetected) { + *registersLengthPtr = 0; + error = DS_CWDSException; + } + + gTRKExceptionStatus = tempExceptionStatus; + return error; +} + +/* + * --INFO-- + * Address: 8021EDFC + * Size: 000178 + */ +DSError TRKTargetAccessExtended1(u32 firstRegister, u32 lastRegister, TRKBuffer* b, size_t* registersLengthPtr, BOOL read) +{ + TRKExceptionStatus tempExceptionStatus; + int error; + u32* data; + int count; + + if (lastRegister > 0x60) { + return DS_InvalidRegister; + } + + tempExceptionStatus = gTRKExceptionStatus; + gTRKExceptionStatus.exceptionDetected = FALSE; + + *registersLengthPtr = 0; + + if (firstRegister <= lastRegister) { + data = (u32*)&gTRKCPUState.Extended1 + firstRegister; + count = lastRegister - firstRegister + 1; + *registersLengthPtr += count * sizeof(u32); + + if (read) { + error = TRKAppendBuffer_ui32(b, data, count); + } else { + if (data <= &gTRKCPUState.Extended1.TBU && (data + count - 1) >= &gTRKCPUState.Extended1.TBL) { + gTRKRestoreFlags.TBR = 1; + } + + if (data <= &gTRKCPUState.Extended1.DEC && (data + count - 1) >= &gTRKCPUState.Extended1.DEC) { + gTRKRestoreFlags.DEC = 1; + } + error = TRKReadBuffer_ui32(b, data, count); + } + } + if (gTRKExceptionStatus.exceptionDetected) { + *registersLengthPtr = 0; + error = DS_CWDSException; + } + + gTRKExceptionStatus = tempExceptionStatus; + return error; +} + +/* + * --INFO-- + * Address: 8021EF74 + * Size: 00017C + */ +DSError TRKTargetAccessExtended2(u32 firstRegister, u32 lastRegister, TRKBuffer* b, size_t* registerStorageSize, BOOL read) +{ + u32 value_buf[2]; + TRKExceptionStatus savedException; + u32 i; + DSError err; + u32 value_buf0[1]; + + if (lastRegister > 0x1f) + return DS_InvalidRegister; + + /* + ** Save any existing exception status and clear the exception flag. + ** This allows detection of exceptions that occur ONLY within this + ** function. + */ + + savedException = gTRKExceptionStatus; + gTRKExceptionStatus.exceptionDetected = FALSE; + + TRKPPCAccessSPR(value_buf0, SPR_HID2, TRUE); + + value_buf0[0] |= 0xA0000000; + TRKPPCAccessSPR(value_buf0, SPR_HID2, FALSE); + + value_buf0[0] = 0; + TRKPPCAccessSPR(value_buf0, SPR_GQR0, FALSE); + + *registerStorageSize = 0; + err = DS_NoError; + + for (i = firstRegister; (i <= lastRegister) && (err == DS_NoError); i++) { + if (read) { + err = TRKPPCAccessPairedSingleRegister((u64*)value_buf, i, read); + err = TRKAppendBuffer1_ui64(b, *(u64*)value_buf); + } else { + err = TRKReadBuffer1_ui64(b, (u64*)value_buf); + err = TRKPPCAccessPairedSingleRegister((u64*)value_buf, i, read); + } + + *registerStorageSize += sizeof(u64); + } + + if (gTRKExceptionStatus.exceptionDetected) { + *registerStorageSize = 0; + err = DS_CWDSException; + } + + gTRKExceptionStatus = savedException; + + return err; +} + +/* + * --INFO-- + * Address: 8021F0F0 + * Size: 000028 + */ +DSError TRKTargetVersions(DSVersions* versions) +{ + versions->kernelMajor = 0; + versions->kernelMinor = 8; + versions->protocolMajor = 1; + versions->protocolMinor = 10; + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021F118 + * Size: 0000A4 + */ +DSError TRKTargetSupportMask(u8 mask[32]) +{ + mask[0] = 0x7a; + mask[1] = 0; + mask[2] = 0x4f; + mask[3] = 7; + mask[4] = 0; + mask[5] = 0; + mask[6] = 0; + mask[7] = 0; + mask[8] = 0; + mask[9] = 0; + mask[10] = 0; + mask[0xb] = 0; + mask[0xc] = 0; + mask[0xd] = 0; + mask[0xe] = 0; + mask[0xf] = 0; + mask[0x10] = 1; + mask[0x11] = 0; + mask[0x12] = 3; + mask[0x13] = 0; + mask[0x14] = 0; + mask[0x15] = 0; + mask[0x16] = 0; + mask[0x17] = 0; + mask[0x18] = 0; + mask[0x19] = 0; + mask[0x1a] = 3; + mask[0x1b] = 0; + mask[0x1c] = 0; + mask[0x1d] = 0; + mask[0x1e] = 0; + mask[0x1f] = 0x80; + return DS_NoError; +} + +extern BOOL gTRKBigEndian; +/* + * --INFO-- + * Address: 8021F1BC + * Size: 000068 + */ +DSError TRKTargetCPUType(DSCPUType* cpuType) +{ + cpuType->cpuMajor = 0; + cpuType->cpuMinor = TRKTargetCPUMinorType(); + cpuType->bigEndian = gTRKBigEndian; + cpuType->defaultTypeSize = 4; + cpuType->fpTypeSize = 8; + cpuType->extended1TypeSize = 4; + cpuType->extended2TypeSize = 8; + return DS_NoError; +} + +/* + * --INFO-- + * Address: ........ + * Size: 00002C + */ +void TRKTargetCheckException(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8021F224 + * Size: 000194 + */ +ASM void TRKInterruptHandler() +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + mtsrr0 r2 + mtsrr1 r4 + mfsprg r4, 3 + mfcr r2 + mtsprg 3, r2 + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + lwz r2, TRKState_PPC.MSR(r2) + ori r2, r2, 0x8002 + xori r2, r2, 0x8002 + sync + mtmsr r2 + sync + lis r2, TRK_saved_exceptionID@h + ori r2, r2, TRK_saved_exceptionID@l + sth r3, 0(r2) + cmpwi r3, 0x500 + bne L_802CF694 + lis r2, gTRKCPUState@h + ori r2, r2, gTRKCPUState@l + mflr r3 + stw r3, ProcessorState_PPC.transport_handler_saved_ra(r2) + bl TRKUARTInterruptHandler + lis r2, gTRKCPUState@h + ori r2, r2, gTRKCPUState@l + lwz r3, ProcessorState_PPC.transport_handler_saved_ra(r2) + mtlr r3 + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + lwz r2, TRKState_PPC.inputPendingPtr(r2) + lbz r2, TRKState_PPC.GPR[0](r2) + cmpwi r2, 0 + beq L_802CF678 + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + lbz r2, TRKExceptionStatus.inTRK(r2) + cmpwi r2, 1 + beq L_802CF678 + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + li r3, 1 + stb r3, TRKState_PPC.inputActivated(r2) + b L_802CF694 +L_802CF678: + lis r2, gTRKSaveState@h + ori r2, r2, gTRKSaveState@l + lwz r3, Default_PPC.CR(r2) + mtcrf 0xff, r3 + lwz r3, Default_PPC.GPR[3](r2) + lwz r2, Default_PPC.GPR[2](r2) + rfi +L_802CF694: + lis r2, TRK_saved_exceptionID@h + ori r2, r2, TRK_saved_exceptionID@l + lhz r3, 0(r2) + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + lbz r2, TRKExceptionStatus.inTRK(r2) + cmpwi r2, 0 + bne TRKExceptionHandler + lis r2, gTRKCPUState@h + ori r2, r2, gTRKCPUState@l + stw r0, ProcessorState_PPC.Default.GPR[0](r2) + stw r1, ProcessorState_PPC.Default.GPR[1](r2) + mfsprg r0, 1 + stw r0, ProcessorState_PPC.Default.GPR[2](r2) + sth r3, ProcessorState_PPC.Extended1.exceptionID(r2) + sth r3, (ProcessorState_PPC.Extended1.exceptionID + 2)(r2) + mfsprg r0, 2 + stw r0, ProcessorState_PPC.Default.GPR[3](r2) + stmw r4, ProcessorState_PPC.Default.GPR[4](r2) + mfsrr0 r27 + mflr r28 + mfsprg r29, 3 + mfctr r30 + mfxer r31 + stmw r27, ProcessorState_PPC.Default.PC(r2) + bl TRKSaveExtended1Block + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + li r3, 1 + stb r3, TRKExceptionStatus.inTRK(r2) + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + lwz r0, TRKState_PPC.MSR(r2) + sync + mtmsr r0 + sync + lwz r0, TRKState_PPC.LR(r2) + mtlr r0 + lwz r0, TRKState_PPC.CTR(r2) + mtctr r0 + lwz r0, TRKState_PPC.XER(r2) + mtxer r0 + lwz r0, TRKState_PPC.DSISR(r2) + mtdsisr r0 + lwz r0, TRKState_PPC.DAR(r2) + mtdar r0 + lmw r3, TRKState_PPC.GPR[3](r2) + lwz r0, TRKState_PPC.GPR[0](r2) + lwz r1, TRKState_PPC.GPR[1](r2) + lwz r2, TRKState_PPC.GPR[2](r2) + b TRKPostInterruptEvent +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021F3B8 + * Size: 00009C + */ +ASM void TRKExceptionHandler(u16 a) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + sth r3, TRKExceptionStatus.exceptionInfo.exceptionID(r2) + mfsrr0 r3 + stw r3, TRKExceptionStatus.exceptionInfo.PC(r2) + lhz r3, TRKExceptionStatus.exceptionInfo.exceptionID(r2) + cmpwi r3, 0x200 + beq LAB_00010ba4 + cmpwi r3, 0x300 + beq LAB_00010ba4 + cmpwi r3, 0x400 + beq LAB_00010ba4 + cmpwi r3, 0x600 + beq LAB_00010ba4 + cmpwi r3, 0x700 + beq LAB_00010ba4 + cmpwi r3, 0x800 + beq LAB_00010ba4 + cmpwi r3, 0x1000 + beq LAB_00010ba4 + cmpwi r3, 0x1100 + beq LAB_00010ba4 + cmpwi r3, 0x1200 + beq LAB_00010ba4 + cmpwi r3, 0x1300 + beq LAB_00010ba4 + b LAB_00010bb0 +LAB_00010ba4: + mfsrr0 r3 + addi r3, r3, 0x4 + mtsrr0 r3 +LAB_00010bb0: + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + li r3, 0x1 + stb r3, TRKExceptionStatus.exceptionDetected(r2) + mfsprg r3, 3 + mtcrf 0xff, r3 + mfsprg r2, 1 + mfsprg r3, 2 + rfi +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021F454 + * Size: 0000B0 + */ +void TRKPostInterruptEvent(void) +{ + TRKEvent event; + NubEventType eventType; + u32 inst; + + if (gTRKState.inputActivated) { + gTRKState.inputActivated = FALSE; + } else { + switch (gTRKCPUState.Extended1.exceptionID & 0xFFFF) { + case 0xd00: + case 0x700: + TRKTargetReadInstruction(&inst, gTRKCPUState.Default.PC); + + if (inst == 0xfe00000) { + eventType = NUBEVENT_Support; + } else { + eventType = NUBEVENT_Breakpoint; + } + break; + default: + eventType = NUBEVENT_Exception; + break; + } + + TRKConstructEvent(&event, eventType); + TRKPostEvent(&event); + } +} + +/* + * --INFO-- + * Address: 8021F504 + * Size: 0000C4 + */ +ASM void TRKSwapAndGo() +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + lis r3, gTRKState@h + ori r3, r3, gTRKState@l + stmw r0, TRKState_PPC.GPR[0](r3) + mfmsr r0 + stw r0, TRKState_PPC.MSR(r3) + mflr r0 + stw r0, TRKState_PPC.LR(r3) + mfctr r0 + stw r0, TRKState_PPC.CTR(r3) + mfxer r0 + stw r0, TRKState_PPC.XER(r3) + mfdsisr r0 + stw r0, TRKState_PPC.DSISR(r3) + mfdar r0 + stw r0, TRKState_PPC.DAR(r3) + li r1, -0x7ffe + nor r1, r1, r1 + mfmsr r3 + and r3, r3, r1 + mtmsr r3 + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + lwz r2, TRKState_PPC.inputPendingPtr(r2) + lbz r2, TRKState_PPC.GPR[0](r2) + cmpwi r2, 0 + beq L_802CF930 + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + li r3, 1 + stb r3, TRKState_PPC.inputActivated(r2) + b TRKInterruptHandlerEnableInterrupts +L_802CF930: + lis r2, gTRKExceptionStatus@h + ori r2, r2, gTRKExceptionStatus@l + li r3, 0 + stb r3, 0xc(r2) + bl TRKRestoreExtended1Block + lis r2, gTRKCPUState@h + ori r2, r2, gTRKCPUState@l + lmw r27, ProcessorState_PPC.Default.PC(r2) + mtsrr0 r27 + mtlr r28 + mtcrf 0xff, r29 + mtctr r30 + mtxer r31 + lmw r3, ProcessorState_PPC.Default.GPR[3](r2) + lwz r0, ProcessorState_PPC.Default.GPR[0](r2) + lwz r1, ProcessorState_PPC.Default.GPR[1](r2) + lwz r2, ProcessorState_PPC.Default.GPR[2](r2) + rfi +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021F5C8 + * Size: 000054 + */ +ASM void TRKInterruptHandlerEnableInterrupts(void) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc; + lis r2, gTRKState@h + ori r2, r2, gTRKState@l + lwz r0, TRKState_PPC.MSR(r2) + sync + mtmsr r0 + sync + lwz r0, TRKState_PPC.LR(r2) + mtlr r0 + lwz r0, TRKState_PPC.CTR(r2) + mtctr r0 + lwz r0, TRKState_PPC.XER(r2) + mtxer r0 + lwz r0, TRKState_PPC.DSISR(r2) + mtdsisr r0 + lwz r0, TRKState_PPC.DAR(r2) + mtdar r0 + lmw r3, TRKState_PPC.GPR[3](r2) + lwz r0, TRKState_PPC.GPR[0](r2) + lwz r1, TRKState_PPC.GPR[1](r2) + lwz r2, TRKState_PPC.GPR[2](r2) + b TRKPostInterruptEvent +#endif // clang-format on +} + +/* + * --INFO-- + * Address: 8021F61C + * Size: 000064 + */ +DSError TRKTargetInterrupt(TRKEvent* event) +{ + DSError error = DS_NoError; + switch (event->eventType) { + case NUBEVENT_Breakpoint: + case NUBEVENT_Exception: + if (TRKTargetCheckStep() == FALSE) { + TRKTargetSetStopped(TRUE); + error = TRKDoNotifyStopped(DSMSG_NotifyStopped); + } + break; + default: + break; + } + + return error; +} + +/* + * --INFO-- + * Address: 8021F680 + * Size: 000090 + */ +DSError TRKTargetAddStopInfo(TRKBuffer* buffer) +{ + DSError error; + u32 instruction; + + error = TRKAppendBuffer1_ui32(buffer, gTRKCPUState.Default.PC); + if (error == DS_NoError) { + error = TRKTargetReadInstruction(&instruction, gTRKCPUState.Default.PC); + } + if (error == DS_NoError) + error = TRKAppendBuffer1_ui32(buffer, instruction); + if (error == DS_NoError) + error = TRKAppendBuffer1_ui16(buffer, gTRKCPUState.Extended1.exceptionID); + + return error; +} + +/* + * --INFO-- + * Address: 8021F710 + * Size: 000088 + */ +DSError TRKTargetAddExceptionInfo(TRKBuffer* buffer) +{ + DSError error; + u32 local_10; + + error = TRKAppendBuffer1_ui32(buffer, gTRKExceptionStatus.exceptionInfo.PC); + if (error == 0) { + error = TRKTargetReadInstruction(&local_10, gTRKExceptionStatus.exceptionInfo.PC); + } + if (error == 0) { + error = TRKAppendBuffer1_ui32(buffer, local_10); + } + if (error == 0) { + error = TRKAppendBuffer1_ui16(buffer, gTRKExceptionStatus.exceptionInfo.exceptionID); + } + + return error; +} + +/* + * --INFO-- + * Address: 8021F798 + * Size: 00003C + */ +static DSError TRKTargetEnableTrace(BOOL val) +{ + if (val) { + gTRKCPUState.Extended1.MSR |= 0x400; + } else { + gTRKCPUState.Extended1.MSR &= ~0x400; + } + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021F7D4 + * Size: 000084 + */ +static BOOL TRKTargetStepDone() +{ + BOOL result = TRUE; + + if (gTRKStepStatus.active && ((u16)gTRKCPUState.Extended1.exceptionID) == PPC_Trace) { + switch (gTRKStepStatus.type) { + case DSSTEP_IntoCount: + if (gTRKStepStatus.count > 0) { + result = FALSE; + } + break; + case DSSTEP_IntoRange: + if (gTRKCPUState.Default.PC >= gTRKStepStatus.rangeStart && gTRKCPUState.Default.PC <= gTRKStepStatus.rangeEnd) { + result = FALSE; + } + break; + default: + break; + } + } + + return result; +} + +/* + * --INFO-- + * Address: 8021F858 + * Size: 000070 + */ +static DSError TRKTargetDoStep() +{ + gTRKStepStatus.active = TRUE; + TRKTargetEnableTrace(TRUE); + + if (gTRKStepStatus.type == DSSTEP_IntoCount || gTRKStepStatus.type == DSSTEP_OverCount) { + gTRKStepStatus.count--; + } + + TRKTargetSetStopped(FALSE); + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021F8C8 + * Size: 000068 + */ +static BOOL TRKTargetCheckStep() +{ + if (gTRKStepStatus.active) { + TRKTargetEnableTrace(FALSE); + + if (TRKTargetStepDone()) { + gTRKStepStatus.active = FALSE; + } else { + TRKTargetDoStep(); + } + } + + return gTRKStepStatus.active; +} + +/* + * --INFO-- + * Address: 8021F930 + * Size: 000044 + */ +DSError TRKTargetSingleStep(u32 count, BOOL stepOver) +{ + DSError error = DS_NoError; + + if (stepOver) { + error = DS_UnsupportedError; + } else { + gTRKStepStatus.type = DSSTEP_IntoCount; + gTRKStepStatus.count = count; + error = TRKTargetDoStep(); + } + + return error; +} + +/* + * --INFO-- + * Address: 8021F974 + * Size: 000048 + */ +DSError TRKTargetStepOutOfRange(u32 rangeStart, u32 rangeEnd, BOOL stepOver) +{ + DSError error = DS_NoError; + + if (stepOver) { + // Stepping over isn't supported for PowerPC + error = DS_UnsupportedError; + } else { + gTRKStepStatus.type = DSSTEP_IntoRange; + // gTRKStepStatus.active = TRUE; + gTRKStepStatus.rangeStart = rangeStart; + gTRKStepStatus.rangeEnd = rangeEnd; + error = TRKTargetDoStep(); + } + + return error; +} + +/* + * --INFO-- + * Address: 8021F9BC + * Size: 000010 + */ +u32 TRKTargetGetPC() +{ + return gTRKCPUState.Default.PC; +} + +/* + * --INFO-- + * Address: 8021F9CC + * Size: 0000F0 + */ +DSError TRKTargetSupportRequest(void) +{ + DSError error; + // u32 spC; + size_t* length; + TRKEvent event; + u8 ioResult; + u8 commandId; + + commandId = (MessageCommandID)gTRKCPUState.Default.GPR[3]; + if (commandId != DSMSG_ReadFile && commandId != DSMSG_WriteFile) { + TRKConstructEvent(&event, NUBEVENT_Exception); + TRKPostEvent(&event); + return DS_NoError; + } + + length = (size_t*)gTRKCPUState.Default.GPR[5]; + error = TRKSuppAccessFile((u8)gTRKCPUState.Default.GPR[4], (u8*)gTRKCPUState.Default.GPR[6], length, (DSIOResult*)&ioResult, TRUE, + commandId == DSMSG_ReadFile); + if (ioResult == DS_IONoError && error != DS_NoError) { + ioResult = DS_IOError; + } + gTRKCPUState.Default.GPR[3] = ioResult; + if (commandId == DSMSG_ReadFile) { + TRK_flush_cache((void*)gTRKCPUState.Default.GPR[6], *length); + } + gTRKCPUState.Default.PC += 4; + return error; +} + +/* + * --INFO-- + * Address: 8021FABC + * Size: 00003C + */ +DSError TRKTargetFlushCache(u8 a, void* start, void* end) +{ + if (start < end) { + TRK_flush_cache(start, (u8*)end - (u8*)start); + return DS_NoError; + } + + return DS_InvalidMemory; +} + +/* + * --INFO-- + * Address: 8021FAF8 + * Size: 000010 + */ +BOOL TRKTargetStopped() +{ + return gTRKState.isStopped; +} + +/* + * --INFO-- + * Address: 8021FB08 + * Size: 000010 + */ +void TRKTargetSetStopped(uint stopped) +{ + gTRKState.isStopped = stopped; +} + +/* + * --INFO-- + * Address: 8021FB18 + * Size: 000028 + */ +u32 TRKTargetStop() +{ + TRKTargetSetStopped(1); + return 0; +} + +/* + * --INFO-- + * Address: 8021FB40 + * Size: 0000B0 + */ +DSError TRKPPCAccessSPR(void* value, u32 spr_register_num, BOOL read) +{ + /* Initialize instruction array with nop */ + + u32 access_func[5] = { INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP }; + /* + ** Construct a small assembly function to perform the + ** requested access and call it. The read/write function + ** is in the form: + ** + ** read: + ** mfspr r4, spr_register_num + ** stw r4, 0(r3) + ** blr + ** + ** write: + ** lwz r4, 0(r3) + ** mtspr spr_register_num, r4 + ** blr + ** + */ + + if (read) { + access_func[0] = INSTR_MFSPR(4, spr_register_num); + access_func[1] = (u32)INSTR_STW(4, 0, 3); + } else { + access_func[0] = (u32)INSTR_LWZ(4, 0, 3); + access_func[1] = INSTR_MTSPR(spr_register_num, 4); + } + + return TRKPPCAccessSpecialReg(value, access_func, read); +} + +/* + * --INFO-- + * Address: 8021FBF0 + * Size: 000078 + */ +DSError TRKPPCAccessPairedSingleRegister(void* srcDestPtr, u32 psr, BOOL read) +{ + // all nop by default + u32 instructionData[] = { INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP }; + + if (read) { + instructionData[0] = INSTR_PSQ_ST(psr, 0, 3, 0, 0); // psq_st psr, 0(r3), 0, 0 + } else { + instructionData[0] = INSTR_PSQ_L(psr, 0, 3, 0, 0); // psq_l psr, 0(r3), 0, 0 + } + + return TRKPPCAccessSpecialReg(srcDestPtr, instructionData, read); +} + +#define FP_FPSCR_ACCESS 32 +#define FP_FPECR_ACCESS 33 + +/* + * --INFO-- + * Address: 8021FC68 + * Size: 000180 + */ +DSError TRKPPCAccessFPRegister(void* srcDestPtr, u32 fpr, BOOL read) +{ + DSError error = DS_NoError; + // all nop by default + u32 instructionData1[] = { INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP, INSTR_NOP }; + + if (fpr < FP_FPSCR_ACCESS) { + if (read) { + instructionData1[0] = INSTR_STFD(fpr, 0, 3); // stfd fpr, 0(r3) + } else { + instructionData1[0] = INSTR_LFD(fpr, 0, 3); // lfd fpr, 0(r3) + } + + error = TRKPPCAccessSpecialReg(srcDestPtr, instructionData1, read); + + } else if (fpr == FP_FPSCR_ACCESS) { + if (read) { + /* + stfd f1, 0 (r4) + mffs sp + stfd f1, 0 (r3) + lfd f1, 0 (r4) + */ + instructionData1[0] = 0xD8240000; + instructionData1[1] = 0xFC20048E; + instructionData1[2] = 0xD8230000; + instructionData1[3] = 0xC8240000; + } else { + /* + stfd f1, 0 (r4) + lfd f1, 0 (r3) + mtfsf 0xff, f1 + lfd f1, 0 (r4) + */ + instructionData1[0] = 0xD8240000; + instructionData1[1] = 0xC8230000; + instructionData1[2] = 0xFDFE0D8E; + instructionData1[3] = 0xC8240000; + } + + error = TRKPPCAccessSpecialReg(srcDestPtr, instructionData1, read); + *(u64*)srcDestPtr &= 0xFFFFFFFF; + + } else if (fpr == FP_FPECR_ACCESS) { + if (!read) { + *(u32*)srcDestPtr = *((u32*)(srcDestPtr) + 1); + } + error = TRKPPCAccessSPR(srcDestPtr, 1022, read); + if (read) { + DSFetch_u64(srcDestPtr) = DSFetch_u32(srcDestPtr) & 0xffffffffLL; + } + } + + return error; +} + +#define DEBUG_VECTORREG_ACCESS 0 + +/* + * --INFO-- + * Address: 8021FDE8 + * Size: 000068 + */ +DSError TRKPPCAccessSpecialReg(void* value, u32* access_func, BOOL read) +{ + typedef void (*asm_access_type)(void*, void*); + + /* + ** Construct a small assembly function to perform the + ** requested access and call it. The read/write function + ** is in the form: + ** + ** + ** blr + */ + + /* + ** Put blr instruction at the end of access function (it should be + ** a 5-instruction array w/the last one empty). + */ + + access_func[4] = INSTR_BLR; + + /* + ** Now that the instruction array is built, get a function pointer to it. + */ + +#if DEBUG_VECTORREG_ACCESS + + __puts("\r\nasm_access: "); + __puthex8((u32)asm_access); + __puts(" access_func: "); + __puthex8((u32)access_func); + + for (i = 0; i < 10; i++) { + __puts("\r\ninst["); + __puthex2(i); + __puts("]: "); + __puthex8(access_func[i]); + __puts(" ; "); + __puthex8(*((u32*)asm_access + i)); + } + + __puts("\r\n"); + +#endif + + // Flush cache + TRK_flush_cache((void*)(u32)access_func, (sizeof(access_func) * 5)); + ((asm_access_type)access_func)((u32*)value, (void*)&TRKvalue128_temp); + + return DS_NoError; +} + +/* + * --INFO-- + * Address: 8021FE50 + * Size: 000010 + */ +void TRKTargetSetInputPendingPtr(void* ptr) +{ + gTRKState.inputPendingPtr = ptr; +} diff --git a/libs/rwsdk/plugin/collis/ctbsp.c b/libs/rwsdk/plugin/collis/ctbsp.c new file mode 100644 index 000000000..ef70eb772 --- /dev/null +++ b/libs/rwsdk/plugin/collis/ctbsp.c @@ -0,0 +1,8 @@ +// #include +// #include +// #include +// #include + +void _rpCollBSPTreeInit() +{ +} \ No newline at end of file diff --git a/libs/rwsdk/tool/slerp/rtslerp.c b/libs/rwsdk/tool/slerp/rtslerp.c new file mode 100644 index 000000000..e3502b87f --- /dev/null +++ b/libs/rwsdk/tool/slerp/rtslerp.c @@ -0,0 +1,8 @@ +//#include "StdInc.h" + +// #include + +// void RtQuatSetupSlerpCache(RtQuat* qpFrom, RtQuat* qpTo, RtQuatSlerpCache* sCache) +// { +// ((void(__cdecl*)(RtQuat*, RtQuat*, RtQuatSlerpCache*))0x7EC220)(qpFrom, qpTo, sCache); +// } diff --git a/libs/rwsdk/tool/slerp/rtslerp.h b/libs/rwsdk/tool/slerp/rtslerp.h new file mode 100644 index 000000000..d6251a3b1 --- /dev/null +++ b/libs/rwsdk/tool/slerp/rtslerp.h @@ -0,0 +1,231 @@ +/* + * Data Structures for Slerps/Spherical Linear Interpolations + * See also GemsIII/quatspin.c in + * http://www.acm.org/pubs/tog/GraphicsGems/gemsiii.zip + * Copyright (c) Criterion Software Limited + */ + +/*************************************************************************** + * * + * Module : rtslerp.h * + * * + * Purpose : Slerp functionality * + * * + **************************************************************************/ + +#ifndef RTSLERP_H +#define RTSLERP_H + +/** + * \defgroup rtslerp RtSlerp + * \ingroup mathtools + * + * Slerp/Spherical Linear Interpolations Toolkit for RenderWare. + * + * See also http://www.cis.ohio-state.edu/~parent/book/Full.html + */ + +#include "rwsdk/rwcore.h" +#include "rwsdk/rtquat.h" + +/**************************************************************************** + Includes + */ + +//#include "rtslerp.rpe" /* automatically generated header file */ + +/**************************************************************************** + Defines + */ + +/* Masks for specifying which matrices to store by reference */ +#define rtSLERPREFNONE 0x00 +#define rtSLERPREFSTARTMAT 0x01 +#define rtSLERPREFENDMAT 0x02 +#define rtSLERPREFALL (~rtSLERPREFNONE) + +/**************************************************************************** + Global Types + */ + +typedef struct RtSlerp RtSlerp; +/** + * \ingroup rtslerp + * \struct RtSlerp + * structure describing a Slerps/Spherical Linear Interpolations. + * See also GemsIII/quatspin.c in + * http://www.acm.org/pubs/tog/GraphicsGems/gemsiii.zip + */ +struct RtSlerp +{ + RwInt32 matRefMask; /**< Which matrices do we NOT own */ + RwMatrix* startMat; /**< The start matrix */ + RwMatrix* endMat; /**< The end matrix */ + RwV3d axis; /**< The axis of rotation for the slerp */ + RwReal angle; /**< The angle (in degrees) between src & dest */ + + /* Though a slerp may be a bad idea and opting for a lerp is better */ + RwBool useLerp; /**< If true, lerps are used. If false, lerps are not used. */ +}; + +/* static frame sequence animation - contains no state */ + +typedef struct RtQuatSlerpCache RtQuatSlerpCache; +/** + * \ingroup rtslerp + * \struct RtQuatSlerpCache + * structure describing a SlerpCache, + * which should be initialized with \ref RtQuatSetupSlerpCache. + */ +struct RtQuatSlerpCache +{ + RtQuat raFrom; /**< Scaled initial quaternion */ + RtQuat raTo; /**< Scaled final quaternion */ + RwReal omega; /**< Angular displacement in radians */ + RwBool nearlyZeroOm; /**< Flags near-zero angular + displacement*/ +}; + +typedef struct RtQuatSlerpArgandCache RtQuatSlerpArgandCache; +/** + * \ingroup rtslerp + * \struct RtQuatSlerpArgandCache + * a structure describing + * an Argand SlerpCache which should be + * initialized with \ref RtQuatSetupSlerpArgandCache. + * See http://www-groups.dcs.st-and.ac.uk/~history/Mathematicians/Argand.html + * Jean Argand was an accountant and amateur mathematician. + * He is famed for his geometrical interpretation of the complex numbers + * where i is interpreted as a rotation through 90. + */ +struct RtQuatSlerpArgandCache +{ + RtQuat logTo; /**< field Logarithm of final quaternion */ + RtQuat logBase; /**< Logarithm of initial relative to final quaternion */ +}; + +#define RtQuatSlerpMacro(qpResult, qpFrom, qpTo, rT, sCache) \ + MACRO_START \ + { \ + if ((rT) <= ((RwReal)0)) \ + { \ + /* t is before start */ \ + *(qpResult) = *(qpFrom); \ + } \ + else if (((RwReal)1) <= (rT)) \ + { \ + /* t is after end */ \ + *(qpResult) = *(qpTo); \ + } \ + else \ + { \ + /* ... so t must be in the interior then */ \ + /* Calc coefficients rSclFrom, rSclTo */ \ + RwReal rSclFrom = ((RwReal)1) - (rT); \ + RwReal rSclTo = (rT); \ + \ + if (!((sCache)->nearlyZeroOm)) \ + { \ + /* Standard case: slerp */ \ + /* SLERPMESSAGE(("Neither nearly ZERO nor nearly PI")); */ \ + \ + rSclFrom *= (sCache)->omega; \ + RwSinMinusPiToPiMacro(rSclFrom, rSclFrom); \ + rSclTo *= (sCache)->omega; \ + RwSinMinusPiToPiMacro(rSclTo, rSclTo); \ + } \ + \ + /* Calc final values */ \ + RwV3dScaleMacro(&(qpResult)->imag, &(sCache)->raFrom.imag, rSclFrom); \ + RwV3dIncrementScaledMacro(&(qpResult)->imag, &(sCache)->raTo.imag, rSclTo); \ + (qpResult)->real = \ + ((sCache)->raFrom.real * rSclFrom) + ((sCache)->raTo.real * rSclTo); \ + } \ + } \ + MACRO_STOP + +#define RtQuatSlerpArgandMacro(qpResult, qpFrom, qpTo, rT, sArgandCache) \ + MACRO_START \ + { \ + if ((rT) <= ((RwReal)0)) \ + { \ + /* t is before start */ \ + *(qpResult) = *(qpFrom); \ + } \ + else if (((RwReal)1) <= (rT)) \ + { \ + /* t is after end */ \ + *(qpResult) = *(qpTo); \ + } \ + else \ + { \ + RtQuat logBlend; \ + \ + /* ... so t must be in the interior then */ \ + \ + logBlend.imag.x = \ + (sArgandCache)->logBase.imag.x + (rT) * (sArgandCache)->logTo.imag.x; \ + logBlend.imag.y = \ + (sArgandCache)->logBase.imag.y + (rT) * (sArgandCache)->logTo.imag.y; \ + logBlend.imag.z = \ + (sArgandCache)->logBase.imag.z + (rT) * (sArgandCache)->logTo.imag.z; \ + logBlend.real = 0; \ + \ + RtQuatUnitExpMacro((qpResult), &logBlend); \ + } \ + } \ + MACRO_STOP + +#if (!(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))) + +#define RtQuatSlerp(qpResult, qpFrom, qpTo, rT, sCache) \ + RtQuatSlerpMacro(qpResult, qpFrom, qpTo, rT, sCache) + +#define RtQuatSlerpArgand(qpResult, qpFrom, qpTo, rT, sArgandCache) \ + RtQuatSlerpArgandMacro(qpResult, qpFrom, qpTo, rT, sArgandCache) + +#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Creating and destroying slerps */ + +extern RtSlerp* RtSlerpCreate(RwInt32 nMatRefMask); + +extern void RtSlerpDestroy(RtSlerp* spSlerp); + +/* setting up a slerp */ +extern RtSlerp* RtSlerpInitialize(RtSlerp* spSlerp, RwMatrix* mpMat1, RwMatrix* mpMat2); + +/* Get a matrix */ +extern RwMatrix* RtSlerpGetMatrix(RtSlerp* spSlerp, RwMatrix* mpResultMat, RwReal nDelta); + +/* Set if lerp or slerp */ +extern RtSlerp* RtSlerpSetLerp(RtSlerp* spSlerp, RwBool bUseLerp); + +extern void RtQuatSetupSlerpCache(RtQuat* qpFrom, RtQuat* qpTo, RtQuatSlerpCache* sCache); + +extern void RtQuatSetupSlerpArgandCache(RtQuat* qpFrom, RtQuat* qpTo, + RtQuatSlerpArgandCache* sArgandCache); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +extern void RtQuatSlerp(RtQuat* qpResult, RtQuat* qpFrom, RtQuat* qpTo, RwReal rT, + RtQuatSlerpCache* sCache); + +extern void RtQuatSlerpArgand(RtQuat* qpResult, RtQuat* qpFrom, RtQuat* qpTo, RwReal rT, + RtQuatSlerpArgandCache* sArgandCache); + +#endif /* ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* RTSLERP_H */