mirror of
https://github.com/KarolS/millfork.git
synced 2025-03-21 21:30:23 +00:00
Allow hi() and lo() in inline assembly
This commit is contained in:
parent
4d64bbafac
commit
9ff254c72d
src
15
src/main/scala/millfork/env/Environment.scala
vendored
15
src/main/scala/millfork/env/Environment.scala
vendored
@ -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)
|
||||
}
|
||||
|
@ -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 =>
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user