diff --git a/oscar64/Declaration.cpp b/oscar64/Declaration.cpp index ae22900..56d3209 100644 --- a/oscar64/Declaration.cpp +++ b/oscar64/Declaration.cpp @@ -455,6 +455,10 @@ bool Declaration::CanAssign(const Declaration* fromType) const { return mBase->IsSame(fromType); } + else if (mBase->mType == DT_TYPE_VOID && fromType->mType == DT_TYPE_ASSEMBLER) + { + return true; + } } return false; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 45bbc4b..43f09bf 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -2243,6 +2243,20 @@ void InterCodeGenerator::BuildInitializer(InterCodeModule * mod, uint8* dp, int t >>= 8; } } + else if (data->mType == DT_CONST_ASSEMBLER) + { + if (data->mVarIndex < 0) + TranslateAssembler(mod, data->mValue); + + InterVariable::Reference ref; + ref.mAddr = offset; + ref.mUpper = true; + ref.mLower = true; + ref.mFunction = false; + ref.mIndex = data->mVarIndex; + ref.mOffset = 0; + references.Push(ref); + } else if (data->mType == DT_CONST_FUNCTION) { if (data->mVarIndex < 0) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 07a2dd1..f54faeb 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -4708,6 +4708,13 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp])); block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 1)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 1)); + if (ins->mSType[0] == IT_FLOAT) + { + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 2)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 2)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 3)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 3)); + } } } break; case IC_BINARY_OPERATOR: diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index e2155f3..2b9defe 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -751,7 +751,7 @@ Declaration* Parser::ParseDeclaration(bool variable) } } - if (mGlobals == mScope) + if (mGlobals == mScope || (ndec->mFlags & DTF_STATIC)) { ndec->mFlags |= DTF_GLOBAL; ndec->mVarIndex = -1; @@ -962,7 +962,7 @@ Expression* Parser::ParseSimpleExpression(void) dec = mScope->Lookup(mScanner->mTokenIdent); if (dec) { - if (dec->mType == DT_CONST_INTEGER || dec->mType == DT_CONST_FLOAT || dec->mType == DT_CONST_FUNCTION) + if (dec->mType == DT_CONST_INTEGER || dec->mType == DT_CONST_FLOAT || dec->mType == DT_CONST_FUNCTION || dec->mType == DT_CONST_ASSEMBLER || dec->mType == DT_LABEL || dec->mType == DT_LABEL_REF) { exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp->mDecValue = dec;