X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommon%2Fcpu.c;h=9f38f07ceab4cd67eb73b263c73dbe59d2a7eb85;hb=7bd19b737aacfcf0d81e2bc3a6e537ee72a4eb2f;hp=1d127bcc1d179e61cfc20f566fac6ad874036d02;hpb=045dfad6b5f673fed3419e8a984689e07fbeac0c;p=cc65 diff --git a/src/common/cpu.c b/src/common/cpu.c index 1d127bcc1..9f38f07ce 100644 --- a/src/common/cpu.c +++ b/src/common/cpu.c @@ -1,15 +1,15 @@ /*****************************************************************************/ /* */ -/* cpu.c */ +/* cpu.c */ /* */ /* CPU specifications */ /* */ /* */ /* */ -/* (C) 2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2003-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -33,10 +33,11 @@ -#include - /* common */ +#include "addrsize.h" +#include "check.h" #include "cpu.h" +#include "strutil.h" @@ -51,11 +52,28 @@ cpu_t CPU = CPU_UNKNOWN; /* Table with target names */ const char* CPUNames[CPU_COUNT] = { + "none", "6502", + "6502X", "65SC02", "65C02", "65816", "sunplus", + "sweet16", + "huc6280", +}; + +/* Tables with CPU instruction sets */ +const unsigned CPUIsets[CPU_COUNT] = { + CPU_ISET_NONE, + CPU_ISET_6502, + CPU_ISET_6502 | CPU_ISET_6502X, + CPU_ISET_6502 | CPU_ISET_65SC02, + CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02, + CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02 | CPU_ISET_65816, + CPU_ISET_SUNPLUS, + CPU_ISET_SWEET16, + CPU_ISET_6502 | CPU_ISET_65SC02 | CPU_ISET_65C02 | CPU_ISET_HUC6280, }; @@ -66,6 +84,39 @@ const char* CPUNames[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"); + /* NOTREACHED */ + return 0; + } +} + + + 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. @@ -75,7 +126,7 @@ cpu_t FindCPU (const char* Name) /* Check all CPU names */ for (I = 0; I < CPU_COUNT; ++I) { - if (strcmp (CPUNames [I], Name) == 0) { + if (StrCaseCmp (CPUNames [I], Name) == 0) { return (cpu_t)I; } }