Table des matières
Virtual CPU v1
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.
Caractéristiques
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 |
Structure d'une instruction
les deux premiers octets (16 bits) sont obligatoirement une instruction. l'instruction se décode en 4x 4 bits.
de gauche à droite:
- 4 bits d'instruction ID
- 4 bits pour le 1er paramètre (si nécessaire)
- 4 bits pour le 2ème paramètre (si nécessaire)
- 4 bits pour la longueur (si nécéssaire) de l'instruction
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
Mode d'adressage du registre (format du Parametre #1 et #2)
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 |
Instruction Opcode
“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)
Special instruction opcode
0x0000 : NOP 0x0FFF : HALT 0x0001 : ORG (set PC) 0x0002 : STACK (Set SP) 0x0003 : CLEAR (Clear flag register)