Skip to content

Commit be9892c

Browse files
Version 3.2
1 parent 66680c9 commit be9892c

25 files changed

+524
-132
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
6502.Net, A .Net-Based Cross-Assembler for Several 8-Bit Microprocessors.
22

3-
Version 3.1.1
3+
Version 3.2
44

55
## Overview
66

Sixty502DotNet.Tests/Sixty502DotNet.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
<TargetFramework>net5.0</TargetFramework>
55

66
<IsPackable>false</IsPackable>
7-
<ReleaseVersion>3.1.1.1</ReleaseVersion>
7+
<ReleaseVersion>3.2.0.1</ReleaseVersion>
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
1212
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
1313
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
1414
<PackageReference Include="coverlet.collector" Version="3.1.2"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

Sixty502DotNet.Tests/TestFunctions.cs

Lines changed: 207 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ .return 1
3737
Assert.IsNotNull(simple);
3838
Assert.AreEqual(0, simple.Args.Count);
3939

40-
var callExpr = tree.block().stat()[1].labelStat().assignExpr();
41-
var blockResult = Visitor.Visit(callExpr);
42-
Assert.IsNotNull(blockResult);
43-
4440
_ = Visitor.Visit(tree);
4541
Assert.IsFalse(Services.Log.HasErrors);
4642
var myvar = Services.Symbols.GlobalScope.Resolve("myvar") as Variable;
@@ -214,7 +210,7 @@ .namespace mynamespace
214210
.return mynamespace.myvar *3
215211
.endfunction
216212
result := myfunc()", true);
217-
var tree = parse.source();
213+
_ = parse.source();
218214
Assert.IsTrue(Services.Log.HasErrors);
219215

220216
parse = ParseSource(
@@ -225,7 +221,7 @@ myblock .block
225221
.return myblock.myvar *3
226222
.endfunction
227223
result := myfunc()", true);
228-
tree = parse.source();
224+
var tree = parse.source();
229225
Assert.IsFalse(Services.Log.HasErrors);
230226
_ = Visitor.Visit(tree);
231227
Assert.IsFalse(Services.Log.HasErrors);
@@ -259,5 +255,210 @@ myfunc .function
259255
Assert.IsTrue(myvar.Value.IsIntegral);
260256
Assert.AreEqual(6, myvar.Value.ToInt());
261257
}
258+
259+
[TestMethod]
260+
public void ArrowSimple()
261+
{
262+
var parse = ParseSource("(el) => 3", true);
263+
_ = parse.arrowFunc();
264+
Assert.IsFalse(Services.Log.HasErrors);
265+
266+
parse = ParseSource("(el) => 3", true);
267+
_ = parse.expr();
268+
Assert.IsFalse(Services.Log.HasErrors);
269+
}
270+
271+
[TestMethod]
272+
public void ArrowBlock()
273+
{
274+
var arrowBlockSrc =
275+
@"(el) => {
276+
.let doubleEl = el * 2
277+
.return doubleEl
278+
}";
279+
var parse = ParseSource(arrowBlockSrc, true);
280+
_ = parse.arrowFunc();
281+
Assert.IsFalse(Services.Log.HasErrors);
282+
283+
parse = ParseSource(arrowBlockSrc, true);
284+
_ = parse.expr();
285+
Assert.IsFalse(Services.Log.HasErrors);
286+
287+
parse = ParseSource(
288+
@"pots = map(arr, (num) => {
289+
.let somebs = 3
290+
.return num == 3 ? 3 * 3 : 2 ^^ num
291+
})", true);
292+
_ = parse.expr();
293+
Assert.IsFalse(Services.Log.HasErrors);
294+
}
295+
296+
[TestMethod]
297+
public void Filter()
298+
{
299+
var parse = ParseSource(
300+
@" .let arr = [1,2,3,4,5,6]
301+
.let evens = filter(arr, (el) => el % 2 == 0)", true);
302+
var tree = parse.source();
303+
Assert.IsFalse(Services.Log.HasErrors);
304+
_ = Visitor.Visit(tree);
305+
Assert.IsFalse(Services.Log.HasErrors);
306+
307+
var evens = Services.Symbols.GlobalScope.Resolve("evens") as Variable;
308+
Assert.IsNotNull(evens);
309+
Assert.IsNotNull(evens.Value);
310+
Assert.IsTrue(evens.Value.IsDefined);
311+
Assert.IsInstanceOfType(evens.Value, typeof(ArrayValue));
312+
313+
var evensArray = evens.Value as ArrayValue;
314+
Assert.AreEqual(3, evensArray.Count);
315+
Assert.IsTrue(evensArray.ElementsNumeric);
316+
Assert.AreEqual(2, evensArray[0].ToInt());
317+
Assert.AreEqual(4, evensArray[1].ToInt());
318+
Assert.AreEqual(6, evensArray[2].ToInt());
319+
320+
parse = ParseSource(
321+
@" .let hello=""HELLO""
322+
.let no_ls = filter(hello, (chr) => chr != 'L')", true);
323+
tree = parse.source();
324+
Assert.IsFalse(Services.Log.HasErrors);
325+
_ = Visitor.Visit(tree);
326+
Assert.IsFalse(Services.Log.HasErrors);
327+
328+
var no_ls = Services.Symbols.GlobalScope.Resolve("no_ls") as Variable;
329+
Assert.IsNotNull(no_ls);
330+
Assert.IsNotNull(no_ls.Value);
331+
Assert.IsTrue(no_ls.Value.IsDefined);
332+
Assert.IsTrue(no_ls.Value.IsString);
333+
Assert.AreEqual("HEO", no_ls.Value.ToString(true));
334+
}
335+
336+
[TestMethod]
337+
public void Concat()
338+
{
339+
var parse = ParseSource(
340+
@" .let odds = [1,3,5]
341+
.let evens = [2,4,6]
342+
.let all = concat(odds, evens)", true);
343+
var tree = parse.source();
344+
Assert.IsFalse(Services.Log.HasErrors);
345+
_ = Visitor.Visit(tree);
346+
Assert.IsFalse(Services.Log.HasErrors);
347+
348+
var all = Services.Symbols.GlobalScope.Resolve("all") as Variable;
349+
Assert.IsNotNull(all);
350+
Assert.IsNotNull(all.Value);
351+
Assert.IsTrue(all.Value.IsDefined);
352+
Assert.IsInstanceOfType(all.Value, typeof(ArrayValue));
353+
354+
var allArr = all.Value as ArrayValue;
355+
Assert.AreEqual(6, allArr.Count);
356+
Assert.IsTrue(allArr.ElementsNumeric);
357+
Assert.AreEqual(1, allArr[0].ToInt());
358+
Assert.AreEqual(2, allArr[3].ToInt());
359+
}
360+
361+
[TestMethod]
362+
public void Map()
363+
{
364+
var parse = ParseSource(
365+
@" .let arr = [1,2,3]
366+
.let doubled = map(arr, (el) => el * 2)", true);
367+
var tree = parse.source();
368+
Assert.IsFalse(Services.Log.HasErrors);
369+
_ = Visitor.Visit(tree);
370+
Assert.IsFalse(Services.Log.HasErrors);
371+
372+
var doubled = Services.Symbols.GlobalScope.Resolve("doubled") as Variable;
373+
Assert.IsNotNull(doubled);
374+
Assert.IsNotNull(doubled.Value);
375+
Assert.IsTrue(doubled.Value.IsDefined);
376+
Assert.IsInstanceOfType(doubled.Value, typeof(ArrayValue));
377+
378+
var doubledArray = doubled.Value as ArrayValue;
379+
Assert.AreEqual(3, doubledArray.Count);
380+
Assert.IsTrue(doubledArray.ElementsNumeric);
381+
Assert.AreEqual(2, doubledArray[0].ToInt());
382+
Assert.AreEqual(4, doubledArray[1].ToInt());
383+
Assert.AreEqual(6, doubledArray[2].ToInt());
384+
385+
parse = ParseSource(
386+
@" .let arr = [1,2,3,4]
387+
.let pots = map(arr, (num) => {
388+
.if num == 3
389+
.return 3 * 3
390+
.endif
391+
.return 2 ^^ num
392+
})
393+
", true);
394+
tree = parse.source();
395+
Assert.IsFalse(Services.Log.HasErrors);
396+
_ = Visitor.Visit(tree);
397+
Assert.IsFalse(Services.Log.HasErrors);
398+
399+
var pots = Services.Symbols.GlobalScope.Resolve("pots") as Variable;
400+
Assert.IsNotNull(pots);
401+
Assert.IsNotNull(pots.Value);
402+
Assert.IsTrue(pots.Value.IsDefined);
403+
Assert.IsInstanceOfType(pots.Value, typeof(ArrayValue));
404+
405+
var potsArray = pots.Value as ArrayValue;
406+
Assert.AreEqual(4, potsArray.Count);
407+
Assert.IsTrue(potsArray.ElementsNumeric);
408+
Assert.AreEqual(2, potsArray[0].ToInt());
409+
Assert.AreEqual(4, potsArray[1].ToInt());
410+
Assert.AreEqual(9, potsArray[2].ToInt());
411+
Assert.AreEqual(16, potsArray[3].ToInt());
412+
}
413+
414+
[TestMethod]
415+
public void Reduce()
416+
{
417+
var parse = ParseSource(
418+
@" .let arr = [1,2,3,4]
419+
.let sum = reduce(arr, (num1, num2) => num1 + num2)", true);
420+
var tree = parse.source();
421+
Assert.IsFalse(Services.Log.HasErrors);
422+
423+
_ = Visitor.Visit(tree);
424+
Assert.IsFalse(Services.Log.HasErrors);
425+
426+
var sum = Services.Symbols.GlobalScope.Resolve("sum") as Variable;
427+
Assert.IsNotNull(sum);
428+
Assert.IsNotNull(sum.Value);
429+
Assert.IsTrue(sum.Value.IsDefined);
430+
Assert.IsTrue(sum.Value.IsNumeric);
431+
Assert.AreEqual(1 + 2 + 3 + 4, sum.Value.ToInt());
432+
433+
}
434+
435+
436+
[TestMethod]
437+
public void Sort()
438+
{
439+
var parse = ParseSource(
440+
@" .let arr = [8,1,7,4]
441+
.let sorted = sort(arr)", true);
442+
var tree = parse.source();
443+
Assert.IsFalse(Services.Log.HasErrors);
444+
445+
_ = Visitor.Visit(tree);
446+
Assert.IsFalse(Services.Log.HasErrors);
447+
448+
var sorted = Services.Symbols.GlobalScope.Resolve("sorted") as Variable;
449+
Assert.IsNotNull(sorted);
450+
Assert.IsNotNull(sorted.Value);
451+
Assert.IsTrue(sorted.Value.IsDefined);
452+
Assert.IsInstanceOfType(sorted.Value, typeof(ArrayValue));
453+
454+
var sortedArray = sorted.Value as ArrayValue;
455+
Assert.AreEqual(4, sortedArray.Count);
456+
Assert.IsTrue(sortedArray.ElementsNumeric);
457+
Assert.AreEqual(1, sortedArray[0].ToInt());
458+
Assert.AreEqual(4, sortedArray[1].ToInt());
459+
Assert.AreEqual(7, sortedArray[2].ToInt());
460+
Assert.AreEqual(8, sortedArray[3].ToInt());
461+
462+
}
262463
}
263464
}

Sixty502DotNet.Tests/TestGen6502.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,18 @@ public void IndAbs()
192192
Assert.AreEqual(0x6c, bytes[0]);
193193
Assert.AreEqual(0xff, bytes[1]);
194194
Assert.AreEqual(0x00, bytes[2]);
195+
196+
parse = ParseSource("jmp ($00ff)+1", true);
197+
tree = parse.source();
198+
Assert.IsFalse(Services.Log.HasErrors);
199+
_ = Visitor.Visit(tree);
200+
Assert.IsFalse(Services.Log.HasErrors);
201+
Assert.AreEqual(0, Services.Output.ProgramStart);
202+
Assert.AreEqual(3, Services.Output.ProgramCounter);
203+
bytes = Services.Output.GetCompilation();
204+
Assert.AreEqual(0x4c, bytes[0]);
205+
Assert.AreEqual(0x00, bytes[1]);
206+
Assert.AreEqual(0x01, bytes[2]);
195207
}
196208

197209
[TestMethod]

Sixty502DotNet.sln

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Global
4040
SolutionGuid = {9BE7575F-6E99-4243-AEAA-4D1E1064DA97}
4141
EndGlobalSection
4242
GlobalSection(MonoDevelopProperties) = preSolution
43-
version = 3.1.1.1
43+
version = 3.2.0.1
4444
Policies = $0
4545
$0.VersionControlPolicy = $1
4646
$1.CommitMessageStyle = $2

Sixty502DotNet/Sixty502DotNet.csproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
<TargetFramework>net5.0</TargetFramework>
66
<RollForward>Major</RollForward>
77
<PackageId>6502.Net</PackageId>
8-
<Version>3.1.1.1</Version>
8+
<Version>3.2.0.1</Version>
99
<Authors>informedcitizenry</Authors>
1010
<Company>informedcitizenry</Company>
1111
<Product>6502.Net</Product>
1212
<Description>6502.Net, A .Net Cross Assembler for Several 8-Bit Microprocessors.</Description>
1313
<Copyright>(C) Copyright 2017-2022 informedcitizenry</Copyright>
14-
<ReleaseVersion>3.1.1.1</ReleaseVersion>
14+
<ReleaseVersion>3.2.0.1</ReleaseVersion>
1515
<StartupObject>Sixty502DotNet.Program</StartupObject>
1616
<AssemblyName>6502.Net</AssemblyName>
17-
<AssemblyVersion>3.1.1.1</AssemblyVersion>
18-
<FileVersion>3.1.1.1</FileVersion>
17+
<AssemblyVersion>3.2.0.1</AssemblyVersion>
18+
<FileVersion>3.2.0.1</FileVersion>
1919
<SignAssembly>false</SignAssembly>
2020
<LangVersion>8.0</LangVersion>
2121
<Nullable>enable</Nullable>
@@ -63,10 +63,10 @@
6363
</ItemGroup>
6464

6565
<ItemGroup>
66-
<PackageReference Include="CommandLineParser" Version="2.8.0" />
66+
<PackageReference Include="CommandLineParser" Version="2.9.1" />
6767
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
68-
<PackageReference Include="Antlr4.Runtime.Standard" Version="4.10.1" />
69-
<PackageReference Include="Antlr4BuildTasks" Version="10.3.0">
68+
<PackageReference Include="Antlr4.Runtime.Standard" Version="4.11.1" />
69+
<PackageReference Include="Antlr4BuildTasks" Version="11.1.0">
7070
<PrivateAssets>all</PrivateAssets>
7171
</PackageReference>
7272
</ItemGroup>

Sixty502DotNet/src/CodeGen/Assembler/InstructionSet.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ private IDictionary<string, int> GetDirectives()
164164
{ ".short", Sixty502DotNetLexer.Short },
165165
{ ".sint", Sixty502DotNetLexer.Sint },
166166
{ ".string", Sixty502DotNetLexer.String },
167+
{ ".stringify", Sixty502DotNetLexer.Stringify },
167168
{ ".switch", Sixty502DotNetLexer.Switch },
168169
{ ".tfradp", Sixty502DotNetLexer.Tfradp },
169170
{ ".tfrbdp", Sixty502DotNetLexer.Tfrbdp },

Sixty502DotNet/src/CodeGen/BlockVisitor.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private void Output(int directive, Sixty502DotNetParser.ExprContext[] expression
138138
else if (!Services.State.PassNeeded && Services.State.CurrentPass == 0)
139139
{
140140
var error = directive == Sixty502DotNetParser.Error || directive == Sixty502DotNetParser.Errorif;
141-
Services.Log.LogEntry(expressions[outputIndex - 1], output.ToString(true), error);
141+
Services.Log.LogEntry(expressions[outputIndex], output.ToString(true), error);
142142
}
143143
}
144144
else if (output.IsDefined)
@@ -563,7 +563,7 @@ protected void Import(Sixty502DotNetParser.DirectiveStatContext context)
563563
if (!Services.Symbols.ImportedScopes.Any(s => ReferenceEquals(s, ns)))
564564
{
565565
// only import once.
566-
Services.Symbols.ImportedScopes.Add(ns!);
566+
Services.Symbols.ImportedScopes.Add(ns!);
567567
}
568568
}
569569

@@ -902,6 +902,16 @@ public override BlockState VisitBlock([NotNull] Sixty502DotNetParser.BlockContex
902902
return state;
903903
}
904904

905+
906+
public override BlockState VisitExpr([NotNull] Sixty502DotNetParser.ExprContext context)
907+
{
908+
var arrowFunc = context.designator()?.arrowFunc();
909+
Value v = arrowFunc != null ?
910+
new FunctionValue(arrowFunc, Services) :
911+
Services.ExpressionVisitor.Visit(context);
912+
return new BlockState(v, Status.Return);
913+
}
914+
905915
public override BlockState VisitExitBlock([NotNull] Sixty502DotNetParser.ExitBlockContext context)
906916
{
907917
_ = base.VisitChildren(context);

Sixty502DotNet/src/CodeGen/CodeGenVisitor.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ public override BlockState VisitPseudoOpStat([NotNull] Sixty502DotNetParser.Pseu
210210
case Sixty502DotNetParser.Sint:
211211
_pseudoOps.GenValues(args, short.MinValue, short.MaxValue, 2, false, false);
212212
break;
213+
case Sixty502DotNetParser.Stringify:
214+
_pseudoOps.GenStrings(directive, context.pseudoOpList(), true);
215+
break;
213216
case Sixty502DotNetParser.Word:
214217
_pseudoOps.GenValues(args, ushort.MinValue, ushort.MaxValue, 2, false, false);
215218
break;

0 commit comments

Comments
 (0)