Zuerst mal Danke für die Aktivierung meines Accounts in diesem Forum
wie im Titel schon beschrieben möchte ich ein bit in einem Byte maskieren.
Ich möchte nämlich den vga modus 12 benuzten, der im Planar modus ist.
Ich schaff es den Modus zu ändern wie auch den ganzen Bildschirm schon mit einer Farbe zu füllen.
Wenn ich aber ein Pixel ändere möchte, muss ich 4 bits ändern die alle auf der gleichen Adresse liegen. mit outportw kann ich in diesen Planes switchen.
Hier der Code:
void int32_setpixel_0x12(int x, int y, char farbe)
{
char Plane0[2];
char Plane1[2];
char Plane2[2];
char Plane3[2];
int getPosPixel = (y*640) + x;//wieviele pixel von oben links gesehen
int BytePos = getPosPixel /8;//welches byte anwählen
int modulo = getPosPixel % 8;//welches bit im byte anwählen
char* vidmem = (char*) 0xA0000;
//holle byte das verändert werden muss(4x wegen planes)
outportw(0x3CE,0x0005);//setup plane masking
outportw(0x3c4,0x0102);//plane 0
k_memcpy(Plane0,(vidmem + BytePos), 1);
outportw(0x3c4,0x0202);//plane 1
k_memcpy(Plane1,(vidmem + BytePos), 1);
outportw(0x3c4,0x0402);//plane 2
k_memcpy(Plane2,(vidmem + BytePos), 1);
outportw(0x3c4,0x0802);//plane 3
k_memcpy(Plane3,(vidmem + BytePos), 1);
outportw(0x3c4,0x0F02);//restore normal plane mask
//ändere bits
switch(modulo)
{
case(0):
{
if((farbe & 0x1) == 0x1){Plane0[0] |= 0x80;}//1000'0000
else{Plane0[0] &= 0x7F;}//0111'1111
if((farbe & 0x2) == 0x2){Plane1[0] |= 0x80;}
else{Plane1[0] &= 0x7F;}
if((farbe & 0x4) == 0x4){Plane2[0] |= 0x80;}
else{Plane2[0] &= 0x7F;}
if((farbe & 0x8) == 0x8){Plane3[0] |= 0x80;}
else{Plane3[0] &= 0x7F;}
break;
}
}
//byte zurück in video speicher
outportw(0x3CE,0x0005);//setup plane masking
outportw(0x3c4,0x0102);//plane 0
k_memset((vidmem + BytePos), Plane0[0], 1);
outportw(0x3c4,0x0202);//plane 1
k_memset((vidmem + BytePos), Plane1[0], 1);
outportw(0x3c4,0x0402);//plane 2
k_memset((vidmem + BytePos), Plane2[0], 1);
outportw(0x3c4,0x0802);//plane 3
k_memset((vidmem + BytePos), Plane3[0], 1);
outportw(0x3c4,0x0F02);//restore normal plane mask
}
Irgendwie kann aber k_memcpy das Byte nicht aus dem speicher lesen und in den string schreiben....
Kann mir jemand helfen oder zeigen wie ich das machen kann?
Vielen Dank im voraus