Direktes Lesen/ Schreiben des Bildschirmspeichers



  • Hallo,
    ich bin C-Neuling und möchte gerne wissen, ob und wie man unter ANSI-C dem Bildschirmspeicher direkt Werte zuweisen kann (absolute Adressen).
    Mit welchem Befehl kann man den Wert absoluter Speicheradressen auslesen?
    Ich habe nirgendwo etwas in dieser Richtug gefunden.
    Danke.



  • Gar nicht. Das hängt vom Betriebssystem ab.



  • OK, danke.
    Ich möchte mehr Kontrolle über mein System und wissen, wo das System den Bilschirmspeicher hinlegt. Das muß doch irgendwie machbar sein. 🙄
    Ansonsten:
    Was gibt es ganz allgemein für eine Möglichkeit in ANSI-C Bytes absolut adressiert zu beschreiben bzw auszulesen?
    Danke!



  • mactronic2 schrieb:

    OK, danke.
    Ich möchte mehr Kontrolle über mein System und wissen, wo das System den Bilschirmspeicher hinlegt. Das muß doch irgendwie machbar sein. 🙄

    das ist OS-abhängig (wie TyRoXx schon sagte) und hängt auch von der Hardware ab.

    mactronic2 schrieb:

    Was gibt es ganz allgemein für eine Möglichkeit in ANSI-C Bytes absolut adressiert zu beschreiben bzw auszulesen?

    wenn das nicht ginge, gäbe es keine Betriebssysteme in C. Natürlich kannst du jede beliebige Adresse ansprechen. Ob du drauf lesen und/oder schreiben kannst, ist eine andere Geschichte.

    int *p = (int*) 0xdeadbeef;
    *p = 111;
    

    wenn ich Schreibrechte auf 0xdeadbeef habe, dann wird dort die 111 gespeichert werden. Wenn nicht, dann wird in der Regel eine Exception ausgelöst, die meistens mit einem Segfault endet.



  • Danke. 🙂



  • So ganz stimmt das nicht. Der Videospeicher liegt bei 0xB8000, du kannst theoretisch dort reinschreiben und es erscheint auf dem Bildschirm, sogar in Farbe.
    Genaueres steht hier: http://www.osdever.net/bkerndev/Docs/printing.htm.
    Das Problem ist, dass sich erstens dein Betriebssystem weigern wird dich dort hinschreiben zu lassen, zweitens dass dieser Modus nur Zeichen und keine Pixel unterstützt, weshalb dein Betriebssystem in andere Grafikmodi gewechselt hat, was diesen Modus ausgeschaltet hat. Das heißt, selbst wenn du es irgendwie schaffst dort hinzuschreiben wird trotzdem nichts zu sehen sein. Wenn du selbst ein Betriebssystem schreibst kannst du das aber machen.

    Du kannst noch in Richtung Grafikkartentreiber gehen, da geht das so ähnlich, aber da habe ich keine Ahnung von. Ist auch je nach Grafikkarte und Grafikmodus anders. Deshalb versucht man auch statt direkten Zugriff zu gestatten lieber ein paar Funktionen wie "Setze Pixel mit dieser Farbe nach (x/y)" zur Verfügung zu stellen und implementiert diese dann je nach Grafikkarte, dadurch funktionieren die Programme dann mit jeder Grafikkarte.

    Vielleicht sagst du noch etwas genauer was du eigentlich willst.



  • nwp2 schrieb:

    So ganz stimmt das nicht. Der Videospeicher liegt bei 0xB8000, du kannst theoretisch dort reinschreiben und es erscheint auf dem Bildschirm, sogar in Farbe.
    Genaueres steht hier: http://www.osdever.net/bkerndev/Docs/printing.htm.
    Das Problem ist, dass sich erstens dein Betriebssystem weigern wird dich dort hinschreiben zu lassen, zweitens dass dieser Modus nur Zeichen und keine Pixel unterstützt, weshalb dein Betriebssystem in andere Grafikmodi gewechselt hat, was diesen Modus ausgeschaltet hat. Das heißt, selbst wenn du es irgendwie schaffst dort hinzuschreiben wird trotzdem nichts zu sehen sein. Wenn du selbst ein Betriebssystem schreibst kannst du das aber machen.

    Du sagst, dass das nicht so ganz stimmt, aber dann erklärst du (ok, ausführlicher) das, was wir bereits gesagt haben 😉 :
    - es hängt vom OS und Hardware ab
    - grundsätzlich möglich, falls Adresse bekannt. Ob's funktioniert hängt wieder vom OS ab 🕶



  • (außerdem funktioniert das nur im Realmode. Also schonmal auf keinem modernen Betriebssystem. Heutzutage ist das ansprechen der Grafikhardware deutlich komplizierter und sollte man am besten nur über den Treiber erledigen. Hier ist zB der Code des X11 ATI-Treibers: http://cgit.freedesktop.org/xorg/driver/xf86-video-ati/tree/src Wenn man wirklich meint, direkt mit der Hardware kommunizieren zu wollen :))



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Interessant, danke.
    Ich möchte einfach den PC ein bischen besser kennen lernen und etwas rumspielen.
    Mein System läuft unter Ubuntu Karmic Koala.
    Vielleicht finde ich zum Auslesen ein entspr. Programm. Ich habe so etwas früher mal für den Atari ST gesehen, ein Programm, mit dem Du Kolonnenweise die Bytes anzeigen lassen konntest. War sehr hilfreich für versch. Experimente.

    Unter BASCIC gab's außerdem dieses nette PEEK und POKE (lang, lang ist's her). 🙂



  • Am besten schaust du dir vermutlich die SDL an. Damit kann man recht einfach Grafiken auf den Bildschirm zaubern.



  • rüdiger schrieb:

    (außerdem funktioniert das nur im Realmode. Also schonmal auf keinem modernen Betriebssystem.).

    man kann auch mit "Flat" oder "Protected" mode auf diese addresse zugreifen. Das ist im Vesa standard definiert, es gibt einige alte Spiele die so laufen (ich glaube Codewarrior hatte damals ein PM mini OS das von dos aus bootete als lib mitgeliefert ).
    falls man es selbst machen will: http://www.monstersoft.com/tutorial1/VESA_info.html

    Heutzutage ist das ansprechen der Grafikhardware deutlich komplizierter und sollte man am besten nur über den Treiber erledigen. Hier ist zB der Code des X11 ATI-Treibers: http://cgit.freedesktop.org/xorg/driver/xf86-video-ati/tree/src Wenn man wirklich meint, direkt mit der Hardware kommunizieren zu wollen :))

    eine sehr nette und simple weise ist pixeltoaster, es ist kein direkter hardware zugriff, aber das prinzip ist aenlich. ein array von pixel das man ohne viel aufwand nach wunsch beschreiben kann.



  • Unter Linux würde sich das Framebuffer Device (http://de.wikipedia.org/wiki/Framebuffer#Linux-Framebuffer) anbieten. Das ist die vom jeweiligen Treiber angebotene Schnittstelle zum Bildspeicher.



  • Anstatt in einem Framebuffer herumzuschreiben kann man auch einfach einen Bilddatei nehmen und darin herumschreiben.

    Da lernt man genauso viel.

    Ansonsten nimm nen C64 Emulator oder so etwas, wenn du solche Sachen machen willst.


Anmelden zum Antworten