From c94e82f8b26d4bf400031cbf26f01b57e77beb6b Mon Sep 17 00:00:00 2001 From: uz Date: Tue, 10 Feb 2009 21:10:50 +0000 Subject: [PATCH] Check for and flag address size modifiers that are invalid for the choosen CPU. git-svn-id: svn://svn.cc65.org/cc65/trunk@3927 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/pseudo.c | 5 +++++ src/common/cpu.c | 37 +++++++++++++++++++++++++++++++++++-- src/common/cpu.h | 7 +++++-- 3 files changed, 45 insertions(+), 4 deletions(-) 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.