diff options
Diffstat (limited to 'Q1.core/Arch')
| -rw-r--r-- | Q1.core/Arch/ChipLayout.cs | 7 | ||||
| -rw-r--r-- | Q1.core/Arch/InstructionSet.cs | 77 |
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 |
