Outils pour utilisateurs

Outils du site


back2root:programmation:virtual-cpu-v1

Différences

Ci-dessous, les différences entre deux révisions de la page.


Révision précédente
back2root:programmation:virtual-cpu-v1 [2025/03/11 09:37] (Version actuelle) – [Tableau] frater
Ligne 1: Ligne 1:
 +====== 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 680x0 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.
 +
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  15  ^  14  ^  13  ^  12  ^  11          ^  10  ^  9  ^  8  ^  7            6  ^  5  ^  4  ^  3        2  ^  1  ^  0  ^
 +|  id                    ||||  paramètre 1                 ||||  paramètre 2                ||||  taille                 ||||
 +
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  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) =====
 +
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  3        2  ^  1      ^  0  ^
 +|  Taille       ||  RegID       ||
 +
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  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 :
 +{{tablelayout?rowsHeaderSource=Auto}}
 +^  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
 +{{tablelayout?rowsHeaderSource=Auto}}
 +|  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 =====
 +{{tablelayout?rowsHeaderSource=Auto}}
 +|  0x0000  | NOP                          |
 +|  0x0FFF  | HALT                         |
 +|  0x0001  | ORG (set PC)                 |
 +|  0x0002  | STACK (Set SP)               |
 +|  0x0003  | CLEAR (Clear flag register)  |
 +
 +<nspages back2root/programmation -simpleList -h1 -exclude:start -textPages="Back2Root">