From 778d04ce21172bb1ed068176c4c38bb0a39767b4 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Sat, 3 Aug 2019 20:33:49 +0200 Subject: [PATCH] 6502: Fix sign extension when type casting --- .../compiler/mos/MosExpressionCompiler.scala | 4 ++- .../millfork/test/SignExtensionSuite.scala | 30 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala index 4b27c17d..d20d1e9a 100644 --- a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala @@ -1635,7 +1635,9 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] { env.maybeGet[Type](f.functionName) match { case Some(typ) => val sourceType = validateTypeCastAndGetSourceExpressionType(ctx, typ, params) - val newExprTypeAndVariable = exprTypeAndVariable.map(i => sourceType -> i._2) + val newExprTypeAndVariable = exprTypeAndVariable.map { i => + (if (i._1.size == sourceType.size) i._1 else sourceType) -> i._2 + } return compile(ctx, params.head, newExprTypeAndVariable, branches) case None => // fallthrough to the lookup below diff --git a/src/test/scala/millfork/test/SignExtensionSuite.scala b/src/test/scala/millfork/test/SignExtensionSuite.scala index 35ef261f..545790da 100644 --- a/src/test/scala/millfork/test/SignExtensionSuite.scala +++ b/src/test/scala/millfork/test/SignExtensionSuite.scala @@ -1,7 +1,7 @@ package millfork.test import millfork.Cpu -import millfork.test.emu.EmuCrossPlatformBenchmarkRun +import millfork.test.emu.{EmuCrossPlatformBenchmarkRun, EmuUnoptimizedCrossPlatformRun} import org.scalatest.{FunSuite, Matchers} /** @@ -69,4 +69,32 @@ class SignExtensionSuite extends FunSuite with Matchers { m.readWord(0xc000) should equal(440) } } + + test("Byte to Word") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80)(""" + | word output @$c000 + | void main () { + | sbyte b + | b = -1 + | memory_barrier() + | output = byte(b) + | } + """.stripMargin){m => + m.readWord(0xc000) should equal(0x00ff) + } + } + + test("Byte to Word 2") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80)(""" + | word output @$c000 + | void main () { + | sbyte b + | b = -1 + | memory_barrier() + | output = word(byte(b)) + | } + """.stripMargin){m => + m.readWord(0xc000) should equal(0x00ff) + } + } }