Wer lesen kann is klar im vorteil
ich hab dich 1.) gefragt ob du fals du mit Nativecode arbeitest, was du beim einem eigenen OS zwangsleufig tust mit R oder P mode arbeitest..
2.) hab ich dir bereits genau beschrieben wie du pixel setzt und neu setzt, alles andere is nur erweiterung des ganzen...
und sowas wie linie zeichnen in assembler gibts so und so net fertig....
nochmal von vorn:
arbeitest du im RMode kannst du mit hilfe des Bios interupts 10h funktion 00h den bildschirmmodus ändern...
beispiel:
Code:
mov ax, 13h ;setzt ah = 0, al = 13h
int 10h ;biosinterupt aufrufen um die funktion auszufphren
um nun einen pixel zu setzten musst du den pixel in den graphikspeicher schreiben, wie der graphikspeicher organisiert ist und wo er liegt hängt vom graphikmodus ab.
fortsetzung des obigen beispiels:
bei modus 13h beginnt der graphikspeicher bei flat 0xA0000
entsprechend den regeln für realmode programmierung setzt du ein segmentregister auf 0xA000 um auf den speicher zugreifen zu können
der graphikspeicher ende in diesem fall 64000byte weiter...
entsprechend, kannst du nun einen pixel setzen
code dazu:
Code:
mov ax, 0xA000 ;segmentregister können nicht direkt geladen werden
mov es, ax ;also zuerst in ax zwischenspeichern und dann rüber kopieren
so nun hast du die vorbereitungen abgeschlossen nun kannst du anfangen pixel zu setzen
der mode 13h ist ein 320x200 pixel großer modus, und er benutzt 256 farben, entsprechend ist ein pixel = 1 byte
der graphikspeicher ist definiert als bytearray mit einer länge von 64000byte entsprechend das jeder pixel ein byte ist brauchst du nur von der oberen linken ecke anfangen zu zählen.. die formel für die berechnung des offsets im graphikspeicher:
offset = y*320 + x
x = richtung in x
y = richtung in y
offset = der wert den du beim zugriff benutzen musst
vergiss bei dem ganzen bitte nich das zeilen und spalten nummerierung bei 0 beginnt...
und nun schreibste den farbwert den du willst an die entsprechende stelle
Code:
mov cx, offset ;offset in register laden
mov dl, farbwert ;farbwert in register laden
mov [es:cx], dl ;farbwert mit hilfe von segmentoverride präfix in dereferenziertes CX schreiben
also noch genauer kann ich es fast nicht mehr erklären
nocheinmal der link auf die interupt liste von R-Brown
http://www.ctyme.com/intr/int-10.htm
im pmode funktioniert das ganze ganz ähnlich
dort machst du in deiner GDT einen eintrag für den graphikspeicher, im VGA modi is der flat offset wie schon erwähnt 0xA0000 wenn du den modus ändern willst brauchst du die grphikregister dazu die über den out befehl angesprochen werden, wie die allerdings alle genau funktionieren, das würde den rahmen dieses forums um megabytes an text sprengen...einfach mal googlen...
und was den zugriff auf den graphikspeicher betrifft.. das selbe in grün...
also wieder selector nehmen und
Code:
mov ax, selector
mov es, ax
mov cx, offset
mov dl, farbwert
mov [es:cx], dl
einzig erkennbarer unterschied hier... ich benutz anstat von 0xA000 hier den selektor der auf den eintrag der GDT zeigt...
ansonsten, aufpassen das du kein DPL laden willst für das dein CPL nich ausreicht... und natürlich sollte RPL = DPL sein.. wie halt immer außer bei call gates.. stell sicher das du nich versehendlich in der LDT landest, ja die üblichen dinge die man beim arbeiten mit pmode segmenten eben beachten muss....
So und wenn du das noch immer nich verstanden hast jetzt, dann sag uns zu aller erstmal in welchem modus du bist,... denn dann kann ich geziehlt darauf eingehen...