summaryrefslogtreecommitdiff
path: root/Q1.core/Arch/InstructionSet.cs
diff options
context:
space:
mode:
authorMelodi <62381002+Melodi17@users.noreply.github.com>2026-03-18 23:08:58 +1000
committerMelodi <62381002+Melodi17@users.noreply.github.com>2026-03-18 23:08:58 +1000
commit7d20ff2a8e89e646fa79be69c8d07a512081daba (patch)
tree67433c74d55f778065363010a593c44a0f65296b /Q1.core/Arch/InstructionSet.cs
parent0bb62fc65526a0981cd328dea1b09aba8ce0a576 (diff)
test: Add tests for all control instructions and base CPU implementation
Diffstat (limited to 'Q1.core/Arch/InstructionSet.cs')
-rw-r--r--Q1.core/Arch/InstructionSet.cs468
1 files changed, 0 insertions, 468 deletions
diff --git a/Q1.core/Arch/InstructionSet.cs b/Q1.core/Arch/InstructionSet.cs
deleted file mode 100644
index 212e77e..0000000
--- a/Q1.core/Arch/InstructionSet.cs
+++ /dev/null
@@ -1,468 +0,0 @@
-namespace Q1.core.Arch;
-
-public static class InstructionSet
-{
- public static readonly InstructionGroup[] Lookup = new InstructionGroup[128];
-
- static InstructionSet()
- {
- var nop = new ImplicitInstruction { Name = "NOP", Execute = InstructionSet.Nop };
- var nopSimple = new SimpleInstruction { Name = "NOP", Execute = InstructionSet.Nop };
- var nopExtended = new ExtendedInstruction { Name = "NOP", Execute = InstructionSet.Nop };
-
- #region Control Group
-
- InstructionSet.Lookup[0x00] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = new SimpleInstruction { Name = "JMP", Execute = InstructionSet.Jump },
- ExtendedImplicit = new ImplicitInstruction { Name = "HALT", Execute = InstructionSet.Halt },
- ExtendedAddressing = new ExtendedInstruction { Name = "MOV", Execute = InstructionSet.Move }
- };
-
- InstructionSet.Lookup[0x01] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "RET", Execute = InstructionSet.Return },
- SimpleAddressing = new SimpleInstruction { Name = "CALL", Execute = InstructionSet.Call },
- ExtendedImplicit = new ImplicitInstruction { Name = "SUS", Execute = InstructionSet.Suspend },
- ExtendedAddressing = nopExtended
- };
-
- InstructionSet.Lookup[0x02] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "BZ(LX)", Execute = InstructionSet.BranchIfZeroLx },
- SimpleAddressing = new SimpleInstruction { Name = "BZ", Execute = InstructionSet.BranchIfZero },
- ExtendedImplicit = new ImplicitInstruction { Name = "BR", Execute = InstructionSet.Branch },
- ExtendedAddressing = nopExtended
- };
-
- InstructionSet.Lookup[0x03] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = new SimpleInstruction { Name = "PUSH", Execute = InstructionSet.Push },
- ExtendedImplicit = nop,
- ExtendedAddressing = nopExtended
- };
-
- InstructionSet.Lookup[0x04] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = new SimpleInstruction { Name = "POP", Execute = InstructionSet.Pop },
- ExtendedImplicit = nop,
- ExtendedAddressing = nopExtended
- };
-
- InstructionSet.Lookup[0x05] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = new SimpleInstruction { Name = "INT", Execute = InstructionSet.Interrupt },
- ExtendedImplicit = nop,
- ExtendedAddressing = nopExtended
- };
-
- #endregion
-
- #region Data Group
-
- InstructionSet.Lookup[0x10] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "INV(DX)", Execute = InstructionSet.InverseDx },
- SimpleAddressing = new SimpleInstruction { Name = "INV", Execute = InstructionSet.Inverse },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "AND", Execute = InstructionSet.And }
- };
-
- InstructionSet.Lookup[0x11] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "OR", Execute = InstructionSet.Or }
- };
-
- InstructionSet.Lookup[0x12] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "XOR", Execute = InstructionSet.Xor }
- };
-
- InstructionSet.Lookup[0x13] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "SHPL(DX)", Execute = InstructionSet.ShiftPlaceLeftDx },
- SimpleAddressing = new SimpleInstruction { Name = "SHPL", Execute = InstructionSet.ShiftPlaceLeft },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "SHL", Execute = InstructionSet.ShiftLeft }
- };
-
- InstructionSet.Lookup[0x14] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "SHPR(DX)", Execute = InstructionSet.ShiftPlaceRightDx },
- SimpleAddressing = new SimpleInstruction { Name = "SHPR", Execute = InstructionSet.ShiftPlaceRight },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "SHR", Execute = InstructionSet.ShiftRight }
- };
-
- #endregion
-
- #region Logic Group
-
- InstructionSet.Lookup[0x20] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "NOT(LX)", Execute = InstructionSet.NotLx },
- SimpleAddressing = new SimpleInstruction { Name = "NOT", Execute = InstructionSet.Not },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "CMP", Execute = InstructionSet.Compare }
- };
-
- InstructionSet.Lookup[0x21] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "LT", Execute = InstructionSet.LessThan }
- };
-
- InstructionSet.Lookup[0x22] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "GT", Execute = InstructionSet.GreaterThan }
- };
-
- #endregion
-
- #region Arithmatic Group
-
- InstructionSet.Lookup[0x30] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "INC(AX)", Execute = InstructionSet.IncrementAx },
- SimpleAddressing = new SimpleInstruction { Name = "INC", Execute = InstructionSet.Increment },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "ADD", Execute = InstructionSet.Add }
- };
-
- InstructionSet.Lookup[0x31] = new InstructionGroup
- {
- Implicit = new ImplicitInstruction { Name = "DEC(AX)", Execute = InstructionSet.DecrementAx },
- SimpleAddressing = new SimpleInstruction { Name = "DEC", Execute = InstructionSet.Decrement },
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "SUB", Execute = InstructionSet.Subtract }
- };
-
- InstructionSet.Lookup[0x32] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "DIV", Execute = InstructionSet.Divide }
- };
-
- InstructionSet.Lookup[0x33] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "MUL", Execute = InstructionSet.Multiply }
- };
-
- InstructionSet.Lookup[0x34] = new InstructionGroup
- {
- Implicit = nop,
- SimpleAddressing = nopSimple,
- ExtendedImplicit = nop,
- ExtendedAddressing = new ExtendedInstruction { Name = "DIV", Execute = InstructionSet.Modulo }
- };
-
- #endregion
- }
-
- private static void Nop(Chip chip, bool word) { /* No operation */ }
- private static void Nop(Chip chip, u8 m1, bool word) { /* No operation */ }
- private static void Nop(Chip chip, u8 m1, u8 m2, bool word) { /* No operation */ }
-
- #region Control Instructions
-
- private static void Halt(Chip chip, bool word)
- {
- throw new NotImplementedException("HALT instruction is not implemented yet.");
- }
-
- private static void Suspend(Chip chip, bool word)
- {
- throw new NotImplementedException("SUS instruction is not implemented yet.");
- }
-
- private static void Interrupt(Chip chip, u8 m1, bool word)
- {
- u16 interruptNumber = chip.Load(m1, word);
-
- chip.Interrupt(interruptNumber);
- }
-
- private static void Move(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value = chip.Load(m1, word);
- chip.Store(m2, value, word);
- }
-
- private static void Jump(Chip chip, u8 m1, bool word)
- {
- u16 address = chip.Load(m1, word);
- chip.Pc = address;
- }
-
- private static void Call(Chip chip, u8 m1, bool word)
- {
- u16 targetAddress = chip.Load(m1, word);
- chip.Push(chip.Pc);
- chip.Pc = targetAddress;
- }
-
- private static void Return(Chip chip, bool word)
- {
- u16 returnAddress = chip.Pop();
- chip.Pc = returnAddress;
- }
-
- private static void BranchIfZero(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- if (value == 0)
- chip.SkipInstruction();
- }
-
- private static void BranchIfZeroLx(Chip chip, bool word)
- {
- if (chip.Lx == 0)
- chip.SkipInstruction();
- }
-
- private static void Branch(Chip chip, bool word)
- {
- chip.SkipInstruction();
- }
-
- private static void Push(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- chip.Push(value);
- }
-
- private static void Pop(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Pop();
- chip.Store(m1, value, word);
- }
-
- #endregion
-
- #region Data Instructions
-
- private static void Inverse(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- value = (u16)~value;
-
- chip.Dx = value;
- }
-
- private static void InverseDx(Chip chip, bool word)
- {
- chip.Dx = (u16)~chip.Dx;
- }
-
- private static void And(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 & value2);
-
- chip.Dx = result;
- }
-
- private static void Or(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 | value2);
-
- chip.Dx = result;
- }
-
- private static void Xor(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 ^ value2);
-
- chip.Dx = result;
- }
-
- private static void ShiftLeft(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value = chip.Load(m1, word);
- u16 shiftAmount = (u16) (chip.Load(m2, word) & 0xF); // Limit shift to 0-15
- u16 result = (u16) (value << shiftAmount);
-
- chip.Dx = result;
- }
-
- private static void ShiftRight(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value = chip.Load(m1, word);
- u16 shiftAmount = (u16) (chip.Load(m2, word) & 0xF); // Limit shift to 0-15
- u16 result = (u16) (value >> shiftAmount);
-
- chip.Dx = result;
- }
-
- private static void ShiftPlaceLeft(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- u16 result = (u16) ((value << 1) | (value >> 15)); // Rotate left
-
- chip.Dx = result;
- }
-
- private static void ShiftPlaceRight(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- u16 result = (u16) ((value >> 1) | (value << 15)); // Rotate right
-
- chip.Dx = result;
- }
-
- private static void ShiftPlaceLeftDx(Chip chip, bool word)
- {
- u16 value = chip.Dx;
- u16 result = (u16) ((value << 1) | (value >> 15)); // Rotate left
-
- chip.Dx = result;
- }
-
- private static void ShiftPlaceRightDx(Chip chip, bool word)
- {
- u16 value = chip.Dx;
- u16 result = (u16) ((value >> 1) | (value << 15)); // Rotate right
-
- chip.Dx = result;
- }
-
- #endregion
-
- #region Logic Instructions
-
- private static void Not(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- chip.Lx = value == 0 ? (u16)1 : (u16)0;
- }
-
- private static void NotLx(Chip chip, bool word)
- {
- chip.Lx = chip.Lx == 0 ? (u16)1 : (u16)0;
- }
-
- private static void Compare(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- chip.Lx = value1 == value2 ? (u16)1 : (u16)0;
- }
-
- private static void LessThan(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- chip.Lx = value1 < value2 ? (u16)1 : (u16)0;
- }
-
- private static void GreaterThan(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- chip.Lx = value1 > value2 ? (u16)1 : (u16)0;
- }
-
- #endregion
-
- #region Arithmetic Instructions
-
- private static void Increment(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- value++;
- chip.Store(m1, value, word);
- }
-
- private static void IncrementAx(Chip chip, bool word)
- {
- chip.Ax++;
- }
-
- private static void Decrement(Chip chip, u8 m1, bool word)
- {
- u16 value = chip.Load(m1, word);
- value--;
- chip.Store(m1, value, word);
- }
-
- private static void DecrementAx(Chip chip, bool word)
- {
- chip.Ax--;
- }
-
- private static void Add(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 + value2);
-
- chip.Ax = result;
- }
-
- private static void Subtract(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 - value2);
-
- chip.Ax = result;
- }
-
- private static void Multiply(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- u16 result = (u16)(value1 * value2);
-
- chip.Ax = result;
- }
-
- private static void Divide(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- if (value2 == 0)
- throw new DivideByZeroException("Attempted to divide by zero.");
-
- u16 result = (u16)(value1 / value2);
- chip.Ax = result;
- }
-
- private static void Modulo(Chip chip, u8 m1, u8 m2, bool word)
- {
- u16 value1 = chip.Load(m1, word);
- u16 value2 = chip.Load(m2, word);
- if (value2 == 0)
- throw new DivideByZeroException("Attempted to modulo by zero.");
-
- u16 result = (u16)(value1 % value2);
- chip.Ax = result;
- }
-
- #endregion
-} \ No newline at end of file