diff --git a/samples/Makefile b/samples/Makefile index 01ad6f983..70e5ff760 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -161,6 +161,7 @@ DIRLIST = tutorial geos atari2600 atari5200 apple2 gamate lynx supervision sym1 EXELIST_apple2 = \ ascii \ + checkversion \ diodemo \ enumdevdir \ gunzip65 \ @@ -177,6 +178,7 @@ EXELIST_apple2enh = $(EXELIST_apple2) EXELIST_atari = \ ascii \ + checkversion \ gunzip65 \ hello \ mandelbrot \ @@ -197,6 +199,7 @@ EXELIST_atari5200 = \ EXELIST_atmos = \ ascii \ + checkversion \ hello \ mandelbrot \ sieve \ @@ -207,6 +210,7 @@ EXELIST_bbc = \ EXELIST_c64 = \ ascii \ + checkversion \ enumdevdir \ gunzip65 \ hello \ @@ -220,6 +224,7 @@ EXELIST_c64 = \ EXELIST_c128 = \ ascii \ + checkversion \ enumdevdir \ gunzip65 \ hello \ @@ -231,12 +236,14 @@ EXELIST_c128 = \ EXELIST_c16 = \ ascii \ + checkversion \ enumdevdir \ tinyshell \ hello EXELIST_cbm510 = \ ascii \ + checkversion \ gunzip65 \ hello \ mousedemo \ @@ -245,6 +252,7 @@ EXELIST_cbm510 = \ EXELIST_cbm610 = \ ascii \ + checkversion \ gunzip65 \ hello \ tinyshell \ @@ -252,10 +260,12 @@ EXELIST_cbm610 = \ EXELIST_creativision = \ ascii \ + checkversion \ hello EXELIST_cx16 = \ ascii \ + checkversion \ enumdevdir \ gunzip65 \ hello \ @@ -266,10 +276,12 @@ EXELIST_cx16 = \ tgidemo EXELIST_gamate = \ + checkversion \ hello EXELIST_geos-cbm = \ ascii \ + checkversion \ diodemo EXELIST_geos-apple = \ @@ -282,16 +294,19 @@ EXELIST_lynx = \ notavailable EXELIST_nes = \ + checkversion \ hello EXELIST_osic1p = \ notavailable EXELIST_pce = \ + checkversion \ hello EXELIST_pet = \ ascii \ + checkversion \ enumdevdir \ hello \ tinyshell \ @@ -299,6 +314,7 @@ EXELIST_pet = \ EXELIST_plus4 = \ ascii \ + checkversion \ enumdevdir \ gunzip65 \ hello \ @@ -306,6 +322,7 @@ EXELIST_plus4 = \ sieve EXELIST_sim6502 = \ + checkversion \ gunzip65 EXELIST_sim65c02 = $(EXELIST_sim6502) @@ -318,6 +335,7 @@ EXELIST_sym1 = \ EXELIST_telestrat = \ ascii \ + checkversion \ gunzip65 \ hello \ mandelbrot \ @@ -326,6 +344,7 @@ EXELIST_telestrat = \ EXELIST_vic20 = \ ascii \ + checkversion \ enumdevdir \ hello \ mandelbrot \ diff --git a/samples/checkversion.c b/samples/checkversion.c new file mode 100644 index 000000000..1d3494a87 --- /dev/null +++ b/samples/checkversion.c @@ -0,0 +1,40 @@ + +/* Until 2.19 the __CC65__ macro was defined as (VER_MAJOR * 0x100) + (VER_MINOR * 0x10), + * which caused it to contain broken values in compiler releases 2.16 to 2.19. The + * macro was fixed some time after 2.19 to (VER_MAJOR * 0x100) + VER_MINOR. + * + * The following strategy can be used to still compare for less or greater versions, + * should this really be necessary or wanted - it is not recommended afterall. + */ + +#include +#include + +#if ((__CC65__ & 0xff00) > 3) || ((__CC65__ & 0x000f) > 0) +/* compiler version is 2.19-git or higher */ +# define VER_MAJOR ((__CC65__ >> 8) & 0xff) +# define VER_MINOR (__CC65__ & 0xff) +#elif ((__CC65__ & 0xff00) == 3) +/* broken values in version 2.16 - 2.19-git before the bug was fixed */ +# define VER_MAJOR 2 +# define VER_MINOR (((__CC65__ >> 4) & 0x0f) + 16) +#else +/* values before 2.16 */ +# define VER_MAJOR ((__CC65__ >> 8) & 0xff) +# define VER_MINOR ((__CC65__ >> 4) & 0x0f) +#endif + +/* define a new value that will work for comparing all versions */ +#define VERSION ((VER_MAJOR << 8) + VER_MINOR) + +int main(void) +{ + printf("__CC65__ defined as %04x\n", __CC65__); + printf("compiler version is %u.%u\n", VER_MAJOR, VER_MINOR); + if (__CC65__ == VERSION) { + printf("__CC65__ is defined correctly as (VER_MAJOR * 0x100) + VER_MINOR\n"); + return EXIT_SUCCESS; + } + printf("__CC65__ is incorrectly defined as (VER_MAJOR * 0x100) + (VER_MINOR * 0x10)\n"); + return EXIT_FAILURE; +}