diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c index 3128231ec..60d78d643 100644 --- a/src/ca65/pseudo.c +++ b/src/ca65/pseudo.c @@ -127,6 +127,11 @@ static unsigned char OptionalAddrSize (void) if (Tok == TOK_COLON) { NextTok (); AddrSize = ParseAddrSize (); + if (!ValidAddrSizeForCPU (AddrSize)) { + /* Print an error and reset to default */ + Error ("Invalid address size specification for current CPU"); + AddrSize = ADDR_SIZE_DEFAULT; + } NextTok (); } return AddrSize; diff --git a/src/common/cpu.c b/src/common/cpu.c index 064614253..e3335f2bd 100644 --- a/src/common/cpu.c +++ b/src/common/cpu.c @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2003-2005, Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2003-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -34,6 +34,8 @@ /* common */ +#include "addrsize.h" +#include "check.h" #include "cpu.h" #include "strutil.h" @@ -82,6 +84,37 @@ const unsigned CPUIsets[CPU_COUNT] = { +int ValidAddrSizeForCPU (unsigned char AddrSize) +/* Check if the given address size is valid for the current CPU */ +{ + switch (AddrSize) { + case ADDR_SIZE_DEFAULT: + /* Always supported */ + return 1; + + case ADDR_SIZE_ZP: + /* Not supported by None and Sweet16 */ + return (CPU != CPU_NONE && CPU != CPU_SWEET16); + + case ADDR_SIZE_ABS: + /* Not supported by None */ + return (CPU != CPU_NONE); + + case ADDR_SIZE_FAR: + /* Only supported by 65816 */ + return (CPU == CPU_65816); + + case ADDR_SIZE_LONG: + /* Not supported by any CPU */ + return 0; + + default: + FAIL ("Invalid address size"); + } +} + + + cpu_t FindCPU (const char* Name) /* Find a CPU by name and return the target id. CPU_UNKNOWN is returned if * the given name is no valid target. diff --git a/src/common/cpu.h b/src/common/cpu.h index 6a6cd73d7..16dd0e309 100644 --- a/src/common/cpu.h +++ b/src/common/cpu.h @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2003-2005, Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2003-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -89,6 +89,9 @@ extern const unsigned CPUIsets[CPU_COUNT]; +int ValidAddrSizeForCPU (unsigned char AddrSize); +/* Check if the given address size is valid for the current CPU */ + cpu_t FindCPU (const char* Name); /* Find a CPU by name and return the target id. CPU_UNKNOWN is returned if * the given name is no valid target.