From a59914e5206fce9447dcb996a6804d107f298edd Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Thu, 25 Jun 2026 20:56:35 -0500 Subject: [PATCH 01/10] Nitpicks --- include/Dolphin/GX/GXData.h | 8 ++++++-- include/Interactions.h | 14 +++++++------- src/OdemuExi2/DebuggerDriver.c | 2 +- src/dvd/dvd.c | 1 - src/dvd/dvdfs.c | 4 ++-- src/gx/GXDisplayList.c | 6 +----- src/gx/GXGeometry.c | 7 +------ src/gx/GXTexture.c | 2 +- src/jaudio/pikiinter.c | 2 +- src/os/OS.c | 4 ++-- src/os/OSAlarm.c | 8 ++++---- src/plugPikiKando/pelletMgr.cpp | 2 +- src/plugPikiKando/workObject.cpp | 18 +++++++++--------- src/plugPikiOgawa/ogSub.cpp | 8 ++++++-- src/sysDolphin/system.cpp | 9 +++++---- 15 files changed, 47 insertions(+), 48 deletions(-) diff --git a/include/Dolphin/GX/GXData.h b/include/Dolphin/GX/GXData.h index 7b4c2ff4..d7ea2cf7 100644 --- a/include/Dolphin/GX/GXData.h +++ b/include/Dolphin/GX/GXData.h @@ -279,8 +279,12 @@ static inline u32 GXReadPIReg(u32 addrLo, u32 addrHi) /////////// OTHER USEFUL DEFINES /////////// // useful define to check first two GXData members together -// used in GXDisplayList, saves having a union in the struct -#define GX_CHECK_FLUSH() (!(*(u32*)(&gx->vNumNot))) +// used in GXCallDisplayList and GXBegin, saves having a union in the struct +#if OS_BUILD_VERSION >= 20011002L +#define GX_CHECK_FLUSH(gx) ((*(u32*)(&gx->_00))) /* checks both _00 and bpSent */ +#else +#define GX_CHECK_FLUSH(gx) (!(*(u32*)(&gx->vNum))) /* checks both vNum and bpSent */ +#endif // do the damn rlwimi thing #define FAST_FLAG_SET(regOrg, newFlag, shift, size) \ diff --git a/include/Interactions.h b/include/Interactions.h index 810100da..d11d9812 100644 --- a/include/Interactions.h +++ b/include/Interactions.h @@ -120,19 +120,19 @@ struct InteractBomb : public Interaction { * @brief TODO */ struct InteractBreak : public Interaction { - InteractBreak(Creature* owner, int stage, f32 p3) + InteractBreak(Creature* owner, int stage, f32 rate) : Interaction(owner) { - mStageIndex = stage; - _0C = p3; + mStageIndex = stage; + mProgressRate = rate; } virtual bool actBridge(Bridge*) immut; // _24 // _00 = VTBL // _00-_08 = Interaction - int mStageIndex; // _08 - f32 _0C; // _0C + int mStageIndex; // _08 + f32 mProgressRate; // _0C }; /** @@ -160,7 +160,7 @@ struct InteractBuild : public Interaction { InteractBuild(Creature* owner, int stage, f32 rate) : Interaction(owner) { - mCurrentStage = stage; + mStageIndex = stage; mProgressRate = rate; } @@ -169,7 +169,7 @@ struct InteractBuild : public Interaction { // _00 = VTBL // _00-_08 = Interaction - int mCurrentStage; // _0C + int mStageIndex; // _0C f32 mProgressRate; // _10 }; diff --git a/src/OdemuExi2/DebuggerDriver.c b/src/OdemuExi2/DebuggerDriver.c index 15388d90..49e9a990 100644 --- a/src/OdemuExi2/DebuggerDriver.c +++ b/src/OdemuExi2/DebuggerDriver.c @@ -333,7 +333,7 @@ int DBQueryData(void) BOOL interrupts; EXIInputFlag = 0; - if (!RecvDataLeng) { + if (RecvDataLeng == 0) { interrupts = OSDisableInterrupts(); CheckMailBox(); } diff --git a/src/dvd/dvd.c b/src/dvd/dvd.c index 55538ecf..804c9878 100644 --- a/src/dvd/dvd.c +++ b/src/dvd/dvd.c @@ -6,7 +6,6 @@ #include // forward declarations for local functions, as needed: -static void AlarmHandler(OSAlarm* alarm, OSContext* context); static void cbForCancelSync(s32 result, DVDCommandBlock* block); static void cbForStateBusy(u32 p1); static void cbForStateCheckID1(u32 p1); diff --git a/src/dvd/dvdfs.c b/src/dvd/dvdfs.c index d5ad8d12..b6c0f4ea 100644 --- a/src/dvd/dvdfs.c +++ b/src/dvd/dvdfs.c @@ -17,7 +17,7 @@ static char* FstStringStart; static u32 MaxEntryNum; static u32 currentDirectory = 0; OSThreadQueue __DVDThreadQueue; -u32 __DVDLongFileNameFlag = 0; +u32 __DVDLongFileNameFlag = FALSE; static void cbForReadAsync(s32 result, DVDCommandBlock* block); static void cbForReadSync(s32 result, DVDCommandBlock* block); @@ -109,7 +109,7 @@ s32 DVDConvertPathToEntrynum(const char* pathPtr) } } - if (__DVDLongFileNameFlag == 0) { + if (!__DVDLongFileNameFlag) { extention = FALSE; illegal = FALSE; diff --git a/src/gx/GXDisplayList.c b/src/gx/GXDisplayList.c index c88d4b54..e9a55a47 100644 --- a/src/gx/GXDisplayList.c +++ b/src/gx/GXDisplayList.c @@ -88,11 +88,7 @@ void GXCallDisplayList(void* list, u32 nbytes) __GXShadowDispList(list, nbytes); #endif -#if OS_BUILD_VERSION >= 20011002L - if (*(u32*)&gx->_00 == 0) { -#else - if (*(u32*)&gx->vNum != 0) { // checks both vNum and bpSent -#endif + if (!GX_CHECK_FLUSH(gx)) { __GXSendFlushPrim(); } GX_WRITE_U8(0x40); diff --git a/src/gx/GXGeometry.c b/src/gx/GXGeometry.c index c42a3614..58601f10 100644 --- a/src/gx/GXGeometry.c +++ b/src/gx/GXGeometry.c @@ -41,12 +41,7 @@ void GXBegin(GXPrimitive type, GXVtxFmt vtxfmt, u16 nverts) } __GXinBegin = TRUE; #endif -#if OS_BUILD_VERSION >= 20011002L - if (*(u32*)&gx->_00 == 0) // checks both _00 and bpSent -#else - if (*(u32*)&gx->vNum != 0) // checks both vNum and bpSent -#endif - { + if (!GX_CHECK_FLUSH(gx)) { __GXSendFlushPrim(); } GX_WRITE_U8(vtxfmt | type); diff --git a/src/gx/GXTexture.c b/src/gx/GXTexture.c index 757ccf34..ef52ea71 100644 --- a/src/gx/GXTexture.c +++ b/src/gx/GXTexture.c @@ -1167,7 +1167,7 @@ void GXPreLoadEntireTexture(GXTexObj* tex_obj, GXTexRegion* region) } totalEven += count; } - __GetImageTileCount(t->fmt, wd >> (i + 1), ht >> (i + 1), &rowTiles, &colTiles, &cmpTiles); + __GetImageTileCount(t->format, wd >> (i + 1), ht >> (i + 1), &rowTiles, &colTiles, &cmpTiles); count = rowTiles * colTiles; } #endif diff --git a/src/jaudio/pikiinter.c b/src/jaudio/pikiinter.c index 494427dd..c920d3d2 100644 --- a/src/jaudio/pikiinter.c +++ b/src/jaudio/pikiinter.c @@ -35,7 +35,7 @@ typedef struct SEvent_ { f32 volume; // _160 f32 pan; // _164 #if defined(VERSION_GPIJ01_01) || defined(VERSION_G98P01_PIKIDEMO) || defined(VERSION_DPIJ01_PIKIDEMO) - u8 _168[0x170 - 0x16C]; // _168, unknown + u8 _168[0x16C - 0x168]; // _168, unknown #else u8 _168[0x170 - 0x168]; // _168, unknown #endif diff --git a/src/os/OS.c b/src/os/OS.c index bef6d0a8..b08976f3 100644 --- a/src/os/OS.c +++ b/src/os/OS.c @@ -174,7 +174,7 @@ void OSInit(void) BI2DebugFlag = 0; // debug flag from the DVD BI2 header BootInfo = (OSBootInfo*)OS_BASE_CACHED; // set pointer to BootInfo - __DVDLongFileNameFlag = (u32)0; // flag to tell us whether we make it through the debug loading + __DVDLongFileNameFlag = FALSE; // time to grab a bunch of debug info from the DVD // the address for where the BI2 debug info is, is stored at OS_BI2_DEBUG_ADDRESS @@ -193,7 +193,7 @@ void OSInit(void) __PADSpec = (u32) * ((u8*)OS_DEBUG_ADDRESS_2); // pad spec is whatever's at 0x800030E9 } - __DVDLongFileNameFlag = 1; + __DVDLongFileNameFlag = TRUE; #else if (DebugInfo != NULL) { BI2DebugFlag = &DebugInfo->debugFlag; // debug flag from DVD BI2 diff --git a/src/os/OSAlarm.c b/src/os/OSAlarm.c index 39a0df85..c2f41b11 100644 --- a/src/os/OSAlarm.c +++ b/src/os/OSAlarm.c @@ -1,5 +1,6 @@ #include "Dolphin/PPCArch.h" #include "Dolphin/os.h" +#include #include // forward declarations @@ -32,12 +33,11 @@ static void SetTimer(OSAlarm* alarm) if (delta < 0) { PPCMtdec(0); - } else if (delta < 0x80000000) { - PPCMtdec((u32)delta); + } else if (delta < (OSTime)INT_MAX + 1) { + PPCMtdec(delta); } else { - PPCMtdec(0x7fffffff); + PPCMtdec(INT_MAX); } - // UNUSED FUNCTION } /** diff --git a/src/plugPikiKando/pelletMgr.cpp b/src/plugPikiKando/pelletMgr.cpp index ac3ec1ab..11eaaf18 100644 --- a/src/plugPikiKando/pelletMgr.cpp +++ b/src/plugPikiKando/pelletMgr.cpp @@ -1326,7 +1326,7 @@ void Pellet::doRender(Graphics& gfx, Matrix4f& mtx) if (mStuckMouthPart) { Matrix4f jointMtx = mStuckMouthPart->getJointMatrix(); Matrix4f transformMtx; - f32 scale = 1.0f / reinterpret_cast(&jointMtx)->length(); + f32 scale = 1.0f / reinterpret_cast(jointMtx).length(); transformMtx.makeSRT(Vector3f(scale, scale, scale), Vector3f(0.0f, 0.0f, 0.0f), Vector3f(0.0f, 0.0f, 0.0f)); mSRT.t = mStuckMouthPart->mCentre; jointMtx.multiplyTo(transformMtx, mtx); diff --git a/src/plugPikiKando/workObject.cpp b/src/plugPikiKando/workObject.cpp index a1b68db6..dbfcd2f8 100644 --- a/src/plugPikiKando/workObject.cpp +++ b/src/plugPikiKando/workObject.cpp @@ -1473,14 +1473,14 @@ void Bridge::startStageFinished(int stageIndex, bool isFinished) */ bool InteractBuild::actBridge(Bridge* bridge) immut { - f32& buildProgress = bridge->mStageProgressList[mCurrentStage]; + f32& stageProgress = bridge->mStageProgressList[mStageIndex]; bridge->playEventSound(bridge, SEB_CONSTRUCTION); - buildProgress += mProgressRate; - if (buildProgress >= bridge->mMaxHealth) { - buildProgress = bridge->mMaxHealth; + stageProgress += mProgressRate; + if (stageProgress >= bridge->mMaxHealth) { + stageProgress = bridge->mMaxHealth; if (!bridge->_3CC) { - bridge->startStageFinished(mCurrentStage, true); + bridge->startStageFinished(mStageIndex, true); } } @@ -1492,10 +1492,10 @@ bool InteractBuild::actBridge(Bridge* bridge) immut */ bool InteractBreak::actBridge(Bridge* bridge) immut { - f32* progress = &bridge->mStageProgressList[mStageIndex]; - *progress -= _0C; - if (*progress <= 0.0f) { - *progress = 0.0f; + f32& stageProgress = bridge->mStageProgressList[mStageIndex]; + stageProgress -= mProgressRate; + if (stageProgress <= 0.0f) { + stageProgress = 0.0f; for (int i = mStageIndex; i < bridge->getStage(); i++) { bridge->setStageFinished(i, false); bridge->mStageProgressList[i] = 0.0f; diff --git a/src/plugPikiOgawa/ogSub.cpp b/src/plugPikiOgawa/ogSub.cpp index 1142c89c..2ce113f3 100644 --- a/src/plugPikiOgawa/ogSub.cpp +++ b/src/plugPikiOgawa/ogSub.cpp @@ -952,10 +952,14 @@ void TypingTextMgr::update() mTypeTimer += gsys->getFrameTime(); #if defined(VERSION_PIKIDEMO) || defined(VERSION_GPIJ01) - if (mTypeTimer >= 0.04f) { + if (mTypeTimer >= 0.04f) +#else + if (mTypeTimer >= 0.029639998f) +#endif + { +#if defined(VERSION_PIKIDEMO) || defined(VERSION_GPIJ01) mTypeTimer -= 0.04f; #else - if (mTypeTimer >= 0.029639998f) { mTypeTimer -= 0.029639998f; #endif f32 a; diff --git a/src/sysDolphin/system.cpp b/src/sysDolphin/system.cpp index eefcf126..2dcc2490 100644 --- a/src/sysDolphin/system.cpp +++ b/src/sysDolphin/system.cpp @@ -94,7 +94,7 @@ static OSMessageQueue dvdMesgQueue; static OSMessageQueue loadMesgQueue; static OSMessageQueue sysMesgQueue; -u8* DVDStream::readBuffer = 0; +u8* DVDStream::readBuffer = nullptr; int DVDStream::numOpen = 0; static Font* bigFont; @@ -148,7 +148,7 @@ RandomAccessStream* System::openFile(immut char* path, bool isRelativePath, bool } #if defined(VERSION_GPIJ01) || defined(VERSION_DPIJ01_PIKIDEMO) - if (DVDStream::numOpen) { + if (DVDStream::numOpen != 0) { ERROR("Cannot open '%s' while '%s' is open!!\n", path, lastName); } #endif @@ -1369,10 +1369,11 @@ void* dvdFunc(void*) } } else { #if defined(VERSION_G98P01_PIKIDEMO) || defined(VERSION_DPIJ01_PIKIDEMO) - if (!OSGetResetButtonState() && !gsys->mIsRendering && !gsys->mIsCardSaving) { + if (!OSGetResetButtonState() && !gsys->mIsRendering && !gsys->mIsCardSaving) #else - if (!OSGetResetSwitchState() && !gsys->mIsRendering && !gsys->mIsCardSaving) { + if (!OSGetResetSwitchState() && !gsys->mIsRendering && !gsys->mIsCardSaving) #endif + { PADRecalibrate(0xf0000000); Jac_Freeze(); #if defined(VERSION_GPIJ01) || defined(VERSION_DPIJ01_PIKIDEMO) From 23f366b8a093b28f11d795cec79120288cacec64 Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Thu, 25 Jun 2026 20:56:19 -0500 Subject: [PATCH 02/10] Bugfixes --- include/zen/DrawContainer.h | 2 +- src/OdemuExi2/DebuggerDriver.c | 1 + src/jaudio/jammain_2.c | 7 +++++++ src/plugPikiColin/moviePlayer.cpp | 1 + src/plugPikiColin/newPikiGame.cpp | 3 ++- src/plugPikiKando/gameCoreSection.cpp | 4 ++-- src/plugPikiKando/generatorCache.cpp | 4 ++-- src/plugPikiKando/kusaItem.cpp | 4 ++-- src/plugPikiKando/piki.cpp | 8 ++++---- src/plugPikiNishimura/KingAi.cpp | 4 +++- src/plugPikiOgawa/ogDiary.cpp | 2 +- src/plugPikiYamashita/TAIdororo.cpp | 4 ++-- 12 files changed, 28 insertions(+), 16 deletions(-) diff --git a/include/zen/DrawContainer.h b/include/zen/DrawContainer.h index 51bd4a72..ab2a433d 100644 --- a/include/zen/DrawContainer.h +++ b/include/zen/DrawContainer.h @@ -317,7 +317,7 @@ struct StickCallBack : public P2DPaneCallBack { : P2DPaneCallBack(pane, PANETYPE_Picture) { mContainerScreen = container; - char buf[8]; + char buf[TERNARY_BUGFIX(13, 8)]; // DON'T LOOK AT MY STACK MANIPULATION CRIMES PLEASE. // CRIMES START diff --git a/src/OdemuExi2/DebuggerDriver.c b/src/OdemuExi2/DebuggerDriver.c index 49e9a990..9e3369be 100644 --- a/src/OdemuExi2/DebuggerDriver.c +++ b/src/OdemuExi2/DebuggerDriver.c @@ -337,6 +337,7 @@ int DBQueryData(void) interrupts = OSDisableInterrupts(); CheckMailBox(); } + // This is surely a bug... OSRestoreInterrupts(interrupts); return RecvDataLeng; } diff --git a/src/jaudio/jammain_2.c b/src/jaudio/jammain_2.c index 8548e05e..8cdd8bcd 100644 --- a/src/jaudio/jammain_2.c +++ b/src/jaudio/jammain_2.c @@ -2810,6 +2810,13 @@ u32 RegCmd_Process(seqp_* track, BOOL isFromRegister, u32 param_3) u16 uVar5; u16 uVar6; // Uninitialized! Naughty! + // From a cursory glance at the value held in r30 (representing `uVar6`) whenever this + // function is run, it MIRACULOUSLY manages to always be zero-initialized by dumb luck. + // Conditional breakpoint used for testing Pikmin 1 USA rev 1: $80012e00 nbc r30 != 0 +#if defined(BUGFIX) + uVar6 = 0; +#endif + cmd = __ByteRead(track); if (isFromRegister == TRUE) { cmd = __ExchangeRegisterValue(track, cmd); diff --git a/src/plugPikiColin/moviePlayer.cpp b/src/plugPikiColin/moviePlayer.cpp index 4b5268f2..fb6e8247 100644 --- a/src/plugPikiColin/moviePlayer.cpp +++ b/src/plugPikiColin/moviePlayer.cpp @@ -229,6 +229,7 @@ void MoviePlayer::initMovie(MovieInfo* info, int) mIsGameCam = false; } + // This has got to be a bug, right? TODO: Test what side-effects this has. if (heapid != SYSHEAP_App) { gsys->getHeap(SYSHEAP_Movie)->setAllocType(type); gsys->setHeap(heapid); diff --git a/src/plugPikiColin/newPikiGame.cpp b/src/plugPikiColin/newPikiGame.cpp index fe4f38ec..0832d146 100644 --- a/src/plugPikiColin/newPikiGame.cpp +++ b/src/plugPikiColin/newPikiGame.cpp @@ -1604,7 +1604,8 @@ ModeState* DayOverModeState::initialisePhaseTwo() } else { // challenge mode - start the challenge mode results window GameChalQuickInfo info; - PRINT("starting challenge mode window %d : %d!\n", GameStat::formationPikis, GameStat::containerPikis); + PRINT("starting challenge mode window %d : %d!\n", static_cast(GameStat::formationPikis), + static_cast(GameStat::containerPikis)); info.mStageID = flowCont.mCurrentStage->mChalStageID; info.mScore = GameStat::allPikis; // check if we got a new hiscore for this course, and update the info if so diff --git a/src/plugPikiKando/gameCoreSection.cpp b/src/plugPikiKando/gameCoreSection.cpp index a7727447..9f3c48f1 100644 --- a/src/plugPikiKando/gameCoreSection.cpp +++ b/src/plugPikiKando/gameCoreSection.cpp @@ -1476,8 +1476,8 @@ void GameCoreSection::update() int id = navi->getCurrState()->getID(); if (id != NAVISTATE_PikiZero && id != NAVISTATE_DemoSunset && id != NAVISTATE_DemoWait && id != NAVISTATE_DemoInf) { PRINT("**** PIKI ZERO GAME OVER *******\n"); - PRINT("deadpikis %d pellets %d killtekis %d maxpikis %d" MISSING_NEWLINE, GameStat::deadPikis, GameStat::getPellets, - GameStat::killTekis, GameStat::maxPikis); + PRINT("deadpikis %d pellets %d killtekis %d maxpikis %d" MISSING_NEWLINE, static_cast(GameStat::deadPikis), + static_cast(GameStat::getPellets), static_cast(GameStat::killTekis), GameStat::maxPikis); navi->mStateMachine->transit(navi, NAVISTATE_PikiZero); playerState->mResultFlags.setOn(zen::RESFLAG_PikminExtinction); } diff --git a/src/plugPikiKando/generatorCache.cpp b/src/plugPikiKando/generatorCache.cpp index 07885a86..25b2acef 100644 --- a/src/plugPikiKando/generatorCache.cpp +++ b/src/plugPikiKando/generatorCache.cpp @@ -103,8 +103,8 @@ void GeneratorCache::saveCard(RandomAccessStream& output) output.writeByte(mCacheHeap[i]); } - int aliveCount; - int deadCount; + int aliveCount = 0; + int deadCount = 0; for (i = STAGE_START; i < STAGE_COUNT; i++) { Cache* cache = findCache(mAliveCacheList, i); if (cache) { diff --git a/src/plugPikiKando/kusaItem.cpp b/src/plugPikiKando/kusaItem.cpp index 9162abb4..9a682a2c 100644 --- a/src/plugPikiKando/kusaItem.cpp +++ b/src/plugPikiKando/kusaItem.cpp @@ -25,7 +25,7 @@ DEFINE_PRINT("kusa") * @todo: Documentation */ KusaItem::KusaItem(CreatureProp* props, Shape* shape) - : ItemCreature(OBJTYPE_Kusa, mProps, shape) + : ItemCreature(OBJTYPE_Kusa, TERNARY_BUGFIX(props, mProps), shape) , mKusaCollision(0) { mProps = props; @@ -137,7 +137,7 @@ void KusaItem::refresh(Graphics& gfx) * @todo: Documentation */ BoBaseItem::BoBaseItem(CreatureProp* props, Shape* shape) - : ItemCreature(OBJTYPE_BoBase, mProps, shape) + : ItemCreature(OBJTYPE_BoBase, TERNARY_BUGFIX(props, mProps), shape) , mBaseCollision(0) { mProps = props; diff --git a/src/plugPikiKando/piki.cpp b/src/plugPikiKando/piki.cpp index 2c5a1425..c6c45e52 100644 --- a/src/plugPikiKando/piki.cpp +++ b/src/plugPikiKando/piki.cpp @@ -2917,8 +2917,8 @@ void Piki::dump() PRINT(" onground = %s\n", isCreatureFlag(CF_IsOnGround) ? "true" : "false"); PRINT(" vel(%.1f,%.1f) velocity(%.1f,%.1f)\n", mVelocity.x, mVelocity.z, mTargetVelocity.x, mTargetVelocity.z); PRINT(" inDamage = %s\n", mIsBeingDamaged ? "true" : "false"); - PRINT(" flags = %x : isVisible=%s isAlive=%s isAtari=%s\n", isVisible() ? "true" : "false", isAlive() ? "true" : "false", - isAtari() ? "true" : "false"); + PRINT(" flags = %x : isVisible=%s isAlive=%s isAtari=%s\n", mCreatureFlags, isVisible() ? "true" : "false", + isAlive() ? "true" : "false", isAtari() ? "true" : "false"); PRINT(" kinoko = %s\n", isKinoko() ? "yes" : "no"); PRINT(" emotion = %d\n", mEmotion); static_cast(getCurrState())->dump(); @@ -2973,8 +2973,8 @@ void Piki::dump() PRINT(" onground = %s\n", isCreatureFlag(CF_IsOnGround) ? "true" : "false"); PRINT(" vel(%.1f,%.1f) velocity(%.1f,%.1f)\n", mVelocity.x, mVelocity.z, mTargetVelocity.x, mTargetVelocity.z); PRINT(" inDamage = %s\n", mIsBeingDamaged ? "true" : "false"); - PRINT(" flags = %x : isVisible=%s isAlive=%s isAtari=%s\n", isVisible() ? "true" : "false", isAlive() ? "true" : "false", - isAtari() ? "true" : "false"); + PRINT(" flags = %x : isVisible=%s isAlive=%s isAtari=%s\n", mCreatureFlags, isVisible() ? "true" : "false", + isAlive() ? "true" : "false", isAtari() ? "true" : "false"); PRINT(" emotion = %d\n", mEmotion); static_cast(getCurrState())->dump(); PRINT(" _stickObject=%x(%d) : _stickToObject=%s\n", getStickObject(), getStickObject() ? getStickObject()->mObjType : -1, diff --git a/src/plugPikiNishimura/KingAi.cpp b/src/plugPikiNishimura/KingAi.cpp index 23215705..2e59c301 100644 --- a/src/plugPikiNishimura/KingAi.cpp +++ b/src/plugPikiNishimura/KingAi.cpp @@ -924,7 +924,9 @@ bool KingAi::chasePikiTransit() f32 qdist = qdist2(mKing->mSRT.t.x, mKing->mSRT.t.z, piki->mSRT.t.x, piki->mSRT.t.z); if (qdist < C_BOSS_PROP(mKing).mSearchRadius() && // typo?? this should be qdist, not dist - they definitely copied and pasted this code lol. - dist < minDist && mKing->inSearchAngle(piki)) { + // It seems like the uninitialized `dist` variable always holds the value 0.0f by dumb luck. + // Conditional breakpoint used to test USA rev 1: $8016e860 nbc f30 != 0.0 && f29 == 12800.0 + TERNARY_BUGFIX(qdist, dist) < minDist && mKing->inSearchAngle(piki)) { dist = mKing->mSRT.t.distance(piki->mSRT.t); if (dist > C_KING_PROP(mKing).mHiddenUnderneathRadius() && dist < C_BOSS_PROP(mKing).mSearchRadius() && dist < minDist) { minDist = dist; diff --git a/src/plugPikiOgawa/ogDiary.cpp b/src/plugPikiOgawa/ogDiary.cpp index eaf202d9..a37e6dbc 100644 --- a/src/plugPikiOgawa/ogDiary.cpp +++ b/src/plugPikiOgawa/ogDiary.cpp @@ -404,7 +404,7 @@ zen::ogDrawSelectDiary::ogDrawSelectDiary() mCurrentDay = 0; for (int i = 0; i < MAX_DAYS; i++) { - char name[4]; + char name[TERNARY_BUGFIX(5, 4)]; sprintf(name, "i%02du", i); mDayIconUpPanes[i] = mScreen->search(P2DPaneLibrary::makeTag(name), true); mDayIconUpPanes[i]->hide(); diff --git a/src/plugPikiYamashita/TAIdororo.cpp b/src/plugPikiYamashita/TAIdororo.cpp index 5518d454..53ca56f2 100644 --- a/src/plugPikiYamashita/TAIdororo.cpp +++ b/src/plugPikiYamashita/TAIdororo.cpp @@ -946,8 +946,8 @@ void TAIdororoStrategy::start(Teki& teki) mRightHand = getCollPartPtr(teki, 'rhnd'); if (!mLeftHand || !mRightHand) { - PRINT("ERROR! No hand collPart.L:%08x R:&08x\n", mLeftHand, mRightHand); - ERROR("ERROR! No hand collPart.L:%08x R:&08x\n", mLeftHand, mRightHand); + PRINT("ERROR! No hand collPart.L:%08x R:" TERNARY_BUGFIX("%08x", "&08x") "\n", mLeftHand, mRightHand); + ERROR("ERROR! No hand collPart.L:%08x R:" TERNARY_BUGFIX("%08x", "&08x") "\n", mLeftHand, mRightHand); } } From 441bba03d33874755e5fa94a58bf73ae16359d9e Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:23:05 -0500 Subject: [PATCH 03/10] Use PPCArch.h macros for mfspr/mtspr --- include/Dolphin/OS/OSException.h | 14 +++++++------- include/Dolphin/OS/OSFastCast.h | 8 ++++---- src/base/PPCArch.c | 10 +++++----- src/gx/GXInit.c | 2 +- src/os/OS.c | 2 +- src/os/OSCache.c | 12 ++++++------ src/os/OSContext.c | 28 ++++++++++++++-------------- src/os/OSReset.c | 4 ++-- src/os/OSSync.c | 6 +++--- 9 files changed, 43 insertions(+), 43 deletions(-) diff --git a/include/Dolphin/OS/OSException.h b/include/Dolphin/OS/OSException.h index 979656bd..bcf92593 100644 --- a/include/Dolphin/OS/OSException.h +++ b/include/Dolphin/OS/OSException.h @@ -49,19 +49,19 @@ __OSExceptionHandler __OSGetExceptionHandler(__OSException exception); stw r2, context->gpr[2]; \ stmw r6, context->gpr[6]; \ /* Save GQR1 to GQR7. GQR0 must always be zero */ \ - mfspr r0, GQR1; \ + mfspr r0, SPR_GQR1; \ stw r0, context->gqr[1]; \ - mfspr r0, GQR2; \ + mfspr r0, SPR_GQR2; \ stw r0, context->gqr[2]; \ - mfspr r0, GQR3; \ + mfspr r0, SPR_GQR3; \ stw r0, context->gqr[3]; \ - mfspr r0, GQR4; \ + mfspr r0, SPR_GQR4; \ stw r0, context->gqr[4]; \ - mfspr r0, GQR5; \ + mfspr r0, SPR_GQR5; \ stw r0, context->gqr[5]; \ - mfspr r0, GQR6; \ + mfspr r0, SPR_GQR6; \ stw r0, context->gqr[6]; \ - mfspr r0, GQR7; \ + mfspr r0, SPR_GQR7; \ stw r0, context->gqr[7]; ////////////////////////////////// diff --git a/include/Dolphin/OS/OSFastCast.h b/include/Dolphin/OS/OSFastCast.h index 772ea331..f34c2944 100644 --- a/include/Dolphin/OS/OSFastCast.h +++ b/include/Dolphin/OS/OSFastCast.h @@ -35,16 +35,16 @@ static inline void OSInitFastCast(void) asm { li r3, OS_GQR_U8 oris r3, r3, OS_GQR_U8 - mtspr GQR2, r3 + mtspr SPR_GQR2, r3 li r3, OS_GQR_U16 oris r3, r3, OS_GQR_U16 - mtspr GQR3, r3 + mtspr SPR_GQR3, r3 li r3, OS_GQR_S8 oris r3, r3, OS_GQR_S8 - mtspr GQR4, r3 + mtspr SPR_GQR4, r3 li r3, OS_GQR_S16 oris r3, r3, OS_GQR_S16 - mtspr GQR5, r3 + mtspr SPR_GQR5, r3 } #endif } diff --git a/src/base/PPCArch.c b/src/base/PPCArch.c index 2ef5e94c..78b1cbb3 100644 --- a/src/base/PPCArch.c +++ b/src/base/PPCArch.c @@ -130,15 +130,15 @@ void PPCEieio(void) mfmsr r5 rlwinm r6, r5, 0, 17, 15 // ~MSR_EE mtmsr r6 - mfspr r3, HID0 - ori r4, r3, 8 - mtspr HID0, r4 + mfspr r3, SPR_HID0 + ori r4, r3, HID0_ABE + mtspr SPR_HID0, r4 isync eieio isync - mtspr SPR_HID0, r3 - mtmsr r5 + mtspr SPR_HID0, r3 + mtmsr r5 isync } #endif diff --git a/src/gx/GXInit.c b/src/gx/GXInit.c index b49b48e7..ea24bc36 100644 --- a/src/gx/GXInit.c +++ b/src/gx/GXInit.c @@ -20,7 +20,7 @@ GXBool __GXinBegin; static ASM BOOL IsWriteGatherBufferEmpty(void) { #ifdef __MWERKS__ // clang-format off sync - mfspr r3, WPAR + mfspr r3, SPR_WPAR andi. r3, r3, 1 #endif // clang-format on } diff --git a/src/os/OS.c b/src/os/OS.c index b08976f3..bbc8fc1b 100644 --- a/src/os/OS.c +++ b/src/os/OS.c @@ -594,7 +594,7 @@ void __OSPSInit(void) #ifdef __MWERKS__ asm { li r3, 0 - mtspr GQR0, r3 + mtspr SPR_GQR0, r3 } #endif } diff --git a/src/os/OSCache.c b/src/os/OSCache.c index 80f4fec0..401a3dac 100644 --- a/src/os/OSCache.c +++ b/src/os/OSCache.c @@ -21,9 +21,9 @@ ASM void DCEnable(void) sync - mfspr r3, HID0 + mfspr r3, SPR_HID0 ori r3, r3, HID0_DCE - mtspr HID0, r3 + mtspr SPR_HID0, r3 blr #endif // clang-format on @@ -297,9 +297,9 @@ ASM void ICFlashInvalidate(void) { #ifdef __MWERKS__ // clang-format off nofralloc - mfspr r3, HID0 + mfspr r3, SPR_HID0 ori r3, r3, HID0_ICFI - mtspr HID0, r3 + mtspr SPR_HID0, r3 blr #endif // clang-format on @@ -315,9 +315,9 @@ ASM void ICEnable(void) isync - mfspr r3, HID0 + mfspr r3, SPR_HID0 ori r3, r3, HID0_ICE - mtspr HID0, r3 + mtspr SPR_HID0, r3 blr #endif // clang-format on diff --git a/src/os/OSContext.c b/src/os/OSContext.c index a0a5eeb6..2cd05b4b 100644 --- a/src/os/OSContext.c +++ b/src/os/OSContext.c @@ -267,19 +267,19 @@ ASM u32 OSSaveContext(register OSContext* context) { #ifdef __MWERKS__ // clang-format off nofralloc stmw r13, context->gpr[13] - mfspr r0, GQR1 + mfspr r0, SPR_GQR1 stw r0, context->gqr[1] - mfspr r0, GQR2 + mfspr r0, SPR_GQR2 stw r0, context->gqr[2] - mfspr r0, GQR3 + mfspr r0, SPR_GQR3 stw r0, context->gqr[3] - mfspr r0, GQR4 + mfspr r0, SPR_GQR4 stw r0, context->gqr[4] - mfspr r0, GQR5 + mfspr r0, SPR_GQR5 stw r0, context->gqr[5] - mfspr r0, GQR6 + mfspr r0, SPR_GQR6 stw r0, context->gqr[6] - mfspr r0, GQR7 + mfspr r0, SPR_GQR7 stw r0, context->gqr[7] mfcr r0 stw r0, context->cr @@ -338,19 +338,19 @@ ASM void OSLoadContext(register OSContext* context) misc: lwz r4, context->gqr[1] - mtspr GQR1, r4 + mtspr SPR_GQR1, r4 lwz r4, context->gqr[2] - mtspr GQR2, r4 + mtspr SPR_GQR2, r4 lwz r4, context->gqr[3] - mtspr GQR3, r4 + mtspr SPR_GQR3, r4 lwz r4, context->gqr[4] - mtspr GQR4, r4 + mtspr SPR_GQR4, r4 lwz r4, context->gqr[5] - mtspr GQR5, r4 + mtspr SPR_GQR5, r4 lwz r4, context->gqr[6] - mtspr GQR6, r4 + mtspr SPR_GQR6, r4 lwz r4, context->gqr[7] - mtspr GQR7, r4 + mtspr SPR_GQR7, r4 lwz r4, context->cr mtcr r4 diff --git a/src/os/OSReset.c b/src/os/OSReset.c index 1b69ff6f..d5deb708 100644 --- a/src/os/OSReset.c +++ b/src/os/OSReset.c @@ -82,9 +82,9 @@ static void ASM Reset(register s32 resetCode) b _jump1 _begin: - mfspr r8, HID0 + mfspr r8, SPR_HID0 ori r8, r8, HID0_ABE - mtspr HID0, r8 + mtspr SPR_HID0, r8 isync sync nop diff --git a/src/os/OSSync.c b/src/os/OSSync.c index fcc9e42d..f4b59af2 100644 --- a/src/os/OSSync.c +++ b/src/os/OSSync.c @@ -16,12 +16,12 @@ static ASM void SystemCallVector(void) nofralloc entry __OSSystemCallVectorStart - mfspr r9, HID0 + mfspr r9, SPR_HID0 ori r10, r9, HID0_ABE - mtspr HID0, r10 + mtspr SPR_HID0, r10 isync sync - mtspr HID0, r9 + mtspr SPR_HID0, r9 rfi entry __OSSystemCallVectorEnd From 8efd413ea5b97f6f89c80fac7eff2ace167021b7 Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:15:01 -0500 Subject: [PATCH 04/10] Document hw_regs magic numbers Thank you Dolphin Emulator --- include/Dolphin/GX/GXData.h | 53 ++++------- include/Dolphin/hw_regs.h | 143 +++++++++++++++++++++++++--- src/amcExi2/AmcExi.c | 4 +- src/amcExi2/AmcExi2Comm.c | 4 +- src/dvd/dvd.c | 4 +- src/dvd/dvdlow.c | 148 ++++++++++++++--------------- src/gx/GXFifo.c | 163 ++++++++++++++++---------------- src/gx/GXFrameBuf.c | 9 +- src/gx/GXInit.c | 12 +-- src/gx/GXMisc.c | 49 +++++----- src/gx/GXPerf.c | 179 ++++++++++++++++++------------------ src/hio/hio.c | 2 +- src/os/OSInterrupt.c | 24 ++--- src/os/OSMemory.c | 2 +- src/os/OSResetSW.c | 6 +- 15 files changed, 459 insertions(+), 343 deletions(-) diff --git a/include/Dolphin/GX/GXData.h b/include/Dolphin/GX/GXData.h index d7ea2cf7..673c5bba 100644 --- a/include/Dolphin/GX/GXData.h +++ b/include/Dolphin/GX/GXData.h @@ -132,27 +132,14 @@ extern struct __GXData_struct* gx; //////////////////////////////////////////// ///////////// REGISTER DEFINES ///////////// -// Declare registers. -extern u16* __cpReg; -extern u32* __piReg; -extern u16* __memReg; -extern u16* __peReg; - -// Define register addresses. -#define GX_CP_ADDR (0x0C000000) -#define GX_PE_ADDR (0x0C001000) -#define GX_PI_ADDR (0x0C003000) -#define GX_MEM_ADDR (0x0C004000) - -#define GX_GET_MEM_REG(offset) (*(vu16*)((vu16*)(__memReg) + (offset))) -#define GX_GET_CP_REG(offset) (*(vu16*)((vu16*)(__cpReg) + (offset))) -#define GX_GET_PE_REG(offset) (*(vu16*)((vu16*)(__peReg) + (offset))) -#define GX_GET_PI_REG(offset) (*(vu32*)((vu32*)(__piReg) + (offset))) - -#define GX_SET_MEM_REG(offset, val) (*(vu16*)((vu16*)(__memReg) + (offset)) = val) -#define GX_SET_CP_REG(offset, val) (*(vu16*)((vu16*)(__cpReg) + (offset)) = val) -#define GX_SET_PE_REG(offset, val) (*(vu16*)((vu16*)(__peReg) + (offset)) = val) -#define GX_SET_PI_REG(offset, val) (*(vu32*)((vu32*)(__piReg) + (offset)) = val) + +// In GX, these hardware registers are commonly accessed through these variables rather than what is defined in "hw_regs.h". +// NOTE: DWARF info lists all of these as "void *", but these types make more sense. +extern vu16* __cpReg; +extern vu32* __piReg; +extern vu16* __memReg; +extern vu16* __peReg; + #define VERIF_RAS_REG(value) (__gxVerif->rasRegs[((value) & 0xFF000000) >> 24] = value) #define GX_WRITE_RAS_REG(value) \ @@ -226,11 +213,11 @@ extern u16* __peReg; static inline u32 GXReadMEMReg(u32 addrLo, u32 addrHi) { u32 hiStart, hiNew, lo; - hiStart = GX_GET_MEM_REG(addrHi); + hiStart = __memReg[addrHi]; do { hiNew = hiStart; - lo = GX_GET_MEM_REG(addrLo); - hiStart = GX_GET_MEM_REG(addrHi); + lo = __memReg[addrLo]; + hiStart = __memReg[addrHi]; } while (hiStart != hiNew); return ((hiStart << 16) | lo); @@ -239,11 +226,11 @@ static inline u32 GXReadMEMReg(u32 addrLo, u32 addrHi) static inline u32 GXReadCPReg(u32 addrLo, u32 addrHi) { u32 hiStart, hiNew, lo; - hiStart = GX_GET_CP_REG(addrHi); + hiStart = __cpReg[addrHi]; do { hiNew = hiStart; - lo = GX_GET_CP_REG(addrLo); - hiStart = GX_GET_CP_REG(addrHi); + lo = __cpReg[addrLo]; + hiStart = __cpReg[addrHi]; } while (hiStart != hiNew); return ((hiStart << 16) | lo); @@ -252,11 +239,11 @@ static inline u32 GXReadCPReg(u32 addrLo, u32 addrHi) static inline u32 GXReadPEReg(u32 addrLo, u32 addrHi) { u32 hiStart, hiNew, lo; - hiStart = GX_GET_PE_REG(addrHi); + hiStart = __peReg[addrHi]; do { hiNew = hiStart; - lo = GX_GET_PE_REG(addrLo); - hiStart = GX_GET_PE_REG(addrHi); + lo = __peReg[addrLo]; + hiStart = __peReg[addrHi]; } while (hiStart != hiNew); return ((hiStart << 16) | lo); @@ -265,11 +252,11 @@ static inline u32 GXReadPEReg(u32 addrLo, u32 addrHi) static inline u32 GXReadPIReg(u32 addrLo, u32 addrHi) { u32 hiStart, hiNew, lo; - hiStart = GX_GET_PI_REG(addrHi); + hiStart = __piReg[addrHi]; do { hiNew = hiStart; - lo = GX_GET_PI_REG(addrLo); - hiStart = GX_GET_PI_REG(addrHi); + lo = __piReg[addrLo]; + hiStart = __piReg[addrHi]; } while (hiStart != hiNew); return ((hiStart << 16) | lo); diff --git a/include/Dolphin/hw_regs.h b/include/Dolphin/hw_regs.h index 4163f9a3..0ca05b54 100644 --- a/include/Dolphin/hw_regs.h +++ b/include/Dolphin/hw_regs.h @@ -9,6 +9,90 @@ BEGIN_SCOPE_EXTERN_C #define HW_REG(reg, type) *(volatile type*)(u32)(reg) // generic HW_REG macro (please do not use this) /////// HARDWARE REGISTERS /////// + +// Command Processor registers. +extern vu16 __CPRegs[51] AT_ADDRESS(0xCC000000); + +// offsets for __CPRegs[i] +#define CP_STATUS (0) +#define CP_CONTROL (1) +#define CP_CLEAR (2) +#define CP_PERF_SELECT (3) +#define CP_04 (4) +#define CP_05 (5) +#define CP_06 (6) +#define CP_07 (7) +#define CP_08 (8) +#define CP_09 (9) +#define CP_10 (10) +#define CP_11 (11) +#define CP_12 (12) +#define CP_13 (13) +#define CP_14 (14) +#define CP_15 (15) +#define CP_FIFO_BASE_LO (16) +#define CP_FIFO_BASE_HI (17) +#define CP_FIFO_END_LO (18) +#define CP_FIFO_END_HI (19) +#define CP_FIFO_HI_WATERMARK_LO (20) +#define CP_FIFO_HI_WATERMARK_HI (21) +#define CP_FIFO_LO_WATERMARK_LO (22) +#define CP_FIFO_LO_WATERMARK_HI (23) +#define CP_FIFO_RW_DISTANCE_LO (24) +#define CP_FIFO_RW_DISTANCE_HI (25) +#define CP_FIFO_WRITE_POINTER_LO (26) +#define CP_FIFO_WRITE_POINTER_HI (27) +#define CP_FIFO_READ_POINTER_LO (28) +#define CP_FIFO_READ_POINTER_HI (29) +#define CP_FIFO_BP_LO (30) +#define CP_FIFO_BP_HI (31) +#define CP_XF_RASBUSY_LO (32) +#define CP_XF_RASBUSY_HI (33) +#define CP_XF_CLKS_L0 (34) +#define CP_XF_CLKS_HI (35) +#define CP_XF_WAIT_IN_LO (36) +#define CP_XF_WAIT_IN_HI (37) +#define CP_XF_WAIT_OUT_LO (38) +#define CP_XF_WAIT_OUT_HI (39) +#define CP_VCACHE_METRIC_CHECK_LO (40) +#define CP_VCACHE_METRIC_CHECK_HI (41) +#define CP_VCACHE_METRIC_MISS_LO (42) +#define CP_VCACHE_METRIC_MISS_HI (43) +#define CP_VCACHE_METRIC_STALL_LO (44) +#define CP_VCACHE_METRIC_STALL_HI (45) +#define CP_CLKS_PER_VTX_IN_LO (48) +#define CP_CLKS_PER_VTX_IN_HI (49) +#define CP_CLKS_PER_VTX_OUT (50) + +// Pixel Engine registers. +extern vu16 __PERegs[24] AT_ADDRESS(0xCC001000); + +// offsets for __PERegs[i] +#define PE_Z_CONFIG (0) +#define PE_ALPHA_CONFIG (1) +#define PE_DEST_ALPHA_CONFIG (2) +#define PE_ALPHA_MODE (3) +#define PE_ALPHA_READ (4) +#define PE_CONTROL_REGISTER (5) +#define PE_06 (6) +#define PE_TOKEN (7) +#define PE_BB_LEFT (8) // bounding box +#define PE_BB_RIGHT (9) // bounding box +#define PE_BB_TOP (10) // bounding box +#define PE_BB_BOTTOM (11) // bounding box +#define PE_PERF_ZCOMP_INPUT_ZCOMPLOC_LO (12) +#define PE_PERF_ZCOMP_INPUT_ZCOMPLOC_HI (13) +#define PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_LO (14) +#define PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_HI (15) +#define PE_PERF_ZCOMP_INPUT_LO (16) +#define PE_PERF_ZCOMP_INPUT_HI (17) +#define PE_PERF_ZCOMP_OUTPUT_LO (18) +#define PE_PERF_ZCOMP_OUTPUT_HI (19) +#define PE_PERF_BLEND_INPUT_LO (20) +#define PE_PERF_BLEND_INPUT_HI (21) +#define PE_PERF_EFB_COPY_CLOCKS_LO (22) +#define PE_PERF_EFB_COPY_CLOCKS_HI (23) + // Video Interface registers. extern vu16 __VIRegs[59] AT_ADDRESS(0xCC002000); @@ -77,7 +161,7 @@ extern vu16 __VIRegs[59] AT_ADDRESS(0xCC002000); #define VI_WIDTH (56) // Processor Interface registers. -extern vu32 __PIRegs[12] AT_ADDRESS(0xCC003000); +extern vu32 __PIRegs[13] AT_ADDRESS(0xCC003000); // offsets for __PIRegs[i] #define PI_INTRPT_SRC (0) // interrupt cause @@ -85,8 +169,13 @@ extern vu32 __PIRegs[12] AT_ADDRESS(0xCC003000); #define PI_FIFO_START (3) // FIFO base start #define PI_FIFO_END (4) // FIFO base end #define PI_FIFO_PTR (5) // FIFO current write pointer - -#define PI_RESETCODE (9) // reset code, used by OSReset +#define PI_FIFO_RESET (6) +#define PI_07 (7) +#define PI_08 (8) +#define PI_RESETCODE (9) // reset code, used by OSReset +#define PI_10 (10) +#define PI_FLIPPER_REV (11) +#define PI_12 (12) // PI Interrupt causes. #define PI_INTRPT_ERR (0x1) // GP runtime error @@ -109,19 +198,51 @@ extern vu32 __PIRegs[12] AT_ADDRESS(0xCC003000); extern vu16 __MEMRegs[64] AT_ADDRESS(0xCC004000); // offsets for __MEMRegs[i] -#define MEM_PROT_1 (0) // protected region 1 -#define MEM_PROT_2 (2) // protected region 1 -#define MEM_PROT_3 (4) // protected region 1 -#define MEM_PROT_4 (6) // protected region 1 -#define MEM_PROT_TYPE (8) // protection type - +#define MEM_PROT_0_FIRST (0) // protected region 0 +#define MEM_PROT_0_LAST (1) // protected region 0 +#define MEM_PROT_1_FIRST (2) // protected region 1 +#define MEM_PROT_1_LAST (3) // protected region 1 +#define MEM_PROT_2_FIRST (4) // protected region 2 +#define MEM_PROT_2_LAST (5) // protected region 2 +#define MEM_PROT_3_FIRST (6) // protected region 3 +#define MEM_PROT_3_LAST (7) // protected region 3 +#define MEM_PROT_TYPE (8) // protection type +#define MEM_09 (9) +#define MEM_10 (10) +#define MEM_11 (11) +#define MEM_12 (12) +#define MEM_13 (13) #define MEM_INTRPT_MASK (14) // interrupt mask #define MEM_INTRPT_SRC (15) // interrupt cause #define MEM_INTRPT_FLAG (16) // set when interrupt happens #define MEM_INTRPT_ADDR_LO (17) // address that caused interrupt #define MEM_INTRPT_ADDR_HI (18) // address that caused interrupt - -#define MEM_UNK_FLAG (20) // unknown memory flag, set in __OSInitMemoryProtection +#define MEM_19 (19) +#define MEM_20 (20) // unknown memory flag, set in __OSInitMemoryProtection +#define MEM_21 (21) +#define MEM_22 (22) +#define MEM_23 (23) +#define MEM_24 (24) +#define MEM_TIMER0_HI (25) +#define MEM_TIMER0_LO (26) +#define MEM_TIMER1_HI (27) +#define MEM_TIMER1_LO (28) +#define MEM_TIMER2_HI (29) +#define MEM_TIMER2_LO (30) +#define MEM_TIMER3_HI (31) +#define MEM_TIMER3_LO (32) +#define MEM_TIMER4_HI (33) +#define MEM_TIMER4_LO (34) +#define MEM_TIMER5_HI (35) +#define MEM_TIMER5_LO (36) +#define MEM_TIMER6_HI (37) +#define MEM_TIMER6_LO (38) +#define MEM_TIMER7_HI (39) +#define MEM_TIMER7_LO (40) +#define MEM_TIMER8_HI (41) +#define MEM_TIMER8_LO (42) +#define MEM_TIMER9_HI (43) +#define MEM_TIMER9_LO (44) // Digital Signal Processor registers (for audio mixing). extern vu16 __DSPRegs[32] AT_ADDRESS(0xCC005000); diff --git a/src/amcExi2/AmcExi.c b/src/amcExi2/AmcExi.c index a6248974..e466515f 100644 --- a/src/amcExi2/AmcExi.c +++ b/src/amcExi2/AmcExi.c @@ -107,8 +107,8 @@ void AmcEXIClearInterrupts(s32 doProcessInterface, s32 doExternalInterface) if (doProcessInterface != 0) { piCause = __PIRegs[PI_INTRPT_SRC]; - piCause &= 0x1000; - piCause |= 0x1000; + piCause &= PI_INTRPT_DEBUG; + piCause |= PI_INTRPT_DEBUG; __PIRegs[PI_INTRPT_SRC] = piCause; } if (doExternalInterface != 0) { diff --git a/src/amcExi2/AmcExi2Comm.c b/src/amcExi2/AmcExi2Comm.c index 142c9394..73b143af 100644 --- a/src/amcExi2/AmcExi2Comm.c +++ b/src/amcExi2/AmcExi2Comm.c @@ -159,7 +159,7 @@ int EXI2_Poll(void) u32 bufAddr2; u32 stackPad; - if (!(__PIRegs[PI_INTRPT_SRC] & 0x1000) && (*pucEXI2InputPending == 0)) { + if (!(__PIRegs[PI_INTRPT_SRC] & PI_INTRPT_DEBUG) && (*pucEXI2InputPending == 0)) { bufAddr = 0; } else { // yes this looks like EXI2_StartRead. no, using that function fucks with the stack. @@ -181,7 +181,7 @@ int EXI2_Poll(void) AmcEXIImm(&bufAddr, 4, 0, 0); AmcEXISync(); if (*pucEXI2InputPending == 0) { - __PIRegs[PI_INTRPT_SRC] &= 0x1000; + __PIRegs[PI_INTRPT_SRC] &= PI_INTRPT_DEBUG; *pucEXI2InputPending = 1; } } diff --git a/src/dvd/dvd.c b/src/dvd/dvd.c index 804c9878..5db4e6e9 100644 --- a/src/dvd/dvd.c +++ b/src/dvd/dvd.c @@ -854,7 +854,7 @@ static void cbForStateBusy(u32 p1) } if ((CurrCommand == 1) || (CurrCommand == 4) || (CurrCommand == 5) || (CurrCommand == 14)) { - executing->transferredSize += executing->currTransferSize - __DIRegs[6]; + executing->transferredSize += executing->currTransferSize - __DIRegs[DI_DMA_LENGTH]; } if (p1 & 8) { @@ -1708,7 +1708,7 @@ BOOL DVDCheckDisk() case 0: case 8: { - coverReg = __DIRegs[1]; + coverReg = __DIRegs[DI_COVER_STATUS]; if (((coverReg >> 2) & 1) || (coverReg & 1)) { result = FALSE; } else { diff --git a/src/dvd/dvdlow.c b/src/dvd/dvdlow.c index 345bda67..b49640b9 100644 --- a/src/dvd/dvdlow.c +++ b/src/dvd/dvdlow.c @@ -103,7 +103,7 @@ void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) LastCommandWasRead = FALSE; StopAtNextInt = FALSE; - reg = __DIRegs[0]; + reg = __DIRegs[DI_STATUS]; mask = reg & 0x2a; intr = (reg & 0x54) & (mask << 1); @@ -123,10 +123,10 @@ void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) ResetOccurred = FALSE; } - __DIRegs[0] = intr | mask; + __DIRegs[DI_STATUS] = intr | mask; if (ResetOccurred && (__OSGetSystemTime() - LastResetEnd) < OSMillisecondsToTicks(200)) { - reg = __DIRegs[1]; + reg = __DIRegs[DI_COVER_STATUS]; mask = reg & 0x2; intr = (reg & 4) & (mask << 1); if (intr & 4) { @@ -136,9 +136,9 @@ void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) ResetCoverCallback = NULL; } - __DIRegs[1] = __DIRegs[1]; + __DIRegs[DI_COVER_STATUS] = __DIRegs[DI_COVER_STATUS]; } else if (WaitingCoverClose) { - reg = __DIRegs[1]; + reg = __DIRegs[DI_COVER_STATUS]; mask = reg & 2; intr = (reg & 4) & (mask << 1); @@ -146,10 +146,10 @@ void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) cause |= 4; } - __DIRegs[1] = intr | mask; - WaitingCoverClose = FALSE; + __DIRegs[DI_COVER_STATUS] = intr | mask; + WaitingCoverClose = FALSE; } else { - __DIRegs[1] = 0; + __DIRegs[DI_COVER_STATUS] = 0; } if ((cause & 8) && !Breaking) { @@ -230,13 +230,13 @@ static void Read(void* addr, u32 length, u32 offset, DVDLowCallback callback) Callback = callback; LastReadIssued = __OSGetSystemTime(); - __DIRegs[2] = 0xa8000000; - __DIRegs[3] = offset / 4; - __DIRegs[4] = length; - __DIRegs[5] = (u32)addr; - __DIRegs[6] = length; - LastLength = length; - __DIRegs[7] = 3; + __DIRegs[DI_CMD_BUF_0] = 0xa8000000; + __DIRegs[DI_CMD_BUF_1] = offset / 4; + __DIRegs[DI_CMD_BUF_2] = length; + __DIRegs[DI_DMA_MEM_ADDR] = (u32)addr; + __DIRegs[DI_DMA_LENGTH] = length; + LastLength = length; + __DIRegs[DI_CONTROL] = 3; if (length > 0xa00000) { SetTimeoutAlarm(OSSecondsToTicks(20)); @@ -333,10 +333,10 @@ BOOL DVDLowRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) OSTime diff; u32 prev; - __DIRegs[6] = length; - Curr.addr = addr; - Curr.length = length; - Curr.offset = offset; + __DIRegs[DI_DMA_LENGTH] = length; + Curr.addr = addr; + Curr.length = length; + Curr.offset = offset; if (WorkAroundType == 0) { DoJustRead(addr, length, offset, callback); @@ -369,11 +369,11 @@ BOOL DVDLowRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) */ BOOL DVDLowSeek(u32 offset, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0xab000000; - __DIRegs[3] = offset / 4; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0xab000000; + __DIRegs[DI_CMD_BUF_1] = offset / 4; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -383,10 +383,10 @@ BOOL DVDLowSeek(u32 offset, DVDLowCallback callback) */ BOOL DVDLowWaitCoverClose(DVDLowCallback callback) { - Callback = callback; - WaitingCoverClose = TRUE; - StopAtNextInt = FALSE; - __DIRegs[1] = 2; + Callback = callback; + WaitingCoverClose = TRUE; + StopAtNextInt = FALSE; + __DIRegs[DI_COVER_STATUS] = 2; return TRUE; } @@ -395,14 +395,14 @@ BOOL DVDLowWaitCoverClose(DVDLowCallback callback) */ BOOL DVDLowReadDiskID(DVDDiskID* diskID, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0xa8000040; - __DIRegs[3] = 0; - __DIRegs[4] = sizeof(DVDDiskID); - __DIRegs[5] = (u32)diskID; - __DIRegs[6] = sizeof(DVDDiskID); - __DIRegs[7] = 3; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0xa8000040; + __DIRegs[DI_CMD_BUF_1] = 0; + __DIRegs[DI_CMD_BUF_2] = sizeof(DVDDiskID); + __DIRegs[DI_DMA_MEM_ADDR] = (u32)diskID; + __DIRegs[DI_DMA_LENGTH] = sizeof(DVDDiskID); + __DIRegs[DI_CONTROL] = 3; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -412,10 +412,10 @@ BOOL DVDLowReadDiskID(DVDDiskID* diskID, DVDLowCallback callback) */ BOOL DVDLowStopMotor(DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0xe3000000; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0xe3000000; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -425,10 +425,10 @@ BOOL DVDLowStopMotor(DVDLowCallback callback) */ BOOL DVDLowRequestError(DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0xe0000000; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0xe0000000; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -438,13 +438,13 @@ BOOL DVDLowRequestError(DVDLowCallback callback) */ BOOL DVDLowInquiry(DVDDriveInfo* info, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0x12000000; - __DIRegs[4] = sizeof(DVDDriveInfo); - __DIRegs[5] = (u32)info; - __DIRegs[6] = sizeof(DVDDriveInfo); - __DIRegs[7] = 3; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0x12000000; + __DIRegs[DI_CMD_BUF_2] = sizeof(DVDDriveInfo); + __DIRegs[DI_DMA_MEM_ADDR] = (u32)info; + __DIRegs[DI_DMA_LENGTH] = sizeof(DVDDriveInfo); + __DIRegs[DI_CONTROL] = 3; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -454,12 +454,12 @@ BOOL DVDLowInquiry(DVDDriveInfo* info, DVDLowCallback callback) */ BOOL DVDLowAudioStream(u32 subcmd, u32 length, u32 offset, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = subcmd | 0xe1000000; - __DIRegs[3] = offset >> 2; - __DIRegs[4] = length; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = subcmd | 0xe1000000; + __DIRegs[DI_CMD_BUF_1] = offset >> 2; + __DIRegs[DI_CMD_BUF_2] = length; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -469,10 +469,10 @@ BOOL DVDLowAudioStream(u32 subcmd, u32 length, u32 offset, DVDLowCallback callba */ BOOL DVDLowRequestAudioStatus(u32 subcmd, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = subcmd | 0xe2000000; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = subcmd | 0xe2000000; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -482,10 +482,10 @@ BOOL DVDLowRequestAudioStatus(u32 subcmd, DVDLowCallback callback) */ BOOL DVDLowAudioBufferConfig(BOOL enable, u32 size, DVDLowCallback callback) { - StopAtNextInt = FALSE; - Callback = callback; - __DIRegs[2] = 0xe4000000 | (enable != 0 ? 0x10000 : 0) | size; - __DIRegs[7] = 1; + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[DI_CMD_BUF_0] = 0xe4000000 | (enable != 0 ? 0x10000 : 0) | size; + __DIRegs[DI_CONTROL] = 1; SetTimeoutAlarm(OSSecondsToTicks(10)); return TRUE; } @@ -498,17 +498,17 @@ void DVDLowReset() u32 reg; OSTime resetStart; - __DIRegs[1] = 2; - reg = __PIRegs[9]; - __PIRegs[9] = (reg & ~4) | 1; + __DIRegs[DI_COVER_STATUS] = 2; + reg = __PIRegs[PI_RESETCODE]; + __PIRegs[PI_RESETCODE] = (reg & ~4) | 1; resetStart = __OSGetSystemTime(); while ((__OSGetSystemTime() - resetStart) < OSMicrosecondsToTicks(12)) ; - __PIRegs[9] = reg | 5; - ResetOccurred = TRUE; - LastResetEnd = __OSGetSystemTime(); + __PIRegs[PI_RESETCODE] = reg | 5; + ResetOccurred = TRUE; + LastResetEnd = __OSGetSystemTime(); } /** @@ -563,9 +563,9 @@ BOOL DVDLowBreak() DVDLowCallback DVDLowClearCallback() { DVDLowCallback old; - __DIRegs[1] = 0; - old = Callback; - Callback = NULL; + __DIRegs[DI_COVER_STATUS] = 0; + old = Callback; + Callback = NULL; return old; } diff --git a/src/gx/GXFifo.c b/src/gx/GXFifo.c index 043fd176..5bb4e3fa 100644 --- a/src/gx/GXFifo.c +++ b/src/gx/GXFifo.c @@ -1,5 +1,6 @@ #include "Dolphin/PPCArch.h" #include "Dolphin/gx.h" +#include "Dolphin/hw_regs.h" #include "Dolphin/os.h" #include @@ -82,8 +83,8 @@ static void GXBreakPointHandler(s16 interrupt, OSContext* context) { OSContext exceptionContext; - gx->cpEnable = gx->cpEnable & 0xFFFFFFDF; - __cpReg[1] = gx->cpEnable; + gx->cpEnable = gx->cpEnable & 0xFFFFFFDF; + __cpReg[CP_CONTROL] = gx->cpEnable; if (BreakPointCB != NULL) { OSClearContext(&exceptionContext); OSSetCurrentContext(&exceptionContext); @@ -98,7 +99,7 @@ static void GXBreakPointHandler(s16 interrupt, OSContext* context) */ static void GXCPInterruptHandler(s16 interrupt, OSContext* context) { - gx->cpStatus = __cpReg[0]; + gx->cpStatus = __cpReg[CP_STATUS]; if (GET_REG_FIELD(gx->cpEnable, 1, 3) && GET_REG_FIELD(gx->cpStatus, 1, 1)) { GXUnderflowHandler(interrupt, context); } @@ -186,12 +187,12 @@ void GXSetCPUFifo(GXFifoObj* fifo) if (CPUFifo == GPFifo) { u32 reg = 0; - __piReg[3] = (u32)realFifo->base & 0x3FFFFFFF; - __piReg[4] = (u32)realFifo->top & 0x3FFFFFFF; - SET_REG_FIELD(0x294, reg, 21, 5, ((u32)realFifo->wrPtr & 0x3FFFFFFF) >> 5); + __piReg[PI_FIFO_START] = (u32)realFifo->base & ~OS_BASE_UNCACHED; + __piReg[PI_FIFO_END] = (u32)realFifo->top & ~OS_BASE_UNCACHED; + SET_REG_FIELD(0x294, reg, 21, 5, ((u32)realFifo->wrPtr & ~OS_BASE_UNCACHED) >> 5); SET_REG_FIELD(0x295, reg, 1, 26, 0); - __piReg[5] = reg; - CPGPLinked = GX_TRUE; + __piReg[PI_FIFO_PTR] = reg; + CPGPLinked = GX_TRUE; __GXWriteFifoIntReset(1, 1); __GXWriteFifoIntEnable(1, 0); __GXFifoLink(1); @@ -203,12 +204,12 @@ void GXSetCPUFifo(GXFifoObj* fifo) CPGPLinked = GX_FALSE; } __GXWriteFifoIntEnable(0, 0); - reg = 0; - __piReg[3] = (u32)realFifo->base & 0x3FFFFFFF; - __piReg[4] = (u32)realFifo->top & 0x3FFFFFFF; - SET_REG_FIELD(0x2B7, reg, 21, 5, ((u32)realFifo->wrPtr & 0x3FFFFFFF) >> 5); + reg = 0; + __piReg[PI_FIFO_START] = (u32)realFifo->base & ~OS_BASE_UNCACHED; + __piReg[PI_FIFO_END] = (u32)realFifo->top & ~OS_BASE_UNCACHED; + SET_REG_FIELD(0x2B7, reg, 21, 5, ((u32)realFifo->wrPtr & ~OS_BASE_UNCACHED) >> 5); SET_REG_FIELD(0x2B8, reg, 1, 26, 0); - __piReg[5] = reg; + __piReg[PI_FIFO_PTR] = reg; } __mwerks_sync(); @@ -228,20 +229,20 @@ void GXSetGPFifo(GXFifoObj* fifo) __GXWriteFifoIntEnable(0, 0); GPFifo = realFifo; - __cpReg[16] = (u32)realFifo->base & 0xFFFF; - __cpReg[18] = (u32)realFifo->top & 0xFFFF; - __cpReg[24] = realFifo->count & 0xFFFF; - __cpReg[26] = (u32)realFifo->wrPtr & 0xFFFF; - __cpReg[28] = (u32)realFifo->rdPtr & 0xFFFF; - __cpReg[20] = (u32)realFifo->hiWatermark & 0xFFFF; - __cpReg[22] = (u32)realFifo->loWatermark & 0xFFFF; - __cpReg[17] = ((u32)realFifo->base & 0x3FFFFFFF) >> 16; - __cpReg[19] = ((u32)realFifo->top & 0x3FFFFFFF) >> 16; - __cpReg[25] = realFifo->count >> 16; - __cpReg[27] = ((u32)realFifo->wrPtr & 0x3FFFFFFF) >> 16; - __cpReg[29] = ((u32)realFifo->rdPtr & 0x3FFFFFFF) >> 16; - __cpReg[21] = (u32)realFifo->hiWatermark >> 16; - __cpReg[23] = (u32)realFifo->loWatermark >> 16; + __cpReg[CP_FIFO_BASE_LO] = (u32)realFifo->base & 0xFFFF; + __cpReg[CP_FIFO_END_LO] = (u32)realFifo->top & 0xFFFF; + __cpReg[CP_FIFO_RW_DISTANCE_LO] = realFifo->count & 0xFFFF; + __cpReg[CP_FIFO_WRITE_POINTER_LO] = (u32)realFifo->wrPtr & 0xFFFF; + __cpReg[CP_FIFO_READ_POINTER_LO] = (u32)realFifo->rdPtr & 0xFFFF; + __cpReg[CP_FIFO_HI_WATERMARK_LO] = (u32)realFifo->hiWatermark & 0xFFFF; + __cpReg[CP_FIFO_LO_WATERMARK_LO] = (u32)realFifo->loWatermark & 0xFFFF; + __cpReg[CP_FIFO_BASE_HI] = ((u32)realFifo->base & ~OS_BASE_UNCACHED) >> 16; + __cpReg[CP_FIFO_END_HI] = ((u32)realFifo->top & ~OS_BASE_UNCACHED) >> 16; + __cpReg[CP_FIFO_RW_DISTANCE_HI] = realFifo->count >> 16; + __cpReg[CP_FIFO_WRITE_POINTER_HI] = ((u32)realFifo->wrPtr & ~OS_BASE_UNCACHED) >> 16; + __cpReg[CP_FIFO_READ_POINTER_HI] = ((u32)realFifo->rdPtr & ~OS_BASE_UNCACHED) >> 16; + __cpReg[CP_FIFO_HI_WATERMARK_HI] = (u32)realFifo->hiWatermark >> 16; + __cpReg[CP_FIFO_LO_WATERMARK_HI] = (u32)realFifo->loWatermark >> 16; __mwerks_sync(); @@ -269,18 +270,18 @@ void GXSaveCPUFifo(GXFifoObj* fifo) __GXSaveCPUFifoAux(realFifo); } -#define SOME_MACRO1(fifo) \ - do { \ - u32 temp = __cpReg[29] << 16; \ - temp |= __cpReg[28]; \ - fifo->rdPtr = OSPhysicalToCached(temp); \ +#define SOME_MACRO1(fifo) \ + do { \ + u32 temp = __cpReg[CP_FIFO_READ_POINTER_HI] << 16; \ + temp |= __cpReg[CP_FIFO_READ_POINTER_LO]; \ + fifo->rdPtr = OSPhysicalToCached(temp); \ } while (0) -#define SOME_MACRO2(fifo) \ - do { \ - u32 temp = __cpReg[25] << 16; \ - temp |= __cpReg[24]; \ - fifo->count = temp; \ +#define SOME_MACRO2(fifo) \ + do { \ + u32 temp = __cpReg[CP_FIFO_RW_DISTANCE_HI] << 16; \ + temp |= __cpReg[CP_FIFO_RW_DISTANCE_LO]; \ + fifo->count = temp; \ } while (0) /** @@ -291,9 +292,9 @@ void __GXSaveCPUFifoAux(struct __GXFifoObj* realFifo) BOOL enabled = OSDisableInterrupts(); GXFlush(); - realFifo->base = OSPhysicalToCached(__piReg[3]); - realFifo->top = OSPhysicalToCached(__piReg[4]); - realFifo->wrPtr = OSPhysicalToCached(__piReg[5] & 0xFBFFFFFF); + realFifo->base = OSPhysicalToCached(__piReg[PI_FIFO_START]); + realFifo->top = OSPhysicalToCached(__piReg[PI_FIFO_END]); + realFifo->wrPtr = OSPhysicalToCached(__piReg[PI_FIFO_PTR] & 0xFBFFFFFF); if (CPGPLinked) { SOME_MACRO1(realFifo); SOME_MACRO2(realFifo); @@ -317,7 +318,7 @@ void GXSaveGPFifo(GXFifoObj* fifo) unsigned long temp; OSAssertMsgLine(0x36A, realFifo == GPFifo, "GXSaveGPFifo: fifo is not attached to GP"); - cpStatus = __cpReg[0]; + cpStatus = __cpReg[CP_STATUS]; readIdle = GET_REG_FIELD(cpStatus, 1, 2); OSAssertMsgLine(0x371, readIdle, "GXSaveGPFifo: GP is not idle"); @@ -331,7 +332,7 @@ void GXSaveGPFifo(GXFifoObj* fifo) */ void GXGetGPStatus(GXBool* overhi, GXBool* underlow, GXBool* readIdle, GXBool* cmdIdle, GXBool* brkpt) { - gx->cpStatus = __cpReg[0]; + gx->cpStatus = __cpReg[CP_STATUS]; *overhi = GET_REG_FIELD(gx->cpStatus, 1, 0); *underlow = (int)GET_REG_FIELD(gx->cpStatus, 1, 1); *readIdle = (int)GET_REG_FIELD(gx->cpStatus, 1, 2); @@ -357,7 +358,7 @@ void GXGetFifoStatus(GXFifoObj* fifo, GXBool* overhi, GXBool* underflow, u32* fi } if (realFifo == CPUFifo) { __GXSaveCPUFifoAux(realFifo); - *fifowrap = (int)GET_REG_FIELD(__piReg[5], 1, 26); + *fifowrap = (int)GET_REG_FIELD(__piReg[PI_FIFO_PTR], 1, 26); } *overhi = (realFifo->count > realFifo->hiWatermark); *underflow = (realFifo->count < realFifo->loWatermark); @@ -376,7 +377,7 @@ void GXGetFifoPtrs(GXFifoObj* fifo, void** readPtr, void** writePtr) OSAssertMsgLine(0x3F2, realFifo == CPUFifo || realFifo == GPFifo, "GXGetFifoPtrs: fifo is not CPU or GP fifo"); if (realFifo == CPUFifo) { - realFifo->wrPtr = OSPhysicalToCached(__piReg[5] & 0xFBFFFFFF); + realFifo->wrPtr = OSPhysicalToCached(__piReg[PI_FIFO_PTR] & 0xFBFFFFFF); } if (realFifo == GPFifo) { SOME_MACRO1(realFifo); @@ -452,12 +453,12 @@ void GXEnableBreakPt(void* break_pt) __GXFifoReadDisable(); OSAssertMsgLine(0x44A, (u8*)break_pt >= GPFifo->base && (u8*)break_pt <= GPFifo->top, "GXEnableBreakPt: Break point value not in fifo range"); - __cpReg[30] = (u32)break_pt; - __cpReg[31] = ((u32)break_pt >> 16) & 0x3FFF; - gx->cpEnable = (gx->cpEnable & 0xFFFFFFFD) | 2; - gx->cpEnable = (gx->cpEnable & 0xFFFFFFDF) | 0x20; - __cpReg[1] = gx->cpEnable; - __GXCurrentBP = break_pt; + __cpReg[CP_FIFO_BP_LO] = (u32)break_pt; + __cpReg[CP_FIFO_BP_HI] = ((u32)break_pt >> 16) & 0x3FFF; + gx->cpEnable = (gx->cpEnable & 0xFFFFFFFD) | 2; + gx->cpEnable = (gx->cpEnable & 0xFFFFFFDF) | 0x20; + __cpReg[CP_CONTROL] = gx->cpEnable; + __GXCurrentBP = break_pt; __GXFifoReadEnable(); OSRestoreInterrupts(enabled); } @@ -470,10 +471,10 @@ void GXDisableBreakPt(void) { BOOL enabled = OSDisableInterrupts(); - gx->cpEnable = gx->cpEnable & 0xFFFFFFFD; - gx->cpEnable = gx->cpEnable & 0xFFFFFFDF; - __cpReg[1] = gx->cpEnable; - __GXCurrentBP = NULL; + gx->cpEnable = gx->cpEnable & 0xFFFFFFFD; + gx->cpEnable = gx->cpEnable & 0xFFFFFFDF; + __cpReg[CP_CONTROL] = gx->cpEnable; + __GXCurrentBP = NULL; OSRestoreInterrupts(enabled); } @@ -498,7 +499,7 @@ void __GXFifoInit(void) void __GXFifoReadEnable(void) { SET_REG_FIELD(0, gx->cpEnable, 1, 0, 1); - __cpReg[1] = gx->cpEnable; + __cpReg[CP_CONTROL] = gx->cpEnable; } /** @@ -507,7 +508,7 @@ void __GXFifoReadEnable(void) void __GXFifoReadDisable(void) { SET_REG_FIELD(0, gx->cpEnable, 1, 0, 0); - __cpReg[1] = gx->cpEnable; + __cpReg[CP_CONTROL] = gx->cpEnable; } /** @@ -516,7 +517,7 @@ void __GXFifoReadDisable(void) void __GXFifoLink(u8 en) { SET_REG_FIELD(0x4B0, gx->cpEnable, 1, 4, (en != 0) ? 1 : 0); - __cpReg[1] = gx->cpEnable; + __cpReg[CP_CONTROL] = gx->cpEnable; } /** @@ -526,7 +527,7 @@ void __GXWriteFifoIntEnable(u8 hiWatermarkEn, u8 loWatermarkEn) { SET_REG_FIELD(0x4C6, gx->cpEnable, 1, 2, hiWatermarkEn); SET_REG_FIELD(0x4C7, gx->cpEnable, 1, 3, loWatermarkEn); - __cpReg[1] = gx->cpEnable; + __cpReg[CP_CONTROL] = gx->cpEnable; } /** @@ -536,7 +537,7 @@ void __GXWriteFifoIntReset(u8 hiWatermarkClr, u8 loWatermarkClr) { SET_REG_FIELD(0x4DE, gx->cpClr, 1, 0, hiWatermarkClr); SET_REG_FIELD(0x4DF, gx->cpClr, 1, 1, loWatermarkClr); - __cpReg[2] = gx->cpClr; + __cpReg[CP_CLEAR] = gx->cpClr; } /** @@ -547,9 +548,9 @@ void __GXInsaneWatermark(void) { struct __GXFifoObj* realFifo = GPFifo; - realFifo->hiWatermark = realFifo->loWatermark + 512; - __cpReg[20] = (realFifo->hiWatermark & 0x3FFFFFFF) & 0xFFFF; - __cpReg[21] = (realFifo->hiWatermark & 0x3FFFFFFF) >> 16; + realFifo->hiWatermark = realFifo->loWatermark + 512; + __cpReg[CP_FIFO_HI_WATERMARK_LO] = (realFifo->hiWatermark & ~OS_BASE_UNCACHED) & 0xFFFF; + __cpReg[CP_FIFO_HI_WATERMARK_HI] = (realFifo->hiWatermark & ~OS_BASE_UNCACHED) >> 16; } /** @@ -669,16 +670,18 @@ volatile void* GXRedirectWriteGatherPipe(void* ptr) __GXFifoLink(0); __GXWriteFifoIntEnable(0, 0); } - CPUFifo->wrPtr = OSPhysicalToCached(__piReg[5] & 0xFBFFFFFF); - __piReg[3] = 0; - __piReg[4] = 0x04000000; - SET_REG_FIELD(0x5C8, reg, 21, 5, ((u32)ptr & 0x3FFFFFFF) >> 5); - /*if (((u32)ptr >> 5) & 0x1E00000) - OSErrorLine(0x5FB, "GX Internal: Register field out of range"); - //SET_REG_FIELD(0x5C8, reg, 25, 5, ((u32)ptr & 0x3FFFFFFF) >> 5);*/ - // reg = (reg & ~0x3FFFFE0) | ((u32)ptr & 0x3FFFFFE0); + CPUFifo->wrPtr = OSPhysicalToCached(__piReg[PI_FIFO_PTR] & 0xFBFFFFFF); + __piReg[PI_FIFO_START] = 0; + __piReg[PI_FIFO_END] = 0x04000000; + SET_REG_FIELD(0x5C8, reg, 21, 5, ((u32)ptr & ~OS_BASE_UNCACHED) >> 5); +#if 0 + if (((u32)ptr >> 5) & 0x1E00000) + OSErrorLine(0x5FB, "GX Internal: Register field out of range"); + SET_REG_FIELD(0x5C8, reg, 25, 5, ((u32)ptr & ~OS_BASE_UNCACHED) >> 5); + reg = (reg & ~0x3FFFFE0) | ((u32)ptr & 0x3FFFFFE0); +#endif reg &= 0xFBFFFFFF; - __piReg[5] = reg; + __piReg[PI_FIFO_PTR] = reg; __mwerks_sync(); OSRestoreInterrupts(enabled); return (volatile void*)GXFIFO_ADDR; @@ -705,15 +708,17 @@ void GXRestoreWriteGatherPipe(void) PPCSync(); while (PPCMfwpar() & 1) { } PPCMtwpar((u32)OSUncachedToPhysical((void*)GXFIFO_ADDR)); - __piReg[3] = (u32)CPUFifo->base & 0x3FFFFFFF; - __piReg[4] = (u32)CPUFifo->top & 0x3FFFFFFF; - SET_REG_FIELD(0x5FB, reg, 21, 5, ((u32)CPUFifo->wrPtr & 0x3FFFFFFF) >> 5); - /*if ((((u32)CPUFifo->wrPtr & 0x3FFFFFFF) >> 5) & 0x7E00000) - OSErrorLine(0x5FB, "GX Internal: Register field out of range"); - reg = (reg & ~0x3FFFFE0) | (((u32)CPUFifo->wrPtr & 0x3FFFFFFF) & ~0x1F);*/ - // SET_REG_FIELD(0x5FB, reg, 25, 5, ((u32)CPUFifo->wrPtr & 0x3FFFFFFF) >> 5); + __piReg[PI_FIFO_START] = (u32)CPUFifo->base & ~OS_BASE_UNCACHED; + __piReg[PI_FIFO_END] = (u32)CPUFifo->top & ~OS_BASE_UNCACHED; + SET_REG_FIELD(0x5FB, reg, 21, 5, ((u32)CPUFifo->wrPtr & ~OS_BASE_UNCACHED) >> 5); +#if 0 + if ((((u32)CPUFifo->wrPtr & ~OS_BASE_UNCACHED) >> 5) & 0x7E00000) + OSErrorLine(0x5FB, "GX Internal: Register field out of range"); + reg = (reg & ~0x3FFFFE0) | (((u32)CPUFifo->wrPtr & ~OS_BASE_UNCACHED) & ~0x1F); + SET_REG_FIELD(0x5FB, reg, 25, 5, ((u32)CPUFifo->wrPtr & ~OS_BASE_UNCACHED) >> 5); +#endif reg &= 0xFBFFFFFF; - __piReg[5] = reg; + __piReg[PI_FIFO_PTR] = reg; if (CPGPLinked) { __GXWriteFifoIntReset(1, 1); __GXWriteFifoIntEnable(1, 0); diff --git a/src/gx/GXFrameBuf.c b/src/gx/GXFrameBuf.c index 0f621f9f..e6ec0c81 100644 --- a/src/gx/GXFrameBuf.c +++ b/src/gx/GXFrameBuf.c @@ -1,4 +1,5 @@ #include "Dolphin/gx.h" +#include "Dolphin/hw_regs.h" GXRenderModeObj GXNtsc240Ds = { 1, @@ -956,8 +957,8 @@ void GXClearBoundingBox(void) void GXReadBoundingBox(u16* left, u16* top, u16* right, u16* bottom) { CHECK_GXBEGIN(0x671, "GXReadBoundingBox"); - *left = __peReg[8]; - *top = __peReg[10]; - *right = __peReg[9]; - *bottom = __peReg[11]; + *left = __peReg[PE_BB_LEFT]; + *top = __peReg[PE_BB_TOP]; + *right = __peReg[PE_BB_RIGHT]; + *bottom = __peReg[PE_BB_BOTTOM]; } diff --git a/src/gx/GXInit.c b/src/gx/GXInit.c index ea24bc36..350fd9fa 100644 --- a/src/gx/GXInit.c +++ b/src/gx/GXInit.c @@ -1,14 +1,14 @@ #include "Dolphin/PPCArch.h" #include "Dolphin/gx.h" +#include "Dolphin/hw_regs.h" #include static struct __GXData_struct gxData; struct __GXData_struct* gx = &gxData; -// DWARF info lists all of these as "void *", but these types make more sense. -u16* __memReg; -u16* __peReg; -u16* __cpReg; -u32* __piReg; +vu16* __memReg; +vu16* __peReg; +vu16* __cpReg; +vu32* __piReg; #if DEBUG GXBool __GXinBegin; #endif @@ -214,7 +214,7 @@ GXFifoObj* GXInit(void* base, u32 size) for (i = 0; i < 4; i++) GXInitTlutRegion(&gx->TlutRegions[i + 16], 0xE0000 + i * 0x8000, 64); - __cpReg[3] = 0; + __cpReg[CP_PERF_SELECT] = 0; SET_REG_FIELD(0, gx->perfSel, 4, 4, 0); GXWGFifo.u8 = 8; GXWGFifo.u8 = 0x20; diff --git a/src/gx/GXMisc.c b/src/gx/GXMisc.c index 82877bd5..ffff980f 100644 --- a/src/gx/GXMisc.c +++ b/src/gx/GXMisc.c @@ -1,5 +1,6 @@ #include "Dolphin/PPCArch.h" #include "Dolphin/gx.h" +#include "Dolphin/hw_regs.h" #include static GXDrawSyncCallback TokenCB; @@ -91,9 +92,9 @@ static inline void __GXAbortWait(u32 clocks) void __GXAbort(void) { - __piReg[0x18 / 4] = 1; + __piReg[PI_FIFO_RESET] = 1; __GXAbortWait(200); - __piReg[0x18 / 4] = 0; + __piReg[PI_FIFO_RESET] = 0; __GXAbortWait(20); } @@ -135,7 +136,7 @@ void GXSetDrawSync(u16 token) */ u16 GXReadDrawSync(void) { - u16 token = __peReg[7]; + u16 token = __peReg[PE_TOKEN]; return token; } @@ -220,8 +221,8 @@ void GXPokeAlphaMode(GXCompare func, u8 threshold) u32 reg; // CHECK_GXBEGIN(0x25F, "GXPokeAlphaMode"); - reg = (func << 8) | threshold; - __peReg[3] = reg; + reg = (func << 8) | threshold; + __peReg[PE_ALPHA_MODE] = reg; } /** @@ -235,7 +236,7 @@ void GXPokeAlphaRead(GXAlphaReadMode mode) reg = 0; SET_REG_FIELD(642, reg, 2, 0, mode); SET_REG_FIELD(643, reg, 1, 2, 1); - __peReg[4] = reg; + __peReg[PE_ALPHA_READ] = reg; } /** @@ -246,9 +247,9 @@ void GXPokeAlphaUpdate(GXBool update_enable) u32 reg; // CHECK_GXBEGIN(0x277, "GXPokeAlphaUpdate"); - reg = __peReg[1]; + reg = __peReg[PE_ALPHA_CONFIG]; SET_REG_FIELD(653, reg, 1, 4, update_enable); - __peReg[1] = reg; + __peReg[PE_ALPHA_CONFIG] = reg; } /** @@ -259,7 +260,7 @@ void GXPokeBlendMode(GXBlendMode type, GXBlendFactor src_factor, GXBlendFactor d u32 reg; // CHECK_GXBEGIN(0x284, "GXPokeBlendUpdate"); - reg = __peReg[1]; + reg = __peReg[PE_ALPHA_CONFIG]; SET_REG_FIELD(669, reg, 1, 0, (type == GX_BM_BLEND) || (type == GX_BM_SUBTRACT)); SET_REG_FIELD(670, reg, 1, 11, (type == GX_BM_SUBTRACT)); SET_REG_FIELD(672, reg, 1, 1, (type == GX_BM_LOGIC)); @@ -267,7 +268,7 @@ void GXPokeBlendMode(GXBlendMode type, GXBlendFactor src_factor, GXBlendFactor d SET_REG_FIELD(674, reg, 3, 8, src_factor); SET_REG_FIELD(675, reg, 3, 5, dst_factor); SET_REG_FIELD(676, reg, 8, 24, 0x41); - __peReg[1] = reg; + __peReg[PE_ALPHA_CONFIG] = reg; } /** @@ -278,9 +279,9 @@ void GXPokeColorUpdate(GXBool update_enable) u32 reg; // CHECK_GXBEGIN(0x29D, "GXPokeColorUpdate"); - reg = __peReg[1]; + reg = __peReg[PE_ALPHA_CONFIG]; SET_REG_FIELD(687, reg, 1, 3, update_enable); - __peReg[1] = reg; + __peReg[PE_ALPHA_CONFIG] = reg; } /** @@ -293,7 +294,7 @@ void GXPokeDstAlpha(GXBool enable, u8 alpha) // CHECK_GXBEGIN(0x2A9, "GXPokeDstAlpha"); SET_REG_FIELD(696, reg, 8, 0, alpha); SET_REG_FIELD(697, reg, 1, 8, enable); - __peReg[2] = reg; + __peReg[PE_DEST_ALPHA_CONFIG] = reg; } /** @@ -304,9 +305,9 @@ void GXPokeDither(GXBool dither) u32 reg; // CHECK_GXBEGIN(0x2B5, "GXPokeDither"); - reg = __peReg[1]; + reg = __peReg[PE_ALPHA_CONFIG]; SET_REG_FIELD(707, reg, 1, 2, dither); - __peReg[1] = reg; + __peReg[PE_ALPHA_CONFIG] = reg; } /** @@ -321,7 +322,7 @@ void GXPokeZMode(GXBool compare_enable, GXCompare func, GXBool update_enable) SET_REG_FIELD(716, reg, 1, 0, compare_enable); SET_REG_FIELD(717, reg, 3, 1, func); SET_REG_FIELD(718, reg, 1, 4, update_enable); - __peReg[0] = reg; + __peReg[PE_Z_CONFIG] = reg; } /** @@ -405,7 +406,7 @@ static void GXTokenInterruptHandler(__OSInterrupt interrupt, OSContext* context) OSContext exceptionContext; u32 reg; - token = __peReg[7]; + token = __peReg[PE_TOKEN]; if (TokenCB != NULL) { OSClearContext(&exceptionContext); OSSetCurrentContext(&exceptionContext); @@ -413,9 +414,9 @@ static void GXTokenInterruptHandler(__OSInterrupt interrupt, OSContext* context) OSClearContext(&exceptionContext); OSSetCurrentContext(context); } - reg = __peReg[5]; + reg = __peReg[PE_CONTROL_REGISTER]; SET_REG_FIELD(0, reg, 1, 2, 1); - __peReg[5] = reg; + __peReg[PE_CONTROL_REGISTER] = reg; } /** @@ -442,10 +443,10 @@ static void GXFinishInterruptHandler(__OSInterrupt interrupt, OSContext* context OSContext exceptionContext; u32 reg; - reg = __peReg[5]; + reg = __peReg[PE_CONTROL_REGISTER]; SET_REG_FIELD(0, reg, 1, 3, 1); - __peReg[5] = reg; - DrawDone = 1; + __peReg[PE_CONTROL_REGISTER] = reg; + DrawDone = 1; if (DrawDoneCB != NULL) { OSClearContext(&exceptionContext); OSSetCurrentContext(&exceptionContext); @@ -467,12 +468,12 @@ void __GXPEInit(void) OSInitThreadQueue(&FinishQueue); __OSUnmaskInterrupts(OS_INTERRUPTMASK_PI_PE_TOKEN); __OSUnmaskInterrupts(OS_INTERRUPTMASK_PI_PE_FINISH); - reg = __peReg[5]; + reg = __peReg[PE_CONTROL_REGISTER]; SET_REG_FIELD(0, reg, 1, 2, 1); SET_REG_FIELD(0, reg, 1, 3, 1); SET_REG_FIELD(0, reg, 1, 0, 1); SET_REG_FIELD(0, reg, 1, 1, 1); - __peReg[5] = reg; + __peReg[PE_CONTROL_REGISTER] = reg; } /** diff --git a/src/gx/GXPerf.c b/src/gx/GXPerf.c index 065a3602..63d7573f 100644 --- a/src/gx/GXPerf.c +++ b/src/gx/GXPerf.c @@ -2,6 +2,7 @@ #include "Dolphin/GX/GXData.h" #include "Dolphin/GX/GXMisc.h" +#include "Dolphin/hw_regs.h" /** * @TODO: Documentation @@ -108,8 +109,8 @@ void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1) case GX_PERF1_VC_MISS_REQ: case GX_PERF1_CP_ALL_REQ: { - reg = 0; - __cpReg[3] = reg; + reg = 0; + __cpReg[CP_PERF_SELECT] = reg; break; } case GX_PERF1_NONE: @@ -452,26 +453,26 @@ void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1) } case GX_PERF1_FIFO_REQ: { - reg = 2; - __cpReg[3] = reg; + reg = 2; + __cpReg[CP_PERF_SELECT] = reg; break; } case GX_PERF1_CALL_REQ: { - reg = 3; - __cpReg[3] = reg; + reg = 3; + __cpReg[CP_PERF_SELECT] = reg; break; } case GX_PERF1_VC_MISS_REQ: { - reg = 4; - __cpReg[3] = reg; + reg = 4; + __cpReg[CP_PERF_SELECT] = reg; break; } case GX_PERF1_CP_ALL_REQ: { - reg = 5; - __cpReg[3] = reg; + reg = 5; + __cpReg[CP_PERF_SELECT] = reg; break; } case GX_PERF1_CLOCKS: @@ -505,20 +506,20 @@ void GXReadGPMetric(u32* cnt0, u32* cnt1) OSAssertMsgLine(0x286, !gx->inDispList, "GXReadGPMetric: don't use in a display list"); - ctrl = __cpReg[32]; - ctrh = __cpReg[33]; + ctrl = __cpReg[CP_XF_RASBUSY_LO]; + ctrh = __cpReg[CP_XF_RASBUSY_HI]; cpCtr0 = (ctrh << 16) | ctrl; - ctrl = __cpReg[34]; - ctrh = __cpReg[35]; + ctrl = __cpReg[CP_XF_CLKS_L0]; + ctrh = __cpReg[CP_XF_CLKS_HI]; cpCtr1 = (ctrh << 16) | ctrl; - ctrl = __cpReg[36]; - ctrh = __cpReg[37]; + ctrl = __cpReg[CP_XF_WAIT_IN_LO]; + ctrh = __cpReg[CP_XF_WAIT_IN_HI]; cpCtr2 = (ctrh << 16) | ctrl; - ctrl = __cpReg[38]; - ctrh = __cpReg[39]; + ctrl = __cpReg[CP_XF_WAIT_OUT_LO]; + ctrh = __cpReg[CP_XF_WAIT_OUT_HI]; cpCtr3 = (ctrh << 16) | ctrl; switch (gx->perf0) { @@ -651,8 +652,8 @@ void GXClearGPMetric(void) u32 reg; OSAssertMsgLine(0x322, !gx->inDispList, "GXClearGPMetric: don't use in a display list"); - reg = 4; - __cpReg[2] = reg; + reg = 4; + __cpReg[CP_CLEAR] = reg; } /** @@ -690,44 +691,44 @@ void GXReadMemMetric(u32* cp_req, u32* tc_req, u32* cpu_rd_req, u32* cpu_wr_req, OSAssertMsgLine(0x380, !gx->inDispList, "GXReadMemMetric: don't use in a display list"); - ctrl = __memReg[26]; - ctrh = __memReg[25]; + ctrl = __memReg[MEM_TIMER0_LO]; + ctrh = __memReg[MEM_TIMER0_HI]; *cp_req = (ctrh << 16) | ctrl; - ctrl = __memReg[28]; - ctrh = __memReg[27]; + ctrl = __memReg[MEM_TIMER1_LO]; + ctrh = __memReg[MEM_TIMER1_HI]; *tc_req = (ctrh << 16) | ctrl; - ctrl = __memReg[30]; - ctrh = __memReg[29]; + ctrl = __memReg[MEM_TIMER2_LO]; + ctrh = __memReg[MEM_TIMER2_HI]; *cpu_rd_req = (ctrh << 16) | ctrl; - ctrl = __memReg[32]; - ctrh = __memReg[31]; + ctrl = __memReg[MEM_TIMER3_LO]; + ctrh = __memReg[MEM_TIMER3_HI]; *cpu_wr_req = (ctrh << 16) | ctrl; - ctrl = __memReg[34]; - ctrh = __memReg[33]; + ctrl = __memReg[MEM_TIMER4_LO]; + ctrh = __memReg[MEM_TIMER4_HI]; *dsp_req = (ctrh << 16) | ctrl; - ctrl = __memReg[36]; - ctrh = __memReg[35]; + ctrl = __memReg[MEM_TIMER5_LO]; + ctrh = __memReg[MEM_TIMER5_HI]; *io_req = (ctrh << 16) | ctrl; - ctrl = __memReg[38]; - ctrh = __memReg[37]; + ctrl = __memReg[MEM_TIMER6_LO]; + ctrh = __memReg[MEM_TIMER6_HI]; *vi_req = (ctrh << 16) | ctrl; - ctrl = __memReg[40]; - ctrh = __memReg[39]; + ctrl = __memReg[MEM_TIMER7_LO]; + ctrh = __memReg[MEM_TIMER7_HI]; *pe_req = (ctrh << 16) | ctrl; - ctrl = __memReg[42]; - ctrh = __memReg[41]; + ctrl = __memReg[MEM_TIMER8_LO]; + ctrh = __memReg[MEM_TIMER8_HI]; *rf_req = (ctrh << 16) | ctrl; - ctrl = __memReg[44]; - ctrh = __memReg[43]; + ctrl = __memReg[MEM_TIMER9_LO]; + ctrh = __memReg[MEM_TIMER9_HI]; *fi_req = (ctrh << 16) | ctrl; } @@ -739,26 +740,26 @@ void GXClearMemMetric(void) { OSAssertMsgLine(0x3B9, !gx->inDispList, "GXClearMemMetric: don't use in a display list"); - __memReg[25] = 0; - __memReg[26] = 0; - __memReg[27] = 0; - __memReg[28] = 0; - __memReg[30] = 0; - __memReg[29] = 0; - __memReg[32] = 0; - __memReg[31] = 0; - __memReg[34] = 0; - __memReg[33] = 0; - __memReg[36] = 0; - __memReg[35] = 0; - __memReg[38] = 0; - __memReg[37] = 0; - __memReg[40] = 0; - __memReg[39] = 0; - __memReg[42] = 0; - __memReg[41] = 0; - __memReg[44] = 0; - __memReg[43] = 0; + __memReg[MEM_TIMER0_HI] = 0; + __memReg[MEM_TIMER0_LO] = 0; + __memReg[MEM_TIMER1_HI] = 0; + __memReg[MEM_TIMER1_LO] = 0; + __memReg[MEM_TIMER2_LO] = 0; + __memReg[MEM_TIMER2_HI] = 0; + __memReg[MEM_TIMER3_LO] = 0; + __memReg[MEM_TIMER3_HI] = 0; + __memReg[MEM_TIMER4_LO] = 0; + __memReg[MEM_TIMER4_HI] = 0; + __memReg[MEM_TIMER5_LO] = 0; + __memReg[MEM_TIMER5_HI] = 0; + __memReg[MEM_TIMER6_LO] = 0; + __memReg[MEM_TIMER6_HI] = 0; + __memReg[MEM_TIMER7_LO] = 0; + __memReg[MEM_TIMER7_HI] = 0; + __memReg[MEM_TIMER8_LO] = 0; + __memReg[MEM_TIMER8_HI] = 0; + __memReg[MEM_TIMER9_LO] = 0; + __memReg[MEM_TIMER9_HI] = 0; } /** @@ -771,28 +772,28 @@ void GXReadPixMetric(u32* top_pixels_in, u32* top_pixels_out, u32* bot_pixels_in OSAssertMsgLine(0x3F1, !gx->inDispList, "GXReadPixMetric: don't use in a display list"); - ctrl = __peReg[12]; - ctrh = __peReg[13]; + ctrl = __peReg[PE_PERF_ZCOMP_INPUT_ZCOMPLOC_LO]; + ctrh = __peReg[PE_PERF_ZCOMP_INPUT_ZCOMPLOC_HI]; *top_pixels_in = ((ctrh << 16) | ctrl) * 4; - ctrl = __peReg[14]; - ctrh = __peReg[15]; + ctrl = __peReg[PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_LO]; + ctrh = __peReg[PE_PERF_ZCOMP_OUTPUT_ZCOMPLOC_HI]; *top_pixels_out = ((ctrh << 16) | ctrl) * 4; - ctrl = __peReg[16]; - ctrh = __peReg[17]; + ctrl = __peReg[PE_PERF_ZCOMP_INPUT_LO]; + ctrh = __peReg[PE_PERF_ZCOMP_INPUT_HI]; *bot_pixels_in = ((ctrh << 16) | ctrl) * 4; - ctrl = __peReg[18]; - ctrh = __peReg[19]; + ctrl = __peReg[PE_PERF_ZCOMP_OUTPUT_LO]; + ctrh = __peReg[PE_PERF_ZCOMP_OUTPUT_HI]; *bot_pixels_out = ((ctrh << 16) | ctrl) * 4; - ctrl = __peReg[20]; - ctrh = __peReg[21]; + ctrl = __peReg[PE_PERF_BLEND_INPUT_LO]; + ctrh = __peReg[PE_PERF_BLEND_INPUT_HI]; *clr_pixels_in = ((ctrh << 16) | ctrl) * 4; - ctrl = __peReg[22]; - ctrh = __peReg[23]; + ctrl = __peReg[PE_PERF_EFB_COPY_CLOCKS_LO]; + ctrh = __peReg[PE_PERF_EFB_COPY_CLOCKS_HI]; *copy_clks = (ctrh << 16) | ctrl; } @@ -835,16 +836,16 @@ void GXReadVCacheMetric(u32* check, u32* miss, u32* stall) { u32 hi, lo; - hi = __cpReg[41]; - lo = __cpReg[40]; + hi = __cpReg[CP_VCACHE_METRIC_CHECK_HI]; + lo = __cpReg[CP_VCACHE_METRIC_CHECK_LO]; *check = (hi << 16) | lo; - hi = __cpReg[43]; - lo = __cpReg[42]; + hi = __cpReg[CP_VCACHE_METRIC_MISS_HI]; + lo = __cpReg[CP_VCACHE_METRIC_MISS_LO]; *miss = (hi << 16) | lo; - hi = __cpReg[45]; - lo = __cpReg[44]; + hi = __cpReg[CP_VCACHE_METRIC_STALL_HI]; + lo = __cpReg[CP_VCACHE_METRIC_STALL_LO]; *stall = (hi << 16) | lo; } @@ -882,20 +883,20 @@ void GXReadXfRasMetric(u32* xf_wait_in, u32* xf_wait_out, u32* ras_busy, u32* cl { u32 ctrl, ctrh; - ctrl = __cpReg[32]; - ctrh = __cpReg[33]; + ctrl = __cpReg[CP_XF_RASBUSY_LO]; + ctrh = __cpReg[CP_XF_RASBUSY_HI]; *ras_busy = (ctrh << 16) | ctrl; - ctrl = __cpReg[34]; - ctrh = __cpReg[35]; + ctrl = __cpReg[CP_XF_CLKS_L0]; + ctrh = __cpReg[CP_XF_CLKS_HI]; *clocks = (ctrh << 16) | ctrl; - ctrl = __cpReg[36]; - ctrh = __cpReg[37]; + ctrl = __cpReg[CP_XF_WAIT_IN_LO]; + ctrh = __cpReg[CP_XF_WAIT_IN_HI]; *xf_wait_in = (ctrh << 16) | ctrl; - ctrl = __cpReg[38]; - ctrh = __cpReg[39]; + ctrl = __cpReg[CP_XF_WAIT_OUT_LO]; + ctrh = __cpReg[CP_XF_WAIT_OUT_HI]; *xf_wait_out = (ctrh << 16) | ctrl; } @@ -909,10 +910,10 @@ u32 GXReadClksPerVtx(void) u32 ctrh; GXDrawDone(); - __cpReg[49] = 0x1007; - __cpReg[48] = 0x1007; + __cpReg[CP_CLKS_PER_VTX_IN_HI] = 0x1007; + __cpReg[CP_CLKS_PER_VTX_IN_LO] = 0x1007; - ctrh = __cpReg[50]; + ctrh = __cpReg[CP_CLKS_PER_VTX_OUT]; perfCnt = ctrh >> 8; return perfCnt; } diff --git a/src/hio/hio.c b/src/hio/hio.c index 3da09000..ea503e9e 100644 --- a/src/hio/hio.c +++ b/src/hio/hio.c @@ -46,7 +46,7 @@ static void DbgHandler(__OSInterrupt interrupt, OSContext* context) OSContext exceptionContext; #endif - __PIRegs[0] = 0x1000; + __PIRegs[PI_INTRPT_SRC] = PI_INTRPT_DEBUG; if (ExiCallback) { #if OS_BUILD_VERSION >= 20011112L OSClearContext(&exceptionContext); diff --git a/src/os/OSInterrupt.c b/src/os/OSInterrupt.c index a9ad277d..f99a4465 100644 --- a/src/os/OSInterrupt.c +++ b/src/os/OSInterrupt.c @@ -105,7 +105,7 @@ void __OSInterruptInit(void) __OSCurrentInterruptMask = 0; - __PIRegs[PI_INTRPT_MASK] = 0xF0; + __PIRegs[PI_INTRPT_MASK] = PI_INTRPT_EXI | PI_INTRPT_AI | PI_INTRPT_DSP | PI_INTRPT_MEM; __OSMaskInterrupts(OS_INTERRUPTMASK_MEM | OS_INTERRUPTMASK_DSP | OS_INTERRUPTMASK_AI | OS_INTERRUPTMASK_EXI | OS_INTERRUPTMASK_PI); @@ -244,37 +244,37 @@ static u32 SetInterruptMask(OSInterruptMask mask, OSInterruptMask current) case __OS_INTERRUPT_PI_PE_FINISH: case __OS_INTERRUPT_PI_HSP: { - reg = 0xF0; + reg = PI_INTRPT_EXI | PI_INTRPT_AI | PI_INTRPT_DSP | PI_INTRPT_MEM; if (!(current & OS_INTERRUPTMASK_PI_CP)) { - reg |= 0x800; + reg |= PI_INTRPT_CP; } if (!(current & OS_INTERRUPTMASK_PI_SI)) { - reg |= 0x8; + reg |= PI_INTRPT_SI; } if (!(current & OS_INTERRUPTMASK_PI_DI)) { - reg |= 0x4; + reg |= PI_INTRPT_DVD; } if (!(current & OS_INTERRUPTMASK_PI_RSW)) { - reg |= 0x2; + reg |= PI_INTRPT_RSW; } if (!(current & OS_INTERRUPTMASK_PI_ERROR)) { - reg |= 0x1; + reg |= PI_INTRPT_ERR; } if (!(current & OS_INTERRUPTMASK_PI_VI)) { - reg |= 0x100; + reg |= PI_INTRPT_VI; } if (!(current & OS_INTERRUPTMASK_PI_DEBUG)) { - reg |= 0x1000; + reg |= PI_INTRPT_DEBUG; } if (!(current & OS_INTERRUPTMASK_PI_PE_TOKEN)) { - reg |= 0x200; + reg |= PI_INTRPT_PE_TOKEN; } if (!(current & OS_INTERRUPTMASK_PI_PE_FINISH)) { - reg |= 0x400; + reg |= PI_INTRPT_PE_FINISH; } if (!(current & OS_INTERRUPTMASK_PI_HSP)) { - reg |= 0x2000; + reg |= PI_INTRPT_HSP; } __PIRegs[PI_INTRPT_MASK] = reg; mask &= ~OS_INTERRUPTMASK_PI; diff --git a/src/os/OSMemory.c b/src/os/OSMemory.c index b1196b1b..2e7ef61d 100644 --- a/src/os/OSMemory.c +++ b/src/os/OSMemory.c @@ -235,7 +235,7 @@ void __OSInitMemoryProtection() OSRegisterResetFunction(&ResetFunctionInfo); if (OSGetConsoleSimulatedMemSize() < OSGetPhysicalMemSize() && OSGetConsoleSimulatedMemSize() == 0x1800000) { - __MEMRegs[MEM_UNK_FLAG] = 2; + __MEMRegs[MEM_20] = 2; } __OSUnmaskInterrupts(OS_INTERRUPTMASK_MEM_ADDRESS); diff --git a/src/os/OSResetSW.c b/src/os/OSResetSW.c index 43403c40..507a205d 100644 --- a/src/os/OSResetSW.c +++ b/src/os/OSResetSW.c @@ -30,7 +30,7 @@ void __OSResetSWInterruptHandler(__OSInterrupt interrupt, OSContext* context) callback(); } } - __PIRegs[PI_INTRPT_SRC] = 2; + __PIRegs[PI_INTRPT_SRC] = PI_INTRPT_RSW; } /** @@ -58,8 +58,8 @@ BOOL OSGetResetButtonState(void) now = __OSGetSystemTime(); - reg = __PIRegs[0]; - if (!(reg & 0x00010000)) { + reg = __PIRegs[PI_INTRPT_SRC]; + if (!(reg & PI_INTRPT_RSWST)) { if (!Down) { Down = TRUE; state = HoldUp ? TRUE : FALSE; From a5178be801a166ff88ae5013382b1e65c7ce1a45 Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:16:21 -0500 Subject: [PATCH 05/10] Document DVD magic numbers --- src/dvd/dvd.c | 170 ++++++++++++++++++++++++------------------------ src/dvd/dvdfs.c | 2 +- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/dvd/dvd.c b/src/dvd/dvd.c index 5db4e6e9..7a702e21 100644 --- a/src/dvd/dvd.c +++ b/src/dvd/dvd.c @@ -114,13 +114,13 @@ static void cbForStateReadingFST(u32 p1) { DVDCommandBlock* cmdBlock; if (p1 == 0x10) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); } else if ((p1 & 1) != 0) { NumInternalRetry = 0; cmdBlock = executing; executing = &DummyCommandBlock; - cmdBlock->state = 0; + cmdBlock->state = DVD_STATE_END; if (cmdBlock->callback) { (cmdBlock->callback)(0, cmdBlock); } @@ -138,7 +138,7 @@ static void cbForStateError(u32 intType) DVDCommandBlock* finished; if (intType == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } @@ -239,7 +239,7 @@ static BOOL CheckCancel(u32 resume) finished = executing; executing = &DummyCommandBlock; - finished->state = 10; + finished->state = DVD_STATE_CANCELED; if (finished->callback) (*finished->callback)(-3, finished); if (CancelCallback) @@ -262,13 +262,13 @@ static void cbForStateGettingError(u32 intType) u32 resume; if (intType == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } if (intType & 2) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x1234567); return; } @@ -279,7 +279,7 @@ static void cbForStateGettingError(u32 intType) errorCategory = CategorizeError(error); if (errorCategory == 1) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(error); return; } @@ -316,19 +316,19 @@ static void cbForStateGettingError(u32 intType) } if (status == 0x01000000) { - executing->state = 5; + executing->state = DVD_STATE_COVER_OPEN; stateMotorStopped(); return; } else if (status == 0x02000000) { - executing->state = 3; + executing->state = DVD_STATE_COVER_CLOSED; stateCoverClosed(); return; } else if (status == 0x03000000) { - executing->state = 4; + executing->state = DVD_STATE_NO_DISK; stateMotorStopped(); return; } else { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x1234567); return; } @@ -340,7 +340,7 @@ static void cbForStateGettingError(u32 intType) static void cbForUnrecoveredError(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } @@ -361,14 +361,14 @@ static void cbForUnrecoveredError(u32 p1) static void cbForUnrecoveredErrorRetry(u32 p1) { if (p1 == 0x10) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; __DVDStoreErrorCode(0x1234568); DVDReset(); cbForStateError(0); return; } - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; if ((p1 & 2) != 0) { __DVDStoreErrorCode(0x1234567); @@ -396,13 +396,13 @@ void stateGoToRetry() void cbForStateGoToRetry(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } if (p1 & 2) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x1234567); return; } @@ -414,7 +414,7 @@ void cbForStateGoToRetry(u32 p1) } if (!CheckCancel(2)) { - executing->state = 11; + executing->state = DVD_STATE_RETRY; stateMotorStopped(); } } @@ -431,7 +431,7 @@ static void stateCheckID() DVDLowStopMotor(cbForStateCheckID1); } else { memcpy(currID, tmpBuffer, sizeof(DVDDiskID)); - executing->state = 1; + executing->state = DVD_STATE_BUSY; DCInvalidateRange(tmpBuffer, sizeof(DVDBB2)); LastState = stateCheckID2; stateCheckID2(executing); @@ -473,13 +473,13 @@ static void stateCheckID2(DVDCommandBlock* block) static void cbForStateCheckID1(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } if (p1 & 2) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x1234567); return; } @@ -487,7 +487,7 @@ static void cbForStateCheckID1(u32 p1) NumInternalRetry = 0; if (!CheckCancel(1)) { - executing->state = 6; + executing->state = DVD_STATE_WRONG_DISK; stateMotorStopped(); } } @@ -498,7 +498,7 @@ static void cbForStateCheckID1(u32 p1) static void cbForStateCheckID2(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } @@ -518,7 +518,7 @@ static void cbForStateCheckID2(u32 p1) static void cbForStateCheckID3(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } @@ -527,7 +527,7 @@ static void cbForStateCheckID3(u32 p1) NumInternalRetry = 0; if (!CheckCancel(0)) { - executing->state = 1; + executing->state = DVD_STATE_BUSY; stateBusy(executing); } @@ -592,7 +592,7 @@ static void stateCoverClosed_CMD(DVDCommandBlock* cmdBlock) static void cbForStateCoverClosed(u32 p1) { if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } @@ -619,7 +619,7 @@ static void stateMotorStopped() static void cbForStateMotorStopped(u32 p1) { __DIRegs[DI_COVER_STATUS] = 0; - executing->state = 3; + executing->state = DVD_STATE_COVER_CLOSED; stateCoverClosed(); } @@ -644,7 +644,7 @@ static void stateReady() executing = __DVDPopWaitingQueue(); if (FatalErrorFlag) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; finished = executing; executing = &DummyCommandBlock; if (finished->callback) { @@ -660,43 +660,43 @@ static void stateReady() switch (ResumeFromHere) { case 1: { - executing->state = 6; + executing->state = DVD_STATE_WRONG_DISK; stateMotorStopped(); break; } case 2: { - executing->state = 11; + executing->state = DVD_STATE_RETRY; stateMotorStopped(); break; } case 3: { - executing->state = 4; + executing->state = DVD_STATE_NO_DISK; stateMotorStopped(); break; } case 7: { - executing->state = 7; + executing->state = DVD_STATE_MOTOR_STOPPED; stateMotorStopped(); break; } case 4: { - executing->state = 5; + executing->state = DVD_STATE_COVER_OPEN; stateMotorStopped(); break; } case 6: { - executing->state = 3; + executing->state = DVD_STATE_COVER_CLOSED; stateCoverClosed(); break; } case 5: { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(CancelLastError); break; } @@ -705,7 +705,7 @@ static void stateReady() ResumeFromHere = 0; } else { - executing->state = 1; + executing->state = DVD_STATE_BUSY; stateBusy(executing); } } @@ -826,14 +826,14 @@ static void cbForStateBusy(u32 p1) DVDCommandBlock* finished; if (p1 == 16) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateTimeout(); return; } if ((CurrCommand == 3) || (CurrCommand == 15)) { if (p1 & 2) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x1234567); return; } @@ -848,7 +848,7 @@ static void cbForStateBusy(u32 p1) return; } - executing->state = 7; + executing->state = DVD_STATE_MOTOR_STOPPED; stateMotorStopped(); return; } @@ -862,7 +862,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 10; + finished->state = DVD_STATE_CANCELED; if (finished->callback) { (*finished->callback)(-3, finished); } @@ -889,7 +889,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 0; + finished->state = DVD_STATE_END; if (finished->callback) { (finished->callback)((s32)finished->transferredSize, finished); } @@ -905,7 +905,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 0; + finished->state = DVD_STATE_END; if (finished->callback) { (finished->callback)(result, finished); } @@ -916,7 +916,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 9; + finished->state = DVD_STATE_IGNORED; if (finished->callback) { (finished->callback)(-2, finished); } @@ -930,7 +930,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 0; + finished->state = DVD_STATE_END; if (finished->callback) { (finished->callback)(0, finished); } @@ -940,7 +940,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 0; + finished->state = DVD_STATE_END; if (finished->callback) { (finished->callback)(0, finished); } @@ -949,7 +949,7 @@ static void cbForStateBusy(u32 p1) } else { if (CurrCommand == 14) { - executing->state = -1; + executing->state = DVD_STATE_FATAL_ERROR; stateError(0x01234567); return; } @@ -963,7 +963,7 @@ static void cbForStateBusy(u32 p1) finished = executing; executing = &DummyCommandBlock; - finished->state = 0; + finished->state = DVD_STATE_END; if (finished->callback) { (finished->callback)((s32)finished->transferredSize, finished); } @@ -989,7 +989,7 @@ static BOOL issueCommand(s32 prio, DVDCommandBlock* block) enabled = OSDisableInterrupts(); - block->state = 2; + block->state = DVD_STATE_WAITING; result = __DVDPushWaitingQueue(prio, (DVDQueue*)block); if ((executing == NULL) && (PauseFlag == FALSE)) { @@ -1112,7 +1112,7 @@ BOOL DVDCancelStream(DVDCommandBlock* block) while (TRUE) { state = ((volatile DVDCommandBlock*)block)->state; - if (state == 0 || state == -1 || state == 10) { + if (state == DVD_STATE_END || state == DVD_STATE_FATAL_ERROR || state == DVD_STATE_CANCELED) { retVal = (s32)block->transferredSize; break; } @@ -1369,8 +1369,8 @@ s32 DVDGetCommandBlockStatus(const DVDCommandBlock* block) { int interrupts = OSDisableInterrupts(); int result; - if (block->state == 3) { - result = 1; + if (block->state == DVD_STATE_COVER_CLOSED) { + result = DVD_STATE_BUSY; } else { result = block->state; } @@ -1458,15 +1458,15 @@ BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback) enabled = OSDisableInterrupts(); switch (block->state) { - case -1: - case 0: - case 10: + case DVD_STATE_FATAL_ERROR: + case DVD_STATE_END: + case DVD_STATE_CANCELED: { if (callback) (*callback)(0, block); break; } - case 1: + case DVD_STATE_BUSY: { if (Canceling) { OSRestoreInterrupts(enabled); @@ -1480,17 +1480,17 @@ BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback) } break; } - case 2: + case DVD_STATE_WAITING: { __DVDDequeueWaitingQueue((DVDQueue*)block); - block->state = 10; + block->state = DVD_STATE_CANCELED; if (block->callback) (block->callback)(-3, block); if (callback) (*callback)(0, block); break; } - case 3: + case DVD_STATE_COVER_CLOSED: { switch (block->command) { case 5: @@ -1515,11 +1515,11 @@ BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback) } break; } - case 4: - case 5: - case 6: - case 7: - case 11: + case DVD_STATE_NO_DISK: + case DVD_STATE_COVER_OPEN: + case DVD_STATE_WRONG_DISK: + case DVD_STATE_MOTOR_STOPPED: + case DVD_STATE_RETRY: { old = DVDLowClearCallback(); if (old != cbForStateMotorStopped) { @@ -1527,18 +1527,18 @@ BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback) return FALSE; } - if (block->state == 4) + if (block->state == DVD_STATE_NO_DISK) ResumeFromHere = 3; - if (block->state == 5) + if (block->state == DVD_STATE_COVER_OPEN) ResumeFromHere = 4; - if (block->state == 6) + if (block->state == DVD_STATE_WRONG_DISK) ResumeFromHere = 1; - if (block->state == 11) + if (block->state == DVD_STATE_RETRY) ResumeFromHere = 2; - if (block->state == 7) + if (block->state == DVD_STATE_MOTOR_STOPPED) ResumeFromHere = 7; - block->state = 10; + block->state = DVD_STATE_CANCELED; if (block->callback) { (block->callback)(-3, block); } @@ -1672,41 +1672,41 @@ BOOL DVDCheckDisk() enabled = OSDisableInterrupts(); if (FatalErrorFlag) { - state = -1; + state = DVD_STATE_FATAL_ERROR; } else if (PausingFlag) { - state = 8; + state = DVD_STATE_PAUSING; } else { if (executing == NULL) { - state = 0; + state = DVD_STATE_END; } else if (executing == &DummyCommandBlock) { - state = 0; + state = DVD_STATE_END; } else { state = executing->state; } } switch (state) { - case 1: - case 9: - case 10: - case 2: + case DVD_STATE_BUSY: + case DVD_STATE_IGNORED: + case DVD_STATE_CANCELED: + case DVD_STATE_WAITING: { result = TRUE; break; } - case -1: - case 11: - case 7: - case 3: - case 4: - case 5: - case 6: + case DVD_STATE_FATAL_ERROR: + case DVD_STATE_RETRY: + case DVD_STATE_MOTOR_STOPPED: + case DVD_STATE_COVER_CLOSED: + case DVD_STATE_NO_DISK: + case DVD_STATE_COVER_OPEN: + case DVD_STATE_WRONG_DISK: { result = FALSE; break; } - case 0: - case 8: + case DVD_STATE_END: + case DVD_STATE_PAUSING: { coverReg = __DIRegs[DI_COVER_STATUS]; if (((coverReg >> 2) & 1) || (coverReg & 1)) { diff --git a/src/dvd/dvdfs.c b/src/dvd/dvdfs.c index b6c0f4ea..20a3a74c 100644 --- a/src/dvd/dvdfs.c +++ b/src/dvd/dvdfs.c @@ -400,7 +400,7 @@ s32 DVDReadPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, s32 p result = DVDReadAbsAsyncPrio(block, addr, length, (s32)(fileInfo->startAddr + offset), cbForReadSync, prio); if (result == FALSE) { - return -1; + return DVD_RESULT_FATAL_ERROR; } enabled = OSDisableInterrupts(); From 0db0a74b275b60da69459569d6bb2d808e28cc7e Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:18:11 -0500 Subject: [PATCH 06/10] Rename parameters in CARDBios.c to `chan` This is typical in other files, and even required in one place for an assertion to compile. --- src/card/CARDBios.c | 252 ++++++++++++++++++++++---------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/src/card/CARDBios.c b/src/card/CARDBios.c index 123314b9..44e50636 100644 --- a/src/card/CARDBios.c +++ b/src/card/CARDBios.c @@ -31,33 +31,33 @@ void __CARDDefaultApiCallback(s32, s32) /** * @TODO: Documentation */ -void __CARDSyncCallback(s32 channel, s32 result) +void __CARDSyncCallback(s32 chan, s32 result) { - OSWakeupThread(&__CARDBlock[channel].threadQueue); + OSWakeupThread(&__CARDBlock[chan].threadQueue); } /** * @TODO: Documentation */ -void __CARDExtHandler(s32 channel, OSContext* context) +void __CARDExtHandler(s32 chan, OSContext* context) { CARDControl* card; CARDCallback callback; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; if (card->attached) { card->attached = FALSE; #if OS_BUILD_VERSION >= 20011002L #else card->result = CARD_RESULT_NOCARD; #endif - EXISetExiCallback(channel, NULL); + EXISetExiCallback(chan, NULL); OSCancelAlarm(&card->alarm); callback = card->exiCallback; if (callback) { card->exiCallback = NULL; - callback(channel, CARD_RESULT_NOCARD); + callback(chan, CARD_RESULT_NOCARD); } #if OS_BUILD_VERSION >= 20011002L @@ -69,7 +69,7 @@ void __CARDExtHandler(s32 channel, OSContext* context) callback = card->extCallback; if (callback && CARD_MAX_MOUNT_STEP <= card->mountStep) { card->extCallback = NULL; - callback(channel, CARD_RESULT_NOCARD); + callback(chan, CARD_RESULT_NOCARD); } } } @@ -77,7 +77,7 @@ void __CARDExtHandler(s32 channel, OSContext* context) /** * @TODO: Documentation */ -void __CARDExiHandler(s32 channel, OSContext* context) +void __CARDExiHandler(s32 chan, OSContext* context) { CARDControl* card; CARDCallback callback; @@ -86,7 +86,7 @@ void __CARDExiHandler(s32 channel, OSContext* context) OSAssertLine(0xDC, 0 <= chan && chan < 2); - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; OSCancelAlarm(&card->alarm); @@ -94,17 +94,17 @@ void __CARDExiHandler(s32 channel, OSContext* context) return; } - if (!EXILock(channel, 0, 0)) { + if (!EXILock(chan, 0, 0)) { result = CARD_RESULT_FATAL_ERROR; goto fatal; } - if ((result = __CARDReadStatus(channel, &status)) < 0 || (result = __CARDClearStatus(channel)) < 0) { + if ((result = __CARDReadStatus(chan, &status)) < 0 || (result = __CARDClearStatus(chan)) < 0) { goto error; } if ((result = (status & 0x18) ? CARD_RESULT_IOERROR : CARD_RESULT_READY) == CARD_RESULT_IOERROR && --card->retry > 0) { - result = Retry(channel); + result = Retry(chan); if (result >= CARD_RESULT_READY) { return; } @@ -112,70 +112,70 @@ void __CARDExiHandler(s32 channel, OSContext* context) } error: - EXIUnlock(channel); + EXIUnlock(chan); fatal: callback = card->exiCallback; if (callback) { card->exiCallback = NULL; - callback(channel, result); + callback(chan, result); } } /** * @TODO: Documentation */ -void __CARDTxHandler(s32 channel, OSContext* context) +void __CARDTxHandler(s32 chan, OSContext* context) { CARDControl* card; CARDCallback callback; BOOL err; - card = &__CARDBlock[channel]; - err = !EXIDeselect(channel); - EXIUnlock(channel); + card = &__CARDBlock[chan]; + err = !EXIDeselect(chan); + EXIUnlock(chan); callback = card->txCallback; if (callback) { card->txCallback = NULL; - callback(channel, (!err && EXIProbe(channel)) ? CARD_RESULT_READY : CARD_RESULT_NOCARD); + callback(chan, (!err && EXIProbe(chan)) ? CARD_RESULT_READY : CARD_RESULT_NOCARD); } } /** * @TODO: Documentation */ -void __CARDUnlockedHandler(s32 channel, OSContext* context) +void __CARDUnlockedHandler(s32 chan, OSContext* context) { CARDControl* card; CARDCallback callback; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; callback = card->unlockCallback; if (callback) { card->unlockCallback = NULL; - callback(channel, EXIProbe(channel) ? CARD_RESULT_UNLOCKED : CARD_RESULT_NOCARD); + callback(chan, EXIProbe(chan) ? CARD_RESULT_UNLOCKED : CARD_RESULT_NOCARD); } } /** * @TODO: Documentation */ -int __CARDReadNintendoID(s32 channel, u32* id) +int __CARDReadNintendoID(s32 chan, u32* id) { BOOL err; u32 cmd; - if (!EXISelect(channel, 0, 0)) { + if (!EXISelect(chan, 0, 0)) { return CARD_RESULT_NOCARD; } cmd = 0; err = 0; - err |= !EXIImm(channel, &cmd, 2, EXI_WRITE, NULL); - err |= !EXISync(channel); - err |= !EXIImm(channel, id, 4, EXI_READ, NULL); - err |= !EXISync(channel); - err |= !EXIDeselect(channel); + err |= !EXIImm(chan, &cmd, 2, EXI_WRITE, NULL); + err |= !EXISync(chan); + err |= !EXIImm(chan, id, 4, EXI_READ, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); if (err) { return CARD_RESULT_NOCARD; @@ -191,62 +191,62 @@ int __CARDReadNintendoID(s32 channel, u32* id) /** * @TODO: Documentation */ -s32 __CARDEnableInterrupt(s32 channel, BOOL enable) +s32 __CARDEnableInterrupt(s32 chan, BOOL enable) { BOOL err; u32 cmd; - if (!EXISelect(channel, 0, 4)) { + if (!EXISelect(chan, 0, 4)) { return CARD_RESULT_NOCARD; } cmd = enable ? 0x81010000 : 0x81000000; err = FALSE; - err |= !EXIImm(channel, &cmd, 2, 1, NULL); - err |= !EXISync(channel); - err |= !EXIDeselect(channel); + err |= !EXIImm(chan, &cmd, 2, 1, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; } /** * @TODO: Documentation */ -s32 __CARDReadStatus(s32 channel, u8* status) +s32 __CARDReadStatus(s32 chan, u8* status) { BOOL err; u32 cmd; - if (!EXISelect(channel, 0, 4)) { + if (!EXISelect(chan, 0, 4)) { return CARD_RESULT_NOCARD; } cmd = 0x83000000; err = FALSE; - err |= !EXIImm(channel, &cmd, 2, 1, NULL); - err |= !EXISync(channel); - err |= !EXIImm(channel, status, 1, 0, NULL); - err |= !EXISync(channel); - err |= !EXIDeselect(channel); + err |= !EXIImm(chan, &cmd, 2, 1, NULL); + err |= !EXISync(chan); + err |= !EXIImm(chan, status, 1, 0, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; } /** * @TODO: Documentation */ -s32 __CARDClearStatus(s32 channel) +s32 __CARDClearStatus(s32 chan) { BOOL err; u32 cmd; - if (!EXISelect(channel, 0, 4)) { + if (!EXISelect(chan, 0, 4)) { return CARD_RESULT_NOCARD; } cmd = 0x89000000; err = FALSE; - err |= !EXIImm(channel, &cmd, 1, 1, NULL); - err |= !EXISync(channel); - err |= !EXIDeselect(channel); + err |= !EXIImm(chan, &cmd, 1, 1, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; } @@ -274,11 +274,11 @@ void __CARDWakeup(void) */ static void TimeoutHandler(OSAlarm* alarm, OSContext* context) { - s32 channel; + s32 chan; CARDControl* card; CARDCallback callback; - for (channel = 0; channel < 2; channel++) { - card = &__CARDBlock[channel]; + for (chan = 0; chan < 2; chan++) { + card = &__CARDBlock[chan]; if (alarm == &card->alarm) { break; } @@ -288,11 +288,11 @@ static void TimeoutHandler(OSAlarm* alarm, OSContext* context) return; } - EXISetExiCallback(channel, NULL); + EXISetExiCallback(chan, NULL); callback = card->exiCallback; if (callback) { card->exiCallback = NULL; - callback(channel, CARD_RESULT_IOERROR); + callback(chan, CARD_RESULT_IOERROR); } } @@ -325,39 +325,39 @@ static void SetupTimeoutAlarm(CARDControl* card) /** * @TODO: Documentation */ -static s32 Retry(s32 channel) +static s32 Retry(s32 chan) { CARDControl* card; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; - if (!EXISelect(channel, 0, 4)) { - EXIUnlock(channel); + if (!EXISelect(chan, 0, 4)) { + EXIUnlock(chan); return CARD_RESULT_NOCARD; } SetupTimeoutAlarm(card); - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1)) { - EXIDeselect(channel); - EXIUnlock(channel); + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1)) { + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_NOCARD; } - if (card->cmd[0] == 0x52 && !EXIImmEx(channel, card->workArea->header.buffer, card->latency, 1)) { - EXIDeselect(channel); - EXIUnlock(channel); + if (card->cmd[0] == 0x52 && !EXIImmEx(chan, card->workArea->header.buffer, card->latency, 1)) { + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_NOCARD; } if (card->mode == 0xffffffff) { - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_READY; } - if (!EXIDma(channel, card->buffer, (s32)((card->cmd[0] == 0x52) ? 512 : 128), card->mode, __CARDTxHandler)) { - EXIDeselect(channel); - EXIUnlock(channel); + if (!EXIDma(chan, card->buffer, (s32)((card->cmd[0] == 0x52) ? 512 : 128), card->mode, __CARDTxHandler)) { + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_NOCARD; } @@ -367,19 +367,19 @@ static s32 Retry(s32 channel) /** * @TODO: Documentation */ -static void UnlockedCallback(s32 channel, s32 result) +static void UnlockedCallback(s32 chan, s32 result) { CARDCallback callback; CARDControl* card; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; if (result >= CARD_RESULT_READY) { card->unlockCallback = UnlockedCallback; - if (!EXILock(channel, 0, __CARDUnlockedHandler)) { + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { result = CARD_RESULT_READY; } else { card->unlockCallback = NULL; - result = Retry(channel); + result = Retry(chan); } } @@ -390,7 +390,7 @@ static void UnlockedCallback(s32 channel, s32 result) callback = card->txCallback; if (callback) { card->txCallback = NULL; - callback(channel, result); + callback(chan, result); } break; } @@ -401,7 +401,7 @@ static void UnlockedCallback(s32 channel, s32 result) callback = card->exiCallback; if (callback) { card->exiCallback = NULL; - callback(channel, result); + callback(chan, result); } break; } @@ -412,7 +412,7 @@ static void UnlockedCallback(s32 channel, s32 result) /** * @TODO: Documentation */ -static s32 __CARDStart(s32 channel, CARDCallback txCallback, CARDCallback exiCallback) +static s32 __CARDStart(s32 chan, CARDCallback txCallback, CARDCallback exiCallback) { #if OS_BUILD_VERSION >= 20011002L BOOL enabled; @@ -424,7 +424,7 @@ static s32 __CARDStart(s32 channel, CARDCallback txCallback, CARDCallback exiCal enabled = OSDisableInterrupts(); #endif - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; if (!card->attached) { result = CARD_RESULT_NOCARD; } else { @@ -436,13 +436,13 @@ static s32 __CARDStart(s32 channel, CARDCallback txCallback, CARDCallback exiCal card->exiCallback = exiCallback; } card->unlockCallback = UnlockedCallback; - if (!EXILock(channel, 0, __CARDUnlockedHandler)) { + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { result = CARD_RESULT_BUSY; } else { card->unlockCallback = NULL; - if (!EXISelect(channel, 0, 4)) { - EXIUnlock(channel); + if (!EXISelect(chan, 0, 4)) { + EXIUnlock(chan); result = CARD_RESULT_NOCARD; } else { SetupTimeoutAlarm(card); @@ -461,12 +461,12 @@ static s32 __CARDStart(s32 channel, CARDCallback txCallback, CARDCallback exiCal /** * @TODO: Documentation */ -s32 __CARDReadSegment(s32 channel, CARDCallback callback) +s32 __CARDReadSegment(s32 chan, CARDCallback callback) { CARDControl* card; s32 result; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; card->cmd[0] = 0x52; card->cmd[1] = AD1(card->addr); card->cmd[2] = AD2(card->addr); @@ -476,21 +476,21 @@ s32 __CARDReadSegment(s32 channel, CARDCallback callback) card->mode = 0; card->retry = 0; - result = __CARDStart(channel, callback, 0); + result = __CARDStart(chan, callback, 0); if (result == CARD_RESULT_BUSY) { return CARD_RESULT_READY; } #if OS_BUILD_VERSION >= 20011002L if (result >= CARD_RESULT_READY) { - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1) - || !EXIImmEx(channel, card->workArea->header.buffer, card->latency, + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) + || !EXIImmEx(chan, card->workArea->header.buffer, card->latency, 1) || // XXX use DMA if possible - !EXIDma(channel, card->buffer, 512, card->mode, __CARDTxHandler)) { + !EXIDma(chan, card->buffer, 512, card->mode, __CARDTxHandler)) { card->txCallback = 0; - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); result = CARD_RESULT_NOCARD; } else { result = CARD_RESULT_READY; @@ -502,14 +502,14 @@ s32 __CARDReadSegment(s32 channel, CARDCallback callback) return result; } - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1) - || !EXIImmEx(channel, card->workArea->header.buffer, card->latency, + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) + || !EXIImmEx(chan, card->workArea->header.buffer, card->latency, 1) || // XXX use DMA if possible - !EXIDma(channel, card->buffer, 512, card->mode, __CARDTxHandler)) { + !EXIDma(chan, card->buffer, 512, card->mode, __CARDTxHandler)) { card->txCallback = 0; - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_NOCARD; } return CARD_RESULT_READY; @@ -519,12 +519,12 @@ s32 __CARDReadSegment(s32 channel, CARDCallback callback) /** * @TODO: Documentation */ -s32 __CARDWritePage(s32 channel, CARDCallback callback) +s32 __CARDWritePage(s32 chan, CARDCallback callback) { CARDControl* card; s32 result; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; card->cmd[0] = 0xF2; card->cmd[1] = AD1(card->addr); card->cmd[2] = AD2(card->addr); @@ -534,15 +534,15 @@ s32 __CARDWritePage(s32 channel, CARDCallback callback) card->mode = 1; card->retry = 3; - result = __CARDStart(channel, NULL, callback); + result = __CARDStart(chan, NULL, callback); #if OS_BUILD_VERSION >= 20011002L if (result == CARD_RESULT_BUSY) { result = CARD_RESULT_READY; } else if (result >= CARD_RESULT_READY) { - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1) || !EXIDma(channel, card->buffer, 128, card->mode, __CARDTxHandler)) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) || !EXIDma(chan, card->buffer, 128, card->mode, __CARDTxHandler)) { card->exiCallback = 0; - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); result = CARD_RESULT_NOCARD; } else result = CARD_RESULT_READY; @@ -555,10 +555,10 @@ s32 __CARDWritePage(s32 channel, CARDCallback callback) if (result < CARD_RESULT_READY) { return result; } - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1) || !EXIDma(channel, card->buffer, 128, card->mode, __CARDTxHandler)) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) || !EXIDma(chan, card->buffer, 128, card->mode, __CARDTxHandler)) { card->exiCallback = NULL; - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); return CARD_RESULT_NOCARD; } return CARD_RESULT_READY; @@ -577,12 +577,12 @@ void __CARDErase(void) /** * @TODO: Documentation */ -s32 __CARDEraseSector(s32 channel, u32 addr, CARDCallback callback) +s32 __CARDEraseSector(s32 chan, u32 addr, CARDCallback callback) { CARDControl* card; s32 result; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; card->cmd[0] = 0xF1; card->cmd[1] = AD1(addr); card->cmd[2] = AD2(addr); @@ -590,21 +590,21 @@ s32 __CARDEraseSector(s32 channel, u32 addr, CARDCallback callback) card->mode = -1; card->retry = 3; - result = __CARDStart(channel, NULL, callback); + result = __CARDStart(chan, NULL, callback); #if OS_BUILD_VERSION >= 20011002L if (result == CARD_RESULT_BUSY) { result = CARD_RESULT_READY; } else if (result >= CARD_RESULT_READY) { result = CARD_RESULT_READY; - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1)) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1)) { result = CARD_RESULT_NOCARD; card->exiCallback = NULL; } else { result = CARD_RESULT_READY; } - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); } #else @@ -617,12 +617,12 @@ s32 __CARDEraseSector(s32 channel, u32 addr, CARDCallback callback) } result = CARD_RESULT_READY; - if (!EXIImmEx(channel, card->cmd, card->cmdlen, 1)) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1)) { result = CARD_RESULT_NOCARD; card->exiCallback = NULL; } - EXIDeselect(channel); - EXIUnlock(channel); + EXIDeselect(chan); + EXIUnlock(chan); #endif return result; } @@ -632,7 +632,7 @@ s32 __CARDEraseSector(s32 channel, u32 addr, CARDCallback callback) */ void CARDInit(void) { - s32 channel; + s32 chan; #if OS_BUILD_VERSION >= 20011112L if (__CARDBlock[0].diskID && __CARDBlock[1].diskID) @@ -646,8 +646,8 @@ void CARDInit(void) DSPInit(); OSInitAlarm(); - for (channel = 0; channel < 2; channel++) { - CARDControl* card = &__CARDBlock[channel]; + for (chan = 0; chan < 2; chan++) { + CARDControl* card = &__CARDBlock[chan]; card->result = CARD_RESULT_NOCARD; OSInitThreadQueue(&card->threadQueue); @@ -675,25 +675,25 @@ void __CARDSetDiskID(DVDDiskID* diskID) /** * @TODO: Documentation */ -s32 __CARDGetControlBlock(s32 channel, CARDControl** card) +s32 __CARDGetControlBlock(s32 chan, CARDControl** card) { BOOL enabled; s32 result; CARDControl* reqCard; #if OS_BUILD_VERSION >= 20011112L - reqCard = &__CARDBlock[channel]; - if (channel < 0 || channel >= 2 || reqCard->diskID == NULL) { + reqCard = &__CARDBlock[chan]; + if (chan < 0 || chan >= 2 || reqCard->diskID == NULL) { return CARD_RESULT_FATAL_ERROR; } enabled = OSDisableInterrupts(); #else - if (channel < 0 || channel >= 2 || __CARDDiskID == NULL) { + if (chan < 0 || chan >= 2 || __CARDDiskID == NULL) { return CARD_RESULT_FATAL_ERROR; } enabled = OSDisableInterrupts(); - reqCard = &__CARDBlock[channel]; + reqCard = &__CARDBlock[chan]; #endif if (!reqCard->attached) { result = CARD_RESULT_NOCARD; @@ -737,22 +737,22 @@ s32 __CARDPutControlBlock(CARDControl* card, s32 result) /** * @TODO: Documentation */ -s32 CARDGetResultCode(s32 channel) +s32 CARDGetResultCode(s32 chan) { CARDControl* card; - if (channel < 0 || channel >= 2) { + if (chan < 0 || chan >= 2) { return CARD_RESULT_FATAL_ERROR; } - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; return card->result; } /** * @TODO: Documentation */ -s32 CARDFreeBlocks(s32 channel, s32* byteNotUsed, s32* filesNotUsed) +s32 CARDFreeBlocks(s32 chan, s32* byteNotUsed, s32* filesNotUsed) { CARDControl* card; s32 result; @@ -761,7 +761,7 @@ s32 CARDFreeBlocks(s32 channel, s32* byteNotUsed, s32* filesNotUsed) CARDDir* ent; u16 fileNo; - result = __CARDGetControlBlock(channel, &card); + result = __CARDGetControlBlock(chan, &card); if (result < CARD_RESULT_READY) { return result; } @@ -810,12 +810,12 @@ void CARDGetMemSize(void) /** * @TODO: Documentation */ -s32 CARDGetSectorSize(s32 channel, u32* size) +s32 CARDGetSectorSize(s32 chan, u32* size) { CARDControl* card; s32 result; - result = __CARDGetControlBlock(channel, &card); + result = __CARDGetControlBlock(chan, &card); if (result < CARD_RESULT_READY) { return result; } @@ -826,16 +826,16 @@ s32 CARDGetSectorSize(s32 channel, u32* size) /** * @TODO: Documentation */ -s32 __CARDSync(s32 channel) +s32 __CARDSync(s32 chan) { CARDControl* card; s32 result; BOOL enabled; - card = &__CARDBlock[channel]; + card = &__CARDBlock[chan]; enabled = OSDisableInterrupts(); - while ((result = CARDGetResultCode(channel)) == CARD_RESULT_BUSY) { + while ((result = CARDGetResultCode(chan)) == CARD_RESULT_BUSY) { OSSleepThread(&card->threadQueue); } From d56963b09fe628273bc913da0b30f79941034e5e Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:19:11 -0500 Subject: [PATCH 07/10] Remove hungarian notation from POD GX structs This is atypical for POD structs from Dolphin OS. --- include/Dolphin/GX/GXTypes.h | 12 ++++++------ src/gx/GXAttr.c | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/include/Dolphin/GX/GXTypes.h b/include/Dolphin/GX/GXTypes.h index 93ff6d4f..57dc872f 100644 --- a/include/Dolphin/GX/GXTypes.h +++ b/include/Dolphin/GX/GXTypes.h @@ -110,16 +110,16 @@ typedef struct __GXLightObjPriv { /////////////// VERTEX INFO //////////////// // Struct for vertex descriptive info. typedef struct _GXVtxDescList { - GXAttr mAttr; // _00 - GXAttrType mType; // _04 + GXAttr attr; // _00 + GXAttrType type; // _04 } GXVtxDescList; // Struct for vertex attribute formats. typedef struct _GXVtxAttrFmtList { - GXAttr mAttr; // _00 - GXCompCnt mCount; // _04 - GXCompType mType; // _08 - u8 mFrac; // _0C + GXAttr attr; // _00 + GXCompCnt count; // _04 + GXCompType type; // _08 + u8 frac; // _0C } GXVtxAttrFmtList; //////////////////////////////////////////// diff --git a/src/gx/GXAttr.c b/src/gx/GXAttr.c index 289739b9..712c3469 100644 --- a/src/gx/GXAttr.c +++ b/src/gx/GXAttr.c @@ -215,10 +215,10 @@ void GXSetVtxDescv(GXVtxDescList* attrPtr) { CHECK_GXBEGIN(0xF5, "GXSetVtxDescv"); CHECK_ATTRPTR(0xF6, attrPtr); - while (attrPtr->mAttr != 0xFF) { - CHECK_ATTRNAME(0xFB, attrPtr->mAttr); - CHECK_ATTRTYPE(0xFE, attrPtr->mType); - SETVCDATTR(attrPtr->mAttr, attrPtr->mType); + while (attrPtr->attr != 0xFF) { + CHECK_ATTRNAME(0xFB, attrPtr->attr); + CHECK_ATTRTYPE(0xFE, attrPtr->type); + SETVCDATTR(attrPtr->attr, attrPtr->type); attrPtr++; } if (gx->hasNrms || gx->hasBiNrms) { @@ -416,10 +416,10 @@ void GXGetVtxDescv(GXVtxDescList* vcd) CHECK_GXBEGIN(0x1BA, "GXGetVtxDescv"); CHECK_ATTRPTR(0x1BC, vcd); for (attr = 0; attr < GX_VA_MAX_ATTR; attr++) { - vcd[attr].mAttr = attr; - GXGetVtxDesc(attr, &vcd[attr].mType); + vcd[attr].attr = attr; + GXGetVtxDesc(attr, &vcd[attr].type); } - vcd[attr].mAttr = 0xFF; + vcd[attr].attr = 0xFF; } /** @@ -566,10 +566,10 @@ void GXSetVtxAttrFmtv(GXVtxFmt vtxfmt, GXVtxAttrFmtList* list) va = &gx->vatA[vtxfmt]; vb = &gx->vatB[vtxfmt]; vc = &gx->vatC[vtxfmt]; - while (list->mAttr != GX_VA_NULL) { + while (list->attr != GX_VA_NULL) { CHECK_ATTRNAME2(0x286, list->attr); CHECK_FRAC(0x287, list->frac); - SETVAT(va, vb, vc, list->mAttr, list->mCount, list->mType, list->mFrac); + SETVAT(va, vb, vc, list->attr, list->count, list->type, list->frac); list++; } gx->dirtyState |= 0x10; @@ -719,11 +719,11 @@ void GXGetVtxAttrFmtv(GXVtxFmt fmt, GXVtxAttrFmtList* vat) CHECK_LISTPTR(0x331, vat); CHECK_VTXFMT(0x332, fmt); for (attr = GX_VA_POS; attr < GX_VA_MAX_ATTR; attr++) { - vat->mAttr = attr; - GXGetVtxAttrFmt(fmt, attr, &vat->mCount, &vat->mType, &vat->mFrac); + vat->attr = attr; + GXGetVtxAttrFmt(fmt, attr, &vat->count, &vat->type, &vat->frac); vat++; } - vat->mAttr = GX_VA_NULL; + vat->attr = GX_VA_NULL; } /** From 066dd618a20fdded58e448eebeeb0fbcde5e9a9e Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:20:45 -0500 Subject: [PATCH 08/10] Give `StdSystem::openFile` default parameter arguments --- include/system.h | 54 ++++++++++++------------ src/plugPikiColin/cinePlayer.cpp | 4 +- src/plugPikiColin/game.cpp | 2 +- src/plugPikiColin/mapMgr.cpp | 2 +- src/plugPikiColin/newPikiGame.cpp | 2 +- src/plugPikiColin/titles.cpp | 2 +- src/plugPikiKando/gameCoreSection.cpp | 12 +++--- src/plugPikiYamashita/P2DScreen.cpp | 2 +- src/plugPikiYamashita/particleLoader.cpp | 2 +- src/sysCommon/node.cpp | 2 +- src/sysCommon/shapeBase.cpp | 2 +- src/sysCommon/stdSystem.cpp | 12 +++--- src/sysDolphin/system.cpp | 4 +- 13 files changed, 51 insertions(+), 51 deletions(-) diff --git a/include/system.h b/include/system.h index 95d64172..a6a865c5 100644 --- a/include/system.h +++ b/include/system.h @@ -254,20 +254,20 @@ struct StdSystem { #endif // the vtable has to be at 0x1A0, so it's in the middle, yes. - virtual void initSoftReset(); // _08 - virtual RandomAccessStream* openFile(immut char* path, bool isRelativePath, bool) { return nullptr; } // _0C - virtual u32 copyRamToCache(u32, u32, u32) { return 0; } // _10 - virtual void copyCacheToRam(u32, u32, u32) { } // _14 - virtual void copyWaitUntilDone() { } // _18 - virtual void copyCacheToTexture(CacheTexture*) { } // _1C -#if defined(VERSION_PIKIDEMO) // - virtual void forceHardReset() { } // _20 -#endif // - virtual void Activate(bool) { } // _20 - virtual void parseArchiveDirectory(immut char* arcPath, immut char* dirPath) { } // _24 - virtual void sndPlaySe(u32) = 0; // _28 - virtual void startLoading(LoadIdler*, bool, u32) { } // _2C - virtual void endLoading() { } // _30 + virtual void initSoftReset(); // _08 + virtual RandomAccessStream* openFile(immut char* path, bool isRelativePath = true, bool = true) { return nullptr; } // _0C + virtual u32 copyRamToCache(u32, u32, u32) { return 0; } // _10 + virtual void copyCacheToRam(u32, u32, u32) { } // _14 + virtual void copyWaitUntilDone() { } // _18 + virtual void copyCacheToTexture(CacheTexture*) { } // _1C +#if defined(VERSION_PIKIDEMO) // + virtual void forceHardReset() { } // _20 +#endif // + virtual void Activate(bool) { } // _20 + virtual void parseArchiveDirectory(immut char* arcPath, immut char* dirPath) { } // _24 + virtual void sndPlaySe(u32) = 0; // _28 + virtual void startLoading(LoadIdler*, bool, u32) { } // _2C + virtual void endLoading() { } // _30 int mPolygonCount; // _1A4 u32 mMaterialCount; // _1A8 @@ -371,19 +371,19 @@ struct SymbolInfo { struct System : public StdSystem { System(); - virtual void initSoftReset(); // _08 - virtual RandomAccessStream* openFile(immut char* path, bool isRelativePath, bool); // _0C - virtual u32 copyRamToCache(u32, u32, u32); // _10 - virtual void copyCacheToRam(u32, u32, u32); // _14 - virtual void copyWaitUntilDone(); // _18 - virtual void copyCacheToTexture(CacheTexture*); // _1C -#if defined(VERSION_PIKIDEMO) // - virtual void forceHardReset() { mIsDemoTimeUp = TRUE; } // _20 -#endif // - virtual void parseArchiveDirectory(immut char* arcPath, immut char* dirPath); // _24 - virtual void sndPlaySe(u32); // _28 - virtual void startLoading(LoadIdler* idler, bool useLoadScreen, u32 loadDelay); // _2C - virtual void endLoading(); // _30 + virtual void initSoftReset(); // _08 + virtual RandomAccessStream* openFile(immut char* path, bool isRelativePath = true, bool = true); // _0C + virtual u32 copyRamToCache(u32, u32, u32); // _10 + virtual void copyCacheToRam(u32, u32, u32); // _14 + virtual void copyWaitUntilDone(); // _18 + virtual void copyCacheToTexture(CacheTexture*); // _1C +#if defined(VERSION_PIKIDEMO) // + virtual void forceHardReset() { mIsDemoTimeUp = TRUE; } // _20 +#endif // + virtual void parseArchiveDirectory(immut char* arcPath, immut char* dirPath); // _24 + virtual void sndPlaySe(u32); // _28 + virtual void startLoading(LoadIdler* idler, bool useLoadScreen, u32 loadDelay); // _2C + virtual void endLoading(); // _30 ~System(); diff --git a/src/plugPikiColin/cinePlayer.cpp b/src/plugPikiColin/cinePlayer.cpp index 22d61362..b23c5122 100644 --- a/src/plugPikiColin/cinePlayer.cpp +++ b/src/plugPikiColin/cinePlayer.cpp @@ -102,7 +102,7 @@ CinematicPlayer::CinematicPlayer(immut char* cinFilePath) void CinematicPlayer::loadCin(immut char* cinFilePath) { mCurrentData = nullptr; - Stream* file = gsys->openFile(cinFilePath, true, true); + Stream* file = gsys->openFile(cinFilePath); if (!file) { return; } @@ -268,7 +268,7 @@ void CinematicPlayer::loadCin(immut char* cinFilePath) */ void CinematicPlayer::addScene(SceneData* scene) { - Stream* data = gsys->openFile(scene->mName, true, true); + Stream* data = gsys->openFile(scene->mName); if (data) { CmdStream* cmd = new CmdStream(data); if (cmd) { diff --git a/src/plugPikiColin/game.cpp b/src/plugPikiColin/game.cpp index 399cff51..c5d458e9 100644 --- a/src/plugPikiColin/game.cpp +++ b/src/plugPikiColin/game.cpp @@ -121,7 +121,7 @@ void FlowController::readMapList(immut char* fileName) mStageList.initCore("stages"); // try and open file - RandomAccessStream* file = gsys->openFile(fileName, true, true); + RandomAccessStream* file = gsys->openFile(fileName); if (!file) { return; } diff --git a/src/plugPikiColin/mapMgr.cpp b/src/plugPikiColin/mapMgr.cpp index 325734bc..45f8fa23 100644 --- a/src/plugPikiColin/mapMgr.cpp +++ b/src/plugPikiColin/mapMgr.cpp @@ -703,7 +703,7 @@ void DynObjBody::initBodyCollisions() void DynObjBody::readScript(MapMgr* map, immut char* filePath) { // get commands list from file - RandomAccessStream* file = gsys->openFile(filePath, true, true); + RandomAccessStream* file = gsys->openFile(filePath); if (!file) { return; } diff --git a/src/plugPikiColin/newPikiGame.cpp b/src/plugPikiColin/newPikiGame.cpp index 0832d146..40315d0d 100644 --- a/src/plugPikiColin/newPikiGame.cpp +++ b/src/plugPikiColin/newPikiGame.cpp @@ -2213,7 +2213,7 @@ struct NewPikiGameSetupSection : public BaseGameSection { { gsys->getHeap(gsys->mActiveHeapIdx); gameflow.mTimeMultiplier = 1.0f; - RandomAccessStream* data = gsys->openFile(flowCont.mCurrStageFilePath, true, true); + RandomAccessStream* data = gsys->openFile(flowCont.mCurrStageFilePath); if (data) { CmdStream* stream = new CmdStream(data); diff --git a/src/plugPikiColin/titles.cpp b/src/plugPikiColin/titles.cpp index f29004f3..7335b698 100644 --- a/src/plugPikiColin/titles.cpp +++ b/src/plugPikiColin/titles.cpp @@ -151,7 +151,7 @@ struct TitleSetupSection : public Node { mPlayer->mIsPlaying = true; // load in lighting/time settings - RandomAccessStream* data = gsys->openFile("cinemas/opening.ini", true, true); + RandomAccessStream* data = gsys->openFile("cinemas/opening.ini"); if (data) { CmdStream* stream = new CmdStream(data); while (!stream->endOfCmds() && !stream->endOfSection()) { diff --git a/src/plugPikiKando/gameCoreSection.cpp b/src/plugPikiKando/gameCoreSection.cpp index 9f3c48f1..ee87d5b4 100644 --- a/src/plugPikiKando/gameCoreSection.cpp +++ b/src/plugPikiKando/gameCoreSection.cpp @@ -954,7 +954,7 @@ void GameCoreSection::initStage() bool useInit = false; bool usePlant = false; sprintf(path2, "%sdefault.gen", path); - RandomAccessStream* data = gsys->openFile(path2, true, true); + RandomAccessStream* data = gsys->openFile(path2); if (data) { PRINT("DEFAULT GEN LOADED **********************************\n"); generatorMgr->read(*data, false); @@ -971,7 +971,7 @@ void GameCoreSection::initStage() mNavi->reset(); sprintf(path2, "%s%d.gen", path, (gameflow.mWorldClock.mCurrentDay - 1) % MAX_DAYS); - data = gsys->openFile(path2, true, true); + data = gsys->openFile(path2); if (data) { PRINT("** FILE %s READING\n", path2); dailyGeneratorMgr->read(*data, true); @@ -986,7 +986,7 @@ void GameCoreSection::initStage() flowCont.mCurrentStage->mHasInitialised = TRUE; sprintf(path2, "%sinit.gen", path); - data = gsys->openFile(path2, true, true); + data = gsys->openFile(path2); if (data) { PRINT("** FILE %s READING\n", path2); onceGeneratorMgr->read(*data, true); @@ -997,7 +997,7 @@ void GameCoreSection::initStage() } sprintf(path2, "%splants.gen", path); - data = gsys->openFile(path2, true, true); + data = gsys->openFile(path2); if (data) { PRINT("** FILE %s READING\n", path2); plantGeneratorMgr->read(*data, true); @@ -1013,7 +1013,7 @@ void GameCoreSection::initStage() for (gfInfo = (GenFileInfo*)flowCont.mCurrentStage->mGenFileList.mChild; gfInfo; gfInfo = (GenFileInfo*)gfInfo->mNext) { if (day >= gfInfo->mFirstSpawnDay && day <= gfInfo->mLastSpawnDay && playerState->checkLimitGenFlag(i) == 0) { sprintf(path2, "%s%s", path, gfInfo->mName); - data = gsys->openFile(path2, true, true); + data = gsys->openFile(path2); if (data) { GeneratorMgr* gen = new GeneratorMgr; gen->setName(gfInfo->mName); @@ -1156,7 +1156,7 @@ void GameCoreSection::initStage() GameStat::minPikis = GameStat::allPikis; PRINT("*** START WITH %d PIKIS\n", GameStat::minPikis); - RandomAccessStream* data2 = gsys->openFile("ghost/record.gst", true, true); + RandomAccessStream* data2 = gsys->openFile("ghost/record.gst"); if (data2) { data2->getPending(); // int pend = ; diff --git a/src/plugPikiYamashita/P2DScreen.cpp b/src/plugPikiYamashita/P2DScreen.cpp index 36891988..2a2ecd5f 100644 --- a/src/plugPikiYamashita/P2DScreen.cpp +++ b/src/plugPikiYamashita/P2DScreen.cpp @@ -48,7 +48,7 @@ void P2DScreen::set(const char* bloFileName, bool useAlphaMgr, bool useTexAnimMg char path[PATH_MAX]; makeResName(bloFileName, path); - RandomAccessStream* file = gsys->openFile(path, p4, true); + RandomAccessStream* file = gsys->openFile(path, p4); if (file) { makeHiearachyPanes(this, file, true, true); file->close(); diff --git a/src/plugPikiYamashita/particleLoader.cpp b/src/plugPikiYamashita/particleLoader.cpp index 127211c7..3a62bb7a 100644 --- a/src/plugPikiYamashita/particleLoader.cpp +++ b/src/plugPikiYamashita/particleLoader.cpp @@ -27,7 +27,7 @@ u8* zen::particleLoader::load(immut char* fileName, bool p2) if (data) { PRINT("すでにロードされています。\n"); // 'already loaded.' } else { - RandomAccessStream* file = gsys->openFile(fileName, p2, true); + RandomAccessStream* file = gsys->openFile(fileName, p2); if (file) { int size = file->getPending(); PCRData* pcr = pmCreatePCRData(fileName, size); diff --git a/src/sysCommon/node.cpp b/src/sysCommon/node.cpp index e27e4378..dc08632f 100644 --- a/src/sysCommon/node.cpp +++ b/src/sysCommon/node.cpp @@ -97,7 +97,7 @@ void CoreNode::load(immut char* dirPath, immut char* fileName, u32) { char filePath[PATH_MAX]; sprintf(filePath, "%s%s", dirPath, fileName); - RandomAccessStream* stream = gsys->openFile(filePath, true, true); + RandomAccessStream* stream = gsys->openFile(filePath); if (stream) { read(*stream); stream->close(); diff --git a/src/sysCommon/shapeBase.cpp b/src/sysCommon/shapeBase.cpp index dedf8fc9..a41d7098 100644 --- a/src/sysCommon/shapeBase.cpp +++ b/src/sysCommon/shapeBase.cpp @@ -3111,7 +3111,7 @@ void BaseShape::importDca(immut char* name, CmdStream* cmds) */ AnimData* BaseShape::loadAnimation(immut char* name, bool isRelativePath) { - RandomAccessStream* stream = gsys->openFile(name, isRelativePath, true); + RandomAccessStream* stream = gsys->openFile(name, isRelativePath); if (stream) { CmdStream* cmds = new CmdStream(stream); diff --git a/src/sysCommon/stdSystem.cpp b/src/sysCommon/stdSystem.cpp index f3fdb099..9b90d6d3 100644 --- a/src/sysCommon/stdSystem.cpp +++ b/src/sysCommon/stdSystem.cpp @@ -159,7 +159,7 @@ Texture* StdSystem::loadTexture(immut char* path, bool isRelativePath) } Texture* loadedTex = nullptr; - RandomAccessStream* fs = openFile(path, isRelativePath, true); + RandomAccessStream* fs = openFile(path, isRelativePath); if (fs) { loadedTex = new Texture(); loadedTex->read(*fs); @@ -430,15 +430,15 @@ void StdSystem::initSoftReset() /** * Loads a shape from disk and prepares textures and materials. - * @param a2 Shape file path to open. + * @param filepath Shape file path to open. * @param shapeName Name assigned to the shape. * @param modelTexturePath Path for resolving texture names. - * @param a5 Whether to open using cached mode. + * @param isRelativePath Whether the path supplied is relative. */ -Shape* StdSystem::getShape(immut char* a2, immut char* shapeName, immut char* modelTexturePath, bool a5) +Shape* StdSystem::getShape(immut char* filepath, immut char* shapeName, immut char* modelTexturePath, bool isRelativePath) { Shape* result = nullptr; - RandomAccessStream* fileStream = gsys->openFile(a2, a5, true); + RandomAccessStream* fileStream = gsys->openFile(filepath, isRelativePath); // Open the file and read the shape if (fileStream) { @@ -563,7 +563,7 @@ void StdSystem::flushLFlares(Graphics& gfx) */ void StdSystem::loadBundle(immut char* pPath, bool loadWithCache) { - RandomAccessStream* fs = openFile(pPath, true, true); + RandomAccessStream* fs = openFile(pPath); if (!fs) { return; } diff --git a/src/sysDolphin/system.cpp b/src/sysDolphin/system.cpp index 2dcc2490..b4b93cee 100644 --- a/src/sysDolphin/system.cpp +++ b/src/sysDolphin/system.cpp @@ -331,7 +331,7 @@ void System::parseArchiveDirectory(immut char* arcPath, immut char* dirPath) stream.close(); - RandomAccessStream* file = gsys->openFile(arcPath, true, true); + RandomAccessStream* file = gsys->openFile(arcPath); if (file) { file->readInt(); u32 num = file->readInt(); @@ -361,7 +361,7 @@ void System::parseArchiveDirectory(immut char* arcPath, immut char* dirPath) */ static void ParseMapFile() { - RandomAccessStream* file = gsys->openFile("build.map", true, true); + RandomAccessStream* file = gsys->openFile("build.map"); if (!file) { return; } From b0034bcc5ee4fc89ef634172aca661fa06ff29e2 Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:21:53 -0500 Subject: [PATCH 09/10] Fix illegal pointers to member functions This was not legal C++ and messes up GCC. --- src/plugPikiColin/newPikiGame.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/plugPikiColin/newPikiGame.cpp b/src/plugPikiColin/newPikiGame.cpp index 40315d0d..95f4c2c0 100644 --- a/src/plugPikiColin/newPikiGame.cpp +++ b/src/plugPikiColin/newPikiGame.cpp @@ -1850,19 +1850,24 @@ struct NewPikiGameSetupSection : public BaseGameSection { movieMenu->mCenterPoint.mMinY = glnHeight - 88; movieMenu->mGradBGTopColour.set(MENU_COLOUR_DARK_RED); movieMenu->mGradBGBottomColour.set(MENU_COLOUR_MEDIUM_GREY); - movieMenu->addKeyEvent(Menu::KeyEventType::OnCancel, KBBTN_B, new Delegate1(movieMenu, Menu::menuCloseMenu)); + movieMenu->addKeyEvent(Menu::KeyEventType::OnCancel, KBBTN_B, new Delegate1(movieMenu, &Menu::menuCloseMenu)); char* movieBuf = new char[0x40]; sprintf(movieBuf, "Movie #%d", movieIndex); movieMenu->addOption(0, movieBuf, nullptr); - movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_Y, new NPGSSDelegate1(this, &menuDecreaseMovie)); - movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_X, new NPGSSDelegate1(this, &menuIncreaseMovie)); + movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_Y, + new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuDecreaseMovie)); + movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_X, + new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuIncreaseMovie)); movieMenu->addOption(MENU_FAKE_OPTION_FOR_GAP); - movieMenu->addOption(0, "Play / Stop", new NPGSSDelegate1(this, &menuPlayMovie)); + movieMenu->addOption(0, "Play / Stop", new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuPlayMovie)); movieMenu->addOption(0, "Pause / Frame Step", nullptr); - movieMenu->addKeyEvent(Menu::KeyEventType::OnInputRelease, KBBTN_A, new NPGSSDelegate1(this, &menuPauseMovie)); - movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_X, new NPGSSDelegate1(this, &menuIncreaseFrame)); - movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_Y, new NPGSSDelegate1(this, &menuDecreaseFrame)); + movieMenu->addKeyEvent(Menu::KeyEventType::OnInputRelease, KBBTN_A, + new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuPauseMovie)); + movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_X, + new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuIncreaseFrame)); + movieMenu->addKeyEvent(Menu::KeyEventType::WhileInputHeld, KBBTN_Y, + new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuDecreaseFrame)); // set up vertical filter menu Menu* filterMenu = new Menu(mController, gsys->mConsFont); @@ -1870,7 +1875,7 @@ struct NewPikiGameSetupSection : public BaseGameSection { filterMenu->mCenterPoint.mMinY = glnHeight / 2; filterMenu->mGradBGTopColour.set(MENU_COLOUR_DARK_RED); filterMenu->mGradBGBottomColour.set(MENU_COLOUR_MEDIUM_GREY); - filterMenu->addKeyEvent(Menu::KeyEventType::OnCancel, KBBTN_B, new Delegate1(filterMenu, Menu::menuCloseMenu)); + filterMenu->addKeyEvent(Menu::KeyEventType::OnCancel, KBBTN_B, new Delegate1(filterMenu, &Menu::menuCloseMenu)); gameflow.addFilterMenu(filterMenu); @@ -1880,8 +1885,8 @@ struct NewPikiGameSetupSection : public BaseGameSection { mDebugMenu->mCenterPoint.mMinY = glnHeight / 2; mDebugMenu->addKeyEvent(Menu::KeyEventType::OnCancel, KBBTN_B, new Delegate1(mDebugMenu, &Menu::menuCloseMenu)); - mDebugMenu->addOption(0, "Change Course", new NPGSSDelegate1(this, &menuChangeCourse)); - mDebugMenu->addOption(0, "Day End", new NPGSSDelegate1(this, &menuDayEnd)); + mDebugMenu->addOption(0, "Change Course", new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuChangeCourse)); + mDebugMenu->addOption(0, "Day End", new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuDayEnd)); mDebugMenu->addMenu(optionsMenu, 0, "Options"); mDebugMenu->addMenu(gamecore->mAiPerfDebugMenu, 0, "Kando Options"); if (mapMgr->mDayMgr) { @@ -1889,7 +1894,7 @@ struct NewPikiGameSetupSection : public BaseGameSection { } mDebugMenu->addMenu(movieMenu, 0, "Movie Player"); mDebugMenu->addOption(MENU_FAKE_OPTION_FOR_GAP); - mDebugMenu->addOption(0, "Quit", new NPGSSDelegate1(this, &menuQuitGame)); + mDebugMenu->addOption(0, "Quit", new NPGSSDelegate1(this, &NewPikiGameSetupSection::menuQuitGame)); #endif // reset more unused values From 8152e99995d03cb16f8c706dc4647cac86fd4c6d Mon Sep 17 00:00:00 2001 From: Minty-Meeo <45425365+Minty-Meeo@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:27:01 -0500 Subject: [PATCH 10/10] Create and implement `stack_new` macro This macro documents 117 places where damn well nearly every programmer on the staff (but mostly Nakata) wrote illegal C++ code because MetroWerks allows it. Taking the address of an rvalue requires the `-fpermissive` flag in GCC and breaks when optimizations are enabled, so of course it has been affecting my GCC port using CMake. I have left it up to the user to decide how one wishes to address this issue. I have personally found that a combination of placement new and `__builtin_alloca` work great. Most of the places that I added an include for "sysNew.h" already had indirect access to it, I simply made it explicit to ensure this new addition was stable. I might have put this macro in "types.h" if I wasn't planning on using placement new in my downstream fork as a replacement for this. --- include/sysNew.h | 10 +++++++++ src/plugPikiColin/gauges.cpp | 8 +++---- src/plugPikiColin/mapMgr.cpp | 2 +- src/plugPikiKando/aiPerf.cpp | 5 +++-- src/plugPikiKando/creature.cpp | 3 ++- src/plugPikiKando/gameCoreSection.cpp | 2 +- src/plugPikiKando/pelletMgr.cpp | 3 ++- src/plugPikiKando/ufoAnim.cpp | 6 +++--- src/plugPikiKando/ufoItem.cpp | 19 ++++++++-------- src/plugPikiNakata/panipikianimmgr.cpp | 3 ++- src/plugPikiNakata/panitestsection.cpp | 10 +++++---- src/plugPikiNakata/taiattackactions.cpp | 11 ++++++---- src/plugPikiNakata/taichappy.cpp | 10 +++++---- src/plugPikiNakata/taicollec.cpp | 12 ++++++----- src/plugPikiNakata/taijudgementactions.cpp | 4 +++- src/plugPikiNakata/taikinoko.cpp | 4 +++- src/plugPikiNakata/tainapkid.cpp | 10 +++++---- src/plugPikiNakata/taiotimoti.cpp | 10 +++++---- src/plugPikiNakata/taipalm.cpp | 6 +++--- src/plugPikiNakata/taireactionactions.cpp | 3 ++- src/plugPikiNakata/taishell.cpp | 5 +++-- src/plugPikiNakata/taiswallow.cpp | 25 ++++++++++++---------- src/plugPikiNakata/tekibteki.cpp | 8 +++---- src/plugPikiNakata/tekiconditions.cpp | 7 ++++-- src/plugPikiNakata/tekiinteraction.cpp | 4 +++- src/plugPikiNishimura/Boss.cpp | 4 ++-- src/plugPikiYamashita/P2DPerspGraph.cpp | 3 ++- src/sysCommon/shapeBase.cpp | 2 +- 28 files changed, 121 insertions(+), 78 deletions(-) diff --git a/include/sysNew.h b/include/sysNew.h index fa84e719..3e439a22 100644 --- a/include/sysNew.h +++ b/include/sysNew.h @@ -18,4 +18,14 @@ void* operator new[](size_t size, int alignment); void operator delete(void* ptr); void operator delete[](void* ptr); +// MetroWerks allowed programmers to take the address of an rvalue, but this is illegal +// in C and C++. This illegal operation effectively acts like a placement new on stack +// allocated space; the only difference is that object destruction would be automatic. +// Pikmin 1 almost never uses destructors, however, so this should be of no consequence. +#ifdef __MWERKS__ +#define stack_new(...) &__VA_ARGS__ +#else +#define stack_new(...) &__VA_ARGS__ /* This must be replaced with something legal or be removed. */ +#endif + #endif // _SYSNEW_H diff --git a/src/plugPikiColin/gauges.cpp b/src/plugPikiColin/gauges.cpp index 2507834b..0e5416e0 100644 --- a/src/plugPikiColin/gauges.cpp +++ b/src/plugPikiColin/gauges.cpp @@ -150,8 +150,8 @@ void GaugeInfo::showDigits(Vector3f centerPos, immut Colour& colour, int number, f32 uvEnd = ((num % 10) + 1.0f) * texEntryWidth; // draw the colored texture digit (flare) - lgMgr->mDigitFlareGroup->addLFlare(colour, centerPos, Vector2f(digitHalfWidth, digitHalfHeight), &Vector2f(uvStart, 0.0f), - &Vector2f(uvEnd, 1.0f)); + lgMgr->mDigitFlareGroup->addLFlare(colour, centerPos, Vector2f(digitHalfWidth, digitHalfHeight), stack_new(Vector2f)(uvStart, 0.0f), + stack_new(Vector2f)(uvEnd, 1.0f)); // get tens digit, in case it's a 2-digit number num /= 10; @@ -192,8 +192,8 @@ void GaugeInfo::refresh(Graphics& gfx) f32 uvEnd = 1.0f; f32 uvStart = 10.0f / 11.0f; // add to flare queue to draw - lgMgr->mDigitFlareGroup->addLFlare(colour, pos, Vector2f(mDigitHalfWidth, mDigitHalfHeight), &Vector2f(uvStart, 0.0f), - &Vector2f(uvEnd, 1.0f)); + lgMgr->mDigitFlareGroup->addLFlare(colour, pos, Vector2f(mDigitHalfWidth, mDigitHalfHeight), stack_new(Vector2f)(uvStart, 0.0f), + stack_new(Vector2f)(uvEnd, 1.0f)); // draw center of top number (blue, static value showing target amount to move object) 10 units above line pos.y += 10.0f; diff --git a/src/plugPikiColin/mapMgr.cpp b/src/plugPikiColin/mapMgr.cpp index 45f8fa23..82c77d2c 100644 --- a/src/plugPikiColin/mapMgr.cpp +++ b/src/plugPikiColin/mapMgr.cpp @@ -1663,7 +1663,7 @@ void MapMgr::postrefresh(Graphics& gfx) #endif int blend = gfx.setCBlending(BLEND_MultiTexture); - gfx.setPrimEnv(&Colour(255, 255, 255, gfx.mCamera->mBlurAlpha), nullptr); + gfx.setPrimEnv(stack_new(Colour)(255, 255, 255, gfx.mCamera->mBlurAlpha), nullptr); // render multi-texture blend (blur) gfx.blatRectangle(AREA_FULL_SCREEN(gfx)); diff --git a/src/plugPikiKando/aiPerf.cpp b/src/plugPikiKando/aiPerf.cpp index b63f6b04..e93d1c24 100644 --- a/src/plugPikiKando/aiPerf.cpp +++ b/src/plugPikiKando/aiPerf.cpp @@ -14,6 +14,7 @@ #include "PlayerState.h" #include "UfoItem.h" #include "WorkObject.h" +#include "sysNew.h" bool AIPerf::useLOD = true; bool AIPerf::showColls = true; @@ -420,9 +421,9 @@ void AIPerf::incUfoLevel(Menu& menu) if (shipInstance) { if (AIPerf::ufoLevel == 0) { - shipInstance->mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::WaitTutorial, shipInstance)); + shipInstance->mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::WaitTutorial, shipInstance)); } else { - shipInstance->mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait, shipInstance)); + shipInstance->mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait, shipInstance)); } shipInstance->mAnimator.setMotionSpeed(0, 30.0f); diff --git a/src/plugPikiKando/creature.cpp b/src/plugPikiKando/creature.cpp index be30db28..7464e24c 100644 --- a/src/plugPikiKando/creature.cpp +++ b/src/plugPikiKando/creature.cpp @@ -18,6 +18,7 @@ #include "SearchSystem.h" #include "SoundMgr.h" #include "sysMath.h" +#include "sysNew.h" #include "timers.h" #include @@ -936,7 +937,7 @@ void Creature::collisionCheck(f32 _unused) return; } - Iterator iter(&mSearchBuffer, &CndIsAtari()); + Iterator iter(&mSearchBuffer, stack_new(CndIsAtari)()); CI_LOOP(iter) { Creature* collider = *iter; diff --git a/src/plugPikiKando/gameCoreSection.cpp b/src/plugPikiKando/gameCoreSection.cpp index ee87d5b4..24860561 100644 --- a/src/plugPikiKando/gameCoreSection.cpp +++ b/src/plugPikiKando/gameCoreSection.cpp @@ -1763,7 +1763,7 @@ void GameCoreSection::draw(Graphics& gfx) naviMgr->renderCircle(gfx); mMapMgr->drawXLU(gfx); MATCHING_START_TIMER("shadow draw", true); - mMapMgr->mDayMgr->setFog(gfx, &COLOUR_TRANSPARENT); + mMapMgr->mDayMgr->setFog(gfx, stack_new(Colour)(0, 0, 0, 0)); Matrix4f mtx; gfx.calcViewMatrix(Matrix4f::ident, mtx); gfx.useMatrix(mtx, 0); diff --git a/src/plugPikiKando/pelletMgr.cpp b/src/plugPikiKando/pelletMgr.cpp index 11eaaf18..08bde61b 100644 --- a/src/plugPikiKando/pelletMgr.cpp +++ b/src/plugPikiKando/pelletMgr.cpp @@ -18,6 +18,7 @@ #include "Stickers.h" #include "UtEffect.h" #include "jaudio/pikiinter.h" +#include "sysNew.h" #include "teki.h" #include "zen/Math.h" @@ -854,7 +855,7 @@ void Pellet::finishMotion() if (mPelletView) { mPelletView->viewFinishMotion(); } else { - mAnimator.finishMotion(&PaniMotionInfo(PANI_NO_MOTION), nullptr); + mAnimator.finishMotion(stack_new(PaniMotionInfo)(PANI_NO_MOTION), nullptr); } } diff --git a/src/plugPikiKando/ufoAnim.cpp b/src/plugPikiKando/ufoAnim.cpp index 082ab14c..e6ff28d8 100644 --- a/src/plugPikiKando/ufoAnim.cpp +++ b/src/plugPikiKando/ufoAnim.cpp @@ -139,7 +139,7 @@ void UfoAnimator::stopAllMotions() void UfoAnimator::initFlagMotions(int id) { for (int i = 1; i < 8; i++) { - startMotion(i, &PaniMotionInfo(i + 2)); + startMotion(i, stack_new(PaniMotionInfo)(i + 2)); setMotionSpeed(i, 0.0f); } startFlagMotions(id); @@ -188,7 +188,7 @@ void UfoAnimator::startFlagMotions(int id) switch (id) { case 5: { - startMotion(7, &PaniMotionInfo(UfoMotion::Henka4b)); + startMotion(7, stack_new(PaniMotionInfo)(UfoMotion::Henka4b)); playerState->startSpecialMotions(); // fallthrough } @@ -218,7 +218,7 @@ void UfoAnimator::startFlagMotions(int id) case 0: { for (int i = 1; i < 8; i++) { - startMotion(i, &PaniMotionInfo(i + UfoMotion::Henka1 - 1)); + startMotion(i, stack_new(PaniMotionInfo)(i + UfoMotion::Henka1 - 1)); setMotionSpeed(i, 0.0f); } break; diff --git a/src/plugPikiKando/ufoItem.cpp b/src/plugPikiKando/ufoItem.cpp index a99aa80b..4fb8fba9 100644 --- a/src/plugPikiKando/ufoItem.cpp +++ b/src/plugPikiKando/ufoItem.cpp @@ -10,6 +10,7 @@ #include "UtEffect.h" #include "gameflow.h" #include "jaudio/pikiinter.h" +#include "sysNew.h" /** * @todo: Documentation @@ -251,7 +252,7 @@ void UfoItem::startConeEffect(int) EffectParm eff(goal, suck); mConeEffectId = KandoEffect::WhistleTemplate1; utEffectMgr->cast(mConeEffectId, eff); - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait, this)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait, this)); mAnimator.setMotionSpeed(0, 30.0f); PRINT("*** UFO FUTA OPEN !!!!!!!!!!!!!!________________________________\n"); } @@ -496,9 +497,9 @@ void UfoItem::suckMe(Pellet* pelt) { PRINT("UFO ** SUCK PELLET\n"); if (playerState->isUfoBroken()) { - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::WaitTutorial, this)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::WaitTutorial, this)); } else { - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait, this)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait, this)); } Navi* navi = naviMgr->getNavi(); @@ -512,7 +513,7 @@ void UfoItem::suckMe(Pellet* pelt) void UfoItem::startYozora() { // "start night sky" - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait)); mAnimator.setMotionSpeed(0, 0.0f); u8 level = playerState->mShipUpgradeLevel; @@ -526,7 +527,7 @@ void UfoItem::startYozora() */ void UfoItem::startGalaxy() { - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait)); mAnimator.setMotionSpeed(0, 0.0f); u8 level = playerState->mShipUpgradeLevel; @@ -783,7 +784,7 @@ void UfoItem::startTakeoff() if (idx < 0) { idx = 0; } - mAnimator.startMotion(0, &PaniMotionInfo(motions[idx], this)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(motions[idx], this)); mAnimator.setMotionSpeed(0, 30.0f); UtEffectMgr::kill(mConeEffectId); playerState->startSpecialMotions(); @@ -832,10 +833,10 @@ void UfoItem::startAI(int) mAnimator.init(mShipModel, itemMgr->mUfoMotionTable); if (playerState->isUfoBroken()) { - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::WaitTutorial)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::WaitTutorial)); playEventSound(this, SE_UFO_DESTROY); } else { - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::Wait)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::Wait)); playEventSound(this, SE_UFO_IDLING); } mAnimator.stopAllMotions(); @@ -898,7 +899,7 @@ void UfoItem::startAccess() mIsMenuOpen = true; startConeEffect(false); - mAnimator.startMotion(0, &PaniMotionInfo(UfoMotion::OpenClose, this)); + mAnimator.startMotion(0, stack_new(PaniMotionInfo)(UfoMotion::OpenClose, this)); mAnimator.setMotionSpeed(0, 30.0f); } diff --git a/src/plugPikiNakata/panipikianimmgr.cpp b/src/plugPikiNakata/panipikianimmgr.cpp index 663fdb64..5dde7856 100644 --- a/src/plugPikiNakata/panipikianimmgr.cpp +++ b/src/plugPikiNakata/panipikianimmgr.cpp @@ -1,5 +1,6 @@ #include "DebugLog.h" #include "PaniPikiAnimator.h" +#include "sysNew.h" PaniMotionTable* PaniPikiAnimMgr::motionTable; @@ -95,7 +96,7 @@ void PaniPikiAnimMgr::startMotion(immut PaniMotionInfo& motion1, immut PaniMotio */ void PaniPikiAnimMgr::finishMotion(PaniAnimKeyListener* listener) { - finishMotion(&PaniMotionInfo(PANI_NO_MOTION, listener), &PaniMotionInfo(PANI_NO_MOTION, nullptr)); + finishMotion(stack_new(PaniMotionInfo)(PANI_NO_MOTION, listener), stack_new(PaniMotionInfo)(PANI_NO_MOTION, nullptr)); } /** diff --git a/src/plugPikiNakata/panitestsection.cpp b/src/plugPikiNakata/panitestsection.cpp index 088952fd..838a7ebe 100644 --- a/src/plugPikiNakata/panitestsection.cpp +++ b/src/plugPikiNakata/panitestsection.cpp @@ -351,18 +351,20 @@ void PaniTestNode::updatePikis() } if (mController->keyUnClick(KBBTN_A)) { - mTestPikiList[0]->mPikiAnimMgr.startMotion(&PaniMotionInfo(mMotionId, this), &PaniMotionInfo(mMotionId)); + mTestPikiList[0]->mPikiAnimMgr.startMotion(stack_new(PaniMotionInfo)(mMotionId, this), stack_new(PaniMotionInfo)(mMotionId)); for (i = 1; i < mTestPikiCount; i++) { - mTestPikiList[i]->mPikiAnimMgr.startMotion(&PaniMotionInfo(mMotionId, nullptr), &PaniMotionInfo(mMotionId)); + mTestPikiList[i]->mPikiAnimMgr.startMotion(stack_new(PaniMotionInfo)(mMotionId, nullptr), stack_new(PaniMotionInfo)(mMotionId)); } } if (mController->keyUnClick(KBBTN_X)) { - mTestPikiList[0]->mPikiAnimMgr.finishMotion(&PaniMotionInfo(PANI_NO_MOTION, this), &PaniMotionInfo(PANI_NO_MOTION)); + mTestPikiList[0]->mPikiAnimMgr.finishMotion(stack_new(PaniMotionInfo)(PANI_NO_MOTION, this), + stack_new(PaniMotionInfo)(PANI_NO_MOTION)); for (i = 1; i < mTestPikiCount; i++) { - mTestPikiList[i]->mPikiAnimMgr.finishMotion(&PaniMotionInfo(PANI_NO_MOTION, nullptr), &PaniMotionInfo(PANI_NO_MOTION)); + mTestPikiList[i]->mPikiAnimMgr.finishMotion(stack_new(PaniMotionInfo)(PANI_NO_MOTION, nullptr), + stack_new(PaniMotionInfo)(PANI_NO_MOTION)); } } } diff --git a/src/plugPikiNakata/taiattackactions.cpp b/src/plugPikiNakata/taiattackactions.cpp index e7b331be..626cd68a 100644 --- a/src/plugPikiNakata/taiattackactions.cpp +++ b/src/plugPikiNakata/taiattackactions.cpp @@ -9,6 +9,7 @@ #include "TekiConditions.h" #include "TekiParameters.h" #include "TekiPersonality.h" +#include "sysNew.h" #include "teki.h" /** @@ -93,9 +94,10 @@ bool TaiAnimationSwallowingAction::act(Teki& teki) Vector3f center; teki.outputHitCenter(center); - TekiAndCondition andCond1(&TekiRecognitionCondition(&teki), &TekiNotCondition(&TekiStickerCondition(&teki))); - TekiAndCondition andCond2(&andCond1, &TekiNotCondition(&TekiPikiStateCondition(PIKISTATE_Flick))); - TekiAndCondition andCond3(&andCond2, &TekiPositionSphereDistanceCondition(center, teki.getAttackHitRange())); + TekiAndCondition andCond1(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(&teki))); + TekiAndCondition andCond2(&andCond1, stack_new(TekiNotCondition)(stack_new(TekiPikiStateCondition)(PIKISTATE_Flick))); + TekiAndCondition andCond3(&andCond2, stack_new(TekiPositionSphereDistanceCondition)(center, teki.getAttackHitRange())); int swallowPikiNum = 0; int numSlots = 0; @@ -232,7 +234,8 @@ bool TaiBangingAction::actByEvent(immut TekiEvent& event) */ bool TaiFlickAction::act(Teki& teki) { - int pikiCount = teki.countPikis(TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiLowerRangeCondition(&teki))); + int pikiCount + = teki.countPikis(TekiAndCondition(stack_new(TekiRecognitionCondition)(&teki), stack_new(TekiLowerRangeCondition)(&teki))); return teki.mDamageCount >= f32(teki.getFlickDamageCount(pikiCount)); TekiAndCondition(nullptr, nullptr); diff --git a/src/plugPikiNakata/taichappy.cpp b/src/plugPikiNakata/taichappy.cpp index c81730a0..d14a7e6b 100644 --- a/src/plugPikiNakata/taichappy.cpp +++ b/src/plugPikiNakata/taichappy.cpp @@ -13,6 +13,7 @@ #include "TAI/ReactionActions.h" #include "TAI/TimerActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -568,10 +569,11 @@ TaiChappyStrategy::TaiChappyStrategy(TekiParameters* params) */ bool TaiChappyCryAction::act(Teki& teki) { - TekiAndCondition NRef cond = TekiAndCondition(&TekiTypeCondition(TEKI_Swallow), - &TekiAndCondition(&TekiOrCondition(&TekiStateCondition(15), &TekiStateCondition(1)), - &TekiDistanceCondition(&teki, teki.getParameterF(TPF_MessageRange)))); - Creature* bulborb = tekiMgr->findClosest(teki.getPosition(), &cond); + TekiAndCondition NRef cond = TekiAndCondition( + stack_new(TekiTypeCondition)(TEKI_Swallow), + stack_new(TekiAndCondition)(stack_new(TekiOrCondition)(stack_new(TekiStateCondition)(15), stack_new(TekiStateCondition)(1)), + stack_new(TekiDistanceCondition)(&teki, teki.getParameterF(TPF_MessageRange)))); + Creature* bulborb = tekiMgr->findClosest(teki.getPosition(), &cond); if (!bulborb) { return false; } diff --git a/src/plugPikiNakata/taicollec.cpp b/src/plugPikiNakata/taicollec.cpp index 1096e327..626d588d 100644 --- a/src/plugPikiNakata/taicollec.cpp +++ b/src/plugPikiNakata/taicollec.cpp @@ -15,6 +15,7 @@ #include "TAI/ReactionActions.h" #include "TAI/TimerActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -978,9 +979,10 @@ bool TaiCollecTargetPelletAction::act(Teki& teki) Creature* target = teki.getCreaturePointer(3); int carryPower = teki.getParameterI(COLLECPI_CarryPower); Pellet* nearest = (Pellet*)pelletMgr->findClosest( - teki.getPosition(), - &TekiAndCondition(&TekiAndCondition(&TekiVisibleCondition(&teki), &TekiCollecTargetPelletCondition(&teki, carryPower)), - &TekiNotCondition(&TekiCreaturePointerCondition(target)))); + teki.getPosition(), + stack_new(TekiAndCondition)(stack_new(TekiAndCondition)(stack_new(TekiVisibleCondition)(&teki), + stack_new(TekiCollecTargetPelletCondition)(&teki, carryPower)), + stack_new(TekiNotCondition)(stack_new(TekiCreaturePointerCondition)(target)))); if (!nearest) { return false; } @@ -1040,8 +1042,8 @@ bool TaiCollecPelletLostAction::act(Teki& teki) return true; } - TekiAndCondition NRef cond - = TekiAndCondition(&TekiVisibleCondition(&teki), &TekiCollecTargetPelletCondition(&teki, teki.getParameterI(COLLECPI_CarryPower))); + TekiAndCondition NRef cond = TekiAndCondition( + stack_new(TekiVisibleCondition)(&teki), stack_new(TekiCollecTargetPelletCondition)(&teki, teki.getParameterI(COLLECPI_CarryPower))); if (!cond.satisfy(target)) { teki.clearCreaturePointer(0); return true; diff --git a/src/plugPikiNakata/taijudgementactions.cpp b/src/plugPikiNakata/taijudgementactions.cpp index eb0013f3..3eafba11 100644 --- a/src/plugPikiNakata/taijudgementactions.cpp +++ b/src/plugPikiNakata/taijudgementactions.cpp @@ -3,6 +3,7 @@ #include "Stickers.h" #include "TAI/JudgementActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -123,7 +124,8 @@ bool TaiTargetVisibleNaviPikiAction::act(Teki& teki) */ bool TaiTargetVisibleNaviAction::act(Teki& teki) { - Creature* navi = naviMgr->findClosest(teki.getPosition(), &TekiAndCondition(&TekiVisibleCondition(&teki), &TekiNaviCondition())); + Creature* navi = naviMgr->findClosest( + teki.getPosition(), stack_new(TekiAndCondition)(stack_new(TekiVisibleCondition)(&teki), stack_new(TekiNaviCondition)())); if (!navi) { return false; } diff --git a/src/plugPikiNakata/taikinoko.cpp b/src/plugPikiNakata/taikinoko.cpp index 404c2985..f57f78f8 100644 --- a/src/plugPikiNakata/taikinoko.cpp +++ b/src/plugPikiNakata/taikinoko.cpp @@ -11,6 +11,7 @@ #include "TAI/ReactionActions.h" #include "TAI/TimerActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -532,7 +533,8 @@ bool TaiKinokoDischargingSporesAction::act(Teki& teki) } else if (teki.getAnimationKeyOption(BTeki::ANIMATION_KEY_OPTION_ACTION_2)) { PRINT_NAKATA("TaiKinokoDischargingSporesAction:act:%08x:ACTION_2:\n", &teki); InteractSpore NRef spore = InteractSpore(&teki); - TekiAndCondition andCond(&TekiRecognitionCondition(&teki), &TekiDistanceCondition(&teki, teki.getAttackRange())); + TekiAndCondition andCond(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiDistanceCondition)(&teki, teki.getAttackRange())); teki.interactNaviPiki(spore, andCond); rumbleMgr->start(RUMBLE_Unk6, 0, teki.getPosition()); } diff --git a/src/plugPikiNakata/tainapkid.cpp b/src/plugPikiNakata/tainapkid.cpp index f6a13662..bad32b2b 100644 --- a/src/plugPikiNakata/tainapkid.cpp +++ b/src/plugPikiNakata/tainapkid.cpp @@ -15,6 +15,7 @@ #include "TAI/TimerActions.h" #include "TekiConditions.h" #include "nlib/Math.h" +#include "sysNew.h" #include "system.h" #include "teki.h" @@ -1072,7 +1073,7 @@ void TaiNapkidWanderingRouteAction::makeTargetPosition(Teki& teki) */ bool TaiNapkidTargetPikiAction::act(Teki& teki) { - Creature* nearestPiki = pikiMgr->findClosest(teki.getPosition(), &TekiNapkidTargetPikiCondition(&teki)); + Creature* nearestPiki = pikiMgr->findClosest(teki.getPosition(), stack_new(TekiNapkidTargetPikiCondition)(&teki)); if (nearestPiki == nullptr) { return false; } else { @@ -1312,9 +1313,10 @@ bool TaiNapkidCatchingAction::act(Teki& teki) NVector3f offset; offset.add2(teki.getPosition(), direction); - TekiAndCondition notStickerAndIsRecognizedCond(&TekiRecognitionCondition(&teki), &TekiNotCondition(&TekiStickerCondition(&teki))); - TekiAndCondition posSphereDistAndOtherConds(¬StickerAndIsRecognizedCond, - &TekiPositionSphereDistanceCondition(offset, teki.getParameterF(TPF_AttackHitRange))); + TekiAndCondition notStickerAndIsRecognizedCond(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(&teki))); + TekiAndCondition posSphereDistAndOtherConds( + ¬StickerAndIsRecognizedCond, stack_new(TekiPositionSphereDistanceCondition)(offset, teki.getParameterF(TPF_AttackHitRange))); Iterator iter(pikiMgr); CI_LOOP(iter) diff --git a/src/plugPikiNakata/taiotimoti.cpp b/src/plugPikiNakata/taiotimoti.cpp index 61ea247c..7f36eddf 100644 --- a/src/plugPikiNakata/taiotimoti.cpp +++ b/src/plugPikiNakata/taiotimoti.cpp @@ -16,6 +16,7 @@ #include "TAI/TimerActions.h" #include "TAI/WaitActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -741,7 +742,7 @@ void TaiOtimotiStartDroppingWaterAction::start(Teki& teki) */ bool TaiOtimotiFlickAction::act(Teki& teki) { - int pikiNum = teki.countPikis(TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiLowerRangeCondition(&teki))); + int pikiNum = teki.countPikis(TekiAndCondition(stack_new(TekiRecognitionCondition)(&teki), stack_new(TekiLowerRangeCondition)(&teki))); int flickCount = teki.getFlickDamageCount(pikiNum); if (teki.mDamageCount >= f32(flickCount)) { @@ -762,7 +763,7 @@ bool TaiOtimotiFlickAction::act(Teki& teki) */ bool TaiOtimotiFailToJumpAction::act(Teki& teki) { - int pikiNum = teki.countPikis(TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiLowerCondition(&teki))); + int pikiNum = teki.countPikis(TekiAndCondition(stack_new(TekiRecognitionCondition)(&teki), stack_new(TekiLowerCondition)(&teki))); f32 linValues[2]; NClampLinearFunction linFunc(linValues); linFunc.makeClampLinearFunction(teki.getParameterF(OTIMOTIPF_MissFuncMinCount), teki.getParameterF(OTIMOTIPF_MissFuncMinChance), @@ -964,8 +965,9 @@ bool TaiOtimotiPressingAction::actByEvent(immut TekiEvent& event) InteractPress NRef press = InteractPress(teki, teki->getParameterF(TPF_AttackPower)); TekiAndCondition NRef cond - = TekiAndCondition(&TekiRecognitionCondition(teki), &TekiAndCondition(&TekiDistanceCondition(teki, teki->getAttackRange()), - &TekiNotCondition(&TekiStickerCondition(teki)))); + = TekiAndCondition(stack_new(TekiRecognitionCondition)(teki), + stack_new(TekiAndCondition)(stack_new(TekiDistanceCondition)(teki, teki->getAttackRange()), + stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(teki)))); teki->interactNaviPiki(press, cond); teki->flickUpper(); teki->mDamageCount = 0.0f; diff --git a/src/plugPikiNakata/taipalm.cpp b/src/plugPikiNakata/taipalm.cpp index 220e8a5d..57d464ed 100644 --- a/src/plugPikiNakata/taipalm.cpp +++ b/src/plugPikiNakata/taipalm.cpp @@ -305,9 +305,9 @@ void TaiPalmStrategy::start(Teki& teki) f32 rad = 2.0f * teki.getParameterF(TPF_CollisionRadius); - TekiAndCondition NRef cond - = TekiAndCondition(&TekiNotCondition(&TekiCreaturePointerCondition(&teki)), - &TekiAndCondition(&TekiTypeCondition(teki.mTekiType), &TekiDistanceCondition(&teki, rad))); + TekiAndCondition NRef cond = TekiAndCondition( + stack_new(TekiNotCondition)(stack_new(TekiCreaturePointerCondition)(&teki)), + stack_new(TekiAndCondition)(stack_new(TekiTypeCondition)(teki.mTekiType), stack_new(TekiDistanceCondition)(&teki, rad))); Creature* neighbor = tekiMgr->findClosest(teki.getPosition(), &cond); PRINT_NAKATA("TaiPalmStrategy::start:%08x:neighbor:%08x\n", &teki, neighbor); diff --git a/src/plugPikiNakata/taireactionactions.cpp b/src/plugPikiNakata/taireactionactions.cpp index 6d2ccfb3..3c83dffc 100644 --- a/src/plugPikiNakata/taireactionactions.cpp +++ b/src/plugPikiNakata/taireactionactions.cpp @@ -3,6 +3,7 @@ #include "Stickers.h" #include "TAI/ReactionActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -215,7 +216,7 @@ bool TaiTargetNearestCollisionAction::actByEvent(immut TekiEvent& event) return false; } Creature* target = event.mOther; - TekiAndCondition cond(&TekiRecognitionCondition(event.mTeki), &TekiNaviPikiCondition()); + TekiAndCondition cond(stack_new(TekiRecognitionCondition)(event.mTeki), stack_new(TekiNaviPikiCondition)()); if (!cond.satisfy(target)) { return false; } diff --git a/src/plugPikiNakata/taishell.cpp b/src/plugPikiNakata/taishell.cpp index 1776e725..dc240909 100644 --- a/src/plugPikiNakata/taishell.cpp +++ b/src/plugPikiNakata/taishell.cpp @@ -369,11 +369,12 @@ bool TaiShellNaviPikiInsideAction::act(Teki& teki) */ bool TaiShellEatAction::act(Teki& teki) { - TekiAndCondition andCond(&TekiRecognitionCondition(&teki), &TekiNotCondition(&TekiStickerCondition(&teki))); + TekiAndCondition andCond(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(&teki))); NVector3f spawnPos; teki.outputSpawnPosition(spawnPos); - TekiAndCondition posDistAndAnd(&andCond, &TekiPositionDistanceCondition(spawnPos, teki.getAttackableRange())); + TekiAndCondition posDistAndAnd(&andCond, stack_new(TekiPositionDistanceCondition)(spawnPos, teki.getAttackableRange())); return teki.interactNaviPiki(InteractSwallow(&teki, nullptr, 0), posDistAndAnd); // i am not proud of what this project has required of me spiritually diff --git a/src/plugPikiNakata/taiswallow.cpp b/src/plugPikiNakata/taiswallow.cpp index 1e5e05f1..a0c3de08 100644 --- a/src/plugPikiNakata/taiswallow.cpp +++ b/src/plugPikiNakata/taiswallow.cpp @@ -12,6 +12,7 @@ #include "TAI/MoveActions.h" #include "TAI/ReactionActions.h" #include "TekiConditions.h" +#include "sysNew.h" #include "teki.h" /** @@ -719,7 +720,7 @@ bool TaiSwallowTurningAction::act(Teki& teki) return true; } - TekiAndCondition NRef cond = TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiLowerCondition(&teki)); + TekiAndCondition NRef cond = TekiAndCondition(stack_new(TekiRecognitionCondition)(&teki), stack_new(TekiLowerCondition)(&teki)); int pikiCount = teki.countPikis(cond); f32 linFuncValues[2]; NClampLinearFunction linFunc(linFuncValues); @@ -778,10 +779,11 @@ void TaiSwallowFlickingAction::flick(Teki& teki) teki.flickUpper(); InteractFlick NRef flick = InteractFlick(&teki, teki.getParameterF(TPF_LowerFlickPower), teki.getParameterF(TPF_LowerAttackPower), FLICK_BACKWARDS_ANGLE); - TekiAndCondition NRef cond - = TekiAndCondition(&TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiNotCondition(&TekiStickingCondition())), - &TekiAndCondition(&TekiDistanceCondition(&teki, teki.getLowerRange()), - &TekiAngleCondition(&teki, teki.getParameterF(SWALLOWPF_FlickLowerAngle)))); + TekiAndCondition NRef cond = TekiAndCondition( + stack_new(TekiAndCondition)(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiNotCondition)(stack_new(TekiStickingCondition)())), + stack_new(TekiAndCondition)(stack_new(TekiDistanceCondition)(&teki, teki.getLowerRange()), + stack_new(TekiAngleCondition)(&teki, teki.getParameterF(SWALLOWPF_FlickLowerAngle)))); teki.interactNaviPiki(flick, cond); TekiAndCondition(nullptr, nullptr); @@ -795,12 +797,13 @@ void TaiSwallowFlickingAction::flick(Teki& teki) bool TaiSwallowSwallowingFlickAction::act(Teki& teki) { if (teki.getAnimationKeyOption(BTeki::ANIMATION_KEY_OPTION_ACTION_0)) { - InteractFlick NRef flick = InteractFlick(&teki, teki.getParameterF(TPF_LowerFlickPower), teki.getParameterF(TPF_LowerAttackPower), - teki.getDirection() + NMathF::pi); - TekiAndCondition NRef cond - = TekiAndCondition(&TekiAndCondition(&TekiRecognitionCondition(&teki), &TekiNotCondition(&TekiStickingCondition())), - &TekiAndCondition(&TekiDistanceCondition(&teki, teki.getLowerRange()), - &TekiAngleCondition(&teki, teki.getParameterF(SWALLOWPF_FlickLowerAngle)))); + InteractFlick NRef flick = InteractFlick(&teki, teki.getParameterF(TPF_LowerFlickPower), teki.getParameterF(TPF_LowerAttackPower), + teki.getDirection() + NMathF::pi); + TekiAndCondition NRef cond = TekiAndCondition( + stack_new(TekiAndCondition)(stack_new(TekiRecognitionCondition)(&teki), + stack_new(TekiNotCondition)(stack_new(TekiStickingCondition)())), + stack_new(TekiAndCondition)(stack_new(TekiDistanceCondition)(&teki, teki.getLowerRange()), + stack_new(TekiAngleCondition)(&teki, teki.getParameterF(SWALLOWPF_FlickLowerAngle)))); teki.interactNaviPiki(flick, cond); } return false; diff --git a/src/plugPikiNakata/tekibteki.cpp b/src/plugPikiNakata/tekibteki.cpp index 76ab6349..66545479 100644 --- a/src/plugPikiNakata/tekibteki.cpp +++ b/src/plugPikiNakata/tekibteki.cpp @@ -1404,7 +1404,7 @@ bool BTeki::attackRangeNaviPiki(immut Interaction& interaction, immut Condition& outputHitCenter(hitCenter); // Fun Fact: Decompiling this unused function fixed a fakematch related to `TekiAndCondition` in this file. - TekiAndCondition andCond(&condition, &TekiPositionSphereDistanceCondition(hitCenter, getAttackHitRange())); + TekiAndCondition andCond(&condition, stack_new(TekiPositionSphereDistanceCondition)(hitCenter, getAttackHitRange())); return interactNaviPiki(interaction, andCond); } @@ -1544,9 +1544,9 @@ void BTeki::flickLower() */ void BTeki::flickLower(InteractFlick& flick) { - TekiAndCondition andCond( - &TekiAndCondition(&TekiRecognitionCondition(static_cast(this)), &TekiNotCondition(&TekiStickingCondition())), - &TekiDistanceCondition(static_cast(this), getLowerRange())); + TekiAndCondition andCond(stack_new(TekiAndCondition)(stack_new(TekiRecognitionCondition)(static_cast(this)), + stack_new(TekiNotCondition)(stack_new(TekiStickingCondition)())), + stack_new(TekiDistanceCondition)(static_cast(this), getLowerRange())); interactNavi(flick, andCond); flick.mDamage = 0.0f; diff --git a/src/plugPikiNakata/tekiconditions.cpp b/src/plugPikiNakata/tekiconditions.cpp index fe225b43..32d4f193 100644 --- a/src/plugPikiNakata/tekiconditions.cpp +++ b/src/plugPikiNakata/tekiconditions.cpp @@ -1,6 +1,7 @@ #include "TekiConditions.h" #include "DebugLog.h" #include "Piki.h" +#include "sysNew.h" #include "teki.h" /** @@ -214,8 +215,10 @@ bool TekiVisibleHeightCondition::satisfy(Creature* target) immut bool TekiLowerCondition::satisfy(Creature* target) immut { // fucking amazing work nakata. - return TekiAndCondition(&TekiLowerRangeCondition(mTeki), &TekiNotCondition(&TekiStickerCondition(mTeki))).satisfy(target); - return TekiAndCondition(&TekiLowerRangeCondition(mTeki), &TekiNotCondition(&TekiStickerCondition(mTeki))).satisfy(target); + return TekiAndCondition(stack_new(TekiLowerRangeCondition)(mTeki), stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(mTeki))) + .satisfy(target); + return TekiAndCondition(stack_new(TekiLowerRangeCondition)(mTeki), stack_new(TekiNotCondition)(stack_new(TekiStickerCondition)(mTeki))) + .satisfy(target); } /** diff --git a/src/plugPikiNakata/tekiinteraction.cpp b/src/plugPikiNakata/tekiinteraction.cpp index 4590381b..39f5416e 100644 --- a/src/plugPikiNakata/tekiinteraction.cpp +++ b/src/plugPikiNakata/tekiinteraction.cpp @@ -1,5 +1,6 @@ #include "DebugLog.h" #include "Interactions.h" +#include "sysNew.h" #include "teki.h" /** @@ -38,7 +39,8 @@ bool InteractAttack::actTeki(Teki* teki) immut bool InteractBomb::actTeki(Teki* teki) immut { f32 bombFactor = teki->getParameterF(TPF_BombDamageRate); - return teki->interact(TekiInteractionKey(TekiInteractType::Attack, &InteractAttack(mOwner, nullptr, mDamage * bombFactor, false))); + return teki->interact( + TekiInteractionKey(TekiInteractType::Attack, stack_new(InteractAttack)(mOwner, nullptr, mDamage * bombFactor, false))); } /** diff --git a/src/plugPikiNishimura/Boss.cpp b/src/plugPikiNishimura/Boss.cpp index d42fce14..b4bb486c 100644 --- a/src/plugPikiNishimura/Boss.cpp +++ b/src/plugPikiNishimura/Boss.cpp @@ -86,7 +86,7 @@ void Boss::initBoss(BirthInfo& birthInfo, int objType) void Boss::calcFlickPiki() { interactStickers(this, InteractFlick(this, BOSS_PROP.mFlickKnockback(), BOSS_PROP.mFlickDamage(), FLICK_BACKWARDS_ANGLE), - &CndBossFlick(this)); + stack_new(CndBossFlick)(this)); mFlickDamageCount = 0; } @@ -452,7 +452,7 @@ int Boss::getStickNoMouthPikiCount() */ void Boss::killStickToMouthPiki() { - killStickers(this, &CndStickMouthKill(this), 0); + killStickers(this, stack_new(CndStickMouthKill)(this), 0); } /** diff --git a/src/plugPikiYamashita/P2DPerspGraph.cpp b/src/plugPikiYamashita/P2DPerspGraph.cpp index ea1f6090..c798ef16 100644 --- a/src/plugPikiYamashita/P2DPerspGraph.cpp +++ b/src/plugPikiYamashita/P2DPerspGraph.cpp @@ -1,6 +1,7 @@ #include "DebugLog.h" #include "Dolphin/gx.h" #include "P2D/Graph.h" +#include "sysNew.h" /** * @todo: Documentation @@ -148,7 +149,7 @@ void P2DPerspGraph::makeLookat() upDir.z = 0.0f; mViewMtx.makeLookat(cameraPos, targetPos, &upDir); - mViewMtx.makeLookat(Vector3f(0.0f, 0.0f, 250.0f), Vector3f(0.0f, 0.0f, 0.0f), &Vector3f(0.0f, 1.0f, 0.0f)); + mViewMtx.makeLookat(Vector3f(0.0f, 0.0f, 250.0f), Vector3f(0.0f, 0.0f, 0.0f), stack_new(Vector3f)(0.0f, 1.0f, 0.0f)); mViewMtx.makeLookat(Vector3f(halfWidth, halfHeight, -mDistance), Vector3f(1.0f, 0.0f, 0.0f), Vector3f(0.0f, -1.0f, 0.0f), Vector3f(0.0f, 0.0f, -1.0f)); diff --git a/src/sysCommon/shapeBase.cpp b/src/sysCommon/shapeBase.cpp index a41d7098..cf0f86e6 100644 --- a/src/sysCommon/shapeBase.cpp +++ b/src/sysCommon/shapeBase.cpp @@ -1883,7 +1883,7 @@ void BaseShape::makeInstance(ShapeDynMaterials& animatedMats, int jointIdx) countMaterials(joint, 0); if (joint->mChild) { - recTraverseMaterials((Joint*)joint->mChild, &Delegate2(this, &BaseShape::countMaterials)); + recTraverseMaterials((Joint*)joint->mChild, stack_new(Delegate2)(this, &BaseShape::countMaterials)); } animatedMats.mMatCount = matIndex;