OUT ?, ?



  • Hm, das verstehe ich nicht! Hier mal ein kleiner Auszug aus den Tutorial:

    Function 00h - Return SVGA Information
    You can use this function to query the graphics card about its capabilities.
    Input: AH = 4Fh
    AL = 00h
    ES:[DI] = Pointer to buffer

    Output: AX = Status
    all other registers left untouched

    The function fills a 256 byte buffer with data, pointed to by ES:[DI]. The structure of this buffer is:
    TYPE DataBuffer
    Signature 4 bytes ;
    VersionL byte ; lower Version Number
    VersionH byte ; higher Version Number
    OEMStringPtr long word ; pointer to description string
    CapableOf long word ; 32 flags of graphics card capabilities
    VidModePtr long word ; Pointer to list of available modes
    TotalMemory word ; Memory available of card
    Reserved 236 bytes ; --
    END TYPE
    *

    Demnach müsste ein Programm, dass den zur verfügung stehenden Speicher ausgibt so aus sehen:

    #include <stdio.h>
    
    int main()
    {
        short buf[256];             // buffervariable
        int stat;               // Statusvariable
    
        __asm
        {
            mov ah, 0x4f;           // parameter ?
            mov al, 0x00;           // Funktion 0
            mov es:[di], &buf[0];       // pointer zu buffer
    
            int 0x10;
    
            mov stat, ax;           // Status lesen
        }
    
        printf("%d", buf[18]);          // grafikmemory ausgeben
        return 0;
    }
    

    Ich weiss, dass ich viele Fehler gemacht habe. Versucht mir bitte so viel wie möglich im code zu verbessern.

    Ach ja, normaler weise ist doch die funktion 0x00 zum ändern der Bildschirmmodi 😕

    Danke
    - healscar



  • Jo, das stimmt nicht ganz...

    include <stdio.h>
    
    int main()
    {
        short buf[256];             // buffervariable
        int stat;               // Statusvariable
    
        __asm
        {
            mov ax,0x4F00;      //besser gleich ax setzen; ist schneller
                                //ah = Funktion 4F
                                //al = VESA-Funktion 00: Get SVGA Info
            //weiss nicht genau, aber ich glaube es zeigt schon auf buf
            //ansonsten einfach mal push ds; pop es; einsetzen.
            mov di,offset (buf);
            int 0x10;
    
            mov stat, ax;           // Status lesen
        }
    
        printf("%d", buf[18]);          // grafikmemory ausgeben
        return 0;
    }
    

    Wie vielleicht schon gesehen: Die uebergeordneten Funktionsnummern der Interrupt-Funktionen stehen immer in ah. 😉
    Hoffe das laeuft so halbwegs (hab leider keinen compiler hier um das zu testen) 🙄



  • Hm,...

    In der Zeile mit dem Offset ist angeblich ein Syntaxerror. Ich benutze Watcom als Compiler. KA ob das damit zusammen hängt.

    Was ich mich noch gefragt habe: Ist die Buffervariable überhaupt dazu geeignet, die informationen der Grafikkarte zu speichern? Ausserdem sollte int stat wohl besser long stat sein, da ich ja mit einem 16 bit compiler arbeite.

    cya
    - healscar



  • Ich habe den Fehler gefunden, als ich gerade das Thema "Texteingabe mit Bios int´s" durchgelesen habe. Ich schätze es muss heissen:

    move di, buf;
    

    Allerdings ändert das Programm den Bildmodus und gibt seltsame Zahlenwerte aus:

    -32512

    199
    *** NULL assigment detected

    -32513
    *

    cya
    - healscar



  • Das komische Zahlen ausgegeben werden ist wohl kein Wunder, was haettest Du denn stattdessen erwartet? 😉
    Nur das der Bildschirmmodus gewechselt wird kommt mit ein bissel komisch vor... Ist das ein Grafikmodus, oder was? 😕

    Ein weiteres Problem waere, wenn deine Programme im Protected Mode laufen, dann muesstest Du schaun, wie der Extender vom Watcom-Compiler VESA unterstuetzt, oder das PM-VESA Interface benutzen.



  • Hm, ich würde trotzdem mal gerne so ein Programm schreibe, dass auch funktioniert. Also 00h im Register al und int 10h wechselt auf jeden Fall immer den Bildschirmmodus. Irgendwas stimmt da aber nicht. Als ich das Prog noch nicht ganz fertig hatte und mal einen Probelauf gemacht habe, wechselte der Bildschirmmodus nicht!

    WER WEISS, WIE DAS PROGRAMM FUNKTIONIERT / BZW. NICHT 😡 FUNKTIONIERT???

    Danke vorab!
    - healscar



  • Nochmal: Die Funktion des VGA-BIOS wird mit ah und nicht mit al gewaehlt.
    Ein Aufruf des int 10h mit al=00h koennte alles moegliche bewirken, je nachdem, was in ah steht 😉

    (Falls Du mir nicht glaubst: Ralf Brown's Interrupt List :D)



  • Hm, du meinst also, ich hätte die Werte falsch in die Register gelegt? Ich habe das mal überprüft. Jetzt macht das programm andauernd speicherüberläufe. Also, selbst wenn ich in die Register falsch eingetragen hätte, wäre das Tutorial ja auch falsch erklärt (siehe Zitat des ersten posts auf dieser Seite).

    Danke!
    - healscar

    int main()
    {
        short graffbuf[256];
        int stat;
    
        __asm
        {
            mov al, 0x4f;
            mov ah, 0x00;
            push ds;
            pop es;
            mov di, graffbuf;
            int 0x00;
        }
    
        printf("%d", graffbuf[0]); // Sollte den ersten Buchstaben von
                    // VESA zurückgeben...
        return 0;
    }
    


  • Na healscar,
    immer noch nicht gepackt?
    Wenn du unbedingt ein DOS-Spiel machen willst, benutz doch einfach
    Allegro -> http://www.talula.demon.co.uk/allegro/.
    Dann kannst du dir den ganzen internen Quatsch sparen !!

    Bis denne !



  • Es geht mir doch nicht darum ein Spiel zu programmieren! Wenn ich das wollte, würd ich OpenGL nutzen. Ich versuche lediglich meine assembler- und grafikkartenkenntnisse zu verbessern. 🕶

    Ich werde mir die Library trotzdem mal ansehen.

    Gruß
    - healscar



  • Dann sag mal an, wo man deinen compiler (watcom) runterladen kann (Falls freeware) Ich hab naemlich das Gefuehl, dass so nichts sinnvolles dabei rauskommt 🙄



  • http://www.openwatcom.org

    Soweit ich weiß, gibt's da aber nur ein Upgrade auf V11. Sie arbeiten aber an einer völlig freien Version.



  • Ich habe leider mit diesem Update kein fertiges Programm linken koennen, daher weiss ich weder mit Sicherheit, ob das Programm einwandfrei funktioniert, noch, ob es im Protected oder Real mode laeuft.

    Dieser code sollte als 16Bit DOS (am besten .com-Datei) compiliert werden.
    Beim Compilieren des Codes wurden keine Fehler angezeigt.

    #include <iostream>
    
    char VESABuff [256];
    
    int main () {
        __asm {
            mov ax,0x4F00
            mov di,offset VESABuff
            int 0x10
        };
        cout << "Vesa Buffer" << endl << VESABuff << endl;
        return (0);
    };
    

    Dieser Aufruf von int 10h mit ax=4F00 (ah=4F al=00) soll nun keinen Bildschirmmodus wechseln o.ae., sondern einfach den 256 Byte grossen Puffer auf den es:di zeigt mit sinnvollen Daten fuellen.

    Zum Besseren verstaendnis der VESA/VGA-BIOS Funktionen ueber int 10h kann ich dir sonst nur dringend empfehlen einmal Ralf Browns Interrupt Liste genauer zu studieren.


Anmelden zum Antworten