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


Anmelden zum Antworten