BIOS-Funktion um den Bildschirm zu löschen



  • Jo, der Titel sollte eigentlich alles verraten.

    Kann mir jemand ne BIOS-Funktion sagen, mit der ich den Bildschirm löschen kann?
    Die Auflistung der nötigen Registerinhalte und des Interrupts wäre auch sehr nett. images/smiles/icon_wink.gif



  • Also fuer VGA kompatible Grafik/Text-modi kannst du den Bildschirm beim Setzten eines neuen Bildschirm-modus loeschen lassen.
    das ist int 10h.
    ah=00
    al=Bildschirmmodus (von 0:Textmodus bis 13h:256Farben VGA)
    wenn bit 7 von al gesetzt ist, wird der Bildschirm geloescht.
    hm. und warum loeschst du den Bildschirmspeicher nicht einfach manuel? Der Code ist garantiert nicht viel groesser, als der, den du brauchst, um die Register fuer den BIOS call zu setzten... aber schneller images/smiles/icon_wink.gif



  • frage was für nen bildschirm wilst du löschen ? text konsole, grafik schirm oder was ?

    bei vga(320*200*256) einfach das speicherfenster im Ram an adresse a000:0000 (und die folgenden 64000) mit der gewünschten farbe überschreiben

    bei text, das gleiche spiel nur ist das Adr b000:0000 und da dan jedes 2. zeichen mit nem Black ersetzen (80*25 zeichen), da das textfenster wie folgt aufgebaut ist.

    2000 mal
    Monitorzeichen 8 Bit
    Formatirung 8Bit (text / Background farbe, bliken usw. )

    gruss termite

    ps. tastaturkuror muste dann noch Zurücksetzen auf monitoranfang. aber wie das geht keine ahnung



  • Kleine Anmerkung:
    Bei B000:0000 ist bei den standard VGA-Karten der Textspeicher fuer Monochrome Darstellung. Bin mir nicht sicher, ob es da ueberhaupt ein Statusbyte fuer die chars gibt.
    Der Speicher fuer den 16-Farben Textmodus liegt bei B800:0000... Der ist so aufgebaut, wie oben beschrieben.

    Den Textcursor kannst du direkt ueber die VGA-I/O-Ports steuern:
    bx=Pointer in den Bildschirmspeicher (Textmodus)
    shr bx,01h
    mov dx,03D4h
    mov al,0Fh
    mov ah,bl
    out dx,ax
    dec ax
    mov ah,bh
    out dx,ax

    Der Cursor zeigt dann genau zu dem Zeichen, auf das der Pointer im Textspeicher zeigt... Wenn du dein Programm unter DOS verlaesst, und willst, dass DOS an der letzten Cursorposition weiter macht, musst du noch die Cursorposition in der BIOS Info array aendern... (0000:0450)

    Und das ganze via Interrupt:
    ah=02h
    bh=Text Page Number (meistens 00h)
    dl=Column
    dh=row
    int 10h



  • Zum "Bildschirm löschen" (also sowas wie CLS) gibt es auch noch ne andere Funktion des INT 10h. Ich weiß jetzt nicht mehr welche das war, aber sie hatte was mit Scrollen des Bildschirminhalts zu tun. Und wenn man da nen bestimmten Parameter angegeben hatte, wurde der Bildschirm freigemacht.



  • Danke an euch zwei.

    @Termite:
    Falls es dich interessieren sollte, ich will den Bildschirm direkt nach dem Booten mit einer Diskette komplett löschen.
    Also nur weißer Text auf schwarzem Grund - aber ihr habt mir ja schon weitergeholfen, also dürfte das jetzt eigentlich unerheblich sein, oder?

    Noch mal danke für die schnellen Antworten.



  • Das hier sollte den Bildschirm "löschen":

    mov ax,0600h
            mov bh,07h
            xor cx,cx
            mov dx,1950h
            int 10h
    

    Und dazu ein Auszug aus Ralf Browns Interrupt List:

    INT 10 - VIDEO - SCROLL UP WINDOW
    AH = 06h
    AL = number of lines by which to scroll up (00h = clear entire window)
    BH = attribute used to write blank lines at bottom of window
    CH,CL = row,column of window's upper left corner
    DH,DL = row,column of window's lower right corner
    Return: nothing
    Note: affects only the currently active page (see AH=05h)

    Sollte unerheblich sein, dass du noch kein OS geladen hast, da INT 10h meines Wissens vom BIOS bereitgestellt wird.



  • Ach ja, klappt das mit dem Überschreiben des gemappten Bildschirmspeichers (b800:0000) eigentlich auch mit allen Bildschirmseiten? Ich meine mich zu erinnern, dass ich da mal Probleme hatte und deshalb auf ne INT Funktion umgestiegen bin. 😕



  • hm... Eigentlich sollte das ohne Probleme gehen. Einfach die groesse einer Bildschirmseite vom aktuellen Textmodus mit der Nummer der gerade verwendeten Bildschirmseite multiplizieren und von diesem Startoffset aus die ganze Seite loeschen...
    Ich habe zwar codes geschrieben, die nach diesem Prinzip auch auf eine andere Bildschirmseite, als die erste zugreifen koennten, habe es aber noch nicht wirklich getestet 🙄


Anmelden zum Antworten