Le neg sur N bits c'est à la base ==> inverser tous les bits et ajouter 1. Donc un truc comme
Code:
COMA ! inversion des bits
COMB ! inversion des bits
COM @r_l+1 ! inversion des bits
INC @r_l+1 ! ajouter 1
BNE nocarry
ADDD #1 ! propagation retenue aux bits supérieurs
nocarry
suite
A noter: COM suivi d'un INC sur la même adresse c'est juste un NEG. Donc au final on a:
Code:
COMA
COMB
NEG @r_l+1
BNE nocarry
ADDD #1
nocarry
suite
Si on a pas besoin de précision, on peut ignorer le +1 qui fera rarement propager la retenue au delà de quelques bits de poids faibles, et ne garder que l'inversion des bits sur les poids forts. Dans le cas présent cela revient à ne pas faire le NEG et la propag et ne garder que les COMA/COMB. Le résultat sera faux de 1 unité sur D une fois sur 256 (cas où @r_l+1 est à 0). Ca peut-être un résultat largement acceptable quand on cherche la vitesse et pas la précision.
Si on aime pas les sauts, on peut remarquer que si la carry est à 1, on a COMB suivi d'un ADDD #1, c'est à dire (~B+1) = -B, un NEGB. Aussi on pourrait faire un NEGB dès le début, et le transformer en simple COMB quand il y a une carry en la soustrayant après le neg. On peut faire pareil pour A et il vient:
Code:
NEGA
NEGB
NEG @r_l+1
SBCB #0
SBCA #0
qui est juste la généralisation 24bits du NEGD. Ici les deux SBC coutent 4 cycles, alors que dans le code au dessus, le BNE (qui est vrai 255 fois sur 256) n'en coute que 3. En moyenne la version avec le saut est plus rapide de 255/256=0.996 cycles.