summaryrefslogtreecommitdiff
path: root/Q1.core
diff options
context:
space:
mode:
Diffstat (limited to 'Q1.core')
-rw-r--r--Q1.core/Arch/ChipLayout.cs7
-rw-r--r--Q1.core/Arch/InstructionSet.cs77
2 files changed, 82 insertions, 2 deletions
diff --git a/Q1.core/Arch/ChipLayout.cs b/Q1.core/Arch/ChipLayout.cs
index 8c916f6..2948f9a 100644
--- a/Q1.core/Arch/ChipLayout.cs
+++ b/Q1.core/Arch/ChipLayout.cs
@@ -3,9 +3,12 @@ namespace Q1.core.Arch;
public static class ChipLayout
{
public const u16 MEMORY_START = 0x0000;
- public const u16 MEMORY_SIZE = 0xFF00; // 64KB - 256 bytes reserved for stack
+ public const u16 MEMORY_SIZE = 0x4000; // 16KB of memory (0x0000 to 0x3FFF)
- public const u16 STACK_START = ChipLayout.MEMORY_START;
+ public const u16 IVT_START = ChipLayout.MEMORY_START;
+ public const u16 IVT_SIZE = 256; // 256 bytes for 128 interrupt vectors (2 bytes each)
+
+ public const u16 STACK_START = ChipLayout.IVT_START + ChipLayout.IVT_SIZE;
public const u16 STACK_SIZE = 256 * 2; // 256 words (512 bytes)
public const u16 PROGRAM_START = ChipLayout.MEMORY_START + ChipLayout.STACK_SIZE;
diff --git a/Q1.core/Arch/InstructionSet.cs b/Q1.core/Arch/InstructionSet.cs
index 68a9b55..f9c20f8 100644
--- a/Q1.core/Arch/InstructionSet.cs
+++ b/Q1.core/Arch/InstructionSet.cs
@@ -186,6 +186,83 @@ public static class InstructionSet
{
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