mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-06-27 22:29:48 +00:00
Debugger: 2.9.1.1: Added: X command now supports a range and will chop off the appropiate data sections.
This commit is contained in:
parent
561a145ab0
commit
19b7d43327
|
@ -63,7 +63,7 @@ void _GetAutoSymbolName ( const Nopcode_e &nopcode, const WORD nStartAddress, ch
|
||||||
|
|
||||||
// @param tData_ Filled out with range data
|
// @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 nAddress = 0;
|
||||||
WORD nAddress2 = 0;
|
WORD nAddress2 = 0;
|
||||||
|
@ -76,12 +76,14 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
|
||||||
// DB symbol
|
// DB symbol
|
||||||
// bool bisAddress ...
|
// bool bisAddress ...
|
||||||
|
|
||||||
if( nArgs < 1 )
|
if (nArgs < 1)
|
||||||
{
|
{
|
||||||
nAddress = g_nDisasmCurAddress;
|
nAddress = g_nDisasmCurAddress;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// DB foo = 300 // nArgs == 3
|
||||||
|
|
||||||
RangeType_t eRange = Range_Get( nAddress, nAddress2, iArg);
|
RangeType_t eRange = Range_Get( nAddress, nAddress2, iArg);
|
||||||
if ((eRange == RANGE_HAS_END) ||
|
if ((eRange == RANGE_HAS_END) ||
|
||||||
(eRange == RANGE_HAS_LEN))
|
(eRange == RANGE_HAS_LEN))
|
||||||
|
@ -108,10 +110,23 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
|
||||||
|
|
||||||
tData_.nStartAddress = nAddress;
|
tData_.nStartAddress = nAddress;
|
||||||
tData_.nEndAddress = nAddress + nLen;
|
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 = "";
|
const char *pSymbolName = "";
|
||||||
char aSymbolName[ MAX_SYMBOLS_LEN+1 ];
|
char aSymbolName[ MAX_SYMBOLS_LEN+1 ];
|
||||||
|
|
||||||
SymbolTable_Index_e eSymbolTable = SYMBOLS_ASSEMBLY;
|
SymbolTable_Index_e eSymbolTable = SYMBOLS_ASSEMBLY;
|
||||||
bool bAutoDefineName = false; // 2.7.0.34
|
bool bAutoDefineName = false; // 2.7.0.34
|
||||||
|
|
||||||
|
@ -138,14 +153,21 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
|
||||||
// DB 801
|
// DB 801
|
||||||
if( bAutoDefineName )
|
if( bAutoDefineName )
|
||||||
{
|
{
|
||||||
if( g_iCommand == CMD_DEFINE_DATA_STR )
|
Nopcode_e nopcode = NOP_BYTE_1;
|
||||||
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
|
|
||||||
|
|
||||||
|
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;
|
pSymbolName = aSymbolName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,18 +183,38 @@ WORD _CmdDefineByteRange(int nArgs,int iArg,DisasmData_t & tData_)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undefine Data
|
// Undefine Data
|
||||||
|
//
|
||||||
|
// X
|
||||||
|
// X addr
|
||||||
|
// X addr:addr
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// DB hgr 2000:3FFF
|
||||||
|
// U 1FFF
|
||||||
|
// X 1FFF:2001
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
Update_t CmdDisasmDataDefCode (int nArgs)
|
Update_t CmdDisasmDataDefCode (int nArgs)
|
||||||
{
|
{
|
||||||
// treat memory (bytes) as code
|
// treat memory (bytes) as code
|
||||||
if (! ((nArgs <= 2) || (nArgs == 4)))
|
if (! ((nArgs <= 2) || (nArgs == 4)) && (nArgs != 3))
|
||||||
{
|
{
|
||||||
return Help_Arg_1( CMD_DISASM_CODE );
|
return Help_Arg_1( CMD_DISASM_CODE );
|
||||||
}
|
}
|
||||||
|
|
||||||
DisasmData_t tData;
|
DisasmData_t tData; // X 1FFF:2001
|
||||||
int iArg = 2;
|
WORD nAddress = 0; // 8191
|
||||||
WORD nAddress = _CmdDefineByteRange( nArgs, iArg, tData );
|
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
|
// Need to iterate through all blocks
|
||||||
// DB TEST1 300:320
|
// DB TEST1 300:320
|
||||||
|
@ -180,18 +222,72 @@ Update_t CmdDisasmDataDefCode (int nArgs)
|
||||||
// DB TEST3 320:340
|
// DB TEST3 320:340
|
||||||
// X TEST1
|
// X TEST1
|
||||||
|
|
||||||
DisasmData_t *pData = Disassembly_IsDataAddress( nAddress );
|
/*
|
||||||
if( pData )
|
// Edge cases:
|
||||||
{
|
U 1FFF
|
||||||
// TODO: Do we need to split the data !?
|
DB 2000:2005
|
||||||
//Disassembly_DelData( tData );
|
X 1FFF:2001 // Chop 2 head
|
||||||
pData->iDirective = _NOP_REMOVED;
|
X 2004:2006 // Chop 2 tail
|
||||||
|
X 1FFF:2006 // Chop entire
|
||||||
|
|
||||||
// TODO: Remove symbol 'D_FA62' from symbol table!
|
U 1FFF
|
||||||
}
|
DB 2000:2000
|
||||||
else
|
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)
|
||||||
{
|
{
|
||||||
Disassembly_DelData( tData );
|
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;
|
||||||
|
|
||||||
|
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();
|
return UPDATE_DISASM | ConsoleUpdate();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user