Klar, kann ich gern tun:
Inzwischen ist die Grafikkarte fertig und voll funktionsfähig. Sie unterstützt folgende Features:
- 640x480 VGA-Auflösung mit 2 Farben (S/W)
- 80x60 Textmodus (80 Spalten, 60 Zeilen)
- Codepage 437 aus einem ROM, später auch umschaltbare Codepages (bis zu 32 CPs)
- 8x8 Pixel pro Zeichen, DOS-Font
- 32kB VRAM
- 80x256 Textpuffer, unterstützt Hardware-Scrolling (es ist ein beliebiger 60 Textzeilen langer Bereich auswählbar, der dann auf den Bildschirm ausgegeben wird)
- Random Access, die CPU muss nicht während bestimmter Zeitpunkte (z.B. Sync) auf den VRAM zugreifen, sondern kann jederzeit unbeschränkt auf dem VRAM rumschreiben, ohne Bildstörungen zu verursachen. Dabei wird kein Dual-Port-RAM verwendet.
Die Karte selbst arbeitet intern recht kompliziert, und vorallem auf einem ziemlich schnellen Timing. Das gesamte Timing orientiert sich rund um einen Zyklus von 8 Pixeln, also einem Textzeichen.
Der Bus, über den die CPU die Karte (und auch alle anderen Hardware-Karten) ansteuern kann, ist bei der Grafikkarte an einer asynchronen Register-Logik angeschlossen. Diese besteht zur Zeit aus drei Registern: Dem Hardware-ID-Register (0x01 identifiziert die Standard-Grafikkarte), dem Scrolling-Positions-Register (hier kann man die Nummer der ersten Zeile reinschreiben, die auf dem Display dargestellt werden soll, um das Hardware-Scrolling zu steuern), und dem Zeilenauswahlregister für Schreibzugriffe (hier kann man eine Zeile im VRAM auswählen, welche zum Schreiben eingeblendet werden soll). Außerdem besitzt die Karte in der oberen Hälfte ihres Adressbereichs (die obersten 128 Bytes) etwas Logik, um dort Teile des VRAMs einzublenden. Dadurch kann die CPU auf eine durch ein Register ausgewählte Zeile direkt schreiben. Ein eventueller Schreibzugriff auf den VRAM wird von einem Puffer aufgenommen und kann dann von der Karte im richtigen Moment (wenn der VRAM gerade zum Schreiben verfügbar ist) ausgeführt werden.
Die VGA-Ausgabelogik der Karte nutzt Bus-Multiplexing. Hier werden zunächst durch zwei Zählerbausteine die Pixel der Zeile gezählt, und basierend darauf die Nummer des aktuell in der Zeile auszugebenden Zeichens berechnet. Nach 640 Pixeln wird die Schwarzschulter- und HSync-Logik aktiviert, und nach 800 Pixeln der Zähler zurückgesetzt und ein Signal zum Weiterschalten der Zeile erzeugt. Das Zählen der Zeilen wird von einem Mikrocontroller übernommen, der auch gleich das Hardware-Scrolling übernimmt, indem beim Start des Bildes der Wert im Scrolling-Register als Startwert des Zählers genommen wird. Der Controller generiert außerdem die vertikalen Schwarzschultern und das VSync-Signal.
Ein weiterer Mikrocontroller (ATTiny24 auf Pixeltakt 25,175MHz) generiert die Steuersignale für den internen 8-Pixel-Zyklus der Karte. Jedes Pixel dauert knapp 40ns. Während des ersten Pixels werden Bus-Treiber aktiviert, welche die Daten und die Adresse des VRAM-Schreib-Puffers an den VRAM anlegen. Sind gültige Daten vorhanden (das Data-Present-Flipflop gesetzt), wird dem VRAM beim zweiten Pixel ein Schreib-Befehl gegeben und die Daten geschrieben. Beim dritten Pixel wird das Data-Present-Flipflop wieder zurückgesetzt. Sobald das vierte Pixel beginnt, schaltet der Controller die Bustreiber für die interne Adresse an und die anderen Bustreiber wieder aus. Dadurch werden Zeilen- und Spaltennummer des aktuellen Zeichens als Adresse auf den VRAM gegeben. Dem VRAM wird ein Read-Befehl gegeben und der ASCII-Code des Zeichens ausgelesen. Dieser ASCII-Code wird noch im selben Zeitpunkt dann auf das Schriftart-ROM gegeben. Während dem 5. und 6. Pixel wartet die Karte darauf, dass das langsame Schriftart-ROM die Pixeldaten ausliest. Genau am Ende des 7. Pixels werden dann schließlich die neuen Pixeldaten (1 Byte, also 8 Pixel) in ein Schieberegister geladen und der Zugriff auf das VRAM beendet. Während das Schieberegister dann die 8 Pixel ausgibt, beginnt die Karte schonmal damit, im nächsten Zyklus die nächsten 8 Pixel zu laden.
Die Karte wurde mit 74HC-Gattern aufgebaut, also mit Logikgattern ohne besonders hohe Geschwindigkeit.
Und zum Abschluss noch ein paar Fotos von der funktionierenden Karte:
https://www.dropbox.com/s/9ou4emzv0mjy3g7/IMG_20140706_193439.jpghttps://www.dropbox.com/s/zick2o9gw7760hi/IMG_20140706_193255.jpghttps://www.dropbox.com/s/l4gy1vm6cdgneo0/IMG_20140707_220735.jpghttps://www.dropbox.com/s/kq521cfxrwchfqa/IMG_20140708_185714.jpg1. Bild: Fertige Karte (Bestückungsseite)
2. Bild: Fertige Karte, eingesteckt in einen Slot des Eigenbau-Systems
3. Bild: CPU schreibt Testdaten in den VRAM, wird erfolgreich ausgegeben
4. Bild: Die holprigen Anfänge eines BIOS...
Gruß
Jonathan