Hello, Guest the thread was called459 times and contains 6 replays

last post from Sheldonator67 at the

Input Zone

  • Hallo alle zusammen,


    bin neu in diesem Forum und wollte mich kurz vorstellen.

    Bin ein 67 Modell und mit dem C64 gross geworden (eigentlich hat alles mit einem ZX81 angefangen). Habe über 20 Jahre

    an einem IBM Mainframe programmiert (Coder Erfahrung) jedoch NIE Assembler. Ein paar Tutorials habe ich hinter mir und wollte ein

    kleines Prog. schreiben um meinen Spritverbrauch zu berechnen...


    Habe jetzt einige Fragen und hoffe dass die Gurus unter euch mir weiterhelfen können.


    Wie kann man, grob gesagt, eine ´Input Zone´ programmieren ?


    Habe meinen bescheidenes Debut hochgeladen ;-)

  • Hallo! WIllkommen im Forum!


    Input Zone

    Was meinst Du mit "input zone"? Eine Eingabemaske? Möchtest Du einen String einlesen und den String während der Eingabe am Bildschirm anzeigen? Falls ja, welche Tasten dürfen dabei gedrückt werden? Kann man nur das letzte Zeichen löschen (einfachste Lösung) oder soll man mit dem Cursor über die Buchstaben zurückgehen und weitere Zeichen dazwischen einfügen können (anspruchsvoll)?


    Genereller Hinweis: Es ist besser, keine festen Adressen im Programm zu verwenden wie z. B. "beq $085A". Dafür gibt es Labels, deren Adresse der Assembler automatisch für Dich berechnet.


    Was Du wahrscheinlich für die EIngabe brauchst, ist eine Schleife in der Art (hingepfuschter nicht überprüfter Pseudocode):

    Sowas läßt sich mit wenig Aufwand in Assemblercode übersetzen. Tip: Verwende für die Indizierung des Strings das Indexregister Y und schreibe den Code am besten als Unterprogramm.

  • Danke für die schnelle Antwort.


    Ich brauche drei prädefinierte Felder :


    Kilometer : ____ (4 dez. keine Komma)

    Liter : ____ (3 dez. mit Komma)


    Durschnitt : ____ (3dez. mit Komma)



    Wenn du mein moyenne.asm laufen lässt kanns du schon erkennen auf was ich hinaus will .:D


    Leider scheitere ich schon daran Zahlen einzugeben :S


    Der Cursor sollte mit 'Enter' von Kilometer auf Liter springen, mit dem nächsten 'Enter' wieder

    auf Kilometer und dabei sollte der Durschnitt errechnet werden.

  • Ich brauche drei prädefinierte Felder :

    Ooookaayyy.... Hmmm.... Wie soll ich sagen...:gruebel


    Für die beschriebene Aufgabe ist Assembler eine undankbare Sprache - wenn auch nicht völlig undenkbar -, und man löst sie im Allgemeinen lieber in einer Hochsprache (inklusive Basic). Warum?


    - Assembler ist besser geeignet für Programme die auf einfachen Datentypen wie (u)int8, (u)int16 oder Zeichen basieren. Im Programm möchtest Du jedoch Zahlen mit einem Komma eingeben, was auf die Verwendung von Fließkommazahlen hindeutet. Der 6502 kennt leider keine eigenen Befehle für die Verarbeitung von Fließkommazahlen, so daß man in einem direkten Ansatz auf die Verwendung von Fließkommaroutinen im Basic-Rom zurückgreifen müßte.

    Alternativ würde man eine auf Integerzahlen basierende Festkommadarstellung heranziehen. Diese verhält sich bei Addition und Subtraktion wie normale Integerzahlen. aber z. B. bei der Multiplikation muß das Ergebnis anschließend mittels einer DIvision durch Basis Anzahl der Nachkommastellen korrigiert werden. Beispiel:

    Die Festkommadarstellung verfügt über eine Stelle nach dem Komma. Die Basis ist 10 (Dezimalsystem). Dann wird für die Umwandlung einer Zahl in die Festkommadarstellung

    - "16.0" mit 10 multipliziert und intern dargestellt als 160.

    - "0.5" mit 10 multipliziert und intern dargestellt als 5.

    Die Multiplikation gestaltet sich so:

    16.0 * 0.5 ergibt 8.

    In der Festkommadarstellung wird jedoch 160 * 5 = 800 berechnet. Eine anschließende Division durch 101 (Basis 10 mit einer Nachkommastelle) ergibt den korrekten Wert 80 in der Festkommadarstellung, was 8.0 entspricht.

    Solch eine Festkommadarstellung wäre der einfachste Weg, um mit Kommazahlen umzugehen, jedoch steht man als Assemblereinsteiger trotzdem vor der Frage, wie man eine Zahl multipliziert und auch dividiert. Das ist auf dem 6502 etwas knifflig und für Einsteiger nicht unbedingt geeignet.


    - Das Markenzeichen von Assembler ist, daß man alles selber machen muß. Du verwendest zwar in Deinem Programm Routinen aus dem Kernal- und Basicrom, doch würde man dies in der Praxis selten so machen. In der Regel läßt man das Rom links liegen (verschwendet nur kostbaren Speicherplatz) und schreibt sich die Ausgaberoutinen selber. So oder so stehst Du nämlich schnell vor dem Problem, daß das Rom nicht die gewünschten Routinen bereithält, um eine Eingabemaske nach Deinen Wünschen zu erzeugen. Tatsächlich hast Du in Assembler das Vergnügen, Dir das Alles selber konstruieren zu müssen. Und das ist wesentlich mehr Aufwand, als man zunächst denkt.


    Den ungefähren Algorithmus zum Einlesen eines Strings habe ich Dir bereits oben vorgegeben. Diesen mußt Du als Erstes umsetzen, um überhaupt einen String einlesen zu können. Damit ist es aber nicht getan. Als Nächstes benötigst Du eine Routine, welche den EIngabestring auf Korrektheit überprüft: Wurden unerlaubte Zeichen eingegeben? Gibt es zwei Punkte anstelle von einem? usw. Gleichzeitig mit der Überprüfung werden die Zeichen aus dem Eingabestring umgewandelt in Zahlenwerte für die Weiterverarbeitung. Dieser Teil ist schon sehr knifflig.

    Danach folgt die Berechnung. Hierfür brauchst Du mindestens eine Division (Durchschnittsberechnung). Die ist - wie gesagt - für Anfänger nicht so leicht nachvollziehbar.

    Am Ende soll das Ergebnis ausgegeben werden. Für die Ausgabe muß die Zahl jedoch wieder umgewandelt werden in einen String. Auch diese Konvertierung ist ein Problem für sich und kann nicht schnell gelöst werden.

    Als Ergebnis erhält man ein Programm, welches in Basic oder C nur ein paar Zeilen lang ist, aber in Assembler hunderte von Zeilen umfaßt.


    Nun könnte man dahin gehen und sagen: Okay, ich schreibe keine eigenen Routinen für all das, sondern verwende für das Programm einfach die Routinen im Basic-Rom. Kann man machen, aber das wäre dann so, als würde man schreiben

    Code
    1. int main {
    2. printf("Jetzt startet das Programm.");
    3. programm_starten();
    4. printf("Jetzt macht das Programm was.");
    5. programm_verarbeiten();
    6. printf("Jetzt ist das Programm zuende.");
    7. programm_beenden();
    8. }

    Mit anderen Worten: Das Programm fungiert nur als Stichwortgeber für vorgefertigte Routinen irgendwo. Damit ist man aber noch kein C-Programmierer und wird mit dieser Methode auch nie zu einem Assemblerprogrammierer.


    Kurz gesagt: Dein Beispielprogramm sieht in einer Hochsprache sehr kurz und leicht aus; sowas schreibt man in paar Minuten. In Assembler jedoch wirst Du als Einsteiger Wochen gebrauchen, um es einigermaßen hinzukriegen, weil sich hinter jedem Baustein der Hochsprache (EIngabe, Ausgabe, Berechnung, Zahlen-/Stringkonvertierung) ein Riesenberg von Assemblercode verbirgt. (Naja, das war ja auch mal der Grund, warum man Hochsprachen erfunden hat...)

    Anfängern wird daher zumeist empfohlen, sich an kleine Projekte zu wagen, z. B. ein Sprite über den Bildschirm zu bewegen. Damit kommt man schneller zu einem sichtbaren Ergebnis mit Aha-Effekt, als wenn man sich wochenlang mit doch eher trockenem Stoff herumschlägt.


    Wenn Du unbedingt willst, kannst Du natürlich Dein Programm weiterentwickeln, und der eine oder andere wird Dir auch dabei helfen. Aber sei darauf vorbereitet, daß dies schnell zu großem Frust führen kann, und das ist ja nicht der Sinn der Sache.

  • @M.J.


    Vielen Dank für Deine ausführliche Erläuterung :thumbup: .


    Wie Du schon sagtest habe ich in mehreren Tutorials gelesen dass Assembler nicht die geeignete Sprache ist um arithmetische Berechnungen

    zu bewerkstelligen. Nach meinem 'Hello World' in Assembler dachte ich, ich könnte mich an ein kleines Prog. wie 'Spritverbrauch' wagen :!:


    Du hast mich eines Besseren belehrt -> 'Spritverbrauch' :grab1:


    So nächste Herausforderung ein Sprite mit Hilfe der Cursor Tasten über den Bildschirm bewegen mit eventueller Kollisionsabfrage 8o




    in diesem Sinne...bis (sehr) bald :D:D:D