mirror of https://github.com/Washi1337/Emux.git
DAA now conforms to testroms.
This commit is contained in:
parent
b0e61c28fe
commit
2c1ac18334
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue