Implemented a load more Z80 OpCodes
This commit is contained in:
@@ -322,6 +322,9 @@ namespace Core.Cpu
|
|||||||
case 0x04: // INC B
|
case 0x04: // INC B
|
||||||
BC.High = Inc8(BC.High);
|
BC.High = Inc8(BC.High);
|
||||||
return 4;
|
return 4;
|
||||||
|
case 0x0E: // LD C, n
|
||||||
|
BC.Low = FetchByte();
|
||||||
|
return 7; // Takes 7 T-States
|
||||||
case 0x10: // DJNZ d
|
case 0x10: // DJNZ d
|
||||||
sbyte djnzOffset = (sbyte)FetchByte();
|
sbyte djnzOffset = (sbyte)FetchByte();
|
||||||
|
|
||||||
@@ -606,7 +609,7 @@ namespace Core.Cpu
|
|||||||
targetAddress = (ushort)(IY.Word + offset75);
|
targetAddress = (ushort)(IY.Word + offset75);
|
||||||
// Write the low byte of HL to memory
|
// Write the low byte of HL to memory
|
||||||
_memory.Write(targetAddress, HL.Low);
|
_memory.Write(targetAddress, HL.Low);
|
||||||
return 19;
|
return 19;
|
||||||
case 0xCB: // The FD CB nested prefix
|
case 0xCB: // The FD CB nested prefix
|
||||||
{
|
{
|
||||||
sbyte offsetCB = (sbyte)FetchByte(); // This is the '01'
|
sbyte offsetCB = (sbyte)FetchByte(); // This is the '01'
|
||||||
@@ -615,6 +618,35 @@ namespace Core.Cpu
|
|||||||
|
|
||||||
switch (bitOpcode)
|
switch (bitOpcode)
|
||||||
{
|
{
|
||||||
|
case 0x4E: // BIT 1, (IY+d)
|
||||||
|
{
|
||||||
|
byte memValBit = _memory.Read(targetAddress);
|
||||||
|
|
||||||
|
// Check if bit 1 is 0
|
||||||
|
bool bitIsZero = (memValBit & 0x02) == 0;
|
||||||
|
|
||||||
|
// Preserve the Carry flag (Bit 0), clear everything else
|
||||||
|
AF.Low &= 0x01;
|
||||||
|
|
||||||
|
// Set Half-Carry (Bit 4) - Standard Z80 behavior for BIT
|
||||||
|
AF.Low |= 0x10;
|
||||||
|
|
||||||
|
if (bitIsZero)
|
||||||
|
{
|
||||||
|
AF.Low |= 0x40; // Set Zero Flag (Bit 6)
|
||||||
|
AF.Low |= 0x04; // Set P/V Flag (Bit 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
return 20; // Takes 20 T-States
|
||||||
|
}
|
||||||
|
case 0x8E: // RES 1, (IY+d)
|
||||||
|
byte memValRes = _memory.Read(targetAddress);
|
||||||
|
|
||||||
|
// 0xFD is Binary 1111 1101.
|
||||||
|
// ANDing with this preserves all bits except Bit 1, which becomes 0.
|
||||||
|
memValRes &= 0xFD;
|
||||||
|
_memory.Write(targetAddress, memValRes);
|
||||||
|
return 23;
|
||||||
case 0xCE: // SET 1, (IY+d)
|
case 0xCE: // SET 1, (IY+d)
|
||||||
memVal = _memory.Read(targetAddress);
|
memVal = _memory.Read(targetAddress);
|
||||||
memVal |= 0x02; // 0x02 is Binary 0000 0010 (Bit 1)
|
memVal |= 0x02; // 0x02 is Binary 0000 0010 (Bit 1)
|
||||||
|
|||||||
@@ -235,6 +235,11 @@ namespace Desktop
|
|||||||
case 0x04:
|
case 0x04:
|
||||||
mnemonic = "INC B";
|
mnemonic = "INC B";
|
||||||
break;
|
break;
|
||||||
|
case 0x0E:
|
||||||
|
byte cImm = _memoryBus.Read((ushort)(currentPc + 1));
|
||||||
|
mnemonic = $"LD C, 0x{cImm:X2}";
|
||||||
|
instructionLength = 2;
|
||||||
|
break;
|
||||||
case 0x10:
|
case 0x10:
|
||||||
sbyte djnzOffset = (sbyte)_memoryBus.Read((ushort)(currentPc + 1));
|
sbyte djnzOffset = (sbyte)_memoryBus.Read((ushort)(currentPc + 1));
|
||||||
ushort djnzDest = (ushort)(currentPc + 2 + djnzOffset);
|
ushort djnzDest = (ushort)(currentPc + 2 + djnzOffset);
|
||||||
@@ -435,8 +440,11 @@ namespace Desktop
|
|||||||
sbyte d = (sbyte)_memoryBus.Read((ushort)(currentPc + 2));
|
sbyte d = (sbyte)_memoryBus.Read((ushort)(currentPc + 2));
|
||||||
byte cbOpcode = _memoryBus.Read((ushort)(currentPc + 3));
|
byte cbOpcode = _memoryBus.Read((ushort)(currentPc + 3));
|
||||||
string sign = d >= 0 ? "+" : "";
|
string sign = d >= 0 ? "+" : "";
|
||||||
|
if (cbOpcode == 0x4E)
|
||||||
if (cbOpcode == 0xCE)
|
{
|
||||||
|
mnemonic = $"BIT 1, (IY{sign}{d})";
|
||||||
|
}
|
||||||
|
else if (cbOpcode == 0xCE)
|
||||||
{
|
{
|
||||||
mnemonic = $"SET 1, (IY{sign}{d})";
|
mnemonic = $"SET 1, (IY{sign}{d})";
|
||||||
}
|
}
|
||||||
@@ -453,6 +461,26 @@ namespace Desktop
|
|||||||
mnemonic = $"LD (IY{sign}{d}), L";
|
mnemonic = $"LD (IY{sign}{d}), L";
|
||||||
instructionLength = 3;
|
instructionLength = 3;
|
||||||
}
|
}
|
||||||
|
else if (fdOpcode == 0xCB) // FD CB prefix
|
||||||
|
{
|
||||||
|
sbyte d = (sbyte)_memoryBus.Read((ushort)(currentPc + 2));
|
||||||
|
byte cbOpcode = _memoryBus.Read((ushort)(currentPc + 3));
|
||||||
|
string sign = d >= 0 ? "+" : "";
|
||||||
|
|
||||||
|
if (cbOpcode == 0xCE)
|
||||||
|
{
|
||||||
|
mnemonic = $"SET 1, (IY{sign}{d})";
|
||||||
|
}
|
||||||
|
else if (cbOpcode == 0x8E)
|
||||||
|
{
|
||||||
|
mnemonic = $"RES 1, (IY{sign}{d})";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mnemonic = $"FD CB {d:X2} {cbOpcode:X2}"; // Fallback
|
||||||
|
}
|
||||||
|
instructionLength = 4;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mnemonic = $"FD PREFIX UNKNOWN (0x{fdOpcode:X2})";
|
mnemonic = $"FD PREFIX UNKNOWN (0x{fdOpcode:X2})";
|
||||||
|
|||||||
Reference in New Issue
Block a user