1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-07-07 21:28:59 +00:00

Allow hi() and lo() in inline assembly

This commit is contained in:
Karol Stasiak 2018-12-27 14:17:48 +01:00
parent 4d64bbafac
commit 9ff254c72d
2 changed files with 29 additions and 0 deletions

View File

@ -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)
}

View File

@ -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 =>
}
}
}