Ändern Sie die Hintergrundfarbe der dosbox-Konsole beim ausführen einer tasm-Programm
Ich versuche, display x
in die Mitte des Bildschirms, und ändern Sie dann die Hintergrundfarbe der Konsole zu blau. Ich habe den folgenden code, führt alles außer zum ändern der Hintergrundfarbe:
TITLE screen1.ASM
.MODEL SMALL
.STACK 0100h
.DATA
.CODE
start:
MOV AX,@DATA
MOV DS,AX
MOV AX,0600h
MOV BH,07h
MOV CX,0000h
MOV DX,184Fh
INT 10h
MOV AH,02h
MOV BH,00h
MOV DH,0Ch
MOV DL,28h
INT 10h
MOV AH,02h
MOV DL,'x'
INT 21h
MOV AX,4C00h
INT 21h
END start
Den code löscht den Bildschirm, zeigt x
im Zentrum der dosbox-Fenster und gibt die Kontrolle zurück zu DOS. Ich bin versucht, herauszufinden, was ich ändern würde müssen, aktualisieren Sie einfach die Hintergrundfarbe des Fensters (nicht der text) auf blau.
- Vielleicht meintest du
MOV BH,17h
stattMOV BH,07h
. Oberen 4 bits die Hintergrundfarbe (1=blau), die unteren 4 bits Vordergrund(die Figur) Farbe. (7=weiß) video mode
ist nicht ausgewählt.Egal, was Farbe ist inbh
wäre es nicht angezeigt, bis ein video-Modus ausgewählt ist.- Ich mache die Annahme, dass DOSBOX ist bereits im text-Modus. Es sei denn, es wurde absichtlich platziert, in den Grafik-Modus, dann gibt es ein problem. Aber der OP hat nicht gesagt, er ist im Grafik-Modus. Sie müssen nur ändern, um text-Modus, wenn Sie nicht schon im text-Modus. Mein Kommentar steht immer noch. in Bezug auf die zu nibbles für Vordergrund-und hintergrund-Farbe
- Ich habe nicht gesagt, dass der Kommentar falsch ist.
- Aber warum verwendet der
int 10h
wenn es text-Modus. - Da
int 10h
ist vollkommen gültig im text-Modus. Obgleich es langsam mit dem BIOS (im Vergleich mit der Aktualisierung der video-display direkt), es ist immer noch vollkommen akzeptabel. - Danke .;p
- Ich war betrachten Sie den code in eine ganz andere Weise. Vielen Dank, dass Sie mich korrigieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim löschen des Bildschirms bewegen
bh=17h
statt 07hMein Erster Eindruck von deinem code, und was veranlasste mein Erster Kommentar war, dass Sie wurden mit der falschen Vordergrund-und Hintergrundfarbe. Sie hatte:
Ist hellgrau auf schwarz. Weiß auf blau gewesen wäre:
Informationen über das BIOS-color-Attributen finden Sie hier.
Deine Frage ist zweideutig, jedoch ist der code in diesem Beispiel wird aktualisieren Sie die Hintergrundfarbe der aktuellen text-Modus, aber halten Sie die Vordergrund-Farbe und Charakter. Ich nehme an, der text-Modus 80x25 vor der Ausführung
screen1
.Dieses Programm aktualisiert die Anzeige Speicher direkt. Seite 0 von text-Modi starten in der Regel bei der physischen Adresse 0xB8000. Ich ES zu 0xB800 zu tun, das video-updates, weil die 0xB800:0x0000 segment:offset-paar ist die gleiche wie die physikalische Adresse (0xB800<<4)+0x0000=0xB8000.
Jedes Zeichen auf dem Bildschirm 2 bytes (oder ein 16-bit-Wort). Ein 80x25 text Modus ist 2000 Zellen (2 bytes) oder eine Summe von 4000 Byte des video-ram. Das Zeichen wird in das erste byte und das Attribut wird im zweiten byte. Weitere Informationen erhalten Sie auf dieser video-layout hier.
Der folgende code liest jedes Attribut für jeden Charakter auf dem Bildschirm, löscht die Hintergrundfarbe (Obere 4 bits) und legt dann diese oberen 4 bits um die neue Hintergrundfarbe an. 0x01 ist die Farbe blau. Nach dem Update der hintergrund in der Farbe, der code schreibt das neue Attribut zurück, um video-Speicher.
Ein Beispiel eines Bildschirms, bevor Sie dieses Programm ausführen:
Und nach:
Den gesamten text (und die Vordergrund-Farben) beibehalten werden, während die Hintergrundfarbe wurde aktualisiert.
Die Schleife im code die Hintergrundfarbe update könnte auch schon geschrieben:
Den code in meinem ursprünglichen Beispiel ist möglicherweise leichter zu verstehen, wenn Sie neu in x86-assembly.
Update Vordergrund & Hintergrund-Farben Für den Gesamten Bildschirm
Wenn Sie nicht brauchen, bewahren Sie die Vordergrundfarbe für jedes Zeichen auf dem Bildschirm, können Sie einfach aktualisieren Sie die Attribute mit einem neuen Wert, und binden die bestehenden Zeichen. Die Schleife in meinem ersten code-Beispiel geändert werden könnten wie folgt Aussehen:
Dies würde sich ändern, werden alle Zeichen auf dem Bildschirm weiß auf blau, und erscheint etwas wie:
Löschen des Gesamten Bildschirms, ohne einen BIOS-Interrupt
Für die Vollständigkeit, es ist auch möglich, deaktivieren Sie die gesamte Bildschirm mit einem Charakter. Die Raum Charakter effektiv wirkt als ein klares Zeichen. Wir aktualisieren den Charakter und die attribute mithilfe REP STOSW. Wir wollen uns vorwärts bewegen, durch Speicher mit STOSW so setzen wir die Richtung fahne nach vorne CLD. STD hätten bewegt sich rückwärts durch den Speicher. STOSW wird beschrieben als:
Den code deaktivieren Sie den Bildschirm mit einem blauen hintergrund und einem weißen Vordergrund getan werden könnte, ähnlich wie diese:
Dieser code ist das äquivalent zu Ihrem code, der mithilfe des video-BIOS-Service:
Die Ausgabe des Programms mit diesem code oben würde wie folgt Aussehen:
Müssen Sie die Farbe für jedes Zeichen manuell. Entweder
INT 0x10 /AH=0x09
, oder einfach direkt auf den Bildschirm schreiben-Puffer (beiB800:xxxx
).Jedes Zeichen in dem Bildschirm-Puffer benötigt zwei Byte, low-byte enthält den Charakter, das high-byte ist das Attribut einer Farbe.
Zum ändern der hintergrund-und display x, überprüfen Sie diese Ressource http://ss64.com/nt/color.html. Ich hoffe, es hilft