1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-09-28 18:55:09 +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 (eval ++ epilogue ++ rts) -> Nil
case M6809AssemblyStatement(opcode, addrMode, expression, elidability) => 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 Some(e) => e
case None => case None =>
expression match { expression match {

View File

@ -225,17 +225,20 @@ object Z80StatementCompiler extends AbstractStatementCompiler[ZLine] {
} }
} -> Nil } -> Nil
case Z80AssemblyStatement(op, reg, offset, expression, elidability) => case Z80AssemblyStatement(op, reg, offset, expression, elidability) =>
val param: Constant = expression match { val silent = (Seq(JP, JR, DJNZ, LABEL, CHANGED_MEM).contains(op))
// TODO: hmmm val param = ctx.env.evalForAsm(expression, silent = silent) match {
case VariableExpression(name) => case Some(e) => e
if (Seq(JP, JR, DJNZ, LABEL, CHANGED_MEM).contains(op)) { case None =>
val fqName = if (name.startsWith(".")) env.prefix + name else name expression match {
MemoryAddressConstant(Label(fqName)) case VariableExpression(name) =>
} else { env.maybeGet[ThingInMemory](name).map(_.toAddress).getOrElse {
env.evalForAsm(expression).orElse(env.maybeGet[ThingInMemory](name).map(_.toAddress)).getOrElse(MemoryAddressConstant(Label(name))) 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 { val registers = (reg, offset) match {
case (OneRegister(r), Some(o)) => env.evalForAsm(expression) match { case (OneRegister(r), Some(o)) => env.evalForAsm(expression) match {