Le processeur dispose d'un nombre de régistres internes, voici les principaux:
- L'accumulateur qui stocke le résultat d'une opération (calcul). La plupart des opérations se font sur la valeur dans l'accumulateur et le résultat est à nouveau placé dans l'accumulateur. L'accumulateur a la même largeur que le bus de données, donc 8 bits.
- Le compteur de programme indique l'endroit où se trouve l'instruction suivante à effectuer. Le compteur est automatiquement incrémenté, permettant l'exécution séquentielle des instructions. Une opération de saut modifie la valeur du compteur de programme. Le compteur de programme a une largeur de 16 bits.
- Le pointeur de pile (stackpointer): il s'agit d'un pointeur qui est utilisé pour les interrupts. A la fin d'un interrupt, le programme doit continuer là où il a été interrompu. La valeur du compteur d'adresse actuel est donc stocké dans la pile et le pointeur est augmenté de deux unités. A la fin de l'interrupt, la valeur de la pile est utilisée pour remettre le compteur de programme à jour. Un interrupt pouvant à son tour être interrompu, la pile n'est pas un régistre, mais une zone en mémoire. Le pointeur de pile indique le premier emplacement de libre.
- Le régistre d'état indique le résultat de la dernière opération: résultat nul, résultat négatif, overflow,... Il est interprété bit par bit. Quand une condition doit être controlée pour effectuer un saut dans le programme ou non (saut conditionnel), c'est un des bits du régistre d'état qui est controlé.
- Le processeur dispose d'un petit nombre de régistres à usage interne pour stocker des résultats intermédiaires ou pour l'adressage indirect (régistres d'index). Le nombre de régistres est limité. La plupart ont une largeur de 8 bits.
Mémoire graphique
Une partie de la mémoire vive est réservée pour l'affichage. Chaque position en mémoire correspond à une position d'écran. En écrivant à certaines places en mémoire, on fait apparaitre le signe correspondant à l'écran. L'instruction BASIC PRINT "Hello World!" ne fait rien de plus que de copier la chaine de caractères vers certaines positions de mémoire vive.
Les premiers ordinateurs avaient par exemple 24 lignes de 64 positions, ce qui nécessite 1536 octets en mémoire vive.
Les ordinateurs utilisent l'alphabet ASCII (128 signes), les signes non-attribuées peuvent être utilisés pour afficher le signe en inverse ou pour des représentations graphiques.
Une autre possibilité est de réserver un octet pour le signe et un octet pour l'attribut (couleur du signe et couleur du fond). On dispose ainsi de 16 combinaisons de couleurs (les couleurs DOS)
Le circuit graphique lit chaque position de mémoire associé à l'écran et construit une ligne de caractères à la fois. La lecture d'une position de mémoire se fait en bloquant le processeur pendant un court instant, car la mémoire vive ne peut effectuer qu'une seule opération à la fois.
Les premiers ordinateurs n'avaient pas de possibilités graphiques, mais on pouvait avoir des fonctions graphiques élémentaires en étandant le concept de mémoire partagée. L'écran VGA standard a 640 points sur 480 lignes, ce qui fait qu'il faut 37.5kb pour une représentation monochrome (640 / 8 = 80 octets par ligne, 80 * 480 lignes = 38.400 octets). La couleur n'était donc pas possible avec ces premiers ordinateurs, car is ne disposaient pas d'assez de mémoire vive.
Le processeur et ses périphériques directs
Un microprocesseur a un bus d'adresses de 16 bits, un bus de données de 8 bits et quelques lignes de controle:
- Un signal d'horloge pour obtenir une vitesse de fonctionnement constante. Le signal d'horloge est utilisé sur toute la carte-mère.
- Un signal R/W (read/write = lecture/écriture) pour indiquer que le bus de données est en mode lecture (les données sur le bus sont transvasées vers le processeur) ou écriture (les données doivent être placées en mémoire vive). Ce signal est généré par le processeur.
- Un interrupt principal NMI Non Masquable Interrupt qui produit une remise à zéro du processeur (initialisation du compteur de programme)
- Un interrupt standard, qui signale par exemple qu'une touche a été enfoncée. La routine appellée va alors lire une position spécifique en mémoire (qui contient le code de la touche) et puis continuer l'exécution normale du programme.
- Un signal d'arrêt (HALT) pour interrompre momentanément le processeur, pour qu'un autre circuit puisse accéder à la mémoire.
Le bus d'adresses est unidirectionnel et provient du processeur central. Quand le processeur graphique doit accéder à la mémoire, il met momentanément le processeur à l'arrêt et met l'adresse demandée sur le bus.
Le bus de données est bidirectionnel: le processeur peut placer des données sur le bus (données à stocker en mémoire vive) ou lire ce qui se trouve sur le bus.
Adresses périphériques
Le processeur central a trop peu de lignes pour commander tout l'ordinateur. Il s'agit par exemple de lire la position d'un joystick, de lire ce qui se trouve sur le port série, de changer de mode graphique, etc.
Pour permettre toutes ces fonctions, le système dispose d'adresses périphériques. Ce sont des adresses qui ne correspondent pas à de la mémoire physiquement présente. Un circuit de décodage spécifique lit continuellement le bus d'adresses, et quand une valeur particulière est présente, la ligne de commande particulière est activée.
Les adresses $FFF0 à $FFFF sont par exemple utilisées comme adresses périphériques. Quand le processeur central met une de ces valeurs sur le bus d'adresses, la commande correspondante est effectuée. Un petit circuit de décodage lit le bus d'adresses et a 16 ligne en sortie, qui permettent d'effectuer 16 commandes.
Un exemple tout simple est la lecture du clavier. Quand l'utilisateur enfonce une touche, le code est stocké dans une mémoire tampon et un interrupt est généré. La routine effectuée par l'interrupt va placer une valeur particulière sur le bus d'adresse pour signaler au décodeur de clavier de placer le code sur le bus de donnée au cycle suivant. Les données sont lues, controlées (par exemple soft reset), le code est placé quelque part en mémoire et puis la routine d'interrupt est terminée et le controle est repassé au programme principal.
Les adresses périphériques peuvent être utilisées pour toutes les fonctions, mais elles dépendent de l'architecture du système: par exemple mettre le moteur de l'enregistreur à cassette en route, lire ou écrire un octet vers l'enregistreur à cassettes, etc. Les données à stocker sont placées sur le bus de données, c'est le seul bus qui est bidirectionnel.
Mémoire de travail
La mémoire des premiers ordinateurs était limitée à par exemple 48kb. Une partie de cette mémoire était réservée pour le firmware (ROM) et contenait le système d'exploitation de l'ordinateur. Le système d'exploitation contient les routines pour les opérations élémentaires: routines pour lire le clavier et les autres périphériques, et souvent aussi un interface avec l'utilisateur (interpréteur basic).
Quand les disquettes feront leur application, le système d'exploitation de ces disquettes sera stocké en mémoire vive et devra être chargé à chaque redémarrage de l'ordinateur.
Certains micro ordinateurs disposaient d'un système pour éviter la limite des 64kb de mémoire vive, il s'agit de la commutation de bancs de mémoire. Il s'agit de mémoire supplémentaire qui a la même adresse que la mémoire principale, mais qui doit être activée par une commande spécifique (adresse périphérique).
Il y a deux sortes systèmes de commutation de banques de mémoire:
- Toute la mémoire (64kb) est commutée en une fois. Chaque banque doit avoir une région comprenant les routines de base (traitement des interrupts et commutation des banques), mais autrement chaque banc de données est totalement indépendant des autres et peut servir pour le multitastking, où une application dispose de 64kb à lui tout seul, comme si l'application était le seul programme tournant sur l'ordinateur. La copie de données d'un banc à l'autre est lente.
- Une partie de la mémoire (par exemple 16k) est commutée. Les bancs peuvent par exemple stocker des données. Quand elles sont nécessaires, le banc correspondant est activé et les données sont copiées vers la mémoire non-commutée ou le traitement est effectué directement dans le banc correspondant. Il n'y a a chaque fois qu'un seul banc actif, en plus de la mémoire non-commutée.
On utilise ici quelques adresses périphériques pour effectuer la commutation des banques de mémoire. Si on utilise 8 bancs de 16kb, la mémoire vive est ainsi augmentée de 131.072 octets. Il ne s'agit pas de mémore linéaire. Il n'est pas possible de comparer des données d'un banc avec celles d'un autre banc, mais il est toujours nécessaire de passer par la mémoire centrale, qui est limitée à 48kb.
64k, cela fait combien en fait? Cette image de moi quand j'étais jeune fait 200 * 271 pixels. Pour retoucher l'image en mémoire, il faut 54.200 octets si on compte 1 octet par pixel (codage de l'information couleur sur 1 octet comme avec le format GIF 256 couleurs). Si nous travaillons en "true color" (24 bits/pixel) on a besoin de trois fois autant de mémoire pour retoucher l'image en place (donc sans faire de copie de l'image.
C'était donc tout à fait normal que la résolution graphique des premiers ordinateurs était très limitée. On avait le choix d'une résolution moyenne (par exemple 768 * 768 pixels), mais en monochrome (1 bit par pixel), soit une basse résolution (256 * 256 pixels) avec 16 couleurs. Les applications graphiques n'ont été possibles que quand les ordinateurs ont eu plus d'1MB de mémoire.
La carte vidéo disposait de sa mémoire propre, permettant le décodage indépendant de l'image sans avoir à bloquer le bus principal. Il n'y avait alors plus de correspondance entre une adresse physique en mémoire vive et sa position sur l'écran.
Lors du stockage sur un périphérique, on comprime la photo (format JPEG) qui permet une réduction de la taille du fichier, qui passe de 162.600 à 33.600 octets.
|