video modes & setpixel



  • re: 😉

    also bei mir im tut steht, dass der interrupt 10h in BIOS enthalten ist, der für das wechseln des grafikmodus zuständig ist, damit wird ja direkt die grafikkarte angesprochen ... aber wenns im bios is, dann müsst es eigentlich auch ohne os laufen oder ? also ohne z.b. msdos bereits gebootet zu haben mein ich...
    ich könnte dann eigentlich hergehen und ein bootfähiges programm schreiben in dem der mode13 per int 10h angesprungen wird, irgendwelche pixel noch setzen und dann beim booten von der diskette müsst er dann eigentlich das programm richtig ausführen oder ?

    ahja und nochwas:
    welche modes gibts denn alles, kann ich vom bios aus auch einen 16bit farben modus anspringen lassen mit 1024 auflösung oder so ?

    ahja und nochwas 😉
    wie kommen eigentlich die informationen zur grafikkarte, wenn ich die pixelkoordinaten in meine register hineinsetz..?
    also:

    mov ax, 0a000h
    push ax     
    pop es      
    
    mov ax, 100     ; YPosition des Pixels
    mov bx, 320
    mul bx
    add ax, 160     ; XPosition des Pixels
    mov di, ax      ; nun steht die Vollständige Pixeladresse in ES:DI
    
    mov ax, 200     ; die Pixelfarbe muß ja auch die Grafikkarte wissen
    stosb
    

    also ich mein jetz konkret, wie greift die grafikkarte auf die informationen zu, die in ES:DI steht ?
    was ich halt net versteh is die anweisung pop es und push ax ?
    irgendwie muss ja der prozessor der grafikkarte am ende sagen, "hallo graka ..,
    schau mal in mein es:di rein und setze n pixel an der stelle !"
    ich mein die graka macht das ja net automatisch...

    oder wie geht das ?

    mfg haMMer



  • Moin, Moin...

    1. Dein Vermutung, dass Du den BIOS-Interrupt 10h ohne OS nutzen kannst, ist korrekt. Du könntest also ein kleines Bootprogramm schreiben, das einen Grafikmodus einschaltet und irgendwelche Grafiken ausgibt.

    2. Die Grafikkarte greift NICHT auf die Register der CPU zu. Die Asm-Routine(also die CPU) setzt die Pixel in dem Grafikspeicher. Der Inhalt des Grafikspeichers wird regelmäßig von der Graka angezeigt. Wer wann was in dem Grafikspeicher ändert, ist der Graka völlig egal. Sie zeigt nur den Inhalt an.

    3. Zu der Frage bezüglich push ax, pop es: Zuerst wird in das Register ax die Segmentadresse des Grafikspeichers geschrieben(mov ax, a000h). Der Inhalt von ax wird dann auf den Stack gelegt(push ax). Anschließend wird dieser Wert wieder vom Stack geholt und ins Register es abgelegt(pop es). Diese drei Zeilen könnte man auch durch folgendes ersetzen:

    mov ax, 0A000h
    mov es, ax
    

    Der Grund liegt darin, dass die Segmentregister nicht direkt mit Konstanten beschrieben werden können. Also mov es, 0A000h ist VERBOTEN. Also muss man einen kleinen Umweg gehen.

    Ciao...

    [ Dieser Beitrag wurde am 05.04.2003 um 20:31 Uhr von Kal El editiert. ]



  • Hi.

    Stichwort zu hohe Grafikaufloesungen ohne OS ist VESA. Damit lassen sich so ziemlich alle Modi, die deine Graka hergibt einschalten (ausser 3DModi)
    Einfach mal nach googlen oder nen Blick in Ralf Browns Interrupt Liste werfen.
    (VESA-Funktionen lassen sich ueber int 10h; ah=4Fh aufrufen...)



  • "3D-Modi" gibt es in der Form nicht, das sind auch nur normale Grafikmodi!



  • @Kal El:

    und was ist dann letztendlich der auslöser dafür, dass die cpu den koordinatenwert in den speicher von der graka schiebt ?
    'stosb' ??
    für was steht das stosb ?

    ausserdem hab ich grad woanders gelesen, dass das segment A000H im RAM is, also werden die pixeldaten im RAM abgelegt ? ich dachte das käme direkt in den grafikkartenspeicher .. ?

    [ Dieser Beitrag wurde am 06.04.2003 um 21:30 Uhr von Hammer editiert. ]



  • stosb = mov es:[di],al

    ja der VGA grafikspeicher liegt im RAM und wird wie Kal El schon gesagt hatte ständig von der grafikkarte ausgelesen. insgesamt sind es 256k.



  • @Hammer:

    Der Grafikspeicher wird in den Adressraum der CPU eingeblendet. Im Realmode(unter DOS) stehen daher immer nur 64 KByte Speicher zur Verfügung. Nutzt man einen Videomodus, der mehr Speicher benötigt(z.B. die hochauflösenden VESA-Modi), muss man mit Zugriffsfenster arbeiten. Das bedeutet, dass man immer nur einen Ausschnitt des Grafikspeichers ansprechen kann. Die Entscheidung, das der Grafikspeicher eingeblendet wird, traf IBM damals, in der guten alten Zeit, als der PC konzipiert wurde. Es gibt auch Computer, die den normalen CPU-Speicher(bzw. einen Teil) als Grafikspeicher nutzen(z.B. Amiga).

    stosb gehört zu den Stringbefehlen. Diese Befehle nutzen die Register di und si. Man muss also nicht mehr im Befehl selber die Quellregister angeben. Bei stosb wird die FAR-Adresse in ES:DI geschrieben. stosb schreibt dann das Byte in al an diese Adresse. wasiliy hat ja schon eine alternative Anweisung aufgeführt, die das Gleiche erledigt. Die Stringbefehle sind nur wesentlich bequemer und mächtiger.

    Noch ein Wort zu den hochauflösenden Grafikmodi. Die Hersteller der Grafikkarten kochen da ihr eigenes Süppchen. Es gibt eine gewisse Anzahl Grafikmodi, die jede Karte unterstützt(nach dem VESA-Standard). Ob Deine Karte also einen Modus hat mit z.B. 1024 x 768 Pixel und 16 Bit Farbtiefe, musst Du selber rausfinden. Dazu gibt es eine VESA-Funktion, die Dir Informationen zu jedem verfügbaren Grafikmodus liefert.

    Eine Doku findest Du unter http://www.vesa.org

    Ciao...

    [ Dieser Beitrag wurde am 07.04.2003 um 07:44 Uhr von Kal El editiert. ]



  • Original erstellt von Kal El:
    wasiliy hat ja schon eine alternative Anweisung aufgeführt, die das Gleiche erledigt. Die Stringbefehle sind nur wesentlich bequemer und mächtiger.

    Genaugenommen stehen lodsb und stosb ja eher fuer 2 Anweisungen.
    Bei stosb z.B. einmal mov es:[di],al und dann, je nachdem, ob das df 1 oder 0 ist dec di oder inc di.

    Dass die Stringbefehle bequemer sind... Ok, aber was meinst Du genau mit "mächtiger"? Auf einem AMD z.B. ist mov es:[di],al; inc di AFAIK schneller als stosb, wegen vector path...
    Richtig Sinn machen da diese String-Instruktionen eigentlich nur mit einem "rep"-Prefix.



  • oops das inc di hab ich vergessen 🙂
    aber naja, in dieser putpixel spielt es sowieso keine rolle.



  • was ich noch fragen wollte, ob man direkt per asm code im lowlevel bereich die befehle der grafikkarte verwenden kann bzw. ob und woher man die bekommt...
    die sind ja immer vom hersteller anghängig und daher bei jeder grafikkarte verschieden...
    es gibt doch auch so spezielle befehle , mit der ich die graka direkt ansprechen kann, die mein ich

    [ Dieser Beitrag wurde am 08.04.2003 um 12:52 Uhr von Hammer editiert. ]



  • Hi.

    Die Steuercodes fuer PC-Hardware sind nur schwer zugaenglich, aus irgendeinem Grund machen die Hersteller daraus immer ein riesen Geheimnis... (Ich schaetze mal einfach Geschaeftemacherei... 🙄 )
    IMHO kommst Du am schnellsten und billigsten an die Infos, indem Du z.B. den Code hinterm int 10h disassemblierst.



  • hmm, wie würde man den das ganze in 32 bit umwandeln, sodass mein os nich mehr meckert " aah 16 bit appl" ?
    hab da was von eax usw gehört, aber im 32 bit modus ändert sich ja auch die adresszuordnung usw. bzw. das mit den segmenten, bleibt das alles gleich ?

    der int 10h müsste doch auch im 32 bit gehen oder ?

    ich finde nur basic asm tuts im 16 bit bereich... aber nirgends wird mir 32 bit erklärt... und wenn ich was mit 32 bit finde, dann isses meistens zu speziell

    kann mir jemand helfen oder ein einsteiger tut geben, indem auch 32 bit behandelt wird ? naja ich will ja auch mal win32 console appl. mit asm coden ..



  • Soweit ich weiß darfst Du unter Windows überhaupt garkeine BIOS-Interrupts aufrufen.



  • Ja, sofern es um eine 32-Bit-Windows-anwendung geht. Das gleiche gilt für Linux-Anwendungen. Beide müssen die vom System freigegebene API benutzen um grafik zu malen (WinAPI bzw. GTK etc.).



  • @Hammer:

    Der VESA-Standard bietet auch ein Protected-Mode-Interface an. Die VESA-Funktionen sind ab Version 2.x auch im Protected Mode(16 und 32 Bit) vorhanden. Ich habe damit allerdings noch nicht gearbeitet. So kann ich Dich wieder nur auf die Dokumentation verweisen. http://www.vesa.org Rechts unter dem Menupunkt 'Free Standards' findest Du den Eintrag 'VBE 3.0 (BIOS Ext.)'.

    Ciao...



  • ich würde mal vorschlagen: wenn du unbedingt in asm die graka ansprechen willst, mach dies mit einem 16bit Programm, dann kannste die mächtigen INT nutzen. Sogar den Mode_x (undokumentiert)256 Colors bei 4Pages und dennoch nur 256K GrakaRam.
    Andernfalls, soll es unbedingt 32bit sein, nimm doch eine Hochsprache C++, denn dort gibt es viele Libraries dazu. Ich sage nur SDL oder ähnliches.



  • ich dachte halt nur, wenn schon alles 32 bit is, warum nich gleich 32 bit verwenden und sich mit 32bit vertraut machen was asm angeht...
    wenn ich mal später was unter win9x oder linux machen will, komm ich eh nich an 32 bit vorbei, und schon gar nich wenn ich zb inline asm code in ein c++ programm implementieren will, was ja auch ab und zu der fall ist...
    sobald ich nämlich einen interrupt ansprechen will im c++ code , compiliert er es zwar , aber beim ausführen fliegt er genau an der stelle auf die fresse...

    was 16 bit angeht, ich kann doch auch die ints verwenden und trotzdem mit 32 bit registern arbeiten oder ?



  • int und portzugriffe sind natürlich in inline_asm nicht möglich. Schau dir mal folgende demo-exe von mir(16bit asm) an: http://www.12move.de/home/ww/Hammer.zip
    kannst dir ja selber ne Meinung bilden...



  • LOOOOL!!!

    hast du das extra nur für mich geschrieben ??

    ich habs per bootdiskette beim neustart gestartet und ging einwandfrei ! 😃

    die 450 kb , is das normal ? fürn asm prog kommts mir dennoch etwas viel vor...

    oh man, da werden erinnerungen wach ... das sieht so ähnlich aus wie das zeug früher aufm amiga ...

    [ Dieser Beitrag wurde am 11.04.2003 um 13:07 Uhr von Hammer editiert. ]



  • nettes demo warewolf 🙂 und es läuft sogar unter win2k (nur so als info) 🙂


Anmelden zum Antworten