Verständnisfrage - x86 DOS/BIOS Interupt



  • Moin!

    Um Text auszugeben habe ich erst einmal folgende Möglichkeiten in Erfahrung gebracht:

    int 0x21 z.B mit Code 0x09
    int 0x10 z.B mit Code 0x0E
    (Jeweils mit Verweis auf einen string via DX- bzw SI-Register)

    Wenn ich das richtig verstanden habe, läuft int 0x21 nur wenn DOS installiert ist, da der Aufruf an ein DOS Unterprogramm weitergeleitet wird? Im Gegensatz dazu ist 0x10 im BIOS implementiert (geht also immer?) ?
    Letztlich müssen diese beiden Varianten aber doch eine gemeinsame Codebasis besitzen. Ruft das DOS Teil intern auch nur die BIOS Funktion auf, oder schreiben die auf der untersten Ebene einfach irgendwo in einen Buffer des Graka Speichers oder wie funktioniert das?
    (Das ist jetzt rein aus technischem Interesse - Habe keine speziellen Pläne dazu)



  • Also wie DOS das nun genau macht, weiß ich nicht. Aber die BIOS - Funktion steht dir, vorausgesetzt du bist im Real Mode immer zur Verfügung. Ich nehme an, dass die DOS Funktion entweder das BIOS Interrupt aufruft, oder selbst in den Grafikspeicher schreibt, und das ist garnicht so schwer: Ab 0xB800 ist der ein Bereich des Grafikspeichers in den Hauptspeicher gemappt. Dort kannst du dann für alle Bildschirmpositionen (normalerweise 25 Zeilen zu je 80 Spalten) in zwei Bytes deinen Text schreiben: Im ersten steht der ASCII Code des auszugebenden Zeichens, ins zweite kommt das Attributbyte, das Hintergrund- und Vordergrundfarbe sowie Blinken angibt.



  • Yeah, das mit 0xB800 geht sogar richtig gut und ist nicht viel aufwändiger als der Bios Interrupt 👍



  • Fuer Anwendungen, die den kompletten Bildschirm im Textmodus kontrollieren und nicht in typischer Konsolen-Manier nutzen (also z.B. Fenster und Nutzerinterfaces zeichnen im Textmodus mit hoher Zugriffsgeschwindigkeit o.Ae.), ist ein direkter Zugriff auf den Text-Buffer sehr schoen. fuer einfache Textausgabe sind die Betriebssystem- (um redirects zu unterstuetzen) oder BIOS-Funktionen (handeln wenigstens noch das Weitersetzen des Cursors, Scrollen und sind bereits fertig und ausgereift) doch evtl. praktischer.
    Fuer Betriebssysteme bastelt man sich zur Textausgabe oft genug auch selbst einen kleinen VGA-Treiber (schreibt also in den Text-Buffer), statt BIOS-Funktionen zu benutzen. Das ist aber zT. unterschiedlich geloest.



  • Danke das hat mir schonmal sehr geholfen. Nochmal was zum direkten Zugriff via 0xB800: Verschiebt sich diese Adresse bei der Umstellung des Video Modes? Unter Mode 13h (320x200 VGA) passiert hier leider nichts.
    Testcode:

    mov ax, 0xB800    ; Video Buffer
      mov es, ax  
      mov di, 0         ; Erstes Byte - oben links
      mov ax, 0x0F41    ; 'A' in weiss auf schwarz
      stosw
    


  • Dir stehen 320*200 Pixel bei 256 Farben zur Verfügung. D.h. 320*200*8 = 512.000 Bit = 64.000 Byte.

    Die Adresse dieser 64.000 Byte beginnt bei 0xA000:0x0000.



  • Öhm, das ist der Video Buffer oder? Und Text? Oder wird der im 13h "von Hand reingepixelt" ? 😕



  • Nagel auf'n Kopp. Das erledigen zB. die Teletype-Funktionen des VGA-BIOS (die DOS I/O-Funktionen koennen AFAIR auch in Grafikmodi Text ausgeben).

    Das ist schliesslich der Witz beim Text-Modus: Da wird die Schrift durch Hardwareimplementierung auf den Schirm gebracht. Dafuer braucht es fiese Hacks, um da einzelne Pixel zu setzen oder Grafiken anzuzeigen.

    In Grafikmodi kannst du die Pixel zwar setzen wie es gefaellt, dafuer musst du dich aber mit Softwareloesungen darum kuemmern, Schrift auf den Schirm zu bringen.



  • Cpp_Junky schrieb:

    Öhm, das ist der Video Buffer oder? Und Text? Oder wird der im 13h "von Hand reingepixelt" ? 😕

    Nun, wenn du diese Grafik-Modi von Hand benutzen willst, dann wirst du dich wohl darum kümmern müssen 😉


Anmelden zum Antworten