diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index ef11601..05c8895 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -603,6 +603,44 @@ NativeCodeDisassembler::~NativeCodeDisassembler(void) } +void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker) +{ + fprintf(file, "--------------------------------------------------------------------\n"); + if (proc && proc->mIdent) + fprintf(file, "%s:\n", proc->mIdent->mString); + else if (ident) + fprintf(file, "%s:\n", ident->mString); + + char tbuffer[10], abuffer[100]; + + int ip = start; + while (ip < start + size) + { + int n = 16; + if (ip + n > start + size) + n = start + size - ip; + + fprintf(file, "%04x : __ __ __ BYT", ip); + + for (int i = 0; i < n; i++) + fprintf(file, " %02x", memory[ip + i]); + for(int i=n; i<16; i++) + fprintf(file, " "); + fprintf(file, " : "); + for (int i = 0; i < n; i++) + { + int k = memory[ip + i]; + if (k >= 32 && k < 128) + fprintf(file, "%c", k); + else + fprintf(file, "."); + } + fprintf(file, "\n"); + + ip += n; + } +} + void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident * ident, Linker* linker) { fprintf(file, "--------------------------------------------------------------------\n"); diff --git a/oscar64/Disassembler.h b/oscar64/Disassembler.h index e730b0b..99d3526 100644 --- a/oscar64/Disassembler.h +++ b/oscar64/Disassembler.h @@ -27,6 +27,7 @@ public: ~NativeCodeDisassembler(void); void Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker); + void DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker); protected: const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* AddrName(int addr, char* buffer, Linker* linker); diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 708595d..4c52069 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -4579,12 +4579,48 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void) if (sz >= 2) { - if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp) + if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && + mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp && IsIntegerType(mInstructions[sz - 2]->mSrc[0].mType)) { int s1 = mInstructions[sz - 2]->mSrc[1].mTemp, s0 = mInstructions[sz - 2]->mSrc[0].mTemp; switch (mInstructions[sz - 2]->mOperator) { +#if 1 + case IA_CMPEQ: + if (s0 < 0) + { + mTrueValueRange[s1].mMinState = IntegerValueRange::S_BOUND; + mTrueValueRange[s1].mMinValue = mInstructions[sz - 2]->mSrc[0].mIntConst; + mTrueValueRange[s1].mMaxState = IntegerValueRange::S_BOUND; + mTrueValueRange[s1].mMaxValue = mInstructions[sz - 2]->mSrc[0].mIntConst; + } + else if (s1 < 0) + { + mTrueValueRange[s0].mMinState = IntegerValueRange::S_BOUND; + mTrueValueRange[s0].mMinValue = mInstructions[sz - 2]->mSrc[1].mIntConst; + mTrueValueRange[s0].mMaxState = IntegerValueRange::S_BOUND; + mTrueValueRange[s0].mMaxValue = mInstructions[sz - 2]->mSrc[1].mIntConst; + } + break; + + case IA_CMPNE: + if (s0 < 0) + { + mFalseValueRange[s1].mMinState = IntegerValueRange::S_BOUND; + mFalseValueRange[s1].mMinValue = mInstructions[sz - 2]->mSrc[0].mIntConst; + mFalseValueRange[s1].mMaxState = IntegerValueRange::S_BOUND; + mFalseValueRange[s1].mMaxValue = mInstructions[sz - 2]->mSrc[0].mIntConst; + } + else if (s1 < 0) + { + mFalseValueRange[s0].mMinState = IntegerValueRange::S_BOUND; + mFalseValueRange[s0].mMinValue = mInstructions[sz - 2]->mSrc[1].mIntConst; + mFalseValueRange[s0].mMaxState = IntegerValueRange::S_BOUND; + mFalseValueRange[s0].mMaxValue = mInstructions[sz - 2]->mSrc[1].mIntConst; + } + break; +#endif case IA_CMPLS: if (s0 < 0) { @@ -7586,10 +7622,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa } int di = mInstructions.Size() - 1; - if (mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR) + if (di > 0 && mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR) { di--; - if (mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[0].mTemp || mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[1].mTemp) + if (di > 0 && mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[0].mTemp || mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[1].mTemp) di--; } diff --git a/oscar64/Linker.cpp b/oscar64/Linker.cpp index 0abce98..39657bc 100644 --- a/oscar64/Linker.cpp +++ b/oscar64/Linker.cpp @@ -644,6 +644,11 @@ bool Linker::WriteAsmFile(const char* filename) else mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); break; + case LOT_DATA: + if (obj->mRegion->mCartridge < 0) + mNativeDisassembler.DumpMemory(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); + else + mNativeDisassembler.DumpMemory(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); } } } diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index aa1fb67..11666ad 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -636,9 +636,9 @@ uint8* Parser::ParseStringLiteral(int msize) uint8* d = new uint8[msize]; int i = 0; - while (mScanner->mTokenString[i]) + while (i < size) { - d[i] = mCharMap[mScanner->mTokenString[i]]; + d[i] = mCharMap[(uint8)mScanner->mTokenString[i]]; i++; } @@ -661,9 +661,9 @@ uint8* Parser::ParseStringLiteral(int msize) uint8* nd = new uint8[msize]; memcpy(nd, d, size); int i = 0; - while (mScanner->mTokenString[i]) + while (i < s) { - nd[i + size] = mCharMap[mScanner->mTokenString[i]]; + nd[i + size] = mCharMap[(uint8)mScanner->mTokenString[i]]; i++; } size += s; @@ -1199,7 +1199,7 @@ Expression* Parser::ParseSimpleExpression(void) break; case TK_CHARACTER: dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER); - dec->mInteger = mCharMap[mScanner->mTokenInteger]; + dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger]; dec->mBase = TheUnsignedIntTypeDeclaration; exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp->mDecValue = dec; @@ -1266,23 +1266,24 @@ Expression* Parser::ParseSimpleExpression(void) case TK_STRING: { dec = new Declaration(mScanner->mLocation, DT_CONST_DATA); - dec->mSize = strlen(mScanner->mTokenString) + 1; + int size = strlen(mScanner->mTokenString); + dec->mSize = size + 1; dec->mVarIndex = -1; dec->mSection = mCodeSection; dec->mBase = new Declaration(mScanner->mLocation, DT_TYPE_ARRAY); dec->mBase->mSize = dec->mSize; dec->mBase->mBase = TheConstCharTypeDeclaration; dec->mBase->mFlags |= DTF_DEFINED; - uint8* d = new uint8[dec->mSize + 1]; + uint8* d = new uint8[size + 1]; dec->mData = d; int i = 0; - while (mScanner->mTokenString[i]) + while (i < size) { - d[i] = mCharMap[mScanner->mTokenString[i]]; + d[i] = mCharMap[(uint8)mScanner->mTokenString[i]]; i++; } - d[i] = 0; + d[size] = 0; exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp->mDecValue = dec; @@ -1294,16 +1295,17 @@ Expression* Parser::ParseSimpleExpression(void) while (mScanner->mToken == TK_STRING) { int s = strlen(mScanner->mTokenString); - uint8* d = new uint8[dec->mSize + s + 1]; - memcpy(d, dec->mData, dec->mSize - 1); + uint8* d = new uint8[size + s + 1]; + memcpy(d, dec->mData, size); int i = 0; - while (mScanner->mTokenString[i]) + while (i < s) { - d[i + dec->mSize] = mCharMap[mScanner->mTokenString[i]]; + d[size + i] = mCharMap[(uint8)mScanner->mTokenString[i]]; i++; } - d[i + dec->mSize] = 0; - dec->mSize += s; + size += s; + d[size] = 0; + dec->mSize = size + 1; delete[] dec->mData; dec->mData = d; mScanner->NextToken(); @@ -2256,7 +2258,7 @@ Expression* Parser::ParseAssemblerBaseOperand(Declaration* pcasm, int pcoffset) break; case TK_CHARACTER: dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER); - dec->mInteger = mCharMap[mScanner->mTokenInteger]; + dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger]; dec->mBase = TheUnsignedIntTypeDeclaration; exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp->mDecValue = dec; diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 0c13e20..501bc97 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -56,7 +56,7 @@ bool GetProductAndVersion(char* strProductName, char* strProductVersion) } #endif -int main(int argc, const char** argv) +int main2(int argc, const char** argv) { InitDeclarations(); InitAssembler(); @@ -67,13 +67,13 @@ int main(int argc, const char** argv) char strProductName[100], strProductVersion[200]; #ifdef _WIN32 - GetProductAndVersion(strProductName, strProductVersion); + GetProductAndVersion(strProductName, strProductVersion); - DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath)); + DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath)); #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.4.77"); + strcpy(strProductVersion, "1.4.78"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); @@ -83,8 +83,8 @@ int main(int argc, const char** argv) #else int length = readlink("/proc/self/exe", basePath, sizeof(basePath)); -// strcpy(basePath, argv[0]); -// int length = strlen(basePath); + // strcpy(basePath, argv[0]); + // int length = strlen(basePath); #endif #endif while (length > 0 && basePath[length - 1] != '/' && basePath[length - 1] != '\\') @@ -241,3 +241,22 @@ int main(int argc, const char** argv) return 0; } + +int main(int argc, const char** argv) +{ +#ifdef _WIN32 + __try + { +#endif + + return main2(argc, argv); + +#ifdef _WIN32 + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + printf("oscar64 crashed."); + return 30; + } +#endif +} \ No newline at end of file diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 16f04c1..0eb3c43 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,77,0 - PRODUCTVERSION 1,4,77,0 + FILEVERSION 1,4,78,0 + PRODUCTVERSION 1,4,78,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.4.77.0" + VALUE "FileVersion", "1.4.78.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.4.77.0" + VALUE "ProductVersion", "1.4.78.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 7e899d5..195c784 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -3570,15 +3570,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{29AA2963-64EB-4255-A8A4-228932C24DE6}" - "PackageCode" = "8:{99D21284-BC74-4D9D-A5F1-41EC43AE23AC}" + "ProductCode" = "8:{A63EF9D9-9EA0-4598-BE7F-C7F90A3FFEAA}" + "PackageCode" = "8:{B344F37B-0769-452A-BFC4-40EB21102D3C}" "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.4.77" + "ProductVersion" = "8:1.4.78" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/samples/memmap/easyflash.crt b/samples/memmap/easyflash.crt index 3b06a79..71c9643 100644 Binary files a/samples/memmap/easyflash.crt and b/samples/memmap/easyflash.crt differ