Fix disassembler choking on long names
This commit is contained in:
parent
6331ec5707
commit
1ee7845bb4
|
@ -59,7 +59,7 @@ const char* ByteCodeDisassembler::AddrName(int addr, char* buffer, Linker* linke
|
||||||
LinkerObject* obj = linker->FindObjectByAddr(addr);
|
LinkerObject* obj = linker->FindObjectByAddr(addr);
|
||||||
if (obj && obj->mIdent)
|
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;
|
return buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int bank
|
||||||
else if (ident)
|
else if (ident)
|
||||||
fprintf(file, "%s:\n", ident->mString);
|
fprintf(file, "%s:\n", ident->mString);
|
||||||
|
|
||||||
char tbuffer[100], abuffer[100];
|
char tbuffer[160], abuffer[160];
|
||||||
#if 0
|
#if 0
|
||||||
for (int i = 0; i < proc->mTemporaries.Size(); i++)
|
for (int i = 0; i < proc->mTemporaries.Size(); i++)
|
||||||
printf("T%d = $%.2x\n", i, BC_REG_TMP + proc->mTempOffset[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)
|
else if (ident)
|
||||||
fprintf(file, "%s:\n", ident->mString);
|
fprintf(file, "%s:\n", ident->mString);
|
||||||
|
|
||||||
char tbuffer[100], abuffer[100];
|
char tbuffer[160], abuffer[160];
|
||||||
|
|
||||||
int ip = start;
|
int ip = start;
|
||||||
while (ip < start + size)
|
while (ip < start + size)
|
||||||
|
@ -756,7 +756,7 @@ const char* NativeCodeDisassembler::AddrName(int addr, char* buffer, Linker* lin
|
||||||
LinkerObject* obj = linker->FindObjectByAddr(addr);
|
LinkerObject* obj = linker->FindObjectByAddr(addr);
|
||||||
if (obj && obj->mIdent)
|
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;
|
return buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13172,7 +13172,7 @@ bool NativeCodeBasicBlock::MoveLoadImmStoreAbsoluteUp(int at)
|
||||||
}
|
}
|
||||||
j--;
|
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--;
|
j--;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
@ -16785,7 +16785,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
for (int i = 2; i + 1 < mIns.Size(); i++)
|
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) &&
|
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))
|
if (MoveLoadImmStoreAbsoluteUp(i + 0))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -17291,6 +17291,23 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
mIns[i + 1].mType = ASMIT_STA;
|
mIns[i + 1].mType = ASMIT_STA;
|
||||||
progress = true;
|
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 (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_TXA &&
|
mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
mIns[i + 1].mType == ASMIT_TAX)
|
mIns[i + 1].mType == ASMIT_TAX)
|
||||||
|
@ -18974,7 +18991,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
mIns[i + 1].mType == ASMIT_CLC &&
|
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].mType == ASMIT_ADC && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress &&
|
||||||
!(mIns[i + 3].mLive & LIVE_MEM))
|
!(mIns[i + 3].mLive & LIVE_MEM))
|
||||||
{
|
{
|
||||||
|
|
|
@ -3347,6 +3347,7 @@ void Parser::ParsePragma(void)
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
Expression* exp;
|
Expression* exp;
|
||||||
Declaration* dstart = nullptr, * dend = nullptr;
|
Declaration* dstart = nullptr, * dend = nullptr;
|
||||||
|
LinkerSectionType type = LST_DATA;
|
||||||
|
|
||||||
ConsumeToken(TK_COMMA);
|
ConsumeToken(TK_COMMA);
|
||||||
|
|
||||||
|
@ -3357,22 +3358,46 @@ void Parser::ParsePragma(void)
|
||||||
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for flags expected");
|
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for flags expected");
|
||||||
|
|
||||||
if (ConsumeTokenIf(TK_COMMA))
|
if (ConsumeTokenIf(TK_COMMA))
|
||||||
|
{
|
||||||
|
if (mScanner->mToken != TK_COMMA)
|
||||||
{
|
{
|
||||||
exp = ParseExpression();
|
exp = ParseExpression();
|
||||||
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
|
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
|
||||||
dstart = exp->mDecValue;
|
dstart = exp->mDecValue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ConsumeTokenIf(TK_COMMA))
|
if (ConsumeTokenIf(TK_COMMA))
|
||||||
|
{
|
||||||
|
if (mScanner->mToken != TK_COMMA)
|
||||||
{
|
{
|
||||||
exp = ParseExpression();
|
exp = ParseExpression();
|
||||||
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
|
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
|
||||||
dend = exp->mDecValue;
|
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);
|
LinkerSection* lsec = mCompilationUnits->mLinker->FindSection(sectionIdent);
|
||||||
if (!lsec)
|
if (!lsec)
|
||||||
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, LST_DATA);
|
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type);
|
||||||
|
|
||||||
if (dstart)
|
if (dstart)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue