From 622d2c4e39f948056e87bb8fd1d03993895e582d Mon Sep 17 00:00:00 2001
From: Wayne Parham <wayne@parhamdata.com>
Date: Wed, 24 Nov 2021 14:30:19 -0600
Subject: [PATCH 01/20] Added Sym-1 link to documentation doc/index.sgml

---
 doc/index.sgml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/index.sgml b/doc/index.sgml
index 01325529d..3bb085bf6 100644
--- a/doc/index.sgml
+++ b/doc/index.sgml
@@ -172,6 +172,9 @@
   <tag><htmlurl url="supervision.html" name="supervision.html"></tag>
   Topics specific to the Watara Supervision Console.
 
+  <tag><htmlurl url="sym1.html" name="sym1.html"></tag>
+  Topics specific to the Synertek Systems Sym-1.
+
   <tag><htmlurl url="telestrat.html" name="telestrat.html"></tag>
   Topics specific to the Oric Telestrat.
 

From 38511843e5172e93204480dbc3f5ebe1c7a6c774 Mon Sep 17 00:00:00 2001
From: acqn <acqn163@outlook.com>
Date: Mon, 3 Jan 2022 23:50:48 +0800
Subject: [PATCH 02/20] Fixed crash with labels in non-function/block scopes.

---
 src/cc65/declare.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/cc65/declare.c b/src/cc65/declare.c
index c1346e872..8af67524f 100644
--- a/src/cc65/declare.c
+++ b/src/cc65/declare.c
@@ -1485,7 +1485,7 @@ static void ParseTypeSpec (DeclSpec* D, long Default, TypeCode Qualifiers,
                 ** long as it has no qualifiers.
                 */
                 D->Flags |= DS_DEF_TYPE;
-                D->Type[0].C = T_QUAL_NONE;
+                D->Type[0].C = T_INT;
                 D->Type[1].C = T_END;
                 break;
             }

From 6beb090193ee932ee67bed553f54d721c48c276d Mon Sep 17 00:00:00 2001
From: acqn <acqn163@outlook.com>
Date: Mon, 3 Jan 2022 23:54:14 +0800
Subject: [PATCH 03/20] Fixed anonymous bit-fields declared with typedef'ed
 type names.

---
 src/cc65/declare.c |  2 +-
 src/cc65/symtab.c  | 95 +++++++++++++++++++++++++++++++++++++---------
 src/cc65/symtab.h  | 23 ++++++++++-
 3 files changed, 100 insertions(+), 20 deletions(-)

diff --git a/src/cc65/declare.c b/src/cc65/declare.c
index 8af67524f..fa4c52818 100644
--- a/src/cc65/declare.c
+++ b/src/cc65/declare.c
@@ -1462,7 +1462,7 @@ static void ParseTypeSpec (DeclSpec* D, long Default, TypeCode Qualifiers,
 
         case TOK_IDENT:
             /* This could be a label */
-            if (NextTok.Tok != TOK_COLON) {
+            if (NextTok.Tok != TOK_COLON || GetLexicalLevel () == LEX_LEVEL_STRUCT) {
                 Entry = FindSym (CurTok.Ident);
                 if (Entry && SymIsTypeDef (Entry)) {
                     /* It's a typedef */
diff --git a/src/cc65/symtab.c b/src/cc65/symtab.c
index 3de0bb460..c1c5c4696 100644
--- a/src/cc65/symtab.c
+++ b/src/cc65/symtab.c
@@ -88,7 +88,8 @@ SymTable        EmptySymTab = {
 #define SYMTAB_SIZE_LABEL         7U
 
 /* The current and root symbol tables */
-static unsigned         LexicalLevel    = 0;    /* For safety checks */
+static unsigned         LexLevelDepth   = 0;    /* For safety checks */
+static LexicalLevel*    CurrentLex        = 0;
 static SymTable*        SymTab0         = 0;
 static SymTable*        SymTab          = 0;
 static SymTable*        TagTab0         = 0;
@@ -213,10 +214,46 @@ static void CheckSymTable (SymTable* Tab)
 
 
 
+unsigned GetLexicalLevelDepth (void)
+/* Return the current lexical level depth */
+{
+    return LexLevelDepth;
+}
+
+
+
 unsigned GetLexicalLevel (void)
 /* Return the current lexical level */
 {
-    return LexicalLevel;
+    if (CurrentLex != 0) {
+        return CurrentLex->CurrentLevel;
+    }
+    return LEX_LEVEL_NONE;
+}
+
+
+
+void PushLexicalLevel (unsigned NewLevel)
+/* Enter the specified lexical level */
+{
+    LexicalLevel* L = xmalloc (sizeof (LexicalLevel));
+    L->PrevLex = CurrentLex;
+    CurrentLex = L;
+    CurrentLex->CurrentLevel = NewLevel;
+    ++LexLevelDepth;
+}
+
+
+
+void PopLexicalLevel (void)
+/* Exit the current lexical level */
+{
+    LexicalLevel* L;
+    PRECONDITION (CurrentLex != 0 && LexLevelDepth > 0);
+    L = CurrentLex;
+    CurrentLex = L->PrevLex;
+    xfree (L);
+    --LexLevelDepth;
 }
 
 
@@ -225,7 +262,10 @@ void EnterGlobalLevel (void)
 /* Enter the program global lexical level */
 {
     /* Safety */
-    PRECONDITION (++LexicalLevel == LEX_LEVEL_GLOBAL);
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_NONE);
+
+    /* Enter global lexical level */
+    PushLexicalLevel (LEX_LEVEL_GLOBAL);
 
     /* Create and assign the symbol table */
     SymTab0 = SymTab = NewSymTable (SYMTAB_SIZE_GLOBAL);
@@ -246,7 +286,7 @@ void LeaveGlobalLevel (void)
 /* Leave the program global lexical level */
 {
     /* Safety */
-    PRECONDITION (LexicalLevel-- == LEX_LEVEL_GLOBAL);
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_GLOBAL);
 
     /* Check the tables */
     CheckSymTable (SymTab0);
@@ -260,6 +300,9 @@ void LeaveGlobalLevel (void)
     /* Don't delete the symbol and struct tables! */
     SymTab = 0;
     TagTab = 0;
+
+    /* Exit global lexical level */
+    PopLexicalLevel ();
 }
 
 
@@ -269,8 +312,8 @@ void EnterFunctionLevel (void)
 {
     SymTable* S;
 
-    /* New lexical level */
-    ++LexicalLevel;
+    /* Enter function lexical level */
+    PushLexicalLevel (LEX_LEVEL_FUNCTION);
 
     /* Get a new symbol table and make it current */
     S = NewSymTable (SYMTAB_SIZE_FUNCTION);
@@ -293,8 +336,11 @@ void EnterFunctionLevel (void)
 void RememberFunctionLevel (struct FuncDesc* F)
 /* Remember the symbol tables for the level and leave the level without checks */
 {
-    /* Leave the lexical level */
-    --LexicalLevel;
+    /* Safety */
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_FUNCTION);
+
+    /* Leave function lexical level */
+    PopLexicalLevel ();
 
     /* Remember the tables */
     F->SymTab = SymTab;
@@ -311,8 +357,8 @@ void RememberFunctionLevel (struct FuncDesc* F)
 void ReenterFunctionLevel (struct FuncDesc* F)
 /* Reenter the function lexical level using the existing tables from F */
 {
-    /* New lexical level */
-    ++LexicalLevel;
+    /* Enter function lexical level */
+    PushLexicalLevel (LEX_LEVEL_FUNCTION);
 
     /* Make the tables current again */
     F->SymTab->PrevTab = SymTab;
@@ -330,8 +376,11 @@ void ReenterFunctionLevel (struct FuncDesc* F)
 void LeaveFunctionLevel (void)
 /* Leave function lexical level */
 {
-    /* Leave the lexical level */
-    --LexicalLevel;
+    /* Safety */
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_FUNCTION);
+
+    /* Leave function lexical level */
+    PopLexicalLevel ();
 
     /* Check the tables */
     CheckSymTable (SymTab);
@@ -355,8 +404,8 @@ void EnterBlockLevel (void)
 {
     SymTable* S;
 
-    /* New lexical level */
-    ++LexicalLevel;
+    /* Enter block lexical level */
+    PushLexicalLevel (LEX_LEVEL_BLOCK);
 
     /* Get a new symbol table and make it current */
     S = NewSymTable (SYMTAB_SIZE_BLOCK);
@@ -374,8 +423,11 @@ void EnterBlockLevel (void)
 void LeaveBlockLevel (void)
 /* Leave a nested block in a function */
 {
-    /* Leave the lexical level */
-    --LexicalLevel;
+    /* Safety */
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_BLOCK);
+
+    /* Leave block lexical level */
+    PopLexicalLevel ();
 
     /* Check the tables */
     CheckSymTable (SymTab);
@@ -392,6 +444,9 @@ void EnterStructLevel (void)
 {
     SymTable* S;
 
+    /* Enter struct lexical level */
+    PushLexicalLevel (LEX_LEVEL_STRUCT);
+
     /* Get a new symbol table and make it current. Note: Structs and enums
     ** nested in struct scope are NOT local to the struct but visible in the
     ** outside scope. So we will NOT create a new struct or enum table.
@@ -406,6 +461,12 @@ void EnterStructLevel (void)
 void LeaveStructLevel (void)
 /* Leave a nested block for a struct definition */
 {
+    /* Safety */
+    PRECONDITION (GetLexicalLevel () == LEX_LEVEL_STRUCT);
+
+    /* Leave struct lexical level */
+    PopLexicalLevel ();
+
     /* Don't delete the table */
     FieldTab = FieldTab->PrevTab;
 }
@@ -1398,7 +1459,7 @@ void EmitDebugInfo (void)
         /* For cosmetic reasons in the output file, we will insert two tabs
         ** on global level and just one on local level.
         */
-        if (LexicalLevel == LEX_LEVEL_GLOBAL) {
+        if (GetLexicalLevel () == LEX_LEVEL_GLOBAL) {
             Head = "\t.dbg\t\tsym";
         } else {
             Head = "\t.dbg\tsym";
diff --git a/src/cc65/symtab.h b/src/cc65/symtab.h
index 469a4ba77..1df61a822 100644
--- a/src/cc65/symtab.h
+++ b/src/cc65/symtab.h
@@ -65,12 +65,22 @@ struct SymTable {
 /* An empty symbol table */
 extern SymTable         EmptySymTab;
 
-/* Forwards */
-struct FuncDesc;
+/* Lexical level linked list node type */
+typedef struct LexicalLevel LexicalLevel;
+struct LexicalLevel {
+    LexicalLevel*       PrevLex;
+    unsigned            CurrentLevel;
+};
 
 /* Predefined lexical levels */
+#define LEX_LEVEL_NONE          0U
 #define LEX_LEVEL_GLOBAL        1U
 #define LEX_LEVEL_FUNCTION      2U
+#define LEX_LEVEL_BLOCK         3U
+#define LEX_LEVEL_STRUCT        4U
+
+/* Forwards */
+struct FuncDesc;
 
 
 
@@ -80,9 +90,18 @@ struct FuncDesc;
 
 
 
+unsigned GetLexicalLevelDepth (void);
+/* Return the current lexical level depth */
+
 unsigned GetLexicalLevel (void);
 /* Return the current lexical level */
 
+void PushLexicalLevel (unsigned NewLevel);
+/* Enter the specified lexical level */
+
+void PopLexicalLevel (void);
+/* Exit the current lexical level */
+
 void EnterGlobalLevel (void);
 /* Enter the program global lexical level */
 

From e488d7b2a64be111b832786550e74594cee0ada1 Mon Sep 17 00:00:00 2001
From: Wayne Parham <wayne@parhamdata.com>
Date: Mon, 7 Feb 2022 19:14:02 -0600
Subject: [PATCH 04/20] Documentation updates for Sym-1.

---
 doc/funcref.sgml | 100 +++++++++++++++++++++++++++++++++++++++++++++++
 doc/sym1.sgml    |   4 +-
 2 files changed, 102 insertions(+), 2 deletions(-)

diff --git a/doc/funcref.sgml b/doc/funcref.sgml
index 4dff14dd3..4571d34a3 100644
--- a/doc/funcref.sgml
+++ b/doc/funcref.sgml
@@ -754,6 +754,16 @@ communication, see also <tt>testcode/lib/ser-test.c</tt>.
 </itemize>
 
 
+<sect1><tt/sym1.h/<label id="sym1.h"><p>
+
+<itemize>
+<item><ref id="beep" name="beep">
+<item><ref id="fdisp" name="fdisp">
+<item><ref id="loadt" name="loadt">
+<item><ref id="dumpt" name="dumpt">
+</itemize>
+
+
 <sect1><tt/telestrat.h/<label id="telestrat.h"><p>
 
 <itemize>
@@ -1669,6 +1679,27 @@ used in presence of a prototype.
 </quote>
 
 
+<sect1>beep<label id="beep"><p>
+
+<quote>
+<descrip>
+<tag/Function/Beep sound.
+<tag/Header/<tt/<ref id="sym1.h" name="sym1.h">/
+<tag/Declaration/<tt/void beep(void);/
+<tag/Description/<tt/beep/ makes a brief tone.
+<tag/Notes/<itemize>
+<item>The function is specific to the Sym-1.
+</itemize>
+<tag/Availability/cc65
+<tag/See also/
+<ref id="fdisp" name="fdisp">,
+<ref id="loadt" name="loadt">,
+<ref id="dumpt" name="dumpt">,
+<tag/Example/None.
+</descrip>
+</quote>
+
+
 <sect1>bgcolor<label id="bgcolor"><p>
 
 <quote>
@@ -3363,6 +3394,29 @@ int main(void)
 </quote>
 
 
+<sect1>dumpt<label id="dumpt"><p>
+
+<quote>
+<descrip>
+<tag/Function/Dump memory to tape.
+<tag/Header/<tt/<ref id="sym1.h" name="sym1.h">/
+<tag/Declaration/<tt/int __fastcall__ dumpt (unsigned char id, const void* start, const void* end);/
+<tag/Description/<tt/dumpt/ saves memory onto data tape.
+<tag/Notes/<itemize>
+<item>The function is specific to the Sym-1.
+<item>The function is only available as fastcall function, so it may only
+be used in presence of a prototype.
+</itemize>
+<tag/Availability/cc65
+<tag/See also/
+<ref id="fdisp" name="beep">,
+<ref id="loadt" name="fdisp">,
+<ref id="dumpt" name="loadt">,
+<tag/Example/None.
+</descrip>
+</quote>
+
+
 <sect1>em_commit<label id="em_commit"><p>
 
 <quote>
@@ -3721,6 +3775,28 @@ switching the CPU into double clock mode.
 </quote>
 
 
+<sect1>fdisp<label id="fdisp"><p>
+
+<quote>
+<descrip>
+<tag/Function/Flash front-panel display.
+<tag/Header/<tt/<ref id="sym1.h" name="sym1.h">/
+<tag/Declaration/<tt/void fdisp(void);/
+<tag/Description/<tt/fdisp/ flashes front-panel display.
+<tag/Notes/<itemize>
+<item>The function is specific to the Sym-1.
+<item>The front-panel display buffer mut be loaded prior to calling fdisp.  See the DISPLAY struct definition in sym1.h.
+</itemize>
+<tag/Availability/cc65
+<tag/See also/
+<ref id="fdisp" name="beep">,
+<ref id="loadt" name="loadt">,
+<ref id="dumpt" name="dumpt">,
+<tag/Example/None.
+</descrip>
+</quote>
+
+
 <sect1>feof<label id="feof"><p>
 
 <quote>
@@ -4961,6 +5037,30 @@ used in presence of a prototype.
 </quote>
 
 
+<sect1>loadt<label id="loadt"><p>
+
+<quote>
+<descrip>
+<tag/Function/Load memory from tape.
+<tag/Header/<tt/<ref id="sym1.h" name="sym1.h">/
+<tag/Declaration/<tt/int __fastcall__ loadt (unsigned char id);/
+<tag/Description/<tt/loadt/ loads memory from data tape.
+<tag/Notes/<itemize>
+<item>The function is specific to the Sym-1.
+<item>The return value is status.  Non-zero status indicates an error.
+<item>The function is only available as fastcall function, so it may only
+be used in presence of a prototype.
+</itemize>
+<tag/Availability/cc65
+<tag/See also/
+<ref id="fdisp" name="beep">,
+<ref id="loadt" name="fdisp">,
+<ref id="dumpt" name="dumpt">,
+<tag/Example/None.
+</descrip>
+</quote>
+
+
 <sect1>ltoa<label id="ltoa"><p>
 
 <quote>
diff --git a/doc/sym1.sgml b/doc/sym1.sgml
index 60eb1c020..5961984bd 100644
--- a/doc/sym1.sgml
+++ b/doc/sym1.sgml
@@ -38,7 +38,7 @@ Special locations:
   Conio support is not currently available for the Sym-1.  But stdio console functions are available.
 
   <tag/Stack/
-  The C runtime stack is located at &dollar;0FFF on 4KB Syms, or at &dollar;7FFFfor 32KB systems.  The stack always grows downwards. 
+  The C runtime stack is located at &dollar;0FFF on 4KB Syms, or at &dollar;7FFF for 32KB systems.  The stack always grows downwards. 
 
   <tag/Heap/
   The C heap is located at the end of the program and grows towards the C runtime stack.
@@ -102,7 +102,7 @@ As stated earlier, there are config files for 4KB and 32KB systems.  If you have
 
 <sect3>Sample programs<p>
 
-All the samples will run on the &quot;stock&quot; 4KB Sym-1, except for symIO and symNotepad, which require 32KB.  These sample programs can be found in the targettest/sym1 directory:
+All the samples will run on the &quot;stock&quot; 4KB Sym-1, except for symIO and symNotepad, which require 32KB.  These sample programs can be found in the samples/sym1 directory:
 
 <itemize>
 <item>symHello prints &quot;Hello World!&quot; and then inputs characters, which are echoed on the screen.  It also makes a &quot;beep&quot; sound.</item>

From 84d639e40c6c84866d1fde9e79b7ac50d4a9377c Mon Sep 17 00:00:00 2001
From: Wayne Parham <wayne@parhamdata.com>
Date: Mon, 7 Feb 2022 19:46:16 -0600
Subject: [PATCH 05/20] Typo correction.

---
 doc/funcref.sgml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/funcref.sgml b/doc/funcref.sgml
index 4571d34a3..b66344a01 100644
--- a/doc/funcref.sgml
+++ b/doc/funcref.sgml
@@ -3785,7 +3785,7 @@ switching the CPU into double clock mode.
 <tag/Description/<tt/fdisp/ flashes front-panel display.
 <tag/Notes/<itemize>
 <item>The function is specific to the Sym-1.
-<item>The front-panel display buffer mut be loaded prior to calling fdisp.  See the DISPLAY struct definition in sym1.h.
+<item>The front-panel display buffer must be loaded prior to calling fdisp.  See the DISPLAY struct definition in sym1.h.
 </itemize>
 <tag/Availability/cc65
 <tag/See also/

From 470b648b9fb64360c10bf040d2fff40c17e0ab2c Mon Sep 17 00:00:00 2001
From: Wayne Parham <wayne@parhamdata.com>
Date: Mon, 7 Feb 2022 19:51:03 -0600
Subject: [PATCH 06/20] Added note about return value being function status.

---
 doc/funcref.sgml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/funcref.sgml b/doc/funcref.sgml
index b66344a01..86c286909 100644
--- a/doc/funcref.sgml
+++ b/doc/funcref.sgml
@@ -3404,6 +3404,7 @@ int main(void)
 <tag/Description/<tt/dumpt/ saves memory onto data tape.
 <tag/Notes/<itemize>
 <item>The function is specific to the Sym-1.
+<item>The return value is status.  Non-zero status indicates an error.
 <item>The function is only available as fastcall function, so it may only
 be used in presence of a prototype.
 </itemize>

From 9cb005c98f766a51285a3ecba3ca0a9197660944 Mon Sep 17 00:00:00 2001
From: Wayne Parham <wayne@parhamdata.com>
Date: Tue, 8 Feb 2022 14:22:09 -0600
Subject: [PATCH 07/20] Correction of link typos

---
 doc/funcref.sgml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/doc/funcref.sgml b/doc/funcref.sgml
index 86c286909..1a9dcaa77 100644
--- a/doc/funcref.sgml
+++ b/doc/funcref.sgml
@@ -3410,9 +3410,9 @@ be used in presence of a prototype.
 </itemize>
 <tag/Availability/cc65
 <tag/See also/
-<ref id="fdisp" name="beep">,
-<ref id="loadt" name="fdisp">,
-<ref id="dumpt" name="loadt">,
+<ref id="beep" name="beep">,
+<ref id="fdisp" name="fdisp">,
+<ref id="loadt" name="loadt">,
 <tag/Example/None.
 </descrip>
 </quote>
@@ -3790,7 +3790,7 @@ switching the CPU into double clock mode.
 </itemize>
 <tag/Availability/cc65
 <tag/See also/
-<ref id="fdisp" name="beep">,
+<ref id="beep" name="beep">,
 <ref id="loadt" name="loadt">,
 <ref id="dumpt" name="dumpt">,
 <tag/Example/None.
@@ -5054,8 +5054,8 @@ be used in presence of a prototype.
 </itemize>
 <tag/Availability/cc65
 <tag/See also/
-<ref id="fdisp" name="beep">,
-<ref id="loadt" name="fdisp">,
+<ref id="beep" name="beep">,
+<ref id="fdisp" name="fdisp">,
 <ref id="dumpt" name="dumpt">,
 <tag/Example/None.
 </descrip>

From 9dd13d7047755fc1b11de4ca5c36f9cc2eba820b Mon Sep 17 00:00:00 2001
From: Greg King <gregdk@users.sf.net>
Date: Sun, 6 Feb 2022 04:21:53 -0500
Subject: [PATCH 08/20] Moved the platform-test enumerations from Github
 Actions over to makefiles.

Now, we can run those tests locally, as well as on Github.
---
 .github/workflows/build-on-pull-request.yml   | 130 +-----------------
 .github/workflows/snapshot-on-push-master.yml |   3 +-
 samples/Makefile                              |  52 ++++++-
 targettest/Makefile                           |  58 +++++++-
 4 files changed, 106 insertions(+), 137 deletions(-)

diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml
index 307cbd048..2203e43dd 100644
--- a/.github/workflows/build-on-pull-request.yml
+++ b/.github/workflows/build-on-pull-request.yml
@@ -33,135 +33,9 @@ jobs:
         shell: bash
         run: make test QUIET=1
       - name: Test that the samples can be built.
-        shell: bash
-        run: |
-            make SYS=apple2 -C samples
-            make SYS=apple2 -C samples clean
-            make SYS=apple2enh -C samples
-            make SYS=apple2enh -C samples clean
-            make SYS=atari -C samples
-            make SYS=atari -C samples clean
-            make SYS=atarixl -C samples
-            make SYS=atarixl -C samples clean
-            make SYS=atari2600 -C samples
-            make SYS=atari2600 -C samples clean
-            make SYS=atari5200 -C samples
-            make SYS=atari5200 -C samples clean
-            make SYS=atmos -C samples
-            make SYS=atmos -C samples clean
-            make SYS=bbc -C samples
-            make SYS=bbc -C samples clean
-            make SYS=c128 -C samples
-            make SYS=c128 -C samples clean
-            make SYS=c16 -C samples
-            make SYS=c16 -C samples clean
-            make SYS=c64 -C samples
-            make SYS=c64 -C samples clean
-            make SYS=cbm510 -C samples
-            make SYS=cbm510 -C samples clean
-            make SYS=cbm610 -C samples
-            make SYS=cbm610 -C samples clean
-            make SYS=creativision -C samples
-            make SYS=creativision -C samples clean
-            make SYS=cx16 -C samples
-            make SYS=cx16 -C samples clean
-            make SYS=gamate -C samples
-            make SYS=gamate -C samples clean
-            make SYS=geos-apple -C samples
-            make SYS=geos-apple -C samples clean
-            make SYS=geos-cbm -C samples
-            make SYS=geos-cbm -C samples clean
-            make SYS=lunix -C samples
-            make SYS=lunix -C samples clean
-            make SYS=lynx -C samples
-            make SYS=lynx -C samples clean
-            make SYS=nes -C samples
-            make SYS=nes -C samples clean
-            make SYS=osic1p -C samples
-            make SYS=osic1p -C samples clean
-            make SYS=pce -C samples
-            make SYS=pce -C samples clean
-            make SYS=pet -C samples
-            make SYS=pet -C samples clean
-            make SYS=plus4 -C samples
-            make SYS=plus4 -C samples clean
-            make SYS=sim6502 -C samples
-            make SYS=sim6502 -C samples clean
-            make SYS=sim65c02 -C samples
-            make SYS=sim65c02 -C samples clean
-            make SYS=supervision -C samples
-            make SYS=supervision -C samples clean
-            make SYS=sym1 -C samples
-            make SYS=sym1 -C samples clean
-            make SYS=telestrat -C samples
-            make SYS=telestrat -C samples clean
-            make SYS=vic20 -C samples
-            make SYS=vic20 -C samples clean
+        run: make -C samples platforms
       - name: Test that the targettest programs can be built.
-        shell: bash
-        run: |
-            make SYS=apple2 -C targettest
-            make SYS=apple2 -C targettest clean
-            make SYS=apple2enh -C targettest
-            make SYS=apple2enh -C targettest clean
-            make SYS=atari -C targettest
-            make SYS=atari -C targettest clean
-            make SYS=atarixl -C targettest
-            make SYS=atarixl -C targettest clean
-            make SYS=atari2600 -C targettest
-            make SYS=atari2600 -C targettest clean
-            make SYS=atari5200 -C targettest
-            make SYS=atari5200 -C targettest clean
-            make SYS=atmos -C targettest
-            make SYS=atmos -C targettest clean
-            make SYS=bbc -C targettest
-            make SYS=bbc -C targettest clean
-            make SYS=c128 -C targettest
-            make SYS=c128 -C targettest clean
-            make SYS=c16 -C targettest
-            make SYS=c16 -C targettest clean
-            make SYS=c64 -C targettest
-            make SYS=c64 -C targettest clean
-            make SYS=cbm510 -C targettest
-            make SYS=cbm510 -C targettest clean
-            make SYS=cbm610 -C targettest
-            make SYS=cbm610 -C targettest clean
-            make SYS=creativision -C targettest
-            make SYS=creativision -C targettest clean
-            make SYS=cx16 -C targettest
-            make SYS=cx16 -C targettest clean
-            make SYS=gamate -C targettest
-            make SYS=gamate -C targettest clean
-            make SYS=geos-apple -C targettest
-            make SYS=geos-apple -C targettest clean
-            make SYS=geos-cbm -C targettest
-            make SYS=geos-cbm -C targettest clean
-            make SYS=lunix -C targettest
-            make SYS=lunix -C targettest clean
-            make SYS=lynx -C targettest
-            make SYS=lynx -C targettest clean
-            make SYS=nes -C targettest
-            make SYS=nes -C targettest clean
-            make SYS=osic1p -C targettest
-            make SYS=osic1p -C targettest clean
-            make SYS=pce -C targettest
-            make SYS=pce -C targettest clean
-            make SYS=pet -C targettest
-            make SYS=pet -C targettest clean
-            make SYS=plus4 -C targettest
-            make SYS=plus4 -C targettest clean
-            make SYS=sim6502 -C targettest
-            make SYS=sim6502 -C targettest clean
-            make SYS=sim65c02 -C targettest
-            make SYS=sim65c02 -C targettest clean
-            make SYS=supervision -C targettest
-            make SYS=supervision -C targettest clean
-            make SYS=sym1 -C targettest
-            make SYS=sym1 -C targettest clean
-            make SYS=telestrat -C targettest
-            make SYS=telestrat -C targettest clean
-            make SYS=vic20 -C targettest
-            make SYS=vic20 -C targettest clean
+        run: make -C targettest platforms
       - name: Build the document files.
         shell: bash
         run: make -j2 doc
diff --git a/.github/workflows/snapshot-on-push-master.yml b/.github/workflows/snapshot-on-push-master.yml
index 83f311568..914094567 100644
--- a/.github/workflows/snapshot-on-push-master.yml
+++ b/.github/workflows/snapshot-on-push-master.yml
@@ -29,9 +29,8 @@ jobs:
         run: msbuild src\cc65.sln -t:rebuild -property:Configuration=Release
 
   build_linux:
-    name: Build, Test and Snaphot (Linux)
+    name: Build, Test, and Snapshot (Linux)
     runs-on: ubuntu-latest
-    needs: build_windows
 
     steps:
       - name: Install Dependencies
diff --git a/samples/Makefile b/samples/Makefile
index 5b08d4bb0..18a663c1b 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -129,7 +129,7 @@ LDFLAGS_tgidemo_atarixl    = --start-addr 0x4000
 # --------------------------------------------------------------------------
 # Generic rules
 
-.PHONY: all mostlyclean clean install zip samples disk
+.PHONY: samples all mostlyclean clean install zip disk platforms
 
 %: %.c
 %: %.s
@@ -340,7 +340,7 @@ endif
 
 define SUBDIR_recipe
 
-@$(MAKE) -C $(dir) --no-print-directory $@
+@+$(MAKE) -C $(dir) --no-print-directory $@
 
 endef # SUBDIR_recipe
 
@@ -360,6 +360,54 @@ disk: $(DISK_$(SYS))
 
 all:
 
+# --------------------------------------------------------------------------
+# List of every supported platform
+TARGETS :=     \
+  apple2       \
+  apple2enh    \
+  atari        \
+  atarixl      \
+  atari2600    \
+  atari5200    \
+  atmos        \
+  bbc          \
+  c128         \
+  c16          \
+  c64          \
+  cbm510       \
+  cbm610       \
+  creativision \
+  cx16         \
+  gamate       \
+  geos-apple   \
+  geos-cbm     \
+  lunix        \
+  lynx         \
+  nes          \
+  osic1p       \
+  pce          \
+  pet          \
+  plus4        \
+  sim6502      \
+  sim65c02     \
+  supervision  \
+  sym1         \
+  telestrat    \
+  vic20
+
+# --------------------------------------------------------------------------
+# Rule to make the binaries for every platform
+
+define TARGET_recipe
+
+@$(MAKE) -j2 SYS:=$(T)
+@$(MAKE) --no-print-directory clean SYS:=$(T)
+
+endef # TARGET_recipe
+
+platforms:
+	$(foreach T,$(TARGETS),$(TARGET_recipe))
+
 # --------------------------------------------------------------------------
 # Overlay rules. Overlays need special ld65 configuration files.  Also, the
 # overlay file-names are shortenned to fit the Atari's 8.3-character limit.
diff --git a/targettest/Makefile b/targettest/Makefile
index 55b4660fc..3e8698c34 100644
--- a/targettest/Makefile
+++ b/targettest/Makefile
@@ -108,7 +108,7 @@ DISK_atarixl   = testcode.atr
 # --------------------------------------------------------------------------
 # Generic rules
 
-.PHONY: all mostlyclean clean zip testcode disk
+.PHONY: testcode all mostlyclean clean zip disk platforms
 
 %: %.c
 %: %.s
@@ -404,7 +404,7 @@ EXELIST_plus4 = \
 	strqtok-test \
 	uname-test
 
-# omitted: seek clock-test mouse-test ser-test 
+# omitted: seek clock-test mouse-test ser-test
 EXELIST_vic20 = \
 	minimal \
 	arg-test \
@@ -616,7 +616,7 @@ EXELIST_nes = \
 EXELIST_pce = \
 	minimal \
 	conio
-	
+
 # omitted: arg-test clock-test clock cpeek-test conio cprintf deb dir-test div-test
 # em-test exec-test1 exec-test2 fileio-test ft getopt-test heaptest joy-test moddiv-test
 # mouse-test posixio-test rename-test scanf-test seek ser-test strdup-test strnlen
@@ -659,7 +659,7 @@ EXELIST_sim6502 = \
 	scanf-test \
 	strnlen \
 	strqtok-test
-	
+
 EXELIST_sim65c02 = $(EXELIST_sim6502)
 
 
@@ -699,7 +699,7 @@ endif
 
 define SUBDIR_recipe
 
-@$(MAKE) -C $(dir) --no-print-directory $@
+@+$(MAKE) -C $(dir) --no-print-directory $@
 
 endef # SUBDIR_recipe
 
@@ -719,6 +719,54 @@ disk: $(DISK_$(SYS))
 
 all:
 
+# --------------------------------------------------------------------------
+# List of every supported platform
+TARGETS :=     \
+  apple2       \
+  apple2enh    \
+  atari        \
+  atarixl      \
+  atari2600    \
+  atari5200    \
+  atmos        \
+  bbc          \
+  c128         \
+  c16          \
+  c64          \
+  cbm510       \
+  cbm610       \
+  creativision \
+  cx16         \
+  gamate       \
+  geos-apple   \
+  geos-cbm     \
+  lunix        \
+  lynx         \
+  nes          \
+  osic1p       \
+  pce          \
+  pet          \
+  plus4        \
+  sim6502      \
+  sim65c02     \
+  supervision  \
+  sym1         \
+  telestrat    \
+  vic20
+
+# --------------------------------------------------------------------------
+# Rule to make the binaries for every platform
+
+define TARGET_recipe
+
+@$(MAKE) -j2 SYS:=$(T)
+@$(MAKE) --no-print-directory clean SYS:=$(T)
+
+endef # TARGET_recipe
+
+platforms:
+	$(foreach T,$(TARGETS),$(TARGET_recipe))
+
 # --------------------------------------------------------------------------
 # some programs link against getsp.o
 

From 5747fa4df3f9b4d140f8d511d960d086098fa606 Mon Sep 17 00:00:00 2001
From: Greg King <gregdk@users.sf.net>
Date: Mon, 7 Feb 2022 14:09:27 -0500
Subject: [PATCH 09/20] Added '+' to another SUBDIRS_recipe.

---
 samples/geos/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/samples/geos/Makefile b/samples/geos/Makefile
index e792c52f1..04de0aaa3 100644
--- a/samples/geos/Makefile
+++ b/samples/geos/Makefile
@@ -50,7 +50,7 @@ DIRLIST = grc
 
 define SUBDIR_recipe
 
-@$(MAKE) SYS=$(SYS) -C $(dir) --no-print-directory $@
+@+$(MAKE) SYS=$(SYS) -C $(dir) --no-print-directory $@
 
 endef # SUBDIR_recipe
 

From 1f51a9f5875e803072da51b805cb740284ac16d4 Mon Sep 17 00:00:00 2001
From: Greg King <gregdk@users.sf.net>
Date: Mon, 7 Feb 2022 14:14:30 -0500
Subject: [PATCH 10/20] Removed geos_apple and geos_cbm from the lists of
 targets.

They need resource files to go with the program source files.  The top-level samples and targettest programs don't have those resources.
---
 samples/Makefile    | 2 --
 targettest/Makefile | 2 --
 2 files changed, 4 deletions(-)

diff --git a/samples/Makefile b/samples/Makefile
index 18a663c1b..5c44d1947 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -379,8 +379,6 @@ TARGETS :=     \
   creativision \
   cx16         \
   gamate       \
-  geos-apple   \
-  geos-cbm     \
   lunix        \
   lynx         \
   nes          \
diff --git a/targettest/Makefile b/targettest/Makefile
index 3e8698c34..806f6b445 100644
--- a/targettest/Makefile
+++ b/targettest/Makefile
@@ -738,8 +738,6 @@ TARGETS :=     \
   creativision \
   cx16         \
   gamate       \
-  geos-apple   \
-  geos-cbm     \
   lunix        \
   lynx         \
   nes          \

From 118e73ddf9a8c37366efb4e9005ee217af57085f Mon Sep 17 00:00:00 2001
From: mrdudz <mrdudz@users.noreply.github.com>
Date: Fri, 11 Feb 2022 16:38:40 +0100
Subject: [PATCH 11/20] build utilities in a seperate step

---
 .github/workflows/build-on-pull-request.yml | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/build-on-pull-request.yml b/.github/workflows/build-on-pull-request.yml
index 2203e43dd..6ab8543de 100644
--- a/.github/workflows/build-on-pull-request.yml
+++ b/.github/workflows/build-on-pull-request.yml
@@ -23,9 +23,10 @@ jobs:
 
       - name: Build the tools.
         shell: bash
-        run: |
-            make -j2 bin USER_CFLAGS=-Werror
-            make -j2 util
+        run: make -j2 bin USER_CFLAGS=-Werror
+      - name: Build the utilities.
+        shell: bash
+        run: make -j2 util
       - name: Build the platform libraries.
         shell: bash
         run: make -j2 lib QUIET=1

From 30b00ed0766d520e45513affbbc406425a8ff03a Mon Sep 17 00:00:00 2001
From: mrdudz <mrdudz@users.noreply.github.com>
Date: Fri, 11 Feb 2022 16:53:34 +0100
Subject: [PATCH 12/20] attempt to prevent utils being compiled with cc65

---
 util/atari/Makefile  | 8 ++++++++
 util/gamate/Makefile | 8 ++++++++
 util/zlib/Makefile   | 8 ++++++++
 3 files changed, 24 insertions(+)

diff --git a/util/atari/Makefile b/util/atari/Makefile
index 28efeafa1..db4226f69 100644
--- a/util/atari/Makefile
+++ b/util/atari/Makefile
@@ -1,4 +1,12 @@
 
+CC = $(CROSS_COMPILE)gcc
+
+ifdef CROSS_COMPILE
+  $(info CC: $(CC))
+endif
+
+CFLAGS += -O3 -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS)
+
 .PHONY: mostlyclean clean
 
 atari: ataricvt
diff --git a/util/gamate/Makefile b/util/gamate/Makefile
index a6281de21..db2a1f059 100644
--- a/util/gamate/Makefile
+++ b/util/gamate/Makefile
@@ -1,4 +1,12 @@
 
+CC = $(CROSS_COMPILE)gcc
+
+ifdef CROSS_COMPILE
+  $(info CC: $(CC))
+endif
+
+CFLAGS += -O3 -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS)
+
 .PHONY: mostlyclean clean
 
 gamate: gamate-fixcart
diff --git a/util/zlib/Makefile b/util/zlib/Makefile
index 75c67fb26..3770e1f3c 100644
--- a/util/zlib/Makefile
+++ b/util/zlib/Makefile
@@ -1,4 +1,12 @@
 
+CC = $(CROSS_COMPILE)gcc
+
+ifdef CROSS_COMPILE
+  $(info CC: $(CC))
+endif
+
+CFLAGS += -O3 -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS)
+
 .PHONY: mostlyclean clean
 
 zlib: warning

From 86b6514c16b8965fedb3f869ef93bd344682b348 Mon Sep 17 00:00:00 2001
From: Greg King <gregdk@users.sf.net>
Date: Sat, 12 Feb 2022 04:48:47 -0500
Subject: [PATCH 13/20] Added code that avoids infinite loops that were caused
 by circular references

(a symbol that was defined by referring to itself directly or indirectly).  Patch by kugelfuhr.
---
 src/ca65/expr.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/ca65/expr.c b/src/ca65/expr.c
index 8703b2a55..aad4d9ae5 100644
--- a/src/ca65/expr.c
+++ b/src/ca65/expr.c
@@ -171,6 +171,25 @@ int IsFarRange (long Val)
 
 
 
+static const ExprNode* ResolveSymbolChain(const ExprNode* E)
+/* Recursive helper function for IsEasyConst */
+{
+    if (E->Op == EXPR_SYMBOL) {
+        SymEntry* Sym = E->V.Sym;
+
+        if (Sym == 0 || Sym->Expr == 0 || SymHasUserMark (Sym)) {
+            return 0;
+        } else {
+            SymMarkUser (Sym);
+            E = ResolveSymbolChain (Sym->Expr);
+            SymUnmarkUser (Sym);
+        }
+    }
+    return E;
+}
+
+
+
 int IsEasyConst (const ExprNode* E, long* Val)
 /* Do some light checking if the given node is a constant. Don't care if E is
 ** a complex expression. If E is a constant, return true and place its value
@@ -178,12 +197,10 @@ int IsEasyConst (const ExprNode* E, long* Val)
 */
 {
     /* Resolve symbols, follow symbol chains */
-    while (E->Op == EXPR_SYMBOL) {
-        E = SymResolve (E->V.Sym);
-        if (E == 0) {
-            /* Could not resolve */
-            return 0;
-        }
+    E = ResolveSymbolChain (E);
+    if (E == 0) {
+        /* Could not resolve */
+        return 0;
     }
 
     /* Symbols resolved, check for a literal */

From 6dbafda53f2bfcce1d4f27cfb64538d15875b9bf Mon Sep 17 00:00:00 2001
From: acqn <acqn163@outlook.com>
Date: Mon, 14 Feb 2022 22:28:22 +0800
Subject: [PATCH 14/20] Testcase for #1662.

---
 test/val/bitfield.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/test/val/bitfield.c b/test/val/bitfield.c
index 939d90dff..1de19777a 100644
--- a/test/val/bitfield.c
+++ b/test/val/bitfield.c
@@ -26,8 +26,10 @@
 
 static unsigned char failures = 0;
 
+typedef unsigned int field_type;
+
 static struct four_bits {
-    unsigned int x : 4;
+    field_type x : 4;
 } fb = {1};
 
 static void test_four_bits(void)
@@ -57,8 +59,8 @@ static void test_four_bits(void)
 */
 
 static struct four_bits_with_int {
-    unsigned int x : 4;
-    unsigned int y;
+    field_type x : 4;
+    field_type y;
 } fbi = {1, 2};
 
 static void test_four_bits_with_int(void)
@@ -95,8 +97,8 @@ static void test_four_bits_with_int(void)
 }
 
 static struct overlap {
-    unsigned int x : 10;
-    unsigned int y : 10;
+    field_type x : 10;
+    field_type y : 10;
 } o = {11, 22};
 
 /* Tests that bit-fields can share allocation units. */
@@ -133,9 +135,9 @@ static void test_overlap(void)
 }
 
 static struct overlap_with_int {
-    unsigned int x : 10;
-    unsigned int y : 10;
-    unsigned int z;
+    field_type x : 10;
+    field_type y : 10;
+    field_type z;
 } oi = {111, 222, 333};
 
 static void test_overlap_with_int(void)
@@ -183,8 +185,8 @@ static void test_overlap_with_int(void)
 }
 
 static struct full_width {
-    unsigned int x : 8;
-    unsigned int y : 16;
+    field_type x : 8;
+    field_type y : 16;
 } fw = {255, 17};
 
 static void test_full_width(void)
@@ -220,13 +222,13 @@ static void test_full_width(void)
 }
 
 static struct aligned_end {
-    unsigned int : 2;
-    unsigned int x : 6;
-    unsigned int : 3;
-    unsigned int y : 13;
+    field_type : 2;
+    field_type x : 6;
+    field_type : 3;
+    field_type y : 13;
     /* z crosses a byte boundary, but fits in a byte when shifted. */
-    unsigned int : 6;
-    unsigned int z : 7;
+    field_type : 6;
+    field_type z : 7;
 } ae = {63, 17, 100};
 
 static void test_aligned_end(void)

From ad82392428df9c837d5140a839929c95ecdc6b26 Mon Sep 17 00:00:00 2001
From: mrdudz <mrdudz@users.noreply.github.com>
Date: Tue, 15 Feb 2022 21:25:03 +0100
Subject: [PATCH 15/20] add hint on VICE -moncommands

---
 doc/debugging.sgml | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/doc/debugging.sgml b/doc/debugging.sgml
index a270d12c7..ce678601d 100644
--- a/doc/debugging.sgml
+++ b/doc/debugging.sgml
@@ -16,7 +16,7 @@ How to debug your code using the VICE and Oricutron emulators.
 <sect>Overview<p>
 
 This document describes how to debug your programs using the cc65 development
-tools and the VICE CBM emulator.
+tools and the VICE or Oricutron emulator.
 
 
 
@@ -126,6 +126,12 @@ and you may use them wherever you need to specify an address. Try
 as an example (note that VICE needs a leading dot before all labels, and that
 the compiler prepends an underline under most named labels).
 
+If you start the emulator from the commandline, you can also load the labels
+directly using something like this:
+
+<tscreen><verb>
+        x64sc -moncommands hello.lbl hello.prg
+</verb></tscreen>
 
 
 <sect>How to use the label file with Oricutron<p>
@@ -144,8 +150,7 @@ and you may use them wherever you need to specify an address. Try
         d ._main
 </verb></tscreen>
 
-as an example (note that VICE needs a leading dot before all labels, and that
-the compiler prepends an underline under most named labels).
+as an example.
 
 
 

From 3d0013ab309fac3eeac6edcbca0116fc5db2c1a5 Mon Sep 17 00:00:00 2001
From: Spiro Trikaliotis <spiro.trikaliotis@gmx.de>
Date: Tue, 15 Feb 2022 21:46:07 +0100
Subject: [PATCH 16/20] Invalid flagged errors if token is missing

A missing factor in an expression causes an expected but missing token
to be skipped, leading to invalid flagged errors in the following line:

l = 3 +
lda     #$00

An error should be output for line 1, but not for line 2. Actually, both
are flagged as errors:

test.s(1): Error: Syntax error
test.s(2): Error: Unexpected trailing garbage characters

This patch (as proposed in issue #1634 by kugelfuhr) fixes this.
---
 src/ca65/expr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ca65/expr.c b/src/ca65/expr.c
index aad4d9ae5..74133d533 100644
--- a/src/ca65/expr.c
+++ b/src/ca65/expr.c
@@ -1226,11 +1226,11 @@ static ExprNode* Factor (void)
                 SB_GetLen (&CurTok.SVal) == 1) {
                 /* A character constant */
                 N = GenLiteralExpr (TgtTranslateChar (SB_At (&CurTok.SVal, 0)));
+                NextTok ();
             } else {
                 N = GenLiteral0 ();     /* Dummy */
                 Error ("Syntax error");
             }
-            NextTok ();
             break;
     }
     return N;

From 364e72921c7ec6d6ad8d23f6aa13d3f9f7f118d8 Mon Sep 17 00:00:00 2001
From: Spiro Trikaliotis <spiro.trikaliotis@gmx.de>
Date: Tue, 15 Feb 2022 22:03:47 +0100
Subject: [PATCH 17/20] ca65: .constructor after .export fails

The actor directives (.constructor, .destructor, .interruptor, and .condes)
can't handle a symbol that's already exported.

The relevant code does the checks in the wrong order.

For example, the following correct snippet does not assemble:

        .export         C
C:      .constructor    C, 5

The assembler outputs: test.s:2: Error: Address size mismatch for symbol 'C'

Exchanging both lines makes it work.

This fixes #1647; the patch is provided by 'kugelfuhr' and taken from there.
---
 src/ca65/symentry.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/ca65/symentry.c b/src/ca65/symentry.c
index cf789da5e..1048bfbc2 100644
--- a/src/ca65/symentry.c
+++ b/src/ca65/symentry.c
@@ -546,6 +546,18 @@ void SymConDes (SymEntry* S, unsigned char AddrSize, unsigned Type, unsigned Pri
         return;
     }
 
+    /* If the symbol is already defined, check symbol size against the
+    ** exported size.
+    */
+    if (S->Flags & SF_DEFINED) {
+        if (AddrSize == ADDR_SIZE_DEFAULT) {
+            /* Use the real size of the symbol */
+            AddrSize = S->AddrSize;
+        } else if (S->AddrSize != AddrSize) {
+            Error ("Address size mismatch for symbol '%m%p'", GetSymName (S));
+        }
+    }
+
     /* If the symbol was already marked as an export or global, check if
     ** this was done specifiying the same address size. In case of a global
     ** declaration, silently remove the global flag.
@@ -558,18 +570,6 @@ void SymConDes (SymEntry* S, unsigned char AddrSize, unsigned Type, unsigned Pri
     }
     S->ExportSize = AddrSize;
 
-    /* If the symbol is already defined, check symbol size against the
-    ** exported size.
-    */
-    if (S->Flags & SF_DEFINED) {
-        if (S->ExportSize == ADDR_SIZE_DEFAULT) {
-            /* Use the real size of the symbol */
-            S->ExportSize = S->AddrSize;
-        } else if (S->AddrSize != S->ExportSize) {
-            Error ("Address size mismatch for symbol '%m%p'", GetSymName (S));
-        }
-    }
-
     /* If the symbol already was declared as a condes of this type,
     ** check if the new priority value is the same as the old one.
     */

From 1df61b6ec715c86f3c97ce84cfe714c61c922059 Mon Sep 17 00:00:00 2001
From: Spiro Trikaliotis <spiro.trikaliotis@gmx.de>
Date: Tue, 15 Feb 2022 22:16:06 +0100
Subject: [PATCH 18/20] Add link to DEB and RPM snapshots

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 33c7d2830..93b91aa80 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 [Windows Snapshot](https://sourceforge.net/projects/cc65/files/cc65-snapshot-win32.zip)
 
+[Linux Snapshot DEB and RPM](https://software.opensuse.org//download.html?project=home%3Astrik&package=cc65)
+
 [Documentation](https://cc65.github.io/doc)
 
 [Wiki](https://github.com/cc65/wiki/wiki)

From d006317b0e5ead2cf9e3e0355209f7ac3e8250c6 Mon Sep 17 00:00:00 2001
From: Greg King <gregdk@users.sf.net>
Date: Thu, 17 Feb 2022 00:30:31 -0500
Subject: [PATCH 19/20] Made the snapshot-on-push Github action run on only the
 upstream repository.

---
 .github/workflows/snapshot-on-push-master.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.github/workflows/snapshot-on-push-master.yml b/.github/workflows/snapshot-on-push-master.yml
index 914094567..fb4b3aa13 100644
--- a/.github/workflows/snapshot-on-push-master.yml
+++ b/.github/workflows/snapshot-on-push-master.yml
@@ -10,6 +10,7 @@ concurrency:
 jobs:
   build_windows:
     name: Build (Windows)
+    if: github.repository == 'cc65/cc65'
     runs-on: windows-latest
 
     steps:
@@ -30,6 +31,7 @@ jobs:
 
   build_linux:
     name: Build, Test, and Snapshot (Linux)
+    if: github.repository == 'cc65/cc65'
     runs-on: ubuntu-latest
 
     steps:

From 02a46e02379dbeb86dc6b44bbcfa6d6fa1267528 Mon Sep 17 00:00:00 2001
From: mrdudz <mrdudz@users.noreply.github.com>
Date: Sun, 20 Feb 2022 16:49:01 +0100
Subject: [PATCH 20/20] do not use cl65 to prevent tests from failing randomly
 because of one process deleting the temp files from another

---
 targettest/accelerator/Makefile | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/targettest/accelerator/Makefile b/targettest/accelerator/Makefile
index a46ec43c0..bcddac1fa 100644
--- a/targettest/accelerator/Makefile
+++ b/targettest/accelerator/Makefile
@@ -1,3 +1,7 @@
+# Run 'make SYS=<target>'; or, set a SYS env.
+# var. to build for another target system.
+SYS ?= c64
+
 # Just the usual way to find out if we're
 # using cmd.exe to execute make rules.
 ifneq ($(shell echo),)
@@ -54,10 +58,18 @@ else
 endif
 
 c64-scpu-test.prg: c64-c128-scpu-test.c
-	$(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg
+# do not use cl65 to prevent tests from failing randomly because of one process
+# deleting the temp files from another
+#	$(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg
+	$(CC) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.s
+	$(CL) -t c64 c64-scpu-test.s -o c64-scpu-test.prg
 
 c128-scpu-test.prg: c64-c128-scpu-test.c
-	$(CL) -t c128 c64-c128-scpu-test.c -o c128-scpu-test.prg
+# do not use cl65 to prevent tests from failing randomly because of one process
+# deleting the temp files from another
+#	$(CL) -t c128 c64-c128-scpu-test.c -o c128-scpu-test.prg
+	$(CC) -t c128 c64-c128-scpu-test.c -o c128-scpu-test.s
+	$(CL) -t c128 c128-scpu-test.s -o c128-scpu-test.prg
 
 c64dtv-test.prg: c64dtv-test.c
 	$(CL) -t c64 c64dtv-test.c -o c64dtv-test.prg
@@ -79,3 +91,4 @@ turbomaster-test.prg: turbomaster-test.c
 
 clean:
 	@$(DEL) *.prg 2>$(NULLDEV)
+	@$(DEL) *.s 2>$(NULLDEV)