2015-10-06 15 views
7

In C, wie schreibe ich in einen bestimmten Speicherort z. Videospeicher b800, in DOS (echtes DOS, MS DOS 6.22)In C, wie schreibe ich in einen bestimmten Speicherort z. Videospeicher b800, in DOS (echtes DOS, MS DOS 6.22)

Ich verstehe, dass C nichts eingebaut hat, um das zu tun, aber dass es einige plattformspezifische z. DOS-spezifische API-Funktionen, die.

Ein kleines Demo-Programm, das wäre toll.

Ich habe Turbo C (TCC.EXE - nicht winzig C-Compiler, Turbo-C-Compiler)

Debug weiß es tun können (zB einige der winzig bisschen debug, die ich kenne) -f b800:0 FA0 21 CE (dass einige schreiben Ausrufezeichen in der Befehlszeile). Aber ich möchte, dass ein C-Programm auf b800 schreibt: 0

+3

konnte Zustand abgegebenen Stimmen zu schließen, ein Grund? – barlop

+0

Hat Ihr System einen segmentierten oder ausgelagerten Speicher? Müssen Sie weit und nahe Zeiger machen? – dawg

+0

@dawg ** DOS ** bedeutet Segmentierung – fjardon

Antwort

7

Die Adresse b800:0000 verwendet ein Segment von 0xb800 und einen Offset von 0x0000. Dies entspricht der linearen Adresse 0xb8000 (beachten Sie die zusätzliche 0, da das Segment um 4 Bits nach links verschoben wird).

Um einen Zeiger an diese Adresse in protected mode zu erstellen, geben Sie

char *p = (char *)0xb8000; 

Allerdings verwenden würde, werden Sie wahrscheinlich sind in real mode, so dass Sie ein far pointer konstruieren müssen:

char far *p = (char far *)0xb8000000; 

Die Der 32-Bit-Wert ist in zwei 16-Bit-Werte aufgeteilt, die Segment und Offset zugeordnet sind.

können Sie diesen Zeiger verwenden normalerweise, dann:

*p = '!'; 
+2

Um sicher zu sein um * etwas * zu sehen, ist es besser, das Zeichenattribut zu setzen. – fjardon

+0

@fjardon hat Recht. Vielleicht möchten Sie ein Beispiel für eine Funktion "String schreiben mit Farbe" hinzufügen. Der OP kann sich der Verschachtelung von Zeichen- und Attributdaten nicht bewusst sein. – usr2564301

+0

Ich bin sicher, dass ich dies in Windows 7-Eingabeaufforderung funktionierte. Codeblocks IDE startet eine Befehlskonsole zum Ausführen von Programmen. Aber jetzt versuche ich es, ich bekomme diese Fehler http://i.imgur.com/7jtfbca.png gcc gibt die gleichen Fehler. http://pastebin.com/raw.php?i=AtscYUJW Sicher Win7 32bit hatte debug.exe, die Sie '-f b800: 0 FA0 21 CE' So kann ich nicht sehen, warum es in Win7 nicht kompiliert? Ich bin mir sicher, es hat – barlop

3

Können Sie versuchen, diese (nicht getestet, wie ich habe meinen alten PC nicht)

char far* video = 0xb8000000L; 
*(video++) = '!'; 
*(video++) = 0x0A; 
0

Erstellen Sie einfach einen Zeiger auf die Basis adressieren und dann auf den Speicher zugreifen, als wäre es ein Array. Erinnern Sie sich daran, dass im Textmodus zwei Bytes für jedes Zeichen auf dem Bildschirm angezeigt werden. Der erste, hält das Zeichen selbst. Die zweite enthält das Attribut. Die höherwertigen 4 Bits sind das Hintergrundattribut und die niedrigen 4 sind der Vordergrund. Wenn Sie das höchste Bit im Vordergrundattribut festlegen, wird es zu einer Farbe mit hoher Intensität, während das Bit höherer Ordnung im Hintergrundattribut dazu führt, dass der Vordergrund blinkt. Dies bedeutet, dass 8 Farben für den Hintergrund verfügbar sind, 16 für den Vordergrund und schließlich die Fähigkeit, den Text blinken zu lassen.

ZB muss für Sachen Modus 0x13: char far *graphScreen = (char far*) 0xA0000000;

Und für Textmodus Sachen, char far *textScreen = (char far*) 0xB8000000;

den Bildschirmspeicher zu schreiben, ist dann so einfach wie textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;