OUT ?, ?



  • Hm, hast recht; Wir sollten schnell wieder auf Assembler zurück kommen.

    Vielleicht mal was zur Soundkarte? Weisst du auch, wie es da mit den Registern aussieht?



  • Die meissten heutigen Onboard- und PCI-Soundkarten sind mit dem Soundblaster leider nicht mehr kompatibel. Es gibt zwar DOS-Treiber, die dann den Soundblaste emulieren, verlass dich darauf aber nicht. Die Programmierung ist damit also ziehmlich sinnlos!! 😞

    Es sei denn ...



  • Schade eigentlich. Dann wird das wohl heutzutage alles über DirectPlay geregelt? Das funzt nur so schlecht unter DOS 😞

    Vielleich nochmal zu Vesa-Mode?

    Was ich noch nicht ganz verstanden habe, ist die übergabe der Pixel an des Bildschirm.

    Man aktiviert also den Screenmode 0x12 und setzt das es auf 0xa000. Aber wie funktioniert das eigentliche Pixelmalen. 2 Pixel pro byte -> dann muss das ja umgerechnet werden und wenn ich eigentlich einen Pixel malen will, muss ich gleich zwei rendern (einen dann in der Farbe des Pixels, der schon dort war).
    So stelle ich mir das vor... Aber das macht wohl keinen Sinn ?!?

    Ich habe ein Programm von mir, dass eigentlich Mode 0x13 hat einfach auf 0x12 geändert - sah lustig aus 😡



  • Bei Sound DirectSound, bei Grafik DirectDraw/3D usw.

    Ihr benutzt ja SDL, so wie ich das gesehen hab!

    Ist ja auch logisch das das lustig aussieht, Mode 12 sind 16 Farben. Der Speicher wird dabei ganz anders ausgelesen !

    Im normalen 0x013 Mode geht Pixel setzen in C so:
    pixel = (char far )0xA0000000 + (y320) + x;
    pixel[0] = color;



  • Ähm, moment mal!

    Wen meinst du mit "ihr". Und wie kommst du auf SDL. Hab ich dir irgendwann meine Homepage gesagt 🙄 Kein Kommentar zu dem Datum

    Aber, ja - wir benutzen SDL. Es war nicht meine Entscheidung, da ich persönlich mehr auf pure OpenGL Grafik stehe. Und Direct X kannst du (was das Rendering betrifft) vergessen. Dann doch lieber Pixel mit int 10h in einem Dos-Fenster setzen 😉

    Dieser Beitrag hat natürlich nichts mit unserem Projekt zu tun. Ich interessiere mich für alte Spiele wie eben z.B. auf dem Nintendo oder DOS.

    Aber wie du von Project: SpaceBar erfahren hast, musst du mir nochmal genau erklären *ggg*



  • Klicke mal bei deinen Beiträgen rechts neben Datum und Uhrzeit das erste Icon an!!

    Ach ja besser direkt in den Speicher als mit int 0x10 :o

    [ Dieser Beitrag wurde am 17.10.2002 um 16:45 Uhr von agrimm editiert. ]



  • Original erstellt von agrimm:
    **Klicke mal bei deinen Beiträgen rechts neben Datum und Uhrzeit das erste Icon an!!
    **

    Argh! 😃

    [QB}

    Ach ja besser direkt in den Speicher als mit int 0x10 :o
    [/QB]

    Das meine ich ja -> besser int 10 als Direct X 😉 Direct X hängt manchmal hinterher. Ist aber nicht wirklich langsamer als int 10h 🙂

    Ich hoffe, dass mit dem Kommentar klappt jetzt ohne weiteres.

    Also, wie man in 13h Pixel malt, weiss ich. Aber was ist in 12h? Und ich verstehe ehrlich gesagt nicht, was es bringt, wenn man 4 Seiten für die Grafik benutzen kann (Mode X). Das verlangsamt doch höchstens noch das Rendering.

    Ich muss jetzt leider weg; also nicht wundern, wenn ich länger nicht antworte.

    Danke nochmal
    - healscar



  • Willst du ein 16 Farben Spiel programmieren ?

    Na ja bitte, ich hab die Details nicht mehr ganz im Kopf aber:
    Im mode 0x012 (640x480x4bpp) braucht man 4 Bildschirmseiten.

    In jedem Byte einer Bildschirmseite sind nun Daten über 8 (?, wie gesagt die Details hab ich nicht mehr ganz im Kopf 😞 ) Pixel gespeichert. Auf der ersten Seite das erste Bit, auf der zweiten das Zweite Bit und so fort. Um ein Pixel zu setzen, musst du nun das erste Bit auf die erste Seite schreiben, dann auf die zweite Plane schalten, das zweite Bit setzen usw. Also fast wie in ModeX.

    Die 4 Seiten nutzen schon was, Beispielsweise für Scrolling, das kannst du in ModeX dann ohne umkopieren erledigen!!



  • Oh, ich dachte 16 Bit! Welcher Mode ist denn sonst noch empfehlenswert? Ich denke keiner ist so einfach wie der 13h oder?

    Wie kommt es eigentlich, dass die Grafikkarte sich angesprochen fühlt, wenn man im RAM etwas zwischen a000h und aFFFh speichert? Werden die Pixel nicht in den Grafikkartenspeicher geladen?

    Vielleicht sollte ich mir einfach nochmal ein Tutorial über diese Segmente (z.B. es) durchlesen?!?

    Gruß
    - healscar



  • Der Grafikkartenspeicher wird hier so aehnlich, wie die I/O-Ports der Hardware im Nintendo in z.B. den Speicherbereich A0000h gemapt. Wenn Du da reinschreibst, gehen die Daten halt nicht an den normalen Speicher, sondern an die Grafikkarte.

    Sowas gibt es aber nicht nur bei Grafikkarten, sondern auch bei vielen anderen PCI-Steckkarten etc.

    Und: Die Grafikmodi ab 8Bit sind eigentlich alle einfach zu handhaben... Das dumme am 4Bit-Modus ist schliesslich nur, dass man 2 Pixel auf ein Byte quetschen muss.
    Bei den Modi ab 16Bit gibt es lediglich keine Palette mehr, wie bei den 8Bit-Modi... Jetzt werden direkt die Werte fuer Rot, Gruen und Blau in den Speicher geschrieben. Am einfachsten ist das natuerlich bei 24Bit, da steht je ein Byte fuer den Rot, Gruen und Blau-Anteil 😉
    Problem bei diesen hoeheren Modi ist aber, dass Sie nicht mehr zum eigentlichen VGA-Standard gehoeren und Du sie ohne VESA nicht mehr ueber den Speicherbereich A0000h steuern kannst.

    BTW: Was soll "es" fuer ein "Segment" sein? Falls Du den Segmentregister ES meinst, der kann lediglich auf ein Segment zeigen.

    [ Dieser Beitrag wurde am 18.10.2002 um 08:52 Uhr von Nobuo T editiert. ]



  • Aah! Das erklärt natürlich einiges 🙂

    Könnte vielleicht jemand mal nen kurzen source schreiben, der erklärt, wie man in einigen modis pixel in den Speicher schreibt?

    Danke!
    - healscar



  • Ich glaube ohne ein gewisses Vorwissen ueber VESA geht das nicht so einfach.
    Schau dir z.B. mal dieses Tutorial an: VESA BIOS

    Ansonsten berechnet sich die Position der Pixel im Videospeicher eigentlich immer wie folgt:

    (Y*X_Aufloesung+X)*(BitsPerPixel/8)

    [ Dieser Beitrag wurde am 18.10.2002 um 19:33 Uhr von Nobuo T editiert. ]



  • 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;
    }
    

Anmelden zum Antworten