diff --git a/src/main/scala/millfork/env/Environment.scala b/src/main/scala/millfork/env/Environment.scala index a4e1acac..003d4987 100644 --- a/src/main/scala/millfork/env/Environment.scala +++ b/src/main/scala/millfork/env/Environment.scala @@ -684,6 +684,13 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa constantOperationForAsm(MathOperator.Exor, params) case "||" | "|" => constantOperationForAsm(MathOperator.Or, params) + case "hi" => + oneArgFunctionForAsm(_.hiByte, params) + case "lo" => + oneArgFunctionForAsm(_.loByte, params) + case "nonet" | "sin" | "cos" | "tan" => + log.error("Function not supported in inline assembly", e.position) + None case _ => None } @@ -699,6 +706,14 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa } } + private def oneArgFunctionForAsm(f: Constant => Constant, params: List[Expression]): Option[Constant] = { + if (params.size != 1) { + log.error("Too many arguments", params.headOption.flatMap(_.position)) + return None + } + evalForAsm(params.head).map(f).map(_.quickSimplify) + } + def registerAlias(stmt: AliasDefinitionStatement): Unit = { addThing(Alias(stmt.name, stmt.target), stmt.position) } diff --git a/src/test/scala/millfork/test/AssemblySuite.scala b/src/test/scala/millfork/test/AssemblySuite.scala index ee5d032d..375d7b0f 100644 --- a/src/test/scala/millfork/test/AssemblySuite.scala +++ b/src/test/scala/millfork/test/AssemblySuite.scala @@ -211,4 +211,18 @@ class AssemblySuite extends FunSuite with Matchers with AppendedClues { } } + test("Constants") { + EmuBenchmarkRun( + """ + | const word COUNT = $400 + | array a[COUNT]@$c000 + | asm void main () { + | LDA #hi(a.addr+COUNT) + | RTS + | } + """.stripMargin){m => + + } + } + }