Vor ungefähr zehn Jahren bekam ich die ISA-Grafikkarten von 286 ... 486 Maschinen zum Dumping. Grafikkarten wurden getestet und haben sich seitdem in einer Schublade verstaubt. Vor ein paar Jahren hatte ich einen Gedanken, aber sollte ich eine solche Grafikkarte an einen Mikrocontroller anschließen? Darüber werde ich in dem Artikel sprechen.
Zum Anschließen einer alten ISA-Grafikkarte reichen ein 8-Bit-Datenbus und ein 20-Bit-Adressbus aus. Mikrocontroller Ich liebe die AVR-Familie wegen ihrer Einfachheit, deshalb habe ich Atmega16 genommen. Aber Sie können alles nehmen, was für Sie bequem ist - in diesem Fall reichen die gleichen stm32-Beine definitiv ohne äußere Umreifung aus. Aber der Atmega16 hat nicht genug Beine für all diese Busse, deshalb wurde der Adressbus in drei weiteren sowjetischen Parallelregistern (ich habe einen großen Vorrat davon) K588IR1 zusammengebaut. Der Mikrocontroller setzt wiederum die Adressenteile in diesen drei Registern. Mehr ist nicht erforderlich.

Am ISA-Anschluss müssen die Ausgänge dieser Schaltung wie folgt angeschlossen werden:
+5,
+12,
GND
REFRESH (durch einen Widerstand auf +5 V gezogen),
A0-A19,
D0-D7,
RESET
Memw,
Memr,
IOW
IOR
Ale
RDY,
AEN (verbindet sich mit GND).
In der Abbildung in Rot habe ich die ISA-Anschlussstifte markiert, die angeschlossen werden müssen.
Bei einigen Grafikkarten müssen Sie -5 V und -12 V (Sie müssen sie irgendwo beziehen - zum Beispiel von TracoPower-Quellen) und das OSC-Signal (14,318 MHz) anschließen. Es kann vom einfachsten Generator auf K155LN1 erzeugt werden. Andere Grafikkarten benötigen diese Zeilen nicht. Hier ist es wie viel Glück. Wenn der entsprechende Fuß des ISA in der Luft auf der Grafikkarte hängt, können Sie ihn im Allgemeinen definitiv nicht anschließen. Beachten Sie, dass der Verbrauch der Grafikkarte auf der + 5V-Leitung sehr hoch ist. Wenn Sie etwas wie LM7805 für die Stromversorgung verwenden, stellen Sie sicher, dass Sie es an einen Kühler anschließen (vorzugsweise mit einem Lüfter).
Persönlich sieht mein zusammengesetztes Design so aus:

Das einzige, was noch übrig bleibt, ist, die Grafikkarte irgendwie zu initialisieren und damit zu arbeiten. Es gibt ähnliche Projekte im Internet - ich habe eines gefunden (
Link ), bei dem ich den Initialisierungscode für die Trident 9000i-Grafikkarte erhalten habe. Im selben Programm aus dem Internet gibt es einen Initialisierungscode für Trident9000C, aber die Kommentare zeigen an, dass es nicht funktioniert. Ich habe nachgesehen. Es funktioniert wirklich nicht - auf dem Bildschirm reagiert der Müll und die Grafikkarte nicht auf das Schreiben von Daten in den RAM.
Video der Arbeit (das Bild wurde über SPI an Atmega16 übertragen (wie Sie sehen können, sind diese Zeilen im Diagramm frei) über den LPT-Anschluss des Computers):
(Ich habe im Video reserviert - 320x200-Modus, nicht 320x240)
Durch die Kombination dieses Moduls mit einer optischen Maus (
Artikel über die Verwendung des Maussensors ) habe ich Folgendes erhalten:
Wenn Sie eine vorhandene ISA-Grafikkarte ausführen möchten, sollten Sie dazu das BIOS der erforderlichen Grafikkarte (z. B.
hier ) im Internet finden und mit IDA zerlegen. Es gibt einen regulären X86-Code. Es beginnt einfach nicht bei Adresse 0 - es gibt eine Signatur (2 Bytes) und eine Prüfsumme (1 Byte). Insgesamt müssen Sie mit dem 3. Byte beginnen. Und finden Sie immer wieder heraus, an welchen Ports Sie aufzeichnen müssen, damit die Karte funktioniert. Ehrlich gesagt hatte ich nicht die Geduld zu verstehen, was mit dem Trident9000C nicht stimmte.
Um mit dem ISA-Bus zu arbeiten, wurde ein Modul geschrieben:
Modul zum Arbeiten mit dem ISA-Bus Die Initialisierung der Trident 9000i-Grafikkarte erfolgt wie folgt:
Initialisieren von Trident 9000i-Grafiken Ich habe auch die OAK OTI077-Grafikkarte auf den Markt gebracht (bis ich versehentlich 12 V angelegt habe und sie durchgebrannt ist):
Initialisierung der OAK OTI077-Grafikkarte Gibt es hier übrigens Spezialisten für VGA-Adapterregister? Ich sehe seltsame Dinge im Videomodus, die den Code beim Initialisieren der Grafikkarte ändern:
Hier gibt es im Allgemeinen nichts Besonderes. Das Schreiben in die Register des Attribut-Controllers erfolgt in zwei Schritten: Zuerst schreiben wir die Registernummer und dann die Daten. Um immer mit der Aufzeichnung der Nummer zu beginnen, lesen Sie ISR1 (von 0x03DA) - so ist es.
Aber hier ist das Seltsame. Der Attribut-Controller hat kein 0x20-Register! Er hat das letzte Register 0x14. Und selbst wenn es ein solches Register geben würde, warum gibt es keinen Wertdatensatz? Der Port sollte zwei Einträge enthalten. Und hier ist sie allein. Ich habe im Internet gesucht und festgestellt, dass Sie aus irgendeinem Grund (ich habe dies in Büchern nicht gefunden) beispielsweise den Wert 0x20 in das Register 0x10 schreiben können, indem Sie einfach die Bits kombinieren: System_Out8 (ATTRCON_ADDR, 0x10 | 0x20); Dann schreibt der angegebene Datensatz 0x20 in das Register 0x00? Aber warum funktioniert das? Und ist das so? Das ist interessant für mich, deshalb - das Ganze ist, dass manchmal die Farbe nach der Initialisierung abfällt. Die Palette ist einfach nicht eingestellt. Es ist zu sehen, dass es sich ändert, aber die Farben sind überhaupt nicht so, wie sie sein sollten. Wenn die Initialisierung erneut durchgeführt wird, wird alles wiederhergestellt. In welchem Stadium dies geschieht, ist nicht klar. Experimentell fand ich heraus, dass dies mit hoher Wahrscheinlichkeit nur die Installation des Videomodus ist. Aber was genau nicht da ist, verstehe ich nicht.
→
Link zum Archiv mit der Leiterplatte
→
Link zum Archiv mit Firmware