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 $0FFF on 4KB Syms, or at $7FFFfor 32KB systems. The stack always grows downwards. + The C runtime stack is located at $0FFF on 4KB Syms, or at $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 "stock" 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 "stock" 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 "Hello World!" and then inputs characters, which are echoed on the screen. It also makes a "beep" 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)