Added bit shift instructions.

SHL and SHR treat A and B as a 16 bit circular shift register and rotates them either left or right.
This commit is contained in:
Anachronaut
2024-10-30 16:06:33 -04:00
committed by GitHub
parent a58fb3d694
commit c64f097810
3 changed files with 21 additions and 1 deletions
+2
View File
@@ -22,6 +22,8 @@ Instruction instruction_set[] = {
{0x06, "XOR"}, {0x06, "XOR"},
{0x07, "NOTA"}, {0x07, "NOTA"},
{0x08, "NOTB"}, {0x08, "NOTB"},
{0x09, "SHL"},
{0x0A, "SHR"},
// Branch Operations: // Branch Operations:
{0x10, "BRI"}, {0x10, "BRI"},
{0x11, "BRQ"}, {0x11, "BRQ"},
+16
View File
@@ -6,6 +6,8 @@
#include "cpu.h" #include "cpu.h"
#include "io.h" #include "io.h"
uint16_t shiftRegister;
void initializeCPU(CPURegisters *cpu, uint8_t *programMemory, uint8_t *dataMemory) { void initializeCPU(CPURegisters *cpu, uint8_t *programMemory, uint8_t *dataMemory) {
cpu->A = 0; cpu->A = 0;
cpu->B = 0; cpu->B = 0;
@@ -80,6 +82,20 @@ uint8_t executeOperation(uint8_t Instruction, CPURegisters *cpu) {
// NOTB - not B -> Q // NOTB - not B -> Q
cpu->Q = ~cpu->B; cpu->Q = ~cpu->B;
break; break;
case 0x09:
// SHL - Shift AB left.
shiftRegister = ((uint16_t)cpu->A << 8) | cpu->B;
shiftRegister = (shiftRegister << 1) | (shiftRegister >> 15);
cpu->A = shiftRegister >> 8;
cpu->B = shiftRegister & 0xFF;
break;
case 0x0A:
// SHR - Shift AB right.
shiftRegister = ((uint16_t)cpu->A << 8) | cpu->B;
shiftRegister = (shiftRegister >> 1) | (shiftRegister << 15);
cpu->A = shiftRegister >> 8;
cpu->B = shiftRegister & 0xFF;
break;
// //
// 1x - Branch Operations: // 1x - Branch Operations:
// //
+3 -1
View File
@@ -16,7 +16,7 @@ It has six registers:
## List of Instructions: ## List of Instructions:
### Arithmetic and Logic Operations: 9 Instructions ### Arithmetic and Logic Operations: 11 Instructions
Hex Code | Mnemonic | Description Hex Code | Mnemonic | Description
-- | -- | -- -- | -- | --
00 | ADD | Adds A, B, and the Carry Flag, the result is stored in Q. 00 | ADD | Adds A, B, and the Carry Flag, the result is stored in Q.
@@ -28,6 +28,8 @@ Hex Code | Mnemonic | Description
06 | XOR | Bitwise xor of A and B, the result is stored in Q. 06 | XOR | Bitwise xor of A and B, the result is stored in Q.
07 | NOTA | Bitwise inversion of A, the result is stored in Q. 07 | NOTA | Bitwise inversion of A, the result is stored in Q.
08 | NOTB | Bitwise inversion of B, the result is stored in Q. 08 | NOTB | Bitwise inversion of B, the result is stored in Q.
09 | SHL | A and B form a circular shift register. Rotate this register left.
0A | SHR | A and B form a circular shift register. Rotate this register right.
### Branch Operations: 7 Instructions ### Branch Operations: 7 Instructions
Hex Code | Mnemonic | Description Hex Code | Mnemonic | Description