|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Commodore annonce dans ses publicités que l'Amiga 2000 est une machine multitâche (tout le monde le sait désormais) et multistandard (MS-DOS et bientôt le plus alléchant Unix). Mais vous êtes-vous déjà posé la grande question : "Mais dis Monsieur Commodore, comment est-ce que c'est-y-que ça fonctionne cette affaire de compatibilité sur un A2000 ?". Eh bien mon enfant, c'est un petit peu complexe et en même temps très sioux, nous allons donc ensemble décortiquer la carte A2088 et voir son fonctionnement. La carte A2088 Cette carte est en fait un compatible IBM-XT modifié tenant sur une simple carte 13x4 pouces. Son microprocesseur est un 8088 cadencé à 4,77 MHz comme un bon vieux PC quoi... Une EPROM de 16 koctets gère un BIOS que Commodore a modifié afin d'y apporter les routines nécessaires à la communication avec l'Amiga. La carte est fournie avec 512 ko de mémoire, sans compter les 128 ko de mémoire mixte utilisée pour les communications interprocesseurs (nous y reviendrons ...). Un emplacement est prévu pour un coprocesseur arithmétique 8087. De plus, la carte est équipée avec un contrôleur de disquette SMC 9268 et un connecteur au standard 5 pouces. Il est à noter que le lecteur A1010 de l'Amiga est reconnu du côté PC comme un lecteur 720 ko (il faut le brancher sur la carte, bien sûr...). Tout ça sur une simple carte me direz-vous ? Cette petite carte fait encore bien plus : je n'ai pas encore parlé de ce que Commodore appelle le "PC Multifunction Chip". Ce circuit spécialisé (comme le trio Agnus, Denise, Paula) fait le travail d'un contrôleur DMA, d'un contrôleur d'interruptions et d'un timer. Résultat des courses : une A2088 équipée de ce circuit et de mémoire est un véritable PC tenant sur une carte, les périphériques en moins. La carte 2088 a deux connecteurs latéraux : un connecteur PC qui se branche dans un port PC et un connecteur 100 broches qui s'enfiche dans le port du bus du côté Amiga. Le connecteur du côté PC permet, en étant sur le bus, à l'A2088 d'avoir accès aux autres ports PC et aux périphériques qu'on peut y mettre. Le connecteur sur le bus Amiga permet au 68000 d'accéder à la mémoire mixte de l'A2088. Cette mémoire est conçue pour être accessible par les deux côtés de la machine : Amiga et PC. Diagramme simplifié de l'A2000 avec la carte A2088 installée : le bus processeur et les bus PC peuvent fonctionner sans interférer avec le Blitter. Les effets en sont les suivants : quand une touche est pressée sur le clavier, elle est traduite (du côté Amiga) dans son équivalent PC et sa valeur est chargée dans la mémoire mixte. Le côté Amiga prévient alors l'A2088 de la présence de la valeur de la touche se trouvant en mémoire. Le logiciel de gestion du registre transfère alors la valeur de la touche de la mémoire vers le registre à décalage, et cette valeur est transmise par une ligne série au PC Multifunction Chip comme si elle venait directement d'un clavier. Tout ce travail explique pourquoi l'écho de la frappe à l'écran est un peu lent. La gestion de l'affichage est un peu plus compliquée, nous y reviendrons. Le logiciel de gestion de l'A2088 On pourrait maintenant se demander comment cohabitent (pour reprendre le cri d'amour du crapaud) les deux systèmes. En général chaque système réagit quand l'autre lui envoie une interruption (je rappelle qu'une interruption est un évènement élémentaire pouvant survenir à n'importe quel moment). Frapper une touche sur l'Amiga envoie une interruption à l'A2088. Ceci déclenche une routine de gestion des interruptions de l'A2088 qui fait que la carte gère la valeur de la touche comme si elle avait été frappée du côté PC, selon le mécanisme détaillé plus haut. De la même manière, lorsque l'A2088 accède à la mémoire écran (graphique, monochrome, texte...), elle envoie une interruption à l'Amiga, qui va alors aller scruter la mémoire vidéo de l'A2088 (qui fait partie de la mémoire mixte) et déterminer ce qu'il doit et comment il doit afficher ce que l'A2088 a envoyé. Quand on clique sur les icônes PCmono ou PCcolor, ces programmes vont lancer un autre programme appelé PCwindows. Ce dernier ouvre une fenêtre et un écran dans lesquels vont s'afficher les informations générées par l'A2088. L'Amiga 2000 lui voit la carte A2088 comme un périphérique logique et cherche à lui associer une bibliothèque de routines (c'est la janus.library du tiroir Expansion). PCwindows (ou n'importe quel autre programme Amiga) a alors accès à une série de routines qui lui permet d'interagir avec le matériel de la carte A2088 (les puces, quoi...). Cet accès est de type "haut niveau" et est immuable. Ceci est un énorme avantage car cela permet à Commodore de modifier la carte elle-même ou la bibliothèque de routines, sans affecter les autres programmes déjà existants, ce qui n'aurait pas été possible avec des accès à des routines de bas niveau. Le programme PCwindows lance plusieurs tâches qui sont réveillées par les interruptions du PC comme on l'a expliqué auparavant. Actuellement une interruption oblige l'Amiga à envoyer un signal Exec (exec.library présente en ROM) à la tâche. La mémoire mixte Le côté Amiga et le côté PC de l'ordinateur doivent tous les deux être capables de lire et d'écrire dans la mémoire mixte, et ce rapidement, bien que chaque côté ait sa propre architecture et sa façon de "réagir". Par exemple, le 8088 stocke un mot de 16 bits en mettant l'octet de poids faible à l'adresse la plus basse, alors que l'Amiga stocke un mot de 16 bits en écrivant d'abord le poids fort. De la même façon, le PC stocke un pixel couleur dans deux bits adjacents d'un même octet de la mémoire vidéo, alors que l'Amiga stocke les deux bits dans des octets différents. Les concepteurs de la carte 2088 ont donc trouvé une solution élégante : du côté PC, chaque mot de mémoire a un emplacement donné. Le côté Amiga, lui, peut gérer un morceau de mémoire de trois façons différentes. Il utilise une adresse pour accéder à un octet de mémoire, une autre pour accéder à un mot de mémoire, et une troisième pour accéder à deux octets de mémoire vidéo couleur, les deux octets étant lus du côté Amiga dans l'ordre inverse par rapport à ce que voit le côté PC. Dans le troisième cas, le mot de donnée lu par le côté Amiga contient le premier bit de chacun des huit pixels contenus dans le premier octet et le deuxième bit des pixels dans le deuxième octet (ouf...). Ces diagrammes montrent l'accès à la mémoire mixte. Deux bits adjacents du côté PC forment un pixel, mais doivent être dans différents plans de bits du côté Amiga pour récréer le même pixel. La figure A montre comment deux octets du PC sont représentés dans la mémoire Amiga. La figure B montre comment les deux octets sont placés dans différents plans de bits pour transcrire le pixel créé du côté PC). Ce diagramme montre les trois modes d'accès à la mémoire mixte. Bien que chaque emplacement mémoire ait une seule adresse du côté PC, il apparaît à trois endroits différents dans la zone Amiga. Ce type de codage permet d'avoir accès à la résolution 320x200 en 4 couleurs du PC. L'A2088 gère également le mode 640x200 monochrome, mais comme chaque pixel est défini par un bit, la manipulation précédente n'est plus nécessaire. Différentes parties de la mémoire mixte sont réservées pour des utilisations spécifiques :
Nous avons maintenant une idée de la façon dont l'Amiga et le PC communiquent entre eux. Voyons maintenant comment est géré l'affichage. Un affichage monochrome (texte) ou couleur (texte ou graphique) est détourné vers le moniteur Amiga de la façon suivante. Quand un programme tournant du côté PC envoie des données à l'écran, les routines d'entrées/sorties du BIOS envoient des informations dans la zone vidéo de la mémoire mixte. Le fait d'écrire dans cette mémoire génère une interruption de l'A2088 vers l'Amiga. L'Amiga la reconnaît comme une interruption vidéo et "réveille" une tâche qui compare le contenu de la mémoire mixte vidéo avec ce qui est affiché dans la fenêtre PC courante du moniteur Amiga. Cette tâche connaît en permanence ce qui est affiché et met à jour uniquement les zones qui été modifiées. Ceci fait que l'affichage se fait bien plus vite que s'il fallait rafraîchir tout l'écran à chaque fois. Par exemple pour l'ajout d'un caractère en fin de ligne. Si le PC est en mode monochrome (et stocke l'écran comme une matrice de valeurs ASCII) alors, la tâche d'affichage doit convertir ce caractère en une matrice rectangulaire pour l'afficher sur l'écran Amiga. Pour ce faire, l'Amiga se réfère à un fichier PCFONT.FONT qui décrit le profil binaire du jeu de caractères monochrome IBM (caractères ASCII plus les caractères spéciaux IBM). Si le caractère affiché a une valeur de fond différente de celle par défaut, la tâche d'affichage de l'Amiga va afficher le caractère dans plusieurs plans de bits Amiga. Accès au disque dur Commodore a conçu l'A2088 de façon à ce que le côté Amiga du 2000 puisse accéder à une partition d'un disque dur PC. On lance le programme FDisk du côté PC pour allouer une partie du disque au PC. Commodore fournit un programme similaire appelé ADisk qui permet de créer une partition AmigaDOS sur ce même disque dur. Du côté Amiga, la partion apparaîtra avec un nom d'unité de JHO: et sera traitée comme n'importe quel autre disque Amiga, bien qu'on ne puisse pas démarrer dessus (même avec les ROM 1.3). Nous verrons une solution élégante pour y remédier, en éliminant carrément le disque PC (qui supprime l'autodémarrage des ROM 1.3). Revenons à notre JHO:. Il dispose de son propre pilote qui utilise la mémoire mixte et un système d'interruptions pour accéder au disque dur. La nouvelle question est, vous l'aurez compris, comment les deux côtés de la machine vont-ils coordonner leur accès au même disque ? Essayons de répondre sur un exemple : supposons que nous ayons un disque PC avec son contrôleur dans un port PC (ce n'est pas mon cas) et suivons les différentes étapes de l'initialisation au démarrage du 2000. A la mise sous tension du système, le 8088 de la carte est immédiatement placé en état de "RESET". En fait, ceci empêche le processeur de tourner pendant le démarrage de l'Amiga. La startup-sequence est exécutée (elle doit contenir naturellement la commande BindDrivers pour charger la bibliothèque Janus). Quand le démarrage est terminé, l'A2000 envoie un signal d'annulation de RESET (SET) au 8088 et boucle en attendant une interruption du 8088. Débarrassé du RESET, le 8088 exécute alors les routines d'initialisation du BIOS : vérification du processeur, des canaux DMA, initialisation des vecteurs d'interruptions, etc. Commodore a modifié ces routines pour que l'A2088 signale à l'Amiga la fin de son initialisation et boucle ensuite en attendant un signal de continuation de l'Amiga. Ceci se produit après le rafraîchissement mémoire du côté PC. Lorsque l'Amiga en a été informé, il lit un bloc de code (fichier PC.BOOT) sur son disque, qu'il transfère ensuite dans la mémoire mixte (c'est du code directement exécutable par le 8088). C'est le seul code qui est chargé dans la mémoire mixte, et il est chargé de façon à apparaître de côté PC à une adresse de ROM périphérique. L'Amiga donne le signal de continuation au 8088. La séquence BIOS est presque terminée. Le 8088 cherche alors des ROM périphériques des adresses 8000 aux adresses F4000 (hexa) en scrutant cette zone par pas de deux koctets. Si une série de trois octets de signature 55AA suivie d'un octet indicateur de longueur est rencontrée, le BIOS transfère le contrôle à l'adresse qui suit les octets de signature, qui doit être un code d'initialisation de périphérique. Dans notre cas ce serait un contrôleur de disque dur. Ce code va alors détourner un vecteur d'interruption bien spécifique, le vecteur INT 13H. Ce vecteur a été généré par les routines d'initialisation du BIOS qui gère les entrées/sorties disques. La ROM disque dur oblige alors ce vecteur à pointer sur ses propres routines. Dans ce cas, une demande de présence de disque dur est interceptée par la ROM, les requêtes d'entrées/sorties des disquettes sont identifiées et passées au BIOS. Les routines ROM d'initialisation du disque dur sont terminées et le BIOS continue sa scrutation, à la recherche d'autres ROM périphériques. A ce moment, il rencontre le fameux code PC.BOOT en mémoire mixte. Ce code est précédé par les octets de signature signalant qu'il se comporte comme une ROM périphérique. Le BIOS passe donc le contrôle à ce qu'il croît être une routine d'initialisation de périphérique, mais qui est en fait une routine de PC.BOOT servant à rediriger le vecteur d'interruption INT 13H. Une requête d'entrée/sortie va alors être interceptée par le PC.BOOT : le côté Amiga s'est commandé lui-même du côté PC à l'aide des routines d'entrées/sorties disque ! LE BIOS termine alors sa recherche de ROM périphériques. A partir de ce moment, le côté Amiga peut envoyer des requêtes d'entrées/sorties aux disques PC en accédant directement aux routines ROM de la carte contrôleur ou à travers le BIOS pour les unités disquettes. Dans ce cas, le côté Amiga peut accéder à une partition AmigaDOS sur un disque PC, quelles que soient les tâches tournant du côté PC. De plus, le code PC.BOOT dispose des fonctions nécessaires pour empêcher les accès simultanés des deux machines au même disque. Quand le côté PC accède au disque, le PC.BOOT intercepte la requête d'entrée/sortie et envoie un "flag" à l'Amiga via la mémoire mixte pour lui indiquer de ne pas faire d'accès disque de son côté. Garder l'autodémarrage du disque Amiga avec les ROM 1.3 Techniquement ce système est très bon, du moins tant qu'on garde ses ROM 1.2. En effet, si on a un disque dur Amiga et un disque PC, l'autodémarrage du disque Amiga est supprimé. Heureusement, il existe une solution : on peut démarrer sur le disque Amiga et créer sur ce disque un pseudo-disque PC qui sera en fait un gros fichier Amiga (chez moi 10 Mo). Voici comment faire : Tout d'abord, comme on dispose d'un disque dur et d'un Mo de mémoire, on réinstalle le logiciel de la carte passerelle dans son intégralité. En particulier, le répertoire "c" du système doit contenir les commandes suivantes : DJmount, MakeAB ; le répertoire "devs" doit contenir le JDisk.device ; le répertoire "expansion" la bibliothèque Janus ; et le tiroir "fonts" le fichiers Pcfont.font et le répertoire Pcfont. Ensuite vient la procédure de création du pseudo-disque proprement dite. Première chose : éditer la startup-sequence et rajouter après la commande BindDrivers la ligne suivante :
En effet, l'Amiga utilise PCDisk pour accéder au pseudo-disque, donc PCDisk doit tourner avant que le PC démarre. Il faut ensuite créer le fichier d'autodémarrage Amiga. Pour cela, utiliser la commande suivante :
Le programme MakeAB va alors demander les spécifications du pseudo-disque. La doc de la carte passerelle donne les spécifications d'un disque 10 Mo (ce qui suffit généralement), mais on peut donner n'importe quels types ou tailles même non standard ! Pour un disque de 10 Mo, il faut donner :
Une fois ce fichier sauvegardé, la moitié Amiga du travail est terminée. Il faut alors démarrer du côté PC avec le disque système, puis exécuter la procédure normale d'initialisation d'un disque MS-DOS. D'abord lancer le programme FDisk du côté PC pour partitionner le disque (même si on ne veut qu'une seule partition), puis formater la disque à l'aide de la commande :
L'option "/s" permet d'installer le système sur le disque et donc de le rendre amorçable (ce qui est le but du jeu, après tout). Ceci fait, redémarrer l'Amiga. Après l'exécution de la startup-sequence, vous pourrez voir le lecteur 5"1/4 se mettre en branle, puis le disque dur. Si on clique sur l'icône "PCmono" ou "PCcolor", on se retrouve instantanément sous l'invite de commande C:>. Quels sont les avantages ? Le principal est le suivant : si vous achetez un disque PC et son contrôleur, vous perdez l'autodémarrage sur le disque dur Amiga, depuis le temps qu'on l'attendait, dommage. Ensuite, deux disques durs, à mon avis ça fait double emploi. Ce diagramme montre la séquence d'évènements nécessaire pour démarrer l'A2088 avec l'Amiga 2000.
|