diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index f148e88..74c9984 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -59,7 +59,7 @@ const char* ByteCodeDisassembler::AddrName(int addr, char* buffer, Linker* linke LinkerObject* obj = linker->FindObjectByAddr(addr); if (obj && obj->mIdent) { - sprintf_s(buffer, 40, "%s + %d", obj->mIdent->mString, addr - obj->mAddress); + sprintf_s(buffer, 160, "%s + %d", obj->mIdent->mString, addr - obj->mAddress); return buffer; } } @@ -76,7 +76,7 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int bank else if (ident) fprintf(file, "%s:\n", ident->mString); - char tbuffer[100], abuffer[100]; + char tbuffer[160], abuffer[160]; #if 0 for (int i = 0; i < proc->mTemporaries.Size(); i++) printf("T%d = $%.2x\n", i, BC_REG_TMP + proc->mTempOffset[i]); @@ -674,7 +674,7 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba else if (ident) fprintf(file, "%s:\n", ident->mString); - char tbuffer[100], abuffer[100]; + char tbuffer[160], abuffer[160]; int ip = start; while (ip < start + size) @@ -756,7 +756,7 @@ const char* NativeCodeDisassembler::AddrName(int addr, char* buffer, Linker* lin LinkerObject* obj = linker->FindObjectByAddr(addr); if (obj && obj->mIdent) { - sprintf_s(buffer, 40, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress); + sprintf_s(buffer, 160, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress); return buffer; } } diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 5da7fdf..b179051 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -13172,7 +13172,7 @@ bool NativeCodeBasicBlock::MoveLoadImmStoreAbsoluteUp(int at) } 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) + 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)) j--; else return false; @@ -16785,7 +16785,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass for (int i = 2; i + 1 < mIns.Size(); i++) { if (mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_IMMEDIATE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) && - mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE)) + mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) && !(mIns[i + 1].mFlags & NCIF_VOLATILE)) { if (MoveLoadImmStoreAbsoluteUp(i + 0)) changed = true; @@ -17291,6 +17291,23 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 1].mType = ASMIT_STA; progress = true; } + else if ( + mIns[i + 0].mType == ASMIT_ROL && mIns[i + 0].mMode == ASMIM_IMPLIED && + mIns[i + 1].mType == ASMIT_LSR && mIns[i + 1].mMode == ASMIM_IMPLIED && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) + { + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + progress = true; + } + else if ( + mIns[i + 0].mType == ASMIT_ROR && mIns[i + 0].mMode == ASMIM_IMPLIED && + mIns[i + 1].mType == ASMIT_ASL && mIns[i + 1].mMode == ASMIM_IMPLIED && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) + { + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + progress = true; + } + else if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_TAX) @@ -18974,7 +18991,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass else if ( mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_CLC && - mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 2].mMode == ASMIM_IMMEDIATE || mIns[i + 2].mMode == ASMIM_IMMEDIATE_ADDRESS) && + mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 2].mMode == ASMIM_IMMEDIATE || mIns[i + 2].mMode == ASMIM_IMMEDIATE_ADDRESS || mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 0].mAddress) && mIns[i + 3].mType == ASMIT_ADC && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress && !(mIns[i + 3].mLive & LIVE_MEM)) { diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index c5aa060..3abe131 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -3347,6 +3347,7 @@ void Parser::ParsePragma(void) int flags = 0; Expression* exp; Declaration* dstart = nullptr, * dend = nullptr; + LinkerSectionType type = LST_DATA; ConsumeToken(TK_COMMA); @@ -3358,21 +3359,45 @@ void Parser::ParsePragma(void) if (ConsumeTokenIf(TK_COMMA)) { - exp = ParseExpression(); - if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE) - dstart = exp->mDecValue; - - if (ConsumeTokenIf(TK_COMMA)) + if (mScanner->mToken != TK_COMMA) { exp = ParseExpression(); if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE) - dend = exp->mDecValue; + dstart = exp->mDecValue; + } + + if (ConsumeTokenIf(TK_COMMA)) + { + if (mScanner->mToken != TK_COMMA) + { + exp = ParseExpression(); + if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE) + dend = exp->mDecValue; + } + + if (ConsumeTokenIf(TK_COMMA)) + { + if (mScanner->mToken == TK_IDENT) + { + if (!strcmp(mScanner->mTokenIdent->mString, "bss")) + type = LST_BSS; + else if (!strcmp(mScanner->mTokenIdent->mString, "data")) + type = LST_DATA; + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Unknown section type"); + } + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Identifier expected"); + + mScanner->NextToken(); + + } } } LinkerSection* lsec = mCompilationUnits->mLinker->FindSection(sectionIdent); if (!lsec) - lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, LST_DATA); + lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type); if (dstart) {