diff --git a/source/Debugger/Debugger_DisassemblerData.cpp b/source/Debugger/Debugger_DisassemblerData.cpp index de5dda07..b4ad843a 100644 --- a/source/Debugger/Debugger_DisassemblerData.cpp +++ b/source/Debugger/Debugger_DisassemblerData.cpp @@ -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; @@ -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)) @@ -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 @@ -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 @@ -161,18 +183,38 @@ 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 @@ -180,18 +222,72 @@ Update_t CmdDisasmDataDefCode (int nArgs) // DB TEST3 320:340 // X TEST1 - DisasmData_t *pData = Disassembly_IsDataAddress( nAddress ); - if( pData ) - { - // TODO: Do we need to split the data !? - //Disassembly_DelData( tData ); - pData->iDirective = _NOP_REMOVED; + /* + // Edge cases: + U 1FFF + DB 2000:2005 + X 1FFF:2001 // Chop 2 head + X 2004:2006 // Chop 2 tail + X 1FFF:2006 // Chop entire - // TODO: Remove symbol 'D_FA62' from symbol table! - } - else + 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) { - 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();