mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-11 05:29:55 +00:00
.13 Fixed BSAVE syntax parsing
BSAVE ["Filename"], addr, len .12 Fixed BLOAD syntax parsing BLOAD ["Filename"], addr[, len] .11 Fixed Go syntax parsing G StopAddress [SkipAddress,Length] .10 Changed internal parsing of comma operator. It is now left in the command arguments.
This commit is contained in:
parent
71c5f5616f
commit
78baf063e0
@ -230,7 +230,16 @@ Update_t CmdHelpSpecific (int nArgs)
|
|||||||
nArgs = nNewArgs;
|
nArgs = nNewArgs;
|
||||||
for (iArg = 1; iArg <= nArgs; iArg++ )
|
for (iArg = 1; iArg <= nArgs; iArg++ )
|
||||||
{
|
{
|
||||||
|
#if DEBUG_VAL_2
|
||||||
g_aArgs[ iArg ].nVal2 = iCmdBegin + iArg - 1;
|
g_aArgs[ iArg ].nVal2 = iCmdBegin + iArg - 1;
|
||||||
|
#endif
|
||||||
|
// insert: ,#
|
||||||
|
_Args_Insert( iArg, nArgs, 2 );
|
||||||
|
g_aArgs[ iArg + 1 ].eToken = TOKEN_COMMA;
|
||||||
|
g_aArgs[ iArg + 2 ].nValue = iCmdBegin + iArg - 1;
|
||||||
|
|
||||||
|
nArgs += 2;
|
||||||
|
iArg += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,7 +252,14 @@ Update_t CmdHelpSpecific (int nArgs)
|
|||||||
|
|
||||||
if (bCategory)
|
if (bCategory)
|
||||||
{
|
{
|
||||||
|
if (g_aArgs[ iArg + 1 ].eToken == TOKEN_COMMA)
|
||||||
|
{
|
||||||
|
if ((iArg + 2) <= nArgs)
|
||||||
|
iCommand = g_aArgs[ iArg + 2 ].nValue;
|
||||||
|
}
|
||||||
|
#if DEBUG_VAL_2
|
||||||
iCommand = g_aArgs[iArg].nVal2;
|
iCommand = g_aArgs[iArg].nVal2;
|
||||||
|
#endif
|
||||||
nFound = 1;
|
nFound = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +279,7 @@ Update_t CmdHelpSpecific (int nArgs)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((nArgs == 1) && (! nFound))
|
if ((nArgs == 1) && (! nFound))
|
||||||
iCommand = g_aArgs[iArg].nVal1;
|
iCommand = g_aArgs[iArg].nValue;
|
||||||
|
|
||||||
Command_t *pCommand = & g_aCommands[ iCommand ];
|
Command_t *pCommand = & g_aCommands[ iCommand ];
|
||||||
|
|
||||||
@ -379,13 +395,16 @@ Update_t CmdHelpSpecific (int nArgs)
|
|||||||
ConsoleBufferPush( TEXT("i.e. #F (if you don't want flags val)" ) );
|
ConsoleBufferPush( TEXT("i.e. #F (if you don't want flags val)" ) );
|
||||||
break;
|
break;
|
||||||
case CMD_GO:
|
case CMD_GO:
|
||||||
ConsoleBufferPush( TEXT(" Usage: [address | symbol [Skip,End]]") );
|
ConsoleBufferPush( TEXT(" Usage: address | symbol [Skip,Length]]") );
|
||||||
ConsoleBufferPush( TEXT(" Skip: Start address to skip stepping" ) );
|
ConsoleBufferPush( TEXT(" addres | symbol [Start:End]") );
|
||||||
ConsoleBufferPush( TEXT(" End : End address to skip stepping" ) );
|
ConsoleBufferPush( TEXT(" Skip : Start address to skip stepping" ) );
|
||||||
ConsoleBufferPush( TEXT(" If the Program Counter is outside the" ) );
|
ConsoleBufferPush( TEXT(" Length: Range of bytes past start address to skip stepping" ) );
|
||||||
ConsoleBufferPush( TEXT(" skip range, resumes single-stepping." ) );
|
ConsoleBufferPush( TEXT(" End : Inclusive end address to skip stepping" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" If the Program Counter is outside the skip range, resumes single-stepping." ) );
|
||||||
ConsoleBufferPush( TEXT(" Can be used to skip ROM/OS/user code." ));
|
ConsoleBufferPush( TEXT(" Can be used to skip ROM/OS/user code." ));
|
||||||
ConsoleBufferPush( TEXT(" i.e. G C600 F000,FFFF" ) );
|
ConsoleBufferPush( TEXT(" Examples:" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" G C600 FA00,600" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" G C600 F000:FFFF" ) );
|
||||||
break;
|
break;
|
||||||
case CMD_NOP:
|
case CMD_NOP:
|
||||||
ConsoleBufferPush( TEXT(" Puts a NOP opcode at current instruction") );
|
ConsoleBufferPush( TEXT(" Puts a NOP opcode at current instruction") );
|
||||||
@ -616,17 +635,22 @@ Update_t CmdHelpSpecific (int nArgs)
|
|||||||
|
|
||||||
case CMD_MEMORY_LOAD:
|
case CMD_MEMORY_LOAD:
|
||||||
// BLOAD "Filename" addr[,len]
|
// BLOAD "Filename" addr[,len]
|
||||||
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"] address[,length]" ) );
|
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address[,length]" ) );
|
||||||
ConsoleBufferPush( TEXT(" If no filename specified, defaults" ) );
|
ConsoleBufferPush( TEXT(" If no filename specified, defaults to the last filename (if possible)" ) );
|
||||||
ConsoleBufferPush( TEXT(" to the last filename (if possible)" ) );
|
ConsoleBufferPush( TEXT(" Examples:" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" BSAVE \"test\",FF00,100" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" BLOAD \"test\",2000" ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_MEMORY_SAVE:
|
case CMD_MEMORY_SAVE:
|
||||||
// BSAVE ["Filename"] addr,len
|
// BSAVE ["Filename"] addr,len
|
||||||
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"] address,length" ) );
|
ConsoleBufferPush( TEXT(" Usage: [\"Filename\"],address[,length]" ) );
|
||||||
ConsoleBufferPush( TEXT(" If no filename specified, defaults to" ) );
|
ConsoleBufferPush( TEXT(" If no filename specified, defaults to:" ) );
|
||||||
ConsoleBufferPush( TEXT(" '####.####.bin' with the form" ) );
|
ConsoleBufferPush( TEXT(" '####.####.bin' with the form" ) );
|
||||||
ConsoleBufferPush( TEXT(" {address}.{length}.bin" ) );
|
ConsoleBufferPush( TEXT(" {address}.{length}.bin" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" Examples:" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" BSAVE \"test\",FF00,100" ) );
|
||||||
|
ConsoleBufferPush( TEXT(" BLOAD \"test\",2000" ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Symbols
|
// Symbols
|
||||||
|
@ -91,7 +91,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
int _Arg_1( int nValue )
|
int _Arg_1( int nValue )
|
||||||
{
|
{
|
||||||
g_aArgs[1].nVal1 = nValue;
|
g_aArgs[1].nValue = nValue;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,6 +139,28 @@ int _Arg_Shift( int iSrc, int iEnd, int iDst )
|
|||||||
return nArgs;
|
return nArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
int _Args_Insert( int iSrc, int iEnd, int nLen )
|
||||||
|
{
|
||||||
|
iSrc += nLen;
|
||||||
|
int iDst = iEnd + nLen;
|
||||||
|
|
||||||
|
if (iDst > MAX_ARGS)
|
||||||
|
return ARG_SYNTAX_ERROR;
|
||||||
|
|
||||||
|
if (iSrc > MAX_ARGS)
|
||||||
|
return ARG_SYNTAX_ERROR;
|
||||||
|
|
||||||
|
while (nLen--)
|
||||||
|
{
|
||||||
|
g_aArgs[iDst] = g_aArgs[iSrc];
|
||||||
|
iSrc--;
|
||||||
|
iDst--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
void ArgsClear ()
|
void ArgsClear ()
|
||||||
@ -151,8 +173,10 @@ void ArgsClear ()
|
|||||||
pArg->eDevice = NUM_DEVICES; // none
|
pArg->eDevice = NUM_DEVICES; // none
|
||||||
pArg->eToken = NO_TOKEN ; // none
|
pArg->eToken = NO_TOKEN ; // none
|
||||||
pArg->bType = TYPE_STRING;
|
pArg->bType = TYPE_STRING;
|
||||||
pArg->nVal1 = 0;
|
pArg->nValue = 0;
|
||||||
|
#if DEBUG_VAL_2
|
||||||
pArg->nVal2 = 0;
|
pArg->nVal2 = 0;
|
||||||
|
#endif
|
||||||
pArg->sArg[0] = 0;
|
pArg->sArg[0] = 0;
|
||||||
|
|
||||||
pArg++;
|
pArg++;
|
||||||
@ -388,7 +412,7 @@ void ArgsRawParse ( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (! (pArg->bType & TYPE_VALUE)) // already up to date?
|
if (! (pArg->bType & TYPE_VALUE)) // already up to date?
|
||||||
pArg->nVal1 = nAddressValue;
|
pArg->nValue = nAddressValue;
|
||||||
|
|
||||||
pArg->bType |= TYPE_ADDRESS;
|
pArg->bType |= TYPE_ADDRESS;
|
||||||
|
|
||||||
@ -487,7 +511,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
nAddressVal = nAddressSym;
|
nAddressVal = nAddressSym;
|
||||||
pArg->bSymbol = true;
|
pArg->bSymbol = true;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if (bProcessMask & (1 << TOKEN_COMMA))
|
if (bProcessMask & (1 << TOKEN_COMMA))
|
||||||
if (pArg->eToken == TOKEN_COMMA) // COMMMA , length
|
if (pArg->eToken == TOKEN_COMMA) // COMMMA , length
|
||||||
{
|
{
|
||||||
@ -507,7 +531,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
pPrev->bType |= TYPE_RANGE;
|
pPrev->bType |= TYPE_RANGE;
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (bProcessMask & (1 << TOKEN_AMPERSAND))
|
if (bProcessMask & (1 << TOKEN_AMPERSAND))
|
||||||
if (pArg->eToken == TOKEN_AMPERSAND) // AND & delta
|
if (pArg->eToken == TOKEN_AMPERSAND) // AND & delta
|
||||||
{
|
{
|
||||||
@ -515,7 +539,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 &= nAddressRHS;
|
pPrev->nValue &= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -527,7 +551,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 |= nAddressRHS;
|
pPrev->nValue |= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -539,7 +563,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 ^= nAddressRHS;
|
pPrev->nValue ^= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -551,7 +575,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 += nAddressRHS;
|
pPrev->nValue += nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -563,7 +587,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 -= nAddressRHS;
|
pPrev->nValue -= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -575,7 +599,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
{
|
{
|
||||||
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
ArgsGetRegisterValue( pNext, & nAddressRHS );
|
||||||
}
|
}
|
||||||
pPrev->nVal1 %= nAddressRHS;
|
pPrev->nValue %= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -594,7 +618,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
}
|
}
|
||||||
if (! nAddressRHS)
|
if (! nAddressRHS)
|
||||||
nAddressRHS = 1; // divide by zero bug
|
nAddressRHS = 1; // divide by zero bug
|
||||||
pPrev->nVal1 /= nAddressRHS;
|
pPrev->nValue /= nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 2;
|
nParamLen = 2;
|
||||||
}
|
}
|
||||||
@ -602,7 +626,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
if (bProcessMask & (1 << TOKEN_EQUAL))
|
if (bProcessMask & (1 << TOKEN_EQUAL))
|
||||||
if (pArg->eToken == TOKEN_EQUAL) // EQUAL = assign
|
if (pArg->eToken == TOKEN_EQUAL) // EQUAL = assign
|
||||||
{
|
{
|
||||||
pPrev->nVal1 = nAddressRHS;
|
pPrev->nValue = nAddressRHS;
|
||||||
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
pPrev->bType |= TYPE_VALUE; // signal already up to date
|
||||||
nParamLen = 0; // need token for Smart BreakPoints
|
nParamLen = 0; // need token for Smart BreakPoints
|
||||||
}
|
}
|
||||||
@ -614,14 +638,14 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
_Arg_Shift( iArg + nParamLen, nArgs, iArg );
|
_Arg_Shift( iArg + nParamLen, nArgs, iArg );
|
||||||
nArg--;
|
nArg--;
|
||||||
|
|
||||||
pArg->nVal1 = 0; // nAddressRHS;
|
pArg->nValue = 0; // nAddressRHS;
|
||||||
pArg->bSymbol = false;
|
pArg->bSymbol = false;
|
||||||
|
|
||||||
int nPointers = g_vMemorySearchResults.size();
|
int nPointers = g_vMemorySearchResults.size();
|
||||||
if ((nPointers) &&
|
if ((nPointers) &&
|
||||||
(nAddressRHS < nPointers))
|
(nAddressRHS < nPointers))
|
||||||
{
|
{
|
||||||
pArg->nVal1 = g_vMemorySearchResults.at( nAddressRHS );
|
pArg->nValue = g_vMemorySearchResults.at( nAddressRHS );
|
||||||
pArg->bType = TYPE_VALUE | TYPE_ADDRESS | TYPE_NO_REG | TYPE_NO_SYM;
|
pArg->bType = TYPE_VALUE | TYPE_ADDRESS | TYPE_NO_REG | TYPE_NO_SYM;
|
||||||
}
|
}
|
||||||
nParamLen = 0;
|
nParamLen = 0;
|
||||||
@ -630,7 +654,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
if (bProcessMask & (1 << TOKEN_HASH))
|
if (bProcessMask & (1 << TOKEN_HASH))
|
||||||
if (pArg->eToken == TOKEN_HASH) // HASH # immediate
|
if (pArg->eToken == TOKEN_HASH) // HASH # immediate
|
||||||
{
|
{
|
||||||
pArg->nVal1 = nAddressRHS;
|
pArg->nValue = nAddressRHS;
|
||||||
pArg->bSymbol = false;
|
pArg->bSymbol = false;
|
||||||
pArg->bType = TYPE_VALUE | TYPE_ADDRESS | TYPE_NO_REG | TYPE_NO_SYM;
|
pArg->bType = TYPE_VALUE | TYPE_ADDRESS | TYPE_NO_REG | TYPE_NO_SYM;
|
||||||
nParamLen = 0;
|
nParamLen = 0;
|
||||||
@ -658,7 +682,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
nAddressRHS = nAddressVal;
|
nAddressRHS = nAddressVal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pArg->nVal1 = ~nAddressRHS;
|
pArg->nValue = ~nAddressRHS;
|
||||||
pArg->bType |= TYPE_VALUE; // signal already up to date
|
pArg->bType |= TYPE_VALUE; // signal already up to date
|
||||||
// Don't remove, since "SYM ! symbol" needs token to remove symbol
|
// Don't remove, since "SYM ! symbol" needs token to remove symbol
|
||||||
}
|
}
|
||||||
@ -696,7 +720,7 @@ int ArgsCook ( const int nArgs, const int bProcessMask )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (! (pArg->bType & TYPE_VALUE)) // already up to date?
|
if (! (pArg->bType & TYPE_VALUE)) // already up to date?
|
||||||
pArg->nVal1 = nAddressVal;
|
pArg->nValue = nAddressVal;
|
||||||
|
|
||||||
pArg->bType |= TYPE_ADDRESS;
|
pArg->bType |= TYPE_ADDRESS;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
int _Arg_1 ( int nValue );
|
int _Arg_1 ( int nValue );
|
||||||
int _Arg_1 ( LPTSTR pName );
|
int _Arg_1 ( LPTSTR pName );
|
||||||
int _Arg_Shift ( int iSrc, int iEnd, int iDst = 0 );
|
int _Arg_Shift ( int iSrc, int iEnd, int iDst = 0 );
|
||||||
|
int _Args_Insert( int iSrc, int iEnd, int nLen );
|
||||||
void ArgsClear ();
|
void ArgsClear ();
|
||||||
|
|
||||||
bool ArgsGetValue ( Arg_t *pArg, WORD * pAddressValue_, const int nBase = 16 );
|
bool ArgsGetValue ( Arg_t *pArg, WORD * pAddressValue_, const int nBase = 16 );
|
||||||
|
@ -1122,8 +1122,9 @@
|
|||||||
{
|
{
|
||||||
TCHAR sArg[ MAX_ARG_LEN ]; // Array chars comes first, for alignment
|
TCHAR sArg[ MAX_ARG_LEN ]; // Array chars comes first, for alignment
|
||||||
int nArgLen; // Needed for TextSearch "ABC\x00"
|
int nArgLen; // Needed for TextSearch "ABC\x00"
|
||||||
WORD nVal1 ; // 2
|
WORD nValue ; // 2
|
||||||
WORD nVal2 ; // 2 If we have a Len (,)
|
// WORD nVal1 ; // 2
|
||||||
|
// WORD nVal2 ; // 2 If we have a Len (,)
|
||||||
// Enums and Bools should come last for alignment
|
// Enums and Bools should come last for alignment
|
||||||
ArgToken_e eToken ; // 1/2/4
|
ArgToken_e eToken ; // 1/2/4
|
||||||
int bType ; // 1/2/4 // Flags of ArgType_e
|
int bType ; // 1/2/4 // Flags of ArgType_e
|
||||||
|
Loading…
x
Reference in New Issue
Block a user