VGA Text mode (C-Code)



  • Hi Leute,

    ich bin grad etwas am verzweifeln.
    In diversen Tutorials habe ich gelesen das mannim VGA Text mode 16 Farben darstellen kann. Soll heißen 16 Vordergrundfarben und entweder 8 Hintergrundfarben und Blinkmodi oder auch 16 Hintergrundfarben.

    Leider bekomme ich nur zweiteres hin und ich weiß nicht warum.

    mein Code:

    void settextcolor(unsigned short forecolor, unsigned short backcolor)
    {
    	/* Top 4
    	bits are the background, bottom 4
    	bits
    	* are the foreground color */
    	attrib = backcolor;
    	attrib = attrib<<4 ;
    	attrib = attrib | (forecolor);
    }
    
    void cls()
    {
    	short blank;
    	int i;
    
    	blank = 0x20 | (attrib << 8);
    
           for(i = 0; i < 25; i++)
    		memsetw (textmemptr + i * 80, blank, 80);
           csr_x = 0;
    	csr_y = 0;
    	move_csr();
    }
    
    unsigned short *memsetw(unsigned short *dest, unsigned short val, size_t count)
    {
        unsigned short *temp = (unsigned short *)dest;
        for( ; count != 0; count--) *temp++ = val;
        return dest;
    }
    

    Fehler: wenn ich einen weißen Hintergrund bekommen möchte erhalte ich einen grauen, und wenn ich mit einer Schleife alle 16 Farben durchgehe sehe ich im Hintergrund nur die ersten 8 und im Vordergrund die alle anderen.

    ich sehe da keinen fehler, zumal ich den Code von einem Tutorial übernommen habe (http://www.osdever.net/bkerndev/index.php?the_id=90)
    attrib ist eine globale Variable

    Vielen Dank für eure Hilfe

    mfg Fabian



  • Der Witz an der Sache ist, dass der VGA-Controller standardmaessig so eingestellt ist, dass bit3 der Hintergrundfarbe nicht die Intensitaet (1=hell, 0=dunken; das wuerde die restlichen 8 Farben ergeben), sondern den Blink-Status bestimmt (1=blinken; 0=normal).
    Um das zu aendern, musst du erstmal ein wenig am VGA-Controller rumwerkeln. Hm, irgendwo gab's hier AFAIR zu solchen Spielereien im Textmodus schonmal einen recht ausfuehrlichen Thread mit Codeschnippseln.
    Ich such' spaeter nochmal danach, du bist natuerlich herzlich eingeladen, auch ausschau zu halten. 😃
    Alternativ kannst du allerdings auch google fuer die Suche nach IBM-specs des VGA-Controllers, oder entsprechenden Code-Beispielen bemuehen. 😉



  • hmm... danke dir ich habe bei ibm etwas gefunden, was das Problem aufgreift, aber irgendwie ist es doch falsch 😃

    siehe hier: http://www.ibm.com/servers/eserver/pseries/library/chrp_ioref_1.0.pdf
    Auf Seite 257 ist das Register EB beschrieben welches, das einstellen soll.

    So wie ich das verstanden habe ist das ein Register auf dem GrafikChip. Ich habe jetzt aber null Plan wie ich darauf zugreifen soll. Mit

    __asm__ __volatile__ ("mov eb, 0x0");
    

    ist es natürlich nicht getan, wäre ja zu schön. Ist aber irgendwie logisch das es nicht funzt.

    Im Forum habe ich leider ncihts darüber gefunden. Bin für jede Hilfe dankbar, auch wenn es nur ein kleiner Schönheitsfehler ist.



  • hm, ok, hab es auch nicht mehr gefunden.

    Das hier habe ich aus meinen aelteren Quellcodes ausgegraben. Sollte funktionieren, kann ich aber nicht mit Bestimmtheit sagen... 😃

    ;Enables/Disables Blinking
    ;Input:
    ; bl - if Bit0 clear - Blinking is Disabled else enabled
    
    Proc ToggleBlink NEAR
    
      cli
      mov    dx, 03DAh
      in     al, dx     ;Reset A/D FlipFlop
      mov    dx, 03C0h  ;Attribute Controller
      mov    al, 30h    ;Index 10h: Attribute Mode control + Bit5(IPAS) set
      out    dx, al
    
      inc    dx
      in     al, dx     ;read that register
    
      dec    dx
      and    bl, 01h    ;only use Bit0
      and    al, 0F7h   ;clear Bit3 (EB) read from Attribute Mode Controller Reg.
      shl    bl, 03h    ;shift to Bit3 (EB)
      or     al, bl     ;set it from bl
      out    dx, al     ;set Attribute Mode control register
      sti
     ret
    ENDP ToggleBlink
    


  • Tausend dank an dich

    es funktioniert tatsächlich, echt super, danke dir.

    Ist vlt auch mal eine Ergänzung in der FAQ wert.


Anmelden zum Antworten