diff --git a/oscar64/Linker.cpp b/oscar64/Linker.cpp index 6207f1a..1a4b5ba 100644 --- a/oscar64/Linker.cpp +++ b/oscar64/Linker.cpp @@ -54,6 +54,23 @@ LinkerObject::~LinkerObject(void) } +LinkerObject* LinkerObject::CloneAssembler(Linker* linker) const +{ + LinkerObject* lo = linker->AddObject(mLocation, mIdent, mSection, mType, mAlignment); + lo->AddData(mData, mSize); + lo->mFlags = mFlags; + + for (int i = 0; i < mReferences.Size(); i++) + { + LinkerReference ref = *(mReferences[i]); + if (ref.mObject == this) ref.mObject = lo; + if (ref.mRefObject == this) ref.mRefObject = lo; + lo->AddReference(ref); + } + + return lo; +} + void LinkerObject::AddReference(const LinkerReference& ref) { LinkerReference* nref = new LinkerReference(ref); diff --git a/oscar64/Linker.h b/oscar64/Linker.h index f02108a..47c9dcb 100644 --- a/oscar64/Linker.h +++ b/oscar64/Linker.h @@ -212,6 +212,8 @@ public: LinkerObject(void); ~LinkerObject(void); + LinkerObject* CloneAssembler(Linker * linker) const; + void AddData(const uint8* data, int size); void AddLocations(const ExpandingArray& locations); uint8* AddSpace(int size); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 5acac1e..e8217df 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -14281,6 +14281,11 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, NativeCodePro { if (ins->mCode == IC_ASSEMBLER) { + if (ins->mNumOperands > 1 && ins->mSrc[0].mLinkerObject->mNumTemporaries) + { + ins->mSrc[0].mLinkerObject = ins->mSrc[0].mLinkerObject->CloneAssembler(proc->mModule->mLinker); + } + for (int i = 1; i < ins->mNumOperands; i++) { if (ins->mSrc[i].mTemp < 0) @@ -53291,7 +53296,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) mInterProc->mLinkerObject->mNativeProc = this; - CheckFunc = !strcmp(mIdent->mString, "equipment_random"); + CheckFunc = !strcmp(mIdent->mString, "putpch"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks];