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 VariableVielen 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.