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:
parent
6f2c8cd991
commit
a111af384e
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user