Il y a environ dix ans, j'ai obtenu les cartes vidéo ISA de 286 ... 486 machines destinées au dumping. Les cartes vidéo ont été testées et ont depuis accumulé de la poussière dans un tiroir. Il y a quelques années, j'ai pensé, mais dois-je connecter une telle carte vidéo à un microcontrôleur? C'est ce dont je vais parler dans l'article.
Pour connecter une ancienne carte vidéo ISA, un bus de données 8 bits et un bus d'adresse 20 bits suffisent. Microcontrôleurs J'adore la famille AVR pour sa simplicité, j'ai donc pris Atmega16. Mais vous pouvez prendre n'importe quelle pratique pour vous - dans ce cas, les mêmes pieds stm32 suffiront certainement sans cerclage externe. Mais l'Atmega16 n'a pas assez de pieds pour tous ces bus, donc le bus d'adresse a été assemblé dans trois autres registres parallèles soviétiques (j'en ai une grande quantité) K588IR1. Le microcontrôleur définit à son tour les parties d'adresse dans ces trois registres. Plus n'est pas nécessaire.

Sur le connecteur ISA, les sorties de ce circuit doivent être connectées comme suit:
+5,
+12,
GND
REFRESH (tiré à + 5V via une résistance),
A0-A19,
D0-D7,
RÉINITIALISER
Memw,
Memr,
IOW
IOR
Ale
RDY,
AEN (se connecte à GND).
Dans l'image en rouge, j'ai marqué les broches du connecteur ISA qui doivent être connectées.
Pour certaines cartes vidéo, vous devez connecter -5 V et -12 V (vous devez les obtenir quelque part - par exemple, à partir de sources TracoPower) et le signal OSC (14,318 MHz) - il peut être généré par le générateur le plus simple du K155LN1. Les autres cartes graphiques n'ont pas besoin de ces lignes. Ici, c'est la chance. En général, si le pied correspondant de l'ISA se bloque en l'air sur la carte vidéo, vous ne pouvez certainement pas le connecter. Gardez à l'esprit que la consommation de la carte vidéo sur la ligne + 5V est assez importante - si vous utilisez quelque chose comme LM7805 pour l'alimentation, assurez-vous de la mettre sur un radiateur (de préférence avec un ventilateur).
Personnellement, ma conception assemblée ressemble à ceci:

Il ne reste plus qu'à initialiser la carte vidéo et à commencer à travailler avec elle. Il existe des projets similaires sur Internet - j'en ai trouvé un (
lien ), où j'ai obtenu le code d'initialisation de la carte vidéo Trident 9000i. Dans le même programme à partir d'Internet, il existe un code d'initialisation pour Trident9000C, mais les commentaires indiquent qu'il ne fonctionne pas. J'ai vérifié. Cela ne fonctionne vraiment pas - à l'écran, les ordures et la carte vidéo ne répondent pas à l'écriture de données dans la RAM.
Vidéo du travail (l'image a été transmise via SPI à Atmega16 (comme vous pouvez le voir, ces lignes sont laissées libres dans le diagramme) via le port LPT de l'ordinateur):
(J'ai fait une réservation dans la vidéo - mode 320x200, pas 320x240)
En combinant ce module avec une souris optique (
article sur l'utilisation du capteur de souris ), j'ai obtenu ceci:
Si vous souhaitez exécuter une carte graphique ISA existante, vous devez pour cela trouver le BIOS de la carte graphique requise (disons
ici ) sur Internet et la démonter à l'aide d'IDA. Il existe un code X86 standard. Il ne démarre tout simplement pas à l'adresse 0 - il y a une signature (2 octets) et une somme de contrôle (1 octet). Total, vous devez commencer par le 3ème octet. Et découvrez toujours dans quels ports ce que vous devez enregistrer pour que la carte fonctionne. Franchement, je n'ai pas eu la patience de comprendre ce qui n'allait pas avec le Trident9000C.
Pour travailler avec le bus ISA, un module a été écrit:
Module pour travailler avec le bus ISA L'initialisation de la carte graphique Trident 9000i est la suivante:
Initialisation des graphiques du Trident 9000i J'ai également lancé la carte vidéo OAK OTI077 (jusqu'à ce que je lui applique accidentellement du 12 V et qu'elle brûle):
Initialisation de la carte graphique OAK OTI077 Au fait, y a-t-il des spécialistes des registres d'adaptateurs VGA ici? Je vois des choses étranges dans le code de changement de mode vidéo lors de l'initialisation de la carte vidéo:
Ici, en général, il n'y a rien de spécial. L'écriture dans les registres du contrôleur d'attributs se fait en 2 étapes: nous écrivons d'abord le numéro de registre, puis les données. Pour toujours commencer par enregistrer le numéro, lisez ISR1 (à partir de 0x03DA) - c'est comme ça.
Mais voici l'étrange chose. Le contrôleur d'attribut n'a pas de registre 0x20! Il a le dernier registre 0x14. Et même s'il y avait un tel registre, pourquoi n'y a-t-il pas d'enregistrement de valeur? Il doit y avoir deux entrées dans le port. Et la voici seule. J'ai cherché sur Internet et j'ai découvert que pour une raison quelconque (je ne l'ai pas trouvée dans les livres), vous pouvez écrire, disons, dans le registre 0x10 la valeur 0x20 à la fois en combinant simplement les bits: System_Out8 (ATTRCON_ADDR, 0x10 | 0x20); L'enregistrement spécifié écrit alors 0x20 dans le registre 0x00? Mais pourquoi ça marche? Et en est-il ainsi? C'est intéressant pour moi, c'est pourquoi - le tout est que parfois la couleur tombe après l'initialisation. La palette n'est tout simplement pas définie. On voit que ça change, mais les couleurs ne sont pas du tout ce qu'elles devraient être. Si l'initialisation est refaite, tout est restauré. À quel stade cela se produit n'est pas clair. Expérimentalement, j'ai découvert qu'avec une forte probabilité, ce n'est que l'installation du mode vidéo. Mais ce qui n’est pas exactement là, je ne comprends pas.
→
Lien vers l'archive avec le circuit imprimé
→
Lien vers l'archive avec firmware