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.
de gauche à droite:
0x0000 |||| |||+---> Longueur (nombre de byte(s) a lire en plus de l'instruction) ||| 0 : aucun, l'instruction est complete ||| 1 : 1 byte ||| 2 : 2 bytes ||| 3 : 4 bytes ||+----> params #2 (souvent la source ou la définition du paramètre #2) || 0..B : voir le mode de d'adressage du registre || C..E : spécifique à l'instruction || F : accès directe (les bytes suivant sont la valeur) |+-----> params #1 (souvent la destination) | 0..B : voir le mode de d'adressage du registre | C..F : spécifique à l'instruction +------> instruction
3210 |||| ||++-> identifiant du Registre (0..3) ++---> 00 : spécifie un Registre de type Données (DATA) Dx 01 : spécifie un Registre de type adresse (ADDR) Ax 10 : spécifie une donnée pointée par le registre d'adresse Ax 11 : 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
0 : NOP or specific machine operands 1 : MOVE 2 : ADD / INC 3 : SUB / DEC 4 : MUL 5 : DIV 6 : ROR 7 : ROL 8..B : unused C : PUSH / POP / CALL / RET E : CMP F : JMP (extended)
0x0000 : NOP 0x0FFF : HALT 0x0001 : ORG (set PC) 0x0002 : STACK (Set SP) 0x0003 : CLEAR (Clear flag register)