Bon j'essaye de comprendre le code mais c'est un peut difficile (je ne pige pas trop ce qu'il fait).
Une remarque d'optim quand-même
Code:
LDB swap_ramab_virtual0+1
ANDB #$80
cmpb $80
BEQ saut_2000
cmpb $00
BEQ saut_0000
COM swap_ramab_virtual0+1
J'imagine que c'est CMPB #$80 et CMPB #$00 que tu veux faire (il manque le #).
Déjà première remarque, tu peux économiser 1 octet en replaçant "CMPB #0" par TSTB.
Ensuite, sachant que le résultat après le ANDB vaut soit $80 soit $00. Donc si le "BEQ saut_2000" n'est pas pris c'est que B vaut nécessairement $00, et donc le BEQ saut_0000 est pris. Bref tu peux éliminer le 2ème couple (CMPB/BEQ):
Code:
LDB swap_ramab_virtual0+1
ANDB #$80
cmpb $80
BEQ saut_2000
BRA saut_0000
COM swap_ramab_virtual0+1
Enfin, comme je le disais ANDB donne soit $80 soit $00. Donc la comparaison avec #$80 est en fait un BNE sur la sortie du ANDB. Chouette, on gagne encore une instruction:
Code:
LDB swap_ramab_virtual0+1
ANDB #$80
BNE saut_2000
BRA saut_0000
COM swap_ramab_virtual0+1
Enfin (bis), le ANDB extrait le bit de signe de B. Donc en fait ce qu'on teste, c'est avoir si B est >=0 ou <0, plus précisément ANDB #$80 suivi par BNE peut être remplacé par BMI sur la valeur de B lue:
Code:
LDB swap_ramab_virtual0+1
BMI saut_2000
BRA saut_0000
COM swap_ramab_virtual0+1
Le code est devenu tout simple. Mais ce que je le comprends pas c'est: comment diable atteint-on la ligne "COM swap_ramab_virtual0+1" ??? Ne serait-ce pas là ton bug ? (en passant outre le # manquant au CMPB qui était probablement une faute de recopie sur le forum).