diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 93aee37..4e1c25f 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -16135,40 +16135,99 @@ bool InterCodeBasicBlock::ShortcutDuplicateBranches(void) if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp) { InterInstruction* cins = mInstructions[sz - 2]; + InterInstruction* bins = mInstructions[sz - 1]; if (mTrueJump->mInstructions.Size() == 2 && mTrueJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mTrueJump->mInstructions[1]->mCode == IC_BRANCH && mTrueJump->mInstructions[0]->mDst.mTemp == mTrueJump->mInstructions[1]->mSrc[0].mTemp) { InterInstruction* tcins = mTrueJump->mInstructions[0]; + InterInstruction* tbins = mTrueJump->mInstructions[1]; if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1])) { - if (cins->mOperator == tcins->mOperator) + if (tbins->mSrc[0].mFinal) { - if (ChangeTrueJump(mTrueJump->mTrueJump)) - changed = true; + if (cins->mOperator == tcins->mOperator) + { + if (ChangeTrueJump(mTrueJump->mTrueJump)) + changed = true; + } + else if (cins->mOperator == InvertRelational(tcins->mOperator)) + { + if (ChangeTrueJump(mTrueJump->mFalseJump)) + changed = true; + } } - else if (cins->mOperator == InvertRelational(tcins->mOperator)) + else if (bins->mSrc[0].mFinal) { - if (ChangeTrueJump(mTrueJump->mFalseJump)) - changed = true; + if (cins->mOperator == tcins->mOperator) + { + if (ChangeTrueJump(mTrueJump->mTrueJump)) + { + bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp; + bins->mSrc[0].mFinal = false; + mExitRequiredTemps += bins->mSrc[0].mTemp; + changed = true; + } + } + else if (cins->mOperator == InvertRelational(tcins->mOperator)) + { + if (ChangeTrueJump(mTrueJump->mFalseJump)) + { + bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp; + bins->mSrc[0].mFinal = false; + cins->mOperator = tcins->mOperator; + mExitRequiredTemps += bins->mSrc[0].mTemp; + InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t; + changed = true; + } + } } } } if (mFalseJump->mInstructions.Size() == 2 && mFalseJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mFalseJump->mInstructions[1]->mCode == IC_BRANCH && mFalseJump->mInstructions[0]->mDst.mTemp == mFalseJump->mInstructions[1]->mSrc[0].mTemp) { InterInstruction* tcins = mFalseJump->mInstructions[0]; + InterInstruction* tbins = mFalseJump->mInstructions[1]; if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1])) { - if (cins->mOperator == tcins->mOperator) + if (tbins->mSrc[0].mFinal) { - if (ChangeFalseJump(mFalseJump->mFalseJump)) - changed = true; + if (cins->mOperator == tcins->mOperator) + { + if (ChangeFalseJump(mFalseJump->mFalseJump)) + changed = true; + } + else if (cins->mOperator == InvertRelational(tcins->mOperator)) + { + if (ChangeFalseJump(mFalseJump->mTrueJump)) + changed = true; + } } - else if (cins->mOperator == InvertRelational(tcins->mOperator)) + else if (bins->mSrc[0].mFinal) { - if (ChangeFalseJump(mFalseJump->mTrueJump)) - changed = true; + if (cins->mOperator == tcins->mOperator) + { + if (ChangeFalseJump(mFalseJump->mFalseJump)) + { + bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp; + bins->mSrc[0].mFinal = false; + mExitRequiredTemps += bins->mSrc[0].mTemp; + changed = true; + } + } + else if (cins->mOperator == InvertRelational(tcins->mOperator)) + { + if (ChangeFalseJump(mFalseJump->mTrueJump)) + { + bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp; + bins->mSrc[0].mFinal = false; + cins->mOperator = tcins->mOperator; + mExitRequiredTemps += bins->mSrc[0].mTemp; + InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t; + changed = true; + } + } } } } @@ -24572,7 +24631,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "main"); + CheckFunc = !strcmp(mIdent->mString, "edit_line"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/samples/games/missile.c b/samples/games/missile.c index 990f622..3e9f482 100644 --- a/samples/games/missile.c +++ b/samples/games/missile.c @@ -29,7 +29,7 @@ const char MissileChars[] = { #define Charset ((char *)0xd800) // Joystick and crosshair control -int CrossX = 160, CrossY = 100; +volatile int CrossX = 160, CrossY = 100; bool CrossP = false; char CrossDelay = 0; @@ -553,20 +553,22 @@ __interrupt void joy_interrupt() joy_poll(0); // Move crosshair coordinates - CrossX += 2 * joyx[0]; CrossY += 2 * joyy[0]; + int cx = CrossX + 2 * joyx[0], cy = CrossY + 2 * joyy[0]; // Stop at edges of screen - if (CrossX < 8) - CrossX = 8; - else if (CrossX > 312) - CrossX = 312; - if (CrossY < 20) - CrossY = 20; - else if (CrossY > 172) - CrossY = 172; + if (cx < 8) + cx = 8; + else if (cx > 312) + cx = 312; + if (cy < 20) + cy = 20; + else if (cy > 172) + cy = 172; // Move crosshair sprite - spr_move(0, CrossX + 14, CrossY + 40); + spr_move(0, cx + 14, cy + 40); + CrossX = cx; + CrossY = cy; // Check button if (joyb[0]) @@ -697,15 +699,17 @@ void game_play(void) // Check if fire request if (CrossP) { + int cx = CrossX, cy = CrossY; + // Find launch site int sx = 160; - if (CrossX < 120) + if (cx < 120) sx = 24; - else if (CrossX > 200) + else if (cx > 200) sx = 296; // Fire missile - missile_start(sx, 184, CrossX, CrossY); + missile_start(sx, 184, cx, cy); // Reset request CrossP = false;