VGA Mode 12 (Planar)



  • und wo bestimme ich die Adresse?
    Ich verstehe dein Code nicht zu 100% 😕



  • 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



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



  • 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
    VGA- und Super- VGA- Karten programmieren | ISBN: 3772370136

    Nicky



  • 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



  • Hallo Adrian,

    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.

    *offset--;
    

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

    *offset = 0xFF;
    

    schreiben. Nur einfach irgendwas.

    Nicky



  • zum Schluss genügt ein Schreibzugriff auf die Speicherstelle.

    *offset--;
    

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

    Das stimmt nicht.

    *offset--;
    

    verringert offset um 1, tut aber sonst nichts. Die Speicherzelle, auf die offset zeigt, wird nicht verändert.

    (*offset)--;
    

    würde die Speicherzelle verändern.



  • danke für eure antworten aber irgendwie geht der code immer noch nicht 😕

    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 🙂



  • (char*)0xA0000 + y * 640 + x / 8;
    

    sollte es nicht (char*)0xA0000 + y*(640/8) + x/8; heißen?



  • nein da y die vertikale linie bestimmt und x das bit im byte bestimmt 🙂