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:

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)