Hello, Guest the thread was called1.1k times and contains 26 replays

last post from Mike at the

Problem mit dem Befehl sec und sbc

  • Hi Leute

    ich muss wohl irgend wie auf den Schlauch stehen.

    gebe ich folgende Befehle eine für eine Subtraktion ein

    Code
    1. sec
    2. lda counter
    3. sbc #$02
    4. sta counter
    5. .
    6. .
    7. counter
    8. !byte $28

    kommt nach dem Aufruf des Programms nicht $26 raus sondern $fe.

    Habe mir deswegen ein paar Bücher zur Hand genommen um nach zu schlagen was daran falsch sein könnte. Aber laut den Bücher müsste es so richtig sein.

    Oder ich verstehe die Wörter in den Bücher falsch.

    Ich habe es auch mit dem Befehl "dec counter" versucht, auch da kommt ein falsches ergebnis raus. Ich weis einfach den Grund nicht, warum das so ist. Vielleicht kann mir das mal jemand erklären.


    Gruß Drachen :)

  • Das ist alles richtig. Das Problem muss also irgendwo außerhalb Deines Codeschnipsels liegen. Vielleicht wird counter irgendwo überschrieben?

  • ...wobei ich persönlich das sec bzw. clc immer erst direkt vor den Subtraktions/Additions-Befehl schreibe... aber daran liegt es nicht.


    Wenn ich mal den klassischen Fehler ausschließe, dass du sbc $02 statt sbc #$02 geschrieben hast scheinst du evtl. irgendwo anders noch den Counter-Wert zu verändern (er liegt aber laut Beispiel nicht in der Zeropage?). Also entweder per Label (Counter) oder gar als Adresse ($xxxx). Als einfachen Test könntest du den Counter mal an eine ander Speicherstelle setzen bzw. am Start des Programmes direkt zur Subtraktion springen und direkt danach anhalten (jmp *) und im Monitor den Wert vergleichen. Solltest du IRQs nutzen, die mal abschalten.

  • Hi Leute

    Gut für die Infos, habe schon gedacht das ich zu blöd bin für eine einfache Subtraktion.

    hier mal den komplette Code den ich anspringe.

    vielen Dank für eure Hilfe


    Gruß Drachen

  • Warum eigentlich so kompliziert? Ist dein Y-Register noch frei? Wenn ja, dann lade den Counter dort hin, mach zweimal 'DEY' und speicher den Counter wieder ab.


    Nochmal drüber nachgedacht... Es gibt auch noch DEC <adresse>, kostet 5 oder 6 Zyklen und zählt den Inhalt der Speicherstelle um 1 runter. zweimal hintereinander schreiben und du hast deinen '-2' auf diese Weise.

  • Deine farben-Tabelle hat $2a Einträge, das heißt der letzte Wert ist bei farben+$29. Deine Schleife kopiert aber nach farben+2,x mit x=$28, also nach farben+$2a. Damit wird counter gleich am Anfang mit 0 überschrieben.

  • Deine farben-Tabelle hat $2a Einträge, das heißt der letzte Wert ist bei farben+$29. Deine Schleife kopiert aber nach farben+2,x mit x=$28, also nach farben+$2a. Damit wird counter gleich am Anfang mit 0 überschrieben.

    Oh Mann wie dämlich ist das denn. :platsch:


    Danke Claus für diesen kleinen Hinweis. :applaus:


    Warum eigentlich so kompliziert? Ist dein Y-Register noch frei? Wenn ja, dann lade den Counter dort hin, mach zweimal 'DEY' und speicher den Counter wieder ab.


    Nochmal drüber nachgedacht... Es gibt auch noch DEC <adresse>, kostet 5 oder 6 Zyklen und zählt den Inhalt der Speicherstelle um 1 runter. zweimal hintereinander schreiben und du hast deinen '-2' auf diese Weise.

    Das mit dec hatte ich ja auch schon probiert, aber weil ich die Farbwerte an die falsche Stelle kopiere, war natürlich das ergebnis auch falsch. Aber danke für deinen Tipp Gerrit


    Gruss Drachen

  • Hi WebFritzi


    Ja das war am Anfang auch mein Gedanke es so zu machen. Das Problem wo ich noch habe ist, das der Counter, wärend das Programm läuft, sich veränder. Sprich er wird grösser. So lange die Zahlen gerade sind, kein Problem, aber was mache ich wenn der Counter eine Ungerate Zahl ist.

    Daran grüble ich gerate.

    Leider bin ich nicht so der Assembler-Crack.

    Im meinen Basicprogramm sieht das so aus.

    Code
    1. FOR X=SL% TO 1 STEP-1
    2. SA%(X)=SA%(X-1)
    3. NEXT

    Und wie gesagt, im Grunde möchte ich diese Routine im Assmbler umsetzten.

    Denn je länger der Counter wird, in meinen Basicprogramm, desto langsamer wird mein Programm.

    Aber mit viel Grübeln komme ich schon auf den Trichter. Bei großen Probleme kann ich hier ja kurz nachfragen. :D


    Gruß Drachen

  • Drachen: Generell würde ich auch in Assembler Dezimalzahlen verwenden, wo es sinnvoll ist. Zum Beispiel beim Counter. Schreib 40 statt $28. Kann erkennt man schneller, ob man nicht einen Schritt zu viel/zu wenig zählt.
    Auch die Farben kannst du dezimal in die Tabelle schreiben, wenn du die Werte vom Basic her so kennst.

  • Drachen In deinem BASIC-Code verschiebst du um eins, während dein Asm-Code um zwei verschiebt. Vielleicht erklärst du nochmal genau, was du machen möchtest. Dein BASIC Programm lässt sich jedenfalls wie folgt übersetzen:

    Code
    1. ldx SL
    2. loop
    3. dex
    4. lda SA,x
    5. sta SA+1,x
    6. cpx #0
    7. bne loop

    Jo kann ich machen.

    Ich möchte ein Snake-Klon programmieren. Ist eigentlich schon fertig (Haupt-Engine).

    Aber je länger die Schlang wird, desto länger braucht halt das Basic alle Variabelen (sa%(x)) durch zu schieben. Bei einer länge von 20 Körperteilen macht das Game schon gar keinen Spass mehr.:(

    In der Variabel sa%( x) werden die Positionen von den Snakekörper gespeichert.

    z.B sa%(1)=1400.....

    wenn man sich dann den Speicherbereich von der Variabel anschaut, wird der Bildschirmspeich in Low- Highbyte aufgeteilt. Deswegen die Bytepaare. Ich wollte erst mal die Verschiebe-Routine entwickeln. Damit ich das besser sehen kann, ob die Routine das macht was ich mir denke, deswegen verschiebe ich nur mal die Farben im Farbram. Wenn die Routine das mach was ich denke, werde ich dann direkt den Variabelspeicher von sa%(x) verschieben. So ist mein Plan.

    Ich bin mir sicher das da noch ein paar Problemchen auf mich zu kommen. Aber es macht spass an so ein Problem zu arbeiten. :)


    Auch habe ich mal versucht mit dem Programm Basic-Boss diese Schleife mir Compilieren zu lassen. Aber mit dem Ergebnis war ich dann doch etwas überfordert. Das Assemblerlisting war dann recht lange. Muss echt eingestehen das ich dann im dem Listing fast nichts verstanden habe. :(


    Drachen: Generell würde ich auch in Assembler Dezimalzahlen verwenden, wo es sinnvoll ist. Zum Beispiel beim Counter. Schreib 40 statt $28. Kann erkennt man schneller, ob man nicht einen Schritt zu viel/zu wenig zählt.
    Auch die Farben kannst du dezimal in die Tabelle schreiben, wenn du die Werte vom Basic her so kennst.

    Ok werde ich machen.

    Und vielen Dank für eure Tipps


    Also bis blad

    Drachen

  • Quote

    wird der Bildschirmspeich in Low- Highbyte aufgeteilt. Deswegen die Bytepaare.

    Mach dir zwei Tabellen: Lo & Hi


    Damit sparst du dir den ganzen "2-Schritt pro Step da Bytepaar" Kram. In deiner Schleife einfach beide Tabellen mit dem gleichen Schritt x versetzen :)


    Edit: Oh, da war mein IE5.5 mal wieder zu langsam... ;)

  • Ebster

    Changed the title of the thread from “der Befehl sec , sbc” to “Problem mit dem Befehl sec und sbc”.
  • Aber je länger die Schlang wird, desto länger braucht halt das Basic alle Variabelen (sa%(x)) durch zu schieben. Bei einer länge von 20 Körperteilen macht das Game schon gar keinen Spass mehr.

    Lösung: Sowas nicht machen. Das eine Ende der Schlange ist ja eh schon dynamisch; wenn Du das andere Ende der Schlange auch noch dynamisch machst, musst Du keine Daten umherschieben.


    (natürlich hast Du bei einer Assemblerversion genug Rechenzeit übrig, um das Problem weiter mit Kopierschleifen zu lösen, aber nur mal so als generelle Programmierweisheit: Speicherinhalte umherzukopieren, sollte man grundsätzlich immer vermeiden, wenn es denn möglich ist)

  • Aber je länger die Schlang wird, desto länger braucht halt das Basic alle Variabelen (sa%(x)) durch zu schieben. Bei einer länge von 20 Körperteilen macht das Game schon gar keinen Spass mehr.

    Lösung: Sowas nicht machen. Das eine Ende der Schlange ist ja eh schon dynamisch; wenn Du das andere Ende der Schlange auch noch dynamisch machst, musst Du keine Daten umherschieben.

    Wie würde das in dem konkreten Fall aussehen?

  • Wie würde das in dem konkreten Fall aussehen?

    Na, man speichert den Startindex in einer separaten Variablen und die Infos über jedes Element des Schlangenkörpers verbleiben immer an ihrem Platz im Array. Beim Hochzählen des Index muss man natürlich den Wraparound beachten, aber das wäre in Assembler sogar einfacher, da es dort automatisch geschieht (255 -> 0).


    Aber ich wollte Drachen jetzt nicht um das Erfolgserlebnis bringen, den Algo selbst umzustricken...