Implemented more OpCodes

This commit is contained in:
2026-04-15 11:20:13 +01:00
parent f52180aeb3
commit deeb7e3c61
2 changed files with 275 additions and 14 deletions

View File

@@ -81,6 +81,8 @@ namespace Desktop
_isRunning = true;
btnRun.Text = "Stop";
// Fire up a background thread
await Task.Run(() =>
{
@@ -256,8 +258,13 @@ namespace Desktop
mnemonic = $"LD BC, 0x{bcVal:X4}";
instructionLength = 3;
break;
case 0x02: mnemonic = "LD (BC), A"; break;
// --- 16-Bit Increments ---
case 0x03: mnemonic = "INC BC"; break;
case 0x08:
mnemonic = "EX AF, AF'";
break;
case 0x12: mnemonic = "LD (DE), A"; break;
case 0x13: mnemonic = "INC DE"; break;
case 0x33: mnemonic = "INC SP"; break;
@@ -514,6 +521,16 @@ namespace Desktop
case 0x96: mnemonic = "SUB (HL)"; break;
case 0x97: mnemonic = "SUB A"; break;
// --- SBC A, r ---
case 0x98: mnemonic = "SBC A, B"; break;
case 0x99: mnemonic = "SBC A, C"; break;
case 0x9A: mnemonic = "SBC A, D"; break;
case 0x9B: mnemonic = "SBC A, E"; break;
case 0x9C: mnemonic = "SBC A, H"; break;
case 0x9D: mnemonic = "SBC A, L"; break;
case 0x9E: mnemonic = "SBC A, (HL)"; break;
case 0x9F: mnemonic = "SBC A, A"; break;
// --- AND r ---
case 0xA0: mnemonic = "AND B"; break;
case 0xA1: mnemonic = "AND C"; break;
@@ -553,7 +570,42 @@ namespace Desktop
case 0xBD: mnemonic = "CP L"; break;
case 0xBE: mnemonic = "CP (HL)"; break;
case 0xBF: mnemonic = "CP A"; break;
case 0xC1: mnemonic = "POP BC"; break;
case 0xC1: mnemonic = "POP BC"; break;
case 0xC2:
case 0xCA:
case 0xD2:
case 0xDA:
case 0xE2:
case 0xEA:
case 0xF2:
case 0xFA:
{
// Read the 16-bit target address
ushort jumpAddr = (ushort)(_memoryBus.Read((ushort)(currentPc + 1)) | (_memoryBus.Read((ushort)(currentPc + 2)) << 8));
string condition = "";
switch (opcode)
{
case 0xC2: condition = "NZ"; break;
case 0xCA: condition = "Z"; break;
case 0xD2: condition = "NC"; break;
case 0xDA: condition = "C"; break;
case 0xE2: condition = "PO"; break;
case 0xEA: condition = "PE"; break;
case 0xF2: condition = "P"; break;
case 0xFA: condition = "M"; break;
}
mnemonic = $"JP {condition}, 0x{jumpAddr:X4}";
instructionLength = 3;
break;
}
// --- Conditional Returns ---
case 0xC0: mnemonic = "RET NZ"; break;
case 0xE0: mnemonic = "RET PO"; break;
case 0xE8: mnemonic = "RET PE"; break;
case 0xF0: mnemonic = "RET P"; break;
case 0xF8: mnemonic = "RET M"; break;
case 0xC3:
// JP nn
byte jpLow = _memoryBus.Read((ushort)(currentPc + 1));
@@ -561,6 +613,35 @@ namespace Desktop
mnemonic = $"JP 0x{jpHigh:X2}{jpLow:X2}";
instructionLength = 3;
break;
case 0xC4:
case 0xCC:
case 0xD4:
case 0xDC:
case 0xE4:
case 0xEC:
case 0xF4:
case 0xFC:
{
// Read the 16-bit target address
ushort callAddr = (ushort)(_memoryBus.Read((ushort)(currentPc + 1)) | (_memoryBus.Read((ushort)(currentPc + 2)) << 8));
string condition = "";
switch (opcode)
{
case 0xC4: condition = "NZ"; break;
case 0xCC: condition = "Z"; break;
case 0xD4: condition = "NC"; break;
case 0xDC: condition = "C"; break;
case 0xE4: condition = "PO"; break;
case 0xEC: condition = "PE"; break;
case 0xF4: condition = "P"; break;
case 0xFC: condition = "M"; break;
}
mnemonic = $"CALL {condition}, 0x{callAddr:X4}";
instructionLength = 3;
break;
}
case 0xc5:
mnemonic = "PUSH BC";
break;
@@ -592,6 +673,10 @@ namespace Desktop
{
mnemonic = "BIT 7, (HL)";
}
else if (cbOp == 0x86)
{
mnemonic = "RES 0, (HL)";
}
else if (cbOp == 0xAE)
{
mnemonic = "RES 5, (HL)";
@@ -691,6 +776,11 @@ namespace Desktop
mnemonic = "IM 1";
instructionLength = 2;
break;
case 0x5B:
ushort addr5B = (ushort)(_memoryBus.Read((ushort)(currentPc + 2)) | (_memoryBus.Read((ushort)(currentPc + 3)) << 8));
mnemonic = $"LD DE, (0x{addr5B:X4})";
instructionLength = 4;
break;
case 0xB0:
mnemonic = "LDIR";
instructionLength = 2;