diff --git a/include/c64/rasterirq.c b/include/c64/rasterirq.c index 5ccc8c5..442dcfc 100644 --- a/include/c64/rasterirq.c +++ b/include/c64/rasterirq.c @@ -97,6 +97,9 @@ __asm irq2 tya pha + lda $01 + pha + lda #$35 sta $01 @@ -136,7 +139,7 @@ ji: ex: - lda PLAShadow + pla sta $01 pla diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 2a60306..967860c 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -16462,7 +16462,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; - mIns[i + 2].mType = ASMIT_INX; mIns[i + 2].mLive |= LIVE_CPU_REG_Z | LIVE_CPU_REG_X; + mIns[i + 2].mType = ASMIT_INX; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mLive |= LIVE_CPU_REG_Z | LIVE_CPU_REG_X; mIns[i + 3].mType = ASMIT_STX; mIns[i + 3].mLive |= LIVE_CPU_REG_Z; fblock->mIns.Push(mIns[i + 4]); @@ -27126,7 +27126,7 @@ bool NativeCodeBasicBlock::MoveLDSTXOutOfRange(int at) if (mIns[j].mType == ASMIT_JSR) return false; - if (!(mIns[j].mLive & LIVE_CPU_REG_A)) + if (!(mIns[j].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) { mIns.Insert(j + 1, NativeCodeInstruction(mIns[at + 1].mIns, ASMIT_STA, mIns[at + 1])); mIns.Insert(j + 1, NativeCodeInstruction(mIns[at].mIns, ASMIT_LDA, mIns[at])); @@ -35333,7 +35333,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 1].mType == ASMIT_AND && mIns[i + 1].mMode == ASMIM_IMMEDIATE && (mIns[i + 1].mAddress & 0x01) && !(mIns[i + 1].mLive & LIVE_CPU_REG_C)) { mIns[i + 0] = mIns[i + 1]; - mIns[i + 0].mLive |= LIVE_CPU_REG_C; + mIns[i + 0].mLive |= LIVE_CPU_REG_C | LIVE_CPU_REG_A; mIns[i + 0].mAddress = (mIns[i + 0].mAddress >> 1) & 0x7f; mIns[i + 1].mType = ASMIT_ROL; mIns[i + 1].mMode = ASMIM_IMPLIED; progress = true; @@ -35343,7 +35343,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 1].mType == ASMIT_AND && mIns[i + 1].mMode == ASMIM_IMMEDIATE && (mIns[i + 1].mAddress & 0x80) && !(mIns[i + 1].mLive & LIVE_CPU_REG_C)) { mIns[i + 0] = mIns[i + 1]; - mIns[i + 0].mLive |= LIVE_CPU_REG_C; + mIns[i + 0].mLive |= LIVE_CPU_REG_C | LIVE_CPU_REG_A; mIns[i + 0].mAddress = (mIns[i + 0].mAddress << 1) & 0xfe; mIns[i + 1].mType = ASMIT_ROR; mIns[i + 1].mMode = ASMIM_IMPLIED; progress = true; @@ -39976,6 +39976,23 @@ void NativeCodeBasicBlock::CheckVisited(void) #endif } +void NativeCodeBasicBlock::CheckAsmCode(void) +{ +#if _DEBUG + if (!mVisited) + { + mVisited = true; + + for (int j = 0; j < mIns.Size(); j++) + { + assert(HasAsmInstructionMode(mIns[j].mType, mIns[j].mMode)); + } + + if (mTrueJump) mTrueJump->CheckAsmCode(); + if (mFalseJump) mFalseJump->CheckAsmCode(); + } +#endif +} void NativeCodeBasicBlock::CheckBlocks(bool sequence) @@ -40672,7 +40689,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) { mInterProc = proc; - CheckFunc = !strcmp(mInterProc->mIdent->mString, "robot_move"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "time_draw"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks]; @@ -41405,6 +41422,11 @@ void NativeCodeProcedure::Optimize(void) { changed = true; +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckBlocks(); +#endif + BuildDataFlowSets(); ResetVisited(); mEntryBlock->RemoveUnusedResultInstructions(); @@ -41418,6 +41440,10 @@ void NativeCodeProcedure::Optimize(void) if (mEntryBlock->AbsoluteValueForwarding(pairs)) { changed = true; +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckBlocks(); +#endif BuildDataFlowSets(); ResetVisited(); @@ -41869,6 +41895,11 @@ void NativeCodeProcedure::Optimize(void) } #endif +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckAsmCode(); +#endif + #if 1 if (step == 8) { @@ -41896,6 +41927,10 @@ void NativeCodeProcedure::Optimize(void) changed = true; } #endif +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckAsmCode(); +#endif #if 1 if (step == 9) { @@ -41907,6 +41942,10 @@ void NativeCodeProcedure::Optimize(void) #endif RebuildEntry(); +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckAsmCode(); +#endif #if 1 if (step == 2 && !changed) { @@ -41954,6 +41993,11 @@ void NativeCodeProcedure::Optimize(void) } #endif +#if _DEBUG + ResetVisited(); + mEntryBlock->CheckAsmCode(); +#endif + #if 1 if (cnt > 190) { diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index e103579..d417e8e 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -668,6 +668,7 @@ public: void CheckLive(void); void CheckBlocks(bool sequence = false); + void CheckAsmCode(void); void CheckVisited(void); };