diff --git a/include/c64/memmap.h b/include/c64/memmap.h index ec0792a..dadd0ad 100644 --- a/include/c64/memmap.h +++ b/include/c64/memmap.h @@ -7,6 +7,7 @@ #define MMAP_NO_BASIC 0x36 #define MMAP_NO_ROM 0x35 #define MMAP_RAM 0x30 +#define MMAP_CHAR_ROM 0x31 // Install an IRQ an NMI trampoline, that routes the kernal interrupts // through an intermediate trampoline when the kernal ROM is not paged diff --git a/include/c64/rasterirq.c b/include/c64/rasterirq.c index ea05db5..afc2cb1 100644 --- a/include/c64/rasterirq.c +++ b/include/c64/rasterirq.c @@ -89,6 +89,9 @@ ex: __asm irq1 { + lda $d019 + bpl ex2 + ldx nextIRQ l1: lda rasterIRQNext, x @@ -131,7 +134,6 @@ e2: lda npos sta tpos - asl $d019 jmp ex e1: @@ -144,7 +146,11 @@ e1: ex: asl $d019 + jmp $ea81 +ex2: + LDA $DC0D + cli jmp $ea31 } @@ -268,12 +274,13 @@ void rirq_init(bool kernalIRQ) { sei +#if 0 // disable CIA interrupts lda #$7f sta $dc0d sta $dd0d - +#endif } if (kernalIRQ) diff --git a/include/gfx/bitmap.c b/include/gfx/bitmap.c index 9ce5726..c82b59a 100644 --- a/include/gfx/bitmap.c +++ b/include/gfx/bitmap.c @@ -2,6 +2,7 @@ #include "tinyfont.h" #include #include +#include void bm_init(Bitmap * bm, char * data, char cw, char ch) { diff --git a/include/stdio.c b/include/stdio.c index ec3cdac..46491f9 100644 --- a/include/stdio.c +++ b/include/stdio.c @@ -964,9 +964,9 @@ int scanf_func(void * fparam) return getchar(); } -int sscanf(const char * fmt, const char * str, ...) +int sscanf(const char * str, const char * fmt, ...) { - return fpscanf(fmt, sscanf_func, &str, (void **)((&str) + 1)); + return fpscanf(fmt, sscanf_func, &str, (void **)((&fmt) + 1)); } int scanf(const char * fmt, ...) diff --git a/include/stdio.h b/include/stdio.h index ea5f55c..21c8167 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -18,7 +18,7 @@ int sprintf(char * str, const char * fmt, ...); int scanf(const char * fmt, ...); -int sscanf(const char * fmt, const char * str, ...); +int sscanf(const char * str, const char * fmt, ...); #pragma compile("stdio.c") diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 5336053..f21e27a 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -7872,7 +7872,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void) changed = true; } - while (mTrueJump && mTrueJump->mIns.Size() == 0 && !mTrueJump->mFalseJump && !mTrueJump->mLocked && mTrueJump != this) + while (mTrueJump && mTrueJump->mIns.Size() == 0 && !mTrueJump->mFalseJump && !mTrueJump->mLocked && mTrueJump != this && mTrueJump->mTrueJump != mTrueJump) { mTrueJump->mNumEntries--; mTrueJump = mTrueJump->mTrueJump; @@ -7880,7 +7880,7 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void) changed = true; } - while (mFalseJump && mFalseJump->mIns.Size() == 0 && !mFalseJump->mFalseJump && !mFalseJump->mLocked && mFalseJump != this) + while (mFalseJump && mFalseJump->mIns.Size() == 0 && !mFalseJump->mFalseJump && !mFalseJump->mLocked && mFalseJump != this && mFalseJump->mTrueJump != mFalseJump) { mFalseJump->mNumEntries--; mFalseJump = mFalseJump->mTrueJump; @@ -8585,35 +8585,41 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(void) { if (mTrueJump->mIns.Size() > mFalseJump->mIns.Size()) { - int i = 0, offset = mTrueJump->mIns.Size() - mFalseJump->mIns.Size(); - while (i < mFalseJump->mIns.Size() && mFalseJump->mIns[i].IsSame(mTrueJump->mIns[i + offset])) - i++; - if (i == mFalseJump->mIns.Size()) + if (mTrueJump->mTrueJump != mFalseJump) { - if (mTrueJump->mTrueJump) - mTrueJump->mTrueJump->RemEntryBlock(mTrueJump); - mTrueJump->mTrueJump = mFalseJump; - if (mTrueJump->mTrueJump) - mTrueJump->mTrueJump->AddEntryBlock(mTrueJump); - mTrueJump->mIns.SetSize(offset); + int i = 0, offset = mTrueJump->mIns.Size() - mFalseJump->mIns.Size(); + while (i < mFalseJump->mIns.Size() && mFalseJump->mIns[i].IsSame(mTrueJump->mIns[i + offset])) + i++; + if (i == mFalseJump->mIns.Size()) + { + if (mTrueJump->mTrueJump) + mTrueJump->mTrueJump->RemEntryBlock(mTrueJump); + mTrueJump->mTrueJump = mFalseJump; + if (mTrueJump->mTrueJump) + mTrueJump->mTrueJump->AddEntryBlock(mTrueJump); + mTrueJump->mIns.SetSize(offset); - changed = true; + changed = true; + } } } else { - int i = 0, offset = mFalseJump->mIns.Size() - mTrueJump->mIns.Size(); - while (i < mTrueJump->mIns.Size() && mTrueJump->mIns[i].IsSame(mFalseJump->mIns[i + offset])) - i++; - if (i == mTrueJump->mIns.Size()) + if (mFalseJump->mTrueJump != mTrueJump) { - if (mFalseJump->mTrueJump) - mFalseJump->mTrueJump->RemEntryBlock(mFalseJump); - mFalseJump->mTrueJump = mTrueJump; - if (mFalseJump->mTrueJump) - mFalseJump->mTrueJump->AddEntryBlock(mFalseJump); - mFalseJump->mIns.SetSize(offset); - changed = true; + int i = 0, offset = mFalseJump->mIns.Size() - mTrueJump->mIns.Size(); + while (i < mTrueJump->mIns.Size() && mTrueJump->mIns[i].IsSame(mFalseJump->mIns[i + offset])) + i++; + if (i == mTrueJump->mIns.Size()) + { + if (mFalseJump->mTrueJump) + mFalseJump->mTrueJump->RemEntryBlock(mFalseJump); + mFalseJump->mTrueJump = mTrueJump; + if (mFalseJump->mTrueJump) + mFalseJump->mTrueJump->AddEntryBlock(mFalseJump); + mFalseJump->mIns.SetSize(offset); + changed = true; + } } } }