Im DOS(!) Screen löschen
-
Hi,
Wie kann ichim DOS - NICHT IN DER KONSOLE! - den Bildschirminhalt löschen? In den FAQ steht zwar ne ganze Menge, das ist aber nur für die Konsole.
-
Hallo ...
unter DOS hab' ich das immer so gemacht: einen Zeiger, der in's Bildschirm-RAM zeigt definiert und dann alles ab dieser Adresse mit dem gewünschten Bytes überschrieben. Der Bildschirmspeicgher beginnt in DOS normalerweise an der Adresse 0B8000h. In C sollte das so aussehen (ungetestet):
int main(void) { unsigned char *screen = (unsigned char*)0x0B8000; int i; for (i = 0; i < 80*25*2; i++) screen[i] = 0; return 0; }
Der Code sollte mit einem 16-Bit Compiler (Turbo C 2/3) compiliert werden. Du musst 4000 (80*25*2) Zeichen löschen, weil im Standard 80x25 Textmodus pro Zeichen 2 Bytes abgespeichert werden. Eines für das Zeichen selbst, das andere für die Farbcodierung dieses Zeichens.
-
ach ja ...
wenn Du mehr unter DOS programmieren musst/willst, kann ich Dir zwei Bücher empfehlen, die man aber nur noch gebraucht bekommen kann (leider):
- PC intern, Michael Tischer
- Das neue PC-Profibuch, Martin Althaus
-
Danke erstmal. Das Programm wird zwar kompiliert, macht aber absolut garnichts... Das soll zwar nur ein kleiner Ausflug in die DOS-Welt sein, aber trotzdem danke für die Buchtipps.
-
ich dachte 0x0B800 sei die richtige adresse, versuchs mal damit, also mit debug komm ich bei der adresse richtig raus!
das sind wirklich 5 zeichen, das muss so sein *g*, die adresse ist in wirklichkeit B8 00 und damit das von dos nicht mit irgendetwas anderem verwechselt wird (hab vergessen womit), muss man das so: 0x0B800 schreiben
-
muss man das so: 0x0B800 schreiben
Nein, muß man nicht. Das muß Du dann, wenn Du den Assembler bemühst. Mit der führenden 0 zeigst Du im an, daß es sich um eine Zahl handelt. In C setzt Du da 0x vor und benötigst die 0 nicht mehr. Außerdem fehlt Dir hinten eine 0. Die Adresse ist schon die, die mady angegeben hat. Aber der Pointer muß IMO ein Far-Pointer sein. Einfacher geht es jedenfalls mit poke aus <dos.h>:
#define BUILD_TEXTATTR(f, b) (int)((((b) & 0x0F) << 4) | ((f) & 0x0F)) #define BLANK(chr, attr) (int)((((attr) & 0xFF) << 8) | ((chr) & 0xFF)) void clrscr(void) { int i; for(i = 0; i < (80 * 25 * 2); i += 2) poke(0xB800, i, BLANK(' ', BUILD_TEXTATTR(7, 0))); // Cursor Home poke(0x0045, 0, 0); return; }
-
wieso FEHLT mir hinten eine null, du hast doch auch B800 geschrieben, und das ist die adresse, also wenn ich in dos
debug
d B800:0
eingebe, kommt das richtige raus, oder muss man die letzte null von "b800:0" irgendwie mit einstricken??
-
wieso FEHLT mir hinten eine null, du hast doch auch B800 geschrieben, und das ist die adresse,
Nein, das ist das Segment. Die Adresse ist 0xB800 * 16 + i.
oder muss man die letzte null von "b800:0" irgendwie mit einstricken??
So wird da schon eher ein Schuh draus.
-
@-King-: Danke, das funzt.