diff --git a/config/ShieldD/splits.txt b/config/ShieldD/splits.txt index 036c9573cca..5e4ba690727 100644 --- a/config/ShieldD/splits.txt +++ b/config/ShieldD/splits.txt @@ -2446,14 +2446,14 @@ JSystem/JAudio2/JASOscillator.cpp: .text start:0x8048A950 end:0x8048B020 .rodata start:0x80654D60 end:0x80654E70 .data start:0x806FDFE8 end:0x806FE028 - .sdata start:0x80748938 end:0x8074894C + .sdata start:0x80748938 end:0x80748948 .sdata2 start:0x80751C60 end:0x80751C88 JSystem/JAudio2/JASAiCtrl.cpp: .text start:0x8048B020 end:0x8048BD30 .rodata start:0x80654E70 end:0x80654E80 .data start:0x806FE028 end:0x806FE188 - .sdata start:0x8074894C end:0x80748970 + .sdata start:0x80748948 end:0x80748970 .sbss start:0x8074CC68 end:0x8074CCA8 .sdata2 start:0x80751C88 end:0x80751CA8 .bss start:0x807C8D78 end:0x807C8D88 diff --git a/configure.py b/configure.py index a49ac42ac60..ae8fa40cbff 100755 --- a/configure.py +++ b/configure.py @@ -742,14 +742,14 @@ config.libs = [ Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAExtraShape.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAChildShape.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAExTexShape.cpp"), - Object(NonMatching, "JSystem/JParticle/JPADynamicsBlock.cpp"), - Object(NonMatching, "JSystem/JParticle/JPAFieldBlock.cpp"), + Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPADynamicsBlock.cpp"), + Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAFieldBlock.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAKeyBlock.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPATexture.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAResourceLoader.cpp"), Object(Equivalent, "JSystem/JParticle/JPAEmitterManager.cpp", extra_cflags=['-pragma "nosyminline off"']), # weak func order Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAEmitter.cpp"), - Object(NonMatching, "JSystem/JParticle/JPAParticle.cpp"), + Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAParticle.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JParticle/JPAMath.cpp"), ], ), @@ -826,7 +826,7 @@ config.libs = [ Object(MatchingFor("GZ2E01"), "JSystem/JAudio2/JASTrackPort.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JAudio2/JASRegisterParam.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JAudio2/JASSeqCtrl.cpp"), - Object(NonMatching, "JSystem/JAudio2/JASSeqParser.cpp"), + Object(MatchingFor("GZ2E01"), "JSystem/JAudio2/JASSeqParser.cpp"), Object(MatchingFor("GZ2E01"), "JSystem/JAudio2/JASSeqReader.cpp"), Object(NonMatching, "JSystem/JAudio2/JASAramStream.cpp"), Object(NonMatching, "JSystem/JAudio2/JASBank.cpp"), @@ -907,12 +907,12 @@ config.libs = [ Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SoundStarter.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SoundHandles.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SeMgr.cpp"), - Object(NonMatching, "Z2AudioLib/Z2SeqMgr.cpp"), + Object(Equivalent, "Z2AudioLib/Z2SeqMgr.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2StatusMgr.cpp"), Object(NonMatching, "Z2AudioLib/Z2SceneMgr.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2FxLineMgr.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SoundInfo.cpp"), - Object(NonMatching, "Z2AudioLib/Z2Audience.cpp"), + Object(Equivalent, "Z2AudioLib/Z2Audience.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SoundObject.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2SoundObjMgr.cpp"), Object(MatchingFor("GZ2E01"), "Z2AudioLib/Z2Creature.cpp"), diff --git a/include/JSystem/J3DGraphAnimator/J3DAnimation.h b/include/JSystem/J3DGraphAnimator/J3DAnimation.h index 01849857bf5..88e0480badd 100644 --- a/include/JSystem/J3DGraphAnimator/J3DAnimation.h +++ b/include/JSystem/J3DGraphAnimator/J3DAnimation.h @@ -2,6 +2,7 @@ #define J3DANIMATION_H #include "JSystem/J3DGraphAnimator/J3DModelData.h" +#include "JSystem/JUtility/JUTAssert.h" #include "JSystem/JUtility/JUTNameTab.h" #include "global.h" @@ -590,10 +591,11 @@ public: u16 getUpdateMaterialID(u16 idx) const { return mUpdateMaterialID[idx]; } u16 getUpdateMaterialNum() const { return mTrackNum / 3; } + u16 getPostUpdateMaterialNum() const { return field_0x4a / 3; } - int getUpdateTexMtxID(u16 idx) { return mUpdateTexMtxID[idx]; } + int getUpdateTexMtxID(u16 idx) const { return mUpdateTexMtxID[idx]; } bool isValidUpdateMaterialID(u16 idx) const { return mUpdateMaterialID[idx] != 0xffff; } - u32 getTexMtxCalcType() const { return mTexMtxCalcType; } + u32 getTexMtxCalcType() { return mTexMtxCalcType; } Vec* getSRTCenter(u16 idx) { return &mSRTCenter[idx]; } /* 0x0C */ int mDecShift; @@ -719,7 +721,10 @@ public: u16 getUpdateMaterialNum() const { return mUpdateMaterialNum; } bool isValidUpdateMaterialID(u16 id) const { return mUpdateMaterialID[id] != 0xFFFF; } - u16 getUpdateMaterialID(u16 idx) const { return mUpdateMaterialID[idx]; } + u16 getUpdateMaterialID(u16 idx) const { + JUT_ASSERT_MSG(1578, 0 <= mUpdateMaterialNum - idx, "Error : range over.") + return mUpdateMaterialID[idx]; + } /* 0x0C */ u16 field_0xc; /* 0x0E */ u16 field_0xe; diff --git a/include/JSystem/JAudio2/JASDSPInterface.h b/include/JSystem/JAudio2/JASDSPInterface.h index 370fe738e45..3925012e2f4 100644 --- a/include/JSystem/JAudio2/JASDSPInterface.h +++ b/include/JSystem/JAudio2/JASDSPInterface.h @@ -118,6 +118,10 @@ namespace JASDsp { extern TChannel* CH_BUF; extern FxBuf* FX_BUF; extern f32 sDSPVolume; + + #ifdef DEBUG + extern s32 dspMutex; + #endif }; u16 DSP_CreateMap2(u32 msg); diff --git a/include/JSystem/JAudio2/JASHeapCtrl.h b/include/JSystem/JAudio2/JASHeapCtrl.h index e0f4be1822f..754e65361cc 100644 --- a/include/JSystem/JAudio2/JASHeapCtrl.h +++ b/include/JSystem/JAudio2/JASHeapCtrl.h @@ -3,6 +3,7 @@ #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JSupport/JSUList.h" +#include "JSystem/JUtility/JUTAssert.h" #include #include @@ -112,7 +113,7 @@ class JASMemChunkPool : public OSMutex { mChunks = 0; } - bool checkArea(void* ptr) { + bool checkArea(const void* ptr) const { return (u8*)this + 0xc <= (u8*)ptr && (u8*)ptr < (u8*)this + (ChunkSize + 0xc); } @@ -127,11 +128,11 @@ class JASMemChunkPool : public OSMutex { return rv; } - void free() { + void free(void* mem) { mChunks--; } - bool isEmpty() { + bool isEmpty() const { return mChunks == 0; } @@ -201,7 +202,8 @@ public: MemoryChunk* prevChunk = NULL; while (chunk != NULL) { if (chunk->checkArea(ptr)) { - chunk->free(); + chunk->free(ptr); + if (chunk != field_0x18 && chunk->isEmpty()) { MemoryChunk* nextChunk = chunk->getNextChunk(); delete chunk; @@ -212,6 +214,8 @@ public: prevChunk = chunk; chunk = chunk->getNextChunk(); } + + JUT_PANIC(362,"Cannnot free for JASMemChunkPool") } /* 0x18 */ MemoryChunk* field_0x18; diff --git a/include/JSystem/JAudio2/JASSeqCtrl.h b/include/JSystem/JAudio2/JASSeqCtrl.h index f1f2dbc9533..aea3d2d3876 100644 --- a/include/JSystem/JAudio2/JASSeqCtrl.h +++ b/include/JSystem/JAudio2/JASSeqCtrl.h @@ -37,10 +37,10 @@ public: const JASSeqReader* getSeqReader() const { return &mReader; } void* getBase() { return mReader.getBase(); } void* getAddr(u32 param_0) { return mReader.getAddr(param_0); } - u8 getByte(u32 param_0) { return mReader.getByte(param_0); } - u16 get16(u32 param_0) { return mReader.get16(param_0); } - u32 get24(int param_0) { return mReader.get24(param_0); } - u32 get32(u32 param_0) { return mReader.get32(param_0); } + u8 getByte(u32 param_0) const { return mReader.getByte(param_0); } + u16 get16(u32 param_0) const { return mReader.get16(param_0); } + u32 get24(u32 param_0) const { return mReader.get24(param_0); } + u32 get32(u32 param_0) const { return mReader.get32(param_0); } void* getCur() { return mReader.getCur(); } u32 readByte() { return mReader.readByte(); } u32 read16() { return mReader.read16(); } diff --git a/include/JSystem/JAudio2/JASSeqReader.h b/include/JSystem/JAudio2/JASSeqReader.h index e6c445bb241..75610933919 100644 --- a/include/JSystem/JAudio2/JASSeqReader.h +++ b/include/JSystem/JAudio2/JASSeqReader.h @@ -25,29 +25,30 @@ public: field_0x04 = (u8*)param_1; } - u32 get24(int param_0) { + u32 get24(int param_0) const { return (*(u32*)(field_0x00 + param_0 - 1)) & 0xffffff; } u32* getBase() { return (u32*)field_0x00; } void* getAddr(u32 param_0) { return field_0x00 + param_0; } - u8 getByte(u32 param_0) { return *(field_0x00 + param_0); } - u16 get16(u32 param_0) { return *(u16*)(field_0x00 + param_0); } - u32 get32(u32 param_0) { return *(u32*)(field_0x00 + param_0); } + u8 getByte(u32 param_0) const { return *(field_0x00 + param_0); } + u16 get16(u32 param_0) const { return *(u16*)(field_0x00 + param_0); } + u32 get32(u32 param_0) const { return *(u32*)(field_0x00 + param_0); } u8* getCur() { return field_0x04; } u32 readByte() { return *field_0x04++; } u32 read16() { - u16* tmp = (u16*)field_0x04; - field_0x04 += 2; - return *tmp; + return *((u16*)field_0x04)++; } u32 read24() { field_0x04--; - u32* tmp = (u32*)field_0x04; - field_0x04 += 4; - return *tmp & 0x00ffffff; + return (*((u32*)field_0x04)++) & 0x00ffffff; + } + u16 getLoopCount() const { + if (field_0x08 == 0) { + return 0; + } + return field_0x2c[field_0x08 - 1]; } - u16 getLoopCount() const { return field_0x08 == 0 ? 0 : field_0x2c[field_0x08 - 1]; } /* 0x00 */ u8* field_0x00; /* 0x04 */ u8* field_0x04; diff --git a/include/JSystem/JAudio2/JASTrack.h b/include/JSystem/JAudio2/JASTrack.h index 85e729cb72d..8e4743ac360 100644 --- a/include/JSystem/JAudio2/JASTrack.h +++ b/include/JSystem/JAudio2/JASTrack.h @@ -17,6 +17,8 @@ namespace JASDsp { extern const u32 FILTER_MODE_IIR; }; +#define MAX_CHILDREN 16 + /** * @ingroup jsystem-jaudio * @@ -125,14 +127,17 @@ struct JASTrack : public JASPoolAllocObject_MultiThreaded { static TList sTrackList; JASSeqCtrl* getSeqCtrl() { return &mSeqCtrl; } - u16 getPort(u32 param_0) { return mTrackPort.get(param_0); } + u16 getPort(u32 param_0) const { return mTrackPort.get(param_0); } void setPort(u32 param_0, u16 param_1) { mTrackPort.set(param_0, param_1); } - u32 checkPortIn(u32 param_0) { return mTrackPort.checkImport(param_0); } - u32 checkPort(u32 param_0) { return mTrackPort.checkExport(param_0); } + u32 checkPortIn(u32 param_0) const { return mTrackPort.checkImport(param_0); } + u32 checkPort(u32 param_0) const { return mTrackPort.checkExport(param_0); } u32 readReg(JASRegisterParam::RegID param_0) { return mRegisterParam.read(param_0); } void writeReg(JASRegisterParam::RegID param_0, u32 param_1) { mRegisterParam.write(param_0, param_1); } JASTrack* getParent() { return mParent; } - JASTrack* getChild(u32 index) { return mChildren[index]; } + JASTrack* getChild(u32 index) { + JUT_ASSERT(115, index < MAX_CHILDREN) + return mChildren[index]; + } int getChannelMgrCount() { return mChannelMgrCount; } f32 getVibDepth() const { return mVibDepth; } void setVibDepth(f32 param_0) { mVibDepth = param_0; } @@ -142,9 +147,9 @@ struct JASTrack : public JASPoolAllocObject_MultiThreaded { void setTremDepth(f32 param_0) { mTremDepth = param_0; } f32 getTremPitch() const { return mTremPitch; } void setTremPitch(f32 param_0) { mTremPitch = param_0; } - u16 getVibDelay() const { return mVibDelay; } + u32 getVibDelay() const { return mVibDelay; } void setVibDelay(u32 param_0) { mVibDelay = param_0; } - u16 getTremDelay() const { return mTremDelay; } + u32 getTremDelay() const { return mTremDelay; } void setTremDelay(u32 param_0) { mTremDelay = param_0; } u8 getStatus() const { return mStatus; } void setAutoDelete(u8 param_0) { mFlags.autoDelete = param_0; } @@ -155,8 +160,8 @@ struct JASTrack : public JASPoolAllocObject_MultiThreaded { u16 getDirectRelease() const { return mDirectRelease; } void setDirectRelease(u16 param_0) {mDirectRelease = param_0; } u16 getTimebase() const { return mTimebase; } - s8 getTranspose() const { return mTranspose; } - void setTranspose(u32 param_0) { mTranspose = param_0; } + int getTranspose() const { return mTranspose; } + void setTranspose(s32 param_0) { mTranspose = param_0; } u16 getBankNumber() const { return mBankNumber; } void setBankNumber(u16 param_0) { mBankNumber = param_0; } u16 getProgNumber() const { return mProgNumber; } @@ -187,7 +192,7 @@ struct JASTrack : public JASPoolAllocObject_MultiThreaded { /* 0x0e4 */ JASOscillator::Data mOscParam[2]; /* 0x114 */ JASOscillator::Point mOscPoint[4]; /* 0x12C */ JASTrack* mParent; - /* 0x130 */ JASTrack* mChildren[16]; + /* 0x130 */ JASTrack* mChildren[MAX_CHILDREN]; /* 0x170 */ TChannelMgr* mChannelMgrs[4]; /* 0x180 */ TChannelMgr mDefaultChannelMgr; /* 0x1D0 */ int mChannelMgrCount; diff --git a/include/JSystem/JAudio2/JASTrackPort.h b/include/JSystem/JAudio2/JASTrackPort.h index 5b7dff7840a..43a773da99d 100644 --- a/include/JSystem/JAudio2/JASTrackPort.h +++ b/include/JSystem/JAudio2/JASTrackPort.h @@ -17,7 +17,7 @@ public: /* 8029360C */ u32 checkImport(u32) const; /* 80293628 */ u32 checkExport(u32) const; - u16 get(u32 param_0) { return field_0x4[param_0]; } + u16 get(u32 param_0) const { return field_0x4[param_0]; } void set(u32 param_0, u16 param_1) { field_0x4[param_0] = param_1; } u16 field_0x0; diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index 5fa7081abaa..5ae2e827d0d 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -38,7 +38,8 @@ struct TUtil { return x; } f32 root = __frsqrte(x); - return 0.5f * root * (3.0f - x * (root * root)); + root = 0.5f * root * (3.0f - x * (root * root)); + return root; } }; @@ -137,6 +138,24 @@ inline float fsqrt_step(float mag) { return 0.5f * root * (3.0f - mag * (root * root)); } +inline void mulInternal(register const f32* a, register const f32* b, register float* dst) { + register f32 a_x_y; + register f32 b_x_y; + register f32 x_y; + register f32 za; + register f32 zb; + register f32 z; +#ifdef __MWERKS__ + asm { + psq_l a_x_y, 0(a), 0, 0 + psq_l b_x_y, 0(b), 0, 0 + ps_mul x_y, a_x_y, b_x_y + psq_st x_y, 0(dst), 0, 0 + }; + dst[2] = a[2] * b[2]; +#endif +} + template <> struct TVec3 : public Vec { inline TVec3(const Vec& i_vec) { @@ -147,7 +166,8 @@ struct TVec3 : public Vec { setTVec3f(&i_vec.x, &x); } - TVec3(f32 x, f32 y, f32 z) { + template + TVec3(U x, U y, U z) { set(x, y, z); } @@ -156,7 +176,8 @@ struct TVec3 : public Vec { operator Vec*() { return (Vec*)&x; } operator const Vec*() const { return (Vec*)&x; } - void set(const TVec3& other) { + template + void set(const TVec3& other) { x = other.x; y = other.y; z = other.z; @@ -168,7 +189,8 @@ struct TVec3 : public Vec { z = other.z; } - void set(f32 x_, f32 y_, f32 z_) { + template + void set(U x_, U y_, U z_) { x = x_; y = y_; z = z_; @@ -181,27 +203,7 @@ struct TVec3 : public Vec { void zero() { x = y = z = 0.0f; } void mul(const TVec3& a, const TVec3& b) { - register f32* dst = &x; - const register f32* srca = &a.x; - const register f32* srcb = &b.x; - register f32 a_x_y; - register f32 b_x_y; - register f32 x_y; - register f32 za; - register f32 zb; - register f32 z; -#ifdef __MWERKS__ - asm { - psq_l a_x_y, 0(srca), 0, 0 - psq_l b_x_y, 0(srcb), 0, 0 - ps_mul x_y, a_x_y, b_x_y - psq_st x_y, 0(dst), 0, 0 - lfs za, 8(srca) - lfs zb, 8(srcb) - fmuls z, za, zb - stfs z, 8(dst) - }; -#endif + mulInternal(&a.x, &b.x, &this->x); } inline void mul(const TVec3& a) { @@ -239,23 +241,19 @@ struct TVec3 : public Vec { return JMathInlineVEC::C_VECSquareMag((Vec*)&x); } - void normalize() { + f32 normalize() { f32 sq = squared(); - if (sq <= FLT_EPSILON * 32.0f) { - return; + if (sq <= TUtil::epsilon()) { + return 0.0f; } - f32 norm; - if (sq <= 0.0f) { - norm = sq; - } else { - norm = fsqrt_step(sq); - } - scale(norm); + f32 inv_norm = TUtil::inv_sqrt(sq); + scale(inv_norm); + return inv_norm * sq; } void normalize(const TVec3& other) { f32 sq = other.squared(); - if (sq <= FLT_EPSILON * 32.0f) { + if (sq <= TUtil::epsilon()) { zero(); return; } @@ -348,18 +346,14 @@ struct TVec3 : public Vec { VECCrossProduct(a, b, *this); } - void setLength(f32 len) { + f32 setLength(f32 len) { f32 sq = squared(); - if (sq <= FLT_EPSILON * 32.0f) { - return; + if (sq <= TUtil::epsilon()) { + return 0.0f; } - f32 norm; - if (sq <= 0.0f) { - norm = sq; - } else { - norm = fsqrt_step(sq); - } - scale(norm * len); + f32 inv_norm = TUtil::inv_sqrt(sq); + scale(inv_norm * len); + return inv_norm * sq; } f32 setLength(const TVec3& other, f32 len) { @@ -374,25 +368,7 @@ struct TVec3 : public Vec { } f32 dot(const TVec3& other) const { - register const f32* pThis = &x; - register const f32* pOther = &other.x; - register f32 res; - register f32 thisyz; - register f32 otheryz; - register f32 otherxy; - register f32 thisxy; -#ifdef __MWERKS__ - asm { - psq_l thisyz, 4(pThis), 0, 0 - psq_l otheryz, 4(pOther), 0, 0 - ps_mul thisyz, thisyz, otheryz - psq_l thisxy, 0(pThis), 0, 0 - psq_l otherxy, 0(pOther), 0, 0 - ps_madd otheryz, thisxy, otherxy, thisyz - ps_sum0 res, otheryz, thisyz, thisyz - }; -#endif - return res; + return JMathInlineVEC::C_VECDotProduct(this, &other); } void cubic(const TVec3& param_1, const TVec3& param_2, const TVec3& param_3, @@ -450,15 +426,15 @@ struct TVec2 { return (x >= other.x) && (y >= other.y) ? true : false; } - f32 dot(const TVec2& other) { + f32 dot(const TVec2& other) const { return x * other.x + y * other.y; } - f32 squared() { + f32 squared() const { return dot(*this); } - f32 length() { + f32 length() const { f32 sqr = squared(); if (sqr <= 0.0f) { return sqr; diff --git a/include/JSystem/JKernel/JKRHeap.h b/include/JSystem/JKernel/JKRHeap.h index f18fa60b313..ac66a84ec1e 100644 --- a/include/JSystem/JKernel/JKRHeap.h +++ b/include/JSystem/JKernel/JKRHeap.h @@ -8,6 +8,9 @@ class JKRHeap; typedef void (*JKRErrorHandler)(void*, u32, int); extern bool data_804508B0; +extern u8 data_804508B1; +extern u8 data_804508B2; +extern u8 data_804508B3; /** * @ingroup jsystem-jkernel @@ -247,4 +250,10 @@ inline JKRHeap* JKRGetRootHeap() { return JKRHeap::getRootHeap(); } +#ifdef DEBUG +inline void JKRSetDebugFillNotuse(u8 status) { data_804508B1 = status; } +inline void JKRSetDebugFillNew(u8 status) { data_804508B2 = status; } +inline void JKRSetDebugFillDelete(u8 status) { data_804508B3 = status; } +#endif + #endif /* JKRHEAP_H */ diff --git a/include/JSystem/JMath/JMath.h b/include/JSystem/JMath/JMath.h index 68cfab23156..eb7932e8480 100644 --- a/include/JSystem/JMath/JMath.h +++ b/include/JSystem/JMath/JMath.h @@ -227,6 +227,26 @@ namespace JMathInlineVEC { #endif return res; } + + inline f32 C_VECDotProduct(register const Vec *a, register const Vec *b) { + register f32 res; + register f32 thisyz; + register f32 otheryz; + register f32 otherxy; + register f32 thisxy; +#ifdef __MWERKS__ + asm { + psq_l thisyz, 4(a), 0, 0 + psq_l otheryz, 4(b), 0, 0 + ps_mul thisyz, thisyz, otheryz + psq_l thisxy, 0(a), 0, 0 + psq_l otherxy, 0(b), 0, 0 + ps_madd otheryz, thisxy, otherxy, thisyz + ps_sum0 res, otheryz, thisyz, thisyz + }; +#endif + return res; + } }; template diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h index 3ce4f3d2e77..3ebff4528c3 100644 --- a/include/JSystem/JParticle/JPABaseShape.h +++ b/include/JSystem/JParticle/JPABaseShape.h @@ -112,7 +112,7 @@ public: u32 getClrLoopOfst(u32 param_1) const { return getClrLoopOfstMask() & param_1; } u8 getTexLoopOfstMask() const { return mpData->mTexAnmRndmMask; } u32 getTexLoopOfst(u8 param_1) const { return getTexLoopOfstMask() & param_1; } - u8 getLoopOfstValue() { return mpData->mAnmRndm; } + u8 getLoopOfstValue() const { return mpData->mAnmRndm; } f32 getIncTransX() const { return ((f32*)mpTexCrdMtxAnmTbl)[5]; } f32 getInitTransX() const { return ((f32*)mpTexCrdMtxAnmTbl)[0]; } diff --git a/include/JSystem/JParticle/JPADrawInfo.h b/include/JSystem/JParticle/JPADrawInfo.h index 8eb2d54afe1..061783af2e6 100644 --- a/include/JSystem/JParticle/JPADrawInfo.h +++ b/include/JSystem/JParticle/JPADrawInfo.h @@ -22,8 +22,8 @@ public: Mtx mCamMtx; Mtx mPrjMtx; - void getCamMtx(Mtx* dst) const { MTXCopy(mCamMtx, *dst); } - void getPrjMtx(Mtx* dst) const { MTXCopy(mPrjMtx, *dst); } + void getCamMtx(Mtx dst) const { MTXCopy(mCamMtx, dst); } + void getPrjMtx(Mtx dst) const { MTXCopy(mPrjMtx, dst); } }; -#endif \ No newline at end of file +#endif diff --git a/include/JSystem/JParticle/JPADynamicsBlock.h b/include/JSystem/JParticle/JPADynamicsBlock.h index e408943769a..fc175ff69da 100644 --- a/include/JSystem/JParticle/JPADynamicsBlock.h +++ b/include/JSystem/JParticle/JPADynamicsBlock.h @@ -96,10 +96,10 @@ public: f32 getInitVelDir() { return mpData->mInitialVelDir; } f32 getInitVelDirSp() { return mpData->mSpread; } f32 getInitVelRndm() { return mpData->mInitialVelRndm; } - f32 getInitVelRatio() { return mpData->mInitialVelRatio; } + f32 getInitVelRatio() const { return mpData->mInitialVelRatio; } f32 getAirRes() { return mpData->mAirResist; } - f32 getLifeTimeRndm() { return mpData->mLifeTimeRndm; } - f32 getMomentRndm() { return mpData->mMoment; } + f32 getLifetimeRndm() const { return mpData->mLifeTimeRndm; } + f32 getMomentRndm() const { return mpData->mMoment; } public: /* 0x00 */ const JPADynamicsBlockData* mpData; diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index ac693c13255..063b7c1fbcb 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -19,13 +19,19 @@ class JPAParticleCallBack; * */ struct JPAEmitterWorkData { + struct JPAVolumeCalcData { + /* 0x00 */ JGeometry::TVec3 mVolumePos; + /* 0x0C */ JGeometry::TVec3 mVelOmni; + /* 0x18 */ JGeometry::TVec3 mVelAxis; + }; + + JPAEmitterWorkData() : mRndm(0) {} + /* 0x00 */ JPABaseEmitter* mpEmtr; /* 0x04 */ JPAResource* mpRes; /* 0x08 */ JPAResourceManager* mpResMgr; /* 0x0C */ JPARandom mRndm; - /* 0x10 */ JGeometry::TVec3 mVolumePos; - /* 0x1C */ JGeometry::TVec3 mVelOmni; - /* 0x28 */ JGeometry::TVec3 mVelAxis; + /* 0x10 */ JPAVolumeCalcData mVolumeCalcData; /* 0x34 */ f32 mVolumeSize; /* 0x38 */ f32 mVolumeMinRad; /* 0x3C */ f32 mVolumeSweep; @@ -94,7 +100,7 @@ enum { class JPABaseEmitter { public: /* 8027E5EC */ ~JPABaseEmitter() {} - /* 8027E64C */ JPABaseEmitter() : mLink(this) {} + /* 8027E64C */ JPABaseEmitter() : mLink(this), mRndm(0) {} /* 8027E6EC */ void init(JPAEmitterManager*, JPAResource*); /* 8027EDD4 */ bool processTillStartFrame(); /* 8027EE14 */ bool processTermination(); @@ -109,8 +115,8 @@ public: void initStatus(u32 status) { mStatus = status; } void setStatus(u32 status) { mStatus |= status; } void clearStatus(u32 status) { mStatus &= ~status; } - u32 checkStatus(u32 status) { return (mStatus & status); } - bool checkFlag(u32 flag) { return !!(mpRes->getDyn()->getFlag() & flag); } + u32 checkStatus(u32 status) const { return (mStatus & status); } + bool checkFlag(u32 flag) const { return !!(mpRes->getDyn()->getFlag() & flag); } u8 getResourceManagerID() const { return mResMgrID; } u8 getGroupID() const { return mGroupID; } u8 getDrawTimes() const { return mDrawTimes; } diff --git a/include/JSystem/JParticle/JPAEmitterManager.h b/include/JSystem/JParticle/JPAEmitterManager.h index 37ba924b7e5..5cd69a286fb 100644 --- a/include/JSystem/JParticle/JPAEmitterManager.h +++ b/include/JSystem/JParticle/JPAEmitterManager.h @@ -32,18 +32,18 @@ public: /* 8027E344 */ void entryResourceManager(JPAResourceManager*, u8); /* 8027E354 */ void clearResourceManager(u8); /* 8027E3F4 */ void calcYBBCam(); - JPAResourceManager* getResourceManager(u16 idx) { return mpResMgrAry[idx]; } + JPAResourceManager* getResourceManager(u16 idx) { return pResMgrAry[idx]; } public: - /* 0x00 */ JSUList* mpGrpEmtr; + /* 0x00 */ JSUList* pEmtrUseList; /* 0x04 */ JSUList mFreeEmtrList; /* 0x10 */ JPAList mPtclPool; - /* 0x1C */ JPAResourceManager** mpResMgrAry; - /* 0x20 */ JPAEmitterWorkData* mpWorkData; - /* 0x24 */ u32 mEmtrMax; - /* 0x28 */ u32 mPtclMax; - /* 0x2C */ u8 mGrpMax; - /* 0x2D */ u8 mResMax; + /* 0x1C */ JPAResourceManager** pResMgrAry; + /* 0x20 */ JPAEmitterWorkData* pWd; + /* 0x24 */ u32 emtrNum; + /* 0x28 */ u32 ptclNum; + /* 0x2C */ u8 gidMax; + /* 0x2D */ u8 ridMax; }; #endif /* JPAEMITTERMANAGER_H */ diff --git a/include/JSystem/JParticle/JPAFieldBlock.h b/include/JSystem/JParticle/JPAFieldBlock.h index 5df9365d97a..2031ba26b04 100644 --- a/include/JSystem/JParticle/JPAFieldBlock.h +++ b/include/JSystem/JParticle/JPAFieldBlock.h @@ -126,8 +126,8 @@ public: u32 getAddType() { return (mpData->mFlags >> 8) & 3; } u32 getSttFlag() { return mpData->mFlags >> 16; } bool checkStatus(u16 flag) { return flag & getSttFlag(); } - f32 getMagRndm() { return mpData->mMagRndm; } - f32 getVal1() { return mpData->mVal1; } + f32 getMagRndm() const { return mpData->mMagRndm; } + f32 getVal1() const { return mpData->mVal1; } f32 getFadeInTime() { return mpData->mFadeInTime; } f32 getFadeOutTime() { return mpData->mFadeOutTime; } f32 getEnTime() { return mpData->mEnTime; } @@ -137,7 +137,7 @@ public: f32 getFadeOutRate() { return mFadeOutRate; } JGeometry::TVec3& getPos() { return mPos; } JGeometry::TVec3& getDir() { return mDir; } - f32 getMag() { return mMag; } + f32 getMag() const { return mMag; } void getPosOrig(JGeometry::TVec3* pos) { pos->set(mpData->mPos); } void getDirOrig(JGeometry::TVec3* dir) { dir->set(mpData->mDir); } f32 getMagOrig() { return mpData->mMag; } diff --git a/include/JSystem/JParticle/JPAList.h b/include/JSystem/JParticle/JPAList.h index b5caf50a76d..ab2e5a7fdf7 100644 --- a/include/JSystem/JParticle/JPAList.h +++ b/include/JSystem/JParticle/JPAList.h @@ -9,9 +9,7 @@ */ template struct JPANode { - JPANode() { - mpPrev = NULL; - mpNext = NULL; + JPANode() : mpPrev(NULL), mpNext(NULL) { } ~JPANode() {} JPANode* getPrev() { return mpPrev; } @@ -34,6 +32,7 @@ struct JPAList { /* 0x08 */ u32 mNum; JPAList() : mpFirst(NULL), mpLast(NULL), mNum() {} + ~JPAList() {} JPANode* getEnd() { return NULL; } JPANode* getFirst() const { return mpFirst; } @@ -65,8 +64,7 @@ struct JPAList { } else { mpFirst = node; mpLast = node; - node->mpPrev = NULL; - node->mpNext = NULL; + node->mpNext = node->mpPrev = NULL; } mNum++; diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 26cb4830f26..2e67f8e84ad 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -19,6 +19,7 @@ struct JPAEmitterWorkData; */ class JPABaseParticle { public: + ~JPABaseParticle() {} /* 8027EFEC */ void init_p(JPAEmitterWorkData*); /* 8027F8C8 */ void init_c(JPAEmitterWorkData*, JPABaseParticle*); /* 8027FFD0 */ bool calc_p(JPAEmitterWorkData*); diff --git a/include/JSystem/JParticle/JPARandom.h b/include/JSystem/JParticle/JPARandom.h index 25c3046a438..5ffb276d072 100644 --- a/include/JSystem/JParticle/JPARandom.h +++ b/include/JSystem/JParticle/JPARandom.h @@ -10,6 +10,8 @@ struct JPARandom { public: JPARandom() { mSeed = 0; } + JPARandom(u32 seed) { mSeed = seed; } + ~JPARandom() {} void set_seed(u32 seed) { mSeed = seed; } u32 get_rndm_u() { return mSeed = mSeed * 0x19660du + 0x3c6ef35fu; } diff --git a/include/JSystem/JStudio/JStudio/jstudio-control.h b/include/JSystem/JStudio/JStudio/jstudio-control.h index e67c533f523..8a2e85bd9f2 100644 --- a/include/JSystem/JStudio/JStudio/jstudio-control.h +++ b/include/JSystem/JStudio/JStudio/jstudio-control.h @@ -195,12 +195,12 @@ public: } TTransform_position_direction* - transformOnGet_transform_ifEnabled(TTransform_position_direction* param_1, + transformOnGet_transform_ifEnabled(TTransform_position_direction& param_1, TTransform_position_direction* param_2) const { if (!transformOnGet_isEnabled()) { - return param_1; + return ¶m_1; } - transformOnGet_transform(param_1, param_2); + transformOnGet_transform(¶m_1, param_2); return param_2; } diff --git a/include/JSystem/JStudio/JStudio/jstudio-object.h b/include/JSystem/JStudio/JStudio/jstudio-object.h index 1eb93d5abba..4ece3fbab1c 100644 --- a/include/JSystem/JStudio/JStudio/jstudio-object.h +++ b/include/JSystem/JStudio/JStudio/jstudio-object.h @@ -197,7 +197,7 @@ struct TAdaptor { return &pValue_[param_0]; } - const TObject* adaptor_getObject() { return pObject_; } + const TObject* adaptor_getObject() const { return pObject_; } /* 0x4 */ const TObject* pObject_; /* 0x8 */ TVariableValue* pValue_; diff --git a/include/JSystem/JSupport/JSUList.h b/include/JSystem/JSupport/JSUList.h index 7228ff0a101..884b8b9b646 100644 --- a/include/JSystem/JSupport/JSUList.h +++ b/include/JSystem/JSupport/JSUList.h @@ -45,13 +45,13 @@ class JSULink : public JSUPtrLink { public: JSULink(T* object) : JSUPtrLink((void*)object) {} - T* getObject() const { return static_cast(getObjectPtr()); } + T* getObject() const { return static_cast(mObject); } JSUList* getSupervisor() const { return static_cast*>(this->getList()); } - JSULink* getNext() const { return static_cast(this->JSUPtrLink::getNext()); } + JSULink* getNext() const { return static_cast(mNext); } - JSULink* getPrev() const { return static_cast(this->JSUPtrLink::getPrev()); } + JSULink* getPrev() const { return static_cast(mPrev); } }; // diff --git a/include/JSystem/JUtility/JUTAssert.h b/include/JSystem/JUtility/JUTAssert.h index 95767093ed6..71a764b3c86 100644 --- a/include/JSystem/JUtility/JUTAssert.h +++ b/include/JSystem/JUtility/JUTAssert.h @@ -10,15 +10,18 @@ #define JUT_ASSERT_MSG(LINE, COND, MSG) \ (COND) ? (void)0 : (JUTAssertion::showAssert(JUTAssertion::getSDevice(), __FILE__, LINE, MSG), OSPanic(__FILE__, LINE, "Halt")); +#define JUT_ASSERT_MSG_F(LINE, COND, MSG, ...) \ + (COND) ? (void)0 : (JUTAssertion::showAssert_f(JUTAssertion::getSDevice(), __FILE__, LINE, MSG, __VA_ARGS__), OSPanic(__FILE__, LINE, "Halt")); + #define JUT_PANIC(LINE, TEXT) \ JUTAssertion::showAssert(JUTAssertion::getSDevice(), __FILE__, LINE, TEXT); \ OSPanic(__FILE__, LINE, "Halt"); -#define JUT_WARN(LINE, ...) \ - JUTAssertion::setWarningMessage_f(JUTAssertion::getSDevice(), __FILE__, LINE, __VA_ARGS__); \ +#define JUT_WARN_DEVICE(LINE, DEVICE, ...) \ + JUTAssertion::setWarningMessage_f(DEVICE, __FILE__, LINE, __VA_ARGS__); \ -#define JUT_WARN_1(LINE, ...) \ - JUTAssertion::setWarningMessage_f(1, __FILE__, LINE, __VA_ARGS__); \ +#define JUT_WARN(LINE, ...) \ + JUT_WARN_DEVICE(LINE, JUTAssertion::getSDevice(), __VA_ARGS__) #define JUT_LOG(LINE, ...) \ JUTAssertion::setLogMessage_f(JUTAssertion::getSDevice(), __FILE__, LINE, __VA_ARGS__) @@ -29,9 +32,10 @@ #else #define JUT_ASSERT(...) (void)0; #define JUT_ASSERT_MSG(...) (void)0; +#define JUT_ASSERT_MSG_F(...) (void)0; #define JUT_PANIC(...) #define JUT_WARN(...) -#define JUT_WARN_1(...) +#define JUT_WARN_DEVICE(...) #define JUT_LOG(...) #define JUT_CONFIRM(...) #endif @@ -46,6 +50,7 @@ namespace JUTAssertion { u32 getSDevice(); void showAssert(u32 device, const char * file, int line, const char * assertion); + void showAssert_f(u32 device, const char* file, int line, const char* msg, ...); void setWarningMessage_f(u32 device, char * file, int line, const char * fmt, ...); void setLogMessage_f(u32 device, char* file, int line, const char* fmt, ...); void setConfirmMessage(u32 param_1, char* file, int line, bool param_4, const char* msg); diff --git a/include/Z2AudioLib/Z2SceneMgr.h b/include/Z2AudioLib/Z2SceneMgr.h index 2db1c7edfec..27b2b65d74e 100644 --- a/include/Z2AudioLib/Z2SceneMgr.h +++ b/include/Z2AudioLib/Z2SceneMgr.h @@ -31,7 +31,7 @@ public: bool loadBgmWave(u32); bool isSceneExist() { return sceneExist; } - int getCurrentSceneNum() const { return sceneNum; } + int getCurrentSceneNum() { return sceneNum; } s8 getCurrentRoomNum() { return roomNum; } bool isInGame() const { return inGame; } void setInGame(bool i_inGame) { inGame = i_inGame; } diff --git a/include/Z2AudioLib/Z2SeqMgr.h b/include/Z2AudioLib/Z2SeqMgr.h index c500b18ed9a..3689a4426ab 100644 --- a/include/Z2AudioLib/Z2SeqMgr.h +++ b/include/Z2AudioLib/Z2SeqMgr.h @@ -183,6 +183,11 @@ public: JAISoundHandle* getMainBgmHandle() { return &mMainBgmHandle; } JAISoundHandle* getSubBgmHandle() { return &mSubBgmHandle; } + #ifdef DEBUG + f32 field_0x00_debug; + u8 field_0x04_debug; + #endif + /* 0x00 */ JAISoundHandle mMainBgmHandle; /* 0x04 */ JAISoundHandle mSubBgmHandle; /* 0x08 */ JAISoundHandle mFanfareHandle; diff --git a/include/m_Do/m_Do_main.h b/include/m_Do/m_Do_main.h index 003ebefc383..5e4aa326631 100644 --- a/include/m_Do/m_Do_main.h +++ b/include/m_Do/m_Do_main.h @@ -53,6 +53,10 @@ private: struct mDoMain { static char COPYDATE_STRING[18]; static u32 memMargin; + #ifdef DEBUG + static u32 archiveHeapSize; + static u32 gameHeapSize; + #endif static u8 mHeapBriefType; static OSTime sPowerOnTime; static OSTime sHungUpTime; diff --git a/src/JSystem/J3DGraphAnimator/J3DMaterialAttach.cpp b/src/JSystem/J3DGraphAnimator/J3DMaterialAttach.cpp index f87f18f4350..4598abbc971 100644 --- a/src/JSystem/J3DGraphAnimator/J3DMaterialAttach.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DMaterialAttach.cpp @@ -38,12 +38,13 @@ J3DMaterialTable::~J3DMaterialTable() {} /* 8032F64C-8032F6F8 329F8C 00AC+00 0/0 1/1 5/5 .text * removeMatColorAnimator__16J3DMaterialTableFP11J3DAnmColor */ int J3DMaterialTable::removeMatColorAnimator(J3DAnmColor* pAnmColor) { + JUT_ASSERT_MSG(208, pAnmColor != NULL, "Error : null pointer.") int ret = false; u16 updateMatNum = pAnmColor->getUpdateMaterialNum(); for (u16 i = 0; i < updateMatNum; i++) { if (pAnmColor->isValidUpdateMaterialID(i)) { - J3DMaterial* materialNode = getMaterialNodePointer(pAnmColor->getUpdateMaterialID(i)); - J3DMaterialAnm* materialAnm = materialNode->getMaterialAnm(); + u16 materialUpdateId = pAnmColor->getUpdateMaterialID(i); + J3DMaterialAnm* materialAnm = getMaterialNodePointer(materialUpdateId)->getMaterialAnm(); if (materialAnm == NULL) { ret = true; } else { @@ -57,9 +58,10 @@ int J3DMaterialTable::removeMatColorAnimator(J3DAnmColor* pAnmColor) { /* 8032F6F8-8032F7B4 32A038 00BC+00 0/0 5/5 10/10 .text * removeTexNoAnimator__16J3DMaterialTableFP16J3DAnmTexPattern */ int J3DMaterialTable::removeTexNoAnimator(J3DAnmTexPattern* anm) { + JUT_ASSERT_MSG(242, anm != NULL, "Error : null pointer.") int ret = 0; u16 materialNum = anm->getUpdateMaterialNum(); - J3DAnmTexPatternFullTable* anm_table = anm->mAnmTable; + J3DAnmTexPatternFullTable* anm_table = (J3DAnmTexPatternFullTable*)anm->getAnmTable(); for (u16 i = 0; i < materialNum; i++) { if (anm->isValidUpdateMaterialID(i)) { @@ -80,13 +82,16 @@ int J3DMaterialTable::removeTexNoAnimator(J3DAnmTexPattern* anm) { /* 8032F7B4-8032F880 32A0F4 00CC+00 0/0 4/4 26/26 .text * removeTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey */ int J3DMaterialTable::removeTexMtxAnimator(J3DAnmTextureSRTKey* pAnm) { + JUT_ASSERT_MSG(278, pAnm != NULL, "Error : null pointer.") s32 ret = 0; u16 materialNum = pAnm->getUpdateMaterialNum(); + u16 postUpdateMaterialNum[1]; + postUpdateMaterialNum[0] = pAnm->getPostUpdateMaterialNum(); for (u16 i = 0; i < materialNum; i++) { - u16 materialID = pAnm->getUpdateMaterialID(i); - if (materialID != 0xFFFF) { - J3DMaterial* pMaterial = getMaterialNodePointer(materialID); + if (pAnm->isValidUpdateMaterialID(i)) { + u16 updateMaterial = pAnm->getUpdateMaterialID(i); + J3DMaterial* pMaterial = getMaterialNodePointer(updateMaterial); J3DMaterialAnm* pMatAnm = pMaterial->getMaterialAnm(); u8 texMtxID = pAnm->getUpdateTexMtxID(i); if (pMatAnm == NULL) { @@ -210,8 +215,9 @@ int J3DMaterialTable::entryTexNoAnimator(J3DAnmTexPattern* param_1) { /* 8032FCC4-8032FE70 32A604 01AC+00 0/0 14/14 6/6 .text * entryTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey */ -// NONMATCHING getUpdateTexMtxID u8 issue +// NONMATCHING regalloc int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) { + JUT_ASSERT_MSG(532, param_1 != NULL, "Error : null pointer.") int rv = 0; u16 materialNum = param_1->getUpdateMaterialNum(); rv = createTexMtxForAnimator(param_1); @@ -223,7 +229,10 @@ int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) { } for (u16 i = 0; i < materialNum; i++) { if (param_1->isValidUpdateMaterialID(i)) { - J3DMaterial* material = getMaterialNodePointer(param_1->getUpdateMaterialID(i)); + u16 updateMaterialId = param_1->getUpdateMaterialID(i); + // Maybe helps? Makes material r26 instead of r30 + //J3DMaterial* material = (J3DMaterial*)getMaterialNodePointer((u16)updateMaterialId); + J3DMaterial* material = getMaterialNodePointer((u16)updateMaterialId); J3DMaterialAnm* materialAnm = material->getMaterialAnm(); u8 texMtxID = param_1->getUpdateTexMtxID(i); if (materialAnm == 0) { @@ -231,7 +240,7 @@ int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) { } else { if (texMtxID != 0xff) { if (material->getTexCoord(texMtxID) != NULL) { - material->getTexCoord(texMtxID)->setTexGenMtx(texMtxID * 3 + 30); + material->getTexCoord(texMtxID)->setTexGenMtx((u8)texMtxID * 3 + 30); } J3DTexMtxInfo& iVar3 = material->getTexMtx(texMtxID)->getTexMtxInfo(); iVar3.mInfo = (iVar3.mInfo & 0x3f) | (param_1->getTexMtxCalcType() << 7); diff --git a/src/JSystem/JAudio2/JASAiCtrl.cpp b/src/JSystem/JAudio2/JASAiCtrl.cpp index 25141ceb357..04499c3067f 100644 --- a/src/JSystem/JAudio2/JASAiCtrl.cpp +++ b/src/JSystem/JAudio2/JASAiCtrl.cpp @@ -16,6 +16,7 @@ #include "JSystem/JAudio2/JASReport.h" #include "JSystem/JAudio2/JASLfo.h" #include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" #include "dolphin/ai.h" #include @@ -52,19 +53,32 @@ JASDriver::MixCallback JASDriver::extMixCallback; /* 804512C0-804512C4 0007C0 0004+00 2/2 0/0 0/0 .sbss sOutputRate__9JASDriver */ u32 JASDriver::sOutputRate; +/* 804507AC-804507B0 00022C 0004+00 2/2 0/0 0/0 .sdata sMixMode__9JASDriver */ +JASMixMode JASDriver::sMixMode = MIX_MODE_EXTRA; + +/* 804507B0-804507B4 000230 0004+00 2/2 0/0 0/0 .sdata sDacRate__9JASDriver */ +f32 JASDriver::sDacRate = 32028.5f; + +/* 804507B4-804507B8 000234 0004+00 4/3 0/0 0/0 .sdata sSubFrames__9JASDriver */ +u32 JASDriver::sSubFrames = 0x00000007; + /* 8029C388-8029C4E4 296CC8 015C+00 0/0 1/1 0/0 .text initAI__9JASDriverFPFv_v */ // NONMATCHING missing instructions void JASDriver::initAI(void (*param_0)(void)) { setOutputRate(OUTPUT_RATE_0); - u32 size = getDacSize() * 2; + u32 dacSize = getDacSize(); + u32 size = dacSize * 2; for (int i = 0; i < 3; i++) { - sDmaDacBuffer[i] = new(JASDram, 0x20) s16[size / 2]; + sDmaDacBuffer[i] = new(JASDram, 0x20) s16[dacSize]; + JUT_ASSERT(102, sDmaDacBuffer[i]) JASCalc::bzero(sDmaDacBuffer[i], size); DCStoreRange(sDmaDacBuffer[i], size); } sDspDacBuffer = new(JASDram, 0) s16*[data_804507A8]; + JUT_ASSERT(113, sDspDacBuffer); for (int i = 0; i < data_804507A8; i++) { sDspDacBuffer[i] = new(JASDram, 0x20) s16[getDacSize()]; + JUT_ASSERT(119, sDspDacBuffer[i]); JASCalc::bzero(sDspDacBuffer[i], size); DCStoreRange(sDspDacBuffer[i], size); } @@ -74,7 +88,13 @@ void JASDriver::initAI(void (*param_0)(void)) { JASChannel::initBankDisposeMsgQueue(); AIInit(NULL); AIInitDMA((u32)sDmaDacBuffer[2], size); - AISetDSPSampleRate(sOutputRate != 0); + BOOL isOutputRate; + if (sOutputRate == 0) { + isOutputRate = FALSE; + } else { + isOutputRate = TRUE; + } + AISetDSPSampleRate((u8)isOutputRate); AIRegisterDMACallback(param_0); } @@ -89,15 +109,6 @@ void JASDriver::stopDMA() { AIStopDMA(); } -/* 804507AC-804507B0 00022C 0004+00 2/2 0/0 0/0 .sdata sMixMode__9JASDriver */ -JASMixMode JASDriver::sMixMode = MIX_MODE_EXTRA; - -/* 804507B0-804507B4 000230 0004+00 2/2 0/0 0/0 .sdata sDacRate__9JASDriver */ -f32 JASDriver::sDacRate = 32028.5f; - -/* 804507B4-804507B8 000234 0004+00 4/3 0/0 0/0 .sdata sSubFrames__9JASDriver */ -u32 JASDriver::sSubFrames = 0x00000007; - /* 8029C524-8029C568 296E64 0044+00 1/1 0/0 0/0 .text setOutputRate__9JASDriverF13JASOutputRate */ void JASDriver::setOutputRate(JASOutputRate param_0) { sOutputRate = param_0; @@ -157,6 +168,11 @@ void JASDriver::updateDSP() { static u32 history[10] = {0x000F4240}; JASProbe::start(3, "SFR-UPDATE"); JASDsp::invalChannelAll(); + + #ifdef DEBUG + JASDsp::dspMutex = 1; + #endif + JASPortCmd::execAllCommand(); DSPSyncCallback(); static u32 old_time = 0; @@ -165,40 +181,59 @@ void JASDriver::updateDSP() { old_time = r28; u32 subFrame = getSubFrames(); int r26 = JASAudioThread::getDSPSyncCount(); + JUT_ASSERT(254, subFrame <= 10); history[subFrame - r26] = r27; if (subFrame != r26 && f32(history[0]) / r27 < 1.1f) { + #ifdef DEBUG + static int killCounter; + JASReport("kill DSP channel", killCounter); + JASDSPChannel::killActiveChannel(); + killCounter++; + #else JASReport("kill DSP channel"); JASDSPChannel::killActiveChannel(); + #endif } JASChannel::receiveBankDisposeMsg(); JASDSPChannel::updateAll(); + + #ifdef DEBUG + JASDsp::dspMutex = 0; + #endif + subframeCallback(); - JASLfo::updateFreeRun(32028.5f / getDacRate()); + f32 freeRun = 32028.5f / getDacRate(); + JASLfo::updateFreeRun(freeRun); JASProbe::stop(3); sSubFrameCounter++; } /* 8029C7E0-8029C900 297120 0120+00 1/1 0/0 0/0 .text readDspBuffer__9JASDriverFPsUl */ -// NONMATCHING one wrong instruction void JASDriver::readDspBuffer(s16* param_0, u32 param_1) { - s32 r29 = sDspDacReadBuffer + 1; - if (r29 == data_804507A8) { - r29 = 0; + s32 nbuf = sDspDacReadBuffer + 1; + if (nbuf == data_804507A8) { + nbuf = 0; } - if (r29 == sDspDacWriteBuffer && data_804507A8 >= 3) { - s16 r25 = sDspDacBuffer[sDspDacReadBuffer][param_1 / 2 - 1]; - s16 r24 = sDspDacBuffer[sDspDacReadBuffer][param_1 - 1]; + if (nbuf == sDspDacWriteBuffer && data_804507A8 >= 3) { + s16 r25 = (s16)sDspDacBuffer[sDspDacReadBuffer][param_1 / 2 - 1]; + s16 r24 = (s16)sDspDacBuffer[sDspDacReadBuffer][param_1 - 1]; for (int i = 0; i < param_1; i++) { - sDspDacBuffer[sDspDacReadBuffer][i] = r25; + sDspDacBuffer[sDspDacReadBuffer][i] = (s16)r25; } for (int i = param_1; i < param_1 * 2; i++) { sDspDacBuffer[sDspDacReadBuffer][i] = (s16)r24; } +#ifdef DEBUG + JASReport("readDspBuffer nbuf:%d sWBuf:%d BCount:%d stat:%d", nbuf, sDspDacWriteBuffer, + data_804507A8, sDspStatus); +#endif } else { - sDspDacReadBuffer = r29; - DCInvalidateRange(sDspDacBuffer[r29], param_1 * 4); + sDspDacReadBuffer = nbuf; + DCInvalidateRange(sDspDacBuffer[sDspDacReadBuffer], param_1 * 2 * 2); } - JASCalc::imixcopy(sDspDacBuffer[sDspDacReadBuffer] + param_1, sDspDacBuffer[sDspDacReadBuffer], param_0, param_1); + s16* dacBuffer = sDspDacBuffer[sDspDacReadBuffer]; + s16* endDacBuffer = dacBuffer + param_1; + JASCalc::imixcopy(endDacBuffer, dacBuffer, param_0, param_1); } /* 8029C900-8029C9DC 297240 00DC+00 1/1 1/1 0/0 .text finishDSPFrame__9JASDriverFv */ @@ -242,7 +277,7 @@ u32 JASDriver::getSubFrames() { /* 8029C9F8-8029CA04 297338 000C+00 2/2 0/0 0/0 .text getDacSize__9JASDriverFv */ u32 JASDriver::getDacSize() { - return sSubFrames * 0xa0; + return sSubFrames * 0x50 * 2; } /* 8029CA04-8029CA10 297344 000C+00 3/3 0/0 0/0 .text getFrameSamples__9JASDriverFv */ diff --git a/src/JSystem/JAudio2/JASDSPInterface.cpp b/src/JSystem/JAudio2/JASDSPInterface.cpp index 461e56a98af..31c4b24162d 100644 --- a/src/JSystem/JAudio2/JASDSPInterface.cpp +++ b/src/JSystem/JAudio2/JASDSPInterface.cpp @@ -711,3 +711,7 @@ u16 DSP_CreateMap2(u32 param_0) { /* 804507B8-804507C0 000238 0004+04 0/0 5/5 0/0 .sdata one__11JASWaveInfo */ u32 JASWaveInfo::one = 1; + +#ifdef DEBUG +s32 dspMutex = 1; +#endif diff --git a/src/JSystem/JAudio2/JASSeqParser.cpp b/src/JSystem/JAudio2/JASSeqParser.cpp index 7ed12a0ae98..16d38d21332 100644 --- a/src/JSystem/JAudio2/JASSeqParser.cpp +++ b/src/JSystem/JAudio2/JASSeqParser.cpp @@ -9,28 +9,8 @@ #include "JSystem/JAudio2/JASTrack.h" #include "JSystem/JMath/random.h" #include "JSystem/JSupport/JSupport.h" +#include "JSystem/JUtility/JUTAssert.h" -/* 80293CF4-80293DC4 28E634 00D0+00 3/3 0/0 0/0 .text - * conditionCheck__12JASSeqParserFP8JASTrackQ212JASSeqParser15BranchCondition */ -bool JASSeqParser::conditionCheck(JASTrack* param_0, JASSeqParser::BranchCondition param_1) { - u16 reg = readReg(param_0, 3); - switch (param_1) { - case 0: - return 1; - case 1: - return reg == 0; - case 2: - return reg != 0; - case 3: - return reg == 1; - case 4: - return 0x8000 <= reg; - case 5: - return 0x8000 > reg; - default: - return 0; - } -} /* 803C5E80-803C6480 022FA0 0600+00 1/2 0/0 0/0 .data sCmdInfo__12JASSeqParser */ JASSeqParser::CmdInfo JASSeqParser::sCmdInfo[96] = { @@ -143,6 +123,29 @@ JASSeqParser::CmdInfo JASSeqParser::sExtCmdInfo[255] = { NULL, 0x0000, 0x0000, }; +/* 80293CF4-80293DC4 28E634 00D0+00 3/3 0/0 0/0 .text + * conditionCheck__12JASSeqParserFP8JASTrackQ212JASSeqParser15BranchCondition */ +bool JASSeqParser::conditionCheck(JASTrack* param_0, JASSeqParser::BranchCondition param_1) { + u16 reg = readReg(param_0, 3); + switch (param_1) { + case 0: + return 1; + case 1: + return reg == 0; + case 2: + return reg != 0; + case 3: + return reg == 1; + case 4: + return 0x8000 <= reg; + case 5: + return 0x8000 > reg; + default: + JUT_WARN(463, "%s", "Unexpected condition flag"); + return 0; + } +} + /* 80293DC4-80293FC8 28E704 0204+00 8/7 0/0 0/0 .text writeReg__12JASSeqParserFP8JASTrackUlUl */ void JASSeqParser::writeReg(JASTrack* param_0, u32 param_1, u32 param_2) { param_0->writeReg(JASRegisterParam::REG3, param_2); @@ -171,6 +174,7 @@ void JASSeqParser::writeReg(JASTrack* param_0, u32 param_1, u32 param_2) { break; case 0x60: case 0x61: + JUT_WARN(502, "%s", "writeReg for Read-Only Register"); break; case 0x62: param_0->setTimebase(param_2); @@ -259,57 +263,80 @@ u32 JASSeqParser::readReg(JASTrack* param_0, u32 param_1) const { case 0x4d: case 0x4e: case 0x4f: - return param_0->getPort(param_1 - 0x40); + result = param_0->getPort(param_1 - 0x40); + break; case 0x60: r27 = 1; - for (int i = 0; i < 16; i++) { + for (u32 i = 0; i < 16; i++, r27 <<= 1) { JASTrack* child = param_0->getChild(i); if (child && child->getStatus() == 1) { result |= r27; } - r27 <<= 1; } break; case 0x61: - return param_0->getSeqCtrl()->getSeqReader()->getLoopCount(); + result = param_0->getSeqCtrl()->getSeqReader()->getLoopCount(); + break; case 0x62: - return param_0->getTimebase(); + result = param_0->getTimebase(); + break; case 0x63: - return param_0->mTranspose; + result = param_0->getTranspose(); + break; case 0x64: - return param_0->getBendSense(); + result = param_0->getBendSense(); + break; case 0x65: - return param_0->getGateRate(); + result = param_0->getGateRate(); + break; case 0x66: - return param_0->getSkipSample(); + result = param_0->getSkipSample(); + break; case 0x67: - return param_0->getBankNumber(); + result = param_0->getBankNumber(); + break; case 0x68: - return param_0->getProgNumber(); + result = param_0->getProgNumber(); + break; case 0x69: - return param_0->getPanPower() * 32767.0f; + result = param_0->getPanPower() * 32767.0f; + break; case 0x6a: - return param_0->getReleasePrio() | param_0->getNoteOnPrio(); + result = param_0->getReleasePrio(); + // @bug this should have been <<= + result << 8; + result |= param_0->getNoteOnPrio(); + break; case 0x6b: - return param_0->getNoteOnPrio(); + result = param_0->getNoteOnPrio(); + break; case 0x6c: - return param_0->getReleasePrio(); + result = param_0->getReleasePrio(); + break; case 0x6d: - return param_0->getDirectRelease(); + result = param_0->getDirectRelease(); + break; case 0x6e: - return param_0->getVibDepth() * 1524.0f; + result = param_0->getVibDepth() * 1524.0f; + break; case 0x6f: - return param_0->getVibDepth() * 12192.0f; + result = param_0->getVibDepth() * 12192.0f; + break; case 0x70: - return param_0->getTremDepth() * 256.0f; + result = param_0->getTremDepth() * 256.0f; + break; case 0x71: - return param_0->getVibPitch() * 64.0f; + result = param_0->getVibPitch() * 64.0f; + break; case 0x72: - return param_0->getTremPitch() * 64.0f; + result = param_0->getTremPitch() * 64.0f; + break; case 0x73: - return param_0->getVibDelay(); + result = param_0->getVibDelay(); + break; case 0x74: - return param_0->getTremDelay(); + result = param_0->getTremDelay(); + break; default: break; } @@ -323,6 +350,7 @@ s32 JASSeqParser::cmdOpenTrack(JASTrack* param_0, u32* param_1) { u32 r28 = param_1[1]; JASTrack* child = param_0->openChild(r29); if (!child) { + JUT_WARN(679, "%s", "Cannot open child track"); return 0; } child->setSeqData(param_0->getSeqCtrl()->getBase(), r28); @@ -354,6 +382,7 @@ s32 JASSeqParser::cmdCallF(JASTrack* param_0, u32* param_1) { /* 8029429C-802942D4 28EBDC 0038+00 1/0 0/0 0/0 .text cmdRet__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdRet(JASTrack* param_0, u32* param_1) { if (!param_0->getSeqCtrl()->ret()) { + JUT_WARN(718, "%s", "cannot ret for call-stack is NULL"); return 0; } return 0; @@ -363,6 +392,7 @@ s32 JASSeqParser::cmdRet(JASTrack* param_0, u32* param_1) { s32 JASSeqParser::cmdRetF(JASTrack* param_0, u32* param_1) { if (conditionCheck(param_0, BranchCondition(param_1[0]))) { if (!param_0->getSeqCtrl()->ret()) { + JUT_WARN(729, "%s", "cannot ret for call-stack is NULL"); return 0; } } @@ -385,9 +415,9 @@ s32 JASSeqParser::cmdJmpF(JASTrack* param_0, u32* param_1) { /* 80294398-802943CC 28ECD8 0034+00 1/0 0/0 0/0 .text cmdJmpTable__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdJmpTable(JASTrack* param_0, u32* param_1) { + JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); u32 uVar1 = param_1[0]; uVar1 += uVar1 * 2; - JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); seqCtrl->jump(seqCtrl->get24(param_1[1] + uVar1)); return 0; } @@ -449,11 +479,15 @@ s32 JASSeqParser::cmdWritePort(JASTrack* param_0, u32* param_1) { /* 802945BC-802945F8 28EEFC 003C+00 1/0 0/0 0/0 .text * cmdParentWritePort__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdParentWritePort(JASTrack* param_0, u32* param_1) { - JASTrack* parent = param_0->getParent(); - if (parent) { - parent->writePort(param_1[0], param_1[1]); - } else { - + { + u32* p1 = param_1; + u32* p2 = param_1 + 1; + JASTrack* parent = param_0->getParent(); + if (parent) { + parent->writePort(*p1, *p2); + } else { + JUT_WARN(835, "%s", "parent == NULL"); + } } return 0; } @@ -461,11 +495,14 @@ s32 JASSeqParser::cmdParentWritePort(JASTrack* param_0, u32* param_1) { /* 802945F8-80294644 28EF38 004C+00 1/0 0/0 0/0 .text * cmdChildWritePort__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdChildWritePort(JASTrack* param_0, u32* param_1) { - JASTrack* child = param_0->getChild(JSUHiNibble(param_1[0])); - if (child) { - child->writePort(JSULoNibble(param_1[0]), param_1[1]); - } else { - + { + u8 val = param_1[0]; + JASTrack* child = param_0->getChild(JSUHiNibble(val)); + if (child) { + child->writePort(JSULoNibble(val), param_1[1]); + } else { + JUT_WARN(848, "%s", "child == NULL"); + } } return 0; } @@ -473,12 +510,14 @@ s32 JASSeqParser::cmdChildWritePort(JASTrack* param_0, u32* param_1) { /* 80294644-802946AC 28EF84 0068+00 1/0 0/0 0/0 .text * cmdParentReadPort__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdParentReadPort(JASTrack* param_0, u32* param_1) { + u32* p1 = param_1; + u32* p2 = param_1 + 1; JASTrack* parent = param_0->getParent(); if (parent) { - u16 tmp = parent->readPort(param_1[0]); - writeReg(param_0, param_1[1], tmp); + u16 tmp = parent->readPort(*p1); + writeReg(param_0, *p2, tmp); } else { - + JUT_WARN(864, "%s", "parent == NULL"); } return 0; } @@ -486,12 +525,14 @@ s32 JASSeqParser::cmdParentReadPort(JASTrack* param_0, u32* param_1) { /* 802946AC-80294724 28EFEC 0078+00 1/0 0/0 0/0 .text * cmdChildReadPort__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdChildReadPort(JASTrack* param_0, u32* param_1) { - JASTrack* child = param_0->getChild(JSUHiNibble(param_1[0])); + u8 val = param_1[0]; + u32* p2 = param_1 + 1; + JASTrack* child = param_0->getChild(JSUHiNibble(val)); if (child) { - u16 tmp = child->readPort(JSULoNibble(param_1[0])); - writeReg(param_0, param_1[1], tmp); + u16 tmp = child->readPort(JSULoNibble(val)); + writeReg(param_0, *p2, tmp); } else { - + JUT_WARN(880, "%s", "child == NULL"); } return 0; } @@ -515,13 +556,15 @@ s32 JASSeqParser::cmdCheckPortExport(JASTrack* param_0, u32* param_1) { /* 802947BC-802947F4 28F0FC 0038+00 1/0 0/0 0/0 .text cmdWait__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdWait(JASTrack* param_0, u32* param_1) { JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); - seqCtrl->wait(seqCtrl->readMidiValue()); + int midiValue = seqCtrl->readMidiValue(); + seqCtrl->wait(midiValue); return 0; } /* 802947F4-80294804 28F134 0010+00 1/0 0/0 0/0 .text cmdWaitByte__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdWaitByte(JASTrack* param_0, u32* param_1) { - param_0->getSeqCtrl()->wait(param_1[0]); + u32 val = param_1[0]; + param_0->getSeqCtrl()->wait(val); return 0; } @@ -532,7 +575,7 @@ s32 JASSeqParser::cmdSetLastNote(JASTrack* param_0, u32* param_1) { if (r31 < 256) { param_0->setLatestKey(r31); } else { - + JUT_WARN(928, "%s", "Too large latest key"); } return 0; } @@ -639,7 +682,8 @@ s32 JASSeqParser::cmdNop(JASTrack* param_0, u32* param_1) { /* 80294AE4-80294B1C 28F424 0038+00 1/0 0/0 0/0 .text cmdFIRSet__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdFIRSet(JASTrack* param_0, u32* param_1) { - param_0->setFIR((s16*)param_0->getSeqCtrl()->getAddr(param_1[0])); + s16* addr = (s16*)param_0->getSeqCtrl()->getAddr(param_1[0]); + param_0->setFIR(addr); return 0; } @@ -660,7 +704,7 @@ s32 JASSeqParser::cmdIIRCutOff(JASTrack* param_0, u32* param_1) { if (r31 < 128) { param_0->setIIR(JASCalc::CUTOFF_TO_IIR_TABLE[r31]); } else { - + JUT_WARN(1077, "%s", "Too large cutoff"); } return 0; } @@ -687,14 +731,16 @@ s32 JASSeqParser::cmdPrg(JASTrack* param_0, u32* param_1) { /* 80294BF8-80294C54 28F538 005C+00 1/0 0/0 0/0 .text cmdParamI__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdParamI(JASTrack* param_0, u32* param_1) { - param_0->setParam(param_1[0], s16(param_1[1]) / 32767.0f, 0); + s16 val = param_1[1]; + param_0->setParam(param_1[0], val / 32767.0f, 0); return 0; } /* 80294C54-80294CB0 28F594 005C+00 1/0 0/0 0/0 .text cmdParamII__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdParamII(JASTrack* param_0, u32* param_1) { - param_0->setParam(param_1[0], s16(param_1[1]) / 32767.0f, param_1[2]); + s16 val = param_1[1]; + param_0->setParam(param_1[0], val / 32767.0f, param_1[2]); return 0; } @@ -704,7 +750,7 @@ s32 JASSeqParser::cmdParamE(JASTrack* param_0, u32* param_1) { s32* r31 = (s32*)param_1 + 1; s16 r30 = *r31 << 8; if ((*r31 & 0x80) == 0) { - r30 = r30 | s16(*r31 << 1); + r30 |= s16(*r31 << 1); } param_0->setParam(param_1[0], r30 / 32767.0f, 0); return 0; @@ -716,7 +762,7 @@ s32 JASSeqParser::cmdParamEI(JASTrack* param_0, u32* param_1) { s32* r31 = (s32*)param_1 + 1; s16 r30 = *r31 << 8; if ((*r31 & 0x80) == 0) { - r30 = r30 | s16(*r31 << 1); + r30 |= s16(*r31 << 1); } param_0->setParam(param_1[0], r30 / 32767.0f, param_1[2]); return 0; @@ -724,10 +770,11 @@ s32 JASSeqParser::cmdParamEI(JASTrack* param_0, u32* param_1) { /* 80294DA8-80294F10 28F6E8 0168+00 3/0 0/0 0/0 .text cmdReg__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdReg(JASTrack* param_0, u32* param_1) { + u32 val = param_1[0]; u32 r29 = param_1[1]; u32 r30 = param_1[2]; u32 tmp; - switch (param_1[0]) { + switch (val) { case 0: break; case 1: @@ -754,9 +801,8 @@ s32 JASSeqParser::cmdReg(JASTrack* param_0, u32* param_1) { r30 ^= readReg(param_0, r29); break; case 8: - static JMath::TRandom_fast_ oRandom(0); - tmp = oRandom.get_bit32() >> 9; - r30 = tmp % r30; + static JMath::TRandom_ oRandom(0); + r30 = (oRandom.get_bit32() >> 9) % r30; break; case 9: r30 = readReg(param_0, r29) << r30; @@ -765,6 +811,7 @@ s32 JASSeqParser::cmdReg(JASTrack* param_0, u32* param_1) { r30 = readReg(param_0, r29) >> r30; break; default: + JUT_WARN(1191, "%s", "cmdReg Not Supported RegCmdType"); return 0; } writeReg(param_0, r29, r30); @@ -773,19 +820,23 @@ s32 JASSeqParser::cmdReg(JASTrack* param_0, u32* param_1) { /* 80294F10-80294F40 28F850 0030+00 1/0 0/0 0/0 .text cmdRegLoad__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdRegLoad(JASTrack* param_0, u32* param_1) { - writeReg(param_0, param_1[0], param_1[1]); + u32 val1 = param_1[0]; + u32 val2 = param_1[1]; + writeReg(param_0, val1, val2); return 0; } /* 80294F40-80294FB4 28F880 0074+00 1/0 0/0 0/0 .text cmdRegUni__12JASSeqParserFP8JASTrackPUl */ s32 JASSeqParser::cmdRegUni(JASTrack* param_0, u32* param_1) { + u32 val1 = param_1[0]; u32 r31 = param_1[1]; s32 r30 = 0; - switch (param_1[0]) { + switch (val1) { case 11: r30 = -readReg(param_0, r31); break; default: + JUT_WARN(1217, "%s", "cmdRegUni Not Supported RegCmdType"); return 0; } writeReg(param_0, r31, r30); @@ -794,31 +845,34 @@ s32 JASSeqParser::cmdRegUni(JASTrack* param_0, u32* param_1) { /* 80294FB4-80295088 28F8F4 00D4+00 1/0 0/0 0/0 .text cmdRegTblLoad__12JASSeqParserFP8JASTrackPUl */ -// NONMATCHING case 12 s32 JASSeqParser::cmdRegTblLoad(JASTrack* param_0, u32* param_1) { JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); + u32 p0 = param_1[0]; u32 p1 = param_1[1]; u32 p2 = param_1[2]; u32 p3 = param_1[3]; u32 r27; - switch (param_1[0]) { + switch (p0) { case 12: r27 = seqCtrl->getByte(p2 + p3); break; case 13: - r27 = seqCtrl->get16(p2 + p3 * 2); + p3 *= 2; + r27 = seqCtrl->get16(p2 + p3); break; case 14: p3 += p3 * 2; r27 = seqCtrl->get24(p2 + p3); break; case 15: - r27 = seqCtrl->get32(p2 + p3 * 4); + p3 *= 4; + r27 = seqCtrl->get32(p2 + p3); break; case 16: r27 = seqCtrl->get32(p2 + p3); break; default: + JUT_WARN(1255, "%s", "cmdRegTblLoad Not Supported RegCmdType"); return 0; } writeReg(param_0, p1, r27); @@ -843,7 +897,6 @@ s32 JASSeqParser::cmdDump(JASTrack* param_0, u32* param_1) { } /* 8029526C-80295498 28FBAC 022C+00 1/0 0/0 0/0 .text cmdPrintf__12JASSeqParserFP8JASTrackPUl */ -// NONMATCHING problem with second for loop s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) { u8 stack_c[4]; u32 stack_10[4]; @@ -851,7 +904,8 @@ s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) { JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); u32 r30 = 0; - for (u32 i = 0; i < 128; i++) { + u32 i = 0; + for (; i < 128; i++) { buffer[i] = seqCtrl->readByte(); if (buffer[i] == 0) { break; @@ -895,8 +949,8 @@ s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) { } } - for (u32 i = 0; i < r30; i++) { - stack_10[i] = seqCtrl->readByte(); + for (i = 0; i < r30; i++) { + stack_10[i] = (u8)seqCtrl->readByte(); switch (stack_c[i]) { case 2: stack_10[i] = (u32)seqCtrl->getAddr(stack_10[i]); @@ -965,10 +1019,11 @@ s32 JASSeqParser::execCommand(JASTrack* param_0, s32 (JASSeqParser::*param_1)(JA /* 802955C8-80295600 28FF08 0038+00 1/1 0/0 0/0 .text parseNoteOff__12JASSeqParserFP8JASTrackUc */ s32 JASSeqParser::parseNoteOff(JASTrack* param_0, u8 param_1) { - if (param_1 & 7) { - execNoteOff(param_0, param_1 & 7); + u8 note_id = param_1 & 7; + if (note_id) { + execNoteOff(param_0, note_id); } else { - + JUT_WARN(1433, "%s", "noteoff for note_id == 0"); } return 0; } @@ -977,46 +1032,49 @@ s32 JASSeqParser::parseNoteOff(JASTrack* param_0, u8 param_1) { s32 JASSeqParser::parseNoteOn(JASTrack* param_0, u8 param_1) { JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); u32 r28 = seqCtrl->readByte(); + u32 r30 = r28; + r30 &= 7; u32 r27 = seqCtrl->readByte(); - if ((r28 & 7) == 0) { - execNoteOnGate(param_0, param_1, r27, seqCtrl->readMidiValue(), r28); + if ((u8)r30 == 0) { + u32 midiVal = seqCtrl->readMidiValue(); + execNoteOnGate(param_0, (u8)param_1, (u8)r27, midiVal, (u8)r28); } else { - execNoteOnMidi(param_0, r28 & 7, param_1, r27); + execNoteOnMidi(param_0, (u8)r30, (u8)param_1, (u8)r27); } return 0; } /* 802956B0-80295864 28FFF0 01B4+00 2/2 0/0 0/0 .text parseCommand__12JASSeqParserFP8JASTrackUcUs */ -// NONMATCHING u16 bit or s32 JASSeqParser::parseCommand(JASTrack* param_0, u8 cmd, u16 param_2) { JASSeqCtrl* seqCtrl = param_0->getSeqCtrl(); CmdInfo* cmdInfo = NULL; if (cmd != 0xb0) { + JUT_ASSERT(1477, cmd >= 0xa0); cmdInfo = &sCmdInfo[cmd - 0xa0]; } else { cmdInfo = &sExtCmdInfo[seqCtrl->readByte() & 0xff]; } - u16 r28 = cmdInfo->field_0xe | param_2; + u16 r28 = (u16)cmdInfo->field_0xe; + r28 |= param_2; u32 stack_28[8]; - for (int i = 0; i < cmdInfo->field_0xc; i++) { + for (int i = 0; i < cmdInfo->field_0xc; i++, r28 >>= 2) { int r27 = 0; switch (r28 & 3) { case 0: - r27 = seqCtrl->readByte(); + r27 = (u8)seqCtrl->readByte(); break; case 1: - r27 = seqCtrl->read16(); + r27 = (u16)seqCtrl->read16(); break; case 2: r27 = seqCtrl->read24(); break; case 3: - r27 = readReg(param_0, seqCtrl->readByte()); + r27 = readReg(param_0, (u8)seqCtrl->readByte()); break; } stack_28[i] = r27; - r28 >>= 2; } s32 (JASSeqParser::*ptr)(JASTrack*, u32*) = cmdInfo->field_0x0; if (!ptr) { diff --git a/src/JSystem/JAudio2/JASTaskThread.cpp b/src/JSystem/JAudio2/JASTaskThread.cpp index 80ef30fab43..802c628d238 100644 --- a/src/JSystem/JAudio2/JASTaskThread.cpp +++ b/src/JSystem/JAudio2/JASTaskThread.cpp @@ -24,8 +24,7 @@ JASTaskThread::~JASTaskThread() { if (!received) { return; } - ThreadMemPool* heap = JASKernel::getCommandHeap(); - heap->free(msg); + JASKernel::getCommandHeap()->free(msg); } } @@ -34,8 +33,7 @@ JASTaskThread::~JASTaskThread() { void* JASTaskThread::allocCallStack(void (*param_0)(void*), void const* param_1, u32 param_2) { ThreadMemPool* heap; u32 size = param_2 + 8; - heap = JASKernel::getCommandHeap(); - JASThreadCallStack *callStack = (JASThreadCallStack*) heap->alloc(size); + JASThreadCallStack *callStack = (JASThreadCallStack*) JASKernel::getCommandHeap()->alloc(size); if (callStack == NULL) { return NULL; } @@ -47,10 +45,8 @@ void* JASTaskThread::allocCallStack(void (*param_0)(void*), void const* param_1, /* 8028F9EC-8028FB5C 28A32C 0170+00 1/1 0/0 0/0 .text allocCallStack__13JASTaskThreadFPFPv_vPv */ void* JASTaskThread::allocCallStack(void (*runFunc)(void*), void* param_1) { - ThreadMemPool* heap; JASThreadCallStack *callStack; - heap = JASKernel::getCommandHeap(); - callStack = (JASThreadCallStack*)heap->alloc(0xc); + callStack = (JASThreadCallStack*)JASKernel::getCommandHeap()->alloc(0xc); if (callStack == NULL) { return NULL; } @@ -70,8 +66,7 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void const* param_1, u32 p } int iVar2 = sendMessage(pvVar1); if (iVar2 == 0) { - ThreadMemPool* heap = JASKernel::getCommandHeap(); - heap->free(pvVar1); + JASKernel::getCommandHeap()->free(pvVar1); } return iVar2; } @@ -86,8 +81,7 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void* param_1) { } int iVar2 = sendMessage(pvVar1); if (iVar2 == 0) { - ThreadMemPool* heap = JASKernel::getCommandHeap(); - heap->free(pvVar1); + JASKernel::getCommandHeap()->free(pvVar1); } return iVar2; } @@ -95,9 +89,10 @@ int JASTaskThread::sendCmdMsg(void (*param_0)(void*), void* param_1) { /* 8028FD4C-8028FE88 28A68C 013C+00 1/0 0/0 0/0 .text run__13JASTaskThreadFv */ // NONMATCHING Regalloc void* JASTaskThread::run() { + JASThreadCallStack* ppcVar1; OSInitFastCast(); do { - JASThreadCallStack* ppcVar1 = (JASThreadCallStack*)waitMessageBlock(); + ppcVar1 = (JASThreadCallStack*)waitMessageBlock(); if (field_0x84) { OSSleepThread(&mpThreadQueue); } @@ -106,8 +101,7 @@ void* JASTaskThread::run() { } else { ppcVar1->mRunFunc(ppcVar1->field_0x8.pBuffer); } - ThreadMemPool* heap = JASKernel::getCommandHeap(); - heap->free(ppcVar1); + JASKernel::getCommandHeap()->free(ppcVar1); } while (true); } diff --git a/src/JSystem/JFramework/JFWSystem.cpp b/src/JSystem/JFramework/JFWSystem.cpp index 9e54602fe90..a2e0c225afa 100644 --- a/src/JSystem/JFramework/JFWSystem.cpp +++ b/src/JSystem/JFramework/JFWSystem.cpp @@ -28,14 +28,6 @@ JKRExpHeap* JFWSystem::rootHeap; /* 804511A4-804511A8 0006A4 0004+00 2/2 1/1 0/0 .sbss systemHeap__9JFWSystem */ JKRExpHeap* JFWSystem::systemHeap; -/* 80271CD0-80271D18 26C610 0048+00 1/1 1/1 0/0 .text firstInit__9JFWSystemFv */ -void JFWSystem::firstInit() { - JUT_ASSERT(80, rootHeap == 0); - OSInit(); - DVDInit(); - rootHeap = JKRExpHeap::createRoot(CSetUpParam::maxStdHeaps, false); - systemHeap = JKRExpHeap::create(CSetUpParam::sysHeapSize, rootHeap, false); -} /* 80450778-8045077C 0001F8 0004+00 1/1 1/1 0/0 .sdata fifoBufSize__Q29JFWSystem11CSetUpParam */ u32 JFWSystem::CSetUpParam::fifoBufSize = 0x40000; @@ -70,6 +62,15 @@ GXRenderModeObj* JFWSystem::CSetUpParam::renderMode = &GXNtsc480IntDf; * exConsoleBufferSize__Q29JFWSystem11CSetUpParam */ u32 JFWSystem::CSetUpParam::exConsoleBufferSize = 0x24FC; +/* 80271CD0-80271D18 26C610 0048+00 1/1 1/1 0/0 .text firstInit__9JFWSystemFv */ +void JFWSystem::firstInit() { + JUT_ASSERT(80, rootHeap == 0); + OSInit(); + DVDInit(); + rootHeap = JKRExpHeap::createRoot(CSetUpParam::maxStdHeaps, false); + systemHeap = JKRExpHeap::create(CSetUpParam::sysHeapSize, rootHeap, false); +} + /* 804511A8-804511AC 0006A8 0004+00 1/1 0/0 0/0 .sbss mainThread__9JFWSystem */ JKRThread* JFWSystem::mainThread; diff --git a/src/JSystem/JKernel/JKRHeap.cpp b/src/JSystem/JKernel/JKRHeap.cpp index 8d70d0403ea..5cbcf596262 100644 --- a/src/JSystem/JKernel/JKRHeap.cpp +++ b/src/JSystem/JKernel/JKRHeap.cpp @@ -9,6 +9,12 @@ bool data_804508B0 = 1; +#ifdef DEBUG +u8 data_804508B1; +u8 data_804508B2; +u8 data_804508B3; +#endif + /* 80451370-80451374 000870 0004+00 3/3 44/44 0/0 .sbss sSystemHeap__7JKRHeap */ JKRHeap* JKRHeap::sSystemHeap; diff --git a/src/JSystem/JParticle/JPADynamicsBlock.cpp b/src/JSystem/JParticle/JPADynamicsBlock.cpp index 0277dfed32e..672c8413b45 100644 --- a/src/JSystem/JParticle/JPADynamicsBlock.cpp +++ b/src/JSystem/JParticle/JPADynamicsBlock.cpp @@ -9,41 +9,42 @@ /* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */ void JPAVolumePoint(JPAEmitterWorkData* work) { - work->mVolumePos.zero(); - work->mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(), - work->mpEmtr->get_r_zh()); - work->mVelAxis.set(work->mVelOmni.x, 0.0f, work->mVelOmni.z); + work->mVolumeCalcData.mVolumePos.zero(); + work->mVolumeCalcData.mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(), + work->mpEmtr->get_r_zh()); + work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVelOmni.x, 0.0f, + work->mVolumeCalcData.mVelOmni.z); } /* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine */ void JPAVolumeLine(JPAEmitterWorkData* work) { if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) { - work->mVolumePos.set(0.0f, 0.0f, - work->mVolumeSize * - ((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f))); + work->mVolumeCalcData.mVolumePos.set( + 0.0f, 0.0f, + work->mVolumeSize * ((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f))); work->mVolumeEmitIdx++; } else { - work->mVolumePos.set(0.0f, 0.0f, work->mVolumeSize * work->mpEmtr->get_r_zh()); + work->mVolumeCalcData.mVolumePos.set(0.0f, 0.0f, + work->mVolumeSize * work->mpEmtr->get_r_zh()); } - work->mVelOmni.set(0.0f, 0.0f, work->mVolumePos.z * work->mGlobalScl.z); - work->mVelAxis.set(0.0f, 0.0f, work->mVolumePos.z); + work->mVolumeCalcData.mVelOmni.set(0.0f, 0.0f, + work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z); + work->mVolumeCalcData.mVelAxis.set(0.0f, 0.0f, work->mVolumeCalcData.mVolumePos.z); } /* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle */ // NONMATCHING regalloc. Could be issue with mul asm implementations void JPAVolumeCircle(JPAEmitterWorkData* work) { - s16 thetai; - f32 theta; + s16 theta; f32 distance; - f32 sizeXZ; + if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) { theta = (s16)((work->mVolumeEmitIdx << 16) / work->mEmitCount); - thetai = theta * work->mVolumeSweep; + theta = theta * work->mVolumeSweep; work->mVolumeEmitIdx++; } else { theta = work->mVolumeSweep * work->mpEmtr->get_r_ss(); - thetai = theta; } distance = work->mpEmtr->get_r_f(); @@ -51,19 +52,21 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) { distance = 1.0f - (distance * distance); } - sizeXZ = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad)); - work->mVolumePos.set(sizeXZ * JMASSin(thetai), 0.0f, sizeXZ * JMASCos(thetai)); - work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); - work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); + distance = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad)); + work->mVolumeCalcData.mVolumePos.set(distance * JMASSin(theta), 0.0f, + distance * JMASCos(theta)); + work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, + work->mVolumeCalcData.mVolumePos.z); } /* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube */ void JPAVolumeCube(JPAEmitterWorkData* work) { - work->mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize, + work->mVolumeCalcData.mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize, work->mpEmtr->get_r_zh() * work->mVolumeSize); - work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); - work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); + work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z); } /* 8027B5F0-8027B87C 275F30 028C+00 1/1 0/0 0/0 .text JPAVolumeSphere__FP18JPAEmitterWorkData */ @@ -94,10 +97,11 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) { rnd = 1.0f - rnd * rnd * rnd; } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); - work->mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi), - rad * JMASCos(phi) * JMASCos(theta)); - work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); - work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); + work->mVolumeCalcData.mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi), + rad * JMASCos(phi) * JMASCos(theta)); + work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, + work->mVolumeCalcData.mVolumePos.z); } /* 8027B87C-8027B9F8 2761BC 017C+00 1/1 0/0 0/0 .text JPAVolumeCylinder__FP18JPAEmitterWorkData */ @@ -108,10 +112,11 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) { rnd = 1.0f - rnd * rnd; } f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad)); - work->mVolumePos.set(rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), - rad * JMASCos(theta)); - work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); - work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z); + work->mVolumeCalcData.mVolumePos.set( + rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * JMASCos(theta)); + work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, + work->mVolumeCalcData.mVolumePos.z); } /* 8027B9F8-8027BB18 276338 0120+00 1/1 0/0 0/0 .text JPAVolumeTorus__FP18JPAEmitterWorkData */ @@ -119,11 +124,13 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) { s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss(); s16 phi = work->mpEmtr->get_r_ss(); f32 rad = work->mVolumeSize * work->mVolumeMinRad; - work->mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi), - rad * JMASCos(theta) * JMASCos(phi)); - work->mVolumePos.set(work->mVelAxis.x + work->mVolumeSize * JMASSin(theta), work->mVelAxis.y, - work->mVelAxis.z + work->mVolumeSize * JMASCos(theta)); - work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl); + work->mVolumeCalcData.mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi), + rad * JMASCos(theta) * JMASCos(phi)); + work->mVolumeCalcData.mVolumePos.set( + work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * JMASSin(theta), + work->mVolumeCalcData.mVelAxis.y, + work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * JMASCos(theta)); + work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl); } /* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */ diff --git a/src/JSystem/JParticle/JPAEmitter.cpp b/src/JSystem/JParticle/JPAEmitter.cpp index bee62ab5338..517421c836d 100644 --- a/src/JSystem/JParticle/JPAEmitter.cpp +++ b/src/JSystem/JParticle/JPAEmitter.cpp @@ -53,7 +53,7 @@ void JPABaseEmitter::init(JPAEmitterManager* param_0, JPAResource* param_1) { mSpread = mpRes->getDyn()->getInitVelDirSp(); mRndmDirSpeed = mpRes->getDyn()->getInitVelRndm(); mAirResist = mpRes->getDyn()->getAirRes(); - mRndm.set_seed(mpEmtrMgr->mpWorkData->mRndm.get_rndm_u()); + mRndm.set_seed(mpEmtrMgr->pWd->mRndm.get_rndm_u()); MTXIdentity(mGlobalRot); mGlobalScl.set(1.0f, 1.0f, 1.0f); mGlobalTrs.zero(); @@ -85,8 +85,8 @@ JPABaseParticle* JPABaseEmitter::createParticle() { if (mpPtclPool->getNum() != 0) { JPANode* node = mpPtclPool->pop_front(); mAlivePtclBase.push_front(node); - mpRes->getDyn()->calc(mpEmtrMgr->mpWorkData); - node->mData.init_p(mpEmtrMgr->mpWorkData); + mpRes->getDyn()->calc(mpEmtrMgr->pWd); + node->mData.init_p(mpEmtrMgr->pWd); return &node->mData; } @@ -99,7 +99,7 @@ JPABaseParticle* JPABaseEmitter::createChild(JPABaseParticle* parent) { if (mpPtclPool->getNum() != 0) { JPANode* node = mpPtclPool->pop_front(); mAlivePtclChld.push_front(node); - node->mData.init_c(mpEmtrMgr->mpWorkData, parent); + node->mData.init_c(mpEmtrMgr->pWd, parent); return &node->mData; } @@ -166,18 +166,18 @@ void JPABaseEmitter::calcEmitterGlobalPosition(JGeometry::TVec3* dst) const /* 8027EF30-8027EF40 279870 0010+00 0/0 1/1 0/0 .text getCurrentCreateNumber__14JPABaseEmitterCFv */ u32 JPABaseEmitter::getCurrentCreateNumber() const { - return mpEmtrMgr->mpWorkData->mEmitCount; + return mpEmtrMgr->pWd->mEmitCount; } /* 8027EF40-8027EF50 279880 0010+00 0/0 3/3 0/0 .text getDrawCount__14JPABaseEmitterCFv */ u8 JPABaseEmitter::getDrawCount() const { - return mpEmtrMgr->mpWorkData->mDrawCount; + return mpEmtrMgr->pWd->mDrawCount; } /* 8027EF50-8027EFA4 279890 0054+00 0/0 1/1 0/0 .text * loadTexture__14JPABaseEmitterFUc11_GXTexMapID */ bool JPABaseEmitter::loadTexture(u8 idx, GXTexMapID texMapID) { - mpEmtrMgr->mpWorkData->mpResMgr->load(mpRes->getTexIdx(idx), texMapID); + mpEmtrMgr->pWd->mpResMgr->load(mpRes->getTexIdx(idx), texMapID); return true; -} \ No newline at end of file +} diff --git a/src/JSystem/JParticle/JPAEmitterManager.cpp b/src/JSystem/JParticle/JPAEmitterManager.cpp index f15bab2c4fb..649f4226267 100644 --- a/src/JSystem/JParticle/JPAEmitterManager.cpp +++ b/src/JSystem/JParticle/JPAEmitterManager.cpp @@ -8,53 +8,69 @@ #include "JSystem/JParticle/JPAEmitter.h" #include "JSystem/JParticle/JPAParticle.h" #include "JSystem/JParticle/JPAResourceManager.h" +#include "JSystem/JUtility/JUTAssert.h" #include "dolphin/gx.h" /* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc */ -JPAEmitterManager::JPAEmitterManager(u32 ptclMax, u32 emtrMax, JKRHeap* pHeap, u8 grpMax, - u8 resMax) { - mEmtrMax = emtrMax; - mPtclMax = ptclMax; - mGrpMax = grpMax; - mResMax = resMax; +JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, JKRHeap* pHeap, u8 i_gidMax, + u8 i_ridMax) { + emtrNum = i_emtrNum; + ptclNum = i_ptclNum; + gidMax = i_gidMax; + ridMax = i_ridMax; - JPABaseEmitter* emtr = new (pHeap, 0) JPABaseEmitter[mEmtrMax]; - for (u32 i = 0; i < mEmtrMax; i++) - mFreeEmtrList.prepend(&emtr[i].mLink); + JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax); - JPANode* ptcl = new (pHeap, 0) JPANode[mPtclMax]; - for (u32 i = 0; i < mPtclMax; i++) - mPtclPool.push_back(&ptcl[i]); + JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum]; + JUT_ASSERT(44, p_emtr_link); + for (u32 i = 0; i < emtrNum; i++) + mFreeEmtrList.prepend(&p_emtr_link[i].mLink); - mpGrpEmtr = new (pHeap, 0) JSUList[mGrpMax]; - mpResMgrAry = new (pHeap, 0) JPAResourceManager*[mResMax]; - for (int i = 0; i < mResMax; i++) { - mpResMgrAry[i] = NULL; + JPANode* p_ptcl_node = new (pHeap, 0) JPANode[ptclNum]; + JUT_ASSERT(51, p_ptcl_node); + for (u32 i = 0; i < ptclNum; i++) + mPtclPool.push_back(&p_ptcl_node[i]); + + pEmtrUseList = new (pHeap, 0) JSUList[gidMax]; + JUT_ASSERT(58, pEmtrUseList); + pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax]; + JUT_ASSERT(62, pResMgrAry) + for (int i = 0; i < ridMax; i++) { + pResMgrAry[i] = NULL; } - mpWorkData = new (pHeap, 0) JPAEmitterWorkData(); + pWd = new (pHeap, 0) JPAEmitterWorkData(); + JUT_ASSERT(67, pWd); } /* 8027DEBC-8027DFA0 2787FC 00E4+00 0/0 3/3 0/0 .text * createSimpleEmitterID__17JPAEmitterManagerFRCQ29JGeometry8TVec3UsUcUcP18JPAEmitterCallBackP19JPAParticleCallBack */ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3 const& pos, - u16 resID, u8 groupID, u8 resMgrID, + u16 resID, u8 group_id, u8 res_mgr_id, JPAEmitterCallBack* emtrCB, JPAParticleCallBack* ptclCB) { - JPAResource* pRes = mpResMgrAry[resMgrID]->getResource(resID); - if (pRes != NULL && mFreeEmtrList.getNumLinks() != 0) { + JUT_ASSERT(88, group_id < gidMax); + JUT_ASSERT(89, res_mgr_id < ridMax); + JUT_ASSERT(90, pResMgrAry[res_mgr_id] != 0); + JPAResource* pRes = pResMgrAry[res_mgr_id]->getResource(resID); + + if (pRes == NULL) { + JUT_WARN_DEVICE(94, 3, "JPA : User Index %d is NOT exist\n", resID); + } else if (mFreeEmtrList.getNumLinks() == 0) { + JUT_WARN_DEVICE(97, 3, "JPA : Can NOT create emitter more\n"); + } else { JSULink* pLink = mFreeEmtrList.getFirst(); mFreeEmtrList.remove(pLink); - mpGrpEmtr[groupID].append(pLink); + pEmtrUseList[group_id].append(pLink); JPABaseEmitter* emtr = pLink->getObject(); emtr->init(this, pRes); emtr->mpPtclPool = &mPtclPool; emtr->mpEmtrCallBack = emtrCB; emtr->mpPtclCallBack = ptclCB; - emtr->mGroupID = groupID; - emtr->mResMgrID = resMgrID; + emtr->mGroupID = group_id; + emtr->mResMgrID = res_mgr_id; emtr->mGlobalTrs.set(pos); return emtr; } @@ -63,24 +79,26 @@ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3 c } /* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text calc__17JPAEmitterManagerFUc */ -void JPAEmitterManager::calc(u8 groupID) { - for (JSULink*pLink = mpGrpEmtr[groupID].getFirst(), *pNext; - pLink != mpGrpEmtr[groupID].getEnd(); pLink = pNext) { +void JPAEmitterManager::calc(u8 group_id) { + JUT_ASSERT(154, group_id < gidMax); + JSULink* pNext = NULL; + for (JSULink* pLink = pEmtrUseList[group_id].getFirst(); + pLink != pEmtrUseList[group_id].getEnd(); pLink = pNext) { pNext = pLink->getNext(); JPABaseEmitter* emtr = pLink->getObject(); - bool done = emtr->mpRes->calc(mpWorkData, emtr); - if (done && !emtr->checkStatus(0x200)) + if (emtr->mpRes->calc(pWd, emtr) && !emtr->checkStatus(0x200)) forceDeleteEmitter(emtr); } } /* 8027E028-8027E220 278968 01F8+00 0/0 1/1 0/0 .text draw__17JPAEmitterManagerFPC11JPADrawInfoUc */ -void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) { - drawInfo->getCamMtx(&mpWorkData->mPosCamMtx); - drawInfo->getPrjMtx(&mpWorkData->mPrjMtx); +void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) { + JUT_ASSERT(192, group_id < gidMax); + drawInfo->getCamMtx(pWd->mPosCamMtx); + drawInfo->getPrjMtx(pWd->mPrjMtx); calcYBBCam(); GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); @@ -103,12 +121,12 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) { GX_AF_NONE); GXSetNumChans(0); - for (JSULink* pLink = mpGrpEmtr[groupID].getFirst(); - pLink != mpGrpEmtr[groupID].getEnd(); pLink = pLink->getNext()) { + for (JSULink* pLink = pEmtrUseList[group_id].getFirst(); + pLink != pEmtrUseList[group_id].getEnd(); pLink = pLink->getNext()) { JPABaseEmitter* emtr = pLink->getObject(); if (!emtr->checkStatus(0x04)) { - mpWorkData->mpResMgr = mpResMgrAry[emtr->mResMgrID]; - emtr->mpRes->draw(mpWorkData, emtr); + pWd->mpResMgr = pResMgrAry[emtr->mResMgrID]; + emtr->mpRes->draw(pWd, emtr); } } } @@ -116,15 +134,16 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) { /* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv */ void JPAEmitterManager::forceDeleteAllEmitter() { - for (u8 i = 0; i < mGrpMax; i++) + for (u8 i = 0; i < gidMax; i++) forceDeleteGroupEmitter(i); } /* 8027E278-8027E2D8 278BB8 0060+00 1/1 0/0 0/0 .text * forceDeleteGroupEmitter__17JPAEmitterManagerFUc */ -void JPAEmitterManager::forceDeleteGroupEmitter(u8 groupID) { - while (mpGrpEmtr[groupID].getNumLinks()) - forceDeleteEmitter(mpGrpEmtr[groupID].getLast()->getObject()); +void JPAEmitterManager::forceDeleteGroupEmitter(u8 group_id) { + JUT_ASSERT(288, group_id < gidMax); + while (pEmtrUseList[group_id].getNumLinks()) + forceDeleteEmitter(pEmtrUseList[group_id].getLast()->getObject()); } /* 8027E2D8-8027E344 278C18 006C+00 3/3 1/1 0/0 .text @@ -132,48 +151,53 @@ void JPAEmitterManager::forceDeleteGroupEmitter(u8 groupID) { void JPAEmitterManager::forceDeleteEmitter(JPABaseEmitter* emtr) { emtr->deleteAllParticle(); emtr->setStatus(0x300); - mpGrpEmtr[emtr->getGroupID()].remove(&emtr->mLink); + pEmtrUseList[emtr->getGroupID()].remove(&emtr->mLink); mFreeEmtrList.prepend(&emtr->mLink); } /* 8027E344-8027E354 278C84 0010+00 0/0 2/2 0/0 .text * entryResourceManager__17JPAEmitterManagerFP18JPAResourceManagerUc */ void JPAEmitterManager::entryResourceManager(JPAResourceManager* resMgr, u8 resMgrID) { - mpResMgrAry[resMgrID] = resMgr; + JUT_ASSERT_MSG_F(325, resMgrID < ridMax && (pResMgrAry[resMgrID]) == 0, + "res_id %d res_id_max %d array[%d] = %x", resMgrID, ridMax, resMgrID, + pResMgrAry[resMgrID]); + pResMgrAry[resMgrID] = resMgr; } /* 8027E354-8027E3F4 278C94 00A0+00 0/0 1/1 0/0 .text clearResourceManager__17JPAEmitterManagerFUc */ -void JPAEmitterManager::clearResourceManager(u8 resMgrID) { - for (u8 i = 0; i < mGrpMax; i++) { - for (JSULink*pLink = mpGrpEmtr[i].getFirst(), *pNext; - pLink != mpGrpEmtr[i].getEnd(); pLink = pNext) { +void JPAEmitterManager::clearResourceManager(u8 res_mgr_id) { + JUT_ASSERT(339, res_mgr_id < ridMax); + for (u8 i = 0; i < gidMax; i++) { + JSULink* pNext = NULL; + for (JSULink* pLink = pEmtrUseList[i].getFirst(); + pLink != pEmtrUseList[i].getEnd(); pLink = pNext) { pNext = pLink->getNext(); - if (resMgrID == pLink->getObject()->getResourceManagerID()) + if (res_mgr_id == pLink->getObject()->getResourceManagerID()) forceDeleteEmitter(pLink->getObject()); } } - mpResMgrAry[resMgrID] = NULL; + pResMgrAry[res_mgr_id] = NULL; } /* 8027E3F4-8027E51C 278D34 0128+00 1/1 0/0 0/0 .text calcYBBCam__17JPAEmitterManagerFv */ void JPAEmitterManager::calcYBBCam() { - JGeometry::TVec3 v; - v.set(0.0f, mpWorkData->mPosCamMtx[1][1], mpWorkData->mPosCamMtx[2][1]); + JGeometry::TVec3 v(0.0f, pWd->mPosCamMtx[1][1], pWd->mPosCamMtx[2][1]); + JUT_ASSERT(367, !v.isZero()); v.normalize(); - mpWorkData->mYBBCamMtx[0][0] = 1.0f; - mpWorkData->mYBBCamMtx[0][1] = 0.0f; - mpWorkData->mYBBCamMtx[0][2] = 0.0f; - mpWorkData->mYBBCamMtx[0][3] = mpWorkData->mPosCamMtx[0][3]; - mpWorkData->mYBBCamMtx[1][0] = 0.0f; - mpWorkData->mYBBCamMtx[1][1] = v.y; - mpWorkData->mYBBCamMtx[1][2] = -v.z; - mpWorkData->mYBBCamMtx[1][3] = mpWorkData->mPosCamMtx[1][3]; - mpWorkData->mYBBCamMtx[2][0] = 0.0f; - mpWorkData->mYBBCamMtx[2][1] = v.z; - mpWorkData->mYBBCamMtx[2][2] = v.y; - mpWorkData->mYBBCamMtx[2][3] = mpWorkData->mPosCamMtx[2][3]; + pWd->mYBBCamMtx[0][0] = 1.0f; + pWd->mYBBCamMtx[0][1] = 0.0f; + pWd->mYBBCamMtx[0][2] = 0.0f; + pWd->mYBBCamMtx[0][3] = pWd->mPosCamMtx[0][3]; + pWd->mYBBCamMtx[1][0] = 0.0f; + pWd->mYBBCamMtx[1][1] = v.y; + pWd->mYBBCamMtx[1][2] = -v.z; + pWd->mYBBCamMtx[1][3] = pWd->mPosCamMtx[1][3]; + pWd->mYBBCamMtx[2][0] = 0.0f; + pWd->mYBBCamMtx[2][1] = v.z; + pWd->mYBBCamMtx[2][2] = v.y; + pWd->mYBBCamMtx[2][3] = pWd->mPosCamMtx[2][3]; } diff --git a/src/JSystem/JParticle/JPAFieldBlock.cpp b/src/JSystem/JParticle/JPAFieldBlock.cpp index 244d888e15b..c9a4c038667 100644 --- a/src/JSystem/JParticle/JPAFieldBlock.cpp +++ b/src/JSystem/JParticle/JPAFieldBlock.cpp @@ -134,7 +134,6 @@ void JPAFieldVortex::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) { /* 8027C674-8027C814 276FB4 01A0+00 1/0 0/0 0/0 .text * calc__14JPAFieldVortexFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */ -// NONMATCHING regalloc. may need to rewrite dot in a way that doesn't break Z2Audience::calcPitchDoppler_ void JPAFieldVortex::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) { JGeometry::TVec3 vec; vec.scale(field_0x10.dot(ptcl->mLocalPosition), field_0x10); @@ -168,7 +167,6 @@ void JPAFieldConvection::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) /* 8027CA94-8027CCCC 2773D4 0238+00 1/0 0/0 0/0 .text * calc__18JPAFieldConvectionFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */ -// NONMATCHING regalloc problems with TVec3 inlines void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) { JGeometry::TVec3 vec1, vec2, vec3; @@ -185,7 +183,6 @@ void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, /* 8027CCCC-8027CDE4 27760C 0118+00 1/0 0/0 0/0 .text * calc__14JPAFieldRandomFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */ -// NONMATCHING missing clrlwi void JPAFieldRandom::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) { if (ptcl->mAge == 0 || (block->getCycle() != 0 && ptcl->mAge % block->getCycle() == 0)) { JPABaseEmitter* emtr = work->mpEmtr; diff --git a/src/JSystem/JParticle/JPAParticle.cpp b/src/JSystem/JParticle/JPAParticle.cpp index 5dd398bb119..c06c62b9ed4 100644 --- a/src/JSystem/JParticle/JPAParticle.cpp +++ b/src/JSystem/JParticle/JPAParticle.cpp @@ -17,7 +17,6 @@ JPAParticleCallBack::~JPAParticleCallBack() { /* 8027EFEC-8027F8C8 27992C 08DC+00 0/0 1/1 0/0 .text * init_p__15JPABaseParticleFP18JPAEmitterWorkData */ -// NONMATCHING a couple problems, likely issues with setLength void JPABaseParticle::init_p(JPAEmitterWorkData* work) { JPABaseEmitter* emtr = work->mpEmtr; JPAExtraShape* esp = work->mpRes->getEsp(); @@ -25,11 +24,11 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) { JPADynamicsBlock* dyn = work->mpRes->getDyn(); mAge = -1; - mLifeTime = (1.0f - dyn->getLifeTimeRndm() * emtr->get_r_f()) * emtr->mLifeTime; + mLifeTime = (1.0f - dyn->getLifetimeRndm() * emtr->get_r_f()) * emtr->mLifeTime; mTime = 0.0f; initStatus(0); - MTXMultVecSR(work->mGlobalSR, &work->mVolumePos, &mLocalPosition); + MTXMultVecSR(work->mGlobalSR, &work->mVolumeCalcData.mVolumePos, &mLocalPosition); if (emtr->checkFlag(8)) { setStatus(0x20); } @@ -41,14 +40,14 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) { JGeometry::TVec3 velOmni; if (emtr->mAwayFromCenterSpeed) { - velOmni.setLength(work->mVelOmni, emtr->mAwayFromCenterSpeed); + velOmni.setLength(work->mVolumeCalcData.mVelOmni, emtr->mAwayFromCenterSpeed); } else { velOmni.zero(); } JGeometry::TVec3 velAxis; if (emtr->mAwayFromAxisSpeed) { - velAxis.setLength(work->mVelAxis, emtr->mAwayFromAxisSpeed); + velAxis.setLength(work->mVolumeCalcData.mVelAxis, emtr->mAwayFromAxisSpeed); } else { velAxis.zero(); } @@ -56,9 +55,7 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) { JGeometry::TVec3 velDir; if (emtr->mDirSpeed) { Mtx mtx; - int angleZ = emtr->get_r_ss(); - f32 angleY = emtr->get_r_zp() * 0x8000 * emtr->mSpread; - JPAGetYZRotateMtx(angleY, angleZ, mtx); + JPAGetYZRotateMtx(emtr->get_r_zp() * 0x8000 * emtr->mSpread, emtr->get_r_ss(), mtx); MTXConcat(work->mDirectionMtx, mtx, mtx); velDir.set(emtr->mDirSpeed * mtx[0][2], emtr->mDirSpeed * mtx[1][2], @@ -100,8 +97,7 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) { mAnmRandom = emtr->get_r_f() * bsp->getLoopOfstValue(); if (esp != NULL && esp->isEnableScaleAnm()) { - f32 scale = emtr->mScaleOut * (emtr->get_r_zp() * esp->getScaleRndm() + 1.0f); - mParticleScaleX = mParticleScaleY = mScaleOut = scale; + mParticleScaleX = mParticleScaleY = mScaleOut = emtr->mScaleOut * (emtr->get_r_zp() * esp->getScaleRndm() + 1.0f); } else { mParticleScaleX = mParticleScaleY = mScaleOut = emtr->mScaleOut; } @@ -324,12 +320,12 @@ bool JPABaseParticle::canCreateChild(JPAEmitterWorkData* work) { * getWidth__15JPABaseParticleCFPC14JPABaseEmitter */ f32 JPABaseParticle::getWidth(JPABaseEmitter const* emtr) const { f32 scale = 2.0f * mParticleScaleX; - return scale * emtr->mpEmtrMgr->mpWorkData->mGlobalPtclScl.x; + return scale * emtr->mpEmtrMgr->pWd->mGlobalPtclScl.x; } /* 80280568-80280588 27AEA8 0020+00 0/0 3/3 0/0 .text * getHeight__15JPABaseParticleCFPC14JPABaseEmitter */ f32 JPABaseParticle::getHeight(JPABaseEmitter const* emtr) const { f32 scale = 2.0f * mParticleScaleY; - return scale * emtr->mpEmtrMgr->mpWorkData->mGlobalPtclScl.y; + return scale * emtr->mpEmtrMgr->pWd->mGlobalPtclScl.y; } diff --git a/src/JSystem/JStudio/JStudio_JStage/object-light.cpp b/src/JSystem/JStudio/JStudio_JStage/object-light.cpp index 7cfbb16b653..044496e7e66 100644 --- a/src/JSystem/JStudio/JStudio_JStage/object-light.cpp +++ b/src/JSystem/JStudio/JStudio_JStage/object-light.cpp @@ -55,31 +55,34 @@ void JStudio_JStage::TAdaptor_light::adaptor_do_prepare() { * adaptor_do_begin__Q214JStudio_JStage14TAdaptor_lightFv */ // NONMATCHING - regalloc void JStudio_JStage::TAdaptor_light::adaptor_do_begin() { - adaptor_object_begin_(); - JStage::TLight* pLightObj = get_pJSG_(); - const JStudio::TObject* pObject = adaptor_getObject(); - JUT_ASSERT(60, pObject != 0); - const JStudio::TControl* pControl = pObject->getControl(); - GXColor lightColor = pLightObj->JSGGetColor(); - adaptor_setVariableValue_GXColor(sauVariableValue_4_COLOR_RGBA, lightColor); - JStudio::TControl::TTransform_position_direction lightObjTransform; - JStudio::TControl::TTransform_position_direction aTStack_b8; - pLightObj->JSGGetPosition(&lightObjTransform.position); - pLightObj->JSGGetDirection(&lightObjTransform.direction); - JStudio::TControl::TTransform_position_direction* finalTransform = - pControl->transformOnGet_transform_ifEnabled(&lightObjTransform, &aTStack_b8); - adaptor_setVariableValue_Vec(sauVariableValue_3_POSITION_XYZ, finalTransform->position); - f32 dirx = finalTransform->direction.x; - f32 diry = finalTransform->direction.y; - f32 dirz = finalTransform->direction.z; - f32 sqr = sqrtf(dirx * dirx + dirz * dirz); - f32 dVar11 = atan2f(dirx, dirz); - f32 dVar9 = atan2f(diry, sqr); - adaptor_setVariableValue_immediate(10, MTXRadToDeg(dVar11)); - adaptor_setVariableValue_immediate(11, MTXRadToDeg(dVar9)); - Vec VStack_c4; - VECAdd(&finalTransform->position, &finalTransform->direction, &VStack_c4); - adaptor_setVariableValue_Vec(sauVariableValue_3_TARGET_POSITION_XYZ, VStack_c4); + { + adaptor_object_begin_(); + JStage::TLight* pLightObj = get_pJSG_(); + const JStudio::TObject* pObject = adaptor_getObject(); + JUT_ASSERT(60, pObject != 0); + const JStudio::TControl* pControl = pObject->getControl(); + JUT_ASSERT(62, pControl != 0); + GXColor lightColor = pLightObj->JSGGetColor(); + adaptor_setVariableValue_GXColor(sauVariableValue_4_COLOR_RGBA, lightColor); + JStudio::TControl::TTransform_position_direction lightObjTransform; + JStudio::TControl::TTransform_position_direction aTStack_b8; + pLightObj->JSGGetPosition(&lightObjTransform.position); + pLightObj->JSGGetDirection(&lightObjTransform.direction); + JStudio::TControl::TTransform_position_direction* finalTransform = + pControl->transformOnGet_transform_ifEnabled(lightObjTransform, &aTStack_b8); + adaptor_setVariableValue_Vec(sauVariableValue_3_POSITION_XYZ, finalTransform->position); + f32 dirx = finalTransform->direction.x; + f32 diry = finalTransform->direction.y; + f32 dirz = finalTransform->direction.z; + f32 sqr = sqrtf(dirx * dirx + dirz * dirz); + f32 dVar11 = atan2f(dirx, dirz); + f32 dVar9 = atan2f(diry, sqr); + adaptor_setVariableValue_immediate(10, MTXRadToDeg(dVar11)); + adaptor_setVariableValue_immediate(11, MTXRadToDeg(dVar9)); + Vec VStack_c4; + VECAdd(&finalTransform->position, &finalTransform->direction, &VStack_c4); + adaptor_setVariableValue_Vec(sauVariableValue_3_TARGET_POSITION_XYZ, VStack_c4); + } } /* 8028CF68-8028CFBC 2878A8 0054+00 1/0 0/0 0/0 .text diff --git a/src/Z2AudioLib/Z2Audience.cpp b/src/Z2AudioLib/Z2Audience.cpp index a6306be42eb..8a200729ba3 100644 --- a/src/Z2AudioLib/Z2Audience.cpp +++ b/src/Z2AudioLib/Z2Audience.cpp @@ -70,11 +70,12 @@ JASSoundParams* Z2Audible::getOuterParams(int param_0) { /* 802BBEE4-802BC204 2B6824 0320+00 1/1 0/0 0/0 .text * setOuterParams__9Z2AudibleFRC14JASSoundParamsRC14JASSoundParamsi */ -// NONMATCHING regalloc void Z2Audible::setOuterParams(JASSoundParams const& param_0, JASSoundParams const& param_1, - int param_2) { - Z2AudibleChannel* this_01 = &field_0x2c[param_2]; - u32 iStack_94 = (field_0x10.field_0x0.half.f1 & 0xf00) >> 8; + int index) { + JUT_ASSERT(89, index >= 0); + JUT_ASSERT(90, index < 1); + Z2AudibleChannel* this_01 = &field_0x2c[index]; + u8 iStack_94 = (field_0x10.field_0x0.half.f1 & 0xf00) >> 8; if (iStack_94 == 0) { this_01->field_0x0.combine(param_0, param_1); return; @@ -105,28 +106,24 @@ void Z2Audible::setOuterParams(JASSoundParams const& param_0, JASSoundParams con dVar10 = 0.0f; } } - dVar10 -= this_01->field_0x28; - f32 dVar11; - if (dVar10 > 0.0f) { - dVar11 = J3DUD::JMAAbs(dVar10); - dVar11 = Z2Calc::getParamByExp(dVar11, 1.0f, 0.0f, 0.1f, 0.1f, 0.5f, Z2Calc::CURVE_SIGN_1); + f32 dVar15 = dVar10 - this_01->field_0x28; + f32 dVar11 = 1.0f; + if (dVar15 > 0.0f) { + dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), 1.0f, 0.0f, 0.1f, 0.1f, 0.5f, Z2Calc::CURVE_SIGN_1); } else { - dVar11 = J3DUD::JMAAbs(dVar10); - dVar11 = Z2Calc::getParamByExp(dVar11, -1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 0.5f, Z2Calc::CURVE_SIGN_1); + dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), -1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 0.5f, Z2Calc::CURVE_SIGN_1); } - f32 fVar1 = this_01->field_0x28 + (dVar10 * dVar11); - if (fVar1 < 0.0f) { - fVar1 = 0.0f; - } else if (fVar1 > 1.0f) { - fVar1 = 1.0f; + dVar10 = this_01->field_0x28 + (dVar15 * dVar11); + if (dVar10 < 0.0f) { + dVar10 = 0.0f; + } else if (dVar10 > 1.0f) { + dVar10 = 1.0f; } - local_b0.mVolume = param_1.mVolume * fVar1; - this_01->field_0x28 = fVar1; - f32 dVar8 = J3DUD::JMAAbs(local_b8.x); - f32 dVar13 = Z2Calc::getParamByExp(local_b0.mVolume * dVar8, 1.0f, 0.0f, 0.1f, + local_b0.mVolume = param_1.mVolume * dVar10; + this_01->field_0x28 = dVar10; + f32 dVar13 = Z2Calc::getParamByExp(local_b0.mVolume * J3DUD::JMAAbs(local_b8.x), 1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 1.0 / 3.0f, Z2Calc::CURVE_SIGN_1); - f32 dVar14 = J3DUD::JMAAbs(local_b8.y); - dVar14 = Z2Calc::getParamByExp(local_b0.mVolume * dVar14, 1.0f, + f32 dVar14 = Z2Calc::getParamByExp(local_b0.mVolume * J3DUD::JMAAbs(local_b8.y), 1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 1.0f / 3.0f, Z2Calc::CURVE_SIGN_1); if (dVar13 > 1.0f / 3.0f) { @@ -514,7 +511,9 @@ Z2Audience::Z2Audience() : JASGlobalInstance(true), field_0x4(1.0f), } /* 802BD1FC-802BD288 2B7B3C 008C+00 1/0 1/1 0/0 .text __dt__10Z2AudienceFv */ -Z2Audience::~Z2Audience() {} +Z2Audience::~Z2Audience() { + //JUT_ASSERT(751, !isActive()); +} /* 802BD2DC-802BD338 2B7C1C 005C+00 0/0 1/1 0/0 .text * setAudioCamera__10Z2AudienceFPA4_fR3VecR3Vecffbib */ @@ -855,6 +854,12 @@ int Z2Audience::getMaxChannels() { return mMaxChannels; } +static void dummyMempool() { + +} + + + // padding (???) s8 data_80451355; s8 data_80451356; diff --git a/src/Z2AudioLib/Z2EnvSeMgr.cpp b/src/Z2AudioLib/Z2EnvSeMgr.cpp index b62f873c14e..16bca211b30 100644 --- a/src/Z2AudioLib/Z2EnvSeMgr.cpp +++ b/src/Z2AudioLib/Z2EnvSeMgr.cpp @@ -10,6 +10,11 @@ #include "d/d_save.h" #include "d/d_com_inf_game.h" +#ifdef DEBUG +// Should be in data section +static char sSpotName[144] = {0}; +#endif + /* 802C589C-802C58AC 2C01DC 0010+00 3/3 0/0 0/0 .text __ct__11Z2EnvSeBaseFP3Vec */ Z2EnvSeBase::Z2EnvSeBase(Vec* param_0) { mPos = param_0; @@ -970,6 +975,10 @@ void Z2EnvSeMgr::setHyrulSewerOpen(bool param_0) { /* 802C8300-802C8730 2C2C40 0430+00 2/1 1/1 0/0 .text startRiverSe__10Z2EnvSeMgrFSc */ // NONMATCHING JAISound stack issues bool Z2EnvSeMgr::startRiverSe(s8 param_1) { + #ifdef DEBUG + char* spotName = sSpotName; + #endif + if (Z2GetStatusMgr()->mCameraMapInfo == 6) { switch (Z2GetSceneMgr()->getCurrentSceneNum()) { case 5: @@ -982,7 +991,13 @@ bool Z2EnvSeMgr::startRiverSe(s8 param_1) { } case 8: // fake match: should be 2000.0f according to debug, but that generates an extra entry in sdata2 - if (Z2GetStatusMgr()->mPolygonPosition.y < -14500.0f) { + if ((Z2GetStatusMgr()->mPolygonPosition.y > + #ifdef DEBUG + 2000.0f + #else + -14500.0f + #endif + )) { break; } case 0x15: @@ -1003,26 +1018,31 @@ bool Z2EnvSeMgr::startRiverSe(s8 param_1) { f32 dVar16 = param_1 / 127.0f; f32 dVar18 = field_0x1ac * mRiverSeMgr.getMaxVolume(); f32 dVar13 = mRiverSeMgr.getPanPower(); - f32 dVar14 = mRiverSeMgr.getDolbyPower(); + f32 dolbyPower = mRiverSeMgr.getDolbyPower(); f32 dVar17 = field_0x1b0; + f32 fArr0; + f32 fArr1; + f32 fArr2; + f32 fArr3; switch (field_0x188) { case 0: return false; case 1: aJStack_742 = Z2SE_ENV_RIVER_SMALL; + fArr3 = dolbyPower; dVar18 *= Z2Calc::linearTransform(field_0x18c.calcNoise1f(), 0.0f, 1.0f, 0.7f, 1.0f, true); dVar17 *= Z2Calc::linearTransform(field_0x19c.calcNoise1f(), 0.0f, 1.0f, 0.8f, 1.1f, true); - uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dVar14, dVar17, 0); + uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dolbyPower, dVar17, 0); break; case 2: aJStack_742 = Z2SE_ENV_RIVER_NORMAL; mRiverSeMgr.getMaxPowL(); mRiverSeMgr.getMaxPowR(); - mRiverSeMgr.getDolbyPower(); - uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dVar14, dVar17, 0); + fArr2 = mRiverSeMgr.getDolbyPower(); + uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dolbyPower, dVar17, 0); break; case 3: if (field_0x1b8 > 0) { @@ -1035,15 +1055,17 @@ bool Z2EnvSeMgr::startRiverSe(s8 param_1) { } } aJStack_742 = Z2SE_ENV_SEWER; + fArr1 = dolbyPower; dVar18 *= Z2Calc::linearTransform(field_0x18c.calcNoise1f(), 0.0f, 1.0f, 0.6f, 1.0f, true); dVar17 *= Z2Calc::linearTransform(field_0x19c.calcNoise1f(), 0.0f, 1.0f, 0.8f, 1.0f, true); - uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dVar14, dVar17, 0); + uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dolbyPower, dVar17, 0); break; case 5: aJStack_742 = Z2SE_ENV_SPIRIT_FOUNTAIN; + fArr0 = dolbyPower; dVar18 *= Z2Calc::linearTransform(field_0x18c.calcNoise1f(), 0.0f, 1.0f, 0.6f, 1.0f, true); dVar17 *= Z2Calc::linearTransform(field_0x19c.calcNoise1f(), 0.0f, 1.0f, 0.8f, 1.0f, true); - uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dVar14, dVar17, 0); + uVar8 = field_0x180.startEnvSeLevel(aJStack_742, dVar16, dVar18, dVar13, dolbyPower, dVar17, 0); break; } @@ -1323,23 +1345,27 @@ f32 Z2EnvSeMgr::getFogDensity() { /* 802C9400-802C950C 2C3D40 010C+00 0/0 0/0 1/1 .text startFogSe__10Z2EnvSeMgrFv */ // NONMATCHING fmuls reg order bool Z2EnvSeMgr::startFogSe() { + bool iVar5 = false; f32 dVar10 = field_0x2e8.calcNoise1f(); - f32 dVar14 = 0.332f + (0.668f * dVar10); - f32 dVar13 = 0.8f + (dVar10 * 0.2f); - f32 dVar12 = 0.5f - (dVar10 * 0.4f) / 2; - bool iVar5 = - field_0x240.startEnvSeLevel(Z2SE_ENV_PUPPET_FOG_L, 20.0f, dVar14, dVar12, 0.5f, dVar13, 0); + f32 ratio = 0.332f; + f32 fVar1 = 0.2f; + f32 fVar2 = 0.4f; + f32 dVar14 = ratio + ((1.0f - ratio) * dVar10); + f32 dVar13 = (1.0f - fVar1) + (dVar10 * fVar1); + f32 dVar12 = 0.5f - (dVar10 * fVar2) / 2; + int iVar1 = 20; + f32 fVar3 = 0.5f; + bool iVar6 = + field_0x240.startEnvSeLevel(Z2SE_ENV_PUPPET_FOG_L, iVar1, dVar14, dVar12, fVar3, dVar13, 0); dVar10 = field_0x2f8.calcNoise1f(); - dVar14 = (0.332f + (0.668f * dVar10)); - dVar13 = (0.8f + (0.2f * dVar10)); - dVar12 = (0.5f + ( 0.4f * dVar10) / 2); - bool iVar6 = field_0x274.startEnvSeLevel(Z2SE_ENV_PUPPET_FOG_R, 20.0f, dVar14, dVar12, 0.5f, + dVar14 = (ratio + ((1.0f - ratio) * dVar10)); + dVar13 = ((1.0f - fVar1) + dVar10 * fVar1); + dVar12 = (0.5f + (dVar10 * fVar2) / 2); + iVar1 = 20; + fVar3 = 0.5f; + iVar5 = field_0x274.startEnvSeLevel(Z2SE_ENV_PUPPET_FOG_R, iVar1, dVar14, dVar12, fVar3, dVar13, 0); - bool uVar8 = false; - if (iVar5 && iVar6) { - uVar8 = true; - } - return uVar8; + return (iVar6 && iVar5); } /* 802C950C-802C9F58 2C3E4C 0A4C+00 2/0 1/1 0/0 .text initLv3WaterSe__10Z2EnvSeMgrFUcUcUcUc */ diff --git a/src/Z2AudioLib/Z2SeqMgr.cpp b/src/Z2AudioLib/Z2SeqMgr.cpp index 6a57686328d..c6183233845 100644 --- a/src/Z2AudioLib/Z2SeqMgr.cpp +++ b/src/Z2AudioLib/Z2SeqMgr.cpp @@ -16,7 +16,7 @@ #include "dol2asm.h" /* 802AEEA0-802AF010 2A97E0 0170+00 0/0 1/1 0/0 .text __ct__8Z2SeqMgrFv */ -Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance(this) { +Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance(true) { mMainBgmMaster.forceIn(); mSubBgmMaster.forceIn(); mBgmPause.forceIn(); @@ -28,6 +28,12 @@ Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance(this) { mTwilightGateVol = 1.0f; mAllBgmMaster.forceIn(); field_0xa4.forceIn(); + + #ifdef DEBUG + field_0x00_debug = 1.0f; + field_0x04_debug = 0; + #endif + field_0xb8 = -1; resetBattleBgmParams(); mBgmStatus = 0xff; @@ -1931,10 +1937,8 @@ void Z2SeqMgr::startBattleBgm(bool i_fade) { } /* 802B5204-802B545C 2AFB44 0258+00 3/3 1/1 0/0 .text stopBattleBgm__8Z2SeqMgrFUcUc */ -// NONMATCHING regalloc void Z2SeqMgr::stopBattleBgm(u8 param_0, u8 param_1) { if (mBattleSeqCount == 0) { - u8 count; s16 ivar6 = 0; if (Z2GetLink() != NULL) { ivar6 = Z2GetLink()->getMoveSpeed() - 23; @@ -1946,20 +1950,22 @@ void Z2SeqMgr::stopBattleBgm(u8 param_0, u8 param_1) { ivar6 = struct_80450861; } if (getSubBgmID() == Z2BGM_BATTLE_NORMAL) { - u8 count_out = struct_80450861 + ivar6; - count = struct_80450862 + ivar6 / 2; - mSubBgmHandle->fadeOut(count_out); - mBattleSeqCount = count_out; + param_0 = struct_80450861 + ivar6; + param_1 = struct_80450862 + ivar6 / 2; + mSubBgmHandle->fadeOut(param_0); + mBattleSeqCount = param_0; } else if (getSubBgmID() == Z2BGM_BATTLE_TWILIGHT) { if (mSubBgmStatus > 1) { - count = struct_80450861 + ivar6 / 4; + param_0 = struct_80450861 + ivar6 / 4; + param_1 = struct_80450861 + ivar6 / 4; } else { - count = 25 + ivar6 / 4; + param_0 = 25 + ivar6 / 4; + param_1 = 25 + ivar6 / 4; } - mSubBgmHandle->fadeOut(count); - mBattleSeqCount = count; + mSubBgmHandle->fadeOut(param_0); + mBattleSeqCount = param_0; } - mMainBgmMaster.fadeIn(count); + mMainBgmMaster.fadeIn(param_1); mBattleDistState = 3; setBattleDistIgnore(false); mFlags.mBattleSearched = false; diff --git a/src/Z2AudioLib/Z2SpeechMgr2.cpp b/src/Z2AudioLib/Z2SpeechMgr2.cpp index 49f589fc903..9cc6913e753 100644 --- a/src/Z2AudioLib/Z2SpeechMgr2.cpp +++ b/src/Z2AudioLib/Z2SpeechMgr2.cpp @@ -490,7 +490,7 @@ void Z2SpeechMgr2::setString(u16 const* s, s16 i_textNum, u8 i_speaker, u16 i_mo if (i_textNum > 500) { mTextNum = 500; - JUT_WARN_1(387, "TOO MANY TEXT : now(%d) > max(%d)", i_textNum, 500); + JUT_WARN_DEVICE(387, 1, "TOO MANY TEXT : now(%d) > max(%d)", i_textNum, 500); } else { mTextNum = i_textNum; } diff --git a/src/m_Do/m_Do_machine.cpp b/src/m_Do/m_Do_machine.cpp index e3177dea3de..645a8cdb396 100644 --- a/src/m_Do/m_Do_machine.cpp +++ b/src/m_Do/m_Do_machine.cpp @@ -5,6 +5,7 @@ #include "m_Do/m_Do_machine.h" #include "JSystem/JFramework/JFWSystem.h" +#include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JUtility/JUTConsole.h" #include "JSystem/JUtility/JUTDbPrint.h" #include "JSystem/JUtility/JUTException.h" @@ -27,6 +28,12 @@ /* 80450BF0-80450BF4 0000F0 0004+00 1/1 0/0 0/0 .sbss None */ static u8 mDebugFill; +#ifdef DEBUG +static u8 mDebugFillNotuse; +static u8 mDebugFillNew; +static u8 mDebugFillDelete; +#endif + /* 80450BF4-80450BF8 0000F4 0004+00 1/1 0/0 0/0 .sbss solidHeapErrors */ static int solidHeapErrors; @@ -479,13 +486,21 @@ int mDoMch_Create() { } JKRHeap::setDefaultDebugFill(mDebugFill); + #ifdef DEBUG + JKRSetDebugFillNotuse(mDebugFillNotuse); + JKRSetDebugFillNew(mDebugFillNew); + JKRSetDebugFillDelete(mDebugFillDelete); + #endif JFWSystem::setMaxStdHeap(1); + #ifndef DEBUG u32 arenaHi = (u32)OSGetArenaHi(); - u32 arenaLo = (u32)OSGetArenaLo(); + u32 arenaLo =(u32)OSGetArenaLo(); + if (arenaHi > 0x81800000 && arenaHi - 0x1800000 > arenaLo) { OSSetArenaHi((void*)(arenaHi - 0x1800000)); } + #endif u32 arenaSize = ((u32)OSGetArenaHi() - (u32)OSGetArenaLo()) - 0xF0; my_PrintHeap("アリーナ", arenaSize); @@ -494,6 +509,23 @@ int mDoMch_Create() { arenaSize += mDoMain::memMargin; } + #ifdef DEBUG + u32 uVar14 = 0xf20c00; + u32 local_1c = 0x74e000; + if (mDoMain::archiveHeapSize == -1) { + mDoMain::archiveHeapSize = 0x106ec00; + } else { + OSReport_Error("アーカイブヒープサイズ指定!\n"); + uVar14 = mDoMain::archiveHeapSize; + } + if (mDoMain::gameHeapSize == -1) { + mDoMain::gameHeapSize = 0x74e000; + } else { + OSReport_Error("ゲームヒープサイズ指定!\n"); + local_1c = mDoMain::gameHeapSize; + } + #endif + JFWSystem::setSysHeapSize(arenaSize - 0xDACD30); my_PrintHeap("システムヒープ", arenaSize - 0xDACD30); diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index e566e66365f..7bcfbd87d9e 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -169,6 +169,11 @@ s8 mDoMain::developmentMode = -1; /* 80450584-80450588 000004 0004+00 0/0 1/1 0/0 .sdata memMargin__7mDoMain */ u32 mDoMain::memMargin = 0xFFFFFFFF; +#ifdef DEBUG +u32 mDoMain::archiveHeapSize; +u32 mDoMain::gameHeapSize; +#endif + /* 80450588-80450590 000008 0008+00 2/2 0/0 0/0 .sdata None */ u8 mDoMain::mHeapBriefType = 4;