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
énorme : mais pour l'exemple, que ne ferions-nous 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.

2 : la limite est dans ce cas zéro et la progression doit devenir convergente soit opposée à la précédente. Ce sont les lignes 48 à 50 qui décident de l'aiguillage à prendre, à savoir te test à opérer selon le sens de fonctionnement, Les lignes 51 à 67 se chargent à proprement parler de ces modifications et renvoient à la modification de la bome inférieure (68 à 73). Gauche fait une chose de plus que Droit à savoir le test d'inversion de rotation. C'est pour cette raison qu'elle contient quelques lignes de plus.

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
1010 WEND

LES BONNES
CHOSES ONT UNE FIN...

Les mauvaises en ont une aussi. C'est pour ces raisons que cène initiation à l'assembleur se termine en queue d'australopithèque à poil ras. Le mois prochain, nous tenterons de vous donner un petit listing plus amusant que celui du mois dernier. En attendant nous vous proposons une espèce de petit concours. Voici un listing de traçage de cercle en Basic que vous devez traduire en assembleur. Tout est permis et les vecteurs système peuvent être appelés. Ce premier exemple est simple et lent. Son seul avantage est que les cercles générés sont des plus beaux. Comme ce premier listing Basic est facilement transposable car ne faisant appel qu'à des entiers, la traduction sera facile. Gare aux prochains défis, ils seront plus corsés. Les variables utilisées dans ce programme sont les suivantes :

— X est le rayon du cercle qui se trace autour du point qui a pour origine celle de l'instruction ayant la même (ORIGIN).

— les autres n'ayant qu'un intérêt purement fonctionnel.

Ceux ou celles des trois premiers qui nous enverront la plus belle RSX de traçage de cercle, gagneront un ticheurt Missixe (en français dans le texte). Ziva, ma bonne dame, il est frais mon poisson ! Le jeu en vaut le tricot de corps, non ? Tout est permis. Nous vous laissons un mois pour réaliser vos chefs-d'œuvre. Le tirage sera effectué par la pulpeuse Miss X (love...) sous le regard vigilant de maître Filou assisté de notre chère et tendre Agnès. Que ceux qui aiment la nénette (love...) se lèvent et s'attachent devant leur CPC (la concurrence sera rude).

FAUT QUE ÇA CESSE...

C'est sur ces quelques mots que nous vous abandonnons lâchement en espérant vous retrouver le mois prochain au sein (love...) de cette rubrique.

Sined, A100% n°33 Jan 91

Page précédente : Bidouilles ACPC n°32 - RSX ùPEEK

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bidouilles ACPC n°35 - Disk Court
» Coding » Assembleur ACPC n°14 - AS: ÇA C'EST COOL
» Coding » Assembleur ACPC n 04 - Initiation : Débuter avec sont assembleur
» Coding » Assembleur ACPC n°37 - Les transferts
» Coding » Bidouilles ACPC n°46 - Les vecteurs system (4/6)
» Coding » Bidouilles ACPC n°36 - Direct disk Access
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 296 millisecondes et consultée 1755 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.