DAA now conforms to testroms.

This commit is contained in:
Washi 2018-07-25 00:51:26 +02:00
parent b0e61c28fe
commit 2c1ac18334
2 changed files with 19 additions and 25 deletions

View File

@ -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;
}
}
}

View File

@ -34,10 +34,9 @@ namespace Emux.Expressions
public static Predicate<GameBoyCpu> CompileExpression(string code)
{
var lexer = new ExpressionLexer(new StringReader(code));
var postFix = ToPostfix(lexer).ToArray();
var stack = new Stack<Expression>();
foreach (var token in postFix)
foreach (var token in ToPostfix(lexer))
{
switch (token.Terminal)
{