Section courante

A propos

Section administrative du site

Spécification Description
Fabricant IBM
Date de conception 1981
RAM installé 16 Ko
Puce Motorola MC6845

Introduction

La carte vidéo MDA du fabricant IBM, tire son nom de l'abréviation de l'anglicisme Monochrome Display Adapter et la première carte monochrome proposé pour ses IBM PC. Elle a été conçu pour se connecter directement au moniteur IBM 5151 monochrome (vert phosphore). La carte était également livrée avec un port d'imprimante pour fonctionner avec les imprimantes IBM, elle était donc souvent appelée écran monochrome et adaptateur d'imprimante.

La carte était livrée avec 4 Ko de mémoire vidéo pour entreposer les attributs d'écran étant entreposés à l'adresse mémoire B0000 à B0FFF, plus une ROM de caractères de 8 Ko contenant les images d'un ensemble de caractères, bien que seulement 4 Ko aient été réellement utilisés. La carte était accessible via les ports d'entrée/sortie 3B0h à 3BF.

La norme MDA était destinée à être utilisée avec un moniteur à fréquence fixe, fournissant un format d'image 720x350 pixels, bien qu'elle ne soit capable de produire une sortie texte qu'à l'aide de son générateur de caractères basé sur ROM. Ces caractères étaient des "cellules" de 9x14 pixels, de sorte que le format d'image est plus précisément décrit comme 25 lignes de 80 caractères chacune. Cela était connu sous le nom de «mode 7» ou «mode 07h». L'ensemble de caractères n'était pas redéfinissable. Les cartes MDA vendues aux États-Unis contenaient ce qu'on appelait la page de codes 437 - il s'agissait de l'ensemble de caractères comprenant tous les caractères ASCII américains imprimables (32-126), les codes étendus pour les caractères accentués et certains dessins au trait. Pour les marchés étrangers, l'ensemble de caractères de la ROM a été modifié pour s'adapter aux caractères grecs, cyrilliques, hébreux et autres.

Il utilise une sortie TTL numérique, ce qui signifie qu'il déclenche soit un «haut» soit un «bas», où un «haut» allume le faisceau du CRT et un «bas» l'éteint pour créer les caractères. Une sortie "intensité" séparée est également fournie et peut être utilisée pour modifier la luminosité caractère par caractère.

Il fournit également un signal de synchronisation horizontale et verticale séparé - quelque chose qui est encore conservé dans les normes PC aujourd'hui. Ces signaux de synchronisation sont nécessaires pour que les moniteurs CRT et les téléviseurs indiquent la fréquence horizontale utilisée par la norme MDA est de 18,432 kHz.

La carte MDA pourrait vivre heureusement aux côtés d'une carte CGA, mais il est important de noter que la carte MDA peut endommager les moniteurs n'étant pas conçus pour prendre des signaux vidéo/synchronisation MDA tels que le moniteur IBM 5153 (CGA) et l'IBM moniteur 5154 (EGA). Lors de l'installation de différentes cartes d'affichage dans ces anciens PC, vous deviez généralement définir des "cavaliers" ou des commutateurs "DIP" sur la carte mère pour lui indiquer ce qui était installé. Généralement, dans un XT ou un clone, il y avait 8 commutateurs DIP en 4 paires. La troisième paire indiquait au système quelle carte d'affichage était installée : monochrome, CGA ou pas de vidéo du tout. Ce paramètre avait l'habitude de dérouter les gens, car pour les cartes d'affichage plus avancées (EGA et VGA), vous deviez désactiver les commutateurs de la carte mère. En fait, c'était plus logique qu'il n'y paraissait au début : le BIOS XT gérait lui-même les écrans mono et CGA, mais les cartes EGA et VGA avaient leur propre BIOS, vous deviez donc dire au BIOS intégré que vous n'aviez "pas de vidéo" afin de permettre à la carte d'extension EGA ou VGA d'avoir le contrôle.

Sur la carte MDA elle-même se trouvaient des cavaliers. J1 doit rester ouvert, J2 est pour un crayon lumineux en option, bien qu'IBM n'en ait jamais publié un lui-même. Si le support de la carte semble être trop grand pour votre système, c'est parce qu'il a été conçu pour l'IBM 5150 d'origine, ayant un espacement plus large entre les connecteurs d'extension.

Historique et caractéristiques

IBM proposait initialement deux familles d'affichage pour le PC :

La MDA visait les traitements de texte, feuilles de calcul, terminaux et applications professionnelles. Sa cellule 9x14 et son moniteur à phosphore vert donnaient un texte plus lisible que les caracteres 8x8 de la CGA.

Caracteristiques de la carte IBM :

Le nom complet inclut «Printer Adapter» parce que la carte offre un port parallèle complet. Dans les tables DOS/BIOS, ce port est historiquement LPT1 lorsqu'aucun autre port de base inférieure n'est configuré.

Architecture matérielle

Le MC6845 ne contient ni police de caractères ni RAM. Il fournit les compteurs de balayage, les adresses de cellules, le numéro de ligne raster, les synchros et le curseur. La logique discrète MDA lit simultanément le caractère et l'attribut, consulte la ROM, ajoute soulignement/inversion/intensité/clignotement, puis généré les sorties.

La RAM a deux chemins d'accès permet au processeur et a l'affichage de partager le tampon. IBM indique deux octets lus en environ 553 ns, soit environ 1,8 Mo/s. Les accès CPU sont synchronises au caractère et insèrent au moins un wait state.

La carte ne fournit pas de parité sur sa RAM vidéo. Une erreur vidéo ne déclenche donc pas le NMI de parité système.

Moniteur IBM 5151 et connecteur

Connecteur DE-9 femelle

Broche Signal MDA IBM
1 Masse
2 Masse
3 Non connectée
4 Non connectée
5 Non connectée
6 Haute intensité
7 Vidéo
8 Synchronisation horizontale
9 Synchronisation verticale active basse

Il s'agit de niveaux TTL, pas de VGA analogique. Le même boîtier DE-9 est utilisé par CGA/EGA avec un brochage différent. Ne jamais relier un IBM 5151 a une CGA, une EGA ou un adaptateur inconnu en se fondant sur la forme du connecteur.

Niveaux visuels

Vidéo Intensité Aspect sur 5151 typique
0 0 noir
0 1 vert très sombre ou noir selon réglage/moniteur
1 0 vert normal
1 1 vert brillant

Des moniteurs compatibles emploient un phosphore ambre ou blanc. Les termes «vert» de cette page décrivent le 5151 original; les niveaux logiques restent vidéo et intensité.

Caractéristiques du 5151

Le 5151 est un CRT monochrome a phosphore P39, balayage fixe, environ 50 Hz. Il n'est pas multisynchronisation et ne possède pas les protections des moniteurs modernes contre tous les timings incorrects. Une mauvaise configuration de carte ou un signal CGA peut endommager le moniteur.

Horloges et temporisations

Horloge de points MDA : approximativement 16,257 MHz. Une cellule fait neuf points, donnant une horloge caractère voisine de 1,806 MHz.

Temporisations standard :

Le rapport d'aspect physique n'est pas déduit uniquement de 720/350. Le tube et les dimensions du 5151 déterminent la forme finale des points/caractères.

Le bit «high resolution» de 3B8h sélectionné la bonne horloge. Sur la carte IBM, le chemin de basse résolution n'a pas d'horloge normalement installée. Ce n'est donc pas un mode 40 colonnes utilisable.

Mémoire vidéo

Adresse et taille

La RAM physique fait 4096 octets et commence a B0000h :

Le décodage d'adresse de la carte IBM est incomplet. La même RAM se répète tous les 4 Kio dans B0000h..B7FFFh :

Un logiciel portable utilise B000:0000. Une Hercules dispose souvent de 32 ou 64 Kio réels et ne reproduit pas nécessairement ces miroirs.

Organisation

Chaque cellule occupe deux octets :

Déplacement Description
offset pair code de caractère
offset impair attribut

offset = 2 * (ligne*80 + colonne)

La page visible 80*25*2 utilise 4000 octets, laissant 96 octets jusqu'à 1000h.

Le BIOS annonce normalement une seule page utile en mode 07h. Les 4 Kio ne permettent pas deux pages complètes.

Exemple cellule colonne 10, ligne 3 :

offset = 2*(3*80+10) = 01F4h

Sur 8086 little-endian, un mot dont AL=caractère et AH=attribut peut être écrit directement a ES:[offset].

Cellules, caractères et police de caractères

Cellule 9x14

La ROM contient des glyphes de huit points. La cellule visible en fait neuf :

Cette règle explique les cadres continus des interfaces DOS. Un émulateur qui met toujours la neuvième colonne a zéro crée des trous dans les traits.

La police normale utilise 14 lignes de cellule. Le dessin utile des lettres est souvent de l'ordre de 7x9, entoure d'espacement. Les valeurs exactes sont dans la ROM IBM et doivent être utilisées pour une émulation fidèle.

ROM 8 Kio

La ROM 9264 contient la police MDA 14 lignes et aussi des polices de caractères 8x8 partagées avec des conceptions CGA. Le MDA normal n'affiche pas ces polices de caractères 8x8. La ROM n'est pas cartographiée dans l'espace CPU et n'est pas modifiable par logiciel.

Pour changer de police sur la carte IBM, il faut remplacer/modifier le composant matériel. Les fonctions EGA/VGA INT 10h/AH=11h ne chargent pas une police de caractères MDA.

Ensemble de caractères

Les 256 codes de la ROM IBM correspondent au ensemble PC d'origine communément associe a la page de codes 437 : ASCII, lettres accentuées, symboles, blocs et dessin de cadres. Une page de codes DOS modifie surtout clavier/traduction; elle ne reprogramme pas la ROM MDA.

Attributs monochromes

L'attribut MDA n'est pas une palette couleur a 4+4 bits. La logique générale :

Bits Description
0 à 2 Valeur 1 (001b) demande le soulignement; autres = non souligne
3 Haute intensité du premier plan
4 à 6 Participent aux cas normal/inverse/noir particuliers
7 Clignotement si active; intensité du fond si clignotement désactivé

Attributs usuels :

Code Description
07h Texte normal
0Fh Texte brillant
01h Texte souligne
09h Texte souligne brillant
70h Vidéo inversé, noir sur vert
78h Vidéo inversé avec niveau de premier plan sombre
87h Normal clignotant lorsque clignotement actif
8Fh Brillant clignotant
F0h Inversé clignotant, ou fond brillant si clignotement inactif
F8h Variante inverse/intensé

Exceptions matérielles confirmées :

Code Description
00h, 08h, 80h, 88h Affichent un espace noir;
70h Noir sur vert;
78h Vert sombre sur vert, avec halo possible;
F0h/F8h Clignotent si blink actif, sinon fond brillant.

Le soulignement apparaît sur la ligne choisie par le CRTC, normalement près du bas de la cellule. Un attribut 01h souligne; 07h ne souligne pas, même si leurs trois bits bas sont tous non nuls. Implémenter `bits0..2 == 1`, pas `bit0 == 1`.

Quand 3B8h bit 5=1, bit 7 commande le clignotement. Quand il vaut 0, bit 7 peut produire un fond de haute intensité. Blink masque le premier plan pendant une phase mais ne modifie pas la RAM.

Ports vidéo

Port Accès Fonction
3B0h,3B2h,3B4h,3B6h W Index/adresse MC6845 (miroirs)
3B1h,3B3h,3B5h,3B7h R/W* Données MC6845 (miroirs)
3B8h W Contrôle du mode/sortie
3BAh R État vidéo/retrace
3BCh R/W Données port parallèle
3BDh R État port parallèle
3BEh R/W Contrôle port parallèle

* La plupart des registres MC6845 sont en écriture seule; seuls certains sont lisibles. 3B4h/3B5h sont les adresses canoniques. Les miroirs résultent du décodage partiel de la carte IBM et peuvent manquer sur un clone.

3BBh et 3BFh n'ont pas la signification Hercules sur la MDA IBM. Un programme MDA ne doit pas écrire 3BFh pour « activer le graphique » : cette interface est une extension Hercules.

Registre de contrôle 3B8h

Registre en écriture seulement sur MDA IBM :

Bits Description
0 High Resolution Enable : doit être 1
1 Valeur « noir et blanc » mémorisée mais sans effet visuel utile
2 Réservé
3 Video Enable : 1=affichage, 0=noir
4 Réservé
5 Blink Enable : 1=blink, 0=bit 7 d'attribut comme fond intense
6 à 7 Réservés

Valeur BIOS habituelle du mode 07h : 29h (bits 0,3,5). Pour couper l'affichage en gardant horloge haute et blink : 21h. Pour une initialisation froide, IBM exige que la première commande a la carte soit :

  1. MOV DX,03B8h
  2. MOV AL,01h
  3. OUT DX,AL

Danger du bit 0

Sur la carte originale, bit 0=0 sélectionne une entrée d'horloge basse qui n'est pas normalement cablée. L'horloge synchronise aussi les wait states CPU. Un accès mémoire ou port ultérieur peut donc ne jamais terminer et bloquer le PC.

Un émulateur compatible simple peut ignorer cet effet pour éviter de geler la machine. Un profil IBM fidèle doit au moins enregistrer/diagnostiquer le cas et peut modeler le wait infini avec un mécanisme récupérable par reset.

Couper la vidéo

Mettre bit 3 à zéro pendant la reprogrammation CRTC réduit les parasites. Ne jamais couper aussi bit 0. Restaurer la valeur complète après programmation.

Registre d'état 3BAh

Sur une MDA IBM :

Bits Description
0 Retrace horizontal actif
1 à 2 Zéro
3 Pixel vidéo normal ou brillant actuellement émis
4 à 7 Un

Ainsi les bits non définis donnent normalement F0h dans leur partie haute. Un clone peut retourner autre chose. Bit 3 n'est pas le retrace vertical : il suit le signal vidéo/pixel et dépend du contenu de l'écran.

Pour détecter une activité, observer des transitions du bit 0 avec dépassement de délai. Un écran rempli de noir peut laisser bit 3 inactif; ne pas l'utiliser seul comme horloge. Hercules attribue d'autres sens, notamment vertical sync au bit 7.

Motorola MC6845 et registres

Sélectionner un index a 3B4h puis lire/écrire 3B5h.

Registres Fonction Unité
R0 Horizontal Total Caractères - 1
R1 Horizontal Displayed Caractères
R2 Horizontal Sync Position Caractères
R3 Horizontal Sync Width Caractères
R4 Vertical Total Rangées - 1
R5 Vertical Total Adjust Lignes raster
R6 Vertical Displayed Rangées
R7 Vertical Sync Position Rangées
R8 Interlace Mode and Skew Contrôle
R9 Maximum Scan Line Lignes par cellule - 1
R10 Cursor Start et mode Ligne/contrôle
R11 Cursor End Ligne
R12 Start Address High Adresse CRTC
R13 Start Address Low Adresse CRTC
R14 Cursor Address High Adresse CRTC
R15 Cursor Address Low Adresse CRTC
R16 Light Pen High Lecture
R17 Light Pen Low Lecture

R0 à R13 sont principalement en écriture seule; R14/R15 peuvent être lus/écrits; R16/R17 sont les captures light pen en lecture. Les variantes 6845 divergent : masquer les bits comme le composant IBM, pas comme un CRTC VGA.

Adresses CRTC en texte : une unité correspond a une cellule de deux octets.

offset_RAM = 2 * adresse_CRTC
cursor = ligne*80 + colonne

Programmation du CRTC

Table MDA IBM usuelle R0..R15 :

61 50 52 0F 19 06 19 19 02 0D 0B 0C 00 00 00 00

Interprétation principale :

Registre/Valeur Description
R0=61h 98 temps caractères totaux
R1=50h 80 affiches
R2=52h synchro H a 82
R3=0Fh Largeur synchro H
R4=19h Total vertical principal
R5=06h Six lignes d'ajustement
R6=19h 25 rangées affichées
R7=19h Position synchro V
R9=0Dh 14 lignes par cellule
R10=0Bh/R11=0Ch Curseur de deux lignes près du bas

Séquence :

  1. écrire 01h a 3B8h si initialisation froide;
  2. couper vidéo en conservant bit 0;
  3. écrire R0..R15 via 3B4h/3B5h;
  4. initialiser RAM et Start Address;
  5. activer 29h ou la variante blink voulue.

Des timings incorrects peuvent endommager ou désynchroniser un IBM 5151. Pour une application normale, utiliser INT 10h mode 07h.

BIOS INT 10h et mode 07h

Le mode BIOS MDA est 07h : texte monochrome 80x25.

  1. MOV AX,0007h
  2. INT 10h

Fonctions utiles :

Fonction Description
AH=00h AL=07h Définir le mode
AH=01h Forme curseur CH/CL
AH=02h Position BH=page,DH=ligne,DL=colonne
AH=03h Lire position/forme
AH=05h Page active (une page matérielle utile sur MDA)
AH=06h/07h Défiler une fenêtre
AH=08h Lire caractère et attribut
AH=09h Écrire caractère+attribut CX fois
AH=0Ah Écrire caractère sans changer attribut
AH=0Eh Télétype
AH=0Fh Lire mode/colonnes/page

AH=0Ch/0Dh de lecture/écriture pixel ne fournissent pas un graphique MDA. Les fonctions palette EGA/VGA n'ajoutent aucune couleur a la carte originale.

La BIOS Data Area contient notamment :

Adresse Description
0040:0049 Mode courant, 07h
0040:004A Colonnes, 80
0040:004C Taille de page
0040:004E Adresse de page
0040:0050 Positions curseur
0040:0060 Forme curseur
0040:0062 page active
0040:0063 Port CRTC de base, 03B4h
0040:0065 Copie du registre de mode

Une programmation directe doit maintenir la BDA si le BIOS sera réutilisé.

Mode vidéo

Voici la liste des différents modes vidéo supporté par les cartes vidéos MDA :

Mode Type Couleurs Format Alpha Taille caractère Taille écran Adresse écran
07h Texte 4 (Mono) 80x25 9x14 720x350 B000h

Remarque

Curseur, pages et défilement

R14:R15 est l'adresse de cellule du curseur. R10/R11 choisissent les lignes de la cellule. Des bits R10 gèrent blink/suppression selon variante MC6845.

Position :

adresse = StartAddress + ligne*80 + colonne

R12:R13 déplace l'origine visible sans copier la RAM. On peut faire un scrolling circulaire, mais la RAM de 2048 cellules ne dépasse l'écran que de 48 cellules. Il n'existe donc pas une deuxième page plein écran comme sur CGA.

Le BIOS défile habituellement par copie de mots dans B000h puis efface la dernière ligne. Pour limiter les artefacts, couper l'affichage ou synchroniser les accès, au prix de performances. La RAM double-accès et les wait states de la MDA évitent le «snow» CGA typique.

Port parallèle intégré

Registres

Base historique de la MDA : 03BCh.

Port Accès Description
3BCh R/W Data Register, huit sorties D0..D7; lecture du latch/ligne
3BDh R Status Register
3BEh R/W Control Register

Status :

Bits Description
3 /ERROR
4 SELECT
5 PAPER END / manque de papier
6 /ACKNOWLEDGE
7 BUSY avec inversion de l'interface PC; conventionnellement 1=pret
0 à 2 Valent 1 sur la carte IBM

La polarité nommée dans les documents varie entre broche électrique et valeur lue. Pour un pilote, vérifier l'état «prêt» par la convention BIOS/imprimante, pas en se fiant seulement au nom BUSY.

Contrôle :

Bits Description
0 /STROBE, sortie inversée
1 /AUTO FEED, sortie inversée
2 INITIALIZE, sortie
3 /SELECT INPUT, sortie inversée
4 IRQ Enable sur transition /ACK
5 à 7 Non définis; lecture souvent a 1 sur IBM

Le port offre douze sorties latchées (8 data+4 contrôle), cinq entrées d'état et IRQ7. Il peut servir d'Entrée/Sortie générale si les niveaux TTL, courants et directions sont respectes.

DB-25 femelle

Broches Description
1 /STROBE
2 à 9 DATA 0 à 7
10 /ACK
11 BUSY
12 PAPER END
13 SELECT
14 /AUTO FEED
15 /ERROR
16 /INITIALIZE selon interface/câblage
17 /SELECT INPUT
18..25 masses

Le câble IBM transforme ce DB-25 en connecteur Centronics de l'imprimante.

BIOS imprimante INT 17h

Registre/Valeur Description
AH=00h Imprimer AL; retourne état dans AH
AH=01h Initialiser imprimante
AH=02h Lire état
DX=0 LPT1, DX=1 LPT2,...

La BDA contient les adresses de base LPT à 0040:0008h et suivantes, ainsi que les dépassements de délais à 0040:0078h. Ne pas supposer que LPT1 vaut toujours 3BCh : une autre carte peut être énumérée avant ou la configuration BIOS peut différer.

Programmation de l'imprimante

Séquence d'interrogation simplifiée :

  1. attendre que l'imprimante soit prête et sans erreur;
  2. écrire l'octet a 3BCh;
  3. activer /STROBE en mettant a 1 le bit 0 du latch (sortie inversee);
  4. respecter la largeur minimale;
  5. relâcher /STROBE en remettant le bit 0 a zéro;
  6. attendre /ACK ou la disponibilité suivante.

Conserver les autres bits du Control Register. Une paire OUT trop rapide peut produire une impulsion hors spécification; le temps des instructions 8088 originales suffisait souvent, mais une machine rapide exige un délai ou BIOS.

Avec IRQ active, /ACK peut déclencher IRQ7/INT 0Fh sur le PC original. Le gestionnaire doit identifier la source, acquitter le PIC, préserver les registres et tenir compte d'autres périphériques partageant IRQ7. Ne jamais activer une IRQ sans gestionnaire installe.

Les sorties du port ne doivent pas alimenter directement une charge importante.

Employer des tampons/optocoupleurs pour une interface non imprimante.

Détection de la MDA

BIOS

INT 11h renvoie le mot d'équipement. Les bits vidéo historiques indiquent une configuration monochrome 80x25. BDA 0040:0063=03B4h et INT 10h/AH=0Fh mode 07h confirment qu'une interface monochrome est active.

Cela ne distingue pas MDA IBM, Hercules, EGA/VGA en mode monochrome, 3270 PC ou un chipset émule.

Observation du statut

Lire 3BAh de nombreuses fois avec un dépassement de délai et rechercher les transitions bit 0. Sur IBM MDA, bits 7..4 restent a 1 et 2..1 a 0. Ne pas écrire bit0=0 a 3B8h pour tester le matériel. Ne pas modifier la RAM visible sans la sauvegarder.

Une Hercules retourne typiquement un signal vertical/ID dans les bits hauts, mais il faut d'abord vérifier que ce signal varie; un bus flottant FFh ressemble a un identifiant.

Mémoire miroir

La répétition tous les 4 Kio est un indice IBM MDA. Un test destructif doit être fait affichage coupe, contenu sauvegarde, et uniquement après detection. Une carte clone peut reproduire le miroir; ce n'est pas une signature unique.

Programmation

Pour détecter une carte MDA (Monochrome Display Adapter) en Turbo Pascal, il est possible d'interroger les ports d'entrées/sorties et les interruptions utilisés par cette carte. Le principe général est d'accéder à certains registres spécifiques pour vérifier la présence et le type d'adaptateur vidéo installé dans le système.

La carte MDA utilise une adresse spécifique pour ses registres de contrôle vidéo, notamment les ports 3B4h et 3B5h pour le contrôleur 6845 (utilisé pour gérer l'affichage en mode texte). La détection consiste à vérifier si ces ports répondent correctement.

Voici une méthode simple pour détecter une carte MDA :

  1. Program DetectMDA;
  2.  
  3. Uses
  4.  Crt;
  5.  
  6. Function IsMDA:Boolean;
  7. Var
  8.  OldValue,TestValue:Byte;
  9. Begin
  10.  IsMDA:=False;
  11.  OldValue:=Port[$3B4]; { Lire la valeur actuelle du registre d'index du 6845 }
  12.   { Tester en écrivant puis en relisant une valeur dans le registre d'index }
  13.  Port[$3B4]:=$0F;  { Écrire une valeur de test }
  14.  TestValue:=Port[$3B4];
  15.   { Si la carte MDA est présente, elle devrait répondre avec la même valeur qu'on lui a envoyée }
  16.  If TestValue=$0F Then IsMDA:=True;
  17.   { Restaurer la valeur originale }
  18.  Port[$3B4]:=OldValue;
  19. End;
  20.  
  21. BEGIN
  22.  If IsMDA Then WriteLn('Carte MDA détectée.')
  23.           Else Writeln('Carte MDA non détectée.');
  24. END.

Le port $3B4 est utilisé par la carte MDA pour contrôler le 6845, un circuit utilisé pour la gestion de l'affichage en mode texte. Ce registre d'index permet d'adresser différents registres internes du 6845. Ensuite, lors du test de lecture et d'écriture, le programme lit d'abord la valeur actuelle du port 3B4h, puis écrit une valeur de test ($0F). Enfin, il relit le port pour vérifier si la valeur est la même que celle envoyée. Si c'est le cas, cela indique probablement la présence d'une carte MDA.

Finalement, lors de la restauration de l'état, après avoir fait le test, la valeur initiale du port est restaurée pour ne pas perturber le fonctionnement de la carte si elle est effectivement présente.

Cette méthode ne détecte que la MDA et pas d'autres types de cartes vidéo (comme CGA, EGA, VGA,...). D'autres tests peuvent être réalisés, comme lire les zones mémoire spécifiques à la MDA (segment B000h), mais cela est souvent inutile si les ports d'entrées/sorties sont correctement testés.

La carte MDA utilise un segment mémoire spécifique pour entreposer le contenu de l'écran texte, à l'adresse B000:0000h. Vous pouvez aussi lire ou écrire dans cette mémoire pour vérifier que l'adaptateur fonctionne correctement, mais c'est généralement plus complexe.

Coexistence avec CGA/EGA/VGA

MDA utilise B0000h et 3Bxh; CGA utilise B8000h et 3Dxh. Elles pouvaient donc coexister pour un système a deux moniteurs. Le BIOS choisit l'adaptateur primaire selon les commutateurs de la carte mère et la configuration.

Un programme peut écrire directement sur l'adaptateur secondaire sans changer le BIOS, mais doit initialiser correctement les deux cartes. IBM avertit que chaque adaptateur et moniteur doit recevoir ses timings corrects après réinitialisation.

EGA/VGA peuvent sélectionner le groupe 3Bx et cartographier B000h. Une vraie MDA présente en même temps créerait un conflit si les deux décodent ces ressources.

Configurer les cartes pour éviter le chevauchement.

MODE MONO/CO80 du DOS et certains BIOS permettent de commuter l'adaptateur logique, mais le comportement dépend de la machine. Sauvegarder mode, CRTC et BDA.

Exemples assembleur 8086 (MASM/TASM)

Passer en mode MDA par BIOS

  1. MOV AX,0007h
  2. INT 10h

Écrire une cellule directement

  1. ; Ecrit 'A' brillant en (10,3).
  2.         MOV AX,0B000h
  3.         MOV ES,AX
  4.         MOV DI,3
  5.         MOV AX,80
  6.         MUL DI
  7.         ADD AX,10
  8.         SHL AX,1
  9.         MOV DI,AX
  10.         MOV AX,0F41h           ; AH=attribut, AL='A'
  11.         MOV ES:[DI],AX

Effacer l'écran

  1. MOV AX,0B000h
  2. MOV ES,AX
  3. XOR DI,DI
  4. MOV AX,0720h           ; espace, attribut normal
  5. MOV CX,2000
  6. CLD
  7. REP STOSW

Attendre une transition horizontale avec dépassement de délai

  1.         MOV DX,03BAh
  2.         MOV CX,0FFFFh
  3. wait0:  IN  AL,DX
  4.         TEST AL,01h
  5.         JZ  got0
  6.         LOOP wait0
  7.         STC
  8.         JMP Short done
  9. got0:   MOV CX,0FFFFh
  10. wait1:  IN  AL,DX
  11.         TEST al,01h
  12.         JNZ got1
  13.         LOOP wait1
  14.         STC
  15.         JMP Short done
  16. got1:   CLC
  17. done:

Programmer le curseur CRTC

  1. ; BX = adresse cellule (ligne*80+colonne).
  2.         MOV DX,03B4h
  3.         MOV AL,0Eh
  4.         OUT DX,AL
  5.         INC DX
  6.         MOV AL,BH
  7.         OUT DX,AL
  8.         DEC DX
  9.         MOV AL,0Fh
  10.         OUT DX,AL
  11.         INC DX
  12.         MOV AL,BL
  13.         OUT DX,AL

Envoyer un octet au port parallèle

  1. ; AL=octet. Exemple pedagogique; ajouter timeout/statut pour production.
  2.         MOV DX,03BCh
  3.         OUT DX,AL
  4.         MOV DX,03BEh
  5.         IN  AL,DX              ; copie du latch controle sur IBM
  6.         OR  AL,01h             ; bit latch=1 -> broche /STROBE basse
  7.         OUT DX,AL
  8.         NOP
  9.         NOP
  10.         AND AL,0FEh            ; relacher /STROBE
  11.         OUT DX,AL

Employer INT 17h pour la portabilité et déterminer la base via BDA.

Exemples Turbo Pascal 6/7

Mode et cellule

  1. Program MDADemo;
  2. Uses Dos, Crt;
  3. Var R:Registers; O:Word;
  4. BEGIN
  5.  R.AX:=$0007; Intr($10,R);
  6.  O:=2*(3*80+10);
  7.  Mem[$B000:O]:=Ord('A');
  8.  Mem[$B000:O+1]:=$0F;
  9.  ReadKey
  10. END.

Afficher une chaine directement

  1. Procedure MDAWrite(X,Y:Byte; const S:String; Attr:Byte);
  2. Var I:Byte; O:Word;
  3. Begin
  4.   if (X>=80) or (Y>=25) then Exit;
  5.   O:=2*(Word(Y)*80+X);
  6.   For I:=1 to Length(S) do Begin
  7.     if X+I-1>=80 then Exit;
  8.     Mem[$B000:O]:=Ord(S[I]);
  9.     Mem[$B000:O+1]:=Attr;
  10.     Inc(O,2)
  11.   End
  12. End;

Écrire un registre CRTC

  1. Procedure SetCRTC(Index,Value:Byte);Begin
  2.  Port[$3B4]:=Index;
  3.  Port[$3B5]:=Value
  4. End;

Initialisation directe prudente

  1. Const MDARegs:array[0..15] of Byte =
  2.   ($61,$50,$52,$0F,$19,$06,$19,$19,
  3.    $02,$0D,$0B,$0C,$00,$00,$00,$00);
  4. Var I:Byte;
  5. Begin
  6.   Port[$3B8]:=$01;            { premiere ecriture : horloge haute }
  7.   Port[$3B8]:=$21;            { video coupee, high-res+blink conserves }
  8.   for I:=0 to 15 do SetCRTC(I,MDARegs[I]);
  9.   Port[$3B8]:=$29             { video active }
  10. End;

Sur matériel réel, préférer BIOS. Une interruption vidéo pendant la table peut modifier les mêmes registres; protéger la séquence courte si nécessaire.

Impression BIOS

  1. Function PrintChar(C:Char):Byte;
  2. Var R:Registers;
  3. Begin
  4.   R.AH:=0; R.AL:=Ord(C); R.DX:=0;
  5.   Intr($17,R);
  6.   PrintChar:=R.AH
  7. End;

Décoder AH selon la référence INT 17h : timeout, error, selected, paper out, acknowledge et busy ont des polarités historiques.

Absence de mode graphique IBM MDA

Il est impossible sur la MDA originale de faire :

  1. PutPixel(x,y,couleur)

en adressant un bitmap. La RAM contient uniquement codes de caractères et attributs. Le MC6845 génère des adresses, mais la logique MDA passe toujours par la ROM de glyphes.

On peut simuler du pseudo-graphique avec les caractères CP437 : blocs pleins, demi-blocs, hachures et cadres. La granularité reste une cellule/glyphe fixe et la police de caractères ne peut pas être chargée.

Les affirmations suivantes ne décrivent pas IBM MDA :

Ce sont des caractéristiques Hercules ou compatibles.



Dernière mise à jour : Dimanche, le 10 septembre 2017