Tiens ça faisait longtemps qu'on avait pas parlé de petites astuces d'optimisations... J'en ai une dont je me sers de temps en temps. Quand j'ai besoin de sauvegarder la valeur du registre A, déjà plutôt que le PUSH AF/POP AF,il y a EX AF,AF' qui est pas mal, mais parfois on a aussi le registre A' d'utilisé. Alors on peut stocker A dans IXH ou IXL, IYH ou IYL, et si vraiment on a plus de registre, ne pas oublier qu'il reste le registre I, qui ne sert pas tant que l'on est pas en IM2 (donc très peu probable sur CPC).
Donc un LD I,A/LD A,I permet de gagner 3 nops par rapport à un PUSH AF/POP AF, mais perd 2 octets.
Normalement, pour diviser HL par 64, on ferait 6 décalages à droite de HL (un décalage à droite=une division par deux), comme ça :
Code :
SRA H RR L SRA H RR L SRA H RR L SRA H RR L SRA H RR L SRA H RR L
J'ai utilisé SRA pour garder le signe. Si on remarque bien ce qui se passe, on perd les 6 bits de poids faibles de L. Quand aux bits de H, il ne nous en reste que 2 significatifs (les autres sont soit tous à zéro si HL était >=0, soit tous à un dans le cas d'un négatif). On se retrouve au final avec, dans le registre L, les 6 bits de poids fort de H. D'ou l'on peut en déduire que L = H * 4, ce que je fais avec les 2 ADD HL,HL dans mon code optimisé. Ensuite, pour H, j'utilise l'astuce suivante : je sauvegarde sa valeur dans le registre A, puis je fais un décalage à gauche. Si HL était négatif, le flag C vaut 1, sinon il vaut zéro. ensuite, après mon premier ADD HL,HL (qui va lui aussi me générer une retenue si HL était négatif), je fais un SBC A,A, qui fait en gros A=0 si flag_C=0, A=255 si flag_C = 1. Puis après le seconde ADD HL,HL (qui va générer une retenue si le bit 6 de H était à 1) je fais un RLA, qui fait une rotation à gauche de A en ajoutant la retenue. J'ai donc ainsi récupéré les 2 bits de poids forts de H dans les 2 bits de poids faible de A.
Je crois que ce que Longshot veut dire, c'est que le add hl,hl influe sur la carry, donc le rlca pour jouer sur la carry bof Surtout qu'en plus, le sbc a va changer la valeur en a. Au final je pense que le rlca ne fait que perdre 1 nop
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 4 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum