Skip to content

Commit

Permalink
Debugger: 2.9.1.1: Added: X command now supports a range and will cho…
Browse files Browse the repository at this point in the history
…p off the appropiate data sections.
  • Loading branch information
Michaelangel007 committed Jan 4, 2022
1 parent 561a145 commit 19b7d43
Showing 1 changed file with 121 additions and 25 deletions.
146 changes: 121 additions & 25 deletions source/Debugger/Debugger_DisassemblerData.cpp
Expand Up @@ -63,7 +63,7 @@ void _GetAutoSymbolName ( const Nopcode_e &nopcode, const WORD nStartAddress, ch

// @param tData_ Filled out with range data
//===========================================================================
WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
WORD _GetDataRange (int nArgs, int iArg, DisasmData_t& tData_)
{
WORD nAddress = 0;
WORD nAddress2 = 0;
Expand All @@ -76,12 +76,14 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
// DB symbol
// bool bisAddress ...

if( nArgs < 1 )
if (nArgs < 1)
{
nAddress = g_nDisasmCurAddress;
}
else
{
// DB foo = 300 // nArgs == 3

RangeType_t eRange = Range_Get( nAddress, nAddress2, iArg);
if ((eRange == RANGE_HAS_END) ||
(eRange == RANGE_HAS_LEN))
Expand All @@ -108,10 +110,23 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)

tData_.nStartAddress = nAddress;
tData_.nEndAddress = nAddress + nLen;
// tData_.nArraySize = 0;

return nAddress;
}

//===========================================================================
WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
{
WORD nAddress = 0;
WORD nAddress2 = 0;
WORD nEnd = 0;
int nLen = 0;

nAddress = _GetDataRange(nArgs,iArg,tData_);

const char *pSymbolName = "";
char aSymbolName[ MAX_SYMBOLS_LEN+1 ];

SymbolTable_Index_e eSymbolTable = SYMBOLS_ASSEMBLY;
bool bAutoDefineName = false; // 2.7.0.34

Expand All @@ -138,20 +153,27 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
// DB 801
if( bAutoDefineName )
{
if( g_iCommand == CMD_DEFINE_DATA_STR )
sprintf( aSymbolName, "T_%04X", tData_.nStartAddress ); // ASC range
else
if( g_iCommand == CMD_DEFINE_DATA_WORD1 )
sprintf( aSymbolName, "W_%04X", tData_.nStartAddress ); // DW range
else
sprintf( aSymbolName, "B_%04X", tData_.nStartAddress ); // DB range
Nopcode_e nopcode = NOP_BYTE_1;

bool isString = (g_iCommand == CMD_DEFINE_DATA_STR);
if( isString )
nopcode = NOP_STRING_ASCII;

bool isWord1 = (g_iCommand == CMD_DEFINE_DATA_WORD1);
if( isWord1 )
nopcode = NOP_WORD_1;

bool isAddr = (g_iCommand == CMD_DEFINE_ADDR_WORD);
if( isAddr )
nopcode = NOP_ADDRESS;

_GetAutoSymbolName( nopcode, tData_.nStartAddress , aSymbolName );
pSymbolName = aSymbolName;
}

// bRemoveSymbol = false // use arg[2]
// bUpdateSymbol = true // add the symbol to the table
SymbolUpdate( eSymbolTable, pSymbolName, nAddress, false, true );
SymbolUpdate( eSymbolTable, pSymbolName, nAddress, false, true );

// TODO: Note: need to call ConsoleUpdate(), as may print symbol has been updated

Expand All @@ -161,37 +183,111 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
}

// Undefine Data
//
// X
// X addr
// X addr:addr
//
// Example:
// DB hgr 2000:3FFF
// U 1FFF
// X 1FFF:2001
//===========================================================================
Update_t CmdDisasmDataDefCode (int nArgs)
{
// treat memory (bytes) as code
if (! ((nArgs <= 2) || (nArgs == 4)))
if (! ((nArgs <= 2) || (nArgs == 4)) && (nArgs != 3))
{
return Help_Arg_1( CMD_DISASM_CODE );
}

DisasmData_t tData;
int iArg = 2;
WORD nAddress = _CmdDefineByteRange( nArgs, iArg, tData );
DisasmData_t tData; // X 1FFF:2001
WORD nAddress = 0; // 8191
int iArg = 0;

if (nArgs == 3)
{
iArg = 1; // #### : ####
nAddress = _GetDataRange( nArgs, iArg, tData );
}
else
{
iArg = 2;
nAddress = _GetDataRange( nArgs, iArg, tData );
}

// Need to iterate through all blocks
// DB TEST1 300:320
// DB TEST2 310:330
// DB TEST3 320:340
// X TEST1

DisasmData_t *pData = Disassembly_IsDataAddress( nAddress );
if( pData )
/*
// Edge cases:
U 1FFF
DB 2000:2005
X 1FFF:2001 // Chop 2 head
X 2004:2006 // Chop 2 tail
X 1FFF:2006 // Chop entire
U 1FFF
DB 2000:2000
X 2000:2000 // Chop entire
U 1FFF
DB 2000:2002
X 2001:2001 // Chop middle
U 1FFF
DB 2000:2005
X 2002:2003 // Chop middle
*/
while (nAddress <= tData.nEndAddress)
{
// TODO: Do we need to split the data !?
//Disassembly_DelData( tData );
pData->iDirective = _NOP_REMOVED;
DisasmData_t *pData = Disassembly_IsDataAddress( nAddress );
if( pData )
{
if (( nAddress <= pData->nStartAddress)
&& (tData.nEndAddress >= pData->nEndAddress ))
{
// remove entire
Disassembly_DelData( *pData );
}
else
if (( nAddress <= pData->nStartAddress)
&& (tData.nStartAddress < pData->nEndAddress ))
{
// head
pData->nStartAddress = nAddress+1;
}
else
if (( nAddress > pData->nStartAddress)
&& (tData.nEndAddress >= pData->nEndAddress ))
{
// tail
pData->nEndAddress = nAddress-1;
}
else
{
// middle
SymbolTable_Index_e eSymbolTable = SYMBOLS_ASSEMBLY;

// TODO: Remove symbol 'D_FA62' from symbol table!
}
else
{
Disassembly_DelData( tData );
DisasmData_t tSplit = *pData;
pData->nEndAddress = nAddress - 1;

const char *pSymbolName = tSplit.sSymbol;

tSplit.nStartAddress = tData.nEndAddress + 1; // nAddress + 1;
_GetAutoSymbolName( pData->eElementType, tSplit.nStartAddress, tSplit.sSymbol );

SymbolUpdate( eSymbolTable, pSymbolName, tSplit.nStartAddress, false, true );
Disassembly_AddData( tSplit );
}

// TODO: Remove symbol 'D_FA62' from symbol table!
}

nAddress++;
}

return UPDATE_DISASM | ConsoleUpdate();
Expand Down

0 comments on commit 19b7d43

Please sign in to comment.