8086: 2 Fragen: BackBuffering und Speicher



  • @Ringding:
    Solange da nichts schlechteres als ein 486 drinsteckt (386 waere immerhin noch moeglich - VGA gab es ~2Jahre vor dem 486), sollte das doch nicht so~ schlimm sein. 😕
    Und selbst auf einem 386 mit 16MHz sollte das noch halbwegs laufen...
    Eine kopie des gesammten Bildschirms sollte im guenstigsten Fall ~4ms (mit rep movsd) dauern.
    Im unguenstigsten Fall kommt dann vielleicht irgendwas um 20ms raus... KA, wie das damals mit den restlichen Speichertimings so aussah. 🙄
    Das sollte aber eigentlich auch noch reichen, um das Flackern in Grenzen zu halten...

    Wie auch immer - wenn du schon bei langsamen Maschinen bist: Mit dem ModeX haettest du dann auch nichts besseres als eine garantiert flimmerfreie Diashow. :p



  • Hey, Diashow ist doch schonmal was schönes - immerhin währe damit schonmal "Wer wird Millionär" drin - auch wenn ich keine Quiz spiele mag *g*

    Naja. Commander Keen und Rock'n'Roll hatten ja auch nur 16 Farben. Rock'n'Roll nicht mal wirklich glattes Scrolling.
    Rollin hatte schon mehr Farben aber immernoch 320x200 (oder 240). Ich denke mal jetzt wo ich drüber nachdenke, dass die sich sicher schon mit Mode 13h zufrieden gegeben haben. Scheint ja doch schnell genug zu sein als das man damit auch Scrolling realisieren kann.
    Zumindest höre ich das hier so raus. VESA ist mir doch jetzt etwas zu umständlich. Nicht, dass es unbedingt schwer währe (mit den Pages) aber doch jetzt etwas übertrieben. Bevor ich mit VESA anfange nehme ich lieber doch wieder OpenGL und Win32.
    DOS mache ich ja jetzt nur aus schulischen Gründen und aus Interesse. Also werde ich wohl mal gucken was man mit MODE 13h so alles hinbekommen kann 🙂



  • @Nobuo T: Die Geschwindigkeit hing sehr von der Grafikkarte ab, und da hat es schon arg langsame Kandidaten gegeben!

    Rock n' Roll kenne ich leider nicht, aber Commander Keen hatte tatsächlich nur 16 Farben. Die waren eigentlich genauso mühsam zu programmieren wie der ModeX, und man konnte auch einen Hardware-Pageflip machen, IIRC.

    Wenn du ein vernünftiges V-Sync machst, wirst du auf einem nur irgendwie halbwegs aktuellen Rechner kein Problem mit dem Mode 13h haben.



  • So. Wo ich die Probleme mit eurer Hilfe soweit jetzt alle lösen konnte kommt nun das nächste kleine Problem:

    Ich habe grade erfahren, dass wir in der Schule nur COM Dateien machen. Bei der EXE gab es ja noch ein Header den man so umstellen konnte, dass man genug Speicher reservieren konnte @runtime. Aber die COM hat ja keine. Was für eine Möglichkeit gibt es da für mich um Speicher zu reservieren z.B. für einen BackBuffer? Ich habe nur 9 freie Paragraphen. Das ist ein wenig "wenig" *g*

    Und bez. Rock'n'Roll (auch wenn die AMIGA Version deutlich besser war):
    http://www.the-underdogs.org/game.php?id=1750



  • Mit der DOS-Funktion 48h (glaube ich mich erinnern zu können, ist schon ein paar Jahre her) kannst du auf jeden Fall Speicher reservieren. Wenn nicht soundso schon standardmäßig der ganze Speicher für dein Programm hergegeben wurde (weiß jetzt nicht mehr, ob das nicht eh so ist).



  • hm... *such* Jo. .com-Programmen wird automatisch beim Start der gesammte freie DOS-Speicher reserviert. Dh. Du kannst direkt den Speicher hinter dem Segment, in dem dein Programm liegt, mit irgendwelchem Zeug vollschreiben.
    Funktion 48h funktioniert dann auch erst wieder, wenn du mit Funktion 4Ah AFAIR den Speicher fuer dein Programm begrenzt hast. Brauchst du wie gesagt aber eigentlich nicht. 😉



  • Ach so, wenn die COM Datei nun sich in 0D25 gespeichert hat kann ich also 0D26, 0D27, 0D28, etc. frei für meine Zwecke nutzen?
    Dann sollte ich vielleicht eine kleine Speicherverwaltung programmieren, nicht das ich nachher ein komplettes Segment nur mit 256 Byte belege.

    Weil grade die Funktion 48h hatte mir ja gesagt, dass kein Platz mehr ist.
    Kann es sein, dass im PSP (befindet sich ja scheinbar an Offset 0 im Programmsegment) direkt am Offset 02 steht wieviele Paragraphen ich nach dem Programmsegment noch benutzen kann?



  • _ProfEich schrieb:

    Ach so, wenn die COM Datei nun sich in 0D25 gespeichert hat kann ich also 0D26, 0D27, 0D28, etc. frei für meine Zwecke nutzen?

    Du hast die Adressierung im RealMode noch nicht ganz durchschaut, oder?
    So ein .com-Programm belegt normalerweise 64KByte. Das faengt vorn mit dem PSP an und endet hinten mit dem Stack. Demnach kannst du den Speicher erst 64KByte weiter hinten nutzen. Wenn dein Programm also bei 0D25h:0000h liegt, ist der Speicher erst ab 1D25h:0000h wieder frei. ⚠
    Du koenntest uU. noch den Stack nach vorn verlagern und so etwas "Speicher frei machen" - ist aber nicht so wichtig.
    Und nochmal zur Adressierung im RealMode: C/C++ Forum :: FAQ - Assembler :: Protected Mode / MMX und dann auf ProtectedMode Tutorial.

    _ProfEich schrieb:

    Dann sollte ich vielleicht eine kleine Speicherverwaltung programmieren, nicht das ich nachher ein komplettes Segment nur mit 256 Byte belege.

    Brauchst du nicht unbedingt - es gibt da schliesslich schon Funktion 48h von DOS. Ansonsten wuerde ich mir sowieso vorher ueberlegen, wie der Speicher strukturiert werden soll, und den Speicher dann "statisch reservieren", indem du einfach fixe Werte auf die Segmentadresse deines .com-Programms addierst.

    _ProfEich schrieb:

    Weil grade die Funktion 48h hatte mir ja gesagt, dass kein Platz mehr ist.

    Jo - wie gesagt, damit die wieder funktioniert, musst du mit Funktion 4Ah zuerst den Speicher deines .com-Programms wieder auf 64KByte (=1000hParas) begrenzen.

    _ProfEich schrieb:

    Kann es sein, dass im PSP (befindet sich ja scheinbar an Offset 0 im Programmsegment) direkt am Offset 02 steht wieviele Paragraphen ich nach dem Programmsegment noch benutzen kann?

    Nicht direkt. Da steht die Speichergroesse in Paras. Sollte immer irgendwas um 9FFx sein - also ~640KByte. Zum PSP ist vielleicht folgende Seite recht aufschlussreich: http://www.clipx.net/ng/interrupts_and_ports/ng8f17f.php



  • Sorry für den Doppelpost - damit das nicht mehr ganz so oft vorkommt bin ich ab sofort mal wieder mit nem geregtem Nick unterwegs...

    Will mal etwas Arbeit abnehmen und den Kram vom vorherigen Post erstmal nochmal wiedergeben:
    _______________________________________________________________
    Ach so, wenn die COM Datei nun sich in 0D25 gespeichert hat kann ich also 0D26, 0D27, 0D28, etc. frei für meine Zwecke nutzen?
    Dann sollte ich vielleicht eine kleine Speicherverwaltung programmieren, nicht das ich nachher ein komplettes Segment nur mit 256 Byte belege.

    Weil grade die Funktion 48h hatte mir ja gesagt, dass kein Platz mehr ist.
    Kann es sein, dass im PSP (befindet sich ja scheinbar an Offset 0 im Programmsegment) direkt am Offset 02 steht wieviele Paragraphen ich nach dem Programmsegment noch benutzen kann?
    _______________________________________________________________

    Da ich selber auch noch Anfänger bin (wie man sicher schon längst gemerkt hat) habe ich noch nicht beachtet, dass 0000:0010 dasselbe ist wie 0001:0000.

    Da der Stack der COM Datei nun bei 0D25:FFFF abwärts geht und das Programm an 0D25:0100 liegt und vielleicht etwa 0100 groß ist hätte ich nun einmal den Bereich dazwischen und dann ggnf. noch etwas außerhalb von 0D25 - 1D24.

    Heißt das jetzt genau, dass ich die Segmente 1D25 bis vielleicht 9FFF für mich hätte oder kann ich da noch in irgendwelche Konflikte geraten? (Somit währe dann PSP:0002 wohl das letzte Segment, welches ich benutzen darf?)



  • ProfEich schrieb:

    Sorry für den Doppelpost - damit das nicht mehr ganz so oft vorkommt bin ich ab sofort mal wieder mit nem geregtem Nick unterwegs...

    NP 😃 Das kann dir auch gereggt passieren und Beitraege loeschen kannst du so auch nicht.

    ProfEich schrieb:

    Heißt das jetzt genau, dass ich die Segmente 1D25 bis vielleicht 9FFF für mich hätte oder kann ich da noch in irgendwelche Konflikte geraten?

    Sollte keine Konflikte geben.

    ProfEich schrieb:

    (Somit währe dann PSP:0002 wohl das letzte Segment, welches ich benutzen darf?)

    Nope: Das letzte Segment, das du voll benutzen koenntest, waere 9FFFh - 1000h, weil wegen den 64KByte.
    Wuerdest du in 9FFFh beispielsweise das Offset FFFEh ansprechen, wuerdest du schon bei der physikalischen Adresse 0AFFEEh (=A000:FFEE) landen - das waere irgendwo im VGA-FrameBuffer.

    BTW: Der Stack liegt normalerweise (D)Word-Aligned. Also in .com-Programmen bei FFFEh.



  • [nerv] So, thx.
    Ist ja nichtmal nen doppelpost geworden. Hab erst gar nicht bemerkt dass du vorher schon geantwortet hattest.

    Naja.. Ich möchte noch ein (vorerst) letztes mal nerven *g*
    Bei Google und in der Forensuche nichts gefunden:

    Alsooooo: Ich möchte gerne sogesehen ein KEY_DOWN und KEY_UP Event abfangen. Soweit ich weiss brauche ich dafür wohl Interrupt 9.

    Kann mir wer vielleicht ein kleines Beispiel zeigen, wie ich ein Programmteil von mir als Int 9 benutzen kann - dort abfragen kann ob eine Taste gedrückt oder losgelassen wurde (und welche (Pfeiltasten hauptsächlich)) und dann noch den alten Interrupt aufrufen kann?

    Sogesehen ein Int 9 Hook mit kleinem Beispiel währe nett 🙂
    Ich denke mehr brauch ich dann erstmal nicht mehr für ein kleines Spiel (höchstens Timer demnächst nochmal - weil die spinnen bei mir und das mit dem VSync geht unter DOS nicht - aber dazu später *g*).

    Thx 😃 [/nerv]



  • Ich werd jetzt da kein komplettes Programm für den IRQ Handler schreiben, aber im Prinzip ist es gar nicht schwer. Alten Handlerpointer auslesen und merken. Deinen Handler installieren. Im Handler rufst du dann den alten mit far call auf, vorher musst du aber ein pushf machen. Sonst halt der übliche Dreck mit EOT (out 20h, 20h oder so). Auf welchem Port du die Scancodes einlesen kannst, weiß ich jetzt nicht auswendig (61h oder 63h glaub ich).

    V-Sync geht schon, zumindest in Mode 13h oder Mode X.



  • Na, einen EOI braucht (/sollte) er nicht machen, wenn er danach noch den original IRQ1-Handler aufruft.
    Die Scancodes der Tastatur lassen sich ueber port 60h auslesen.
    Wird eine Taste losgelassen, wird AFAIR der Scancode or 80h auf port 60h gesendet...
    BTW: AFAIR zaehlen die Pfeiltasten auch zu den Extended keys. Bei denen wird vor dem eigentlichen Scancode ein IRQ ausgeloest, bei dem port 60h E0h zurueckgibt. Erst beim naechsten IRQ steht dann der eigentliche Scancode bei port 60h.



  • Nobuo T schrieb:

    Na, einen EOI braucht (/sollte) er nicht machen, wenn er danach noch den original IRQ1-Handler aufruft.

    Stimmt.

    Der Rest deckt sich auch mit meiner Erinnerung 🙂



  • Gut, danke 😃

    Klappt jetzt 🙂

    Hab halt mit Interrupt 21h, 35h den alten Offset vom Interrupt ausgelesen und dann mit 21h, 25h den neuen gesetzt und dann mit IN AL, 60h kam man an den Scancode. Dann nur noch zum alten Interrupt springen und es funxt 🙂
    Auch wenn mans nicht vergessen sollte zurückzusetzen *g*


Anmelden zum Antworten