From 0aa9ca0c705738845c7d3700e2532584780b7b49 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sat, 10 Dec 2022 16:15:04 +0100 Subject: [PATCH] Bump Version number --- include/crt.c | 8 +- oscar64/InterCode.cpp | 269 ++++++++++++++++++++++++++++--- oscar64/InterCode.h | 3 + oscar64/NativeCodeGenerator.cpp | 79 ++++++++- oscar64/Parser.cpp | 10 ++ oscar64/Scanner.cpp | 27 ++-- oscar64/oscar64.cpp | 4 +- oscar64/oscar64.rc | 8 +- oscar64setup/oscar64setup.vdproj | 240 +-------------------------- samples/memmap/charsetload.d64 | Bin 174848 -> 174848 bytes 10 files changed, 353 insertions(+), 295 deletions(-) diff --git a/include/crt.c b/include/crt.c index 01014f9..e6e4157 100644 --- a/include/crt.c +++ b/include/crt.c @@ -137,10 +137,10 @@ w0: byt 0x0a byt 0x00 byt 0x9e - byt 0x32 - byt 0x30 - byt 0x36 - byt 0x31 + byt [OSCAR_BASIC_START + 12] / 1000 % 10 + 0x30 + byt [OSCAR_BASIC_START + 12] / 100 % 10 + 0x30 + byt [OSCAR_BASIC_START + 12] / 10 % 10 + 0x30 + byt [OSCAR_BASIC_START + 12] % 10 + 0x30 byt 0x00 byt 0x00 byt 0x00 diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 053f1f2..2e39957 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -384,7 +384,18 @@ void ValueSet::FlushCallAliases(const GrowingInstructionPtrArray& tvalue, const } } -static bool CollidingMem(const InterOperand& op1, const InterOperand& op2, const GrowingVariableArray& staticVars) +static bool CollidingMemType(InterType type1, InterType type2) +{ + if (type1 == IT_NONE || type2 == IT_NONE) + return true; + else if (type1 == IT_POINTER || type1 == IT_FLOAT || type2 == IT_POINTER || type2 == IT_FLOAT) + return type1 == type2; + else + return false; + +} + +static bool CollidingMem(const InterOperand& op1, InterType type1, const InterOperand& op2, InterType type2, const GrowingVariableArray& staticVars) { if (op1.mMemory != op2.mMemory) { @@ -395,7 +406,7 @@ static bool CollidingMem(const InterOperand& op1, const InterOperand& op2, const else if (op2.mMemory == IM_FPARAM) return false; else - return true; + return CollidingMemType(type1, type2); } else if (op2.mMemory == IM_INDIRECT) { @@ -404,7 +415,7 @@ static bool CollidingMem(const InterOperand& op1, const InterOperand& op2, const else if (op1.mMemory == IM_FPARAM) return false; else - return true; + return CollidingMemType(type1, type2); } else return false; @@ -429,18 +440,20 @@ static bool CollidingMem(const InterOperand& op1, const InterOperand& op2, const else if (op1.mLinkerObject && op2.mLinkerObject && op1.mLinkerObject != op2.mLinkerObject) return false; else - return true; + return CollidingMemType(type1, type2); default: return false; } } -static bool CollidingMem(const InterOperand& op, const InterInstruction* ins, const GrowingVariableArray& staticVars) +static bool CollidingMem(const InterOperand& op, InterType type, const InterInstruction* ins, const GrowingVariableArray& staticVars) { if (ins->mCode == IC_LOAD) - return CollidingMem(op, ins->mSrc[0], staticVars); + return CollidingMem(op, type, ins->mSrc[0], ins->mDst.mType, staticVars); else if (ins->mCode == IC_STORE) - return CollidingMem(op, ins->mSrc[1], staticVars); + return CollidingMem(op, type, ins->mSrc[1], ins->mSrc[0].mType, staticVars); + else if (ins->mCode == IC_COPY || ins->mCode == IC_STRCPY) + return CollidingMem(op, type, ins->mSrc[0], IT_NONE, staticVars) || CollidingMem(op, type, ins->mSrc[1], IT_NONE, staticVars); else return false; } @@ -448,9 +461,11 @@ static bool CollidingMem(const InterOperand& op, const InterInstruction* ins, co static bool CollidingMem(const InterInstruction* ins1, const InterInstruction* ins2, const GrowingVariableArray& staticVars) { if (ins1->mCode == IC_LOAD) - return CollidingMem(ins1->mSrc[0], ins2, staticVars); + return CollidingMem(ins1->mSrc[0], ins1->mDst.mType, ins2, staticVars); else if (ins1->mCode == IC_STORE) - return CollidingMem(ins1->mSrc[1], ins2, staticVars); + return CollidingMem(ins1->mSrc[1], ins1->mSrc[0].mType, ins2, staticVars); + else if (ins1->mCode == IC_COPY || ins1->mCode == IC_STRCPY) + return CollidingMem(ins1->mSrc[0], IT_NONE, ins2, staticVars) || CollidingMem(ins1->mSrc[1], IT_NONE, ins2, staticVars); else return false; } @@ -992,6 +1007,91 @@ static bool CanBypassLoad(const InterInstruction* lins, const InterInstruction* return true; } +static bool CanBypassStoreDown(const InterInstruction* sins, const InterInstruction* bins) +{ + // Check ambiguity + if (bins->mCode == IC_COPY || bins->mCode == IC_STRCPY) + return false; + + // Side effects + if (bins->mCode == IC_CALL || bins->mCode == IC_CALL_NATIVE || bins->mCode == IC_ASSEMBLER) + return false; + + // True data dependency + if (bins->mDst.mTemp >= 0 && sins->UsesTemp(bins->mDst.mTemp)) + return false; + + if (bins->mCode == IC_STORE) + { + if (sins->mVolatile) + return false; + else if (sins->mSrc[1].mMemory == IM_INDIRECT && bins->mSrc[1].mMemory == IM_INDIRECT) + { + return sins->mSrc[1].mLinkerObject && bins->mSrc[1].mLinkerObject && sins->mSrc[1].mLinkerObject != bins->mSrc[1].mLinkerObject; + } + else if (sins->mSrc[1].mTemp >= 0 || bins->mSrc[1].mTemp >= 0) + return false; + else if (sins->mSrc[1].mMemory != bins->mSrc[1].mMemory) + return true; + else if (sins->mSrc[1].mMemory == IM_GLOBAL) + { + return sins->mSrc[1].mLinkerObject != bins->mSrc[1].mLinkerObject || + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[1].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[1].mIntConst + bins->mSrc[1].mOperandSize; + } + else if (sins->mSrc[1].mMemory == IM_ABSOLUTE) + { + return + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[1].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[1].mIntConst + bins->mSrc[1].mOperandSize; + } + else if (sins->mSrc[1].mMemory == IM_LOCAL) + { + return sins->mSrc[1].mVarIndex != bins->mSrc[1].mVarIndex || + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[1].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[1].mIntConst + bins->mSrc[1].mOperandSize; + } + else + return false; + } + + if (bins->mCode == IC_LOAD) + { + if (sins->mVolatile) + return false; + else if (sins->mSrc[1].mMemory == IM_INDIRECT && bins->mSrc[0].mMemory == IM_INDIRECT) + { + return sins->mSrc[1].mLinkerObject && bins->mSrc[0].mLinkerObject && sins->mSrc[1].mLinkerObject != bins->mSrc[0].mLinkerObject; + } + else if (sins->mSrc[1].mTemp >= 0 || bins->mSrc[0].mTemp >= 0) + return false; + else if (sins->mSrc[1].mMemory != bins->mSrc[0].mMemory) + return true; + else if (sins->mSrc[1].mMemory == IM_GLOBAL) + { + return sins->mSrc[1].mLinkerObject != bins->mSrc[0].mLinkerObject || + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[0].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[0].mIntConst + bins->mSrc[0].mOperandSize; + } + else if (sins->mSrc[1].mMemory == IM_ABSOLUTE) + { + return + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[0].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[0].mIntConst + bins->mSrc[0].mOperandSize; + } + else if (sins->mSrc[1].mMemory == IM_LOCAL) + { + return sins->mSrc[1].mVarIndex != bins->mSrc[0].mVarIndex || + sins->mSrc[1].mIntConst + sins->mSrc[1].mOperandSize <= bins->mSrc[0].mIntConst || + sins->mSrc[1].mIntConst >= bins->mSrc[0].mIntConst + bins->mSrc[0].mOperandSize; + } + else + return false; + } + + return true; +} + static bool CanBypass(const InterInstruction* lins, const InterInstruction* bins) { if (HasSideEffect(lins->mCode) && HasSideEffect(bins->mCode)) @@ -4978,8 +5078,7 @@ bool InterCodeBasicBlock::PropagateVariableCopy(const GrowingInstructionPtrArray j = 0; for(int k=0; kmSrc[0], ins->mSrc[1], staticVars) && - !CollidingMem(ltemps[k]->mSrc[1], ins->mSrc[1], staticVars)) + if (!CollidingMem(ltemps[k], ins, staticVars)) { ltemps[j++] = ltemps[k]; } @@ -5000,8 +5099,7 @@ bool InterCodeBasicBlock::PropagateVariableCopy(const GrowingInstructionPtrArray j = 0; for (int k = 0; k < ltemps.Size(); k++) { - if (!CollidingMem(ltemps[k]->mSrc[0], ins->mSrc[1], staticVars) && - !CollidingMem(ltemps[k]->mSrc[1], ins->mSrc[1], staticVars)) + if (!CollidingMem(ltemps[k], ins, staticVars)) { ltemps[j++] = ltemps[k]; } @@ -5466,6 +5564,11 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray { if (ins->mDst.mType == IT_INT8) { + bool isUnsigned = false; + if (i + 1 < mInstructions.Size() && mInstructions[i + 1]->mCode == IC_CONVERSION_OPERATOR && mInstructions[i + 1]->mOperator == IA_EXT8TO16U && + mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal) + isUnsigned = true; + LinkerObject* lo = mInstructions[i - 1]->mSrc[1].mLinkerObject; int mi = 0, ma = 0; @@ -5474,7 +5577,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray { for (int j = 0; j < lo->mSize; j++) { - int v = (int8)(lo->mData[j]); + int v = isUnsigned ? lo->mData[j] : (int8)(lo->mData[j]); if (v < mi) mi = v; if (v > ma) @@ -5486,7 +5589,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray for (int j = 0; j < lo->mSize; j++) { int v = lo->mData[j]; - if (v & 0x80) + if (!isUnsigned && (v & 0x80)) mi = -128; if (v > ma) ma = v; @@ -8509,7 +8612,7 @@ bool InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray& j = 0; while (j < mLoadStoreInstructions.Size()) { - if (!CollidingMem(ins->mSrc[1], mLoadStoreInstructions[j], staticVars)) + if (!CollidingMem(ins, mLoadStoreInstructions[j], staticVars)) mLoadStoreInstructions[k++] = mLoadStoreInstructions[j]; j++; } @@ -8864,7 +8967,9 @@ bool InterCodeBasicBlock::CanMoveInstructionDown(int si, int ti) const } else if (ins->mCode == IC_STORE) { - return false; + for (int i = si + 1; i < ti; i++) + if (!CanBypassStore(ins, mInstructions[i])) + return false; } else if (ins->mCode == IC_COPY || ins->mCode == IC_PUSH_FRAME || ins->mCode == IC_POP_FRAME || ins->mCode == IC_RETURN || ins->mCode == IC_RETURN_STRUCT || ins->mCode == IC_RETURN_VALUE) @@ -8879,6 +8984,14 @@ bool InterCodeBasicBlock::CanMoveInstructionDown(int si, int ti) const return true; } +int InterCodeBasicBlock::FindSameInstruction(const InterInstruction* ins) const +{ + int i = mInstructions.Size() - 1; + while (i >= 0 && !mInstructions[i]->IsEqual(ins)) + i--; + return i; +} + bool InterCodeBasicBlock::CanMoveInstructionBehindBlock(int ii) const { return CanMoveInstructionDown(ii, mInstructions.Size()); @@ -8977,7 +9090,41 @@ bool InterCodeBasicBlock::MergeCommonPathInstructions(void) ti++; } } +#if 1 + if (mNumEntries > 1) + { + int i = 0; + while (i < mEntryBlocks.Size() && mEntryBlocks[i]->mInstructions.Size() > 1 && !mEntryBlocks[i]->mFalseJump) + i++; + if (i == mEntryBlocks.Size()) + { + InterCodeBasicBlock* eb = mEntryBlocks[0]; + int ebi = eb->mInstructions.Size() - 2; + while (ebi >= 0) + { + InterInstruction* ins = eb->mInstructions[ebi]; + + if (ins && eb->CanMoveInstructionBehindBlock(ebi)) + { + int j = 1, eji = -1; + while (j < mEntryBlocks.Size() && (eji = mEntryBlocks[j]->FindSameInstruction(ins)) >= 0 && mEntryBlocks[j]->CanMoveInstructionBehindBlock(eji)) + j++; + + if (j == mEntryBlocks.Size()) + { + mInstructions.Insert(0, ins); + for (int j = 0; j < mEntryBlocks.Size(); j++) + mEntryBlocks[j]->mInstructions.Remove(mEntryBlocks[j]->FindSameInstruction(ins)); + changed = true; + } + } + + ebi--; + } + } + } +#endif if (mTrueJump && mTrueJump->MergeCommonPathInstructions()) changed = true; if (mFalseJump && mFalseJump->MergeCommonPathInstructions()) @@ -10494,13 +10641,26 @@ bool InterCodeBasicBlock::SingleBlockLoopPointerSplit(int& spareTemps) i++; if (i == nins - 3) { + InterInstruction* xins = nullptr; for (int i = 0; i < mInstructions.Size() - 3; i++) { InterInstruction* lins = mInstructions[i]; + + if (xins && lins->mDst.mTemp >= 0 && lins->mDst.mTemp == xins->mDst.mTemp) + xins = nullptr; + if (lins->mCode == IC_LEA && lins->mSrc[0].mTemp == ains->mDst.mTemp && lins->mSrc[0].IsUByte() && lins->mSrc[1].mTemp >= 0 && !mLocalModifiedTemps[lins->mSrc[1].mTemp]) { tvalues[lins->mDst.mTemp] = lins; } + else if (lins->mCode == IC_LEA && xins && lins->mSrc[0].mTemp == xins->mDst.mTemp && lins->mSrc[0].IsUByte() && lins->mSrc[1].mTemp >= 0 && !mLocalModifiedTemps[lins->mSrc[1].mTemp]) + { + tvalues[lins->mDst.mTemp] = lins; + } + else if (lins->mCode == IC_CONVERSION_OPERATOR && lins->mOperator == IA_EXT8TO16U && lins->mSrc[0].mTemp == ains->mDst.mTemp && lins->mSrc[0].IsUByte()) + { + xins = lins; + } else if (lins->mCode == IC_LEA && lins->mSrc[0].mTemp < 0 && lins->mSrc[0].mIntConst == ains->mSrc[0].mIntConst && lins->mSrc[1].mTemp == lins->mDst.mTemp && pi >= 0 && pblock->mInstructions[pi]->mCode == IC_CONSTANT && ains->mSrc[1].IsUByte() && pblock->mInstructions[pi]->mConst.mIntConst == 0 && !IsTempReferencedInRange(i + 1, mInstructions.Size(), lins->mDst.mTemp) && !IsTempModifiedInRange(0, i, lins->mDst.mTemp) && @@ -10577,6 +10737,35 @@ bool InterCodeBasicBlock::SingleBlockLoopPointerSplit(int& spareTemps) changed = true; } + else if (lins->mCode == IC_LOAD && lins->mSrc[0].mTemp >= 0 && lins->mSrc[0].mIntConst >= 16 && tvalues[lins->mSrc[0].mTemp]) + { + if (spareTemps + 2 >= mEntryRequiredTemps.Size() + 16) + return true; + + InterInstruction* pins = tvalues[lins->mSrc[0].mTemp]; + InterInstruction* nins = new InterInstruction(lins->mLocation, IC_LEA); + nins->mSrc[1] = pins->mSrc[1]; + nins->mSrc[0].mTemp = -1; + nins->mSrc[0].mType = IT_INT16; + nins->mSrc[0].mIntConst = lins->mSrc[0].mIntConst; + nins->mDst.mMemory = IM_INDIRECT; + nins->mDst.mTemp = spareTemps++; + nins->mDst.mType = IT_POINTER; + + pblock->mInstructions.Insert(pblock->mInstructions.Size() - 1, nins); + + InterInstruction* mins = pins->Clone(); + mins->mDst.mTemp = spareTemps++; + mins->mDst.mMemory = IM_INDIRECT; + mins->mSrc[1] = nins->mDst; + mInstructions.Insert(i, mins); + + + lins->mSrc[0].mTemp = mins->mDst.mTemp; + lins->mSrc[0].mIntConst = 0; + + changed = true; + } else if (lins->mDst.mTemp >= 0) tvalues[lins->mDst.mTemp] = nullptr; } @@ -10628,7 +10817,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa { // Find the last store that overlaps the load int j = mInstructions.Size() - 1; - while (j > i && !(mInstructions[j]->mCode == IC_STORE && CollidingMem(ins->mSrc[0], mInstructions[j]->mSrc[1], staticVars))) + while (j > i && !(mInstructions[j]->mCode == IC_STORE && CollidingMem(ins, mInstructions[j], staticVars))) j--; if (j > i) @@ -10699,7 +10888,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ins->mInvariant = false; else if (ins->mCode == IC_LOAD) { - if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile) + if ((ins->mSrc[0].mTemp >= 0 && mLocalModifiedTemps[ins->mSrc[0].mTemp]) || ins->mVolatile) { ins->mInvariant = false; } @@ -10716,7 +10905,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa for (int j = 0; j < mInstructions.Size(); j++) { InterInstruction* sins = mInstructions[j]; - if (sins->mCode == IC_STORE && CollidingMem(ins->mSrc[0], sins->mSrc[1], staticVars)) + if (sins->mCode == IC_STORE && CollidingMem(ins, sins, staticVars)) { if (sins->mSrc[1].mTemp >= 0) { @@ -10740,7 +10929,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ins->mInvariant = false; } } - else if (CollidingMem(ins->mSrc[0], sins->mSrc[1], staticVars)) + else if (CollidingMem(ins, sins, staticVars)) { ins->mInvariant = false; } @@ -11353,6 +11542,23 @@ void InterCodeBasicBlock::CheckFinal(void) #endif } +void InterCodeBasicBlock::CheckBlocks(void) +{ +#if _DEBUG + if (!mVisited) + { + mVisited = true; + + for (int i = 0; i < mInstructions.Size(); i++) + assert(mInstructions[i] != nullptr); + + if (mTrueJump) mTrueJump->CheckBlocks(); + if (mFalseJump) mFalseJump->CheckBlocks(); + } +#endif +} + + void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& staticVars) { int i; @@ -12728,6 +12934,12 @@ int InterCodeProcedure::AddTemporary(InterType type) return temp; } +void InterCodeProcedure::CheckBlocks(void) +{ + ResetVisited(); + mEntryBlock->CheckBlocks(); +} + void InterCodeProcedure::CheckFinal(void) { ResetVisited(); @@ -14000,6 +14212,7 @@ void InterCodeProcedure::Close(void) TempForwarding(); #if 1 + CheckBlocks(); BuildDataFlowSets(); do { @@ -14008,8 +14221,13 @@ void InterCodeProcedure::Close(void) LoadStoreForwarding(paramMemory); + ResetEntryBlocks(); + ResetVisited(); + mEntryBlock->CollectEntryBlocks(nullptr); MergeCommonPathInstructions(); -#if 1 + + CheckBlocks(); +#if 1 PushSinglePathResultInstructions(); #endif @@ -14275,7 +14493,8 @@ void InterCodeProcedure::MergeBasicBlocks(void) eblocks.Push(eblock); } - if (eblocks.Size() == block->mNumEntries) + bool allBlocks = eblocks.Size() == block->mNumEntries; +// if () { GrowingArray mblocks(nullptr); @@ -14283,10 +14502,8 @@ void InterCodeProcedure::MergeBasicBlocks(void) { InterCodeBasicBlock* nblock; - if (eblocks.Size() || mblocks.IndexOf(block) != -1) + if (!allBlocks || eblocks.Size() || mblocks.IndexOf(block) != -1) { -// break; - nblock = new InterCodeBasicBlock(); this->Append(nblock); diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index e0b8737..5aea73e 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -478,6 +478,7 @@ public: bool CanMoveInstructionBeforeBlock(int ii, const InterInstruction * ins) const; bool CanMoveInstructionBehindBlock(int ii) const; bool CanMoveInstructionDown(int si, int ti) const; + int FindSameInstruction(const InterInstruction* ins) const; bool MergeCommonPathInstructions(void); bool IsTempModifiedInRange(int from, int to, int temp); @@ -486,6 +487,7 @@ public: void CheckFinalLocal(void); void CheckFinal(void); + void CheckBlocks(void); void PeepholeOptimization(const GrowingVariableArray& staticVars); void SingleBlockLoopOptimisation(const NumberSet& aliasedParams, const GrowingVariableArray& staticVars); @@ -605,6 +607,7 @@ protected: void PeepholeOptimization(void); void CheckFinal(void); + void CheckBlocks(void); void DisassembleDebug(const char* name); }; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index a5f4b8b..a5f5577 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1320,7 +1320,7 @@ bool NativeCodeInstruction::MayBeSameAddress(const NativeCodeInstruction& ins, b if (mMode == ASMIM_ABSOLUTE) return mLinkerObject == ins.mLinkerObject && mAddress == ins.mAddress; else if (mMode == ASMIM_ABSOLUTE_X || mMode == ASMIM_ABSOLUTE_Y) - return mLinkerObject == ins.mLinkerObject; + return mLinkerObject == ins.mLinkerObject && mAddress <= ins.mAddress && mAddress + 256 > ins.mAddress; else return mMode == ASMIM_INDIRECT_Y || mMode == ASMIM_INDIRECT_X; } @@ -1332,6 +1332,8 @@ bool NativeCodeInstruction::MayBeSameAddress(const NativeCodeInstruction& ins, b return false; else if (mAddress >= ins.mAddress + 256 || ins.mAddress >= mAddress + 256) return false; + else if (mMode == ASMIM_ABSOLUTE && ins.mAddress > mAddress) + return false; else return mMode != ins.mMode || !sameXY || mAddress == ins.mAddress; } @@ -5359,7 +5361,10 @@ void NativeCodeBasicBlock::StoreByteIndexedValue(InterCodeProcedure* proc, const { if (i != 0) mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[wins->mSrc[0].mTemp] + i)); + if (wins->mSrc[0].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (wins->mSrc[0].mIntConst >> (8 * i)) & 0xff)); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[wins->mSrc[0].mTemp] + i)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[iins->mSrc[1].mTemp], nullptr, flags)); } } @@ -14789,16 +14794,16 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::SplitMatchingTails(NativeCodeProced { NativeCodeBasicBlock* bi(mEntryBlocks[i]); - if (bi->mBranch == ASMIT_JMP && bi->mIns.Size() > 1) + if (bi->mBranch == ASMIT_JMP && bi->mIns.Size() > 0) { for (int j = i + 1; j < mEntryBlocks.Size(); j++) { NativeCodeBasicBlock* bj(mEntryBlocks[j]); - if (bj->mBranch == ASMIT_JMP && bj->mIns.Size() > 1) + if (bj->mBranch == ASMIT_JMP && bj->mIns.Size() > 0) { - if (bi->mIns[bi->mIns.Size() - 1].IsSame(bj->mIns[bj->mIns.Size() - 1]) && - bi->mIns[bi->mIns.Size() - 2].IsSame(bj->mIns[bj->mIns.Size() - 2])) + if (bi->mIns[bi->mIns.Size() - 1].IsSame(bj->mIns[bj->mIns.Size() - 1])/* && + bi->mIns[bi->mIns.Size() - 2].IsSame(bj->mIns[bj->mIns.Size() - 2])*/) { if (!nblock) { @@ -14808,13 +14813,19 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::SplitMatchingTails(NativeCodeProced nblock->mTrueJump = this; nblock->mEntryBlocks.Push(bi); + nblock->mNumEntries++; + bi->mTrueJump = nblock; mEntryBlocks[i] = nullptr; + mNumEntries--; } nblock->mEntryBlocks.Push(bj); + nblock->mNumEntries++; + bj->mTrueJump = nblock; mEntryBlocks[j] = nullptr; + mNumEntries--; } } } @@ -14830,6 +14841,9 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::SplitMatchingTails(NativeCodeProced mEntryBlocks.Remove(i); } + mEntryBlocks.Push(nblock); + mNumEntries++; + return nblock; } } @@ -19954,6 +19968,9 @@ bool NativeCodeBasicBlock::MoveLoadImmStoreAbsoluteUp(int at) mIns.Insert(j, sins); return true; } + else if (mIns[j - 1].mMode == mIns[at + 1].mMode && mIns[j - 1].mAddress == mIns[at + 1].mAddress) + return false; + j--; } else if (mIns[j - 1].mType == ASMIT_STA && mIns[j - 1].mMode == mIns[at + 1].mMode && !(mIns[j - 1].mLinkerObject == mIns[at + 1].mLinkerObject && mIns[j - 1].mAddress == mIns[at + 1].mAddress)) @@ -29153,6 +29170,29 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 4].mType = ASMIT_DEC; progress = true; } +#if 1 + else if ( + mIns[i + 0].mType == ASMIT_ASL && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && + mIns[i + 1].mType == ASMIT_ASL && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress == mIns[i + 0].mAddress && + mIns[i + 2].mType == ASMIT_ASL && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress == mIns[i + 0].mAddress && + mIns[i + 3].mType == ASMIT_ROL && mIns[i + 3].mMode == ASMIM_IMPLIED && + mIns[i + 4].mType == ASMIT_STA && mIns[i + 4].mMode == ASMIM_ZERO_PAGE && mIns[i + 4].mAddress != mIns[i + 0].mAddress && + !(mIns[i + 4].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) + { + int a0 = mIns[i + 0].mAddress; + int a1 = mIns[i + 4].mAddress; + + mIns.Insert(i, NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, a1)); + mIns.Insert(i + 1, NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, a0)); + + mIns[i + 2].mMode = ASMIM_IMPLIED; + mIns[i + 3].mMode = ASMIM_IMPLIED; + mIns[i + 4].mMode = ASMIM_IMPLIED; + mIns[i + 5].mMode = ASMIM_ZERO_PAGE; mIns[i + 5].mAddress = a1; + mIns[i + 6].mAddress = a0; + progress = true; + } +#endif #if 0 else if ( mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && @@ -29705,6 +29745,28 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass } } #endif +#if 1 + if ( + mIns[i + 0].mType == ASMIT_CLC && + mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && + mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 1].mAddress && + mIns[i + 3].mType == ASMIT_LDA && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 1].mAddress + 1 && + mIns[i + 4].mType == ASMIT_ADC && mIns[i + 4].mMode == ASMIM_IMMEDIATE && mIns[i + 4].mAddress == 0 && + mIns[i + 5].mType == ASMIT_STA && mIns[i + 5].mMode == ASMIM_ZERO_PAGE && mIns[i + 5].mAddress == mIns[i + 2].mAddress + 1 && + !(mIns[i + 5].mLive & LIVE_CPU_REG_A)) + { + int yval = RetrieveYValue(i); + proc->ResetPatched(); + if (CheckForwardSumYPointer(this, mIns[i + 2].mAddress, mIns[i + 1].mAddress, mIns[i + 2], i + 6, yval)) + { + proc->ResetPatched(); + if (PatchForwardSumYPointer(this, mIns[i + 2].mAddress, mIns[i + 1].mAddress, mIns[i + 2], i + 6, yval)) + progress = true; + + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + } + } +#endif #if 1 if ( @@ -31320,7 +31382,7 @@ void NativeCodeProcedure::RebuildEntry(void) void NativeCodeProcedure::Optimize(void) { - CheckFunc = !strcmp(mInterProc->mIdent->mString, "shots_check"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "test"); #if 1 int step = 0; int cnt = 0; @@ -31445,6 +31507,7 @@ void NativeCodeProcedure::Optimize(void) changed = true; #endif + #if 1 if (step >= 3) { @@ -32156,7 +32219,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && iblock->mInstructions[i + 1]->mCode == IC_STORE && iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal && ins->mSrc[1].mTemp >= 0 && ins->mSrc[0].IsUByte() && ins->mSrc[0].mTemp >= 0 && - iblock->mInstructions[i + 1]->mSrc[1].mIntConst == 0 && iblock->mInstructions[i + 1]->mSrc[0].mTemp >= 0 && + iblock->mInstructions[i + 1]->mSrc[1].mIntConst == 0 && (iblock->mInstructions[i + 1]->mSrc[0].mTemp >= 0 || iblock->mInstructions[i + 1]->mSrc[0].mType <= IT_INT32) && (InterTypeSize[iblock->mInstructions[i + 1]->mSrc[0].mType] == 1 || iblock->mInstructions[i + 1]->mSrc[1].mStride == 1)) { block->StoreByteIndexedValue(iproc, ins, iblock->mInstructions[i + 1]); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index b3d2a60..a9f3e8e 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -1178,6 +1178,8 @@ Declaration* Parser::ParseDeclaration(bool variable, bool expression) mErrors->Error(ndec->mLocation, EERR_DECLARATION_DIFFERS, "Variable declaration differs", ndec->mIdent); } + pdec->mFlags |= ndec->mFlags & DTF_ZEROPAGE; + ndec = pdec; } else if (pdec->mFlags & DTF_EXTERN) @@ -1200,6 +1202,8 @@ Declaration* Parser::ParseDeclaration(bool variable, bool expression) pdec->mSection = ndec->mSection; } + pdec->mFlags |= ndec->mFlags & DTF_ZEROPAGE; + ndec = pdec; } else @@ -2606,6 +2610,12 @@ Expression* Parser::ParseAssemblerBaseOperand(Declaration* pcasm, int pcoffset) mScanner->NextToken(); break; + case TK_OPEN_BRACKET: + mScanner->NextToken(); + exp = ParseAssemblerOperand(pcasm, pcoffset); + ConsumeToken(TK_CLOSE_BRACKET); + break; + case TK_IDENT: dec = mScope->Lookup(mScanner->mTokenIdent); if (!dec) diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index b2f853a..b5d300e 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -958,20 +958,15 @@ void Scanner::NextRawToken(void) } break; case '%': - if (mAssemblerMode) + NextChar(); + if (mAssemblerMode && mTokenChar >= '0' && mTokenChar <= '1') { int n = 0; int64 mant = 0; - while (NextChar()) + while (mTokenChar >= '0' && mTokenChar <= '1') { - if (mTokenChar >= '0' && mTokenChar <= '9') - mant = mant * 16 + (int)mTokenChar - (int)'0'; - else if (mTokenChar >= 'a' && mTokenChar <= 'f') - mant = mant * 16 + 10 + (int)mTokenChar - (int)'a'; - else if (mTokenChar >= 'A' && mTokenChar <= 'F') - mant = mant * 16 + 10 + (int)mTokenChar - (int)'A'; - else - break; + mant = mant * 2 + (mTokenChar - '0'); + NextChar(); n++; } @@ -981,12 +976,14 @@ void Scanner::NextRawToken(void) mToken = TK_INTEGER; mTokenInteger = mant; } - mToken = TK_MOD; - NextChar(); - if (mTokenChar == '=') + else { - NextChar(); - mToken = TK_ASSIGN_MOD; + mToken = TK_MOD; + if (mTokenChar == '=') + { + NextChar(); + mToken = TK_ASSIGN_MOD; + } } break; case '~': diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 2cb9526..0146bf7 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -74,7 +74,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.11.172"); + strcpy(strProductVersion, "1.11.173"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); @@ -221,6 +221,7 @@ int main2(int argc, const char** argv) { compiler->mCompilerOptions |= COPT_TARGET_PRG; compiler->AddDefine(Ident::Unique("OSCAR_TARGET_PRG"), "1"); + compiler->AddDefine(Ident::Unique("OSCAR_BASIC_START"), "0x0801"); } else if (!strcmp(targetFormat, "crt")) { @@ -236,6 +237,7 @@ int main2(int argc, const char** argv) { compiler->mCompilerOptions |= COPT_TARGET_LZO; compiler->AddDefine(Ident::Unique("OSCAR_TARGET_LZO"), "1"); + compiler->AddDefine(Ident::Unique("OSCAR_BASIC_START"), "0x0801"); } else compiler->mErrors->Error(loc, EERR_COMMAND_LINE, "Invalid target format option", targetFormat); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 8930508..253d461 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,11,172,0 - PRODUCTVERSION 1,11,172,0 + FILEVERSION 1,11,173,0 + PRODUCTVERSION 1,11,173,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.11.172.0" + VALUE "FileVersion", "1.11.173.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.11.172.0" + VALUE "ProductVersion", "1.11.173.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 1df1d4d..1575ad3 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -34,12 +34,6 @@ } "Entry" { - "MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_04ABABC55200450383686DD782DD1548" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -190,12 +184,6 @@ } "Entry" { - "MsmKey" = "8:_326B44043E3720E0A341FB5627DA8873" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_3277DE1463544F67B7E7390175F8A9CF" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -208,12 +196,6 @@ } "Entry" { - "MsmKey" = "8:_36B4A1247BFCE001E1BAE7560E9CFEEA" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_379EE3C17FEC4C5EA79D07668CD05FC4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -286,12 +268,6 @@ } "Entry" { - "MsmKey" = "8:_458189403F0009BC49371204B74F3BD3" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_47A877D439EE429BAB64C52FEF69EDA4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -430,12 +406,6 @@ } "Entry" { - "MsmKey" = "8:_749A2BA18335F50EB53CCE7029861FBC" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_749F54DFBD4D404DA9C2E2D5BA7CDDBF" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -496,12 +466,6 @@ } "Entry" { - "MsmKey" = "8:_8667075410229C38BF63AC1CC776055E" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_8827B6B07A1C4B32B08DF784E090381D" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -850,12 +814,6 @@ } "Entry" { - "MsmKey" = "8:_DD5A4DD822437085CD584319732F2D4D" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_DE1058FFA9E149D1909C819592A12273" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -922,12 +880,6 @@ } "Entry" { - "MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_ED872D39D58443D590B7C80604BC0FF4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -958,12 +910,6 @@ } "Entry" { - "MsmKey" = "8:_F20F5618C7576D758C01D89C87469AF8" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_F35970F9D8FA46B09F36D7E9DE5532CA" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -1151,26 +1097,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_03D7013B0D39A89CEA9D267005ADCE39" - { - "SourcePath" = "8:VCRUNTIME140.dll" - "TargetName" = "8:VCRUNTIME140.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_04ABABC55200450383686DD782DD1548" { "SourcePath" = "8:..\\samples\\games\\lander.c" @@ -1671,26 +1597,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_326B44043E3720E0A341FB5627DA8873" - { - "SourcePath" = "8:api-ms-win-crt-stdio-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-stdio-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3277DE1463544F67B7E7390175F8A9CF" { "SourcePath" = "8:..\\samples\\rasterirq\\autocrawler.c" @@ -1731,26 +1637,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_36B4A1247BFCE001E1BAE7560E9CFEEA" - { - "SourcePath" = "8:api-ms-win-crt-math-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-math-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_379EE3C17FEC4C5EA79D07668CD05FC4" { "SourcePath" = "8:..\\samples\\memmap\\easyflash.c" @@ -1991,26 +1877,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_458189403F0009BC49371204B74F3BD3" - { - "SourcePath" = "8:api-ms-win-crt-string-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-string-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_47A877D439EE429BAB64C52FEF69EDA4" { "SourcePath" = "8:..\\samples\\memmap\\largemem.c" @@ -2471,26 +2337,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749A2BA18335F50EB53CCE7029861FBC" - { - "SourcePath" = "8:api-ms-win-crt-runtime-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-runtime-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749F54DFBD4D404DA9C2E2D5BA7CDDBF" { "SourcePath" = "8:..\\samples\\resources\\breakoutchars.bin" @@ -2691,26 +2537,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8667075410229C38BF63AC1CC776055E" - { - "SourcePath" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8827B6B07A1C4B32B08DF784E090381D" { "SourcePath" = "8:..\\samples\\memmap\\tsr.c" @@ -3871,26 +3697,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DD5A4DD822437085CD584319732F2D4D" - { - "SourcePath" = "8:api-ms-win-crt-heap-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-heap-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DE1058FFA9E149D1909C819592A12273" { "SourcePath" = "8:..\\samples\\particles\\fireworks_stripe.c" @@ -4111,26 +3917,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA3C0BCB01F2639DFA2E37EC8436E5F6" - { - "SourcePath" = "8:VERSION.dll" - "TargetName" = "8:VERSION.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ED872D39D58443D590B7C80604BC0FF4" { "SourcePath" = "8:..\\samples\\kernalio\\fileread.c" @@ -4231,26 +4017,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F20F5618C7576D758C01D89C87469AF8" - { - "SourcePath" = "8:api-ms-win-crt-locale-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-locale-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F35970F9D8FA46B09F36D7E9DE5532CA" { "SourcePath" = "8:..\\include\\c64\\charwin.h" @@ -4658,15 +4424,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{7E2B8D86-9F20-4418-BBAF-94BCC5579BE1}" - "PackageCode" = "8:{17E11F2B-4298-4907-86D7-2230A5A3C57F}" + "ProductCode" = "8:{B37C3691-BB18-4F82-B574-F47BF7A70D6E}" + "PackageCode" = "8:{1B3B4C99-2560-4BE0-8F6A-05067CD5006F}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.11.172" + "ProductVersion" = "8:1.11.173" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/samples/memmap/charsetload.d64 b/samples/memmap/charsetload.d64 index ad22ae0931754e7062c2296353fcd827256bd405..28b45d58d2b2e208e539d87ca98c8402b322d3d8 100644 GIT binary patch delta 618 zcmYj|Ur1A77{=fC+sRIzbH1}rQan4Br^qpei5aQUKjSQw7zVMsgm$qRK}8gJ7fjfx ziqE7=up;K;9bRZc7L6pV@LW9VgD7+~OVJx9L*}^%Z_vZIJ&-*-ywdTZHbK(gG zT`&6c*oQTuu-&efE4W&cEQZTmJ%hj7zjrVZMM-Ri$9=v1M*!gU^t76_d0Pbcdlr7# zd?12F!uI4z2&+h##03*`T`y_D)lx2<8H{U|W|JR210Xym&a}t1)G~E^S0S~+Kbd%V zz@K3<0L0{*;uZPUwgiAFIW5o1&l(P3siD5si3(FPcxd>~zdwLq8B}(*|KE89;Bq6s zUFY3~d()ssGkB1W(ipu?C+YS!O*81z9@X^{{YDZVId2UU<9tN@_Bp$As0036my5i)sJ#yen@8801M0RtaGqF2u0E z^{8A10>&xX(z9T7M2(NN7ioSWhO@p8va4C01y{3-f~)0{WFD3v(;2=fK8)i@Zp2Y+ e5{H*%w#CQd*v6xAd{5Y}dtDQl@0uWALVp3uv!WOP delta 672 zcmYjKT}TvR6utMG!N#4xZ`H(cteql7#KH=-Kgt+?K(^?|kjP*Kcfl9yp`^D2{iq%c zX9+)}-_0i6eJCcWfnJJ&T0v-gv4@}_DC)sw^QD(?Vs(k`!#(HRdk$x8DKxee8heOM zM3;PW7FS7%BGDC}4B{&BD58(YFd!)!(y4Sp@{CN@GbYGfw7}Jq_$!5iNR@AOob+R+ z{;8JrjLCUzW>4H;#uWKpYXL-$N;5TaWAd%$)(*quJN}^`w-c)Rt?5Ka;$@4;NBYXbmd>kWkJ` z!^(vs1%PqIQEn;ek^=Bc?8_PoYNhJnw(j5m{s4{YK6O3&|3p=Q!P5QW8eT1_mnAec z2e)dyT0%RgUDAqKM{}^Y>h>DQH5p=7Mm%&T6r#) z*|5Wg#XcKGZG;MY>WA<;ztW_vyToP+wCFP18y@hH0o;p8J~x1kElGW$BUhFNW){>5 z)f$&wGq)ifFq75A(!jb{H?yr9vTL#)>z?eIDHNK*RRwXOBS&4k<#2A3+fyiGwrdtX zyXK?LJ4xNj$Zi)i-R|gD-WbCzxXgQFco3KQwHS_iBp@Ocp@NekY}?qX