Problem beim Setzten von Pixeln
-
Hallo, ich hoffe, dass noch niemand einen Thread mit diesem Thema eröffnet.
Ich möchte ein Pixel auf den Bildschirm zeichnen.
Das Umschalten in den Grafikmodus und das Setzen von Pixeln im RM funktioniert.
Nur das Zeichnen von Pixeln im c-Kernel macht probleme.Mein Code sieht so aus:
// boot.asm //.. mov ax, 0x13 int 0x10 //.. // kernel.asm //.. draw_Pixel: // zeichnet einen roten Pixel auf x=10 y=10 mov ah, 0x0C mov al, 0x0C mov cx, 10 mov dx, 10 int 0x10 //.. //ckernel.c //.. void setPixel(UINT x, UINT y, UCHAR color) // Diese Funktion funktioniert nicht bei mir! { UCHAR* VGA = (UCHAR*)0xA0000; USHORT offset; offset = 320*y + x; VGA[offset] = color; } //..
Ich hoffe Ihr könnt mir helfen.
-
Was heisst denn "das Zeichnen im ckernel macht Probleme"? Bitte mit genauer Fehlerbeschreibung.
Spontan wuerde ich sagen, du hast nicht den Grafikmodus gewechselt
Mein Fehler. Hab das in der Boot.asm uebersehen. Trotzdem waere eine genaue Fehlerbeschreibung besser.
-
Entschuldigung, ich habe mit anscheinend falsch ausgedrückt, denn im PM funktioniert es garnicht.
-
Liegt der videoram nicht bei 0xB0000? Zumindest beim Textmodus ist das so, vlt. im Grafikmodus anders.
-
Ich habe mich nach diesen Angaben orientiert
0xA0000 for EGA/VGA graphics modes (64 KB)
0xB0000 for monochrome text mode (32 KB)
0xB8000 for color text mode and CGA-compatible graphics modes (32 KB)von http://en.wikipedia.org/wiki/Video_Graphics_Array#Addressing_details
Habe es mit 0xB0000 ausprobiert, aber es funktioneirt trozdem nicht.
-
0xB8000 meinte ich natürlich, aber die Wikipedia-Angabe wird schon korrekt sein. paging o.ä. hast Du aber nicht, oder?
Du musst irgendwie prüfen, ob die Funktion überhaupt aufgerufen wird. Leg den Code doch mal in die main, und guck was passiert.
-
Paging oder ähnliches habe ich nicht.
Ich habe nur diese eine Funktion.Ich hab den Code nun in meine main Funktion verlegt, aber noch immer das selbe Problem.
-
Für 0xb0000 bis 0xbffff: schau bitte hier: http://henkessoft.de/OS_Dev/OS_Dev1.htm#mozTocId483279
Es stehen also für jedes Zeichen auf dem Bildschirm im Speicher zwei Byte zur Verfügung: ein Byte für das Zeichen, ein weiteres Byte für die Attribute dieses Zeichens. Typischer Code:char* vidmem = (char*) 0xb8000; unsigned int i=0; while(i<(80*2*25)) { vidmem[i] = ' '; // Space (ASCII: 0x20) ++i; vidmem[i] = 0x07; // white on black ++i; };
Bei VGA in RM sieht das so aus:
typedef unsigned char byte; byte far *VGA = (byte far*)0xA0000000L; unsigned short offset; ... offset = x + 320 * y; VGA[offset] = color;
http://atschool.eduweb.co.uk/camdean/pupils/amac/vga.htm
hier: http://www.lowlevel.eu/wiki/VGA
unsigned char* VGA = (unsigned char*) 0xA0000; void setpixel(int x, int y, unsigned char color) { int offset; if(0 <= x && x < 320) { if(0 <= y && y < 200) { offset = 320*y + x; VGA[offset] = color; } } }
Deine Funktion sieht also gut aus, abgesehen von den fehlenden "Grenzkontrollen". Lies dort vor allem den Text über die Steuerung.
weitere Links:
http://www.brokenthorn.com/Resources/OSDevVga.html
http://en.wikipedia.org/wiki/VGA
http://www.mcamafia.de/pdf/ibm_vgaxga_trm2.pdf
-
Soviel ich von den oben genannten Links verstanden habe, kann man mit der Adresse 0xA0000 nur im RM ein Pixel zeichnen.
Aber wie fuktioniert es im PM?
-
Da hast Du Paging, schreibst also nicht einfach direkt an eine Speicherstelle. das ist alles komplizierter. Am besten schaust Du dir das in PrettyOS an. Wir haben dort Grafik implementiert. http://prettyos.de
-
Ich habe mir PrettyOs angesehen.
Wie aktiviert und benutzt man dort die Grafik?
-
-
Danke.
Die Maus funktioniert bei mir weder in Bochs noch in qemu richtig!
-
Maus kannst Du dir abschauen bei uns.
-
Hört sich eher so an, als würde sie in PrettyOS unter Qemu/Bochs nicht gehen. Kann ich allerdings nicht bestätigen, läuft hier gut unter Qemu.
-
@programmier-azubi: bitte gib deine Konfiguration möglichst genau an. Ob Du z.B. PrettyOS oder etwas Eigenes testest, ob in RM oder PM usw.