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:
@@ -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"},
|
||||||
|
|||||||
@@ -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:
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user