diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-05 21:24:16 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-05 21:24:16 +1000 |
| commit | 16f3cb74564cf7c19da6e13666c98aca36094716 (patch) | |
| tree | 7346a7c12a82bc372ed82dad8e9a5d9ad6b098b7 /Chip/Q1CpuInstructions.cs | |
| parent | 72f297a479b6749674ec80e91be53b8c482123d2 (diff) | |
updates
Diffstat (limited to 'Chip/Q1CpuInstructions.cs')
| -rw-r--r-- | Chip/Q1CpuInstructions.cs | 133 |
1 files changed, 87 insertions, 46 deletions
diff --git a/Chip/Q1CpuInstructions.cs b/Chip/Q1CpuInstructions.cs index 8b79a1d..b31a102 100644 --- a/Chip/Q1CpuInstructions.cs +++ b/Chip/Q1CpuInstructions.cs @@ -5,56 +5,79 @@ using System.Collections.Generic; public partial class Q1Cpu { + public static Dictionary<u8, string[]> InstructionLookupStrings = new() + { + { 0x00, ["NOP", "JMP", "HALT", "MOV"] }, + { 0x01, ["RET", "CALL", "SUS", "MOVB"] }, + { 0x02, ["BZ", "BZ", "BR", "NOP"] }, + + { 0x10, ["INV", "INV", "NOP", "AND"] }, + { 0x11, ["SHL", "SHL", "NOP", "OR"] }, + { 0x12, ["SHR", "SHR", "NOP", "XOR"] }, + + { 0x20, ["NOT", "NOT", "NOP", "CMP"] }, + { 0x21, ["NOP", "NOP", "NOP", "LT"] }, + { 0x22, ["NOP", "NOP", "NOP", "GT"] }, + + { 0x30, ["INC_AX", "INC", "NOP", "ADD"] }, + { 0x31, ["DEC_AX", "DEC", "NOP", "SUB"] }, + { 0x32, ["NOP", "NOP", "NOP", "DIV"] }, + { 0x33, ["NOP", "NOP", "NOP", "MUL"] }, + { 0x34, ["NOP", "NOP", "NOP", "MOD"] }, + }; + public Dictionary<u8, (Action, Action<u8>, Action, Action<u8, u8>)> InstructionLookup; private void LoadInstructionLookup() { this.InstructionLookup = new Dictionary<u8, (Action, Action<u8>, Action, Action<u8, u8>)> { { 0x00, (this.Instruction_NOP, this.Instruction_JMP, this.Instruction_HALT, this.Instruction_MOV) }, - { 0x01, (this.Instruction_RET, this.Instruction_CALL, this.Instruction_SUS, this.Instruction_CMP) }, - { 0x02, (this.Instruction_BR, this.Instruction_BZ, this.Instruction_BZ_LX, this.Instruction_LT) }, - { 0x03, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_GT) }, + { 0x01, (this.Instruction_RET, this.Instruction_CALL, this.Instruction_SUS, this.Instruction_MOVB) }, + { 0x02, (this.Instruction_BZ_LX, this.Instruction_BZ, this.Instruction_BR, this.Instruction_NOP) }, - { 0x04, (this.Instruction_NOT_LX, this.Instruction_NOT, this.Instruction_NOP, this.Instruction_AND) }, - { 0x05, (this.Instruction_INV_DX, this.Instruction_INV, this.Instruction_NOP, this.Instruction_OR) }, - { 0x06, (this.Instruction_SHL_DX, this.Instruction_SHL, this.Instruction_NOP, this.Instruction_XOR) }, - { 0x07, (this.Instruction_SHR_DX, this.Instruction_SHR, this.Instruction_NOP, this.Instruction_NOP) }, + { 0x10, (this.Instruction_INV_DX, this.Instruction_INV, this.Instruction_NOP, this.Instruction_AND) }, + { 0x11, (this.Instruction_SHL_DX, this.Instruction_SHL, this.Instruction_NOP, this.Instruction_OR) }, + { 0x12, (this.Instruction_SHR_DX, this.Instruction_SHR, this.Instruction_NOP, this.Instruction_XOR) }, + + { 0x20, (this.Instruction_NOT_LX, this.Instruction_NOT, this.Instruction_NOP, this.Instruction_CMP) }, + { 0x21, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_LT) }, + { 0x22, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_GT) }, - { 0x08, (this.Instruction_INC_AX, this.Instruction_INC, this.Instruction_NOP, this.Instruction_ADD) }, - { 0x09, (this.Instruction_DEC_AX, this.Instruction_DEC, this.Instruction_NOP, this.Instruction_SUB) }, - { 0x0A, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_DIV) }, - { 0x0B, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_MUL) }, - { 0x0C, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_MOD) }, + { 0x30, (this.Instruction_INC_AX, this.Instruction_INC, this.Instruction_NOP, this.Instruction_ADD) }, + { 0x31, (this.Instruction_DEC_AX, this.Instruction_DEC, this.Instruction_NOP, this.Instruction_SUB) }, + { 0x32, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_DIV) }, + { 0x33, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_MUL) }, + { 0x34, (this.Instruction_NOP, this.Instruction_NOP, this.Instruction_NOP, this.Instruction_MOD) }, }; } private void Instruction_ADD(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16) (v1 + v2); this.AX = result; } private void Instruction_SUB(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16)(v1 - v2); this.AX = result; } private void Instruction_MUL(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16) (v1 * v2); this.AX = result; } private void Instruction_DIV(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); if (v2 == 0) throw new DivideByZeroException("Cannot perform division by zero."); @@ -63,8 +86,8 @@ public partial class Q1Cpu } private void Instruction_MOD(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); if (v2 == 0) throw new DivideByZeroException("Cannot perform modulo operation with divisor zero."); @@ -73,11 +96,15 @@ public partial class Q1Cpu } private void Instruction_INC(u8 obj) { - this.TransformData(obj, value => (u16)(value + 1)); + var address = this.Address(obj); + u16 value = address.read(); + address.write((u16)(value + 1)); } private void Instruction_DEC(u8 obj) { - this.TransformData(obj, value => (u16)(value - 1)); + var address = this.Address(obj); + u16 value = address.read(); + address.write((u16)(value - 1)); } private void Instruction_INC_AX() { @@ -89,11 +116,17 @@ public partial class Q1Cpu } private void Instruction_SHL(u8 obj) { - this.TransformData(obj, value => (u16)(value << 1)); + var address = this.Address(obj); + u16 value = address.read(); + u16 result = (u16)(value << 1); + address.write(result); } private void Instruction_SHR(u8 obj) { - this.TransformData(obj, value => (u16)(value >> 1)); + var address = this.Address(obj); + u16 value = address.read(); + u16 result = (u16)(value >> 1); + address.write(result); } private void Instruction_SHL_DX() { @@ -105,25 +138,26 @@ public partial class Q1Cpu } private void Instruction_XOR(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16)(v1 ^ v2); this.DX = result; } private void Instruction_OR(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16)(v1 | v2); this.DX = result; } private void Instruction_INV(u8 obj) { - u16 value = this.FetchData(obj); + var address = this.Address(obj); + u16 value = address.read(); u16 result = (u16)~value; - this.DX = result; + address.write(result); } private void Instruction_INV_DX() { @@ -131,15 +165,15 @@ public partial class Q1Cpu } private void Instruction_AND(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); u16 result = (u16)(v1 & v2); this.DX = result; } private void Instruction_NOT(u8 obj) { - u16 value = this.FetchData(obj); + u16 value = this.Address(obj).read(); u16 result = value == 0 ? (u16)1 : (u16)0; this.LX = result; } @@ -149,15 +183,15 @@ public partial class Q1Cpu } private void Instruction_GT(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); this.LX = (u16)(v1 > v2 ? 1 : 0); } private void Instruction_LT(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); this.LX = (u16)(v1 < v2 ? 1 : 0); } @@ -174,22 +208,29 @@ public partial class Q1Cpu } private void Instruction_BZ(u8 obj) { - u16 value = this.FetchData(obj); + u16 value = this.Address(obj).read(); if (value == 0) this.Instruction_BR(); } private void Instruction_CMP(u8 m1, u8 m2) { - u16 v1 = this.FetchData(m1); - u16 v2 = this.FetchData(m2); + u16 v1 = this.Address(m1).read(); + u16 v2 = this.Address(m2).read(); // Set LX based on comparison this.LX = (u16)(v1 == v2 ? 1 : 0); } private void Instruction_MOV(u8 m1, u8 m2) { - u16 value = this.FetchData(m1); - this.StoreData(m2, value); + u16 value = this.Address(m1).read(); + this.Address(m2).write(value); + } + + private void Instruction_MOVB(u8 m1, u8 m2) + { + u16 value = this.Address(m1).read(); + u8 low = Make.ref8(value)[1]; + this.Address(m2).writeByte(low); } public void Instruction_NOP() { } @@ -198,7 +239,7 @@ public partial class Q1Cpu public void Instruction_JMP(u8 m1) { - this.PC = this.FetchData(m1); + this.PC = this.Address(m1).read(); } public void Instruction_RET() @@ -208,7 +249,7 @@ public partial class Q1Cpu public void Instruction_CALL(u8 m1) { - u16 address = this.FetchData(m1); + u16 address = this.Address(m1).read(); this.PushStack(this.PC); this.PC = address; } |
