git-svn-id: svn://svn.cc65.org/cc65/trunk@338 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2000-09-24 20:54:49 +00:00
parent 16bc247cbf
commit 42fb5661f1
14 changed files with 549 additions and 98 deletions

View File

@@ -1,6 +1,6 @@
/*****************************************************************************/
/* */
/* config.c */
/* config.c */
/* */
/* Disassembler configuration file handling */
/* */
@@ -45,6 +45,8 @@
#include "xmalloc.h"
/* da65 */
#include "attrtab.h"
#include "error.h"
#include "global.h"
#include "scanner.h"
#include "config.h"
@@ -127,11 +129,34 @@ static void RangeSection (void)
/* Parse a range section */
{
static const IdentTok RangeDefs[] = {
{ "START", CFGTOK_START },
{ "END", CFGTOK_END },
{ "START", CFGTOK_START },
{ "END", CFGTOK_END },
{ "TYPE", CFGTOK_TYPE },
};
static const IdentTok TypeDefs[] = {
{ "CODE", CFGTOK_CODE },
{ "BYTETABLE", CFGTOK_BYTETAB },
{ "WORDTABLE", CFGTOK_WORDTAB },
{ "ADDRTABLE", CFGTOK_ADDRTAB },
{ "RTSTABLE", CFGTOK_RTSTAB },
};
/* Which values did we get? */
enum {
tNone = 0x00,
tStart = 0x01,
tEnd = 0x02,
tType = 0x04,
tAll = 0x07
} Needed = tNone;
/* Locals - initialize to avoid gcc warnings */
unsigned Start = 0;
unsigned End = 0;
unsigned char Type = 0;
/* Skip the token */
CfgNextTok ();
@@ -141,9 +166,63 @@ static void RangeSection (void)
/* Look for section tokens */
while (CfgTok != CFGTOK_RCURLY) {
/* Convert to special token */
CfgSpecialToken (RangeDefs, ENTRY_COUNT (RangeDefs), "Range directive");
/* Look at the token */
switch (CfgTok) {
case CFGTOK_START:
CfgNextTok ();
CfgAssureInt ();
CfgRangeCheck (0x0000, 0xFFFF);
Start = CfgIVal;
Needed |= tStart;
CfgNextTok ();
break;
case CFGTOK_END:
CfgNextTok ();
CfgAssureInt ();
CfgRangeCheck (0x0000, 0xFFFF);
End = CfgIVal;
Needed |= tEnd;
CfgNextTok ();
break;
case CFGTOK_TYPE:
CfgNextTok ();
CfgSpecialToken (TypeDefs, ENTRY_COUNT (TypeDefs), "Type");
switch (CfgTok) {
case CFGTOK_CODE: Type = atCode; break;
case CFGTOK_BYTETAB: Type = atByteTab; break;
case CFGTOK_WORDTAB: Type = atWordTab; break;
case CFGTOK_ADDRTAB: Type = atAddrTab; break;
case CFGTOK_RTSTAB: Type = atRtsTab; break;
}
Needed |= tType;
CfgNextTok ();
break;
}
/* Directive is followed by a semicolon */
CfgConsumeSemi ();
}
/* Did we get all required values? */
if (Needed != tAll) {
Error ("Required values missing from this section");
}
/* Start must be less than end */
if (Start > End) {
Error ("Start value must not be greater than end value");
}
/* Set the range */
MarkRange (Start, End, Type);
/* Consume the closing brace */
CfgConsumeRCurly ();
}