Fix call/return

This commit is contained in:
drmortalwombat 2021-10-20 23:03:37 +02:00
parent 9833656fcf
commit 7927df6d41
3 changed files with 22 additions and 14 deletions

View File

@ -2142,7 +2142,7 @@ __asm inp_enter
dey
beq W1
L1: lda regs - 1, y
L1: lda sregs - 1, y
dey
sta (sp), y
bne L1
@ -2180,7 +2180,7 @@ __asm inp_return
dey
L1: lda (sp), y
sta regs, y
sta sregs, y
dey
bpl L1
W1:

View File

@ -3670,6 +3670,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mCode = BC_NOP;
progress = true;
}
#if 1
else if (
mIns[i + 0].mCode == BC_STORE_REG_16 &&
mIns[i + 1].LoadsRegister(BC_REG_ACCU) &&
@ -3679,6 +3680,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mRegister = mIns[i + 0].mRegister;
progress = true;
}
#endif
}
#endif
#if 1
@ -3762,6 +3764,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i].mCode = BC_NOP;
progress = true;
}
#if 1
else if (mIns[i].mCode == BC_STORE_REG_8 && mIns[i + 1].StoresRegister(mIns[i].mRegister) && mIns[i + 1].mRegisterFinal)
{
mIns[i + 1].mRegister = BC_REG_ACCU;
@ -3790,7 +3793,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i].mCode = BC_NOP;
progress = true;
}
#endif
#if 0
else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)
{

View File

@ -283,19 +283,24 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
else if (aexp->mType == DT_LABEL_REF)
{
if (!aexp->mBase->mBase->mLinkerObject)
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr);
if (aexp->mBase->mBase)
{
if (!aexp->mBase->mBase->mLinkerObject)
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr);
LinkerReference ref;
ref.mObject = dec->mLinkerObject;
ref.mOffset = offset;
if (aexp->mFlags & DTF_UPPER_BYTE)
ref.mFlags = LREF_HIGHBYTE;
LinkerReference ref;
ref.mObject = dec->mLinkerObject;
ref.mOffset = offset;
if (aexp->mFlags & DTF_UPPER_BYTE)
ref.mFlags = LREF_HIGHBYTE;
else
ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
dec->mLinkerObject->AddReference(ref);
}
else
ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
dec->mLinkerObject->AddReference(ref);
mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Undefined immediate operand", aexp->mBase->mIdent->mString);
offset += 1;
}