DOS/ASM: Text-Blinken komplett abschalten

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

DOS/ASM: Text-Blinken komplett abschalten

Beitrag von DarkSoul »

Hallo,

ich habe noch ein kleines Problem mit meiner ASM-Baustelle. :mrgreen:

Und zwar ist der Farbraum im Textmodus ja so eingeteilt: 16 Vordergrundfarben, 8 Hintergrundfarben und 1 Blinkbit.

Ich brauche das Blinken nicht und hätte gerne 16 Hintergrundfarben.

Mein Programm schreibt den Bildschirm voll mit Char 220, um einen Fake-Grafikscreen mit 80x50 px zu erhalten (immer zwei Pixel pro Char, einer über Vordergrundfarbe, einer über Hintergrundfarbe angesprochen).

Das zu rendernde Bild enthält leider auch Gelb und Weiß. Daraus werden Grau und Kackabraun mit Geblinke. :cry:

Code: Alles auswählen

  ...
  ;screen 03, 80x25 Char
  mov ax, 0003h 
  mov bx, 0
  mov cx, 0
  mov dx, 0
  int 10h  
 
  ;blink off for CGA
  mov ax,40h ;get port address
  mov es,ax
  mov dx,[es:063h] 
  add dx,4 

  mov al,[es:065h] ;take settings
  and al,0dfh         ;flick off bit 5 (Blink)
  out dx,al            ;send it to port in dx
  mov [es:065h],al ;write changed flags back
  
  ;blink off for VGA
  mov ax, 1003h
  mov bx, 0
  int 10h
  ...  
- Die Version für VGA ist offiziell dokumentiert. Funktioniert auch nur dort.
- Die für CGA habe ich mir aus Internet-Häppchen zusammengeschustert. Funktioniert aber, jedoch direkt in Port zu schreiben ist wohl nicht die beste Methode.
- EGA bekomme ich gar nicht hin. Laut Doku gilt die VGA-Ausführung auch dafür. Klappt trotzdem nicht :|
- Das Bild müsste für MDA und Hercules auf S/W runtergerechnet werden. (Oder zumindest gesagt werden, dass mind. CGA benötigt wird, um die App auszuführen)

Nun meine 2 Fragen:
- Wie erkenne ich, welcher Grafikadaptertyp überhaupt verwendet wird? Zur Zeit werden ja immer beide Methoden ausgeführt.
- Wie stelle ich das Blinken bei EGA ab?

Edit:
CGA-Verhau kommentiert :D
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: DOS/ASM: Text-Blinken komplett abschalten

Beitrag von Helle »

Habe mir jetzt mal ein DOS (FreeDOS) in einer VM (Virtual Box) installiert, dazu noch YASM. Hardware-Zugriffe (z.B. auf Ports) sind damit natürlich nicht immer von Erfolg gekrönt, um es mal freundlich auszudrücken :lol: . GraKa-Test: Geht (bei mir) nur für VGA/EGA:

Code: Alles auswählen

;YASM
BITS 16
org 100h      ;COM

LABEL1

;Test auf VGA
mov ax,1a00h
int 10h
cmp al,1ah
jne .NixVGA   ;nicht VGA
mov dl,'V'    ;V wie VGA 
mov ah,2
int 21h       ;Ausgabe auf Bildschirm
jmp .Ende
.NixVGA:
;Test auf EGA
mov ax,1200h
mov bl,10h
int 10h
cmp bl,10h
je .Ende      ;nicht EGA
mov dl,'E'    ;E wie EGA 
mov ah,2
int 21h       ;Ausgabe auf Bildschirm
.Ende:
mov ax,4c00h  ;Programm ordentlich beenden
int 21h

END
Alles davor (MDA, HGC, CGA) baut in meinen Unterlagen auf einen Test auf Vorhandensein eines Motorola Video-Controllers 6845 auf; also für mich nicht testbar.
Das Blink-Bit bei EGA/VGA ist auch setzbar im Attribute-Controller (Port 3c0h) im Mode-Control-Byte (Register 10h, Bit3). In meiner VM schmiert dann aber DOS ab...
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: DOS/ASM: Text-Blinken komplett abschalten

Beitrag von DarkSoul »

In DOSBox funktioniert es ebenfalls.

MDA wird allerdings als VGA erkannt. :)

Ich habe das mit Port 3c0h heute eingebaut. Seitdem wird auch EGA richtig dargestellt.
Bei CGA wird es derzeit ausgelassen. Bei EGA und VGA wird es ausgeführt. Da hat mir dein Codebeispiel weitergeholfen.
Erstmal Danke für den Tipp.

Muss ich die nun insgesamt 3 vorhandenen Methoden überhaupt entsprechend trennen oder werden die von allen Controllern akzeptiert (auch wenn evtl. nichts passiert), so dass ich grundsätzlich immer alle 3 nacheinander ausführe?

Ist DOSBox da zuverlässig genug zum Testen?
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: DOS/ASM: Text-Blinken komplett abschalten

Beitrag von Helle »

Eigentlich hatte ich mit DOS schon im letzten Jahrtausend abgeschlossen, aber nun ... :mrgreen: Habe gerade DOSBox installiert und ein wenig getestet. Bei Hardware-Abfragen in einer VM (und auch DOSBox) sollte man immer skeptisch sein, aber DOSBox scheint den MC6845 zu kennen:

Code: Alles auswählen

;YASM
BITS 16
org 100h      ;COM

LABEL1

;Test auf VGA
mov ax,1a00h
int 10h
cmp al,1ah
jne .NixVGA   ;nicht VGA
mov dl,'V'    ;V wie VGA 
mov ah,2
int 21h       ;Ausgabe auf Bildschirm
jmp .Ende
.NixVGA:
;Test auf EGA
mov ax,1200h
mov bl,10h
int 10h
cmp bl,10h
je .NixEGA    ;nicht EGA
mov dl,'E'    ;E wie EGA 
mov ah,2
int 21h       ;Ausgabe auf Bildschirm
jmp .Ende
.NixEGA:
;Test auf CGA
mov dx,3d4h   ;MC6845-Adress-Register für CGA
call .MC6845
cmp ah,12h
jne .NixCGA   ;ist nicht der geschriebene Wert 
mov dl,'C'
mov ah,2
int 21h
.NixCGA:
mov dx,3b4h   ;MC6845-Adress-Register für Hercules und MDA
call .Test_MC6845
cmp ah,12h
jne .Ende     ;ist nicht der geschriebene Wert 
;hier könnte auf Hercules oder MDA getestet werden
mov dl,'H'
mov ah,2
int 21h

.Ende:
mov ax,4c00h  ;Programm ordentlich beenden
int 21h


.Test_MC6845:
;es wird ein beliebiger Wert in Register 14 geschrieben und später wieder
; ausgelesen. Konnte der Wert geschrieben werden, ist es die zu testende Karte
mov al,0eh
out dx,al
inc dx
in al,dx
mov ah,al     ;al sichern
mov al,12h    ;beliebiger Wert
out dx,al
mov cx,200    ;Bearbeitungs-Pause einlegen
.Loop1:
loop .Loop1
in al,dx
xchg al,ah
out dx,al     ;alten Wert ordentlich zurückschreiben
ret

END 
Lt. Conf.Datei von DOSBox ist MDA kein gültiger Wert, gebe ich ihn trotzdem an, wird VGA angezeigt - eigentlich logisch.
Die Abfrage-Reihenfolge fängt natürlich mit der höchstwertigen Karte an. Fängt man z.B. mit CGA an, kann die Antwort positiv sein, aber trotzdem könnte es auch EGA oder VGA sein. Wer VGA spricht, kann auch EGA usw. Sollte zumindest so sein.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: DOS/ASM: Text-Blinken komplett abschalten

Beitrag von DarkSoul »

Vielen Dank!

Ich habe nun alles hinbekommen.

(PS: MDA funktioniert bei meiner DropBox und ist auch als möglicher Wert in der Config angegeben.)

Da ja quasi MDA und Hercules übrig bleiben. ist das einfach der "Else-Zweig" :mrgreen:
Bild
Antworten