## 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