This project contains:
- a 8-bit CPU with a basic instruction set
- 256 bytes of RAM
Build an exemple:
./asm/asm.py tests/multiplication_test.asm > memory.list
Run the computer:
make clean && make run
Instruction | Description |
---|---|
lda |
Alias for mov A M D |
sta |
Alias for mov M A D |
ldi r D |
Load D into r register |
mov r M D |
Copy the data at memory address D into register r |
mov r2 r1 |
Copy register r1 into r2 |
mov M r D |
Copy the data from register r into memory in address D |
Legend:
- D is a byte of data. It can be a memory address or directly the data depending on the instruction.
- r is a register.
- M means "memory", it's used to tell to the
mov
instruction the source/destination of the copy.
Instruction | Description |
---|---|
add |
Perform A = A + B (A, B are registers) |
adc |
Perform A = A + B + carry (A, B are registers) |
sub |
Perform A = A - B (A, B are registers) |
inc |
Perform A = A + 1 (A is a register) |
dec |
Perform A = A - 1 (A is a register) |
cmp |
Perform A - B without updating A, just update flags |
Instruction | Description |
---|---|
and |
Perform A = A AND B (A, B are registers) |
or |
Perform A = A OR B (A, B are registers) |
xor |
Perform A = A XOR B (A, B are registers) |
Instruction | Description |
---|---|
jmp D |
Jump to D |
jz D |
Jump to D if flag zero is set |
jnz D |
Jump to D if flag zero is not set |
je D |
Jump to D if register A equals register B after cmp (alias jz ) |
jne D |
Jump to D if register A doesn't equal register B after cmp (alias jnz ) |
jc D |
Jump to D if carry flag is set |
jnc D |
Jump to D if carry flag is not set |
call D |
Call sub-routine D |
ret |
Return to the parent routine |
Instruction | Description |
---|---|
nop |
Do nothing |
hlt |
Halt the CPU |
Instruction | Description |
---|---|
in D |
Put the content of the data bus in the A register and set D on address bus |
out D |
Put the content of accumulator on the data bus and set D on address bus |
Instruction | Description |
---|---|
push r |
Push the content of register r on the stack |
pop r |
Pop the content from the stack and put it into register r |
T1 and T2 are always FETCH_PC
and FETCH_INST
.
List of instruction associated with states:
Instruction | T3 | T4 | T5 | T6 | T7 |
---|---|---|---|---|---|
NOP |
|||||
ALU |
ALU_EXEC |
ALU_STORE |
|||
CMP |
ALU_EXEC |
||||
OUT |
FETCH_PC |
SET_ADDR |
OUT |
||
IN |
FETCH_PC |
SET_ADDR |
IN |
||
HLT |
HALT |
||||
JMP |
FETCH_PC |
JUMP |
|||
LDI |
FETCH_PC |
SET_REG |
|||
MOV |
MOV_FETCH |
MOV_LOAD |
MOV_STORE |
||
CALL |
FETCH_PC |
SET_REG |
FETCH_SP |
PC_STORE |
TMP_JUMP |
RET |
INC_SP |
FETCH_SP |
RET |
||
PUSH |
FETCH_SP |
REG_STORE |
|||
POP |
INC_SP |
FETCH_SP |
SET_REG |
States versus signals enabled:
States | II | CI | CO | RFI | RFO | EO | EE | MI | RO | RI | HALT | J | SO | SD | SI | MEM/IO |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ALU_EXEC |
X | |||||||||||||||
ALU_STORE |
X | X | ||||||||||||||
FETCH_INST |
X | X | ||||||||||||||
FETCH_PC |
X | X | X | |||||||||||||
FETCH_SP |
X | X | ||||||||||||||
HALT |
X | |||||||||||||||
INC_SP |
X | |||||||||||||||
IN |
X | X | ||||||||||||||
JUMP |
* | * | * | |||||||||||||
MOV_FETCH |
* | * | * | |||||||||||||
MOV_LOAD |
* | * | * | * | ||||||||||||
MOV_STORE |
* | * | * | * | ||||||||||||
OUT |
X | X | ||||||||||||||
PC_STORE |
X | X | ||||||||||||||
REG_STORE |
X | X | X | X | ||||||||||||
RET |
X | X | X | |||||||||||||
SET_ADDR |
X | X | ||||||||||||||
SET_REG |
X | X | ||||||||||||||
TMP_JUMP |
X | X | X | X | X |
CLK:
+-+ +-+ +-+ +-+ +-+ +-+ +
| | | | | | | | | | | | |
| | | | | | | | | | | | |
+ +-+ +-+ +-+ +-+ +-+ +-+
CYCLE_CLK:
+---+ +---+
| | | |
| | | |
+ +---+---+ +---+---+
MEM_CLK:
+---+ +---+
| | | |
| | | |
+---+ +---+---+ +---+
INTERNAL_CLK:
+---+ +---+
| | | |
| | | |
+---+---+ +---+---+ +