feat(cpu): add CB-prefixed opcode handling
This commit is contained in:
1 parent
11e9a7af42
commit
47482ef46c
1 file changed
+72
@@ -0,0 +1,72 @@
|
|||||||
|
namespace GameBoy.Cpu
|
||||||
|
{
|
||||||
|
public sealed partial class Cpu
|
||||||
|
{
|
||||||
|
private byte GetOperand(int index)
|
||||||
|
{
|
||||||
|
return index switch
|
||||||
|
{
|
||||||
|
0 => B,
|
||||||
|
1 => C,
|
||||||
|
2 => D,
|
||||||
|
3 => E,
|
||||||
|
4 => H,
|
||||||
|
5 => L,
|
||||||
|
6 => Read8(HL),
|
||||||
|
_ => A
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetOperand(int index, byte value)
|
||||||
|
{
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case 0: B = value; break;
|
||||||
|
case 1: C = value; break;
|
||||||
|
case 2: D = value; break;
|
||||||
|
case 3: E = value; break;
|
||||||
|
case 4: H = value; break;
|
||||||
|
case 5: L = value; break;
|
||||||
|
case 6: Write8(HL, value); break;
|
||||||
|
default: A = value; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteCb()
|
||||||
|
{
|
||||||
|
byte op = Fetch8();
|
||||||
|
int index = op & 0x07;
|
||||||
|
int y = (op >> 3) & 0x07;
|
||||||
|
int block = op >> 6;
|
||||||
|
|
||||||
|
byte value = GetOperand(index);
|
||||||
|
|
||||||
|
switch (block)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
byte rotated = y switch
|
||||||
|
{
|
||||||
|
0 => Rlc(value),
|
||||||
|
1 => Rrc(value),
|
||||||
|
2 => Rl(value),
|
||||||
|
3 => Rr(value),
|
||||||
|
4 => Sla(value),
|
||||||
|
5 => Sra(value),
|
||||||
|
6 => Swap(value),
|
||||||
|
_ => Srl(value)
|
||||||
|
};
|
||||||
|
SetOperand(index, rotated);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
BitTest(y, value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SetOperand(index, ResetBit(y, value));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetOperand(index, SetBit(y, value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user