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 habwenn 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 testenund 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..