2016-09-05 1 views
1

Ich weiß seit einiger Zeit, dass es möglich ist, einen Pseudo-160x100-Grafikmodus auf dem IBM CGA zu erreichen, indem ich die Zeilenhöhe mit CRTC auf zwei Pixel ändere. Ich habe versucht, dies jetzt für ein paar Tage zu erreichen, in eine Sackgasse geraten.Erreichen des 160x100 Modus in x86 Assembly

Die Intel® Open Source HD Graphics and Intel Iris™ Graphics Programmer's Reference Manual Ansprüche ich kann dies auf Seite 45 (oder Seite 59 in der PDF) durch Schreiben in das Maximum Scanline Register, oder das ist, was ich daraus interpretiere.

Ich habe versucht, direkt an Speicheradresse 3B5 mit einem Wert von 00000001b schreiben, oder den Code für 2 Scanlinien, glaube ich. Das hat gar nichts gemacht, als ich es in DOSBox getestet habe.

Wenn Sie den Code, den ich schrieb, um sehen möchten, welche in NASM versammeln:

BITS 16 
xor bx,bx 
mov ax, 3b5h 
mov es, ax 
mov ah, 00000001b 
mov BYTE [es:bx], ah ; write 00000001b to 0x03b5:0000, right? 
cli 
hlt 

Ich bin noch nicht sehr zuversichtlich, mit Low-Level-Sachen wie diese, und jede mögliche Hilfe würde geschätzt.

+2

Haben Sie einen CGA-Grafikadapter in DOSBOX konfiguriert? – fuz

+0

DOSBox ist ein Emulator/eine virtuelle Maschine. Code, der darin läuft, wird eine ganze Maschine sehen, aber sein Verhalten wird vollständig von der DOSBox-Software bestimmt, nicht von der Hardware des Hosts, auf dem DOSBox läuft. Das Intel-Handbuch kann eine nützliche Quelle für Dokumentation über VGA/CGA sein, aber bedenken Sie, dass alle Intel-spezifischen Funktionen oder Verhaltensweisen, die es dokumentiert, in DOSBox nicht vorkommen. Sie könnten Ihren Code auf der nackten Hardware booten, wenn Sie Ihre tatsächliche Intel HW programmieren wollten. Siehe auch das [x86-Tag-Wiki] (http://stackoverflow.com/tags/x86/info) für viele x86-Links (keine direkt relevant). –

+0

Eine einfachere Möglichkeit, einen Pseudo-160x100-Grafikmodus zu erhalten, besteht darin, den standardmäßigen 80x50-VGA-Textmodus und eine benutzerdefinierte Schriftart mit 2x2 Blockzeichen zu verwenden. Eine andere Alternative wäre, den VGA-Grafikmodus 320x200 zu verwenden und die Breite und Höhe der Pixel beim Zeichnen einfach zu verdoppeln. –

Antwort

6

Sie schreiben nicht an Adresse 3b5h, sondern an Adresse 3b50h. Wenn Sie die Adresse 3b5h schreiben wollten, würden Sie ES mit 0 laden und dann etwas wie mov BYTE [es:3b5h], 01 machen, aber das wollen Sie auch nicht. Die Adresse 3b5h in dem Handbuch, das Sie verlinkt haben, ist eine "I/O-Adresse", was bedeutet, dass sie in einem völlig anderen Adressraum lebt, den Sie für den Zugriff auf die spezialisierte IN- und OUT-Anweisung benötigen.

Um den Wert 01 bis I/O-Adresse schreiben 3b5h Sie folgenden Code verwenden würde:

mov dx, 3b5h 
mov al, 01 
out dx, al 

Beachten Sie, dass die einzige Form des OUT instruction ist Sie hier verwenden können. Sie müssen das DX-Register verwenden, um die Adresse und das AL-Register anzugeben, um die Daten zum Schreiben auf diese E/A-Adresse bereitzustellen.

Außer das ist auch nicht richtig. Wie das Handbuch, das Sie verlinkt haben, erklärt, ist die E/A-Adresse 3b5h der MDA-Datenport, der CGA-Datenport ist die E/A-Adresse 3d5h. Schließlich ist das "Maximum Scanline Register" nicht das einzige Register, auf das über die I/O-Adresse 3d5h zugegriffen wird. Es gibt mehrere verschiedene Register, die diese Adresse verwenden. Um auszuwählen, welches Register Sie schreiben möchten, müssen Sie es zuerst auswählen, indem Sie seinen Indexwert in das CGA CRT Controller Index Register an der E/A-Adresse 3d4h schreiben. Dies bedeutet, dass Ihr Code wie folgt aussehen muss:

mov dx, 3d4h ; CGA CRTC Index Register 
mov al, 09h ; Maximum Scan Line Reigster 
out dx, al 
mov dx, 3d5h ; CGA CRTC Data Port 
mov al, 01  ; 2 scan lines 
out dx, al 

Beachten Sie, dass dies immer noch nicht richtig sein kann, wie VGA andere Parameter auf die maximale Scan-Zeilen-Register hinzufügt. Möglicherweise müssen Sie diese Werte beibehalten, allerdings auf der tatsächlichen CGA-Hardware, die nicht möglich ist, da das Register schreibgeschützt ist. Es kann davon abhängen, wie genau unter welchem ​​Code Sie eine echte CGA-Grafikkarte emulieren.

+0

Ihr Code scheint gut zusammenzupassen und hat den Job richtig gemacht. Vielen Dank! – jbobesto

+0

@CollisionDetection: Sie sollten auf das Kontrollkästchen unter den Auf-/Ab-Pfeilen klicken, anstatt Dankeskommentare zu hinterlassen, wenn eine Antwort Ihr Problem löst. –

+0

Es ist meine erste SO-Frage, angenommen, ich bekomme immer noch den Dreh raus. – jbobesto