1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-05-31 18:41:30 +00:00

Unify assembly parameter evaluation

This commit is contained in:
Karol Stasiak 2021-02-27 00:08:31 +01:00
parent 6f2c8cd991
commit a111af384e
2 changed files with 15 additions and 11 deletions

View File

@ -58,7 +58,8 @@ object M6809StatementCompiler extends AbstractStatementCompiler[MLine] {
}
(eval ++ epilogue ++ rts) -> Nil
case M6809AssemblyStatement(opcode, addrMode, expression, elidability) =>
val e = ctx.env.evalForAsm(expression) match {
val silent = MOpcode.Branching(opcode) || opcode == JMP || opcode == LABEL || opcode == CHANGED_MEM
val e = ctx.env.evalForAsm(expression, silent = silent) match {
case Some(e) => e
case None =>
expression match {

View File

@ -225,17 +225,20 @@ object Z80StatementCompiler extends AbstractStatementCompiler[ZLine] {
}
} -> Nil
case Z80AssemblyStatement(op, reg, offset, expression, elidability) =>
val param: Constant = expression match {
// TODO: hmmm
case VariableExpression(name) =>
if (Seq(JP, JR, DJNZ, LABEL, CHANGED_MEM).contains(op)) {
val fqName = if (name.startsWith(".")) env.prefix + name else name
MemoryAddressConstant(Label(fqName))
} else {
env.evalForAsm(expression).orElse(env.maybeGet[ThingInMemory](name).map(_.toAddress)).getOrElse(MemoryAddressConstant(Label(name)))
val silent = (Seq(JP, JR, DJNZ, LABEL, CHANGED_MEM).contains(op))
val param = ctx.env.evalForAsm(expression, silent = silent) match {
case Some(e) => e
case None =>
expression match {
case VariableExpression(name) =>
env.maybeGet[ThingInMemory](name).map(_.toAddress).getOrElse {
val fqName = if (name.startsWith(".")) env.prefix + name else name
MemoryAddressConstant(Label(fqName))
}
case _ =>
ctx.log.error("Invalid parameter", statement.position)
Constant.Zero
}
case _ =>
env.evalForAsm(expression).getOrElse(env.errorConstant(s"`$expression` is not a constant", Some(expression), expression.position))
}
val registers = (reg, offset) match {
case (OneRegister(r), Some(o)) => env.evalForAsm(expression) match {