Dans le cadre d'un projet de site WEB, j'ai eut besoin d'avoir un “interpréteur” de commande. Pour expérimenter un peu (et aussi pour le plaisir), j'ai eu envie de créer mon “propre CPU”. Celui-ci doit être simple, disposer d'un assembleur et être paramétrable.
Je me suis inspiré du Motorola 680×0 pour mon “CPU”.
Longueur d'instruction | 16 bits |
instruction arithmétique | 8, 16 ou 32 bits |
registres d'adresse | 4 registres Ax |
registres de données | 4 registres Dx |
les deux premiers octets (16 bits) sont obligatoirement une instruction. l'instruction se décode en 4x 4 bits.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | paramètre 1 | paramètre 2 | taille |
bits | descr. |
---|---|
15-12 | 4 bits d'instruction ID Voir ci-dessous |
11-8 | 4 bits pour le 1er paramètre (si nécessaire) c'est souvent la destination |
7-4 | 4 bits pour le 2ème paramètre (si nécessaire) c'est souvent la source |
3-0 | 4 bits pour la longueur (si nécessaire) de l'instruction |
La longueur (bits 3-0)
nombre de byte(s) a lire en plus de l'instruction
0x00 | aucun, l'instruction est complète |
0x01 | 1 byte (BYTE) |
0x02 | 2 bytes (WORD) |
0x03 | 4 bytes (LONG) |
params #2
souvent la source ou la définition du paramètre #2
0x00..0x0B | voir le mode de d'adressage du registre |
0x0C..0x0E | spécifique à l'instruction |
0x0F | accès directe (les bytes suivant sont la valeur) |
params #1
souvent la destination
0x00..0x0B | voir le mode de d'adressage du registre |
0x0C..0x0F | spécifique à l'instruction |
3 | 2 | 1 | 0 |
---|---|---|---|
taille | RegID |
RegID | identifiant du Registre (0..3) |
b00 | spécifie un Registre de type Données (DATA) Dx |
b01 | spécifie un Registre de type adresse (ADDR) Ax |
b10 | spécifie une donnée pointée par le registre d'adresse Ax |
b11 | parametres |
ce qui veut dire que l'on peut avoir :
Valeur | lue dans | Valeur | pointée par |
---|---|---|---|
0 | D0 | 8 | [A0] |
1 | D1 | 9 | [A1] |
2 | D2 | A | [A2] |
3 | D3 | B | [A3] |
4 | A0 | ||
5 | A1 | ||
6 | A2 | ||
7 | A3 |
“most significant bits”, càd les 4bits de gauche
0x0 | NOP or specific machine operands |
0x1 | MOVE |
0x2 | ADD / INC |
0x3 | SUB / DEC |
0x4 | MUL |
0x5 | DIV |
0x6 | ROR |
0x7 | ROL |
0x8..0xB | unused |
0xC | PUSH / POP / CALL / RET |
0xE | CMP |
0xF | JMP (extended) |
0x0000 | NOP |
0x0FFF | HALT |
0x0001 | ORG (set PC) |
0x0002 | STACK (Set SP) |
0x0003 | CLEAR (Clear flag register) |