Hello, Guest the thread was called181 times and contains 5 replays

last post from Jotta at the

Assembler Adressüberlauf

  • Kann mir jemand sagen, was bei einem Adressüberlauf passiert?

    z.B.:

    LDX #$04

    LDA $FFFF, X


    Der Inhalt welcher Adresse wird in den Akku geladen?

    Spontan hätte ich $FFFF + $04 = $10003 -> $0003 vermutet. Aber ein Online-Emulator (http://skilldrick.github.io/easy6502/) sagt etwas anderes.

    Weiss das jemand? Oder kann mir jemand sagen, wo ich das nachlesen kann?


    Viele Grüße,

    Ingo

  • Dann würde ich sagen, der Emulator hat einen Bug. Bei der absoluten indizierten Adressierung ($ffff, x) wird X dazuaddiert und der Überlauf ignoriert, was auch Sinn macht, denn der 6502 kennt keine Adressen > $ffff.

    Anders ist es bei der Zeropage indizierten Adressierung ($ff, x). Hier würde nicht von der Adresse $103, sondern von $03 gelesen werden, da bereits das Highbyte ignoriert wird.

    Achtung: Dies gilt nur für den 8 Bit-6502, aber nicht für den 16 Bit-65816.

    Aber ein Online-Emulator (http://skilldrick.github.io/easy6502/) sagt etwas anderes.

    Vielleicht könntest Du die genaue Stelle in der Beschreibung heraussuchen, wo ein abweichendes Verhalten behauptet wird.

  • Achtung: Dies gilt nur für den 8 Bit-6502, aber nicht für den 16 Bit-65816.

    Wobei es hier drauf ankommt, in welchem Modus sich die CPU befindet (Emulation oder Native) und welche Adressierungsarten bzw. Opcodes (neue/alte) und ob das Direct-Page-Register Low-Byte 0 ist (wenn nein, wir auch im Emulation-Mode kein Wrapping gemacht). Alles rund um Stack-Zugriffe wrappt hingegen in der Bank 0.
    Das musste ich mal erwähnen, auch wenn's für die ursprüngliche Fragestellung nichts beträgt. Ich find es einfach nur kurios, dass man Wochen braucht, um sich das Wissen um die Adressierungsspitzfindigkeiten des 816ers einzuarbeiten, sodass man halbwegs sattelfest ist, was dann ärgerlicherweise nach nur wenigen Tagen Nicht-daran-denken wieder wie wegblasen ist, so verwinkelt sind die Gegebenheiten. ;)

  • Vielleicht könntest Du die genaue Stelle in der Beschreibung heraussuchen, wo ein abweichendes Verhalten behauptet wird.

    Ich habe nur ein kleines Programm geschrieben, um diesen Fall zu testen. Möglicherweise war auch mein Programm falsch.


    Dann gehe ich mal davon aus, dass es auf der nächsten Page weitergeht, d.h. bei Page $FF geht es dann bei $00 weiter.

  • Weiss das jemand? Oder kann mir jemand sagen, wo ich das nachlesen kann?

    Die Referenz ist eigentlich die CPU selbst, es gibt aber auch so ziemlich 100%

    Emulationen, wie z.B. visual6502.org. Geb dort einfach mal die beiden Befehle

    ein und beobachte, was passiert.


    Spoiler Alarm: Es wird der Überlauf berücksichtigt und ein Takt zur Laufzeit

    hinzugefügt. Zuerst wird von Speicherstelle FF03, einen Takt später dann

    von 0003 gelesen. Das trifft aber nicht nur für FFFF,x zu, bei z.B. 10FF,x

    verhält es sich genauso.