From e95d4037526b78f006836fadc8822acdb03134c8 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Sat, 10 Mar 2018 00:07:40 +0100 Subject: [PATCH] Flow analyser bugfixes --- .../millfork/assembly/opt/CpuStatus.scala | 50 +++++++++++++------ .../assembly/opt/FlowAnalyzerForTheRest.scala | 4 +- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/main/scala/millfork/assembly/opt/CpuStatus.scala b/src/main/scala/millfork/assembly/opt/CpuStatus.scala index 055bead4..4e7cb4d3 100644 --- a/src/main/scala/millfork/assembly/opt/CpuStatus.scala +++ b/src/main/scala/millfork/assembly/opt/CpuStatus.scala @@ -126,12 +126,12 @@ object Status { implicit class IntStatusOps(val inner: Status[Int]) extends AnyVal { def bit0: Status[Boolean] = inner match { - case SingleStatus(x) => SingleStatus((x & 1) == 0) + case SingleStatus(x) => SingleStatus((x & 1) != 0) case _ => AnyStatus } def bit7: Status[Boolean] = inner match { - case SingleStatus(x) => SingleStatus((x & 0x80) == 0) + case SingleStatus(x) => SingleStatus((x & 0x80) != 0) case _ => AnyStatus } @@ -251,20 +251,38 @@ case class CpuStatus(a: Status[Int] = UnknownStatus, m: Status[Boolean] = UnknownStatus, w: Status[Boolean] = UnknownStatus ) { - assert(a ne null) - assert(ah ne null) - assert(x ne null) - assert(y ne null) - assert(iz ne null) - assert(z ne null) - assert(n ne null) - assert(v ne null) - assert(c ne null) - assert(d ne null) - assert(m ne null) - assert(w ne null) - assert(a0 ne null) - assert(a7 ne null) +// assert(a ne null) +// assert(ah ne null) +// assert(x ne null) +// assert(y ne null) +// assert(iz ne null) +// assert(z ne null) +// assert(n ne null) +// assert(v ne null) +// assert(c ne null) +// assert(d ne null) +// assert(m ne null) +// assert(w ne null) +// assert(a0 ne null) +// assert(a7 ne null) +// (a, a7) match { +// case (SingleStatus(o), SingleStatus(b7)) => if (o.&(0x80).!=(0).!=(b7)) { +// println(a) +// println(a7) +// println(a0) +// ??? +// } +// case _ => +// } +// (a, a0) match { +// case (SingleStatus(o), SingleStatus(b0)) => if (o.&(1).!=(0).!=(b0)) { +// println(a) +// println(a7) +// println(a0) +// ??? +// } +// case _ => +// } override def toString: String = s"A=$a,B=$ah,X=$x,Y=$y,Z=$iz; Z=$z,N=$n,C=$c,V=$v,D=$d,M=$m,X=$w; A7=$a7,A0=$a0,NZ:$src" diff --git a/src/main/scala/millfork/assembly/opt/FlowAnalyzerForTheRest.scala b/src/main/scala/millfork/assembly/opt/FlowAnalyzerForTheRest.scala index 7b1a1f8a..40300578 100644 --- a/src/main/scala/millfork/assembly/opt/FlowAnalyzerForTheRest.scala +++ b/src/main/scala/millfork/assembly/opt/FlowAnalyzerForTheRest.scala @@ -39,7 +39,7 @@ object FlowAnalyzerForTheRest { var currentStatus = c currentStatus = currentStatus.copy(n = Status.SingleFalse) if (currentStatus.src.isFromA) { - currentStatus = currentStatus.copy(a7 = Status.SingleTrue) + currentStatus = currentStatus.copy(a = currentStatus.a.flatMap(aa => if (aa.&(0x80)!=0) SingleStatus(aa) else AnyStatus), a7 = Status.SingleTrue) } currentStatus }), @@ -47,7 +47,7 @@ object FlowAnalyzerForTheRest { var currentStatus = c currentStatus = currentStatus.copy(n = Status.SingleTrue) if (currentStatus.src.isFromA) { - currentStatus = currentStatus.copy(a7 = Status.SingleFalse) + currentStatus = currentStatus.copy(a = currentStatus.a.flatMap(aa => if (aa.&(0x80)==0) SingleStatus(aa) else AnyStatus), a7 = Status.SingleFalse) } currentStatus }),