Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Projekt: OS-Development  ::  VGA Mode 12 (Planar)  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Gast7107
Unregistrierter




Beitrag Gast7107 Unregistrierter 11:38:51 09.03.2016   Titel:   VGA Mode 12 (Planar)            Zitieren

Hallo Zusammen

Ich habe ein kleines Problem mit k_memcpy.
Zuerst mal den code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
 
    a = Plane0[0];
    b = Plane1[0];
    c = Plane2[0];
    d = Plane3[0];
 
 
    //ä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
  }


Da dieser VGA modus nicht normal ist muss ich eine eigene Funktion schreiben um pixel zu zeichen. Mein problem ist, das memcpy den wert aus dem video speicher nicht in die variable planex[0] abspeichert. um ein pixel zu zeichen muss ich in 4 Bytes je nur 1 bit ändern(maskieren). Kann mir jemand helfen?(a-d sind nur varablen die ich spähter wieder im texmodus abfrage um zu testen ob der video speicher überhaupt ausgelessen wurde.)
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 201
Beitrag supernicky Mitglied 22:12:29 13.03.2016   Titel:              Zitieren

Hallo,

es gibt noch ein Register mit dem du genau 1 Pixel (Bit) ändern kannst.
Schau dir mal das Bit Mask Register (Index 08h) an.

Pixel zeichnen:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char *offset;
 
//Bitmaske mit dem zu ändernden Pixel erstellen
offset = (char*)0xA0000 + y * 640 + x / 8;
bitmask = 0x80 >> (x & 7);
 
//die Farbe schreibst du in das Set/Reset Register
outportb(0x3CE,0x0);     //Index 0
outportb(0x3CF,color);   //Farbe eintragen
 
//Alle Ebenen öffnen im Set/Reset Enable Register
outportb(0x3CE,0x1);     //Index 1
outportb(0x3CF,0xF);     //Bit 0 bis 3 setzen
 
//Im Bit Mask Register nur das berechnete Bit setzen!
outportb(0x3CE,0x8);     //Index 8
outportb(0x3CF,bitmask); //Bit setzen bei welchem die Farbe geändert werden soll
 
//beliebigen Wert an die Adresse schreiben
*offset--;
 
//Register wieder herstellen


SVGA ist aber viel einfacher.

Nicky


Zuletzt bearbeitet von supernicky am 18:22:39 15.03.2016, insgesamt 2-mal bearbeitet
Tbex
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2016
Beiträge: 5
Beitrag Tbex Mitglied 17:19:04 15.03.2016   Titel:              Zitieren

und wo bestimme ich die Adresse?
Ich verstehe dein Code nicht zu 100% :/
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 201
Beitrag supernicky Mitglied 18:25:19 15.03.2016   Titel:              Zitieren

Hallo,

die Adresse des Grafikspeichers im Modus 12h beginnt immer bei 0xA0000.

Der offset wird dann einfach dazu addiert.
X und Y sind die Koordinaten des zu zeichnenden Pixels.

Nicky
Tbex
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2016
Beiträge: 5
Beitrag Tbex Mitglied 10:12:17 16.03.2016   Titel:              Zitieren

also einfach wie ich das oben gemacht habe mit k_memset auf die 4 planes?
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 201
Beitrag supernicky Mitglied 21:56:58 16.03.2016   Titel:              Zitieren

Warum willst du denn erst die 4 Planes auslesen, ändern und dann wieder
schreiben?

Zum setzen eines Pixels genügen diese paar Zeilen Code.

Wenn du dich schon quälen willst schau mal nach diesem Buch
ISBN:3772370136

Nicky
Tbex
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2016
Beiträge: 5
Beitrag Tbex Mitglied 12:44:58 17.03.2016   Titel:              Zitieren

ich meine in deinem Code wo du geschrieben hast steht nur *offset--.

nirgends wird der Offset an einen Port/register geschrieben wie z.b farbe/bitmask, und das verwiert mich gerade :/

dein code verstehe ich zu 100% aber wo die Adresse deviniert wird krieg ich nicht raus.

adrian


Zuletzt bearbeitet von Tbex am 12:45:37 17.03.2016, insgesamt 1-mal bearbeitet
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 201
Beitrag supernicky Mitglied 13:20:41 17.03.2016   Titel:              Zitieren

Hallo Adrian,

Zitat:

nirgends wird der Offset an einen Port/register geschrieben wie z.b farbe/bitmask, und das verwiert mich gerade :/


Was bei mir in Zeile 4 steht, steht bei dir in den Zeilen 7+8
Ich addiere dann noch den Beginn des Videospeichers dazu 0xA0000.

Offset ist ein Zeiger zum lesen/schreiben eines Bytes in den RAM.
Und zwar in das Byte in dem dein Pixel gesetzt werden soll.

Deine Daten oder Farben die du zeichnen möchtest nimmt die Graka aber
aus den Registern die wir zuvor gesetzt haben

Zeilen 8 bis 17

zum Schluss genügt ein Schreibzugriff auf die Speicherstelle.
C:
*offset--;
würde das Byte an der Speicherstelle um 1 verringern, also Arbeit gemacht.
Du kannst aber auch
C:
*offset = 0xFF;
schreiben. Nur einfach irgendwas.

Nicky


Zuletzt bearbeitet von supernicky am 13:27:14 17.03.2016, insgesamt 1-mal bearbeitet
Mr X
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1724
Beitrag Mr X Mitglied 15:14:43 20.03.2016   Titel:              Zitieren

Zitat:
zum Schluss genügt ein Schreibzugriff auf die Speicherstelle.
C:
*offset--;

würde das Byte an der Speicherstelle um 1 verringern, also Arbeit gemacht.

Das stimmt nicht.
C:
*offset--;
verringert offset um 1, tut aber sonst nichts. Die Speicherzelle, auf die offset zeigt, wird nicht verändert.
C:
(*offset)--;
würde die Speicherzelle verändern.
Tbex
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2016
Beiträge: 5
Beitrag Tbex Mitglied 10:44:39 21.03.2016   Titel:              Zitieren

danke für eure antworten aber irgendwie geht der code immer noch nicht :/

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void int32_test()
{
    char *offset;
    char color = RED; // red = 0xC
    int x = 320;
    int y = 320;
    char bitmask;
 
    //Bitmaske mit dem zu ändernden Pixel erstellen
    offset = (char*)0xA0000 + y * 640 + x / 8;
    bitmask = 0x80 >> (x & 7);
     
    //die Farbe schreibst du in das Set/Reset Register
    outportb(0x3CE,0x0);     //Index 0
    outportb(0x3CF,color);   //Farbe eintragen
     
    //Alle Ebenen öffnen im Set/Reset Enable Register
    outportb(0x3CE,0x1);     //Index 1
    outportb(0x3CF,0xF);     //Bit 0 bis 3 setzen
     
    //Im Bit Mask Register nur das berechnete Bit setzen!
    outportb(0x3CE,0x8);     //Index 8
    outportb(0x3CF,bitmask); //Bit setzen bei welchem die Farbe geändert werden soll
     
    //beliebigen Wert an die Adresse schreiben
    *offset = 0xFF;
    //(*offset)--; egal welches >> gleiches ergebnis = keine änderung des diplsays :/
     
    //Register wieder herstellen  
}


(*offset)--; hab ich noch nirgend gesehen aber gut zu wissen :)
C++ Forum :: Projekt: OS-Development  ::  VGA Mode 12 (Planar)  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.