From 2c1ac1833484f8744658f256399b483cc956813c Mon Sep 17 00:00:00 2001 From: Washi Date: Wed, 25 Jul 2018 00:51:26 +0200 Subject: [PATCH] DAA now conforms to testroms. --- Emux.GameBoy/Cpu/GameBoyAlu.cs | 39 ++++++++++++---------------- Emux/Expressions/ExpressionParser.cs | 5 ++-- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Emux.GameBoy/Cpu/GameBoyAlu.cs b/Emux.GameBoy/Cpu/GameBoyAlu.cs index c5c0646..005b2ea 100644 --- a/Emux.GameBoy/Cpu/GameBoyAlu.cs +++ b/Emux.GameBoy/Cpu/GameBoyAlu.cs @@ -337,37 +337,32 @@ namespace Emux.GameBoy.Cpu internal void Daa() { - var flags = RegisterFlags.None; + // Reference: https://ehaskins.com/2018-01-30%20Z80%20DAA/ + + int a = _registers.A; - int value = _registers.A; + int correction = 0; + var setFlagC = RegisterFlags.None; - int correction = _registers.GetFlags(RegisterFlags.C) ? 0x60 : 0x00; - - if (_registers.GetFlags(RegisterFlags.H)) + if (_registers.GetFlags(RegisterFlags.H) || (!_registers.GetFlags(RegisterFlags.N) && (a & 0xF) > 9)) correction |= 0x6; - if (!_registers.GetFlags(RegisterFlags.N)) + if (_registers.GetFlags(RegisterFlags.C) || (!_registers.GetFlags(RegisterFlags.N) && a > 0x99)) { - if ((value & 0xF) > 0x9) - correction |= 6; - if (value > 0x99) - correction |= 0x60; - value += correction; - } - else - { - value -= correction; + correction |= 0x60; + setFlagC = RegisterFlags.C; } - if (((correction << 2) & 0x100) != 0) - flags |= RegisterFlags.C; - if (_registers.A == 0) - flags |= RegisterFlags.Z; + a += _registers.GetFlags(RegisterFlags.N) ? -correction : correction; + a &= 0xFF; - _registers.A = (byte) (value & 0xFF); + var setFlagZ = a == 0 ? RegisterFlags.Z : RegisterFlags.None; - _registers.ClearFlags(RegisterFlags.Z | RegisterFlags.H | RegisterFlags.C); - _registers.SetFlags(flags); + var newFlags = (RegisterFlags) _registers.F & ~(RegisterFlags.H | RegisterFlags.Z | RegisterFlags.C); + newFlags |= setFlagC | setFlagZ; + + _registers.OverwriteFlags(newFlags); + _registers.A = (byte) a; } } } diff --git a/Emux/Expressions/ExpressionParser.cs b/Emux/Expressions/ExpressionParser.cs index 83cda79..ab93604 100644 --- a/Emux/Expressions/ExpressionParser.cs +++ b/Emux/Expressions/ExpressionParser.cs @@ -34,10 +34,9 @@ namespace Emux.Expressions public static Predicate CompileExpression(string code) { var lexer = new ExpressionLexer(new StringReader(code)); - var postFix = ToPostfix(lexer).ToArray(); - + var stack = new Stack(); - foreach (var token in postFix) + foreach (var token in ToPostfix(lexer)) { switch (token.Terminal) {