800x600x1 Bit auf MCGA/VGA?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Brueggi

800x600x1 Bit auf MCGA/VGA?

Beitrag von Brueggi »

Weiss jemand, ob es möglich ist, den 640x480x1 MCGA Hires-Mode auf 800x600 zu ändern? Mal abgesehen davon, dass es nicht mehr mit einem uralt VGA-Monitor geht - würde sowas auf einer 256K VGA bzw. 64K MCGA gehen und wenn ja, wie?
Benutzeravatar
matze79
DOS-Gott
Beiträge: 7910
Registriert: So 9. Sep 2012, 20:48

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von matze79 »

War das nicht 640x200 @ 1Bit bei CGA ?
https://www.shadowcircuit.de - Die kleine Community rund um Retro Computing
https://www.retroianer.de
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von DOSferatu »

Ich hab mal einen 800x600, 16 Farben Mode mit reinem VGA (ohne VESA) auf meinem Monitor hingekriegt.
Wird aber wohl nicht auf jedem Moni wollen. "Moderne" Monitore mit ihrer unstandardisierten Ansteuerung (und TFT & Co sowieso) werden da wohl nicht mitmachen (schwarzschalten oder ähnliche Schutzfunktionen) Und ganz alte werden wohl irgendwie den berühmten Löffel abgeben. (Es sei denn, wir sind in der Matrix. Da gibt's keinen Löffel...)
Monochrom habe ich's noch nicht versucht.
Brueggi

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von Brueggi »

Ich habs mal (kurz) mit einem Tweak-Tool gemacht - dort habe ich mir ein paar Registerwerte von 800x600x16 Col notiert und dann den 640x480x1 aktiviert. Dann habe ich mit dem Tool die Werte für Bildbreite/Anzahl Bytes pro Zeile usw. in die Register befördert, das Ergebnis war ein gelb-grünes Streifen-Wirr-Warr. Offenbar ist das wohl doch nicht so einfach möglich, sollte aber mit gut 60K RAM-Verbrauch für ein Bild eigentlich hinhauen.
Benutzeravatar
matze79
DOS-Gott
Beiträge: 7910
Registriert: So 9. Sep 2012, 20:48

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von matze79 »

Wie kommst du auf 60Kb Ram ? :O meine CGA Karte hat grad mal 16Kb.
https://www.shadowcircuit.de - Die kleine Community rund um Retro Computing
https://www.retroianer.de
Brueggi

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von Brueggi »

Hi,

ich meine, der Video-Mode bräuchte theoretisch nur 60K und wäre damit auf einer MCGA-Karte noch möglich. Das "M" ist kein Versehen - die Rede ist nicht von CGA, sondern von MCGA. Das ist quasi eine abgespeckte VGA-Karte mit, soweit ich weiss, 64K Video-RAM (eingesetzt in einigen PS/2-PCs). Die kann 320x200x256 col, aber auch 640x480 bei 2 Farben.

Selbstredend, dass VGA ebenfalls den MCGA-Hires (640x480x1) Modus kennt. Irgendeine Karte (Tseng?) kennt sogar den Mode $59 - also 800x600x1. Genau sowas suche ich ja eigentlich (aber auf allen Karten).
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von wobo »

@Matze79: Brueggi meint nicht die CGA (color graphics adapters) von 1981, sondern die MCGA (memory controller gate array) von 1987. MCGA hatte 64kb und volle CGA-Kompatibilität. Zusätzlich gab es die Modi 640x480p1 und 320x200p8 (Mode $13, 256 Farben). Dieser 256-Farbenmode führte dann auch dazu, dass die MCGA im allgemeinen Sprachgebrauch in "Fachzeitschriften" mit "multi color graphics adapter" ausgeschrieben wurde, obwohl das nichts mit der originalen ibm-Definition zu tun hatte. Bei VGA war es übrigens genauso. Das stand nach ibm für "video gate array", weil es - wie MCGA- eine Chipansammlung auf dem Motherboard und gerade keine Steckkarte war. Die Fachzeitschriften haben daraus "video graphics adapter" gemacht, wohl weil es besser in die Linie von CGA; EGA, PGA gepasst hat, die ja alle für "... graphics adapter" stehen.

Da IBM aus Kostengründen ab 1987 nur noch VGA-Monitore produzieren wollte (die waren billiger als die EGA-Monitore), hatte ibm die MCGA ebenfalls so designt, dass diese vorrangig an die VGA-Monitore anzuschliessen ist. MCGA ist aber nicht EGA-kompatibel, hat insbesondere keine Bitplanes. Die VGA dagegen ist eigentlich die Superversion einer EGA-Karte und ist - auch wenn die Videomodes $11 (640x480p1) und $13 (320x200p8) etwas anderes vorgaukeln - in jedem Mode um die Bitplanes herumgestrickt.

@Brueggi: 800x600p1 ist wie jeder 800x600-Mode in egal wieviel Farben ein reiner SVGA-Mode, hat also mit VGA nichts mehr zu tun. Du schreibst ja selbst, dass das auf alten VGA-Monitoren nicht mehr geht - aber bitte glaube nicht, dass es die nicht mehr gibt: ich habe (bzw. hatte bis vor ein paar Wochen) nämlich noch drei. Und denen tut es nicht so gut, wenn man sie in Modi versetzt, die sie nicht vertragen. Vor Einschalten in einen SVGA-Mode sollte man daher den User irgendwie darauf hin weisen, dass er unbedingt auch einen SVGA-Mode benötigt.. ;-) Nicht ohne Grund schalten frühere Windows - Versionen immer in einen 640x480-Mode und überlassen es der Verantwortung des Users, ob er einen höheren Mode riskieren will.

800x600 ist aber nicht nur monitormäßig ein reiner SVGA-Mode, sondern auch, was die VGA selbst anbelangt. Die VGA hat einen 25.175 und einen 28.322 Mhz-Clock. Um 800x600 in 60 Hz darzustellen brauchst Du aber schon einen 40 Mhz-Clock. Den aber hat weder die VGA noch die MCGA. Und auch die ersten SVGAs haben den nicht, weil die 800x600 nur in 56Hz darstellen konnten, was nur einen 36 Mhz-Clock benötigt.

800x600p1 ist unter allen Gesichtspunkten SVGA, also was den auf VGA per definition nicht vorhandenen hochtaktigen Clock anbelangt, was die auf VGA per definition nicht vorhandene Zeilenzahl von 600 anbelangt und vor allem was die per definition auf VGA nicht zulässige Abweichung von der Zeilen-Festfrequenz von 31.5 khz anbelangt. 800x600p1 passt nur zufällig in die 64 kb!

Wenn Du 800x600p1 nativ unterstützen willst, musst Du es wohl so wie alle damalige Software Ende der 80er machen: Der User muss im Handbuch seiner Grafikkarte kucken, ob diese einen solchen Mode unterstützt (und sich sicher sein, dass sein Monitor diesen Mode verträgt). Dann muss der User dem Programm per Hand die Modenummer mitteilen, damit das Programm den Mode einstellen kann.

Wenn Du es etwas dreckiger haben willst, dann mach es so wie ich :-): Alle16-Farben-Modi eignen sich zur monochromen Darstellung. Das heisst, wenn Du den Standard Mode 800x600/16 (planar) einstellst, dann kannst Du mit Deinen monochromen Grafikroutinen uneingeschränkt zugreifen und in schwarz-weiss zeichnen. Du mußt kein Fitzelchen Code verändern. Denn die Grundeinstellung in allen Standard 16-Farbenmodi ist, dass alle Bitplanes freigeschalten sind, d.h. jeder Zugriff auf alle vier Bitplanes syncron erfolgt. Dies hat das praktische Ergebnis, dass das Setzen eines Bits im Adressbereich $a0000-$affff dem Zeichnen mit Farbe 15 (weiss) und das Löschen eines Bits dem Zeichnen mit Farbe 0 (schwarz) entspricht.

Für 800x600p1 kannst Du mit dieser Methode also den Standard SVGA-Mode 800x600/16 mißbrauchen, der ja auf fast jeder SVGA vorhanden ist. Das Problem ist nur, dass die Videomode-Nummer auch hier nicht standardisiert ist und ein Absuchen auch nicht auf allen SVGAs funktioniert (insbesondere auf uralten; die neueren VESA 1.x-kompatiblen SVGA haben alle $6A als Modenummer, wenn ich das richtig im Kopf habe). Zur Sicherheit sollte man daher auch bei Verwendung von 800x600/16 dem User die Möglichkeit geben, die Videomode-Nummer von Hand einzustellen (und ihn darauf hinweisen, dass er einen SVGA-Monitor braucht. Das weiss nämlich oft auch die SVGA-Karte nicht).



Edit: Ups - Brueggi hat ja schon auf das MCGA geantwortet... hatte ich irgendwie verpennt, als ich meinen Text gerade gebastelt habe... :-)
Brueggi

Re: 800x600x1 Bit auf MCGA/VGA?

Beitrag von Brueggi »

Vielen Dank für die ganzen Ausführungen. :-)

Also klappt es so schonmal nicht. Die Idee mit "Schalten wir einfach alle Planes ein um Farbe 15 zu erhalten" hatte ich schon - aber wie war das mit Lesezugriffen? Ich lese dann ja immer 4 Bytes (1 Byte pro Plane)? Oder bin ich hier im Gedanken zu "Amiga-Lastig", wo ich ja im RAM 4 1-Bit Planes liegen habe?

Ich glaube ich experimentiere mal ein wenig in Pascal herum. Ich möchte natürlich schon einen Grafikmodus, der auf allen Grafikkarten (z.B. 800x600 auf SVGA) gleich ist. Das ein User in seiner Dokumentation schauen muss, um irgendwas einzustellen, ist keine gute Idee. Und eigentlich wollte ich auch vermeiden, dass ich x verschiedene Treiber schreiben muss :-) Die Zeit habe ich leider nicht (aus diesem Grund mag ich auch den Real Mode, da hier ohne PRobleme das BIOS genutzt werden kann).
Antworten