★ CODING ★ Inititation à l'assembleur ★ |
Assembleur ACPC n°33 |
Voici le moment tant attendu de tous : la suite des fantastiques et fulgurantes aventures de l'escargot du futur. Rapide comme la marée, il revient au galop pour nous narrer ses histoires de héros. A vos marques, prêts ? Rampez ! Comme nous vous avons fourni la source assembleur de cette routine le mois dernier, nous tâcherons ce mois-ci de lui apporter quelques explications. Pour qu'un repérage puisse être fait, nous avons numéroté les lignes. Il n'est pas nécessaire d'y attacher une quelconque importance, si ce n'est dans le cadre de ces explications. Dans les lignes 6 et 7, les registres HL et A sont initialises. En ligne 8. le premier drapeau est lu par l'intermédiaire de la retenue (Carry). C'est alors elle qui décide si le mouvement sera vertical (1) ou bien horizontal (0). Etudions avant tout le mouvement horizontal. Si la première instruction de cette routine est CALL, c'est pour économiser des lignes de source. En effet, si cette partie ne dispose que d'une entrée, elle contient deux sorties, celle du sous-programme gauche et celle du droit. Pour être sûr que les variables modifiées seront stockées sans écrire deux fois le code réalisant cela, il nous faut forcer le branchement sur les instructions concernées. Ainsi, un simple RET reviendra sous CALL et enregistrera les constantes. Notez qu'ici la place gagnée n'est pas De 11 à 14, les variables concernant X sont sauvegardées, précautions et fonctionnement obligent puis le programme est interrompu. CHOISIS TON CAMP, CAMARADE... De 15 à 16, BC et DE sont initialises avec les variables concernant les mouvements horizontaux. B et E contiennent la position sur Taxe, C la coordonnée maximale momentanée et D la coordonnée minimale momentanée. Si le double registre DE est chargé ainsi alors que la valeur de E est insignifiante, c'est pour que D soit modifié sans que 1 accumulateur ne soit altéré. L'accumulateur est ensuite décalé dans ta retenue pour juger s'il est temps d'avancer (0) ou de reculer (1). En ligne 19 commence le sous-programme d'incrémentation horizontale. Le registre E est mis à un pour modifier si nécessaire le drapeau de changement de direction (1 signifie vertical, ce qui suit bien une séquence horizontale après un 90°). De 20 à 23. le pointeur sur l'écran virtuel et B (XPOS) sont mis à jour selon les circonstances. Vient ensuite le moment de vérifier le non-débordement des limites (24 & 25). Si le contour maximal n'est pas atteint, la routine retourne voir si le Basic a besoin de temps machine. Dans le cas contraire, il faut forcer le changement de direction en y forçant E initialise préalablement (de 27 à 30). Les lignes 31 et 32 servent à juger la progression de la limite maximale. Si le bit 2 de STAT est à zéro, c'est que le mouvement actuel est progressif. Notre escargot a donc tendance à diminuer, ce qu'il fait par tes lignes 36 et 37. Dans le cas contraire, les lignes 33 et 34 se chargeront de fermer le piège. Pour la routine nommée Gauche, débutant à la ligne 40, tout se passe comme dans la partie précédente (Droite) sauf que HL et B sont décrémentés deux fois. Comme le sens change, la borne à tester n'est plus la même et est maintenant contenue par le registre D (XMIN). Si la limite n est pas atteinte, tout se passe comme précédemment, et le contrôle est repassé au programme appelant. Dans le cas contraire, deux possibilités sont à tester car elles déterminent la croissance du mouvement généré. Selon le sens du moment, soit l'adresse écran progresse vers le centre, soit vers l'extérieur. 1 : le bord gauche sert de limite. Lorsque D contient la même valeur que la constante Stop, l'escargot doit prendre une trajectoire divergente. SI TU AVANCES ET JE RECULE... Comment veux-tu que je spécule ? En ce qui concerne le sous-programme Vertic, il a tout à envier à ses prédécesseurs. Son humble tâche se limite à la modification de HL. Il contient un petit BC26 accompagné du non moins célèbre BC29 qui permettent respectivement de descendre et de monter d'une ligne. Comme pour le traitement horizontal, un CALL permet de stocker l'adresse de retour où seront sauvegardées les données utiles. En fonction du bit 0 de Flag, l'axe de translation a été choisi. Reste donc maintenant à définir selon le bit 1 de ce même octet, les opérations à effectuer sur l'adresse écran. La première de celles-ci est une addition que nous ne cesserons de vous proposer. Elle consiste à trouver l'adresse du point situé sous celui dont l'adresse est dans HL. Si cette routine n'est pas celle utilisée habituellement, tout en y ressemblant fort, c'est parce que l'adresse à retourner ne tient pas compte de l'écran situé en &C000 mais d'une quelconque adresse de base, dite relative. De plus, le point visé est celui se trouvant deux lignes plus bas que celui de départ. Il nous faut donc ajouter non pas 2048 (&800) mais 4096 (&1000). Si le résultat de l'addition sort d'une page écran normale de 16 Ko (&4000 testé sur le poids fort H), nous rajoutons &C050 qui permet lors de la perte de la retenue de retomber sur une valeur oscillant entre 0 et 16384. La seconde opération est le calcul par soustraction qui est du même acabit. 4096 est enlevé de HL et s'il y a débordement, &C050 est débité du compte courant. E sert toujours de panneau servant à indiquer quel sera le prochain virage. C'est ici que ces commentaires finissent. Notez bien que rien n'est jamais parfait et que tout est optimisable. Nous entendons par là que cette routine peut avoir des défauts. 1000 y=0:s=-x:WHILE x>y:PLOT x,y:PLOT x,-y:PLOT -x,y:PLOT -x,-y:PLOT y,x:PLOT y,-x:PLOT –y,x:PLOT -y,-x:s=s+2*y+ 1 : y=y+1 : IF s>0 THEN s=s-2*x+ 2:x=x-1 |
Page précédente : Bidouilles ACPC n°32 - RSX ùPEEK |
|