mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-12-25 14:31:01 +00:00
Disassembly formating
TraceFile fixes
This commit is contained in:
parent
38c2f32db0
commit
38bc5180ba
240
source/Debug.cpp
240
source/Debug.cpp
@ -43,7 +43,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
// TODO: COLOR LOAD ["filename"]
|
||||
|
||||
// See Debugger_Changelong.txt for full details
|
||||
const int DEBUGGER_VERSION = MAKE_VERSION(2,5,7,6);
|
||||
const int DEBUGGER_VERSION = MAKE_VERSION(2,5,7,11);
|
||||
|
||||
|
||||
// Public _________________________________________________________________________________________
|
||||
@ -741,8 +741,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
bool g_bSourceAddSymbols = false;
|
||||
bool g_bSourceAddMemory = false;
|
||||
|
||||
TCHAR g_aSourceFileName[ MAX_PATH ] = TEXT("");
|
||||
TCHAR g_aSourceFontName[ MAX_FONT_NAME ] = TEXT("Arial");
|
||||
char g_aSourceFileName[ MAX_PATH ] = "";
|
||||
|
||||
MemoryTextFile_t g_AssemblerSourceBuffer;
|
||||
|
||||
@ -755,11 +754,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
// Symbols ________________________________________________________________________________________
|
||||
TCHAR * g_aSymbolTableNames[ NUM_SYMBOL_TABLES ] =
|
||||
char * g_aSymbolTableNames[ NUM_SYMBOL_TABLES ] =
|
||||
{
|
||||
TEXT("Main"),
|
||||
TEXT("User"),
|
||||
TEXT("Src" )
|
||||
"Main",
|
||||
"User",
|
||||
"Src"
|
||||
};
|
||||
|
||||
SymbolTable_t g_aSymbols[ NUM_SYMBOL_TABLES ];
|
||||
@ -824,6 +823,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
int g_nDebugSkipLen = 0;
|
||||
|
||||
FILE *g_hTraceFile = NULL;
|
||||
bool g_bTraceHeader = false; // semaphore, flag header to be printed
|
||||
|
||||
DWORD extbench = 0;
|
||||
bool g_bDebuggerViewingAppleOutput = false;
|
||||
@ -872,7 +872,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
bool _CmdSymbolList_Symbol2Address( LPCTSTR pSymbol, int bSymbolTables );
|
||||
|
||||
// Source Level Debugging
|
||||
static bool BufferAssemblyListing ( TCHAR * pFileName );
|
||||
static bool BufferAssemblyListing ( char * pFileName );
|
||||
static bool ParseAssemblyListing ( bool bBytesToMemory, bool bAddSymbols );
|
||||
|
||||
|
||||
@ -1426,7 +1426,8 @@ Update_t CmdProfile (int nArgs)
|
||||
if (pText)
|
||||
{
|
||||
TextConvertTabsToSpaces( sText, pText, CONSOLE_WIDTH, 4 );
|
||||
ConsoleBufferPush( sText );
|
||||
// ConsoleBufferPush( sText );
|
||||
ConsolePrint( sText );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2471,18 +2472,47 @@ Update_t CmdTrace (int nArgs)
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
Update_t CmdTraceFile (int nArgs) {
|
||||
Update_t CmdTraceFile (int nArgs)
|
||||
{
|
||||
char sText[ CONSOLE_WIDTH ] = "";
|
||||
|
||||
if (g_hTraceFile)
|
||||
fclose(g_hTraceFile);
|
||||
{
|
||||
fclose( g_hTraceFile );
|
||||
g_hTraceFile = NULL;
|
||||
|
||||
TCHAR sFilename[MAX_PATH];
|
||||
_tcscpy(sFilename,g_sCurrentDir); // g_sProgramDir
|
||||
|
||||
if (nArgs)
|
||||
_tcscat( sFilename, g_aArgs[1].sArg );
|
||||
sprintf( sText, "Trace stopped." );
|
||||
}
|
||||
else
|
||||
_tcscat( sFilename, g_sFileNameTrace );
|
||||
g_hTraceFile = fopen( sFilename, "wt" );
|
||||
{
|
||||
char sFileName[MAX_PATH];
|
||||
|
||||
if (nArgs)
|
||||
strcpy( sFileName, g_aArgs[1].sArg );
|
||||
else
|
||||
strcpy( sFileName, g_sFileNameTrace );
|
||||
|
||||
|
||||
char sFilePath[ MAX_PATH ];
|
||||
strcpy(sFilePath, g_sCurrentDir); // g_sProgramDir
|
||||
strcat(sFilePath, sFileName );
|
||||
|
||||
g_hTraceFile = fopen( sFilePath, "wt" );
|
||||
|
||||
if (g_hTraceFile)
|
||||
{
|
||||
sprintf( sText, "Trace started: %s", sFileName );
|
||||
|
||||
g_bTraceHeader = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( sText, "Trace ERROR: %s", sFileName );
|
||||
}
|
||||
}
|
||||
|
||||
ConsoleBufferPush( sText );
|
||||
ConsoleBufferToDisplay();
|
||||
|
||||
return UPDATE_ALL; // TODO: Verify // 0
|
||||
}
|
||||
@ -2660,7 +2690,7 @@ Update_t CmdNOP (int nArgs)
|
||||
int iOpmode;
|
||||
int nOpbytes;
|
||||
|
||||
_6502_GetOpcodeOpmodeOpbytes( iOpcode, iOpmode, nOpbytes );
|
||||
_6502_GetOpcodeOpmodeOpbyte( iOpcode, iOpmode, nOpbytes );
|
||||
|
||||
while (nOpbytes--)
|
||||
{
|
||||
@ -3493,9 +3523,9 @@ void DisasmCalcTopFromCurAddress( bool bUpdateTop )
|
||||
for( int iLine = 0; iLine <= nLen; iLine++ ) // min 1 opcode/instruction
|
||||
{
|
||||
// a.
|
||||
_6502_GetOpmodeOpbytes( iAddress, iOpmode, nOpbytes );
|
||||
_6502_GetOpmodeOpbyte( iAddress, iOpmode, nOpbytes );
|
||||
// b.
|
||||
// _6502_GetOpcodeOpmodeOpbytes( iOpcode, iOpmode, nOpbytes );
|
||||
// _6502_GetOpcodeOpmodeOpbyte( iOpcode, iOpmode, nOpbytes );
|
||||
|
||||
if (iLine == g_nDisasmCurLine) // && (iAddress == g_nDisasmCurAddress))
|
||||
{
|
||||
@ -3563,7 +3593,7 @@ WORD DisasmCalcAddressFromLines( WORD iAddress, int nLines )
|
||||
{
|
||||
int iOpmode;
|
||||
int nOpbytes;
|
||||
_6502_GetOpmodeOpbytes( iAddress, iOpmode, nOpbytes );
|
||||
_6502_GetOpmodeOpbyte( iAddress, iOpmode, nOpbytes );
|
||||
iAddress += nOpbytes;
|
||||
}
|
||||
return iAddress;
|
||||
@ -3621,7 +3651,7 @@ Update_t CmdCursorLineDown (int nArgs)
|
||||
{
|
||||
int iOpmode;
|
||||
int nOpbytes;
|
||||
_6502_GetOpmodeOpbytes( g_nDisasmCurAddress, iOpmode, nOpbytes ); // g_nDisasmTopAddress
|
||||
_6502_GetOpmodeOpbyte( g_nDisasmCurAddress, iOpmode, nOpbytes ); // g_nDisasmTopAddress
|
||||
|
||||
if (g_iWindowThis == WINDOW_DATA)
|
||||
{
|
||||
@ -3665,10 +3695,10 @@ Update_t CmdCursorLineDown (int nArgs)
|
||||
#endif
|
||||
g_nDisasmCurAddress += nOpbytes;
|
||||
|
||||
_6502_GetOpmodeOpbytes( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
_6502_GetOpmodeOpbyte( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
g_nDisasmTopAddress += nOpbytes;
|
||||
|
||||
_6502_GetOpmodeOpbytes( g_nDisasmBotAddress, iOpmode, nOpbytes );
|
||||
_6502_GetOpmodeOpbyte( g_nDisasmBotAddress, iOpmode, nOpbytes );
|
||||
g_nDisasmBotAddress += nOpbytes;
|
||||
|
||||
if (g_bDisasmCurBad)
|
||||
@ -3768,8 +3798,8 @@ Update_t CmdCursorLineUp (int nArgs)
|
||||
{
|
||||
g_nDisasmTopAddress--;
|
||||
|
||||
// _6502_GetOpcodeOpmodeOpbytes( iOpcode, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbytes( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
// _6502_GetOpcodeOpmodeOpbyte( iOpcode, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
aOpBytes[ 1 ] = nOpbytes;
|
||||
|
||||
// Disasm is kept in sync. Maybe bad opcode, but if no other choices...
|
||||
@ -3785,7 +3815,7 @@ Update_t CmdCursorLineUp (int nArgs)
|
||||
g_nDisasmTopAddress--;
|
||||
DisasmCalcCurFromTopAddress();
|
||||
|
||||
iOpcode = _6502_GetOpmodeOpbytes( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
aOpBytes[ 2 ] = nOpbytes;
|
||||
|
||||
if ( (iOpmode == AM_1)
|
||||
@ -3797,7 +3827,7 @@ Update_t CmdCursorLineUp (int nArgs)
|
||||
g_nDisasmTopAddress--;
|
||||
DisasmCalcCurFromTopAddress();
|
||||
|
||||
iOpcode = _6502_GetOpmodeOpbytes( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( g_nDisasmTopAddress, iOpmode, nOpbytes );
|
||||
aOpBytes[ 3 ] = nOpbytes;
|
||||
|
||||
if ( (iOpmode == AM_1)
|
||||
@ -3840,14 +3870,14 @@ Update_t CmdCursorLineUp (int nArgs)
|
||||
|
||||
for (int iLine = 0; iLine < MAX_LOOK_AHEAD; iLine++ )
|
||||
{
|
||||
iOpcode = _6502_GetOpmodeOpbytes( nCur, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( nCur, iOpmode, nOpbytes );
|
||||
|
||||
// If address on iLine = g_nDisasmCurLine + 1
|
||||
if (iLine == (g_nDisasmCurLine + 1))
|
||||
{
|
||||
if (nCur == (g_nDisasmCurAddress))
|
||||
{
|
||||
iOpcode = _6502_GetOpmodeOpbytes( nTop, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( nTop, iOpmode, nOpbytes );
|
||||
|
||||
tCandidate._nAddress = nTop;
|
||||
tCandidate._iOpcode = iOpcode;
|
||||
@ -3988,8 +4018,8 @@ WORD _ClampAddress( int nAddress )
|
||||
{
|
||||
if (nAddress < 0)
|
||||
nAddress = 0;
|
||||
if (nAddress > 0xFFFF)
|
||||
nAddress = 0xFFFF;
|
||||
if (nAddress > _6502_MEM_END)
|
||||
nAddress = _6502_MEM_END;
|
||||
|
||||
return (WORD) nAddress;
|
||||
}
|
||||
@ -5626,7 +5656,7 @@ Update_t CmdOutputRun (int nArgs)
|
||||
// Source Level Debugging _________________________________________________________________________
|
||||
|
||||
//===========================================================================
|
||||
bool BufferAssemblyListing( TCHAR *pFileName )
|
||||
bool BufferAssemblyListing( char *pFileName )
|
||||
{
|
||||
bool bStatus = false; // true = loaded
|
||||
|
||||
@ -5997,13 +6027,13 @@ Update_t CmdSymbolsInfo (int nArgs)
|
||||
if (bDisplayMain && bDisplayUser && bDisplaySrc)
|
||||
{
|
||||
sprintf( sText, " Symbols Main: %s%d%s User: %s%d%s Source: %s%d%s"
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsMain
|
||||
, CHC_DEFAULT
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsUser
|
||||
, CHC_DEFAULT
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsSrc
|
||||
, CHC_DEFAULT
|
||||
);
|
||||
@ -6013,7 +6043,7 @@ Update_t CmdSymbolsInfo (int nArgs)
|
||||
if (bDisplayMain)
|
||||
{
|
||||
sprintf( sText, " Main symbols: %s%d%s"
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsMain
|
||||
, CHC_DEFAULT
|
||||
);
|
||||
@ -6023,7 +6053,7 @@ Update_t CmdSymbolsInfo (int nArgs)
|
||||
if (bDisplayUser)
|
||||
{
|
||||
sprintf( sText, " User symbols: %s%d%s"
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsUser
|
||||
, CHC_DEFAULT
|
||||
);
|
||||
@ -6033,7 +6063,7 @@ Update_t CmdSymbolsInfo (int nArgs)
|
||||
if (bDisplaySrc)
|
||||
{
|
||||
sprintf( sText, " Source symbols: %s%d%s"
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, nSymbolsSrc
|
||||
, CHC_DEFAULT
|
||||
);
|
||||
@ -6054,7 +6084,7 @@ void _CmdPrintSymbol( LPCTSTR pSymbol, WORD nAddress, int iTable )
|
||||
, CHC_ADDRESS
|
||||
, nAddress
|
||||
, CHC_DEFAULT
|
||||
, CHC_USAGE
|
||||
, CHC_STRING
|
||||
, g_aSymbolTableNames[ iTable ]
|
||||
, CHC_DEFAULT
|
||||
, CHC_SYMBOL
|
||||
@ -7259,11 +7289,20 @@ _Help:
|
||||
|
||||
}
|
||||
|
||||
Update_t _ZeroPage_Error()
|
||||
{
|
||||
// return ConsoleDisplayError( "There are no (ZP) pointers defined." );
|
||||
char sText[ CONSOLE_WIDTH ];
|
||||
sprintf( sText, " There are no current (ZP) pointers. (Max: %d)", MAX_ZEROPAGE_POINTERS );
|
||||
// ConsoleBufferPush( sText );
|
||||
return ConsoleDisplayError( sText );
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
Update_t CmdZeroPageClear (int nArgs)
|
||||
{
|
||||
if (!g_nBreakpoints)
|
||||
return ConsoleDisplayError(TEXT("There are no (ZP) pointers defined."));
|
||||
return _ZeroPage_Error();
|
||||
|
||||
// CHECK FOR ERRORS
|
||||
if (!nArgs)
|
||||
@ -7286,7 +7325,7 @@ Update_t CmdZeroPageDisable (int nArgs)
|
||||
if (!nArgs)
|
||||
return Help_Arg_1( CMD_ZEROPAGE_POINTER_DISABLE );
|
||||
if (! g_nZeroPagePointers)
|
||||
return ConsoleDisplayError(TEXT("There are no (ZP) pointers defined."));
|
||||
return _ZeroPage_Error();
|
||||
|
||||
_BWZ_EnableDisableViaArgs( nArgs, g_aZeroPagePointers, MAX_ZEROPAGE_POINTERS, false );
|
||||
|
||||
@ -7297,7 +7336,7 @@ Update_t CmdZeroPageDisable (int nArgs)
|
||||
Update_t CmdZeroPageEnable (int nArgs)
|
||||
{
|
||||
if (! g_nZeroPagePointers)
|
||||
return ConsoleDisplayError(TEXT("There are no (ZP) pointers defined."));
|
||||
return _ZeroPage_Error();
|
||||
|
||||
if (!nArgs)
|
||||
return Help_Arg_1( CMD_ZEROPAGE_POINTER_ENABLE );
|
||||
@ -7312,9 +7351,7 @@ Update_t CmdZeroPageList (int nArgs)
|
||||
{
|
||||
if (! g_nZeroPagePointers)
|
||||
{
|
||||
TCHAR sText[ CONSOLE_WIDTH ];
|
||||
wsprintf( sText, TEXT(" There are no current (ZP) pointers. (Max: %d)"), MAX_ZEROPAGE_POINTERS );
|
||||
ConsoleBufferPush( sText );
|
||||
_ZeroPage_Error();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -7504,7 +7541,7 @@ void DisplayAmbigiousCommands( int nFound )
|
||||
{
|
||||
char sText[ CONSOLE_WIDTH * 2 ];
|
||||
sprintf( sText, "Ambiguous %s%d%s Commands:"
|
||||
, CHC_NUMBER
|
||||
, CHC_NUM_DEC
|
||||
, g_vPotentialCommands.size()
|
||||
, CHC_DEFAULT
|
||||
);
|
||||
@ -7617,7 +7654,7 @@ Update_t ExecuteCommand (int nArgs)
|
||||
g_iCommand = CMD_MEMORY_ENTER_BYTE;
|
||||
|
||||
// replace: addr :
|
||||
// with: comamnd addr
|
||||
// with: command addr
|
||||
pArg[1] = pArg[0];
|
||||
|
||||
strcpy( pArg->sArg, g_aCommands[ g_iCommand ].m_sName );
|
||||
@ -7657,7 +7694,7 @@ Update_t ExecuteCommand (int nArgs)
|
||||
nArgsCooked = ArgsCook( nArgs ); // nCookMask
|
||||
|
||||
if (nArgsCooked == ARG_SYNTAX_ERROR)
|
||||
return ConsoleDisplayError(TEXT("Syntax Error"));
|
||||
return ConsoleDisplayError( "Syntax Error" );
|
||||
|
||||
if (pFunction)
|
||||
return pFunction( nArgsCooked ); // Eat them
|
||||
@ -7665,7 +7702,7 @@ Update_t ExecuteCommand (int nArgs)
|
||||
return UPDATE_CONSOLE_DISPLAY;
|
||||
}
|
||||
else
|
||||
return ConsoleDisplayError(TEXT("Illegal Command"));
|
||||
return ConsoleDisplayError( "Illegal Command" );
|
||||
}
|
||||
|
||||
|
||||
@ -7710,19 +7747,47 @@ bool InternalSingleStep ()
|
||||
//===========================================================================
|
||||
void OutputTraceLine ()
|
||||
{
|
||||
char sDisassembly[ CONSOLE_WIDTH ]; DrawDisassemblyLine( 0,regs.pc, sDisassembly); // Get Disasm String
|
||||
DisasmLine_t line;
|
||||
GetDisassemblyLine( regs.pc, line );
|
||||
|
||||
char sDisassembly[ CONSOLE_WIDTH ]; // DrawDisassemblyLine( 0,regs.pc, sDisassembly); // Get Disasm String
|
||||
FormatDisassemblyLine( line, sDisassembly, CONSOLE_WIDTH );
|
||||
|
||||
char sFlags[ _6502_NUM_FLAGS + 1 ]; DrawFlags( 0, regs.ps, sFlags ); // Get Flags String
|
||||
|
||||
// _ftprintf(g_hTraceFile,
|
||||
fprintf( g_hTraceFile,
|
||||
"a=%02x x=%02x y=%02x sp=%03x ps=%s %s\n",
|
||||
(unsigned)regs.a,
|
||||
(unsigned)regs.x,
|
||||
(unsigned)regs.y,
|
||||
(unsigned)regs.sp,
|
||||
(char*) sFlags,
|
||||
(char*) sDisassembly
|
||||
);
|
||||
if (g_hTraceFile)
|
||||
{
|
||||
if (g_bTraceHeader)
|
||||
{
|
||||
g_bTraceHeader = false;
|
||||
|
||||
fprintf( g_hTraceFile,
|
||||
// "00 00 00 0000-------- 0000:90 90 90 NOP"
|
||||
"A: X: Y: SP: Flags Addr:Opcode Mnemonic\n"
|
||||
);
|
||||
}
|
||||
|
||||
char sTarget[ 16 ];
|
||||
if (line.bTargetValue)
|
||||
{
|
||||
sprintf( sTarget, "%s:%s"
|
||||
, line.sTargetPointer
|
||||
, line.sTargetValue
|
||||
);
|
||||
}
|
||||
|
||||
fprintf( g_hTraceFile,
|
||||
// "a=%02x x=%02x y=%02x sp=%03x ps=%s %s\n",
|
||||
"%02X %02X %02X %04X %s %s\n",
|
||||
(unsigned)regs.a,
|
||||
(unsigned)regs.x,
|
||||
(unsigned)regs.y,
|
||||
(unsigned)regs.sp,
|
||||
(char*) sFlags
|
||||
, sDisassembly
|
||||
, sTarget
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
@ -7843,7 +7908,22 @@ void ProfileFormat( bool bExport, ProfileFormat_e eFormatMode )
|
||||
nOpcodeTotal = 1;
|
||||
bOpcodeGood = false;
|
||||
}
|
||||
|
||||
|
||||
char *pColorOperator = "";
|
||||
char *pColorNumber = "";
|
||||
char *pColorOpcode = "";
|
||||
char *pColorMnemonic = "";
|
||||
char *pColorOpmode = "";
|
||||
char *pColorTotal = "";
|
||||
if (! bExport)
|
||||
{
|
||||
pColorOperator = CHC_ARG_SEP; // grey
|
||||
pColorNumber = CHC_NUM_DEC; // cyan
|
||||
pColorOpcode = CHC_NUM_HEX; // yellow
|
||||
pColorMnemonic = CHC_COMMAND; // green
|
||||
pColorOpmode = CHC_USAGE ; // yellow
|
||||
pColorTotal = CHC_DEFAULT; // white
|
||||
}
|
||||
|
||||
// Opcode
|
||||
if (bExport) // Export = SeperateColumns
|
||||
@ -7897,11 +7977,18 @@ void ProfileFormat( bool bExport, ProfileFormat_e eFormatMode )
|
||||
|
||||
// BUG: Yeah 100% is off by 1 char. Profiling only one opcode isn't worth fixing this visual alignment bug.
|
||||
sprintf( pText,
|
||||
"%7.4f%%" DELIM "%9u" DELIM "%s" DELIM "%s" DELIM "%s\n"
|
||||
, nPercent, sSeperator2
|
||||
"%s%7.4f%s%%" DELIM "%s%9u" DELIM "%s%s" DELIM "%s%s" DELIM "%s%s\n"
|
||||
, pColorNumber
|
||||
, nPercent
|
||||
, pColorOperator
|
||||
, sSeperator2
|
||||
, pColorNumber
|
||||
, static_cast<unsigned int>(nCount), sSeperator2
|
||||
, pColorOpcode
|
||||
, sOpcode, sSeperator2
|
||||
, pColorMnemonic
|
||||
, g_aOpcodes[ nOpcode ].sMnemonic, sSeperator2
|
||||
, pColorOpmode
|
||||
, sAddress
|
||||
);
|
||||
pText = ProfileLinePush();
|
||||
@ -7911,8 +7998,9 @@ void ProfileFormat( bool bExport, ProfileFormat_e eFormatMode )
|
||||
nOpcodeTotal = 0;
|
||||
|
||||
sprintf( pText
|
||||
, "Total: " DELIM "%9u\n"
|
||||
, "Total: " DELIM "%s%9u\n"
|
||||
, sSeperator2
|
||||
, pColorTotal
|
||||
, static_cast<unsigned int>(nOpcodeTotal) );
|
||||
pText = ProfileLinePush();
|
||||
|
||||
@ -7964,9 +8052,14 @@ void ProfileFormat( bool bExport, ProfileFormat_e eFormatMode )
|
||||
|
||||
// BUG: Yeah 100% is off by 1 char. Profiling only one opcode isn't worth fixing this visual alignment bug.
|
||||
sprintf( pText
|
||||
, "%7.4f%%" DELIM "%9u" DELIM "%s\n"
|
||||
, nPercent, sSeperator2
|
||||
, "%s%7.4f%s%%" DELIM "%s%9u" DELIM "%s%s\n"
|
||||
, pColorNumber
|
||||
, nPercent
|
||||
, pColorOperator
|
||||
, sSeperator2
|
||||
, pColorNumber
|
||||
, static_cast<unsigned int>(nCount), sSeperator2
|
||||
, pColorOpmode
|
||||
, sAddress
|
||||
);
|
||||
pText = ProfileLinePush();
|
||||
@ -7976,8 +8069,9 @@ void ProfileFormat( bool bExport, ProfileFormat_e eFormatMode )
|
||||
nOpmodeTotal = 0;
|
||||
|
||||
sprintf( pText
|
||||
, "Total: " DELIM "%9u\n"
|
||||
, "Total: " DELIM "%s%9u\n"
|
||||
, sSeperator2
|
||||
, pColorTotal
|
||||
, static_cast<unsigned int>(nOpmodeTotal) );
|
||||
pText = ProfileLinePush();
|
||||
|
||||
@ -8012,11 +8106,11 @@ bool ProfileSave()
|
||||
{
|
||||
bool bStatus = false;
|
||||
|
||||
TCHAR filename[MAX_PATH];
|
||||
_tcscpy(filename,g_sProgramDir);
|
||||
_tcscat(filename,g_FileNameProfile ); // TEXT("Profile.txt")); // =PATCH MJP
|
||||
char sFilename[MAX_PATH];
|
||||
strcpy( sFilename, g_sProgramDir ); // TODO: Allow user to decide?
|
||||
strcat( sFilename, g_FileNameProfile );
|
||||
|
||||
FILE *hFile = fopen(filename,TEXT("wt"));
|
||||
FILE *hFile = fopen( sFilename, "wt" );
|
||||
|
||||
if (hFile)
|
||||
{
|
||||
|
@ -402,7 +402,7 @@ bool _6502_CalcRelativeOffset( int nOpcode, int nBaseAddress, int nTargetAddress
|
||||
|
||||
|
||||
//===========================================================================
|
||||
int _6502_GetOpmodeOpbytes ( const int iAddress, int & iOpmode_, int & nOpbytes_ )
|
||||
int _6502_GetOpmodeOpbyte ( const int iAddress, int & iOpmode_, int & nOpbyte_ )
|
||||
{
|
||||
#if _DEBUG
|
||||
if (! g_aOpcodes)
|
||||
@ -411,9 +411,9 @@ int _6502_GetOpmodeOpbytes ( const int iAddress, int & iOpmode_, int & nOpbytes
|
||||
}
|
||||
#endif
|
||||
|
||||
int iOpcode_ = *(mem + iAddress);
|
||||
iOpmode_ = g_aOpcodes[ iOpcode_ ].nAddressMode;
|
||||
nOpbytes_ = g_aOpmodes[ iOpmode_ ].m_nBytes;
|
||||
int iOpcode_ = *(mem + iAddress);
|
||||
iOpmode_ = g_aOpcodes[ iOpcode_ ].nAddressMode;
|
||||
nOpbyte_ = g_aOpmodes[ iOpmode_ ].m_nBytes;
|
||||
|
||||
#if _DEBUG
|
||||
if (iOpcode_ >= NUM_OPCODES)
|
||||
@ -427,9 +427,9 @@ int _6502_GetOpmodeOpbytes ( const int iAddress, int & iOpmode_, int & nOpbytes
|
||||
|
||||
|
||||
//===========================================================================
|
||||
void _6502_GetOpcodeOpmodeOpbytes ( int & iOpcode_, int & iOpmode_, int & nOpbytes_ )
|
||||
void _6502_GetOpcodeOpmodeOpbyte ( int & iOpcode_, int & iOpmode_, int & nOpbyte_ )
|
||||
{
|
||||
iOpcode_ = _6502_GetOpmodeOpbytes( regs.pc, iOpmode_, nOpbytes_ );
|
||||
iOpcode_ = _6502_GetOpmodeOpbyte( regs.pc, iOpmode_, nOpbyte_ );
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
@ -606,7 +606,7 @@ bool _6502_GetTargetAddress ( const WORD & nAddress, WORD & nTarget_ )
|
||||
int iOpcode;
|
||||
int iOpmode;
|
||||
int nOpbytes;
|
||||
iOpcode = _6502_GetOpmodeOpbytes( nAddress, iOpmode, nOpbytes );
|
||||
iOpcode = _6502_GetOpmodeOpbyte( nAddress, iOpmode, nOpbytes );
|
||||
|
||||
// Composite string that has the target nAddress
|
||||
// WORD nTarget = 0;
|
||||
|
@ -41,9 +41,9 @@
|
||||
|
||||
// Prototypes _______________________________________________________________
|
||||
|
||||
int _6502_GetOpmodeOpbytes( const int iAddress, int & iOpmode_, int & nOpbytes_ );
|
||||
int _6502_GetOpmodeOpbyte( const int iAddress, int & iOpmode_, int & nOpbytes_ );
|
||||
// void _6502_GetOpcodeOpmode( int & iOpcode_, int & iOpmode_, int & nOpbytes_ );
|
||||
void _6502_GetOpcodeOpmodeOpbytes( int & iOpcode_, int & iOpmode_, int & nOpbytes_ );
|
||||
void _6502_GetOpcodeOpmodeOpbyte( int & iOpcode_, int & iOpmode_, int & nOpbytes_ );
|
||||
bool _6502_GetStackReturnAddress( WORD & nAddress_ );
|
||||
bool _6502_GetTargets( WORD nAddress, int *pTargetPartial_, int *pTargetPointer_, int * pBytes_
|
||||
, const bool bIgnoreJSRJMP = true, bool bIgnoreBranch = true );
|
||||
|
@ -53,7 +53,8 @@
|
||||
#define CHC_ARG_MAND "`7" // < >
|
||||
#define CHC_ARG_OPT "`4" // [ ]
|
||||
#define CHC_ARG_SEP "`9" // | grey
|
||||
#define CHC_NUMBER "`3"
|
||||
#define CHC_NUM_DEC "`6" // cyan looks better then yellow
|
||||
#define CHC_NUM_HEX "`3"
|
||||
#define CHC_SYMBOL "`2"
|
||||
#define CHC_ADDRESS "`8"
|
||||
#define CHC_ERROR "`1"
|
||||
|
@ -182,12 +182,6 @@ static char ColorizeSpecialChar( char * sText, BYTE nData, const MemoryView_e iV
|
||||
const int iLowBackground = BG_INFO_CHAR, const int iLowForeground = FG_INFO_CHAR_LO );
|
||||
|
||||
char FormatCharTxtAsci ( const BYTE b, bool * pWasAsci_ );
|
||||
int FormatDisassemblyLine( WORD nOffset, int iOpcode, int iOpmode, int nOpbytes,
|
||||
char *sAddress_, char *sOpCodes_,
|
||||
char *sTarget_, char *sTargetOffset_, int & nTargetOffset_, char *sTargetValue_,
|
||||
char * sImmediate_, char & nImmediate_, char *sBranch_ );
|
||||
|
||||
|
||||
|
||||
void DrawSubWindow_Code ( int iWindow );
|
||||
void DrawSubWindow_IO (Update_t bUpdate);
|
||||
@ -819,212 +813,6 @@ char FormatChar4Font ( const BYTE b, bool *pWasHi_, bool *pWasLo_ )
|
||||
}
|
||||
|
||||
|
||||
// Disassembly formatting flags returned
|
||||
// @parama sTargetValue_ indirect/indexed final value
|
||||
//===========================================================================
|
||||
int FormatDisassemblyLine( WORD nBaseAddress, int iOpcode, int iOpmode, int nOpBytes,
|
||||
char *sAddress_, char *sOpCodes_,
|
||||
char *sTarget_, char *sTargetOffset_, int & nTargetOffset_,
|
||||
char *sTargetPointer_, char *sTargetValue_,
|
||||
char *sImmediate_, char & nImmediate_, char *sBranch_ )
|
||||
{
|
||||
const int nMaxOpcodes = 3;
|
||||
unsigned int nMinBytesLen = (nMaxOpcodes * (2 + g_bConfigDisasmOpcodeSpaces)); // 2 char for byte (or 3 with space)
|
||||
|
||||
int bDisasmFormatFlags = 0;
|
||||
|
||||
// Composite string that has the symbol or target nAddress
|
||||
WORD nTarget = 0;
|
||||
nTargetOffset_ = 0;
|
||||
|
||||
// if (g_aOpmodes[ iMode ]._sFormat[0])
|
||||
if ((iOpmode != AM_IMPLIED) &&
|
||||
(iOpmode != AM_1) &&
|
||||
(iOpmode != AM_2) &&
|
||||
(iOpmode != AM_3))
|
||||
{
|
||||
nTarget = *(LPWORD)(mem+nBaseAddress+1);
|
||||
if (nOpBytes == 2)
|
||||
nTarget &= 0xFF;
|
||||
|
||||
if (iOpmode == AM_R) // Relative ADDR_REL)
|
||||
{
|
||||
nTarget = nBaseAddress+2+(int)(signed char)nTarget;
|
||||
|
||||
// Always show branch indicators
|
||||
// if ((nBaseAddress == regs.pc) && CheckJump(nAddress))
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_BRANCH;
|
||||
|
||||
if (nTarget < nBaseAddress)
|
||||
{
|
||||
sprintf( sBranch_, "%s", g_sConfigBranchIndicatorUp[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
else
|
||||
if (nTarget > nBaseAddress)
|
||||
{
|
||||
sprintf( sBranch_, "%s", g_sConfigBranchIndicatorDown[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( sBranch_, "%s", g_sConfigBranchIndicatorEqual[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
}
|
||||
|
||||
// if (strstr(g_aOpmodes[ iOpmode ]._sFormat,"%s"))
|
||||
// if ((iOpmode >= ADDR_ABS) && (iOpmode <= ADDR_IABS))
|
||||
if ((iOpmode == AM_A ) || // Absolute
|
||||
(iOpmode == AM_Z ) || // Zeropage
|
||||
(iOpmode == AM_AX ) || // Absolute, X
|
||||
(iOpmode == AM_AY ) || // Absolute, Y
|
||||
(iOpmode == AM_ZX ) || // Zeropage, X
|
||||
(iOpmode == AM_ZY ) || // Zeropage, Y
|
||||
(iOpmode == AM_R ) || // Relative
|
||||
(iOpmode == AM_IZX) || // Indexed (Zeropage Indirect, X)
|
||||
(iOpmode == AM_IAX) || // Indexed (Absolute Indirect, X)
|
||||
(iOpmode == AM_NZY) || // Indirect (Zeropage) Index, Y
|
||||
(iOpmode == AM_NZ ) || // Indirect (Zeropage)
|
||||
(iOpmode == AM_NA )) // Indirect Absolute
|
||||
{
|
||||
LPCTSTR pTarget = NULL;
|
||||
LPCTSTR pSymbol = FindSymbolFromAddress( nTarget );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
pTarget = pSymbol;
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pSymbol = FindSymbolFromAddress( nTarget - 1 );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_OFFSET;
|
||||
pTarget = pSymbol;
|
||||
nTargetOffset_ = +1; // U FA82 LDA #3F1 BREAK+1
|
||||
}
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pSymbol = FindSymbolFromAddress( nTarget + 1 );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_OFFSET;
|
||||
pTarget = pSymbol;
|
||||
nTargetOffset_ = -1; // U FA82 LDA #3F3 BREAK-1
|
||||
}
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pTarget = FormatAddress( nTarget, nOpBytes );
|
||||
}
|
||||
|
||||
// sprintf( sTarget, g_aOpmodes[ iOpmode ]._sFormat, pTarget );
|
||||
if (bDisasmFormatFlags & DISASM_FORMAT_OFFSET)
|
||||
{
|
||||
int nAbsTargetOffset = (nTargetOffset_ > 0) ? nTargetOffset_ : -nTargetOffset_;
|
||||
sprintf( sTargetOffset_, "%d", nAbsTargetOffset );
|
||||
}
|
||||
sprintf( sTarget_, "%s", pTarget );
|
||||
|
||||
|
||||
// Indirect / Indexed
|
||||
int nTargetPartial;
|
||||
int nTargetPointer;
|
||||
WORD nTargetValue = 0; // de-ref
|
||||
int nTargetBytes;
|
||||
_6502_GetTargets( nBaseAddress, &nTargetPartial, &nTargetPointer, &nTargetBytes );
|
||||
|
||||
if (nTargetPointer != NO_6502_TARGET)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_TARGET_POINTER;
|
||||
|
||||
nTargetValue = *(LPWORD)(mem+nTargetPointer);
|
||||
|
||||
// if (((iOpmode >= AM_A) && (iOpmode <= AM_NZ)) && (iOpmode != AM_R))
|
||||
// nTargetBytes refers to size of pointer, not size of value
|
||||
// sprintf( sTargetValue_, "%04X", nTargetValue ); // & 0xFFFF
|
||||
|
||||
if (g_iConfigDisasmTargets & DISASM_TARGET_ADDR)
|
||||
sprintf( sTargetPointer_, "%04X", nTargetPointer & 0xFFFF );
|
||||
|
||||
if (iOpmode != AM_NA ) // Indirect Absolute
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_TARGET_VALUE;
|
||||
if (g_iConfigDisasmTargets & DISASM_TARGET_VAL)
|
||||
sprintf( sTargetValue_, "%02X", nTargetValue & 0xFF );
|
||||
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_CHAR;
|
||||
nImmediate_ = (BYTE) nTargetValue;
|
||||
|
||||
unsigned _char = FormatCharTxtCtrl( FormatCharTxtHigh( nImmediate_, NULL ), NULL );
|
||||
sprintf( sImmediate_, "%c", _char );
|
||||
|
||||
// if (ConsoleColorIsEscapeMeta( nImmediate_ ))
|
||||
#if OLD_CONSOLE_COLOR
|
||||
if (ConsoleColorIsEscapeMeta( _char ))
|
||||
sprintf( sImmediate_, "%c%c", _char, _char );
|
||||
else
|
||||
sprintf( sImmediate_, "%c", _char );
|
||||
#endif
|
||||
}
|
||||
|
||||
// if (iOpmode == AM_NA ) // Indirect Absolute
|
||||
// sprintf( sTargetValue_, "%04X", nTargetPointer & 0xFFFF );
|
||||
// else
|
||||
// // sprintf( sTargetValue_, "%02X", nTargetValue & 0xFF );
|
||||
// sprintf( sTargetValue_, "%04X:%02X", nTargetPointer & 0xFFFF, nTargetValue & 0xFF );
|
||||
}
|
||||
}
|
||||
else
|
||||
if (iOpmode == AM_M)
|
||||
{
|
||||
// sprintf( sTarget, g_aOpmodes[ iOpmode ]._sFormat, (unsigned)nTarget );
|
||||
sprintf( sTarget_, "%02X", (unsigned)nTarget );
|
||||
|
||||
if (iOpmode == AM_M)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_CHAR;
|
||||
nImmediate_ = (BYTE) nTarget;
|
||||
unsigned _char = FormatCharTxtCtrl( FormatCharTxtHigh( nImmediate_, NULL ), NULL );
|
||||
|
||||
sprintf( sImmediate_, "%c", _char );
|
||||
#if OLD_CONSOLE_COLOR
|
||||
if (ConsoleColorIsEscapeMeta( _char ))
|
||||
sprintf( sImmediate_, "%c%c", _char, _char );
|
||||
else
|
||||
sprintf( sImmediate_, "%c", _char );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sprintf( sAddress_, "%04X", nBaseAddress );
|
||||
|
||||
// Opcode Bytes
|
||||
char *pDst = sOpCodes_;
|
||||
for( int iBytes = 0; iBytes < nOpBytes; iBytes++ )
|
||||
{
|
||||
BYTE nMem = (unsigned)*(mem+nBaseAddress+iBytes);
|
||||
sprintf( pDst, "%02X", nMem ); // sBytes+strlen(sBytes)
|
||||
pDst += 2;
|
||||
|
||||
if (g_bConfigDisasmOpcodeSpaces)
|
||||
{
|
||||
strcat( pDst, " " );
|
||||
pDst++; // 2.5.3.3 fix
|
||||
}
|
||||
}
|
||||
while (strlen(sOpCodes_) < nMinBytesLen)
|
||||
{
|
||||
strcat( sOpCodes_, " " );
|
||||
}
|
||||
|
||||
return bDisasmFormatFlags;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
@ -1412,60 +1200,338 @@ void DrawConsoleInput ()
|
||||
// Disassembly ____________________________________________________________________________________
|
||||
|
||||
|
||||
// Disassembly formatting flags returned
|
||||
// @parama sTargetValue_ indirect/indexed final value
|
||||
//===========================================================================
|
||||
WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
int GetDisassemblyLine( WORD nBaseAddress, DisasmLine_t & line_ )
|
||||
// char *sAddress_, char *sOpCodes_,
|
||||
// char *sTarget_, char *sTargetOffset_, int & nTargetOffset_,
|
||||
// char *sTargetPointer_, char *sTargetValue_,
|
||||
// char *sImmediate_, char & nImmediate_, char *sBranch_ )
|
||||
{
|
||||
if (! ((g_iWindowThis == WINDOW_CODE) || ((g_iWindowThis == WINDOW_DATA))))
|
||||
return 0;
|
||||
|
||||
const int nMaxAddressLen = 40;
|
||||
const int nMaxOpcodes = 3;
|
||||
line_.Clear();
|
||||
|
||||
int iOpcode;
|
||||
int iOpmode;
|
||||
int nOpbytes;
|
||||
iOpcode = _6502_GetOpmodeOpbytes( nBaseAddress, iOpmode, nOpbytes );
|
||||
int nOpbyte;
|
||||
|
||||
iOpcode = _6502_GetOpmodeOpbyte( nBaseAddress, iOpmode, nOpbyte );
|
||||
|
||||
line_.iOpcode = iOpcode;
|
||||
line_.iOpmode = iOpmode;
|
||||
line_.nOpbyte = nOpbyte;
|
||||
|
||||
|
||||
#if _DEBUG
|
||||
// if (iLine != 41)
|
||||
// return nOpbytes;
|
||||
#endif
|
||||
|
||||
const int CHARS_FOR_ADDRESS = 8; // 4 digits plus null
|
||||
|
||||
char sAddress [ CHARS_FOR_ADDRESS ];
|
||||
char sOpcodes [(nMaxOpcodes*3)+1] = "";
|
||||
char sTarget [nMaxAddressLen] = "";
|
||||
|
||||
char sTargetOffset[ CHARS_FOR_ADDRESS ] = ""; // +/- 255, realistically +/-1
|
||||
int nTargetOffset;
|
||||
|
||||
char sTargetPointer[ CHARS_FOR_ADDRESS ] = "";
|
||||
char sTargetValue [ CHARS_FOR_ADDRESS ] = "";
|
||||
|
||||
char nImmediate = 0;
|
||||
char sImmediate[ 4 ]; // 'c'
|
||||
char sBranch [ 4 ]; // ^
|
||||
|
||||
bool bTargetIndirect = false;
|
||||
bool bTargetX = false;
|
||||
bool bTargetY = false; // need to dislay ",Y"
|
||||
bool bTargetValue = false;
|
||||
if (iOpmode == AM_M)
|
||||
line_.bTargetImmediate = true;
|
||||
|
||||
if ((iOpmode >= AM_IZX) && (iOpmode <= AM_NA))
|
||||
bTargetIndirect = true;
|
||||
line_.bTargetIndirect = true; // ()
|
||||
|
||||
if (((iOpmode >= AM_A) && (iOpmode <= AM_ZY)) || bTargetIndirect)
|
||||
bTargetValue = true;
|
||||
if ((iOpmode >= AM_IZX) && (iOpmode <= AM_NZY))
|
||||
line_.bTargetIndexed = true; // ()
|
||||
|
||||
if (((iOpmode >= AM_A) && (iOpmode <= AM_ZY)) || line_.bTargetIndirect)
|
||||
line_.bTargetValue = true; // #$
|
||||
|
||||
if ((iOpmode == AM_AX) || (iOpmode == AM_ZX) || (iOpmode == AM_IZX) || (iOpmode == AM_IAX))
|
||||
bTargetX = true;
|
||||
line_.bTargetX = true; // ,X
|
||||
|
||||
if ((iOpmode == AM_AY) || (iOpmode == AM_ZY)) // Note: AM_NZY is checked and triggered by bTargetIndirect
|
||||
bTargetY = true;
|
||||
if ((iOpmode == AM_AY) || (iOpmode == AM_ZY) || (iOpmode == AM_NZY))
|
||||
line_.bTargetY = true; // ,Y
|
||||
|
||||
int bDisasmFormatFlags = FormatDisassemblyLine( nBaseAddress, iOpcode, iOpmode, nOpbytes,
|
||||
sAddress, sOpcodes, sTarget, sTargetOffset, nTargetOffset, sTargetPointer, sTargetValue, sImmediate, nImmediate, sBranch );
|
||||
const int nMaxOpcodes = 3;
|
||||
unsigned int nMinBytesLen = (nMaxOpcodes * (2 + g_bConfigDisasmOpcodeSpaces)); // 2 char for byte (or 3 with space)
|
||||
|
||||
int bDisasmFormatFlags = 0;
|
||||
|
||||
// Composite string that has the symbol or target nAddress
|
||||
WORD nTarget = 0;
|
||||
line_.nTargetOffset = 0;
|
||||
|
||||
// if (g_aOpmodes[ iMode ]._sFormat[0])
|
||||
if ((iOpmode != AM_IMPLIED) &&
|
||||
(iOpmode != AM_1) &&
|
||||
(iOpmode != AM_2) &&
|
||||
(iOpmode != AM_3))
|
||||
{
|
||||
nTarget = *(LPWORD)(mem+nBaseAddress+1);
|
||||
if (nOpbyte == 2)
|
||||
nTarget &= 0xFF;
|
||||
|
||||
if (iOpmode == AM_R) // Relative ADDR_REL)
|
||||
{
|
||||
line_.bTargetRelative = true;
|
||||
|
||||
nTarget = nBaseAddress+2+(int)(signed char)nTarget;
|
||||
|
||||
line_.nTarget = nTarget;
|
||||
sprintf( line_.sTargetValue, "%04X", nTarget & 0xFFFF );
|
||||
|
||||
// Always show branch indicators
|
||||
// if ((nBaseAddress == regs.pc) && CheckJump(nAddress))
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_BRANCH;
|
||||
|
||||
if (nTarget < nBaseAddress)
|
||||
{
|
||||
sprintf( line_.sBranch, "%s", g_sConfigBranchIndicatorUp[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
else
|
||||
if (nTarget > nBaseAddress)
|
||||
{
|
||||
sprintf( line_.sBranch, "%s", g_sConfigBranchIndicatorDown[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( line_.sBranch, "%s", g_sConfigBranchIndicatorEqual[ g_iConfigDisasmBranchType ] );
|
||||
}
|
||||
}
|
||||
|
||||
// if (strstr(g_aOpmodes[ iOpmode ]._sFormat,"%s"))
|
||||
// if ((iOpmode >= ADDR_ABS) && (iOpmode <= ADDR_IABS))
|
||||
if ((iOpmode == AM_A ) || // Absolute
|
||||
(iOpmode == AM_Z ) || // Zeropage
|
||||
(iOpmode == AM_AX ) || // Absolute, X
|
||||
(iOpmode == AM_AY ) || // Absolute, Y
|
||||
(iOpmode == AM_ZX ) || // Zeropage, X
|
||||
(iOpmode == AM_ZY ) || // Zeropage, Y
|
||||
(iOpmode == AM_R ) || // Relative
|
||||
(iOpmode == AM_IZX) || // Indexed (Zeropage Indirect, X)
|
||||
(iOpmode == AM_IAX) || // Indexed (Absolute Indirect, X)
|
||||
(iOpmode == AM_NZY) || // Indirect (Zeropage) Index, Y
|
||||
(iOpmode == AM_NZ ) || // Indirect (Zeropage)
|
||||
(iOpmode == AM_NA )) // Indirect Absolute
|
||||
{
|
||||
line_.nTarget = nTarget;
|
||||
|
||||
LPCTSTR pTarget = NULL;
|
||||
LPCTSTR pSymbol = FindSymbolFromAddress( nTarget );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
pTarget = pSymbol;
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pSymbol = FindSymbolFromAddress( nTarget - 1 );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_OFFSET;
|
||||
pTarget = pSymbol;
|
||||
line_.nTargetOffset = +1; // U FA82 LDA #3F1 BREAK+1
|
||||
}
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pSymbol = FindSymbolFromAddress( nTarget + 1 );
|
||||
if (pSymbol)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_SYMBOL;
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_OFFSET;
|
||||
pTarget = pSymbol;
|
||||
line_.nTargetOffset = -1; // U FA82 LDA #3F3 BREAK-1
|
||||
}
|
||||
}
|
||||
|
||||
if (! (bDisasmFormatFlags & DISASM_FORMAT_SYMBOL))
|
||||
{
|
||||
pTarget = FormatAddress( nTarget, nOpbyte );
|
||||
}
|
||||
|
||||
// sprintf( sTarget, g_aOpmodes[ iOpmode ]._sFormat, pTarget );
|
||||
if (bDisasmFormatFlags & DISASM_FORMAT_OFFSET)
|
||||
{
|
||||
int nAbsTargetOffset = (line_.nTargetOffset > 0) ? line_.nTargetOffset : - line_.nTargetOffset;
|
||||
sprintf( line_.sTargetOffset, "%d", nAbsTargetOffset );
|
||||
}
|
||||
sprintf( line_.sTarget, "%s", pTarget );
|
||||
|
||||
|
||||
// Indirect / Indexed
|
||||
int nTargetPartial;
|
||||
int nTargetPointer;
|
||||
WORD nTargetValue = 0; // de-ref
|
||||
int nTargetBytes;
|
||||
_6502_GetTargets( nBaseAddress, &nTargetPartial, &nTargetPointer, &nTargetBytes );
|
||||
|
||||
if (nTargetPointer != NO_6502_TARGET)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_TARGET_POINTER;
|
||||
|
||||
nTargetValue = *(LPWORD)(mem+nTargetPointer);
|
||||
|
||||
// if (((iOpmode >= AM_A) && (iOpmode <= AM_NZ)) && (iOpmode != AM_R))
|
||||
// nTargetBytes refers to size of pointer, not size of value
|
||||
// sprintf( sTargetValue_, "%04X", nTargetValue ); // & 0xFFFF
|
||||
|
||||
if (g_iConfigDisasmTargets & DISASM_TARGET_ADDR)
|
||||
sprintf( line_.sTargetPointer, "%04X", nTargetPointer & 0xFFFF );
|
||||
|
||||
if (iOpmode != AM_NA ) // Indirect Absolute
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_TARGET_VALUE;
|
||||
if (g_iConfigDisasmTargets & DISASM_TARGET_VAL)
|
||||
sprintf( line_.sTargetValue, "%02X", nTargetValue & 0xFF );
|
||||
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_CHAR;
|
||||
line_.nImmediate = (BYTE) nTargetValue;
|
||||
|
||||
unsigned _char = FormatCharTxtCtrl( FormatCharTxtHigh( line_.nImmediate, NULL ), NULL );
|
||||
sprintf( line_.sImmediate, "%c", _char );
|
||||
|
||||
// if (ConsoleColorIsEscapeMeta( nImmediate_ ))
|
||||
#if OLD_CONSOLE_COLOR
|
||||
if (ConsoleColorIsEscapeMeta( _char ))
|
||||
sprintf( line_.sImmediate, "%c%c", _char, _char );
|
||||
else
|
||||
sprintf( line_.sImmediate, "%c", _char );
|
||||
#endif
|
||||
}
|
||||
|
||||
// if (iOpmode == AM_NA ) // Indirect Absolute
|
||||
// sprintf( sTargetValue_, "%04X", nTargetPointer & 0xFFFF );
|
||||
// else
|
||||
// // sprintf( sTargetValue_, "%02X", nTargetValue & 0xFF );
|
||||
// sprintf( sTargetValue_, "%04X:%02X", nTargetPointer & 0xFFFF, nTargetValue & 0xFF );
|
||||
}
|
||||
}
|
||||
else
|
||||
if (iOpmode == AM_M)
|
||||
{
|
||||
// sprintf( sTarget, g_aOpmodes[ iOpmode ]._sFormat, (unsigned)nTarget );
|
||||
sprintf( line_.sTarget, "%02X", (unsigned)nTarget );
|
||||
|
||||
if (iOpmode == AM_M)
|
||||
{
|
||||
bDisasmFormatFlags |= DISASM_FORMAT_CHAR;
|
||||
line_.nImmediate = (BYTE) nTarget;
|
||||
unsigned _char = FormatCharTxtCtrl( FormatCharTxtHigh( line_.nImmediate, NULL ), NULL );
|
||||
|
||||
sprintf( line_.sImmediate, "%c", _char );
|
||||
#if OLD_CONSOLE_COLOR
|
||||
if (ConsoleColorIsEscapeMeta( _char ))
|
||||
sprintf( line_.sImmediate, "%c%c", _char, _char );
|
||||
else
|
||||
sprintf( line_.sImmediate, "%c", _char );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sprintf( line_.sAddress, "%04X", nBaseAddress );
|
||||
|
||||
// Opcode Bytes
|
||||
char *pDst = line_.sOpCodes;
|
||||
for( int iByte = 0; iByte < nOpbyte; iByte++ )
|
||||
{
|
||||
BYTE nMem = (unsigned)*(mem+nBaseAddress + iByte);
|
||||
sprintf( pDst, "%02X", nMem ); // sBytes+strlen(sBytes)
|
||||
pDst += 2;
|
||||
|
||||
if (g_bConfigDisasmOpcodeSpaces)
|
||||
{
|
||||
strcat( pDst, " " );
|
||||
pDst++; // 2.5.3.3 fix
|
||||
}
|
||||
}
|
||||
|
||||
int nSpaces = strlen( line_.sOpCodes );
|
||||
while (nSpaces < nMinBytesLen)
|
||||
{
|
||||
strcat( line_.sOpCodes, " " );
|
||||
nSpaces++;
|
||||
}
|
||||
|
||||
return bDisasmFormatFlags;
|
||||
}
|
||||
|
||||
void FormatDisassemblyLine( const DisasmLine_t & line, char * sDisassembly, const int nBufferSize )
|
||||
{
|
||||
//> Address Seperator Opcodes Label Mnemonic Target [Immediate] [Branch]
|
||||
const char * pMnemonic = g_aOpcodes[ line.iOpcode ].sMnemonic;
|
||||
|
||||
sprintf( sDisassembly, "%s:%s %s "
|
||||
, line.sAddress
|
||||
, line.sOpCodes
|
||||
, pMnemonic
|
||||
);
|
||||
|
||||
/*
|
||||
if (line.bTargetIndexed || line.bTargetIndirect)
|
||||
{
|
||||
strcat( sDisassembly, "(" );
|
||||
}
|
||||
|
||||
if (line.bTargetImmediate)
|
||||
strcat( sDisassembly, "#$" );
|
||||
|
||||
if (line.bTargetValue)
|
||||
strcat( sDisassembly, line.sTarget );
|
||||
|
||||
if (line.bTargetIndirect)
|
||||
{
|
||||
if (line.bTargetX)
|
||||
strcat( sDisassembly, ", X" );
|
||||
if (line.bTargetY)
|
||||
strcat( sDisassembly, ", Y" );
|
||||
}
|
||||
|
||||
if (line.bTargetIndexed || line.bTargetIndirect)
|
||||
{
|
||||
strcat( sDisassembly, ")" );
|
||||
}
|
||||
|
||||
if (line.bTargetIndirect)
|
||||
{
|
||||
if (line.bTargetY)
|
||||
strcat( sDisassembly, ", Y" );
|
||||
}
|
||||
*/
|
||||
char sTarget[ 32 ];
|
||||
|
||||
if (line.bTargetValue || line.bTargetRelative || line.bTargetImmediate)
|
||||
{
|
||||
if (line.bTargetRelative)
|
||||
strcpy( sTarget, line.sTargetValue );
|
||||
else
|
||||
if (line.bTargetImmediate)
|
||||
{
|
||||
strcat( sDisassembly, "#" );
|
||||
strcpy( sTarget, line.sTarget ); // sTarget
|
||||
}
|
||||
else
|
||||
sprintf( sTarget, g_aOpmodes[ line.iOpmode ].m_sFormat, line.nTarget );
|
||||
|
||||
strcat( sDisassembly, "$" );
|
||||
strcat( sDisassembly, sTarget );
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
WORD DrawDisassemblyLine ( int iLine, const WORD nBaseAddress )
|
||||
{
|
||||
if (! ((g_iWindowThis == WINDOW_CODE) || ((g_iWindowThis == WINDOW_DATA))))
|
||||
return 0;
|
||||
|
||||
int iOpcode;
|
||||
int iOpmode;
|
||||
int nOpbyte;
|
||||
DisasmLine_t line;
|
||||
|
||||
int bDisasmFormatFlags = GetDisassemblyLine( nBaseAddress, line );
|
||||
iOpcode = line.iOpcode;
|
||||
iOpmode = line.iOpmode;
|
||||
nOpbyte = line.nOpbyte;
|
||||
|
||||
// sAddress, sOpcodes, sTarget, sTargetOffset, nTargetOffset, sTargetPointer, sTargetValue, sImmediate, nImmediate, sBranch );
|
||||
|
||||
//> Address Seperator Opcodes Label Mnemonic Target [Immediate] [Branch]
|
||||
//
|
||||
@ -1474,7 +1540,6 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
//> 6 17 27 41 46
|
||||
const int nDefaultFontWidth = 7; // g_aFontConfig[FONT_DISASM_DEFAULT]._nFontWidth or g_nFontWidthAvg
|
||||
|
||||
|
||||
enum TabStop_e
|
||||
{
|
||||
TS_OPCODE
|
||||
@ -1647,7 +1712,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
// DebuggerSetColorBG( dc, DebuggerGetColor( FG_DISASM_BOOKMARK ) ); // swapped
|
||||
// DebuggerSetColorFG( dc, DebuggerGetColor( BG_DISASM_BOOKMARK ) ); // swapped
|
||||
// }
|
||||
PrintTextCursorX( (LPCTSTR) sAddress, linerect );
|
||||
PrintTextCursorX( (LPCTSTR) line.sAddress, linerect );
|
||||
|
||||
if (bAddressIsBookmark)
|
||||
{
|
||||
@ -1670,7 +1735,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
// PrintTextCursorX( " ", linerect );
|
||||
|
||||
if (g_bConfigDisasmOpcodesView)
|
||||
PrintTextCursorX( (LPCTSTR) sOpcodes, linerect );
|
||||
PrintTextCursorX( (LPCTSTR) line.sOpCodes, linerect );
|
||||
// PrintTextCursorX( " ", linerect );
|
||||
|
||||
// Label
|
||||
@ -1692,27 +1757,27 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( iForeground ) );
|
||||
|
||||
LPCTSTR pMnemonic = g_aOpcodes[ iOpcode ].sMnemonic;
|
||||
const char * pMnemonic = g_aOpcodes[ iOpcode ].sMnemonic;
|
||||
PrintTextCursorX( pMnemonic, linerect );
|
||||
|
||||
PrintTextCursorX( " ", linerect );
|
||||
|
||||
// Target
|
||||
if (iOpmode == AM_M)
|
||||
if (line.bTargetImmediate)
|
||||
{
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPERATOR ));
|
||||
PrintTextCursorX( "#$", linerect );
|
||||
}
|
||||
|
||||
if (bTargetIndirect)
|
||||
if (line.bTargetIndexed || line.bTargetIndirect)
|
||||
{
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPERATOR ));
|
||||
PrintTextCursorX( "(", linerect );
|
||||
}
|
||||
|
||||
char *pTarget = sTarget;
|
||||
char *pTarget = line.sTarget;
|
||||
if (*pTarget == '$')
|
||||
{
|
||||
pTarget++;
|
||||
@ -1749,46 +1814,52 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPERATOR ));
|
||||
|
||||
if (nTargetOffset > 0)
|
||||
if (line.nTargetOffset > 0)
|
||||
PrintTextCursorX( "+", linerect );
|
||||
if (nTargetOffset < 0)
|
||||
else
|
||||
if (line.nTargetOffset < 0)
|
||||
PrintTextCursorX( "-", linerect );
|
||||
|
||||
if (! bCursorLine)
|
||||
{
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPCODE )); // Technically, not a hex number, but decimal
|
||||
}
|
||||
PrintTextCursorX( sTargetOffset, linerect );
|
||||
PrintTextCursorX( line.sTargetOffset, linerect );
|
||||
}
|
||||
// Indirect Target Regs
|
||||
if (bTargetIndirect || bTargetX || bTargetY)
|
||||
// Inside Parenthesis = Indirect Target Regs
|
||||
if (line.bTargetIndirect || line.bTargetX || line.bTargetY)
|
||||
{
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPERATOR ));
|
||||
|
||||
if (bTargetX)
|
||||
if (line.bTargetX)
|
||||
{
|
||||
PrintTextCursorX( ",", linerect );
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_INFO_REG ) );
|
||||
PrintTextCursorX( "X", linerect );
|
||||
}
|
||||
|
||||
if (bTargetY)
|
||||
else
|
||||
if ((line.bTargetY) && (! line.bTargetIndirect))
|
||||
{
|
||||
PrintTextCursorX( ",", linerect );
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_INFO_REG ) );
|
||||
PrintTextCursorX( "Y", linerect );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (line.bTargetIndexed || line.bTargetIndirect)
|
||||
{
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPERATOR ));
|
||||
|
||||
if (bTargetIndirect)
|
||||
PrintTextCursorX( ")", linerect );
|
||||
PrintTextCursorX( ")", linerect );
|
||||
}
|
||||
|
||||
if (iOpmode == AM_NZY)
|
||||
if (line.bTargetIndexed)
|
||||
{
|
||||
if (line.bTargetY)
|
||||
{
|
||||
PrintTextCursorX( ",", linerect );
|
||||
if (! bCursorLine)
|
||||
@ -1807,7 +1878,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_ADDRESS ));
|
||||
|
||||
PrintTextCursorX( sTargetPointer, linerect );
|
||||
PrintTextCursorX( line.sTargetPointer, linerect );
|
||||
|
||||
if (bDisasmFormatFlags & DISASM_FORMAT_TARGET_VALUE)
|
||||
{
|
||||
@ -1820,7 +1891,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
if (! bCursorLine)
|
||||
DebuggerSetColorFG( DebuggerGetColor( FG_DISASM_OPCODE ));
|
||||
|
||||
PrintTextCursorX( sTargetValue, linerect );
|
||||
PrintTextCursorX( line.sTargetValue, linerect );
|
||||
PrintTextCursorX( " ", linerect );
|
||||
}
|
||||
}
|
||||
@ -1840,10 +1911,10 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
|
||||
if (! bCursorLine)
|
||||
{
|
||||
ColorizeSpecialChar( NULL, nImmediate, MEM_VIEW_ASCII, iBackground );
|
||||
ColorizeSpecialChar( NULL, line.nImmediate, MEM_VIEW_ASCII, iBackground );
|
||||
// iBackground, FG_INFO_CHAR_HI, FG_DISASM_CHAR, FG_INFO_CHAR_LO );
|
||||
}
|
||||
PrintTextCursorX( sImmediate, linerect );
|
||||
PrintTextCursorX( line.sImmediate, linerect );
|
||||
|
||||
DebuggerSetColorBG( DebuggerGetColor( iBackground ) ); // Hack: Colorize can "color bleed to EOL"
|
||||
if (! bCursorLine)
|
||||
@ -1871,7 +1942,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
#endif
|
||||
|
||||
// PrintTextColor( sBranch, linerect );
|
||||
PrintText( sBranch, linerect );
|
||||
PrintText( line.sBranch, linerect );
|
||||
|
||||
#if !USE_APPLE_FONT
|
||||
if (g_iConfigDisasmBranchType)
|
||||
@ -1880,7 +1951,7 @@ WORD DrawDisassemblyLine ( int iLine, WORD nBaseAddress, LPTSTR text)
|
||||
}
|
||||
}
|
||||
|
||||
return nOpbytes;
|
||||
return nOpbyte;
|
||||
}
|
||||
|
||||
|
||||
@ -3194,7 +3265,7 @@ void DrawSubWindow_Code ( int iWindow )
|
||||
WORD nAddress = g_nDisasmTopAddress; // g_nDisasmCurAddress;
|
||||
for (int iLine = 0; iLine < nLines; iLine++ )
|
||||
{
|
||||
nAddress += DrawDisassemblyLine( iLine, nAddress, NULL);
|
||||
nAddress += DrawDisassemblyLine( iLine, nAddress );
|
||||
}
|
||||
|
||||
#if !USE_APPLE_FONT
|
||||
|
@ -73,7 +73,14 @@
|
||||
void DrawConsoleLine ( const char * pText, int y);
|
||||
void DrawConsoleCursor ();
|
||||
|
||||
WORD DrawDisassemblyLine ( int line, WORD offset, LPTSTR text);
|
||||
int GetDisassemblyLine( const WORD nOffset, DisasmLine_t & line_ );
|
||||
// , int iOpcode, int iOpmode, int nOpbytes
|
||||
// char *sAddress_, char *sOpCodes_,
|
||||
// char *sTarget_, char *sTargetOffset_, int & nTargetOffset_, char *sTargetValue_,
|
||||
// char * sImmediate_, char & nImmediate_, char *sBranch_ );
|
||||
WORD DrawDisassemblyLine ( int line, const WORD offset );
|
||||
void FormatDisassemblyLine( const DisasmLine_t & line, char *sDisassembly_, const int nBufferSize );
|
||||
|
||||
void DrawFlags ( int line, WORD nRegFlags, LPTSTR pFlagNames_);
|
||||
void DrawMemory ( int line, int iMem );
|
||||
void DrawRegister ( int line, LPCTSTR name, int bytes, WORD value, int iSource = 0 );
|
||||
|
@ -871,7 +871,7 @@ Update_t CmdHelpSpecific (int nArgs)
|
||||
, g_aParameters[ PARAM_RESET ].m_sName );
|
||||
Colorize( sText, sTemp );
|
||||
ConsolePrint( sText );
|
||||
sprintf( sText, " Maximum breakpoints: %s%d", CHC_NUMBER, MAX_BREAKPOINTS );
|
||||
sprintf( sText, " Maximum breakpoints: %s%d", CHC_NUM_DEC, MAX_BREAKPOINTS );
|
||||
ConsolePrint( sText );
|
||||
ConsoleBufferPush( " Set breakpoint at PC if no args." );
|
||||
ConsoleBufferPush( " Loading/Saving not yet implemented." );
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
/*
|
||||
+---------------------+--------------------------+
|
||||
| g_nAppMode | assembler format |
|
||||
| Opmode e | assembler format |
|
||||
+=====================+==========================+
|
||||
| Immediate | #aa |
|
||||
| Absolute | aaaa |
|
||||
@ -876,6 +876,75 @@
|
||||
, DISASM_TARGET_BOTH // Note: Also treated as bit flag !!
|
||||
, NUM_DISASM_TARGET_TYPES
|
||||
};
|
||||
|
||||
enum DisasmText_e
|
||||
{
|
||||
nMaxAddressLen = 40,
|
||||
nMaxOpcodes = 3,
|
||||
CHARS_FOR_ADDRESS = 8, // 4 digits plus null
|
||||
};
|
||||
|
||||
struct DisasmLine_t
|
||||
{
|
||||
int iOpcode;
|
||||
int iOpmode;
|
||||
int nOpbyte;
|
||||
|
||||
char sAddress [ CHARS_FOR_ADDRESS ];
|
||||
char sOpCodes [(nMaxOpcodes*3)+1];
|
||||
|
||||
int nTarget;
|
||||
char sTarget [nMaxAddressLen];
|
||||
|
||||
char sTargetOffset[ CHARS_FOR_ADDRESS ]; // +/- 255, realistically +/-1
|
||||
int nTargetOffset;
|
||||
|
||||
char sTargetPointer[ CHARS_FOR_ADDRESS ];
|
||||
char sTargetValue [ CHARS_FOR_ADDRESS ];
|
||||
// char sTargetAddress[ CHARS_FOR_ADDRESS ];
|
||||
|
||||
char sImmediate[ 4 ]; // 'c'
|
||||
char nImmediate;
|
||||
char sBranch [ 4 ]; // ^
|
||||
|
||||
bool bTargetImmediate;
|
||||
bool bTargetIndirect;
|
||||
bool bTargetIndexed ;
|
||||
bool bTargetRelative;
|
||||
bool bTargetX ;
|
||||
bool bTargetY ;
|
||||
bool bTargetValue ;
|
||||
|
||||
void Clear()
|
||||
{
|
||||
sAddress [ 0 ] = 0;
|
||||
sOpCodes [ 0 ] = 0;
|
||||
|
||||
nTarget = 0;
|
||||
sTarget [ 0 ] = 0;
|
||||
|
||||
sTargetOffset[ 0 ] = 0;
|
||||
nTargetOffset = 0;
|
||||
|
||||
sTargetPointer[ 0 ] = 0;
|
||||
sTargetValue [ 0 ] = 0;
|
||||
|
||||
sImmediate[ 0 ] = 0;
|
||||
nImmediate = 0;
|
||||
|
||||
sBranch [ 0 ] = 0;
|
||||
|
||||
bTargetImmediate = false;
|
||||
bTargetIndexed = false;
|
||||
bTargetIndirect = false;
|
||||
// bTargetInside = false;
|
||||
// bTargetOutside = false;
|
||||
bTargetRelative = false;
|
||||
bTargetX = false;
|
||||
bTargetY = false; // need to dislay ",Y"
|
||||
bTargetValue = false;
|
||||
}
|
||||
};
|
||||
|
||||
// Font ___________________________________________________________________________________________
|
||||
enum FontType_e
|
||||
|
Loading…
Reference in New Issue
Block a user