diff --git a/architecture/M999/README.md b/architecture/M999/README.md new file mode 100644 index 0000000..7827421 --- /dev/null +++ b/architecture/M999/README.md @@ -0,0 +1,121 @@ +## Le processeur papier M999 + +> Le M999 est un processeur papier permettant de comprendre concrètement le fonctionnement d'une architecture Von Neumann. Il s'agit d'une variante du M99 avec un jeu d'instructions simplifié. + +--- + +### Présentation + +Le M999 est une machine dotée de : +- **1000 cases mémoire** (adresses de 000 à 999), chacune contenant un mot de 3 chiffres +- **3 registres** : A, B et R (accumulateur/résultat) +- **1 compteur de programme** (PC) indiquant l'adresse de la prochaine instruction + +![M999](assets/m999.png) + +--- + +### Jeu d'instructions (version 1) + +| Opcode | Instruction | Description | +|--------|-------------|-------------| +| 0 xy | LDA xy | Charge le mot mémoire d'adresse xy dans le registre A | +| 1 xy | LDB xy | Charge le mot mémoire d'adresse xy dans le registre B | +| 2 xy | STR xy | Copie le contenu du registre R dans le mot mémoire d'adresse xy | +| 3 00 | ADD | R := A + B | +| 3 01 | SUB | R := A - B | +| 3 99 | NOP | Ne fait rien | +| 4 rs rd | MOV rs rd | Copie le registre source dans le registre destination | +| 5 xy | JMP xy | Saut inconditionnel à l'adresse xy | +| 6 xy | JPP xy | Saut à l'adresse xy si R > 0 | + +**Registres :** 0 = A, 1 = B, 2 = R + +--- + +### Jeu d'instructions (version 2) + +La version 2 ajoute deux instructions utiles pour l'algorithme de multiplication russe : + +| Opcode | Instruction | Description | +|--------|-------------|-------------| +| 3 02 | DIV2 | Divise A par 2 : quotient dans R, reste dans B | +| 3 03 | MUL2 | Multiplie A par 2 : résultat dans R | + +--- + +### Cycle d'exécution + +Le processeur répète le cycle suivant : + +1. **Fetch** : Lire l'instruction à l'adresse PC +2. **Decode** : Décoder l'opcode pour identifier l'opération +3. **Execute** : Exécuter l'instruction +4. **Incrémenter PC** (sauf si saut) + +Le programme s'arrête quand PC atteint 999. + +--- + +### Différences avec le M99 + +| Opération | M99 | M999 | +|-----------|-----|------| +| Charger A | 1xy | 0xy | +| Charger B | 2xy | 1xy | +| Stocker R | 0xy | 2xy | +| Addition | 400 | 300 | +| Soustraction | 401 | 301 | + +Le M999 utilise une numérotation plus intuitive : 0 pour charger A, 1 pour charger B, 2 pour stocker. + +--- + +### Activité : La multiplication paysanne russe + +Cette méthode ancestrale permet de multiplier deux nombres en utilisant uniquement : +- Des divisions par 2 (partie entière) +- Des multiplications par 2 +- Des additions + +![Algorithme](assets/multiplication_russe.jpeg) + +#### Exemple : 13 × 5 + +| Colonne A (÷2) | Colonne B (×2) | +|----------------|----------------| +| 13 | 5 | +| 6 | ~~10~~ | +| 3 | 20 | +| 1 | 40 | + +On raye les valeurs de B quand A est pair, puis on additionne les valeurs restantes : +**5 + 20 + 40 = 65** + +#### Objectif + +Implémenter cet algorithme sur le M999 en utilisant le jeu d'instructions version 2. + +**Aide :** Pour savoir si A est pair, on utilise DIV2 (3 02) qui place le reste dans B. Si B = 0, alors A était pair. + +--- + +### Pour aller plus loin + +- Écrire un programme qui calcule la factorielle d'un nombre +- Écrire un programme qui teste si un nombre est premier +- Comparer l'efficacité de la multiplication russe avec une multiplication par additions successives + +--- + +Sources : +- [Informatique Sans Ordi](https://github.com/InfoSansOrdi/M999) - Philippe Marquet et Martin Quinson +- Jeu d'instructions adapté par Philippe Boddaert + +--- + +> Auteur : Florian Mathieu +> +> Licence CC BY NC +> +> Licence Creative Commons