From 50aa286d3ad31a4fdca82863cbeb197b893166be Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Wed, 31 Jul 2019 00:54:04 +0200 Subject: [PATCH] begin of for asm --- .../compiler/target/c64/codegen2/AsmGen2.kt | 27 ++++++++++++++----- examples/test.p8 | 10 +++---- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/compiler/src/prog8/compiler/target/c64/codegen2/AsmGen2.kt b/compiler/src/prog8/compiler/target/c64/codegen2/AsmGen2.kt index 60fa2b45e..975029507 100644 --- a/compiler/src/prog8/compiler/target/c64/codegen2/AsmGen2.kt +++ b/compiler/src/prog8/compiler/target/c64/codegen2/AsmGen2.kt @@ -952,21 +952,36 @@ internal class AsmGen2(val program: Program, } private fun translate(stmt: ForLoop) { + val iterableDt = stmt.iterable.inferType(program) when(stmt.iterable) { is RangeExpr -> { - println("forloop over range $stmt") + when(iterableDt) { + in ByteDatatypes -> { + println("forloop over byte range $stmt") // TODO + } + in WordDatatypes -> { + println("forloop over word range $stmt") // TODO + } + else -> throw AssemblyError("range expression can only be byte or word") + } } is IdentifierReference -> { - val iterableDt = stmt.iterable.inferType(program) + val decl = (stmt.iterable as IdentifierReference).targetVarDecl(program.namespace)!! when(iterableDt) { - DataType.STR, DataType.STR_S, DataType.ARRAY_UB, DataType.ARRAY_B -> { - println("forloop over byte array/string $stmt") + DataType.STR, DataType.STR_S -> { + println("forloop over string $stmt") // TODO (ends at 0 byte) + } + DataType.ARRAY_UB, DataType.ARRAY_B -> { + val size = decl.arraysize!!.size() + println("forloop over byte array of len $size $stmt") // TODO (ends at length of array) } DataType.ARRAY_W, DataType.ARRAY_UW -> { - println("forloop over word array $stmt") + val size = decl.arraysize!!.size() + println("forloop over word array len $size $stmt") // TODO } DataType.ARRAY_F -> { - println("forloop over float array $stmt") + val size = decl.arraysize!!.size() + println("forloop over float array len $size $stmt") // TODO } else -> throw AssemblyError("can't iterate over $iterableDt") } diff --git a/examples/test.p8 b/examples/test.p8 index 986464efc..4ddcf1e88 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -14,11 +14,11 @@ main { } c64.CHROUT('\n') -; for A in [1,3,5,99] { -; c64scr.print_ub(A) -; c64.CHROUT(',') -; } -; c64.CHROUT('\n') + for A in [1,3,5,99] { + c64scr.print_ub(A) + c64.CHROUT(',') + } + c64.CHROUT('\n') ; ; for A in 10 to 20 { ; c64scr.print_ub(A)