diff --git a/include/c64/mouse.c b/include/c64/mouse.c index 5fcf93a..70a7078 100644 --- a/include/c64/mouse.c +++ b/include/c64/mouse.c @@ -7,20 +7,20 @@ bool mouse_lb, mouse_rb; static char mouse_px, mouse_py; static char mouse_port; -inline signed char dpos(char * old, char new) +inline signed char dpos(char * old, char mnew) { - new = (new & 0x7f) >> 1; + mnew = (mnew & 0x7f) >> 1; - char diff = (new - *old) & 0x3f; + char diff = (mnew - *old) & 0x3f; if (diff >= 0x20) { - *old = new; + *old = mnew; return diff | 0xe0; } else if (diff) { - *old = new; + *old = mnew; return diff; } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 9bd5e5f..8b0862a 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -4523,6 +4523,11 @@ void InterCodeBasicBlock::Append(InterInstruction * code) { assert(code->mDst.mType == code->mConst.mType); } + if (code->mCode == IC_CONSTANT && code->mConst.mType == IT_POINTER && code->mConst.mMemory == IM_GLOBAL && code->mConst.mVarIndex >= 0) + { + assert(code->mConst.mVarIndex < mProc->mModule->mGlobalVars.Size()); + assert(mProc->mModule->mGlobalVars[code->mConst.mVarIndex]); + } for (int i = 0; i < code->mNumOperands; i++) assert(code->mSrc[i].mType != IT_NONE); @@ -11370,10 +11375,12 @@ bool InterCodeBasicBlock::CheckStaticStack(void) return true; } -void ApplyStaticStack(InterOperand & iop, const GrowingVariableArray& localVars) +void InterCodeBasicBlock::ApplyStaticStack(InterOperand & iop, const GrowingVariableArray& localVars) { if (iop.mMemory == IM_LOCAL) { + assert(localVars[iop.mVarIndex]->mIndex < mProc->mModule->mGlobalVars.Size()); + iop.mMemory = IM_GLOBAL; iop.mLinkerObject = localVars[iop.mVarIndex]->mLinkerObject; iop.mVarIndex = localVars[iop.mVarIndex]->mIndex; @@ -11419,6 +11426,7 @@ void PromoteStaticStackParam(InterOperand& iop, LinkerObject* paramlobj) iop.mMemory = IM_GLOBAL; iop.mIntConst += offset; iop.mLinkerObject = paramlobj; + iop.mVarIndex = -1; paramlobj->EnsureSpace(int(iop.mIntConst), iop.mOperandSize); } } diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 260e406..1049569 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -569,6 +569,7 @@ public: bool DropUnreachable(void); bool CheckStaticStack(void); + void ApplyStaticStack(InterOperand& iop, const GrowingVariableArray& localVars); void CollectStaticStack(LinkerObject * lobj, const GrowingVariableArray& localVars); void PromoteStaticStackParams(LinkerObject* paramlobj); diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 7414ced..0c09be3 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -1288,7 +1288,7 @@ void InterCodeGenerator::CopyStruct(InterCodeProcedure* proc, Expression* exp, I pcins->mConst.mVarIndex = ccdec->mVarIndex; pcins->mConst.mIntConst = 0; pcins->mConst.mOperandSize = 2; - pcins->mConst.mMemory = IM_GLOBAL; + pcins->mConst.mMemory = IM_PROCEDURE; pcins->mConst.mLinkerObject = ccdec->mLinkerObject; block->Append(pcins); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 92cdf6c..9565772 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -4717,6 +4717,8 @@ int Parser::OverloadDistance(Declaration* fdec, Expression* pexp) dist += 1; else if (ptype->mType == DT_TYPE_POINTER && etype->mType == DT_TYPE_FUNCTION && ptype->mBase->IsSame(etype)) dist += 0; + else if (ptype->mType == DT_TYPE_POINTER && etype->mType == DT_TYPE_POINTER && etype->mBase->mType == DT_TYPE_VOID) + dist += 0; else if (ptype->IsSubType(etype)) dist += 256; else if (ptype->mType == DT_TYPE_REFERENCE && ptype->mBase->IsSame(etype)) @@ -5233,31 +5235,40 @@ Expression* Parser::ParsePrefixExpression(bool lhs) if (mScanner->mToken == TK_OPEN_PARENTHESIS || dec->mDefaultConstructor) { - Declaration* vdec = new Declaration(mScanner->mLocation, DT_VARIABLE); - vdec->mVarIndex = mLocalIndex++; - vdec->mBase = nexp->mDecType; - vdec->mSize = 2; - - Expression* vexp = new Expression(mScanner->mLocation, EX_VARIABLE); - vexp->mDecType = vdec->mBase; - vexp->mDecValue = vdec; - - Expression* iexp = new Expression(mScanner->mLocation, EX_INITIALIZATION); - iexp->mToken = TK_ASSIGN; - iexp->mLeft = vexp; - iexp->mRight = nexp; - iexp->mDecType = nexp->mDecType; - Declaration* mdec = dec->mDefaultConstructor; - Expression* pexp = vexp; + bool plist = false; if (ConsumeTokenIf(TK_OPEN_PARENTHESIS)) { if (!ConsumeTokenIf(TK_CLOSE_PARENTHESIS)) { - pexp = ParseListExpression(false); - + plist = true; mdec = dec->mScope->Lookup(dec->mIdent->PreMangle("+")); + } + } + + if (mdec) + { + Declaration* vdec = new Declaration(mScanner->mLocation, DT_VARIABLE); + vdec->mVarIndex = mLocalIndex++; + vdec->mBase = nexp->mDecType; + vdec->mSize = 2; + + Expression* vexp = new Expression(mScanner->mLocation, EX_VARIABLE); + vexp->mDecType = vdec->mBase; + vexp->mDecValue = vdec; + + Expression* iexp = new Expression(mScanner->mLocation, EX_INITIALIZATION); + iexp->mToken = TK_ASSIGN; + iexp->mLeft = vexp; + iexp->mRight = nexp; + iexp->mDecType = nexp->mDecType; + + Expression* pexp = vexp; + + if (plist) + { + pexp = ParseListExpression(false); ConsumeToken(TK_CLOSE_PARENTHESIS); @@ -5266,41 +5277,45 @@ Expression* Parser::ParsePrefixExpression(bool lhs) lexp->mRight = pexp; pexp = lexp; } + + Expression* cexp = new Expression(mScanner->mLocation, EX_CONSTANT); + cexp->mDecValue = mdec; + cexp->mDecType = cexp->mDecValue->mBase; + + Expression* dexp = new Expression(mScanner->mLocation, EX_CALL); + dexp->mLeft = cexp; + dexp->mRight = pexp; + + dexp = ResolveOverloadCall(dexp); + + Expression* sexp = new Expression(mScanner->mLocation, EX_SEQUENCE); + + sexp->mLeft = dexp; + sexp->mRight = vexp; + sexp->mDecType = vexp->mDecType; + + Expression* coexp = nexp = new Expression(mScanner->mLocation, EX_CONDITIONAL); + coexp->mLeft = new Expression(mScanner->mLocation, EX_RELATIONAL); + coexp->mLeft->mDecType = TheBoolTypeDeclaration; + coexp->mLeft->mToken = TK_EQUAL; + coexp->mLeft->mLeft = vexp; + coexp->mLeft->mRight = nuexp; + coexp->mRight = new Expression(mScanner->mLocation, EX_LIST); + coexp->mRight->mLeft = vexp; + coexp->mRight->mRight = new Expression(mScanner->mLocation, EX_SEQUENCE); + coexp->mRight->mRight->mLeft = dexp; + coexp->mRight->mRight->mRight = vexp; + coexp->mDecType = vexp->mDecType; + + nexp = new Expression(mScanner->mLocation, EX_SEQUENCE); + nexp->mLeft = iexp; + nexp->mRight = coexp; + nexp->mDecType = coexp->mDecType; + } + else if (plist) + { + mErrors->Error(mScanner->mLocation, ERRO_NO_MATCHING_FUNCTION_CALL, "No matching constructor", dec->mIdent); } - - Expression* cexp = new Expression(mScanner->mLocation, EX_CONSTANT); - cexp->mDecValue = mdec; - cexp->mDecType = cexp->mDecValue->mBase; - - Expression* dexp = new Expression(mScanner->mLocation, EX_CALL); - dexp->mLeft = cexp; - dexp->mRight = pexp; - - dexp = ResolveOverloadCall(dexp); - - Expression* sexp = new Expression(mScanner->mLocation, EX_SEQUENCE); - - sexp->mLeft = dexp; - sexp->mRight = vexp; - sexp->mDecType = vexp->mDecType; - - Expression * coexp = nexp = new Expression(mScanner->mLocation, EX_CONDITIONAL); - coexp->mLeft = new Expression(mScanner->mLocation, EX_RELATIONAL); - coexp->mLeft->mDecType = TheBoolTypeDeclaration; - coexp->mLeft->mToken = TK_EQUAL; - coexp->mLeft->mLeft = vexp; - coexp->mLeft->mRight = nuexp; - coexp->mRight = new Expression(mScanner->mLocation, EX_LIST); - coexp->mRight->mLeft = vexp; - coexp->mRight->mRight = new Expression(mScanner->mLocation, EX_SEQUENCE); - coexp->mRight->mRight->mLeft = dexp; - coexp->mRight->mRight->mRight = vexp; - coexp->mDecType = vexp->mDecType; - - nexp = new Expression(mScanner->mLocation, EX_SEQUENCE); - nexp->mLeft = iexp; - nexp->mRight = coexp; - nexp->mDecType = coexp->mDecType; } } }