2016-12-11 3 views

Répondre

4

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 
+1

> Si vous souhaitez tester si un résultat est négatif, vérifiez implicitement le bit de signe via un IMC ou un BPL. --- INCORRECT! Par exemple, (-128) moins 1 est toujours négatif mais dans l'accumulateur, vous obtiendrez une valeur octet positive positive +127. Dans les cas de ce genre, il convient de vérifier l'indicateur de dépassement de capacité et, s'il est défini, la valeur du drapeau de signe (négatif) est incorrecte (c'est-à-dire inversée). – lvd

+0

@lvd Je ne suis pas d'accord avec votre évaluation, ou particulièrement avec votre tempérament. C'est comme dire que quiconque écrit en C et dit que le résultat de '10/7' est' 0' est "INCORRECT!". Comme défini par la fiche technique 6502 et les manuels, et par tout bon sens, le résultat est la chose dans l'accumulateur. Avoir une réponse étendue à couvrir le débordement sur le hasard ça vous rendra heureux mais, honnêtement, parmi vos cris de cour d'école, vous êtes simplement en train de fendre les poils. Un simple fait de l'arithmétique de taille fixe est que le débordement et l'underflow peuvent changer le signe, mais le signe est changé. – Tommy

+0

(et, selon l'historique d'édition, j'ai d'abord mal lu le commentaire de lvd, j'espère avoir corrigé mon erreur) – Tommy

0

Non, le résultat peut également être positif.

Exemple:

lda #$10 
sec 
sbC#$f0 

Carry sera clair après et Accumulator sera de 20 $.

Pour tester les valeurs positives/négatives après la soustraction, utilisez le drapeau N (egatif) du registre d'état et les branches qui l'évaluent (BMI/BPL).

0

La réponse de Tommy est correcte, mais j'ai une façon plus simple de le regarder.

opérations dans le sont 8 bits de 6502 ALU afin que vous puissiez penser à une soustraction comme celui-ci (pour 65 $ et 64 $):

01100101 
-01100100 
======== 
00000001 

Ce que je fais est d'imaginer la soustraction est un 9 bits (non signé) en coopération avec le 9 bit de l'accumulateur mis à 1, donc 65 $ - 64 $ ressemblerait à ceci:

1 01100101 
- 01100100 
========== 
1 00000001 

alors que 64 $ - 65 $ devrait ressembler à ceci

1 01100100 
- 01100101 
========== 
0 11111111 

Le nouveau bit de retenue est le neuvième bit imaginaire du résultat. Essentiellement, le report est défini lorsque l'opérande interprété comme un nombre non signé est supérieur à l'accumulateur interprété comme un nombre non signé. Ou être pédant lorsque

A < operand - 1 + oldcarry