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. 🙂


Anmelden zum Antworten