From 7927df6d4111c0a421ff598e2adf48f920c8da70 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 20 Oct 2021 23:03:37 +0200 Subject: [PATCH] Fix call/return --- include/crt.c | 4 ++-- oscar64/ByteCodeGenerator.cpp | 5 ++++- oscar64/InterCodeGenerator.cpp | 27 ++++++++++++++++----------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/include/crt.c b/include/crt.c index a414bf2..0e9d268 100644 --- a/include/crt.c +++ b/include/crt.c @@ -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: diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 1e3fb6d..e0fb162 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -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) { diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 2ae61d1..9ff87ec 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -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; }