Sur un 6502 SBC n
est exactement identique à ADC (n EOR $FF)
- c'est son complément. Donc, le carry est clair quand A + (operand^0xff) + existing carry
est inférieur à 256.
EDIT: donc, si carry est défini, alors la soustraction se produit sans emprunt. Si le carry est clair, alors la soustraction se produit avec l'emprunt. Par conséquent, si carry est défini après la soustraction, il n'y a pas d'emprunt. Si le carry est clair alors il y avait emprunt.
Si vous souhaitez tester si un résultat est négatif, vérifiez implicitement le bit de signe via BMI
ou BPL
.
C'est un peu plus compliqué que cela si en mode décimal sur un 6502 générique mais la variante NES n'a pas de mode décimal alors ignorez tout ce que vous avez lu à ce sujet.
Pour clarifier re: les commentaires ci-dessous; si vous traitez des nombres comme signés alors 127
est +127
, 128
est -128
, etc. Complément normal de deux. Rien de spécial. Par exemple.
LDA #-63 ; i.e. 1100 0001
SEC
SBC#65 ; i.e. 0100 0001
; result in accumulator is now -128, i.e. 1000 0000,
; and carry remains set because there was no borrow
BPL somewhere ; wouldn't jump, because -128 is negative
BMI somewhereElse ; would jump, because -128 is negative
Ce qui suit est exactement équivalent en termes de fonctionnement interne:
LDA #-63 ; i.e. 1100 0001
SEC ; ... everything the same up until here ...
ADC#65 ; i.e. 1011 1110 (the complement of 0100 0001)
; result = 1100 0001 + 1011 1110 + 1 = [1] 0111 1111 + 1 = [1] 1000 0000
; ^
; |
; carry
; = -128
Ainsi, comme ci-dessus, la définition de « résultat », conformément au manuel 6502 et sens programmatique ordinaire de « la chose assis l'accumulateur ", vous pouvez tester si le résultat est positif ou négatif comme indiqué ci-dessus, par exemple
SBC $23
BMI resultWasNegative
resultWasPositive: ...
Si vous êtes intéressé à savoir si le résultat complet aurait été négative (à savoir si elle avait monté dans l'accumulateur), vous pouvez également vérifier le drapeau de trop-plein. Si le débordement est défini, cela signifie que tout ce qui est dans l'accumulateur a un mauvais signe en raison de la limite de 8 bits. Donc, vous pouvez faire l'équivalent d'un OU exclusif entre débordement et le signe:
SBC $23
BVC signIsTheOpposite
BMI resultWasNegative
JMP resultWasPositive
signIsTheOpposite:
BPL resultWasNegative
JMP resultWasPositive
Carry est pour non signé. – Jester