Too many fixes,changes,additions to mention...

Check debugger changelog details: 2.5.6.19 -> 2.5.6.41
This commit is contained in:
mpohoreski 2006-07-01 06:45:50 +00:00
parent dc0c89502e
commit eb168d6169
7 changed files with 1931 additions and 1354 deletions

File diff suppressed because it is too large Load Diff

View File

@ -42,6 +42,9 @@ using namespace std;
extern Command_t g_aCommands[]; extern Command_t g_aCommands[];
extern Command_t g_aParameters[]; extern Command_t g_aParameters[];
// Config - FileName
extern char g_sFileNameConfig[];
// Cursor // Cursor
extern WORD g_nDisasmTopAddress ; extern WORD g_nDisasmTopAddress ;
extern WORD g_nDisasmBotAddress ; extern WORD g_nDisasmBotAddress ;

View File

@ -934,7 +934,7 @@ bool AssemblerGetArgs( int iArg, int nArgs, WORD nBaseAddress )
m_nAsmBytes = 2; m_nAsmBytes = 2;
} }
else else
if (iToken == TOKEN_LEFT_PAREN) if (iToken == TOKEN_PAREN_L)
{ {
if (TestFlag( AF_HaveLeftParen )) if (TestFlag( AF_HaveLeftParen ))
{ {
@ -947,7 +947,7 @@ bool AssemblerGetArgs( int iArg, int nArgs, WORD nBaseAddress )
m_iAsmAddressMode = AM_I; m_iAsmAddressMode = AM_I;
} }
else else
if (iToken == TOKEN_RIGHT_PAREN) if (iToken == TOKEN_PAREN_R)
{ {
if (TestFlag( AF_HaveRightParen )) if (TestFlag( AF_HaveRightParen ))
{ {

View File

@ -88,11 +88,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
int MAX_DISPLAY_REGS_LINES = 6; int MAX_DISPLAY_REGS_LINES = 6;
int MAX_DISPLAY_STACK_LINES = 8; int MAX_DISPLAY_STACK_LINES = 8;
int MAX_DISPLAY_BREAKPOINTS_LINES = 6; // 5 int MAX_DISPLAY_BREAKPOINTS_LINES = 7; // 6 // 5
int MAX_DISPLAY_WATCHES_LINES = 6; // 5 int MAX_DISPLAY_WATCHES_LINES = 8; // 6 // 5
int MAX_DISPLAY_MEMORY_LINES_1 = 4; int MAX_DISPLAY_MEMORY_LINES_1 = 4; // 4
int MAX_DISPLAY_MEMORY_LINES_2 = 2; int MAX_DISPLAY_MEMORY_LINES_2 = 4; // 4 // 2
int MAX_DISPLAY_ZEROPAGE_LINES = 5; int MAX_DISPLAY_ZEROPAGE_LINES = 8;
int g_nDisplayMemoryLines; int g_nDisplayMemoryLines;
// Height // Height
@ -150,6 +150,11 @@ bool CanDrawDebugger()
//=========================================================================== //===========================================================================
int DebugDrawText ( LPCTSTR pText, RECT & rRect ) int DebugDrawText ( LPCTSTR pText, RECT & rRect )
{ {
#if _DEBUG
if (! pText)
MessageBox( NULL, "pText = NULL!", "DrawText()", MB_OK );
#endif
int nLen = _tcslen( pText ); int nLen = _tcslen( pText );
ExtTextOut( g_hDC, ExtTextOut( g_hDC,
rRect.left, rRect.top, rRect.left, rRect.top,
@ -164,10 +169,14 @@ int DebugDrawText ( LPCTSTR pText, RECT & rRect )
//=========================================================================== //===========================================================================
int DebugDrawTextFixed ( LPCTSTR pText, RECT & rRect ) int DebugDrawTextFixed ( LPCTSTR pText, RECT & rRect )
{ {
int nFontWidth = g_aFontConfig[ FONT_INFO ]._nFontWidthAvg; int nChars = 0;
if (pText)
{
int nFontWidth = g_aFontConfig[ FONT_INFO ]._nFontWidthAvg;
int nChars = DebugDrawText( pText, rRect ); nChars = DebugDrawText( pText, rRect );
rRect.left += (nFontWidth * nChars); rRect.left += (nFontWidth * nChars);
}
return nChars; return nChars;
} }
@ -249,7 +258,7 @@ char FormatCharTxtHigh ( const BYTE b, bool *pWasHi_ )
{ {
if (pWasHi_) if (pWasHi_)
{ {
*pWasHi_ = true; *pWasHi_ = true;
} }
c = (b & 0x7F); c = (b & 0x7F);
} }
@ -628,7 +637,7 @@ void DrawBreakpoints (HDC dc, int line)
int nRegLen = DebugDrawTextFixed( g_aBreakpointSource[ pBP->eSource ], rect2 ); int nRegLen = DebugDrawTextFixed( g_aBreakpointSource[ pBP->eSource ], rect2 );
// Pad to 2 chars // Pad to 2 chars
if (nRegLen < 2) // (g_aBreakpointSource[ pBP->eSource ][1] == 0) // HACK: Avoid strlen() if (nRegLen < 2)
rect2.left += g_aFontConfig[ FONT_INFO ]._nFontWidthAvg; rect2.left += g_aFontConfig[ FONT_INFO ]._nFontWidthAvg;
SetBkColor( dc, DebuggerGetColor( BG_INFO )); SetBkColor( dc, DebuggerGetColor( BG_INFO ));
@ -636,8 +645,8 @@ void DrawBreakpoints (HDC dc, int line)
#if DEBUG_FORCE_DISPLAY #if DEBUG_FORCE_DISPLAY
if (iBreakpoint < 3) if (iBreakpoint < 3)
pBP->eOperator = (BreakpointOperator_t)(iBreakpoint * 2); pBP->eOperator = (BreakpointOperator_t)(iBreakpoint * 2);
else // else
pBP->eOperator = (BreakpointOperator_t)(iBreakpoint-3 + BP_OP_READ); // pBP->eOperator = (BreakpointOperator_t)(iBreakpoint-3 + BP_OP_READ);
#endif #endif
DebugDrawTextFixed( g_aBreakpointSymbols [ pBP->eOperator ], rect2 ); DebugDrawTextFixed( g_aBreakpointSymbols [ pBP->eOperator ], rect2 );
@ -692,7 +701,7 @@ void DrawBreakpoints (HDC dc, int line)
// rect2.left += g_nFontWidthAvg; // rect2.left += g_nFontWidthAvg;
// } // }
DebugDrawTextFixed( TEXT("-"), rect2 ); DebugDrawTextFixed( TEXT(":"), rect2 );
// rect2.left += g_nFontWidthAvg; // rect2.left += g_nFontWidthAvg;
// if (g_bConfigDisasmOpcodeSpaces) // TODO: Might have to remove spaces, for BPIO... addr-addr xx // if (g_bConfigDisasmOpcodeSpaces) // TODO: Might have to remove spaces, for BPIO... addr-addr xx
// { // {
@ -919,7 +928,7 @@ WORD DrawDisassemblyLine (HDC dc, int iLine, WORD nBaseAddress, LPTSTR text)
RECT linerect; RECT linerect;
linerect.left = 0; linerect.left = 0;
linerect.top = iLine * nFontHeight; linerect.top = iLine * nFontHeight;
linerect.right = DISPLAY_DISASM_RIGHT; // HACK: MAGIC #: 14 -> g_nFontWidthAvg linerect.right = DISPLAY_DISASM_RIGHT;
linerect.bottom = linerect.top + nFontHeight; linerect.bottom = linerect.top + nFontHeight;
// BOOL bp = g_nBreakpoints && CheckBreakpoint(nBaseAddress,nBaseAddress == regs.pc); // BOOL bp = g_nBreakpoints && CheckBreakpoint(nBaseAddress,nBaseAddress == regs.pc);
@ -1241,11 +1250,20 @@ void DrawFlags (HDC dc, int line, WORD nRegFlags, LPTSTR pFlagNames_)
TCHAR sText[2] = TEXT("?"); TCHAR sText[2] = TEXT("?");
RECT rect; RECT rect;
int nFontWidth = g_aFontConfig[ FONT_INFO ]._nFontWidthAvg;
// Regs are 10 chars across
// Flags are 8 chars across -- scale "up"
int nSpacerWidth = nFontWidth;
if (nFontWidth)
nSpacerWidth = (10 * nFontWidth) / 8;
nSpacerWidth++;
if (dc) if (dc)
{ {
rect.left = DISPLAY_FLAG_COLUMN; rect.left = DISPLAY_FLAG_COLUMN;
rect.top = line * g_nFontHeight; rect.top = line * g_nFontHeight;
rect.right = rect.left + 9; rect.right = rect.left + (10 * nFontWidth);// nSpacerWidth; // nFontWidth = 80's look; // HACK: 9
rect.bottom = rect.top + g_nFontHeight; rect.bottom = rect.top + g_nFontHeight;
SetBkColor(dc, DebuggerGetColor( BG_INFO )); // COLOR_BG_DATA SetBkColor(dc, DebuggerGetColor( BG_INFO )); // COLOR_BG_DATA
} }
@ -1271,9 +1289,11 @@ void DrawFlags (HDC dc, int line, WORD nRegFlags, LPTSTR pFlagNames_)
SetBkColor(dc, DebuggerGetColor( BG_INFO )); SetBkColor(dc, DebuggerGetColor( BG_INFO ));
SetTextColor( dc, DebuggerGetColor( FG_INFO_TITLE )); SetTextColor( dc, DebuggerGetColor( FG_INFO_TITLE ));
} }
rect.left = DISPLAY_FLAG_COLUMN - ((_6502_NUM_FLAGS - 1 - nFlag) * nSpacerWidth);
rect.right = rect.left + nSpacerWidth;
DebugDrawText( sText, rect ); DebugDrawText( sText, rect );
rect.left -= 9; // HACK: Font Width
rect.right -= 9; // HACK: Font Width
} }
if (pFlagNames_) if (pFlagNames_)
@ -1483,10 +1503,12 @@ void DrawRegister (HDC dc, int line, LPCTSTR name, const int nBytes, const WORD
if (! ((g_iWindowThis == WINDOW_CODE) || ((g_iWindowThis == WINDOW_DATA)))) if (! ((g_iWindowThis == WINDOW_CODE) || ((g_iWindowThis == WINDOW_DATA))))
return; return;
int nFontWidth = g_aFontConfig[ FONT_INFO ]._nFontWidthAvg;
RECT rect; RECT rect;
rect.left = DISPLAY_REGS_COLUMN; rect.left = DISPLAY_REGS_COLUMN;
rect.top = line * g_nFontHeight; rect.top = line * g_nFontHeight;
rect.right = rect.left + 40; // TODO:FIXME: g_nFontWidthAvg * rect.right = rect.left + (10 * nFontWidth) + 1;
rect.bottom = rect.top + g_nFontHeight; rect.bottom = rect.top + g_nFontHeight;
if ((PARAM_REG_A == iSource) || if ((PARAM_REG_A == iSource) ||
@ -1501,7 +1523,11 @@ void DrawRegister (HDC dc, int line, LPCTSTR name, const int nBytes, const WORD
{ {
SetTextColor(dc, DebuggerGetColor( FG_INFO_TITLE )); SetTextColor(dc, DebuggerGetColor( FG_INFO_TITLE ));
} }
SetBkColor(dc, DebuggerGetColor( BG_INFO ));
// 2.6.0.0 Alpha - Regs not "boxed"
int iBackground = BG_DATA_1; // BG_INFO
SetBkColor(dc, DebuggerGetColor( iBackground ));
DebugDrawText( name, rect ); DebugDrawText( name, rect );
unsigned int nData = nValue; unsigned int nData = nValue;
@ -1527,16 +1553,17 @@ void DrawRegister (HDC dc, int line, LPCTSTR name, const int nBytes, const WORD
} }
else else
{ {
rect.left = DISPLAY_REGS_COLUMN + 21; // HACK: MAGIC #: 21 // +3 chars rect.left = DISPLAY_REGS_COLUMN + (3 * nFontWidth);
rect.right = SCREENSPLIT2; // rect.right = SCREENSPLIT2;
SetTextColor(dc, DebuggerGetColor( FG_INFO_OPERATOR )); SetTextColor(dc, DebuggerGetColor( FG_INFO_OPERATOR ));
DebugDrawTextFixed( TEXT("'"), rect ); // DebugDrawTextFixed DebugDrawTextFixed( TEXT("'"), rect ); // DebugDrawTextFixed
ColorizeSpecialChar( dc, sValue, nData, MEM_VIEW_ASCII ); // MEM_VIEW_APPLE for inverse background little hard on the eyes ColorizeSpecialChar( dc, sValue, nData, MEM_VIEW_ASCII ); // MEM_VIEW_APPLE for inverse background little hard on the eyes
SetBkColor(dc, DebuggerGetColor( iBackground ));
DebugDrawTextFixed( sValue, rect ); // DebugDrawTextFixed() DebugDrawTextFixed( sValue, rect ); // DebugDrawTextFixed()
SetBkColor(dc, DebuggerGetColor( BG_INFO ));
SetTextColor(dc, DebuggerGetColor( FG_INFO_OPERATOR )); SetTextColor(dc, DebuggerGetColor( FG_INFO_OPERATOR ));
DebugDrawTextFixed( TEXT("'"), rect ); // DebugDrawTextFixed() DebugDrawTextFixed( TEXT("'"), rect ); // DebugDrawTextFixed()
@ -1544,8 +1571,8 @@ void DrawRegister (HDC dc, int line, LPCTSTR name, const int nBytes, const WORD
} }
// Needs to be far enough over, since 4 chars of ZeroPage symbol also calls us // Needs to be far enough over, since 4 chars of ZeroPage symbol also calls us
rect.left = DISPLAY_REGS_COLUMN + (nOffset * g_aFontConfig[ FONT_INFO ]._nFontWidthAvg); // HACK: MAGIC #: 40 rect.left = DISPLAY_REGS_COLUMN + (nOffset * nFontWidth);
rect.right = SCREENSPLIT2; // rect.right = SCREENSPLIT2;
if ((PARAM_REG_PC == iSource) || (PARAM_REG_SP == iSource)) // Stack Pointer is target address, but doesn't look as good. if ((PARAM_REG_PC == iSource) || (PARAM_REG_SP == iSource)) // Stack Pointer is target address, but doesn't look as good.
{ {
@ -1610,14 +1637,12 @@ void DrawStack (HDC dc, int line)
RECT rect; RECT rect;
rect.left = DISPLAY_STACK_COLUMN; rect.left = DISPLAY_STACK_COLUMN;
rect.top = (iStack+line) * g_nFontHeight; rect.top = (iStack+line) * g_nFontHeight;
// rect.right = DISPLAY_STACK_COLUMN + 40;
// rect.right = SCREENSPLIT2;
rect.right = rect.left + (10 * nFontWidth) + 1; rect.right = rect.left + (10 * nFontWidth) + 1;
rect.bottom = rect.top + g_nFontHeight; rect.bottom = rect.top + g_nFontHeight;
SetTextColor(dc, DebuggerGetColor( FG_INFO_TITLE )); // [COLOR_STATIC SetTextColor(dc, DebuggerGetColor( FG_INFO_TITLE )); // [COLOR_STATIC
// BG_SOURCE_2 = grey // 2.6.0.0 Alpha - Stack was dark cyan BG_DATA_1
SetBkColor(dc, DebuggerGetColor( BG_DATA_1 )); // BG_INFO SetBkColor(dc, DebuggerGetColor( BG_INFO )); // BG_INFO
TCHAR sText[8] = TEXT(""); TCHAR sText[8] = TEXT("");
if (nAddress <= _6502_STACK_END) if (nAddress <= _6502_STACK_END)
@ -1627,8 +1652,6 @@ void DrawStack (HDC dc, int line)
DebugDrawTextFixed( sText, rect ); DebugDrawTextFixed( sText, rect );
// rect.left = DISPLAY_STACK_COLUMN + 40; // TODO/FIXME/HACK MAGIC #: g_nFontWidthAvg *
// rect.right = SCREENSPLIT2;
SetTextColor(dc, DebuggerGetColor( FG_INFO_OPCODE )); // COLOR_FG_DATA_TEXT SetTextColor(dc, DebuggerGetColor( FG_INFO_OPCODE )); // COLOR_FG_DATA_TEXT
if (nAddress <= _6502_STACK_END) if (nAddress <= _6502_STACK_END)
@ -1678,7 +1701,6 @@ void DrawTargets (HDC dc, int line)
rect.left = DISPLAY_TARGETS_COLUMN; rect.left = DISPLAY_TARGETS_COLUMN;
rect.top = (line+iAddress) * g_nFontHeight; rect.top = (line+iAddress) * g_nFontHeight;
// int nColumn = DISPLAY_TARGETS_COLUMN + 40; // TODO/FIXME/HACK MAGIC #: g_nFontWidthAvg *
int nColumn = rect.left + (7 * nFontWidth); int nColumn = rect.left + (7 * nFontWidth);
rect.right = nColumn; rect.right = nColumn;
rect.bottom = rect.top + g_nFontHeight; rect.bottom = rect.top + g_nFontHeight;
@ -1763,8 +1785,8 @@ void DrawWatches (HDC dc, int line)
DebugDrawTextFixed( sText, rect2 ); DebugDrawTextFixed( sText, rect2 );
} }
rect.top += g_nFontHeight; // HACK: rect.top += g_nFontHeight;
rect.bottom += g_nFontHeight; // HACK: rect.bottom += g_nFontHeight;
} }
} }
@ -2251,18 +2273,20 @@ void DrawWindow_ZeroPage( Update_t bUpdate )
//=========================================================================== //===========================================================================
void DrawWindowBackground_Main( int g_iWindowThis ) void DrawWindowBackground_Main( int g_iWindowThis )
{ {
RECT viewportrect; int nFontWidth = g_aFontConfig[ FONT_INFO ]._nFontWidthAvg;
viewportrect.left = 0;
viewportrect.top = 0; RECT viewportrect;
viewportrect.right = SCREENSPLIT1 - 6; // HACK: MAGIC #: 14 -> 6 -> (g_nFonWidthAvg-1) viewportrect.left = 0;
viewportrect.bottom = DISPLAY_HEIGHT - DEFAULT_HEIGHT; // 368 = 23 lines // TODO/FIXME viewportrect.top = 0;
viewportrect.right = SCREENSPLIT1 - nFontWidth; // HACK: MAGIC #: 14 -> 6 -> (g_nFonWidthAvg-1)
viewportrect.bottom = DISPLAY_HEIGHT - DEFAULT_HEIGHT; // 368 = 23 lines // TODO/FIXME
// g_nFontHeight * g_nDisasmWinHeight; // 304 // g_nFontHeight * g_nDisasmWinHeight; // 304
// TODO/FIXME: COLOR_BG_CODE -> g_iWindowThis, once all tab backgrounds are listed first in g_aColors ! // TODO/FIXME: COLOR_BG_CODE -> g_iWindowThis, once all tab backgrounds are listed first in g_aColors !
SetBkColor(g_hDC, DebuggerGetColor( BG_DISASM_1 )); // COLOR_BG_CODE SetBkColor(g_hDC, DebuggerGetColor( BG_DISASM_1 )); // COLOR_BG_CODE
// Can't use DebugDrawText, since we don't need CLIPPED // Can't use DebugDrawText, since we don't need CLIPPED
ExtTextOut(g_hDC,0,0,ETO_OPAQUE,&viewportrect,TEXT(""),0,NULL); ExtTextOut(g_hDC,0,0,ETO_OPAQUE,&viewportrect,TEXT(""),0,NULL);
} }
//=========================================================================== //===========================================================================

View File

@ -54,7 +54,7 @@ bool TestStringCat ( TCHAR * pDst, LPCSTR pSrc, const int nDstSize )
int nSpcDst = nDstSize - nLenDst; int nSpcDst = nDstSize - nLenDst;
int nChars = MIN( nLenSrc, nSpcDst ); int nChars = MIN( nLenSrc, nSpcDst );
bool bOverflow = (nSpcDst < nLenSrc); bool bOverflow = (nSpcDst <= nLenSrc); // 2.5.6.25 BUGFIX
if (bOverflow) if (bOverflow)
{ {
return false; return false;
@ -126,6 +126,61 @@ Update_t Help_Arg_1( int iCommandHelp )
} }
//===========================================================================
void Help_Range()
{
ConsoleBufferPush( TEXT(" Where <range> is of the form:" ) );
ConsoleBufferPush( TEXT(" address , length [address,address+length)" ) );
ConsoleBufferPush( TEXT(" address : end [address,end]" ) );
}
//===========================================================================
void Help_Operators()
{
ConsoleBufferPush( TEXT(" Operators: (Math)" ) );
ConsoleBufferPush( TEXT(" + Addition" ) );
ConsoleBufferPush( TEXT(" - Subtraction" ) );
ConsoleBufferPush( TEXT(" * Multiplication" ) );
ConsoleBufferPush( TEXT(" / Division" ) );
ConsoleBufferPush( TEXT(" % Modulas / Remainder" ) );
ConsoleBufferPush( TEXT(" Operators: (Bit Wise)" ) );
ConsoleBufferPush( TEXT(" & Bit-wise and (AND)" ) );
ConsoleBufferPush( TEXT(" | Bit-wise or (OR )" ) );
ConsoleBufferPush( TEXT(" ^ Bit-wise exclusive-or (EOR/XOR)" ) );
ConsoleBufferPush( TEXT(" ! Bit-wise negation (NOT)" ) );
ConsoleBufferPush( TEXT(" Operators: (Input)" ) );
ConsoleBufferPush( TEXT(" @ next number refers to search results" ) );
ConsoleBufferPush( TEXT(" \" Designate string in ASCII format" ) );
ConsoleBufferPush( TEXT(" \' Desginate string in High-Bit apple format" ) );
ConsoleBufferPush( TEXT(" $ Designate number/symbol" ) );
ConsoleBufferPush( TEXT(" # Designate number in hex" ) );
ConsoleBufferPush( TEXT(" Operators: (Range)" ) );
ConsoleBufferPush( TEXT(" , range seperator (2nd address is relative)" ) );
ConsoleBufferPush( TEXT(" : range seperator (2nd address is absolute)" ) );
ConsoleBufferPush( TEXT(" Operators: (Misc)" ) );
ConsoleBufferPush( TEXT(" // comment until end of line" ) );
ConsoleBufferPush( TEXT(" Operators: (Breakpoint)" ) );
TCHAR sText[ CONSOLE_WIDTH ];
_tcscpy( sText, " " );
int iBreakOp = 0;
for( iBreakOp = 0; iBreakOp < NUM_BREAKPOINT_OPERATORS; iBreakOp++ )
{
// if (iBreakOp == PARAM_BP_LESS_EQUAL)
// continue;
// if (iBreakOp == PARAM_BP_GREATER_EQUAL)
// continue;
if ((iBreakOp >= PARAM_BP_LESS_EQUAL) &&
(iBreakOp <= PARAM_BP_GREATER_EQUAL))
{
_tcscat( sText, g_aBreakpointSymbols[ iBreakOp ] );
_tcscat( sText, " " );
}
}
ConsoleBufferPush( sText );
}
//=========================================================================== //===========================================================================
Update_t CmdMOTD( int nArgs ) Update_t CmdMOTD( int nArgs )
@ -164,8 +219,15 @@ Update_t CmdHelpSpecific (int nArgs)
_tcscpy( sText, TEXT("Usage: [< ") ); _tcscpy( sText, TEXT("Usage: [< ") );
for (int iCategory = _PARAM_HELPCATEGORIES_BEGIN ; iCategory < _PARAM_HELPCATEGORIES_END; iCategory++) for (int iCategory = _PARAM_HELPCATEGORIES_BEGIN ; iCategory < _PARAM_HELPCATEGORIES_END; iCategory++)
{ {
#if _DEBUG
// if (iCategory == (PARAM_CAT_ZEROPAGE - 1))
// {
// int nLen = _tcslen( sText );
// bool bStop = true;
// }
#endif
TCHAR *pName = g_aParameters[ iCategory ].m_sName; TCHAR *pName = g_aParameters[ iCategory ].m_sName;
if (! TestStringCat( sText, pName, CONSOLE_WIDTH - 2 )) // CONSOLE_WIDTH // g_nConsoleDisplayWidth - 3 if (! TestStringCat( sText, pName, CONSOLE_WIDTH - 4 )) // CONSOLE_WIDTH // g_nConsoleDisplayWidth - 3
{ {
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
_tcscpy( sText, TEXT(" ") ); _tcscpy( sText, TEXT(" ") );
@ -174,19 +236,20 @@ Update_t CmdHelpSpecific (int nArgs)
StringCat( sText, pName, CONSOLE_WIDTH ); StringCat( sText, pName, CONSOLE_WIDTH );
if (iCategory < (_PARAM_HELPCATEGORIES_END - 1)) if (iCategory < (_PARAM_HELPCATEGORIES_END - 1))
{ {
StringCat( sText, TEXT(" | "), CONSOLE_WIDTH ); StringCat( sText, TEXT(" | "), CONSOLE_WIDTH - 1 );
} }
} }
StringCat( sText, TEXT(" >]"), CONSOLE_WIDTH ); StringCat( sText, TEXT(" >]"), CONSOLE_WIDTH - 3 );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT("Note: [] = optional, <> = mandatory"), CONSOLE_WIDTH ); wsprintf( sText, TEXT("Note: [] = optional, <> = mandatory"), CONSOLE_WIDTH );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
} }
CmdFuncPtr_t pFunction = NULL;
bool bAllCommands = false; bool bAllCommands = false;
bool bCategory = false; bool bCategory = false;
bool bDisplayCategory = true;
if ((! _tcscmp( g_aArgs[1].sArg, g_aParameters[ PARAM_WILDSTAR ].m_sName)) || if ((! _tcscmp( g_aArgs[1].sArg, g_aParameters[ PARAM_WILDSTAR ].m_sName)) ||
(! _tcscmp( g_aArgs[1].sArg, g_aParameters[ PARAM_MEM_SEARCH_WILD ].m_sName)) ) (! _tcscmp( g_aArgs[1].sArg, g_aParameters[ PARAM_MEM_SEARCH_WILD ].m_sName)) )
@ -203,6 +266,8 @@ Update_t CmdHelpSpecific (int nArgs)
int nNewArgs = 0; int nNewArgs = 0;
int iCmdBegin = 0; int iCmdBegin = 0;
int iCmdEnd = 0; int iCmdEnd = 0;
int nFound = 0;
int iCommand = 0;
if (! bAllCommands) if (! bAllCommands)
{ {
@ -210,22 +275,48 @@ Update_t CmdHelpSpecific (int nArgs)
{ {
// int nFoundCategory = FindParam( g_aArgs[ iArg ].sArg, MATCH_EXACT, iParam, _PARAM_HELPCATEGORIES_BEGIN, _PARAM_HELPCATEGORIES_END ); // int nFoundCategory = FindParam( g_aArgs[ iArg ].sArg, MATCH_EXACT, iParam, _PARAM_HELPCATEGORIES_BEGIN, _PARAM_HELPCATEGORIES_END );
int nFoundCategory = FindParam( g_aArgs[ iArg ].sArg, MATCH_FUZZY, iParam, _PARAM_HELPCATEGORIES_BEGIN, _PARAM_HELPCATEGORIES_END ); int nFoundCategory = FindParam( g_aArgs[ iArg ].sArg, MATCH_FUZZY, iParam, _PARAM_HELPCATEGORIES_BEGIN, _PARAM_HELPCATEGORIES_END );
bCategory = true;
switch( iParam ) switch( iParam )
{ {
case PARAM_CAT_BOOKMARKS : iCmdBegin = CMD_BOOKMARK_MENU ; iCmdEnd = CMD_BOOKMARK_SAVE ; break; case PARAM_CAT_BOOKMARKS : iCmdBegin = CMD_BOOKMARK ; iCmdEnd = CMD_BOOKMARK_SAVE ; break;
case PARAM_CAT_BREAKPOINTS: iCmdBegin = CMD_BREAKPOINT ; iCmdEnd = CMD_BREAKPOINT_SAVE ; break; case PARAM_CAT_BREAKPOINTS: iCmdBegin = CMD_BREAKPOINT ; iCmdEnd = CMD_BREAKPOINT_SAVE ; break;
case PARAM_CAT_CONFIG : iCmdBegin = CMD_CONFIG_COLOR ; iCmdEnd = CMD_CONFIG_SAVE ; break; case PARAM_CAT_CONFIG : iCmdBegin = CMD_BENCHMARK ; iCmdEnd = CMD_CONFIG_SAVE ; break;
case PARAM_CAT_CPU : iCmdBegin = CMD_ASSEMBLE ; iCmdEnd = CMD_UNASSEMBLE ; break; case PARAM_CAT_CPU : iCmdBegin = CMD_ASSEMBLE ; iCmdEnd = CMD_UNASSEMBLE ; break;
case PARAM_CAT_FLAGS : iCmdBegin = CMD_FLAG_CLEAR ; iCmdEnd = CMD_FLAG_SET_N ; break; case PARAM_CAT_FLAGS : iCmdBegin = CMD_FLAG_CLEAR ; iCmdEnd = CMD_FLAG_SET_N ; break;
case PARAM_CAT_HELP : iCmdBegin = CMD_HELP_LIST ; iCmdEnd = CMD_MOTD ; break; case PARAM_CAT_HELP : iCmdBegin = CMD_HELP_LIST ; iCmdEnd = CMD_MOTD ; break;
case PARAM_CAT_MEMORY : iCmdBegin = CMD_MEMORY_COMPARE ; iCmdEnd = CMD_MEMORY_FILL ; break; case PARAM_CAT_MEMORY : iCmdBegin = CMD_MEMORY_COMPARE ; iCmdEnd = CMD_MEMORY_FILL ; break;
case PARAM_CAT_OUTPUT : iCmdBegin = CMD_OUTPUT_CALC ; iCmdEnd = CMD_OUTPUT_RUN ; break; case PARAM_CAT_OUTPUT : iCmdBegin = CMD_OUTPUT_CALC ; iCmdEnd = CMD_OUTPUT_RUN ; break;
case PARAM_CAT_REGISTERS : iCmdBegin = CMD_REGISTER_SET ; iCmdEnd = CMD_REGISTER_SET ; break; case PARAM_CAT_SYMBOLS :
case PARAM_CAT_SYMBOLS : iCmdBegin = CMD_SYMBOLS_LOOKUP ; iCmdEnd = CMD_SYMBOLS_LIST ; break; // HACK: check if we have an exact command match first
nFound = FindCommand( g_aArgs[iArg].sArg, pFunction, & iCommand );
if (nFound && (iCommand != CMD_SYMBOLS_LOOKUP) && (iCommand != CMD_MEMORY_SEARCH))
{
iCmdBegin = CMD_SYMBOLS_LOOKUP ; iCmdEnd = CMD_SYMBOLS_LIST ; break;
bCategory = true;
}
else
bCategory = false;
break;
case PARAM_CAT_WATCHES : iCmdBegin = CMD_WATCH_ADD ; iCmdEnd = CMD_WATCH_LIST ; break; case PARAM_CAT_WATCHES : iCmdBegin = CMD_WATCH_ADD ; iCmdEnd = CMD_WATCH_LIST ; break;
case PARAM_CAT_WINDOW : iCmdBegin = CMD_WINDOW ; iCmdEnd = CMD_WINDOW_OUTPUT ; break; case PARAM_CAT_WINDOW : iCmdBegin = CMD_WINDOW ; iCmdEnd = CMD_WINDOW_OUTPUT ; break;
case PARAM_CAT_ZEROPAGE : iCmdBegin = CMD_ZEROPAGE_POINTER; iCmdEnd = CMD_ZEROPAGE_POINTER_SAVE;break; case PARAM_CAT_ZEROPAGE : iCmdBegin = CMD_ZEROPAGE_POINTER; iCmdEnd = CMD_ZEROPAGE_POINTER_SAVE;break;
default: break;
// case PARAM_CAT_EXPRESSION : // fall-through
case PARAM_CAT_OPERATORS : nArgs = 0; Help_Operators(); break;
case PARAM_CAT_RANGE :
// HACK: check if we have an exact command match first
nFound = FindCommand( g_aArgs[iArg].sArg, pFunction, & iCommand );
if ((!nFound) || (iCommand != CMD_REGISTER_SET))
{
nArgs = 0;
Help_Range();
}
bCategory = false;
break;
default:
bCategory = false;
break;
} }
if (iCmdEnd) if (iCmdEnd)
iCmdEnd++; iCmdEnd++;
@ -237,8 +328,6 @@ Update_t CmdHelpSpecific (int nArgs)
if (nNewArgs > 0) if (nNewArgs > 0)
{ {
bCategory = true;
nArgs = nNewArgs; nArgs = nNewArgs;
for (iArg = 1; iArg <= nArgs; iArg++ ) for (iArg = 1; iArg <= nArgs; iArg++ )
{ {
@ -249,12 +338,10 @@ Update_t CmdHelpSpecific (int nArgs)
} }
} }
CmdFuncPtr_t pFunction;
for (iArg = 1; iArg <= nArgs; iArg++ ) for (iArg = 1; iArg <= nArgs; iArg++ )
{ {
int iCommand = 0; iCommand = 0;
int nFound = 0; nFound = 0;
if (bCategory) if (bCategory)
{ {
@ -294,67 +381,63 @@ Update_t CmdHelpSpecific (int nArgs)
pCommand = NULL; pCommand = NULL;
} }
if (nFound && (! bAllCommands) && (! bCategory)) // if (nFound && (! bAllCommands) && (! bCategory))
if (nFound && (! bAllCommands) && bDisplayCategory)
{ {
TCHAR sCategory[ CONSOLE_WIDTH ]; TCHAR sCategory[ CONSOLE_WIDTH ];
int iCmd = g_aCommands[ iCommand ].iCommand; // Unaliased command int iCmd = g_aCommands[ iCommand ].iCommand; // Unaliased command
// HACK: Major kludge to display category!!! // HACK: Major kludge to display category!!!
if (iCmd <= CMD_UNASSEMBLE) if (iCmd <= CMD_UNASSEMBLE)
wsprintf( sCategory, "Main" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_CPU ].m_sName );
else else
if (iCmd <= CMD_BOOKMARK_SAVE) if (iCmd <= CMD_BOOKMARK_SAVE)
wsprintf( sCategory, "Bookmark" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_BOOKMARKS ].m_sName );
else else
if (iCmd <= CMD_BREAKPOINT_SAVE) if (iCmd <= CMD_BREAKPOINT_SAVE)
wsprintf( sCategory, "Breakpoint" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_BREAKPOINTS ].m_sName );
else
if (iCmd <= CMD_PROFILE)
wsprintf( sCategory, "Profile" );
else else
if (iCmd <= CMD_CONFIG_SAVE) if (iCmd <= CMD_CONFIG_SAVE)
wsprintf( sCategory, "Config" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_CONFIG ].m_sName );
else else
if (iCmd <= CMD_CURSOR_PAGE_DOWN_4K) if (iCmd <= CMD_CURSOR_PAGE_DOWN_4K)
wsprintf( sCategory, "Scrolling" ); wsprintf( sCategory, "Scrolling" );
else else
if (iCmd <= CMD_FLAG_SET_N) if (iCmd <= CMD_FLAG_SET_N)
wsprintf( sCategory, "Flags" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_FLAGS ].m_sName );
else else
if (iCmd <= CMD_MOTD) if (iCmd <= CMD_MOTD)
wsprintf( sCategory, "Help" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_HELP ].m_sName );
else else
if (iCmd <= CMD_MEMORY_FILL) if (iCmd <= CMD_MEMORY_FILL)
wsprintf( sCategory, "Memory" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_MEMORY ].m_sName );
else else
if (iCmd <= CMD_OUTPUT_RUN) if (iCmd <= CMD_OUTPUT_RUN)
wsprintf( sCategory, "Output" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_OUTPUT ].m_sName );
else
if (iCmd <= CMD_REGISTER_SET)
wsprintf( sCategory, "Registers" );
else else
if (iCmd <= CMD_SYNC) if (iCmd <= CMD_SYNC)
wsprintf( sCategory, "Source" ); wsprintf( sCategory, "Source" );
else else
if (iCmd <= CMD_STACK_PUSH)
wsprintf( sCategory, "Stack" );
else
if (iCmd <= CMD_SYMBOLS_LIST) if (iCmd <= CMD_SYMBOLS_LIST)
wsprintf( sCategory, "Symbols" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_SYMBOLS ].m_sName );
else else
if (iCmd <= CMD_WATCH_SAVE) if (iCmd <= CMD_WATCH_SAVE)
wsprintf( sCategory, "Watch" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_WATCHES ].m_sName );
else else
if (iCmd <= CMD_WINDOW_OUTPUT) if (iCmd <= CMD_WINDOW_OUTPUT)
wsprintf( sCategory, "Window" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_WINDOW ].m_sName );
else else
if (iCmd <= CMD_ZEROPAGE_POINTER_SAVE) if (iCmd <= CMD_ZEROPAGE_POINTER_SAVE)
wsprintf( sCategory, "Zero Page" ); wsprintf( sCategory, g_aParameters[ PARAM_CAT_ZEROPAGE ].m_sName );
else else
wsprintf( sCategory, "Unknown!" ); wsprintf( sCategory, "Unknown!" );
wsprintf( sText, "Category: %s", sCategory ); wsprintf( sText, "Category: %s", sCategory );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
if (bCategory)
if (bDisplayCategory)
bDisplayCategory = false;
} }
if (pCommand) if (pCommand)
@ -362,10 +445,13 @@ Update_t CmdHelpSpecific (int nArgs)
char *pHelp = pCommand->pHelpSummary; char *pHelp = pCommand->pHelpSummary;
if (pHelp) if (pHelp)
{ {
wsprintf( sText, "%s, ", pCommand->m_sName ); if (bCategory)
wsprintf( sText, "%8s, ", pCommand->m_sName );
else
wsprintf( sText, "%s, ", pCommand->m_sName );
if (! TryStringCat( sText, pHelp, g_nConsoleDisplayWidth )) if (! TryStringCat( sText, pHelp, g_nConsoleDisplayWidth ))
{ {
if (! TryStringCat( sText, pHelp, CONSOLE_WIDTH )) if (! TryStringCat( sText, pHelp, CONSOLE_WIDTH-1 ))
{ {
StringCat( sText, pHelp, CONSOLE_WIDTH ); StringCat( sText, pHelp, CONSOLE_WIDTH );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
@ -375,7 +461,8 @@ Update_t CmdHelpSpecific (int nArgs)
} }
else else
{ {
wsprintf( sText, "%s", pCommand->m_sName ); #if _DEBUG
wsprintf( sText, "%s <-- Missing", pCommand->m_sName );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
#if DEBUG_COMMAND_HELP #if DEBUG_COMMAND_HELP
if (! bAllCommands) // Release version doesn't display message if (! bAllCommands) // Release version doesn't display message
@ -384,7 +471,11 @@ Update_t CmdHelpSpecific (int nArgs)
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
} }
#endif #endif
#endif
} }
if (bCategory)
continue;
} }
// MASTER HELP // MASTER HELP
@ -430,8 +521,20 @@ Update_t CmdHelpSpecific (int nArgs)
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
ConsoleBufferPush( TEXT(" No arguments resets the profile.") ); ConsoleBufferPush( TEXT(" No arguments resets the profile.") );
break; break;
// Registers
case CMD_REGISTER_SET:
wsprintf( sText, TEXT(" Usage: <reg> <value | expression | symbol>" ) ); ConsoleBufferPush( sText );
ConsoleBufferPush( TEXT(" Where <reg> is one of: A X Y PC SP ") );
wsprintf( sText, TEXT(" See also: %s" ), g_aParameters[ PARAM_CAT_OPERATORS ].m_sName ); ConsoleBufferPush( sText );
ConsoleBufferPush( TEXT(" Examples:") );
ConsoleBufferPush( TEXT(" R PC RESET + 1") );
ConsoleBufferPush( TEXT(" R PC $FC58") );
ConsoleBufferPush( TEXT(" R A A1") );
ConsoleBufferPush( TEXT(" R A $A1") );
ConsoleBufferPush( TEXT(" R A #A1") );
break;
case CMD_SOURCE: case CMD_SOURCE:
ConsoleBufferPush( TEXT(" Reads assembler source file." ) ); // ConsoleBufferPush( TEXT(" Reads assembler source file." ) );
wsprintf( sText, TEXT(" Usage: [ %s | %s ] \"filename\"" ), g_aParameters[ PARAM_SRC_MEMORY ].m_sName, g_aParameters[ PARAM_SRC_SYMBOLS ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" Usage: [ %s | %s ] \"filename\"" ), g_aParameters[ PARAM_SRC_MEMORY ].m_sName, g_aParameters[ PARAM_SRC_SYMBOLS ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s: read source bytes into memory." ), g_aParameters[ PARAM_SRC_MEMORY ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s: read source bytes into memory." ), g_aParameters[ PARAM_SRC_MEMORY ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s: read symbols into Source symbol table."), g_aParameters[ PARAM_SRC_SYMBOLS ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s: read symbols into Source symbol table."), g_aParameters[ PARAM_SRC_SYMBOLS ].m_sName ); ConsoleBufferPush( sText );
@ -461,11 +564,15 @@ Update_t CmdHelpSpecific (int nArgs)
ConsoleBufferPush( TEXT(" with cycle counting." ) ); ConsoleBufferPush( TEXT(" with cycle counting." ) );
break; break;
// Bookmarks // Bookmarks
case CMD_BOOKMARK_MENU: case CMD_BOOKMARK:
case CMD_BOOKMARK_ADD: case CMD_BOOKMARK_ADD:
ConsoleBufferPush( TEXT(" Usage: # <address | symbol>") ); ConsoleBufferPush(" Usage: [address | symbol]" );
ConsoleBufferPush( TEXT(" Add specified bookmark.") ); ConsoleBufferPush(" Usage: # <address | symbol>" );
wsprintf( sText, TEXT(" i.e. %s 1 RESET" ), pCommand->m_sName ); ConsoleBufferPush(" If no address or symbol is specified, lists the current bookmarks." );
ConsoleBufferPush(" Updates the specified bookmark (#)" );
wsprintf( sText, TEXT(" i.e. %s RESET" ), pCommand->m_sName );
ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" i.e. %s 1 HOME" ), pCommand->m_sName );
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
break; break;
case CMD_BOOKMARK_CLEAR: case CMD_BOOKMARK_CLEAR:
@ -475,7 +582,7 @@ Update_t CmdHelpSpecific (int nArgs)
ConsoleBufferPush( sText ); ConsoleBufferPush( sText );
break; break;
case CMD_BOOKMARK_LIST: case CMD_BOOKMARK_LIST:
case CMD_BOOKMARK_LOAD: // case CMD_BOOKMARK_LOAD:
case CMD_BOOKMARK_SAVE: case CMD_BOOKMARK_SAVE:
break; break;
// Breakpoints // Breakpoints
@ -491,8 +598,16 @@ Update_t CmdHelpSpecific (int nArgs)
ConsoleBufferPush( TEXT(" Loading/Saving not yet implemented.") ); ConsoleBufferPush( TEXT(" Loading/Saving not yet implemented.") );
break; break;
case CMD_BREAKPOINT_ADD_REG: case CMD_BREAKPOINT_ADD_REG:
ConsoleBufferPush( TEXT(" Usage: [A|X|Y|PC|S] [<,=,>] value") ); ConsoleBufferPush( " Usage: [A|X|Y|PC|S] [op] <range | value>" );
ConsoleBufferPush( TEXT(" Set breakpoint when reg is [op] value") ); ConsoleBufferPush( " Set breakpoint when reg is [op] value" );
ConsoleBufferPush( " Default operator is '='" );
wsprintf( sText, " See also: %s", g_aParameters[ PARAM_CAT_OPERATORS ].m_sName ); ConsoleBufferPush( sText );
ConsoleBufferPush( " Examples:" );
wsprintf( sText, " %s PC < D000", pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, " %s PC = F000:FFFF PC < D000,1000", pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, " %s A <= D5" , pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, " %s A != 01:FF" , pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, " %s X = A5" , pCommand->m_sName ); ConsoleBufferPush( sText );
break; break;
case CMD_BREAKPOINT_ADD_SMART: case CMD_BREAKPOINT_ADD_SMART:
ConsoleBufferPush( TEXT(" Usage: [address | register]") ); ConsoleBufferPush( TEXT(" Usage: [address | register]") );
@ -527,13 +642,16 @@ Update_t CmdHelpSpecific (int nArgs)
break; break;
case CMD_BREAKPOINT_LIST: case CMD_BREAKPOINT_LIST:
break; break;
// Config - Color // Config - Load / Save
case CMD_CONFIG_MENU: case CMD_CONFIG_LOAD:
ConsoleBufferPush( TEXT(" Load/Save configuration, or change disasm view options." ) ); ConsoleBufferPush( TEXT(" Usage: [\"filename\"]" ) );
wsprintf( sText, TEXT(" %s" ": Loads config from last/default \"filename\"" ), g_aParameters[ PARAM_SAVE ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" Load debugger configuration from '%s', or the specificed file." ), g_sFileNameConfig ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s" ": Saves config to \"filename\"" ), g_aParameters[ PARAM_LOAD ].m_sName ); ConsoleBufferPush( sText );
break; break;
case CMD_CONFIG_SAVE:
ConsoleBufferPush( TEXT(" Usage: [\"filename\"]" ) );
wsprintf( sText, TEXT(" Save debugger configuration to '%s', or the specificed file." ), g_sFileNameConfig ); ConsoleBufferPush( sText );
break;
// Config - Color
case CMD_CONFIG_COLOR: case CMD_CONFIG_COLOR:
ConsoleBufferPush( TEXT(" Usage: [<#> | <# RR GG BB>]" ) ); ConsoleBufferPush( TEXT(" Usage: [<#> | <# RR GG BB>]" ) );
ConsoleBufferPush( TEXT(" 0 params: switch to 'color' scheme" ) ); ConsoleBufferPush( TEXT(" 0 params: switch to 'color' scheme" ) );
@ -656,34 +774,35 @@ Update_t CmdHelpSpecific (int nArgs)
break; break;
case CMD_MEMORY_LOAD: case CMD_MEMORY_LOAD:
// BLOAD "Filename" addr[,len]
case CMD_MEMORY_SAVE: case CMD_MEMORY_SAVE:
// BSAVE ["Filename"] addr,len
if (iCommand == CMD_MEMORY_LOAD) if (iCommand == CMD_MEMORY_LOAD)
{ {
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address[,length]" ) ); ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address[,length]" ) );
ConsoleBufferPush( TEXT(" If no filename specified, defaults to the last filename (if possible)" ) ); ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],range" ) );
Help_Range();
ConsoleBufferPush( TEXT(" Notes: If no filename specified, defaults to the last filename (if possible)" ) );
} }
if (iCommand == CMD_MEMORY_SAVE) if (iCommand == CMD_MEMORY_SAVE)
{ {
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address[,length]" ) ); ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address,length" ) );
ConsoleBufferPush( TEXT(" If no filename specified, defaults to: '####.####.bin'" ) ); ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],range" ) );
ConsoleBufferPush( TEXT(" Where the form is <address>.<length>.bin" ) ); Help_Range();
ConsoleBufferPush( TEXT(" Notes: If no filename specified, defaults to: '####.####.bin'" ) );
ConsoleBufferPush( TEXT(" Where the form is <address>.<length>.bin" ) );
} }
ConsoleBufferPush( TEXT(" Examples:" ) ); ConsoleBufferPush( TEXT(" Examples:" ) );
ConsoleBufferPush( TEXT(" BSAVE \"test\",FF00,100" ) ); ConsoleBufferPush( TEXT(" BSAVE \"test\",FF00,100" ) );
ConsoleBufferPush( TEXT(" BLOAD \"test\",2000" ) ); ConsoleBufferPush( TEXT(" BLOAD \"test\",2000:2010" ) );
ConsoleBufferPush( TEXT(" BSAVE \"test\",F000:FFFF" ) );
ConsoleBufferPush( TEXT(" BLOAD \"test\",4000" ) );
break; break;
case CMD_MEMORY_SEARCH: case CMD_MEMORY_SEARCH:
ConsoleBufferPush( TEXT(" Usage: range <\"ASCII text\" | 'apple text' | hex>" ) ); ConsoleBufferPush( TEXT(" Usage: range <\"ASCII text\" | 'apple text' | hex>" ) );
ConsoleBufferPush( TEXT(" Where <range> is of the form:" ) ); Help_Range();
ConsoleBufferPush( TEXT(" address,length" ) );
ConsoleBufferPush( TEXT(" start : end" ) );
ConsoleBufferPush( TEXT(" Where text is of the form:") ); ConsoleBufferPush( TEXT(" Where text is of the form:") );
ConsoleBufferPush( TEXT(" \"...\" designate ASCII text") ); ConsoleBufferPush( TEXT(" \"...\" designate ASCII text") );
ConsoleBufferPush( TEXT(" '...' designate Apple High-Bit text") ); ConsoleBufferPush( TEXT(" '...' designate Apple High-Bit text") );
ConsoleBufferPush( TEXT(" Examples: (Text)" ) ); ConsoleBufferPush( TEXT(" Examples: (Text)" ) );
wsprintf( sText, TEXT(" %s F000,1000 'Apple' // search High-Bit" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s F000,1000 'Apple' // search High-Bit" ), pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" MT1 @2" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" MT1 @2" ), pCommand->m_sName ); ConsoleBufferPush( sText );
@ -695,15 +814,13 @@ Update_t CmdHelpSpecific (int nArgs)
break; break;
case CMD_MEMORY_SEARCH_HEX: case CMD_MEMORY_SEARCH_HEX:
ConsoleBufferPush( TEXT(" Usage: range [text | byte1 [byte2 ...]]" ) ); ConsoleBufferPush( TEXT(" Usage: range [text | byte1 [byte2 ...]]" ) );
ConsoleBufferPush( TEXT(" Where <range> is of the form:" ) ); Help_Range();
ConsoleBufferPush( TEXT(" address , length" ) );
ConsoleBufferPush( TEXT(" address : end" ) );
ConsoleBufferPush( TEXT(" Where <byte> is of the form:") ); ConsoleBufferPush( TEXT(" Where <byte> is of the form:") );
ConsoleBufferPush( TEXT(" ## match specific byte") ); ConsoleBufferPush( TEXT(" ## match specific byte") );
ConsoleBufferPush( TEXT(" #### match specific 16-bit value") ); ConsoleBufferPush( TEXT(" #### match specific 16-bit value") );
ConsoleBufferPush( TEXT(" ? match any byte") ); ConsoleBufferPush( TEXT(" ? match any byte") );
ConsoleBufferPush( TEXT(" ?# match any high nibble, match low nibble to specific number") ); ConsoleBufferPush( TEXT(" ?# match any high nibble, match low nibble to specific number") );
ConsoleBufferPush( TEXT(" #? match specific high nibble, match any low nibble") ); ConsoleBufferPush( TEXT(" #? match specific high nibble, match any low nibble") );
ConsoleBufferPush( TEXT(" Examples: (Hex)" ) ); ConsoleBufferPush( TEXT(" Examples: (Hex)" ) );
wsprintf( sText, TEXT(" %s F000,1000 AD ? C0" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s F000,1000 AD ? C0" ), pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" U @1" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" U @1" ), pCommand->m_sName ); ConsoleBufferPush( sText );
@ -714,13 +831,12 @@ Update_t CmdHelpSpecific (int nArgs)
wsprintf( sText, TEXT(" %s F000:FFFF C030" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s F000:FFFF C030" ), pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" U @1 - 1" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" U @1 - 1" ), pCommand->m_sName ); ConsoleBufferPush( sText );
break; break;
case CMD_MEMORY_SEARCH_APPLE: // case CMD_MEMORY_SEARCH_APPLE:
wsprintf( sText, TEXT("Deprecated. Use: %s" ), g_aCommands[ CMD_MEMORY_SEARCH ].m_sName ); ConsoleBufferPush( sText ); // wsprintf( sText, TEXT("Deprecated. Use: %s" ), g_aCommands[ CMD_MEMORY_SEARCH ].m_sName ); ConsoleBufferPush( sText );
// break;
break; // case CMD_MEMORY_SEARCH_ASCII:
case CMD_MEMORY_SEARCH_ASCII: // wsprintf( sText, TEXT("Deprecated. Use: %s" ), g_aCommands[ CMD_MEMORY_SEARCH ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT("Deprecated. Use: %s" ), g_aCommands[ CMD_MEMORY_SEARCH ].m_sName ); ConsoleBufferPush( sText ); // break;
break;
// Output // Output
case CMD_OUTPUT_CALC: case CMD_OUTPUT_CALC:
ConsoleBufferPush( TEXT(" Usage: <address | symbol | expression >" ) ); ConsoleBufferPush( TEXT(" Usage: <address | symbol | expression >" ) );
@ -739,6 +855,7 @@ Update_t CmdHelpSpecific (int nArgs)
break; break;
case CMD_OUTPUT_PRINT: case CMD_OUTPUT_PRINT:
ConsoleBufferPush( TEXT(" Usage: <string | expression> [, string | expression]*" ) ); ConsoleBufferPush( TEXT(" Usage: <string | expression> [, string | expression]*" ) );
ConsoleBufferPush( TEXT(" Note: To print Register values, they must be in upper case" ) );
ConsoleBufferPush( TEXT(" Examples:") ); ConsoleBufferPush( TEXT(" Examples:") );
wsprintf( sText, TEXT(" %s \"A:\",A,\" X:\",X"), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s \"A:\",A,\" X:\",X"), pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s A,\" \",X,\" \",Y" ), pCommand->m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s A,\" \",X,\" \",Y" ), pCommand->m_sName ); ConsoleBufferPush( sText );
@ -754,6 +871,13 @@ Update_t CmdHelpSpecific (int nArgs)
break; break;
// Symbols // Symbols
case CMD_SYMBOLS_LOOKUP:
ConsoleBufferPush( TEXT(" Usage: symbol [= <address>]" ) );
ConsoleBufferPush( TEXT(" Examples:" ) );
wsprintf( sText, TEXT(" %s HOME" ),pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s LIFE = 2000" ),pCommand->m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s LIFE" ),pCommand->m_sName ); ConsoleBufferPush( sText );
break;
case CMD_SYMBOLS_MAIN: case CMD_SYMBOLS_MAIN:
case CMD_SYMBOLS_USER: case CMD_SYMBOLS_USER:
case CMD_SYMBOLS_SRC : case CMD_SYMBOLS_SRC :
@ -764,14 +888,18 @@ Update_t CmdHelpSpecific (int nArgs)
// ConsoleBufferPush( TEXT(" LOAD: Loads symbols from last/default filename" ) ); // ConsoleBufferPush( TEXT(" LOAD: Loads symbols from last/default filename" ) );
// ConsoleBufferPush( TEXT(" SAVE: Saves symbol table to file" ) ); // ConsoleBufferPush( TEXT(" SAVE: Saves symbol table to file" ) );
// ConsoleBufferPush( TEXT(" CLEAR: Clears the symbol table" ) ); // ConsoleBufferPush( TEXT(" CLEAR: Clears the symbol table" ) );
ConsoleBufferPush( TEXT(" Usage: [ ... | symbol | address ]") ); ConsoleBufferPush( TEXT(" Usage: [ <cmd> | symbol | address ]") );
ConsoleBufferPush( TEXT(" Where ... is one of:" ) ); ConsoleBufferPush( TEXT(" Where <cmd> is one of:" ) );
wsprintf( sText, TEXT(" %s " ": Turns symbols on in the disasm window" ), g_aParameters[ PARAM_ON ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s " ": Turns symbols on in the disasm window" ), g_aParameters[ PARAM_ON ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s " ": Turns symbols off in the disasm window" ), g_aParameters[ PARAM_OFF ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s " ": Turns symbols off in the disasm window" ), g_aParameters[ PARAM_OFF ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s" ": Loads symbols from last/default \"filename\"" ), g_aParameters[ PARAM_SAVE ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s" ": Loads symbols from last/default \"filename\"" ), g_aParameters[ PARAM_SAVE ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s" ": Saves symbol table to \"filename\"" ), g_aParameters[ PARAM_LOAD ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s" ": Saves symbol table to \"filename\"" ), g_aParameters[ PARAM_LOAD ].m_sName ); ConsoleBufferPush( sText );
wsprintf( sText, TEXT(" %s" ": Clears the symbol table" ), g_aParameters[ PARAM_CLEAR ].m_sName ); ConsoleBufferPush( sText ); wsprintf( sText, TEXT(" %s" ": Clears the symbol table" ), g_aParameters[ PARAM_CLEAR ].m_sName ); ConsoleBufferPush( sText );
break; break;
case CMD_SYMBOLS_LIST :
ConsoleBufferPush( TEXT(" Usage: symbol" ) );
ConsoleBufferPush( TEXT(" Looks up symbol in all 3 symbol tables: main, user, source" ) );
break;
// Watches // Watches
case CMD_WATCH_ADD: case CMD_WATCH_ADD:
ConsoleBufferPush( TEXT(" Usage: <address | symbol>" ) ); ConsoleBufferPush( TEXT(" Usage: <address | symbol>" ) );
@ -782,6 +910,39 @@ Update_t CmdHelpSpecific (int nArgs)
case CMD_WINDOW_CODE_2 : // summary is good enough case CMD_WINDOW_CODE_2 : // summary is good enough
case CMD_WINDOW_SOURCE_2: // summary is good enough case CMD_WINDOW_SOURCE_2: // summary is good enough
break; break;
// Zero Page pointers
case CMD_ZEROPAGE_POINTER:
case CMD_ZEROPAGE_POINTER_ADD:
ConsoleBufferPush(" Usage: <address | symbol>" );
ConsoleBufferPush(" Usage: # <address | symbol> [address...]" );
ConsoleBufferPush(" Adds the specified memory location to the zero page pointer window." );
ConsoleBufferPush(" Update the specified zero page pointer (#) with the address." );
ConsoleBufferPush(" Note: Displayed as symbol name (if possible) and the 16-bit target pointer" );
ConsoleBufferPush(" Examples:" );
wsprintf( sText, " %s CH", pCommand->m_sName );
ConsoleBufferPush( sText );
wsprintf( sText, " %s 0 CV", pCommand->m_sName );
ConsoleBufferPush( sText );
wsprintf( sText, " %s 0 CV CH", pCommand->m_sName );
ConsoleBufferPush( sText );
break;
case CMD_ZEROPAGE_POINTER_CLEAR:
ConsoleBufferPush( TEXT(" Usage: [# | *]") );
ConsoleBufferPush( TEXT(" Clears specified zero page pointer, or all.") );
wsprintf( sText, TEXT(" i.e. %s 1" ), pCommand->m_sName );
ConsoleBufferPush( sText );
break;
case CMD_ZEROPAGE_POINTER_0:
case CMD_ZEROPAGE_POINTER_1:
case CMD_ZEROPAGE_POINTER_2:
case CMD_ZEROPAGE_POINTER_3:
case CMD_ZEROPAGE_POINTER_4:
case CMD_ZEROPAGE_POINTER_5:
case CMD_ZEROPAGE_POINTER_6:
case CMD_ZEROPAGE_POINTER_7:
ConsoleBufferPush( TEXT(" Usage: [<address | symbol>]" ) );
ConsoleBufferPush( TEXT(" If no address specified, will remove watching the zero page pointer." ) );
break;
// Misc // Misc
case CMD_VERSION: case CMD_VERSION:

View File

@ -48,43 +48,45 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// NOTE: ArgToken_e and g_aTokens must match! // NOTE: ArgToken_e and g_aTokens must match!
const TokenTable_t g_aTokens[ NUM_TOKENS ] = const TokenTable_t g_aTokens[ NUM_TOKENS ] =
{ // Input { // Input
{ TOKEN_ALPHANUMERIC, TYPE_STRING , 0 }, // Default, if doen't match anything else { TOKEN_ALPHANUMERIC, TYPE_STRING , 0 }, // Default, if doen't match anything else
{ TOKEN_AMPERSAND , TYPE_OPERATOR, TEXT('&') }, // bit-and { TOKEN_AMPERSAND , TYPE_OPERATOR, "&" }, // bit-and
{ TOKEN_AT , TYPE_OPERATOR, TEXT('@') }, // reference results { TOKEN_AT , TYPE_OPERATOR, "@" }, // reference results
{ TOKEN_BSLASH , TYPE_OPERATOR, TEXT('\\') }, { TOKEN_BRACE_L , TYPE_STRING , "{" },
{ TOKEN_CARET , TYPE_OPERATOR, TEXT('^') }, // bit-eor, C/C++: xor, Math: POWER { TOKEN_BRACE_R , TYPE_STRING , "}" },
{ TOKEN_COLON , TYPE_OPERATOR, TEXT(':') }, { TOKEN_BRACKET_L , TYPE_STRING , "[" },
{ TOKEN_COMMA , TYPE_OPERATOR, TEXT(',') }, { TOKEN_BRACKET_R , TYPE_STRING , "]" },
{ TOKEN_DOLLAR , TYPE_STRING , TEXT('$') }, { TOKEN_BSLASH , TYPE_OPERATOR, "\\" },
{ TOKEN_EQUAL , TYPE_OPERATOR, TEXT('=') }, { TOKEN_CARET , TYPE_OPERATOR, "^" }, // bit-eor, C/C++: xor, Math: POWER
{ TOKEN_EXCLAMATION , TYPE_OPERATOR, TEXT('!') }, // NOT { TOKEN_COLON , TYPE_OPERATOR, ":" },
{ TOKEN_FSLASH , TYPE_OPERATOR, TEXT('/') }, // div { TOKEN_COMMA , TYPE_OPERATOR, "," },
{ TOKEN_GREATER_THAN, TYPE_OPERATOR, TEXT('>') }, // TODO/FIXME: Parser will break up '>=' (needed for uber breakpoints) { TOKEN_DOLLAR , TYPE_STRING , "$" },
{ TOKEN_HASH , TYPE_OPERATOR, TEXT('#') }, { TOKEN_EQUAL , TYPE_OPERATOR, "=" },
{ TOKEN_LEFT_PAREN , TYPE_OPERATOR, TEXT('(') }, { TOKEN_EXCLAMATION , TYPE_OPERATOR, "!" }, // NOT
{ TOKEN_LESS_THAN , TYPE_OPERATOR, TEXT('<') }, { TOKEN_FSLASH , TYPE_OPERATOR, "/" }, // div
{ TOKEN_MINUS , TYPE_OPERATOR, TEXT('-') }, // sub { TOKEN_GREATER_THAN, TYPE_OPERATOR, ">" }, // TODO/FIXME: Parser will break up '>=' (needed for uber breakpoints)
{ TOKEN_PERCENT , TYPE_OPERATOR, TEXT('%') }, // mod { TOKEN_HASH , TYPE_OPERATOR, "#" },
{ TOKEN_PIPE , TYPE_OPERATOR, TEXT('|') }, // bit-or { TOKEN_LESS_THAN , TYPE_OPERATOR, "<" },
{ TOKEN_PLUS , TYPE_OPERATOR, TEXT('+') }, // add { TOKEN_MINUS , TYPE_OPERATOR, "-" }, // sub
{ TOKEN_PAREN_L , TYPE_OPERATOR, "(" },
{ TOKEN_PAREN_R , TYPE_OPERATOR, ")" },
{ TOKEN_PERCENT , TYPE_OPERATOR, "%" }, // mod
{ TOKEN_PIPE , TYPE_OPERATOR, "|" }, // bit-or
{ TOKEN_PLUS , TYPE_OPERATOR, "+" }, // add
// { TOKEN_QUESTION , TYPE_OPERATOR, TEXT('?') }, // Not a token 1) wildcard needs to stay together with other chars // { TOKEN_QUESTION , TYPE_OPERATOR, TEXT('?') }, // Not a token 1) wildcard needs to stay together with other chars
{ TOKEN_QUOTE_SINGLE, TYPE_QUOTED_1, TEXT('\'') }, { TOKEN_QUOTE_SINGLE, TYPE_QUOTED_1, "\'" },
{ TOKEN_QUOTE_DOUBLE, TYPE_QUOTED_2, TEXT('"') }, // for strings { TOKEN_QUOTE_DOUBLE, TYPE_QUOTED_2, "\"" }, // for strings
{ TOKEN_RIGHT_PAREN , TYPE_OPERATOR, TEXT(')') }, { TOKEN_SEMI , TYPE_STRING , ";" },
{ TOKEN_SEMI , TYPE_STRING , TEXT(';') }, { TOKEN_SPACE , TYPE_STRING , " " }, // space is also a delimiter between tokens/args
{ TOKEN_SPACE , TYPE_STRING , TEXT(' ') }, // space is also a delimiter between tokens/args { TOKEN_STAR , TYPE_OPERATOR, "*" }, // Not a token 1) wildcard needs to stay together with other chars
{ TOKEN_STAR , TYPE_OPERATOR, TEXT('*') } // Not a token 1) wildcard needs to stay together with other chars
// { TOKEN_TAB , TYPE_STRING , TEXT('\t') } // { TOKEN_TAB , TYPE_STRING , TEXT('\t') }
// { TOKEN_TILDE , TYPE_OPERATOR, TEXT('~') }, // C/C++: Not. Used for console. { TOKEN_TILDE , TYPE_OPERATOR, "~" }, // C/C++: Not. Used for console.
{ TOKEN_COMMENT_EOL , TYPE_STRING , "//" },
{ TOKEN_GREATER_EQUAL,TYPE_OPERATOR, ">=" },
{ TOKEN_LESS_EQUAL , TYPE_OPERATOR, "<=" },
{ TOKEN_NOT_EQUAL , TYPE_OPERATOR , "!=" }
}; };
// const TokenTable_t g_aTokens2[ ] =
// { // Input
// { TOKEN_GREATER_EQUAL,TYPE_OPERATOR, TEXT(">=\x00") }, // TODO/FIXME: Parser will break up '>=' (needed for uber breakpoints)
// { TOKEN_LESS_EQUAL , TYPE_OPERATOR, TEXT("<=\x00") }, // TODO/FIXME: Parser will break up '<=' (needed for uber breakpoints)
// }
// Arg ____________________________________________________________________________________________ // Arg ____________________________________________________________________________________________
@ -255,6 +257,9 @@ int ArgsGet ( TCHAR * pInput )
pEnd = SkipUntilToken( pSrc+1, g_aTokens, NUM_TOKENS, &iTokenEnd ); pEnd = SkipUntilToken( pSrc+1, g_aTokens, NUM_TOKENS, &iTokenEnd );
} }
if (iTokenSrc == TOKEN_COMMENT_EOL)
break;
if (iTokenSrc == NO_TOKEN) if (iTokenSrc == NO_TOKEN)
{ {
iTokenSrc = TOKEN_ALPHANUMERIC; iTokenSrc = TOKEN_ALPHANUMERIC;
@ -288,7 +293,7 @@ int ArgsGet ( TCHAR * pInput )
{ {
nLen = MIN( nBuf, MAX_ARG_LEN-1 ); nLen = MIN( nBuf, MAX_ARG_LEN-1 );
_tcsncpy( pArg->sArg, pSrc, nLen ); _tcsncpy( pArg->sArg, pSrc, nLen );
pArg->sArg[ nLen ] = 0; pArg->sArg[ nLen ] = 0;
pArg->nArgLen = nLen; pArg->nArgLen = nLen;
pArg->eToken = iTokenSrc; pArg->eToken = iTokenSrc;
pArg->bType = iType; pArg->bType = iType;
@ -303,8 +308,9 @@ int ArgsGet ( TCHAR * pInput )
if (nLen > 1) if (nLen > 1)
{ {
// Technically, chars aren't allowed to be multi-char // Technically, chars aren't allowed to be multi-char
// But we've extended the syntax to allow the user
// to input High-Bit Apple Text
} }
pEnd++; pEnd++;
} }
@ -689,7 +695,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
} }
if (bProcessMask & (1 << TOKEN_EXCLAMATION)) if (bProcessMask & (1 << TOKEN_EXCLAMATION))
if (pArg->eToken == TOKEN_EXCLAMATION) // NOT_EQUAL ! if (pArg->eToken == TOKEN_EXCLAMATION) // NOT !
{ {
if (! ArgsGetImmediateValue( pNext, & nAddressRHS )) if (! ArgsGetImmediateValue( pNext, & nAddressRHS ))
{ {
@ -755,18 +761,37 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
//=========================================================================== //===========================================================================
const char * ParserFindToken( const char *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e * pToken_ ) const char * ParserFindToken( const char *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e * pToken_ )
{ {
const TokenTable_t *pToken= aTokens; if (! pSrc)
const TCHAR *pName = NULL; return NULL;
for (int iToken = 0; iToken < nTokens; iToken++ )
const TCHAR *pName = NULL;
int iToken;
// Look-ahead for <=
// Look-ahead for >=
for (iToken = _TOKEN_FLAG_MULTI; iToken < NUM_TOKENS; iToken++ )
{ {
pName = & (pToken->sToken); pName = & (g_aTokens[ iToken ].sToken[0]);
if ((pSrc[0] == pName[ 0 ]) &&
(pSrc[1] == pName[ 1 ]))
{
*pToken_ = g_aTokens[ iToken ].eToken;
return pSrc + 2;
}
}
const TokenTable_t *pToken = aTokens;
for (iToken = 0; iToken < _TOKEN_FLAG_MULTI; iToken++ )
{
pName = & (pToken->sToken[0]);
if (*pSrc == *pName) if (*pSrc == *pName)
{ {
if ( pToken_) if ( pToken_)
{ {
*pToken_ = (ArgToken_e) iToken; *pToken_ = (ArgToken_e) iToken;
} }
return pSrc; return pSrc + 1;
} }
pToken++; pToken++;
} }
@ -792,9 +817,7 @@ const TCHAR * FindTokenOrAlphaNumeric ( const TCHAR *pSrc, const TokenTable_t *a
else else
{ {
pEnd = ParserFindToken( pSrc, aTokens, nTokens, pToken_ ); pEnd = ParserFindToken( pSrc, aTokens, nTokens, pToken_ );
if (pEnd) if (! pEnd)
pEnd = pSrc + 1; // _tcslen( pToken );
else
pEnd = pSrc; pEnd = pSrc;
} }
} }

View File

@ -14,6 +14,13 @@
, _6502_NUM_FLAGS = 8 , _6502_NUM_FLAGS = 8
}; };
enum RangeType_t
{
RANGE_MISSING_ARG_2 = 0, // error
RANGE_HAS_LEN , // valid case 1
RANGE_HAS_END , // valid case 2
};
struct AddressingMode_t struct AddressingMode_t
{ {
TCHAR m_sFormat[ MAX_OPMODE_FORMAT ]; TCHAR m_sFormat[ MAX_OPMODE_FORMAT ];
@ -196,7 +203,8 @@
BP_OP_LESS_EQUAL , // <= REG BP_OP_LESS_EQUAL , // <= REG
BP_OP_LESS_THAN , // < REG BP_OP_LESS_THAN , // < REG
BP_OP_EQUAL , // = REG BP_OP_EQUAL , // = REG
BP_OP_NOT_EQUAL , // ! REG BP_OP_NOT_EQUAL , // != REG
// BP_OP_NOT_EQUAL_1 , // ! REG
BP_OP_GREATER_THAN , // > REG BP_OP_GREATER_THAN , // > REG
BP_OP_GREATER_EQUAL, // >= REG BP_OP_GREATER_EQUAL, // >= REG
BP_OP_READ , // @ MEM @ ? * BP_OP_READ , // @ MEM @ ? *
@ -345,7 +353,14 @@
, NUM_COLORS , NUM_COLORS
}; };
// Config _________________________________________________________________________________________
enum ConfigSave_t
{
CONFIG_SAVE_FILE_CREATE,
CONFIG_SAVE_FILE_APPEND
};
// Commands _______________________________________________________________________________________ // Commands _______________________________________________________________________________________
enum Update_e enum Update_e
@ -395,7 +410,7 @@
// NOTE: Commands_e and g_aCommands[] order _MUST_ match !!! Aliases are listed at the end // NOTE: Commands_e and g_aCommands[] order _MUST_ match !!! Aliases are listed at the end
enum Commands_e enum Commands_e
{ {
// Main / CPU // CPU
CMD_CURSOR_JUMP_PC // Shift CMD_CURSOR_JUMP_PC // Shift
, CMD_CURSOR_SET_PC // Ctrl , CMD_CURSOR_SET_PC // Ctrl
, CMD_ASSEMBLE , CMD_ASSEMBLE
@ -407,18 +422,29 @@
, CMD_JSR , CMD_JSR
, CMD_NOP , CMD_NOP
, CMD_OUT , CMD_OUT
// CPU - Meta Info
, CMD_PROFILE
, CMD_REGISTER_SET
// CPU - Stack
// , CMD_STACK_LIST
, CMD_STACK_POP
, CMD_STACK_POP_PSEUDO
, CMD_STACK_PUSH
// , CMD_STACK_RETURN
, CMD_STEP_OVER , CMD_STEP_OVER
, CMD_STEP_OUT , CMD_STEP_OUT
// CPU - Meta Info
, CMD_TRACE , CMD_TRACE
, CMD_TRACE_FILE , CMD_TRACE_FILE
, CMD_TRACE_LINE , CMD_TRACE_LINE
, CMD_UNASSEMBLE , CMD_UNASSEMBLE
// Bookmarks // Bookmarks
, CMD_BOOKMARK_MENU , CMD_BOOKMARK
, CMD_BOOKMARK_ADD , CMD_BOOKMARK_ADD
, CMD_BOOKMARK_CLEAR , CMD_BOOKMARK_CLEAR
, CMD_BOOKMARK_LIST , CMD_BOOKMARK_LIST
, CMD_BOOKMARK_LOAD // , CMD_BOOKMARK_LOAD
, CMD_BOOKMARK_GOTO
, CMD_BOOKMARK_SAVE , CMD_BOOKMARK_SAVE
// Breakpoints // Breakpoints
, CMD_BREAKPOINT , CMD_BREAKPOINT
@ -436,19 +462,17 @@
, CMD_BREAKPOINT_EDIT , CMD_BREAKPOINT_EDIT
, CMD_BREAKPOINT_ENABLE , CMD_BREAKPOINT_ENABLE
, CMD_BREAKPOINT_LIST , CMD_BREAKPOINT_LIST
, CMD_BREAKPOINT_LOAD // , CMD_BREAKPOINT_LOAD
, CMD_BREAKPOINT_SAVE , CMD_BREAKPOINT_SAVE
// Benchmark / Timing // Benchmark / Timing
, CMD_BENCHMARK
// , CMD_BENCHMARK_START // , CMD_BENCHMARK_START
// , CMD_BENCHMARK_STOP // , CMD_BENCHMARK_STOP
, CMD_PROFILE
// , CMD_PROFILE_START // , CMD_PROFILE_START
// , CMD_PROFILE_STOP // , CMD_PROFILE_STOP
// Config (debugger settings) // Config (debugger settings)
, CMD_BENCHMARK
, CMD_CONFIG_BW // BW # rr gg bb , CMD_CONFIG_BW // BW # rr gg bb
, CMD_CONFIG_COLOR // COLOR # rr gg bb , CMD_CONFIG_COLOR // COLOR # rr gg bb
, CMD_CONFIG_MENU
, CMD_CONFIG_DISASM , CMD_CONFIG_DISASM
// , CMD_CONFIG_DISASM_BRANCH // , CMD_CONFIG_DISASM_BRANCH
@ -531,8 +555,8 @@
, CMD_MEMORY_MOVE , CMD_MEMORY_MOVE
, CMD_MEMORY_SAVE , CMD_MEMORY_SAVE
, CMD_MEMORY_SEARCH , CMD_MEMORY_SEARCH
, CMD_MEMORY_SEARCH_ASCII // Ascii Text // , CMD_MEMORY_SEARCH_ASCII // Ascii Text
, CMD_MEMORY_SEARCH_APPLE // Flashing Chars, Hi-Bit Set // , CMD_MEMORY_SEARCH_APPLE // Flashing Chars, Hi-Bit Set
, CMD_MEMORY_SEARCH_HEX , CMD_MEMORY_SEARCH_HEX
, CMD_MEMORY_FILL , CMD_MEMORY_FILL
// Output // Output
@ -541,17 +565,9 @@
, CMD_OUTPUT_PRINT , CMD_OUTPUT_PRINT
, CMD_OUTPUT_PRINTF , CMD_OUTPUT_PRINTF
, CMD_OUTPUT_RUN , CMD_OUTPUT_RUN
// Registers - CPU
, CMD_REGISTER_SET
// Source Level Debugging // Source Level Debugging
, CMD_SOURCE , CMD_SOURCE
, CMD_SYNC , CMD_SYNC
// Stack - CPU
// , CMD_STACK_LIST
, CMD_STACK_POP
, CMD_STACK_POP_PSEUDO
, CMD_STACK_PUSH
// , CMD_STACK_RETURN
// Symbols // Symbols
, CMD_SYMBOLS_LOOKUP , CMD_SYMBOLS_LOOKUP
// , CMD_SYMBOLS // , CMD_SYMBOLS
@ -566,12 +582,13 @@
// , CMD_SYMBOLS_LOAD_2 // , CMD_SYMBOLS_LOAD_2
// , CMD_SYMBOLS_SAVE // , CMD_SYMBOLS_SAVE
// Watch // Watch
, CMD_WATCH
, CMD_WATCH_ADD , CMD_WATCH_ADD
, CMD_WATCH_CLEAR , CMD_WATCH_CLEAR
, CMD_WATCH_DISABLE , CMD_WATCH_DISABLE
, CMD_WATCH_ENABLE , CMD_WATCH_ENABLE
, CMD_WATCH_LIST , CMD_WATCH_LIST
, CMD_WATCH_LOAD // , CMD_WATCH_LOAD
, CMD_WATCH_SAVE , CMD_WATCH_SAVE
// Window // Window
// , CMD_WINDOW_COLOR_CUSTOM // , CMD_WINDOW_COLOR_CUSTOM
@ -610,12 +627,15 @@
, CMD_ZEROPAGE_POINTER_2 , CMD_ZEROPAGE_POINTER_2
, CMD_ZEROPAGE_POINTER_3 , CMD_ZEROPAGE_POINTER_3
, CMD_ZEROPAGE_POINTER_4 , CMD_ZEROPAGE_POINTER_4
, CMD_ZEROPAGE_POINTER_5
, CMD_ZEROPAGE_POINTER_6
, CMD_ZEROPAGE_POINTER_7
, CMD_ZEROPAGE_POINTER_ADD , CMD_ZEROPAGE_POINTER_ADD
, CMD_ZEROPAGE_POINTER_CLEAR , CMD_ZEROPAGE_POINTER_CLEAR
, CMD_ZEROPAGE_POINTER_DISABLE , CMD_ZEROPAGE_POINTER_DISABLE
, CMD_ZEROPAGE_POINTER_ENABLE , CMD_ZEROPAGE_POINTER_ENABLE
, CMD_ZEROPAGE_POINTER_LIST , CMD_ZEROPAGE_POINTER_LIST
, CMD_ZEROPAGE_POINTER_LOAD // , CMD_ZEROPAGE_POINTER_LOAD
, CMD_ZEROPAGE_POINTER_SAVE , CMD_ZEROPAGE_POINTER_SAVE
, NUM_COMMANDS , NUM_COMMANDS
@ -641,14 +661,15 @@
Update_t CmdTraceLine (int nArgs); Update_t CmdTraceLine (int nArgs);
Update_t CmdUnassemble (int nArgs); // code dump, aka, Unassemble Update_t CmdUnassemble (int nArgs); // code dump, aka, Unassemble
// Bookmarks // Bookmarks
Update_t CmdBookmarkMenu (int nArgs); Update_t CmdBookmark (int nArgs);
Update_t CmdBookmarkAdd (int nArgs); Update_t CmdBookmarkAdd (int nArgs);
Update_t CmdBookmarkClear (int nArgs); Update_t CmdBookmarkClear (int nArgs);
Update_t CmdBookmarkList (int nArgs); Update_t CmdBookmarkList (int nArgs);
Update_t CmdBookmarkLoad (int nArgs); Update_t CmdBookmarkGoto (int nArgs);
// Update_t CmdBookmarkLoad (int nArgs);
Update_t CmdBookmarkSave (int nArgs); Update_t CmdBookmarkSave (int nArgs);
// Breakpoints // Breakpoints
Update_t CmdBreakpointMenu (int nArgs); Update_t CmdBreakpoint (int nArgs);
Update_t CmdBreakpointAddSmart(int nArgs); Update_t CmdBreakpointAddSmart(int nArgs);
Update_t CmdBreakpointAddReg (int nArgs); Update_t CmdBreakpointAddReg (int nArgs);
Update_t CmdBreakpointAddPC (int nArgs); Update_t CmdBreakpointAddPC (int nArgs);
@ -659,7 +680,7 @@
Update_t CmdBreakpointEdit (int nArgs); Update_t CmdBreakpointEdit (int nArgs);
Update_t CmdBreakpointEnable (int nArgs); Update_t CmdBreakpointEnable (int nArgs);
Update_t CmdBreakpointList (int nArgs); Update_t CmdBreakpointList (int nArgs);
Update_t CmdBreakpointLoad (int nArgs); // Update_t CmdBreakpointLoad (int nArgs);
Update_t CmdBreakpointSave (int nArgs); Update_t CmdBreakpointSave (int nArgs);
// Benchmark // Benchmark
Update_t CmdBenchmark (int nArgs); Update_t CmdBenchmark (int nArgs);
@ -669,10 +690,10 @@
Update_t CmdProfileStart (int nArgs); Update_t CmdProfileStart (int nArgs);
Update_t CmdProfileStop (int nArgs); Update_t CmdProfileStop (int nArgs);
// Config // Config
Update_t CmdConfigMenu (int nArgs); // Update_t CmdConfigMenu (int nArgs);
Update_t CmdConfigBase (int nArgs); // Update_t CmdConfigBase (int nArgs);
Update_t CmdConfigBaseHex (int nArgs); // Update_t CmdConfigBaseHex (int nArgs);
Update_t CmdConfigBaseDec (int nArgs); // Update_t CmdConfigBaseDec (int nArgs);
Update_t CmdConfigColorMono (int nArgs); Update_t CmdConfigColorMono (int nArgs);
Update_t CmdConfigDisasm (int nArgs); Update_t CmdConfigDisasm (int nArgs);
Update_t CmdConfigFont (int nArgs); Update_t CmdConfigFont (int nArgs);
@ -752,12 +773,13 @@
Update_t CmdSymbolsSave (int nArgs); Update_t CmdSymbolsSave (int nArgs);
Update_t CmdSymbolsSource (int nArgs); Update_t CmdSymbolsSource (int nArgs);
// Watch // Watch
Update_t CmdWatch (int nArgs);
Update_t CmdWatchAdd (int nArgs); Update_t CmdWatchAdd (int nArgs);
Update_t CmdWatchClear (int nArgs); Update_t CmdWatchClear (int nArgs);
Update_t CmdWatchDisable (int nArgs); Update_t CmdWatchDisable (int nArgs);
Update_t CmdWatchEnable (int nArgs); Update_t CmdWatchEnable (int nArgs);
Update_t CmdWatchList (int nArgs); Update_t CmdWatchList (int nArgs);
Update_t CmdWatchLoad (int nArgs); // Update_t CmdWatchLoad (int nArgs);
Update_t CmdWatchSave (int nArgs); Update_t CmdWatchSave (int nArgs);
// Window // Window
Update_t CmdWindow (int nArgs); Update_t CmdWindow (int nArgs);
@ -797,7 +819,7 @@
Update_t CmdZeroPageDisable (int nArgs); Update_t CmdZeroPageDisable (int nArgs);
Update_t CmdZeroPageEnable (int nArgs); Update_t CmdZeroPageEnable (int nArgs);
Update_t CmdZeroPageList (int nArgs); Update_t CmdZeroPageList (int nArgs);
Update_t CmdZeroPageLoad (int nArgs); // Update_t CmdZeroPageLoad (int nArgs);
Update_t CmdZeroPageSave (int nArgs); Update_t CmdZeroPageSave (int nArgs);
Update_t CmdZeroPagePointer (int nArgs); Update_t CmdZeroPagePointer (int nArgs);
@ -1077,14 +1099,19 @@
*/ */
enum ArgToken_e // Arg Token Type enum ArgToken_e // Arg Token Type
{ {
// Single Char Tokens must come first
TOKEN_ALPHANUMERIC // TOKEN_ALPHANUMERIC //
, TOKEN_AMPERSAND // & , TOKEN_AMPERSAND // &
, TOKEN_AT // @ results dereference. i.e. S 0,FFFF C030; L @1 , TOKEN_AT // @ results dereference. i.e. S 0,FFFF C030; L @1
, TOKEN_BRACE_L // {
, TOKEN_BRACE_R // }
, TOKEN_BRACKET_L // [
, TOKEN_BRACKET_R // ]
, TOKEN_BSLASH // \xx Hex Literal , TOKEN_BSLASH // \xx Hex Literal
, TOKEN_CARET // ^ , TOKEN_CARET // ^
// , TOKEN_CHAR // , TOKEN_CHAR
, TOKEN_COLON // : Range Argument1.n2 = Argument2 , TOKEN_COLON // : Range
, TOKEN_COMMA // , Length Argument1.n2 = Argument2 , TOKEN_COMMA // , Length
// , TOKEN_DIGIT // , TOKEN_DIGIT
, TOKEN_DOLLAR // $ Address (symbol lookup forced) , TOKEN_DOLLAR // $ Address (symbol lookup forced)
, TOKEN_EQUAL // = Assign Argment.n2 = Argument2 , TOKEN_EQUAL // = Assign Argment.n2 = Argument2
@ -1092,26 +1119,32 @@
, TOKEN_FSLASH // / , TOKEN_FSLASH // /
, TOKEN_GREATER_THAN // > , TOKEN_GREATER_THAN // >
, TOKEN_HASH // # Value no symbol lookup , TOKEN_HASH // # Value no symbol lookup
, TOKEN_LEFT_PAREN // (
, TOKEN_LESS_THAN // < , TOKEN_LESS_THAN // <
, TOKEN_MINUS // - Delta Argument1 -= Argument2 , TOKEN_MINUS // - Delta Argument1 -= Argument2
, TOKEN_PAREN_L // (
, TOKEN_PAREN_R // )
, TOKEN_PERCENT // % , TOKEN_PERCENT // %
, TOKEN_PIPE // | , TOKEN_PIPE // |
, TOKEN_PLUS // + Delta Argument1 += Argument2 , TOKEN_PLUS // + Delta Argument1 += Argument2
, TOKEN_QUOTE_SINGLE // ' , TOKEN_QUOTE_SINGLE // '
, TOKEN_QUOTE_DOUBLE // " , TOKEN_QUOTE_DOUBLE // "
, TOKEN_RIGHT_PAREN // )
, TOKEN_SEMI // ; Command Seperator , TOKEN_SEMI // ; Command Seperator
, TOKEN_SPACE // Token Delimiter , TOKEN_SPACE // Token Delimiter
, TOKEN_STAR // * , TOKEN_STAR // *
// , TOKEN_TAB // '\t' // , TOKEN_TAB // '\t'
, TOKEN_TILDE // ~
// Multi char tokens come last
, TOKEN_COMMENT_EOL // //
,_TOKEN_FLAG_MULTI = TOKEN_COMMENT_EOL
, TOKEN_GREATER_EQUAL// >=
, TOKEN_LESS_EQUAL // <=
, TOKEN_NOT_EQUAL // !=
// , TOKEN_COMMENT_1 // /*
// , TOKEN_COMMENT_2 // */
, NUM_TOKENS // signal none, or bad , NUM_TOKENS // signal none, or bad
, NO_TOKEN = NUM_TOKENS , NO_TOKEN = NUM_TOKENS
// Merged tokens
, TOKEN_LESS_EQUAL //
, TOKEN_GREATER_EQUAL //
}; };
enum ArgType_e enum ArgType_e
@ -1132,7 +1165,7 @@
{ {
ArgToken_e eToken; ArgToken_e eToken;
ArgType_e eType ; ArgType_e eType ;
TCHAR sToken; // char intentional char sToken[4];
}; };
struct Arg_t struct Arg_t
@ -1159,7 +1192,8 @@
, PARAM_BP_LESS_EQUAL = _PARAM_BREAKPOINT_BEGIN // <= , PARAM_BP_LESS_EQUAL = _PARAM_BREAKPOINT_BEGIN // <=
, PARAM_BP_LESS_THAN // < , PARAM_BP_LESS_THAN // <
, PARAM_BP_EQUAL // = , PARAM_BP_EQUAL // =
, PARAM_BP_NOT_EQUAL // ! , PARAM_BP_NOT_EQUAL // !=
, PARAM_BP_NOT_EQUAL_1 // !
, PARAM_BP_GREATER_THAN // > , PARAM_BP_GREATER_THAN // >
, PARAM_BP_GREATER_EQUAL // >= , PARAM_BP_GREATER_EQUAL // >=
, PARAM_BP_READ // R , PARAM_BP_READ // R
@ -1220,6 +1254,7 @@
, _PARAM_GENERAL_BEGIN = _PARAM_FONT_END // Daisy Chain , _PARAM_GENERAL_BEGIN = _PARAM_FONT_END // Daisy Chain
, PARAM_FIND = _PARAM_GENERAL_BEGIN , PARAM_FIND = _PARAM_GENERAL_BEGIN
, PARAM_BRANCH , PARAM_BRANCH
, PARAM_CATEGORY
, PARAM_CLEAR , PARAM_CLEAR
, PARAM_LOAD , PARAM_LOAD
, PARAM_LIST , PARAM_LIST
@ -1234,20 +1269,22 @@
, _PARAM_HELPCATEGORIES_BEGIN = _PARAM_GENERAL_END // Daisy Chain , _PARAM_HELPCATEGORIES_BEGIN = _PARAM_GENERAL_END // Daisy Chain
, PARAM_WILDSTAR = _PARAM_HELPCATEGORIES_BEGIN , PARAM_WILDSTAR = _PARAM_HELPCATEGORIES_BEGIN
, PARAM_CAT_BOOKMARKS , PARAM_CAT_BOOKMARKS
, PARAM_CAT_BREAKPOINTS , PARAM_CAT_BREAKPOINTS
, PARAM_CAT_CONFIG , PARAM_CAT_CONFIG
, PARAM_CAT_CPU , PARAM_CAT_CPU
, PARAM_CAT_FLAGS // , PARAM_CAT_EXPRESSION
, PARAM_CAT_HELP , PARAM_CAT_FLAGS
, PARAM_CAT_MEMORY , PARAM_CAT_HELP
,_PARAM_CAT_MEM // alias MEM = MEMORY , PARAM_CAT_MEMORY
, PARAM_CAT_OUTPUT , PARAM_CAT_OUTPUT
, PARAM_CAT_REGISTERS , PARAM_CAT_OPERATORS
, PARAM_CAT_SYMBOLS , PARAM_CAT_RANGE
, PARAM_CAT_WATCHES // , PARAM_CAT_REGISTERS
, PARAM_CAT_WINDOW , PARAM_CAT_SYMBOLS
, PARAM_CAT_ZEROPAGE , PARAM_CAT_WATCHES
, PARAM_CAT_WINDOW
, PARAM_CAT_ZEROPAGE
, _PARAM_HELPCATEGORIES_END , _PARAM_HELPCATEGORIES_END
, PARAM_HELPCATEGORIES_NUM = _PARAM_HELPCATEGORIES_END - _PARAM_HELPCATEGORIES_BEGIN , PARAM_HELPCATEGORIES_NUM = _PARAM_HELPCATEGORIES_END - _PARAM_HELPCATEGORIES_BEGIN
@ -1345,7 +1382,7 @@
enum enum
{ {
MAX_WATCHES = 6 MAX_WATCHES = 8
}; };
@ -1378,6 +1415,6 @@
enum enum
{ {
MAX_ZEROPAGE_POINTERS = 6 MAX_ZEROPAGE_POINTERS = 8
}; };