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.

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

Mode d'adressage du registre (format du Parametre #1 et #2)

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

Instruction Opcode

“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)

Special instruction opcode

0x0000 NOP
0x0FFF HALT
0x0001 ORG (set PC)
0x0002 STACK (Set SP)
0x0003 CLEAR (Clear flag register)