A propos#
Le SPU (Simple Processing Uint) est un petit processeur 16-bit que j’ai fait très inspiré par le processeur 6502.
L’objectif principal de ce processeur est d’être un processeur facile à utiliser. Ce processeur a que 16 instructions.
Set d’instructions du SPU#
| Instruction | Argument | Ce qu’il fait |
|---|---|---|
| ADD | Rien | Fait X + Y et retourne le resultat à X. |
| SUB | Rien | Fait X - Y et retourne le resultat à X. |
| AND | Rien | Fait X & Y et retourne le resultat à X. |
| OR | Rien | Fait X | Y et retourne le resultat à X. |
| XOR | Rien | Fait X ^ Y et retourne le resultat à X. |
| NOT | Rine | Inverse le registeur X. |
| LDX | im12/adr12 | Change la valeur de X. |
| LDY | im12/adr12 | Change la valeur de Y. |
| STX | adr12 | Met la valeur du registeur X dans l’adresse ram. |
| STY | adr12 | Met la valeur du registeur X dans l’adresse ram. |
| JMP | adr12 | Sauter au label/adresse. |
| JIC | adr12 | Sauter au label/adresse si le carry flag est active. |
| JIZ | adr12 | Sauter au label/adresse si le zero flag est active. |
| HLT | Rien | Arrète le proccesseur. |
J’ai fait un assembleur en rust, et fait le processeur entier sur Logisim Evolution. Et j’ai pas d’emulateur car j’avais la flemme… Mais c’était un projet très cool à faire.
Ici un programme d’exemple qui fait la séquance de fibonacci:
/*
Do the fibonacci sequence.
The end result goes into the ram address $0001.
*/
;Init variables
ldx 0
stx $0001 ; prev1 = 0
ldx 1
stx $0002 ; prev2 = 1
ldx 9
stx $0000 ; n = 9
loop:
ldy 3
sub
ldy 128
add
jic stop ; if n < 3 { stop(); }
ldx $0002
ldy $0001
add
sty $0002 ; prev2 = prev1
stx $0001 ; prev1 = prev2 + prev1
ldx $0000
ldy 1
sub
stx $0000 ; n -= 1
jmp loop
stop:
hlt
J’ai fait une vidéo sur YouTube de comment j’ai l’assembleur: