]> git.sur5r.net Git - cc65/commitdiff
Check for and flag address size modifiers that are invalid for the choosen CPU.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 10 Feb 2009 21:10:50 +0000 (21:10 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 10 Feb 2009 21:10:50 +0000 (21:10 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3927 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/pseudo.c
src/common/cpu.c
src/common/cpu.h

index 3128231ec2fc66c7528418f54f408805d11b2b83..60d78d643f99281549d38d5ec193a69765863d55 100644 (file)
@@ -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;
index 064614253276531aee24e9ca2c7a4c32ed6e2f50..e3335f2bdf5ae0efa193ff5d0bbe06c3ff323fa3 100644 (file)
@@ -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.
index 6a6cd73d7458b53deb532dfec3efef95e0fb37e0..16dd0e3096675a6f8c3c9a86602a1b96627ef513 100644 (file)
@@ -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.