Tutorial gefunden, habe frage
-
Original erstellt von <AsmCoder>:
Kann man denn mit C++ (so wie da oben) auch etwas blinken lassen?Sofern die Grafikkarte was macht, ja. Einfach zur Hintergrundfarbe 8 addieren. Also 0x87 anstatt 0x07.
-
Eigentlich sollte jede VGA-kompatible Grafikkarte in der Lage sein, ein Zeichen blinken zu lassen.
Man kann jedoch in den VGA-Registern (via in/out) einstellen, ob bit7 des Farbattributes als intensitaet fuer die Hintergrundfarben oder als "blink"-bit interpretiert werden soll.
PS:
Die alternative Funktion von Bit3 (vordergrund intensitaet) ist uebrigens ein switch zwischen 2 font-tables, so dass man dann insgesamt 512Zeichen gleichzeitig auf den Bildschirm bringen kann
-
@<jmd> Kannst Du bitte genau angeben, wie man die beiden Umstellungen vornimmt, am besten als Assembleranweisung?
[ Dieser Beitrag wurde am 14.05.2003 um 22:08 Uhr von Erhard Henkes editiert. ]
-
@jmd
wenns geht bitte auch in C++
-
Original erstellt von <Sera>:
@jmd
wenns geht bitte auch in C++in/out gibts net in C++. Da muss wirklcih der ASM ran.
-
Merkwürdiger Chip. Also wies aussieht muss man das Grob so machen (keinen bock das jetzt in ASM zu verpacken :D):
in(0x3da); // sicherstellen dass der chip im adressierungsmodus ist
out(0x3c0, 0x10); // Register 0x10 auswählen
// 250ns warten
foo = in(0x3c1); // bisherigen wert von register 10 lesen
foo |= 0x8; // blinken aktivieren (bit setzen)
out(0x3c0, 0x10); // register 0x10 auswählen
// 250ns warten
out(0x3c1, foo);ohne garantie, aus der VGADoc
-
jo, stimmt so ungefaehr.
Ich habe dazu noch folgenden ASM-Code ausgegraben, der muesste auch funktionieren:
Proc EnableBlink NEAR cli mov dx,03DAh in al,dx ;reset Address/Attribute FlipFlop mov dx,03C0h mov al,00010000b out dx,al ;select index 10h of Attribute Controller Registers inc dx in al,dx ;read contents mov ah,al or ah,00001000b ;enable blinking (BE - Bit3) mov dx,03DAh in al,dx ;reset again mov dx,03C0h mov al,00010000b out dx,al ;select index 10h mov al,ah out dx,al ;write back... sti ret ENDP EnableBlink
Um das Blinken wieder auszuschalten und stattdessen 16Hintergrundfarbenm nutzen zu koennen, einfach die gleiche Prozedur verwenden, aber Bit 3 loeschen.
Das mit den 2 character sets ist etwas komplizierter...
Ich glaube irgendwo ganz tief vergraben habe ich dazu auch noch einen Beispielcode, den finde ich aber momentan nicht.
-
Danke!
Kannst Du mal den Link auf die Quelle angeben?
-
he, das ist meiner! :p
Die Quelle (VGA-Referenz) bei IBM gibt es AFAIK nicht mehr :o
-
So, das mit den 2 Character sets sollte folgendermaßen gehen:
(ungetestet, daher keine Garantie)
Proc Enable512Charset NEAR cli mov dx,03DAh in al,dx ;reset Address/Attribute FlipFlop mov dx,03C4h mov al,04h out dx,al ;select sequencer register 04: memory mode register inc dx in al,dx ;read contents or al,00000010b ;Enable EM (Extended Memory) @Bit1 mov ah,al mov dx,03DAh in al,dx ;reset... mov dx,03C4h mov al,04h ;select sequencer register 04: memory mode register out dx,ax ;and write back to 03C5 (ah) mov dx,03DAh in al,dx ;reset... mov dx,03C4h ;Bit76 =00xxxxxx (reserved) ;Bit532=xx0x00xx (Address of Charmap A=>1st 8KB of plane2 @A0000) ;Bit410=xxx0xx01 (Address of Charmap B=>3rd 8KB of plane2 @A0000) mov ax,0103h out dx,al ;select sequencer register 03: Character Map Select Register (al) ;write data in ah (map select sa.) sti ret ENDP Enable512Charset
Nun muss natürlich noch dafür gesorgt werden, dass an den entsprechenden Addressen auch eine vernuenftige character map liegt...
Dazu sollte man vielleicht noch wissen, wie so eine Character map aufgebaut ist:
Es handelt sich hier um simple Bitmaps (also 1Pixel=1Bit) Bit0=Pixel OBEN RECHTS Bit1 ist das Pixel links daneben usw.
Ein character ist insgesamt 20h Byte groß.Um Zugriff auf die character map zu bekommen, muß noch folgender code ausgefuehrt werden:
Proc EnableCharMapAccess NEAR cli mov dx,03DAh in al,dx ;reset Address/Attribute FlipFlop mov dx,03C4h mov ax,0402h ;select sequencer register 02: Map Mask Register (al) out dx,ax ;Enable map2 (character maps):Bit2 of ah set mov dx,03DAh in al,dx ;reset... mov dx,03C4h mov ax,0604h ;select sequencer register 04: Memory Mode Register out dx,ax ;Enable EM(Bit1=>extend memory access 256K) and disable OE(Bit2=>bitmaps addressed through map mask) mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,0005h out dx,ax ;select graphics controller register 05: Graphics Mode Register ;disable 256color;disable O/E;RM=direct;WR=rotate0 mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,0406h ;select graphics controller register 06: Miscellaneous Register ;O/E: A0=0/1;disable Graphics mode;map active maps to A000:0000 - 64KB out dx,ax mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,0204h ;select graphics controller register 04: Read Map Select Register out dx,ax ;select map 02 (character map) sti ret ENDP EnableCharMapAccess
Wenn diese Proc ausgefuehrt wurde, ist kein Zugriff auf den Textspeicher bei B800:0000 mehr moeglich.
Daher nachdem die character maps fertig manipuliert wurden noch das hier ausfuehren:
Proc DisableCharMapAccess NEAR cli mov dx,03DAh in al,dx ;reset Address/Attribute FlipFlop mov dx,03C4h mov ax,0302h ;select sequencer register 02: Map Mask Register (al) out dx,ax ;Enable map0/1 (Character/Attribute maps):Bit0/1 of ah set mov dx,03DAh in al,dx ;reset... mov dx,03C4h mov ax,0204h ;select sequencer register 04: Memory Mode Register out dx,ax ;Enable EM(Bit1=>extend memory access 256K) and OE(Bit2=>bitmaps addressed through A0: select 1/0) mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,1005h out dx,ax ;select graphics controller register 05: Graphics Mode Register ;disable 256color;ENABLE O/E;RM=direct;WR=rotate0 mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,0E06h ;select graphics controller register 06: Miscellaneous Register ;O/E: A0=1/0;disable Graphics mode;map active maps to B800:0000 - 32KB out dx,ax mov dx,03DAh in al,dx ;reset... mov dx,03CEh mov ax,0004h ;select graphics controller register 04: Read Map Select Register out dx,ax ;select map 00/01 (chained maps0/1: character/Attribute) sti ret ENDP DisableCharMapAccess
Wie gesagt, keine Garantie ob der ganze Murx funzt.
Vielleicht ist es ja trotzdem noch irgendwie brauchbar.