Each SimpleCPU instruction word has a fixed length of 32-bit.
| Instruction Word | [31:29] | [28] | [27:14] | [13:0] |
|---|---|---|---|---|
| field name | opcode | i | A | B |
| bit width | 3b | 1b | 14b | 14b |
i = 1 implies B is Immediate (meaning a number) as opposed to a Pointer (meaning address).
==================================================================
==================================================================
{opcode, i} = {0, 0}
*A <- (*A) + (*B) write ( readFromAddress(A) + readFromAddress(B) ) to address ( A ) *A = value (content of) address A = mem[A] *B = value (content of) address B = mem[B] <- means write (assign) mem[A] = mem[A] + mem[B] mem[IW[27:14]] = mem[IW[27:14]] + mem[IW[13:0]]
{opcode, i} = {0, 1}
*A <- (*A) + B B = read section B of the instruction mem[A] = mem[A] + B mem[IW[27:14]] = mem[IW[27:14]] + IW[13:0]
{opcode, i} = {1, 0}
*A <- ~((*A) & (*B))
{opcode, i} = {1, 1}
*A <- ~((*A) & B)
{opcode, i} = {2, 0}
*A <- ((*B) < 32) ? ((*A) >> (*B)) : ((*A) << ((*B) - 32))
{opcode, i} = {2, 1}
*A <- (B < 32) ? ((*A) >> B) : ((*A) << (B - 32))
{opcode, i} = {3, 0}
*A <- ((*A) < (*B))
{opcode, i} = {3, 1}
*A <- ((*A) < B)
{opcode, i} = {7, 0}
*A <- (*A) * (*B)
{opcode, i} = {7, 1}
*A <- (*A) * B
{opcode, i} = {4, 0}
*A <- *B
{opcode, i} = {4, 1}
*A <- B
{opcode, i} = {5, 0}
*A <- *(*B) write ( readFromAddress(readFromAddress(B)) ) to address ( A )
{opcode, i} = {5, 1}
*(*A) <- *B write ( readFromAddress(B) ) to address ( readFromAddress(A) )
{opcode, i} = {6, 0}
PC <- (*B == 0) ? (*A) : (PC + 1) if (*B == 0) goTo(*A), else goTo(nextInstruction)
{opcode, i} = {6, 1}
PC <- (*A) + B