diff --git a/src/main/scala/millfork/assembly/mos/opt/ReverseFlowAnalyzer.scala b/src/main/scala/millfork/assembly/mos/opt/ReverseFlowAnalyzer.scala index 05d12a54..a6648036 100644 --- a/src/main/scala/millfork/assembly/mos/opt/ReverseFlowAnalyzer.scala +++ b/src/main/scala/millfork/assembly/mos/opt/ReverseFlowAnalyzer.scala @@ -169,6 +169,8 @@ object ReverseFlowAnalyzer { result = result.copy(x = Important, y = Important) case _ => }) + case NormalParamSignature(List(MemoryVariable(_, typ, _))) if typ.size == 1 => + result = result.copy(a = Important) case _ => } if (ZeropageRegisterOptimizations.functionsThatUsePseudoregisterAsInput(fun.name)) { diff --git a/src/main/scala/millfork/assembly/mos/opt/SingleAssignmentVariableOptimization.scala b/src/main/scala/millfork/assembly/mos/opt/SingleAssignmentVariableOptimization.scala index 0fb6eec1..8b2f4fe3 100644 --- a/src/main/scala/millfork/assembly/mos/opt/SingleAssignmentVariableOptimization.scala +++ b/src/main/scala/millfork/assembly/mos/opt/SingleAssignmentVariableOptimization.scala @@ -35,6 +35,8 @@ object SingleAssignmentVariableOptimization extends AssemblyOptimization[Assembl override def optimize(f: NormalFunction, code: List[AssemblyLine], options: CompilationOptions): List[AssemblyLine] = { val paramVariables = f.params match { + case NormalParamSignature(List(MemoryVariable(_, typ, _))) if typ.size == 1 => + Set[String]() case NormalParamSignature(ps) => ps.map(_.name).toSet case _ => diff --git a/src/main/scala/millfork/assembly/mos/opt/VariableToRegisterOptimization.scala b/src/main/scala/millfork/assembly/mos/opt/VariableToRegisterOptimization.scala index 64885d82..861ef03b 100644 --- a/src/main/scala/millfork/assembly/mos/opt/VariableToRegisterOptimization.scala +++ b/src/main/scala/millfork/assembly/mos/opt/VariableToRegisterOptimization.scala @@ -105,6 +105,8 @@ object VariableToRegisterOptimization extends AssemblyOptimization[AssemblyLine] override def optimize(f: NormalFunction, code: List[AssemblyLine], options: CompilationOptions): List[AssemblyLine] = { val paramVariables = f.params match { + case NormalParamSignature(List(MemoryVariable(_, typ, _))) if typ.size == 1 => + Set[String]() case NormalParamSignature(ps) => ps.map(_.name).toSet case _ => diff --git a/src/main/scala/millfork/compiler/mos/MosCompiler.scala b/src/main/scala/millfork/compiler/mos/MosCompiler.scala index 5b4fdb73..f14a9350 100644 --- a/src/main/scala/millfork/compiler/mos/MosCompiler.scala +++ b/src/main/scala/millfork/compiler/mos/MosCompiler.scala @@ -23,6 +23,11 @@ object MosCompiler extends AbstractCompiler[AssemblyLine] { ctx.env.nameCheck(ctx.function.code) val chunk = MosStatementCompiler.compile(ctx, ctx.function.code) + val storeParamsFromRegisters = ctx.function.params match { + case NormalParamSignature(List(param@MemoryVariable(_, typ, _))) if typ.size == 1 => + List(AssemblyLine.absolute(STA, param)) + case _ => Nil + } val phReg = if (ctx.options.flag(CompilationFlag.ZeropagePseudoregister)) { val reg = ctx.env.get[VariableInMemory]("__reg") @@ -34,7 +39,7 @@ object MosCompiler extends AbstractCompiler[AssemblyLine] { ) } else Nil - val prefix = (if (ctx.function.interrupt) { + val prefix = storeParamsFromRegisters ++ (if (ctx.function.interrupt) { if (ctx.options.flag(CompilationFlag.EmitNative65816Opcodes)) { if (ctx.options.flag(CompilationFlag.ZeropagePseudoregister)) { diff --git a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala index ed7713c3..e76cd169 100644 --- a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala @@ -1067,6 +1067,8 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] { case _ => Nil } secondViaMemory ++ thirdViaRegisters :+ AssemblyLine.absoluteOrLongAbsolute(JSR, function, ctx.options) + case NormalParamSignature(List(MemoryVariable(_, typ, _))) if typ.size == 1 => + compile(ctx, params.head, Some(b -> RegisterVariable(MosRegister.A, b)), BranchSpec.None) ++ List(AssemblyLine.absoluteOrLongAbsolute(JSR, function, ctx.options)) case NormalParamSignature(paramVars) => params.zip(paramVars).flatMap { case (paramExpr, paramVar) =>