JMessage work (#1951)

This commit is contained in:
hatal175 2023-10-01 00:24:19 +03:00 committed by GitHub
parent 9fb99d923c
commit 02e093fc76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 129 additions and 163 deletions

View File

@ -1,36 +0,0 @@
lbl_802A8BAC:
/* 802A8BAC 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802A8BB0 7C 08 02 A6 */ mflr r0
/* 802A8BB4 90 01 00 14 */ stw r0, 0x14(r1)
/* 802A8BB8 54 80 86 3E */ rlwinm r0, r4, 0x10, 0x18, 0x1f
/* 802A8BBC 54 87 04 3E */ clrlwi r7, r4, 0x10
/* 802A8BC0 2C 00 00 FF */ cmpwi r0, 0xff
/* 802A8BC4 41 82 00 1C */ beq lbl_802A8BE0
/* 802A8BC8 40 80 00 48 */ bge lbl_802A8C10
/* 802A8BCC 2C 00 00 FD */ cmpwi r0, 0xfd
/* 802A8BD0 40 80 00 40 */ bge lbl_802A8C10
/* 802A8BD4 2C 00 00 F7 */ cmpwi r0, 0xf7
/* 802A8BD8 40 80 00 3C */ bge lbl_802A8C14
/* 802A8BDC 48 00 00 34 */ b lbl_802A8C10
lbl_802A8BE0:
/* 802A8BE0 2C 07 00 06 */ cmpwi r7, 6
/* 802A8BE4 40 80 00 18 */ bge lbl_802A8BFC
/* 802A8BE8 2C 07 00 04 */ cmpwi r7, 4
/* 802A8BEC 40 80 00 1C */ bge lbl_802A8C08
/* 802A8BF0 2C 07 00 00 */ cmpwi r7, 0
/* 802A8BF4 40 80 00 20 */ bge lbl_802A8C14
/* 802A8BF8 48 00 00 10 */ b lbl_802A8C08
lbl_802A8BFC:
/* 802A8BFC 2C 07 00 08 */ cmpwi r7, 8
/* 802A8C00 40 80 00 08 */ bge lbl_802A8C08
/* 802A8C04 48 00 00 10 */ b lbl_802A8C14
lbl_802A8C08:
/* 802A8C08 4B FF F4 89 */ bl do_tag___Q28JMessage10TProcessorFUlPCvUl
/* 802A8C0C 48 00 00 08 */ b lbl_802A8C14
lbl_802A8C10:
/* 802A8C10 4B FF F4 81 */ bl do_tag___Q28JMessage10TProcessorFUlPCvUl
lbl_802A8C14:
/* 802A8C14 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802A8C18 7C 08 03 A6 */ mtlr r0
/* 802A8C1C 38 21 00 10 */ addi r1, r1, 0x10
/* 802A8C20 4E 80 00 20 */ blr

View File

@ -1,38 +0,0 @@
lbl_802A7C54:
/* 802A7C54 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802A7C58 7C 08 02 A6 */ mflr r0
/* 802A7C5C 90 01 00 14 */ stw r0, 0x14(r1)
/* 802A7C60 93 E1 00 0C */ stw r31, 0xc(r1)
/* 802A7C64 7C 7F 1B 78 */ mr r31, r3
/* 802A7C68 38 C0 00 00 */ li r6, 0
/* 802A7C6C 80 63 00 08 */ lwz r3, 8(r3)
/* 802A7C70 28 03 00 00 */ cmplwi r3, 0
/* 802A7C74 41 82 00 1C */ beq lbl_802A7C90
/* 802A7C78 80 A3 00 0C */ lwz r5, 0xc(r3)
/* 802A7C7C A0 A5 00 0C */ lhz r5, 0xc(r5)
/* 802A7C80 54 80 04 3E */ clrlwi r0, r4, 0x10
/* 802A7C84 7C 00 28 40 */ cmplw r0, r5
/* 802A7C88 40 82 00 08 */ bne lbl_802A7C90
/* 802A7C8C 38 C0 00 01 */ li r6, 1
lbl_802A7C90:
/* 802A7C90 54 C0 06 3F */ clrlwi. r0, r6, 0x18
/* 802A7C94 41 82 00 08 */ beq lbl_802A7C9C
/* 802A7C98 48 00 00 28 */ b lbl_802A7CC0
lbl_802A7C9C:
/* 802A7C9C 80 7F 00 04 */ lwz r3, 4(r31)
/* 802A7CA0 80 63 00 04 */ lwz r3, 4(r3)
/* 802A7CA4 28 03 00 00 */ cmplwi r3, 0
/* 802A7CA8 40 82 00 0C */ bne lbl_802A7CB4
/* 802A7CAC 38 60 00 00 */ li r3, 0
/* 802A7CB0 48 00 00 0C */ b lbl_802A7CBC
lbl_802A7CB4:
/* 802A7CB4 38 63 00 08 */ addi r3, r3, 8
/* 802A7CB8 48 00 12 B5 */ bl Get_groupID__Q38JMessage18TResourceContainer10TCResourceFUs
lbl_802A7CBC:
/* 802A7CBC 90 7F 00 08 */ stw r3, 8(r31)
lbl_802A7CC0:
/* 802A7CC0 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 802A7CC4 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802A7CC8 7C 08 03 A6 */ mtlr r0
/* 802A7CCC 38 21 00 10 */ addi r1, r1, 0x10
/* 802A7CD0 4E 80 00 20 */ blr

View File

@ -1,8 +0,0 @@
lbl_802A8358:
/* 802A8358 80 A3 00 30 */ lwz r5, 0x30(r3)
/* 802A835C 80 85 00 00 */ lwz r4, 0(r5)
/* 802A8360 38 05 00 04 */ addi r0, r5, 4
/* 802A8364 90 03 00 30 */ stw r0, 0x30(r3)
/* 802A8368 80 03 00 2C */ lwz r0, 0x2c(r3)
/* 802A836C 7C 60 22 14 */ add r3, r0, r4
/* 802A8370 4E 80 00 20 */ blr

View File

@ -1,8 +0,0 @@
lbl_802A833C:
/* 802A833C 80 A3 00 30 */ lwz r5, 0x30(r3)
/* 802A8340 A0 85 00 00 */ lhz r4, 0(r5)
/* 802A8344 38 05 00 02 */ addi r0, r5, 2
/* 802A8348 90 03 00 30 */ stw r0, 0x30(r3)
/* 802A834C 80 03 00 2C */ lwz r0, 0x2c(r3)
/* 802A8350 7C 60 22 14 */ add r3, r0, r4
/* 802A8354 4E 80 00 20 */ blr

View File

@ -31,6 +31,12 @@ struct TNodeLinkList {
struct const_iterator {
const_iterator(TLinkListNode* pNode) { node = pNode; }
const_iterator(const const_iterator& iter) { *this = iter; }
const_iterator(iterator iter) { *this = iter; }
TLinkListNode* operator->() const { return node; }
const_iterator& operator++() {
node = node->getNext();
return *this;
}
TLinkListNode* node;
};
@ -74,11 +80,25 @@ struct TLinkList : public TNodeLinkList {
iterator(TNodeLinkList::iterator iter) : TNodeLinkList::iterator(iter) {}
};
TLinkListNode* Element_toNode(T* element) const { return &element->ocObject_; }
struct const_iterator : TNodeLinkList::const_iterator {
const_iterator(TNodeLinkList::const_iterator iter) : TNodeLinkList::const_iterator(iter) {}
const_iterator(iterator iter) : TNodeLinkList::const_iterator(iter) {}
const T* operator->() const {
return Element_toValue(TNodeLinkList::const_iterator::operator->());
}
const T& operator*() const { return *operator->();}
const_iterator& operator++() {
TNodeLinkList::const_iterator::operator++();
return *this;
}
};
void Insert(TLinkList::iterator iter, T* element) {
TLinkListNode* Element_toNode(T* element) const { return &element->ocObject_; }
static T* Element_toValue(TLinkListNode* node) { return (T*)node; }
iterator Insert(TLinkList::iterator iter, T* element) {
TLinkListNode* node = Element_toNode(element);
TNodeLinkList::Insert(iter, node);
return TNodeLinkList::Insert(iter, node);
}
iterator Erase(T* element) {
@ -92,18 +112,36 @@ struct TLinkList : public TNodeLinkList {
return iter;
}
TLinkList::const_iterator end() const {
return TLinkList::const_iterator(((TLinkList*)this)->end());
}
TLinkList::iterator begin() {
TNodeLinkList::iterator node_iter = TNodeLinkList::begin();
TLinkList::iterator iter(node_iter);
return iter;
}
TLinkList::const_iterator begin() const {
return TLinkList::const_iterator(((TLinkList*)this)->begin());
}
void Push_back(T* element) {
TLinkList::iterator iter(TLinkList::end());
this->Insert(iter, element);
}
};
template<typename T, int I>
bool operator==(const typename TLinkList<T, I>::const_iterator iter1, const typename TLinkList<T, I>::const_iterator iter2) {
return iter1->node == iter2->node;
}
template<typename T, int I>
bool operator!=(const typename TLinkList<T, I>::const_iterator iter1, const typename TLinkList<T, I>::const_iterator iter2) {
return !(iter1 == iter2);
}
template <typename T, int I>
struct TLinkList_factory : public TLinkList<T, I> {
virtual ~TLinkList_factory() {}
@ -113,12 +151,27 @@ struct TLinkList_factory : public TLinkList<T, I> {
template <typename T, int I>
struct TEnumerator {
TLinkList<T, I> field_0x0;
TLinkList<T, I> field_0x4;
inline TEnumerator(typename TLinkList<T,I>::const_iterator _current, typename TLinkList<T,I>::const_iterator _end) :
current(_current), end(_end)
{}
bool isEnd() const { return current.node == end.node; }
operator bool() const { return isEnd(); }
T& operator*() {
T& rv = (T&)*current;
++current;
return rv;
}
TLinkList<T, I>::const_iterator current;
TLinkList<T, I>::const_iterator end;
};
template <typename T, int I>
struct TContainerEnumerator_const : public TEnumerator<T, I> {};
struct TContainerEnumerator_const : public TEnumerator<T, I> {
inline TContainerEnumerator_const(const T* param_0) : TEnumerator<T,I>(param_0->begin(), param_0->end())
{}
};
}; // namespace JGadget

View File

@ -43,8 +43,8 @@ struct data {
TParse_TBlock_color(const void* data) : TParse_TBlock(data) {}
};
static u16 getTagCode(u32 tag) { return tag & 0xFFFF; }
static u8 getTagGroup(u32 tag) { return (tag >> 0x10) & 0xFF; }
static u32 getTagCode(u32 tag) { return tag & 0xFFFF; }
static u32 getTagGroup(u32 tag) { return (tag >> 0x10) & 0xFF; }
static u32 ga4cSignature;

View File

@ -24,6 +24,8 @@ struct TReference {
return pcResource_->getResource_groupID(groupID);
}
TResourceContainer* getResourceContainer() const { return pcResource_; }
/* 0x4 */ TResourceContainer* pcResource_;
};
@ -192,6 +194,14 @@ struct TProcessor {
return pResourceCache_ != NULL && groupID == pResourceCache_->getGroupID();
}
TResourceContainer* getResourceContainer() const {
if (pReference_ == NULL) {
return NULL;
}
return pReference_->getResourceContainer();
}
/* 0x04 */ const TReference* pReference_;
/* 0x08 */ const TResource* pResourceCache_;
/* 0x0C */ const char* pszCurrent_;

View File

@ -7,11 +7,11 @@
#include "JSystem/JStudio/JStudio/fvb-data.h"
namespace JMessage {
struct TResource : public JGadget::TLinkListNode {
struct TResource {
TResource()
: field_0x8(NULL), field_0xc(NULL), field_0x10(NULL), field_0x14(0), field_0x18(NULL) {}
/* 802A8CDC */ void toMessageIndex_messageID(u32, u32, bool*) const;
/* 802A8CDC */ u16 toMessageIndex_messageID(u32, u32, bool*) const;
bool isContained_messageIndex(u16 messageIndex) const {
return messageIndex < getMessageEntryNumber();
@ -46,7 +46,7 @@ struct TResource : public JGadget::TLinkListNode {
void setData_header(const void* pData) {
field_0x8.setRaw(pData);
}
JGadget::TLinkListNode ocObject_;
/* 0x08 */ data::TParse_THeader field_0x8;
/* 0x0C */ data::TParse_TBlock_info field_0xc;
/* 0x10 */ char* field_0x10;
@ -81,7 +81,8 @@ struct TResourceContainer {
TResource* getResource_groupID(u16 groupID) { return resContainer_.Get_groupID(groupID); }
TResource* getResource_groupID(u16 groupID) const { return getResource_groupID(groupID); }
bool isEncodingSettable(u8 e) const { return mEncodingType == e || e == 0; }
bool isEncodingSettable(u8 e) const { return mEncodingType == e || mEncodingType == 0; }
const TCResource* getResourceContainer() const { return &resContainer_; }
static JMessage::locale::parseCharacter_function sapfnParseCharacter_[5];

View File

@ -5,6 +5,7 @@
#include "JSystem/JMessage/processor.h"
#include "JSystem/JMessage/control.h"
#include "JSystem/JUtility/JUTAssert.h"
//
// Forward References:
@ -139,28 +140,45 @@ void JMessage::TProcessor::stack_popCurrent() {
/* 802A7C54-802A7CD4 2A2594 0080+00 1/1 1/1 0/0 .text
* getResource_groupID__Q28JMessage10TProcessorCFUs */
#ifdef NONMATCHING
const JMessage::TResource* JMessage::TProcessor::getResource_groupID(u16 groupID) const {
if (isResourceCache_groupID(groupID)) {
return pResourceCache_;
}
pResourceCache_ = getResource_groupID_uncached(groupID);
// Is there another way to do this?
((JMessage::TProcessor*)this)->pResourceCache_ = getResource_groupID_uncached(groupID);
return pResourceCache_;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm const JMessage::TResource* JMessage::TProcessor::getResource_groupID(u16 param_0) const {
nofralloc
#include "asm/JSystem/JMessage/processor/getResource_groupID__Q28JMessage10TProcessorCFUs.s"
}
#pragma pop
#endif
/* 802A7CD4-802A7E38 2A2614 0164+00 0/0 1/1 0/0 .text
* toMessageCode_messageID__Q28JMessage10TProcessorCFUlUlPb */
// TContainerEnumerator_const inline issues + while condition
#ifdef NONMATCHING
u32 JMessage::TProcessor::toMessageCode_messageID(u32 param_0, u32 param_1,
bool* param_2) const {
const TResource* this_00 = getResourceCache();
u16 uVar4;
if (this_00 != NULL && (uVar4 = this_00->toMessageIndex_messageID(param_0, param_1, param_2)) != 0xffff) {
return uVar4 | (this_00->getGroupID() << 16);
}
TResourceContainer* this_01 = getResourceContainer();
if (this_01 == NULL) {
return -1;
}
JGadget::TContainerEnumerator_const<TResourceContainer::TCResource, 0> enumerator(this_01->getResourceContainer());
const TResource* this_02;
while (!enumerator) {
this_02 = (const TResource*)&(*enumerator);
if (this_02 == this_00 || (uVar4 = this_02->toMessageIndex_messageID(param_0, param_1, param_2)) == 0xffff) {
continue;
}
((JMessage::TProcessor*)this)->pResourceCache_ = this_02;
return uVar4 | (this_02->getGroupID() << 0x10);
}
return -1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@ -170,6 +188,7 @@ asm u32 JMessage::TProcessor::toMessageCode_messageID(u32 param_0, u32 param_1,
#include "asm/JSystem/JMessage/processor/toMessageCode_messageID__Q28JMessage10TProcessorCFUlUlPb.s"
}
#pragma pop
#endif
/* 802A7E38-802A7EDC 2A2778 00A4+00 1/1 0/0 0/0 .text
* on_select_begin__Q28JMessage10TProcessorFPFPQ28JMessage10TProcessor_PCcPCvPCcUl */
@ -265,8 +284,8 @@ bool JMessage::TProcessor::do_setBegin_isReady_() const {
/* 802A8090-802A81EC 2A29D0 015C+00 2/2 0/0 0/0 .text do_tag___Q28JMessage10TProcessorFUlPCvUl */
void JMessage::TProcessor::do_tag_(u32 uTag, void const* data, u32 uSize) {
u8 group = data::getTagGroup(uTag);
u16 code = data::getTagCode(uTag);
u32 group = data::getTagGroup(uTag);
u32 code = data::getTagCode(uTag);
switch (group) {
case 0xFF:
@ -345,38 +364,25 @@ bool JMessage::TProcessor::process_onCharacterEnd_select_(JMessage::TProcessor*
/* 802A833C-802A8358 2A2C7C 001C+00 1/1 0/0 0/0 .text
* process_onSelect_limited___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
// r4 vs r5
#ifdef NONMATCHING
const char* JMessage::TProcessor::process_onSelect_limited_(JMessage::TProcessor* pThis) {
u16* ptr = (u16*)pThis->oProcess_.rData.pOffset;
u16 data = *ptr;
u16 data = JGadget::binary::TParseValue<u16, TParseValue_endian_big_>::parse((u16*)pThis->oProcess_.rData.pOffset);
pThis->oProcess_.rData.pOffset =
JGadget::binary::TParseValue<u16, TParseValue_endian_big_>::parse(ptr) + 2;
(void*)((u8*)pThis->oProcess_.rData.pOffset + 2);
return &pThis->oProcess_.rData.pcBase[data];
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm const char* JMessage::TProcessor::process_onSelect_limited_(JMessage::TProcessor* param_0) {
nofralloc
#include "asm/JSystem/JMessage/processor/process_onSelect_limited___Q28JMessage10TProcessorFPQ28JMessage10TProcessor.s"
}
#pragma pop
#endif
/* 802A8358-802A8374 2A2C98 001C+00 1/1 0/0 0/0 .text
* process_onSelect___Q28JMessage10TProcessorFPQ28JMessage10TProcessor */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm const char* JMessage::TProcessor::process_onSelect_(JMessage::TProcessor* param_0) {
nofralloc
#include "asm/JSystem/JMessage/processor/process_onSelect___Q28JMessage10TProcessorFPQ28JMessage10TProcessor.s"
const char* JMessage::TProcessor::process_onSelect_(JMessage::TProcessor* pThis) {
u32 data = JGadget::binary::TParseValue<u32, TParseValue_endian_big_>::parse((u32*)pThis->oProcess_.rData.pOffset);
pThis->oProcess_.rData.pOffset =
(void*)((u8*)pThis->oProcess_.rData.pOffset + 4);
return &pThis->oProcess_.rData.pcBase[data];
}
#pragma pop
/* 802A8374-802A83B8 2A2CB4 0044+00 0/0 2/2 0/0 .text
* __ct__Q28JMessage18TSequenceProcessorFPCQ28JMessage10TReferencePQ28JMessage8TControl */
@ -559,8 +565,8 @@ void JMessage::TSequenceProcessor::do_end_() {
* do_tag___Q28JMessage18TSequenceProcessorFUlPCvUl */
void JMessage::TSequenceProcessor::do_tag_(u32 uTag, void const* data, u32 uSize) {
char* temp = (char*)data;
u8 group = data::getTagGroup(uTag);
u16 code = data::getTagCode(uTag);
u32 group = data::getTagGroup(uTag);
u32 code = data::getTagCode(uTag);
switch (group) {
case 0xFF:
@ -613,9 +619,10 @@ void JMessage::TSequenceProcessor::do_tag_(u32 uTag, void const* data, u32 uSize
* process_setMessageIndex_reserved___Q28JMessage18TSequenceProcessorFUs */
#ifdef NONMATCHING
void JMessage::TSequenceProcessor::process_setMessageIndex_reserved_(u16 u16Index) {
JUT_ASSERT(890, u16Index >= 0xff00);
if (u16Index != -1) {
return;
}
}
}
#else
#pragma push
@ -711,11 +718,9 @@ void JMessage::TRenderingProcessor::do_end_() {}
/* 802A8BAC-802A8C24 2A34EC 0078+00 1/0 4/0 0/0 .text
* do_tag___Q28JMessage19TRenderingProcessorFUlPCvUl */
// r0 / r7 swapped
#ifdef NONMATCHING
void JMessage::TRenderingProcessor::do_tag_(u32 uTag, void const* data, u32 uSize) {
u8 group = data::getTagGroup(uTag);
u16 code = data::getTagCode(uTag);
u32 group = data::getTagGroup(uTag);
u32 code = data::getTagCode(uTag);
switch (group) {
case 0xFF:
@ -746,16 +751,6 @@ void JMessage::TRenderingProcessor::do_tag_(u32 uTag, void const* data, u32 uSiz
break;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JMessage::TRenderingProcessor::do_tag_(u32 param_0, void const* param_1, u32 param_2) {
nofralloc
#include "asm/JSystem/JMessage/processor/do_tag___Q28JMessage19TRenderingProcessorFUlPCvUl.s"
}
#pragma pop
#endif
/* 802A8C24-802A8C44 2A3564 0020+00 1/1 0/0 0/0 .text on_message__Q28JMessage10TProcessorCFUl */
const char* JMessage::TProcessor::on_message(u32 param_0) const {

View File

@ -67,7 +67,7 @@ extern "C" f32 ga4cSignature__Q28JMessage4data[1 + 1 /* padding */];
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JMessage::TResource::toMessageIndex_messageID(u32 param_0, u32 param_1,
asm u16 JMessage::TResource::toMessageIndex_messageID(u32 param_0, u32 param_1,
bool* param_2) const {
nofralloc
#include "asm/JSystem/JMessage/resource/toMessageIndex_messageID__Q28JMessage9TResourceCFUlUlPb.s"
@ -230,16 +230,13 @@ bool JMessage::TParse::parseHeader_next(void const** ppData_inout, u32* puBlock_
return 1;
}
pResource_ = pContainer_->resContainer_.Do_create();
TResourceContainer::TCResource* resContainer = &pContainer_->resContainer_;
pResource_ = resContainer->Do_create();
if (pResource_ == NULL) {
if (param_2 & 0x20) {
return 0;
} else {
return 1;
}
return param_2 & 0x20;
} else {
pContainer_->resContainer_.Push_back_hack(pResource_);
resContainer->Push_back(pResource_);
pResource_->setData_header(header.getRaw());
return 1;
}