Add local labels to listings
This commit is contained in:
parent
efff725745
commit
5bd4f4e9a5
|
@ -684,6 +684,15 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba
|
||||||
AsmInsData d = DecInsData[opcode];
|
AsmInsData d = DecInsData[opcode];
|
||||||
int addr = 0;
|
int addr = 0;
|
||||||
|
|
||||||
|
if (proc && proc->mLinkerObject)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (i < proc->mLinkerObject->mRanges.Size() && iip - start != proc->mLinkerObject->mRanges[i].mOffset)
|
||||||
|
i++;
|
||||||
|
if (i < proc->mLinkerObject->mRanges.Size())
|
||||||
|
fprintf(file, ".%s:\n", proc->mLinkerObject->mRanges[i].mIdent->mString);
|
||||||
|
}
|
||||||
|
|
||||||
if (bank)
|
if (bank)
|
||||||
fprintf(file, "%02x:", bank);
|
fprintf(file, "%02x:", bank);
|
||||||
|
|
||||||
|
@ -698,29 +707,29 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba
|
||||||
break;
|
break;
|
||||||
case ASMIM_ZERO_PAGE:
|
case ASMIM_ZERO_PAGE:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
fprintf(file, "%04x : %02x %02x __ %s %s %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x __ %s %s %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
case ASMIM_ZERO_PAGE_X:
|
case ASMIM_ZERO_PAGE_X:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
fprintf(file, "%04x : %02x %02x __ %s %s,x %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x __ %s %s,x %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
case ASMIM_ZERO_PAGE_Y:
|
case ASMIM_ZERO_PAGE_Y:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
fprintf(file, "%04x : %02x %02x __ %s %s,y %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x __ %s %s,y %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
case ASMIM_ABSOLUTE:
|
case ASMIM_ABSOLUTE:
|
||||||
addr = memory[ip] + 256 * memory[ip + 1];
|
addr = memory[ip] + 256 * memory[ip + 1];
|
||||||
fprintf(file, "%04x : %02x %02x %02x %s $%04x %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x %02x %s $%04x %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, proc, linker));
|
||||||
ip += 2;
|
ip += 2;
|
||||||
break;
|
break;
|
||||||
case ASMIM_ABSOLUTE_X:
|
case ASMIM_ABSOLUTE_X:
|
||||||
addr = memory[ip] + 256 * memory[ip + 1];
|
addr = memory[ip] + 256 * memory[ip + 1];
|
||||||
fprintf(file, "%04x : %02x %02x %02x %s $%04x,x %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x %02x %s $%04x,x %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, proc, linker));
|
||||||
ip += 2;
|
ip += 2;
|
||||||
break;
|
break;
|
||||||
case ASMIM_ABSOLUTE_Y:
|
case ASMIM_ABSOLUTE_Y:
|
||||||
addr = memory[ip] + 256 * memory[ip + 1];
|
addr = memory[ip] + 256 * memory[ip + 1];
|
||||||
fprintf(file, "%04x : %02x %02x %02x %s $%04x,y %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x %02x %s $%04x,y %s\n", iip, memory[iip], memory[iip + 1], memory[iip + 2], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, proc, linker));
|
||||||
ip += 2;
|
ip += 2;
|
||||||
break;
|
break;
|
||||||
case ASMIM_INDIRECT:
|
case ASMIM_INDIRECT:
|
||||||
|
@ -730,11 +739,11 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba
|
||||||
break;
|
break;
|
||||||
case ASMIM_INDIRECT_X:
|
case ASMIM_INDIRECT_X:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
fprintf(file, "%04x : %02x %02x __ %s (%s,x) %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x __ %s (%s,x) %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
case ASMIM_INDIRECT_Y:
|
case ASMIM_INDIRECT_Y:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
fprintf(file, "%04x : %02x %02x __ %s (%s),y %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, linker));
|
fprintf(file, "%04x : %02x %02x __ %s (%s),y %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], TempName(addr, tbuffer, proc, linker), AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
case ASMIM_RELATIVE:
|
case ASMIM_RELATIVE:
|
||||||
addr = memory[ip++];
|
addr = memory[ip++];
|
||||||
|
@ -742,18 +751,24 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba
|
||||||
addr = addr + ip - 256;
|
addr = addr + ip - 256;
|
||||||
else
|
else
|
||||||
addr = addr + ip;
|
addr = addr + ip;
|
||||||
fprintf(file, "%04x : %02x %02x __ %s $%04x\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], addr);
|
fprintf(file, "%04x : %02x %02x __ %s $%04x %s\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], addr, AddrName(addr, abuffer, proc, linker));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* NativeCodeDisassembler::AddrName(int addr, char* buffer, Linker* linker)
|
const char* NativeCodeDisassembler::AddrName(int addr, char* buffer, InterCodeProcedure* proc, Linker* linker)
|
||||||
{
|
{
|
||||||
if (linker)
|
if (linker)
|
||||||
{
|
{
|
||||||
LinkerObject* obj = linker->FindObjectByAddr(addr);
|
LinkerObject* obj;
|
||||||
|
|
||||||
|
if (proc && proc->mLinkerObject && addr >= proc->mLinkerObject->mAddress && addr < proc->mLinkerObject->mAddress + proc->mLinkerObject->mSize)
|
||||||
|
obj = proc->mLinkerObject;
|
||||||
|
else
|
||||||
|
obj = linker->FindObjectByAddr(addr);
|
||||||
|
|
||||||
if (obj && obj->mIdent)
|
if (obj && obj->mIdent)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
|
@ -31,7 +31,7 @@ public:
|
||||||
void DumpMemory(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj);
|
void DumpMemory(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj);
|
||||||
protected:
|
protected:
|
||||||
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc, Linker* linker);
|
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc, Linker* linker);
|
||||||
const char* AddrName(int addr, char* buffer, Linker* linker);
|
const char* AddrName(int addr, char* buffer, InterCodeProcedure* proc, Linker* linker);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -965,16 +965,38 @@ bool Linker::WriteMlbFile(const char* filename)
|
||||||
if ((obj->mFlags & LOBJF_REFERENCED) && obj->mIdent && obj->mSize > 0)
|
if ((obj->mFlags & LOBJF_REFERENCED) && obj->mIdent && obj->mSize > 0)
|
||||||
{
|
{
|
||||||
if (obj->mSection->mType == LST_BSS)
|
if (obj->mSection->mType == LST_BSS)
|
||||||
|
{
|
||||||
|
if (obj->mRanges.Size() > 0)
|
||||||
|
{
|
||||||
|
for(int i=0; i<obj->mRanges.Size(); i++)
|
||||||
|
fprintf(file, "R:%04x-%04x:%s@%s\n", obj->mAddress + obj->mRanges[i].mOffset, obj->mAddress + obj->mRanges[i].mOffset + obj->mRanges[i].mSize - 1, obj->mIdent->mString, obj->mRanges[i].mIdent->mString);
|
||||||
|
}
|
||||||
fprintf(file, "R:%04x-%04x:%s\n", obj->mAddress, obj->mAddress + obj->mSize - 1, obj->mIdent->mString);
|
fprintf(file, "R:%04x-%04x:%s\n", obj->mAddress, obj->mAddress + obj->mSize - 1, obj->mIdent->mString);
|
||||||
|
}
|
||||||
else if (obj->mType == LOT_DATA)
|
else if (obj->mType == LOT_DATA)
|
||||||
{
|
{
|
||||||
if (!obj->mRegion->mCartridgeBanks)
|
if (!obj->mRegion->mCartridgeBanks)
|
||||||
|
{
|
||||||
|
if (obj->mRanges.Size() > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < obj->mRanges.Size(); i++)
|
||||||
|
fprintf(file, "P:%04x-%04x:%s@%s\n", obj->mAddress + obj->mRanges[i].mOffset - 0x8000, obj->mAddress + obj->mRanges[i].mOffset + obj->mRanges[i].mSize - 0x8000 - 1, obj->mIdent->mString, obj->mRanges[i].mIdent->mString);
|
||||||
|
}
|
||||||
fprintf(file, "P:%04x-%04x:%s\n", obj->mAddress - 0x8000, obj->mAddress - 0x8000 + obj->mSize - 1, obj->mIdent->mString);
|
fprintf(file, "P:%04x-%04x:%s\n", obj->mAddress - 0x8000, obj->mAddress - 0x8000 + obj->mSize - 1, obj->mIdent->mString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (obj->mType == LOT_NATIVE_CODE)
|
else if (obj->mType == LOT_NATIVE_CODE)
|
||||||
{
|
{
|
||||||
if (!obj->mRegion->mCartridgeBanks)
|
if (!obj->mRegion->mCartridgeBanks)
|
||||||
|
{
|
||||||
|
if (obj->mRanges.Size() > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < obj->mRanges.Size(); i++)
|
||||||
|
fprintf(file, "P:%04x:%s@%s\n", obj->mAddress + obj->mRanges[i].mOffset - 0x8000, obj->mIdent->mString, obj->mRanges[i].mIdent->mString);
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(file, "P:%04x:%s\n", obj->mAddress - 0x8000, obj->mIdent->mString);
|
fprintf(file, "P:%04x:%s\n", obj->mAddress - 0x8000, obj->mIdent->mString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37227,7 +37227,20 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
uint8* data = proc->mLinkerObject->AddSpace(total);
|
uint8* data = proc->mLinkerObject->AddSpace(total);
|
||||||
|
|
||||||
for (int i = 0; i < placement.Size(); i++)
|
for (int i = 0; i < placement.Size(); i++)
|
||||||
|
{
|
||||||
|
LinkerObjectRange range;
|
||||||
|
char buffer[100];
|
||||||
|
if (placement[i]->mLoopHead)
|
||||||
|
sprintf_s(buffer, "l%d", placement[i]->mIndex);
|
||||||
|
else
|
||||||
|
sprintf_s(buffer, "s%d", placement[i]->mIndex);
|
||||||
|
|
||||||
|
range.mIdent = Ident::Unique(buffer);
|
||||||
|
range.mOffset = placement[i]->mOffset;
|
||||||
|
range.mSize = placement[i]->mSize;
|
||||||
|
proc->mLinkerObject->mRanges.Push(range);
|
||||||
placement[i]->CopyCode(this, data);
|
placement[i]->CopyCode(this, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < mRelocations.Size(); i++)
|
for (int i = 0; i < mRelocations.Size(); i++)
|
||||||
|
|
Loading…
Reference in New Issue