mirror of
https://github.com/KarolS/millfork.git
synced 2024-10-12 09:23:45 +00:00
Allow hi() and lo() in inline assembly
This commit is contained in:
parent
4d64bbafac
commit
9ff254c72d
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)
|
constantOperationForAsm(MathOperator.Exor, params)
|
||||||
case "||" | "|" =>
|
case "||" | "|" =>
|
||||||
constantOperationForAsm(MathOperator.Or, params)
|
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 _ =>
|
case _ =>
|
||||||
None
|
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 = {
|
def registerAlias(stmt: AliasDefinitionStatement): Unit = {
|
||||||
addThing(Alias(stmt.name, stmt.target), stmt.position)
|
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…
Reference in New Issue
Block a user