Various alignments to debug + matching TUs (#2391)

This commit is contained in:
hatal175 2025-04-13 21:55:52 +03:00 committed by GitHub
parent 417922b5c3
commit 3df5c7bb42
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 759 additions and 506 deletions

View File

@ -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

View File

@ -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"),

View File

@ -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;

View File

@ -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);

View File

@ -3,6 +3,7 @@
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JSupport/JSUList.h"
#include "JSystem/JUtility/JUTAssert.h"
#include <dolphin/os.h>
#include <dolphin/os.h>
@ -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;

View File

@ -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(); }

View File

@ -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;

View File

@ -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<JASTrack> {
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<JASTrack> {
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<JASTrack> {
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<JASTrack> {
/* 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;

View File

@ -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;

View File

@ -38,7 +38,8 @@ struct TUtil<f32> {
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<f32> : public Vec {
inline TVec3(const Vec& i_vec) {
@ -147,7 +166,8 @@ struct TVec3<f32> : public Vec {
setTVec3f(&i_vec.x, &x);
}
TVec3(f32 x, f32 y, f32 z) {
template<class U>
TVec3(U x, U y, U z) {
set(x, y, z);
}
@ -156,7 +176,8 @@ struct TVec3<f32> : public Vec {
operator Vec*() { return (Vec*)&x; }
operator const Vec*() const { return (Vec*)&x; }
void set(const TVec3<f32>& other) {
template<class U>
void set(const TVec3<U>& other) {
x = other.x;
y = other.y;
z = other.z;
@ -168,7 +189,8 @@ struct TVec3<f32> : public Vec {
z = other.z;
}
void set(f32 x_, f32 y_, f32 z_) {
template<class U>
void set(U x_, U y_, U z_) {
x = x_;
y = y_;
z = z_;
@ -181,27 +203,7 @@ struct TVec3<f32> : public Vec {
void zero() { x = y = z = 0.0f; }
void mul(const TVec3<f32>& a, const TVec3<f32>& 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<f32>& a) {
@ -239,23 +241,19 @@ struct TVec3<f32> : 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<f32>::epsilon()) {
return 0.0f;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
scale(norm);
f32 inv_norm = TUtil<f32>::inv_sqrt(sq);
scale(inv_norm);
return inv_norm * sq;
}
void normalize(const TVec3<f32>& other) {
f32 sq = other.squared();
if (sq <= FLT_EPSILON * 32.0f) {
if (sq <= TUtil<f32>::epsilon()) {
zero();
return;
}
@ -348,18 +346,14 @@ struct TVec3<f32> : 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<f32>::epsilon()) {
return 0.0f;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
scale(norm * len);
f32 inv_norm = TUtil<f32>::inv_sqrt(sq);
scale(inv_norm * len);
return inv_norm * sq;
}
f32 setLength(const TVec3<f32>& other, f32 len) {
@ -374,25 +368,7 @@ struct TVec3<f32> : public Vec {
}
f32 dot(const TVec3<f32>& 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<f32>& param_1, const TVec3<f32>& param_2, const TVec3<f32>& param_3,
@ -450,15 +426,15 @@ struct TVec2 {
return (x >= other.x) && (y >= other.y) ? true : false;
}
f32 dot(const TVec2<T>& other) {
f32 dot(const TVec2<T>& 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;

View File

@ -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 */

View File

@ -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<typename T>

View File

@ -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]; }

View File

@ -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
#endif

View File

@ -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;

View File

@ -19,13 +19,19 @@ class JPAParticleCallBack;
*
*/
struct JPAEmitterWorkData {
struct JPAVolumeCalcData {
/* 0x00 */ JGeometry::TVec3<f32> mVolumePos;
/* 0x0C */ JGeometry::TVec3<f32> mVelOmni;
/* 0x18 */ JGeometry::TVec3<f32> mVelAxis;
};
JPAEmitterWorkData() : mRndm(0) {}
/* 0x00 */ JPABaseEmitter* mpEmtr;
/* 0x04 */ JPAResource* mpRes;
/* 0x08 */ JPAResourceManager* mpResMgr;
/* 0x0C */ JPARandom mRndm;
/* 0x10 */ JGeometry::TVec3<f32> mVolumePos;
/* 0x1C */ JGeometry::TVec3<f32> mVelOmni;
/* 0x28 */ JGeometry::TVec3<f32> 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; }

View File

@ -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<JPABaseEmitter>* mpGrpEmtr;
/* 0x00 */ JSUList<JPABaseEmitter>* pEmtrUseList;
/* 0x04 */ JSUList<JPABaseEmitter> mFreeEmtrList;
/* 0x10 */ JPAList<JPABaseParticle> 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 */

View File

@ -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<f32>& getPos() { return mPos; }
JGeometry::TVec3<f32>& getDir() { return mDir; }
f32 getMag() { return mMag; }
f32 getMag() const { return mMag; }
void getPosOrig(JGeometry::TVec3<f32>* pos) { pos->set(mpData->mPos); }
void getDirOrig(JGeometry::TVec3<f32>* dir) { dir->set(mpData->mDir); }
f32 getMagOrig() { return mpData->mMag; }

View File

@ -9,9 +9,7 @@
*/
template <class T>
struct JPANode {
JPANode() {
mpPrev = NULL;
mpNext = NULL;
JPANode() : mpPrev(NULL), mpNext(NULL) {
}
~JPANode() {}
JPANode<T>* getPrev() { return mpPrev; }
@ -34,6 +32,7 @@ struct JPAList {
/* 0x08 */ u32 mNum;
JPAList() : mpFirst(NULL), mpLast(NULL), mNum() {}
~JPAList() {}
JPANode<T>* getEnd() { return NULL; }
JPANode<T>* 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++;

View File

@ -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*);

View File

@ -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; }

View File

@ -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 &param_1;
}
transformOnGet_transform(param_1, param_2);
transformOnGet_transform(&param_1, param_2);
return param_2;
}

View File

@ -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_;

View File

@ -45,13 +45,13 @@ class JSULink : public JSUPtrLink {
public:
JSULink(T* object) : JSUPtrLink((void*)object) {}
T* getObject() const { return static_cast<T*>(getObjectPtr()); }
T* getObject() const { return static_cast<T*>(mObject); }
JSUList<T>* getSupervisor() const { return static_cast<JSUList<T>*>(this->getList()); }
JSULink<T>* getNext() const { return static_cast<JSULink*>(this->JSUPtrLink::getNext()); }
JSULink<T>* getNext() const { return static_cast<JSULink*>(mNext); }
JSULink<T>* getPrev() const { return static_cast<JSULink*>(this->JSUPtrLink::getPrev()); }
JSULink<T>* getPrev() const { return static_cast<JSULink*>(mPrev); }
};
//

View File

@ -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);

View File

@ -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; }

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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 <dolphin/os.h>
@ -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 */

View File

@ -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

View File

@ -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_<JMath::TRandom_fast_> 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) {

View File

@ -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);
}

View File

@ -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;

View File

@ -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;

View File

@ -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 */

View File

@ -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<JPABaseParticle>* 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<JPABaseParticle>* 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<f32>* 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;
}
}

View File

@ -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<JPABaseParticle>* ptcl = new (pHeap, 0) JPANode<JPABaseParticle>[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<JPABaseEmitter>[mGrpMax];
mpResMgrAry = new (pHeap, 0) JPAResourceManager*[mResMax];
for (int i = 0; i < mResMax; i++) {
mpResMgrAry[i] = NULL;
JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 0) JPANode<JPABaseParticle>[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<JPABaseEmitter>[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__17JPAEmitterManagerFRCQ29JGeometry8TVec3<f>UsUcUcP18JPAEmitterCallBackP19JPAParticleCallBack
*/
JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3<f32> 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<JPABaseEmitter>* 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<f32> c
}
/* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text calc__17JPAEmitterManagerFUc */
void JPAEmitterManager::calc(u8 groupID) {
for (JSULink<JPABaseEmitter>*pLink = mpGrpEmtr[groupID].getFirst(), *pNext;
pLink != mpGrpEmtr[groupID].getEnd(); pLink = pNext) {
void JPAEmitterManager::calc(u8 group_id) {
JUT_ASSERT(154, group_id < gidMax);
JSULink<JPABaseEmitter>* pNext = NULL;
for (JSULink<JPABaseEmitter>* 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<JPABaseEmitter>* pLink = mpGrpEmtr[groupID].getFirst();
pLink != mpGrpEmtr[groupID].getEnd(); pLink = pLink->getNext()) {
for (JSULink<JPABaseEmitter>* 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<JPABaseEmitter>*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<JPABaseEmitter>* pNext = NULL;
for (JSULink<JPABaseEmitter>* 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<float> v;
v.set(0.0f, mpWorkData->mPosCamMtx[1][1], mpWorkData->mPosCamMtx[2][1]);
JGeometry::TVec3<float> 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];
}

View File

@ -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<f32> 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<f32> 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;

View File

@ -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<f32> velOmni;
if (emtr->mAwayFromCenterSpeed) {
velOmni.setLength(work->mVelOmni, emtr->mAwayFromCenterSpeed);
velOmni.setLength(work->mVolumeCalcData.mVelOmni, emtr->mAwayFromCenterSpeed);
} else {
velOmni.zero();
}
JGeometry::TVec3<f32> 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<f32> 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;
}

View File

@ -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

View File

@ -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<Z2Audience>(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;

View File

@ -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 */

View File

@ -16,7 +16,7 @@
#include "dol2asm.h"
/* 802AEEA0-802AF010 2A97E0 0170+00 0/0 1/1 0/0 .text __ct__8Z2SeqMgrFv */
Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance<Z2SeqMgr>(this) {
Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance<Z2SeqMgr>(true) {
mMainBgmMaster.forceIn();
mSubBgmMaster.forceIn();
mBgmPause.forceIn();
@ -28,6 +28,12 @@ Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance<Z2SeqMgr>(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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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;