[6502] Warum wird bei SBC das Gegenteil des Carry-Flags abgezogen?



  • Hallo.
    Thread-Titel sagt eigentlich schon alles
    also z.B.

    SBC #$04

    ist ja dasselbe wie

    A = A - 4 - !C

    (wenn Carry-Flag gesetzt ist wird 0 (!1) abgezogen, ansonsten 1 (!0)?)

    Bei der Addition hingegen

    ADC #$04

    wird der Wert des Carry-Flags mitaddiert

    A = A + 4 + C

    Gibts irgendeinen bestimmten Grund wieso das so ist? Wieso wird bei der Subtraktion das Gegenteil des Carry-Flags abgezogen und nicht der Wert selbst wie bei der Addition?

    Mir ist schon klar, dass das Carry-Flag verwendet wird, um Multibyte-Rechnungen durchfuehren zu koennen. Ich versteh nur nicht wieso der Wert des Carry-Flags bei der Subtraktion umgekehrt wird.

    Und noch was: Wenn ich zwei Zahlen miteinander addiere und es entsteht ein Ueberlauf wird ja das Carry-Flag gesetzt (wenn kein Ueberlauf, dann wird das Carry-Flag gecleared). Bei der Subtraktion muesste ja dann genau das Gegenteil der Fall sein, oder? (Carry-Flag wird bei Ueberlauf gecleared und bei Nichtueberlauf gesetzt)

    Der Overflow-Flag wird hingegen immer richtig gesetzt bei Ueberlauf und gecleared, wenn kein Ueberlauf stattgefunden hat, oder? Oder hab ich da was falsch verstanden.

    Hab schon Google intensiv genutzt, hab aber leider noch keine zufriedenstellende Antwort gefunden... 😞

    Bin noch recht neu in Assembler-Programmierung...



  • Es geht einem das Herz auf - endlich mal wieder 6502 (lange her).
    Wenn ich das Handbuch / Datenblatt wiederfinde kann ich auch was zu sagen 🤡



  • Mir scheint, vor dem Subtrahieren muß man das Flag setzen, damit alles klappr.
    Dafür braucht man dann nur NOT und nicht auch noch einen NEG-Befehl. Falls ich das richtig überflogen habe.

    http://en.wikipedia.org/wiki/Carry_flag



  • volkard schrieb:

    Mir scheint, vor dem Subtrahieren muß man das Flag setzen, damit alles klappr.
    Dafür braucht man dann nur NOT und nicht auch noch einen NEG-Befehl. Falls ich das richtig überflogen habe.

    http://en.wikipedia.org/wiki/Carry_flag

    Okay, jetzt hab ichs verstanden, denke ich... Die Subtraktion wird umgewandelt zu einer Addition

    A+not(4)+C

    wenn ich das richtig verstanden habe, oder?
    Dann ist es zumindest etwas logischer, warum das Carry-Flag gesetzt werden muss...

    Ist das dann bei den Prozessoren, die "subtract with borrow" verwenden dann genau umgekehrt? (Carry-Flag muss wie bei der Addition gecleared werden, bevor subtrahiert wird?)

    Die Funktionsweise des Overflow-Flags hab ich jetzt auch verstanden (wird gesetzt, wenn sich Bit 7 veraendert).

    Ich haette da noch eine noob-frage... wie kann man mit dem 6502 Prozessor ein NOT durchfuehren?



  • NMI schrieb:

    Ich haette da noch eine noob-frage... wie kann man mit dem 6502 Prozessor ein NOT durchfuehren?

    Mir scheint, da bleibt nur EOR #$ff.
    Mann ist mir der Prozessor fremd geworden.

    (Das Instruction set:
    http://e-tradition.net/bytes/6502/6502_instruction_set.html )



  • volkard schrieb:

    Mir scheint, da bleibt nur EOR #$ff.

    Jepp, funktioniert 🙂
    thx!


Anmelden zum Antworten