bootfähiges terminal, jetzt noch scrollen...



  • servus...

    also ich hab mir jetz mal nen bootfähigen terminal gebastelt, so eins auf dos, nur selbst. Im moment lauft das ding mit den zwei mächtigen funktionen, welche ich zerst selbst coden musste: StrCmp, Gets. und als macro Printstr.
    D.h. ich kann jetz auch befehle eingeben und abfangen.
    Nur einen Haken hat das noch: ich weiss nich wie man den textmodus nach oben scrollen lässt, wenn ich auf der untersten zeile angekommen bin.
    sollte das nicht automatisch gehen ?
    bei mir bleibt er ganz unten stecken und es passiert gar nix mehr, egal was ich eintippe, er druckt auch keinen buchstaben mehr.

    hat jemand ne idee ?
    muss ich im videoram vielleicht die oberste zeile auf 0 setzen und den rest nach oben schieben mit movsw oder so ?
    wollte wissen ob das normal ist.

    mfg
    haMMer



  • also ich kann dir da nur nen theorie tip geben: du kannst ne art framebuffer nehmen. also den ganzen bildschirm inhalt (alle zeilen) zwischenspeichern. wenn du mehr speicherst kannst du auch history-ähnlich nach oben scrollen. du musst wenn du unten angelangt bist einfach im puffer alles eins weiter rauf schieben, und den bildschirmausschnitt neu zeichnen



  • Hammer schrieb:

    muss ich im videoram vielleicht die oberste zeile auf 0 setzen und den rest nach oben schieben mit movsw oder so ?

    Jo, so in etwa. Die oberste Zeile musst du jedoch nicht auf 0 setzen, die wird wenn der ganze Bildschirminhalt um eine Zeile nach oben kopiert wird zwanglaeufig eh neu beschrieben.
    Korbinians Vorschlag mit dem virtual screen (einfach ein Array irgendwo im Speicher, wo der Bildschirminhalt unsichtbar zwischengelagert wird) ist auch net schlecht.
    Fuer eine normale Konsole ohne die angesprochene Scrollhistory ist das aber nicht noetig.



  • stimmt, das mit dem 0 setzen brauch ich nich. gut ich denke das wär machbar für mich. die prozedur pack ich am besten in die mainloop nach jeder eingabe sofern der cursor ganz unten ist.
    thx..



  • ouch..

    ich hoffe der int 10h schreibt mir auch einen string aus dem datensegment
    an die richtige stelle b800:offset, wo ich vorher den cursor mit funktion 03h hinbewegt hab

    wenn ich die 3te zeile von b800:0160 z.b. nach b800:0000 byteweise verschieben will, spuckt er nur schrott aus ...

    mov ax, 0b800h
    mov es, ax
    
    mov di, 0
    mov si, 160
    mov cx, 80
    rep movsb
    

    normalerweie tritt dieser effekt dann auf, wenn ein buchstabe an alle ungeraden bytes geschrieben wird, da diese für das format/farbe zuständig sind..

    wobei wenn ich einen string mit rep movsb aus ds:offset nach b800:0000 verschiebe, gibt es keine probleme



  • Zeigt in deinem Code ds auch auf B800?
    Und: Weshalb byteweise verschieben? Pro Buchstabe sind es doch eh immer 2 byte.



  • nein.. ds is bei mir das daten segment, hat nichts mit b800 zutun.
    darin liegt auch nich das problem, das war nur zum testen

    und wordweise hab ichs am anfang ja auch gemacht, nur da er müll anzeigte, hab ichs auf byte runtergedreht um ev. den fehler einzugrenzen.

    also ich will die 3te zeile die bei es:0160 beginnt nach es:0000 verschieben.
    es zeigt auf b800h. ich glaub ich speicher mal einen string ohne interrupt in den videoram und probiers dann nochmal... mir kommt der int irgendwie merkwürdig vor.



  • Hammer schrieb:

    also ich will die 3te zeile die bei es:0160 beginnt nach es:0000 verschieben.

    Das ist doch an sich gar nicht so schwierig 😕

    mov ax,0B800h
    mov es,ax
    mov ds,ax ;movs kopiert von ds:si nach es:di
    mov cx,80
    mov si,160
    mov di,0
    ;cld ?
    rep movsw
    


  • AAAAAAAHHH ... movsw kopiert von DS nach ES ?

    ok.. dann ich alles klar.. 🤡

    hab den befehl bisher nur im 32bit asm verwendet, und da spielen ja nur die offsets eine rolle ...



  • haja jetz gehts scrolling.. total easy..

    jetz blick ich erst, warum du gefragt hast, ob ds auf b800 zeigt 😃

    lol..
    ausserdem wusste gar nicht ,dass ich movs zum ersten mal im 16bit mode verwende.. 😕


Anmelden zum Antworten