CODING ★ Dr.Watson - Autoformation à l'assembleur par Micro Application ★

Dr.Watson - Autoformation à l'assembleur par Micro Application - Chapitre 10
CHAPITRE 10

INSTRUCTIONS EXTERNES ET EXTENSIONS GRAPHIQUES

 Ce chapitre explique comment des instructions supplémentaires peuvent être ajoutées à celles déjà connues du BASIC. Par exemple, une Instruction dessinant des cercles sera ajoutée au BASIC d'Amstrad.  Ces programmes seront entièrement écrits en langage assembleur et Interfaces avec l'interpréteur BASIC  en utilisant des instructions externes. Ce chapitre utilise certaines des propriétés les plus avancées  de l'assembleur. Il est recommandé de lire d'abord l'annexe 6.

INSTRUCTION EXTERNE (RSX)

Toutes les instructions du BASIC (LIST, GOTO, RND etc.) sont dites "instructions internes". Quand un  programme BASIC est exécuté et que l'interpréteur rencontre une instruction interne il la recherche dans  la ROM (Read Only Memory = mémoire de lecture uniquement) tandis que, si une instruction externe est rencontrée, il recherche aussi dans la RAM (mémoire de lecture/écriture). Une instruction externe ou extension du système résident (RSX) est une chaîne de caractères alphanumériques précédée d'une barre verticale (Shift et @).

Voici les instructions externes légales:

ùCIRCLE  ùTRIANGLE  ùBOX

Essayez de taper ùBOX en BASIC. L'ordinateur répondra par "Unknown command". Cela parce que l'interpréteur  ne peut trouver l'instruction BOX en ROM ni en RAM, Il est assez simple de dire à l'ordinateur qu'une Instruction externe existe; voici comment:

Phase 1

L'ordinateur a d'abord besoin de savoir que des instructions externes vont être ajoutées.  On accomplit cela en créant une table d'instructions nouvelles. Cette table d'Instructions agit comme un bloc de sauts à des tables supplémentaires, apportant des informations explicites sur les nouvelles instructions, c'est-à-dire syntaxe, emplacement etc. Ces informations sont transmises au système d'exploitation, en appelant un sous-programme en ROM, après avoir chargé dans les registres appropriés les données et l'adresse d'un buffer de quatre octets requis par le système d'exploitation.

Utilité de la routine: Fait enregistrer une commande externe par le système d'exploitation  (c'est-à-dire dit au système que l'instruction existe.

Adresse d'appel:  &BCD1

Conditions d'entrée: BC= adresse mémoire de départ de la table d'instructions externes

HL= adresse mémoire de départ du buffer de quatre octets.

Maintenant, toute cette procédure va être illustrée par un exemple. La table d'instructions externes commencera a l'adresse mémoire représentée par l'étiquette EXCOMT (EXternal COMmand Table).  La méthode la plus facile pour réserver quatre octet pour un buffer est d'utiliser la directive  d'assembleur "DEFA". On affectera à ce buffer le label BUFF:

Donc:-

BUFF: DEFS &04

En combinant ces différents éléments:

PROGRAMME 10.1(ne pas entrer tout de suite)

BUFF: DEFS &04   ;Installe buffer

LD BC,EXCOMT:    BC=départ de table

LD HL,BUFF:    ;HL=départ de buffer

CALL &BCD1    ;Table d'enregistrement

RET      ; Retour au BASIC.

N'entrez pas ce programme tout de suite car comme l'ordinateur connaît l'emplacement de la table d'instructions externes il ne trouverait pas de nom d'instruction nouvelle en la parcourant, Dès lors la  table d'instructions externes nouvelles doit être remplie avec des noms d'instruction nouveaux.

Phase 2

Des détails supplémentaires sur la table d'instructions nouvelles doivent figurer dans une table  additionnelle. L'adresse de cette table est donnée par l'étiquette NENAM (NEw NAMe). La première ligne de cette section est donc:-

EXCOMT: DEFW NENAM:

On ajoute alors les nouveaux noms d'instruction en utilisant les instructions JP comme suit.

JP BOX:

Cela affectera une adresse de saut à la nouvelle instruction BOX. En admettant qu'une seule instruction  externe va être ajoutée, la deuxième partie du programme apparaît comme ci-dessous:

EXCOMT: DEFW NENAM: JP BOX:

Maintenant, tout ce dont on a besoin est d'ajouter les caractéristiques du nom de la nouvelle instruction.

Phase 3

Le nom de la nouvelle instruction est entré comme une chaîne de caractères ASCII en commençant par l'adresse mémoire désignée par NENAM. Le système d'exploitation de l'Amstrad a besoin que le bit 7 soit mis dans  l'octet représentant le dernier caractère ASCII de la chaîne du nom de l'instruction. Il est très facile d'accomplir cela en ajoutant 880 au code ASCII de la dernière lettre, Dès lors, dans l'exemple, &80 doit  être ajouté à l'ASCII de "X". Cette partie du programme se présente donc comme ci-dessous:

NENAM: DEFM  "BO"

  DEFB  "X"+880 DEFB  80

Le 80 indique la fin de la table.

Combiner ces trois parties ensembles:

PROGRAMME 10.2 (ne pas assembler tout de suite)

   ORG 40000

BUFF:    DEFS &04

   LD BC,EXCOMT:

     LD HL,BUFF:

     CALL &BCD1

RET

EXCOMT:  DEFW NENAM :

     JP BOX:

NENAM: &emspDEFM "BO"

   DEFB "X"+&80

   DEFB 80

Notez que ORG a été mis sur 40000. En mettant alors MEMORY sur 39999, empêchant ainsi le BASIC d'utiliser une case mémoire au-dessus de 39999, l'instruction externe ne peut être altérée.

Quand on tapera ùBOX, a partir du BASIC, l'ordinateur sautera à la case mémoire adressée par l'étiquette BOX.

Pour illustrer la nouvelle instruction externe tapez le Programme 10.3 immédiatement après le programme 10.2.

PROGRAMME 10.3

BOX:  LD A,66

     CALL PRINT:

     LD A,79

     CALL PRINT:

     LD A,88

     CALL PRINT:

     RET

     PRINT: EQU &BB5A

Remarquez l'utilisation de l'étiquette mémoire PRINT

Maintenant assemblez le programme entier; une fois listé il apparaîtra comme ci-dessous.

     ORG 10000

BUFF:    DEFS 804

     LD BC,EXCOMT:

     LD HL,BUFF:

     CALL &BCD1

     RET

EXCOMT:  DEFW NENAM:

     JP BOX:

NENAM: &emspDEFN "BO"

   DEFB "X"+&80

   DEFB &0

BOX:  LD A,66

     CALL PRINT:

     LD A,79

     CALL PRINT:

     LD A,88

     CALL PRINT:

     RET

PRINT:   EQU &BB5A

Exécutez le programme avec un 'CALL 40000' à partir du BASIC. Bien que rien de visible ne se soit produit, l'instruction externe BOX a été prise en charge Par le système d'exploitation de l'Amstrad. Revenez en BASIC et tapez:

ùBOX

BOX apparaît sur l'écran! Tout programme en langage assembleur adressé avec l'étiquette BOX peut donc être appelé avec cette instruction externe. On peut par exemple dessiner un rectangle sur l'écran, en utilisant  les sous-programmes de graphisme intégrés. Pour préciser la taille du rectangle. Il faut transmettre certains paramètres à l'assembleur. Considérons le diagramme suivant:

FIGURE 10.1

En définissant deux angles opposés diagonalement, on peut décrire un rectangle unique. Il serait utile si, de même que la taille, on pouvait changer la couleur du rectangle. C'est donc cinq paramètres qu'il faut  transmettre au sous-programme en langage assembleur. Une solution envisageable serait d'écrire les données  dans un bloc de mémoire, créant un "bloc de données". Bien qu'encombrant, cela marcherait. Heureusement, le  système d'instructions externes crée ce bloc de données pour nous, Quand elle est appelée, la case de départ du bloc de données est stockée dans le couple de registres IX, et le nombre d'éléments de données est stocké dans l'accumulateur. Considérons l'instruction suivante qui dessinera un rectangle de 100 Par 100 unités sur  l'écran en 200,100 avec ink 2

ùBOX, 200,100,300,200,2

FIGURE 10.2

Les paramètres du rectangle sont convertis en hexadécimal avant d'être stockés en mémoire.

Phase 1

100 = &0064

200 = &00C8

300 = &012C

  2 = &0002

Phase 2

Les paramètres sont stockés avec l'octet faible en premier suivi immédiatement par l'octet fort.  Le dernier paramètre entré est désigné par IX, les paramètres de l'exemple sont donc stockés comme suit:

Case      ; Contenu

mémoire      ; Hex Décimal

IX+0       ;02    2

IX+1       ;00

IX+2       ;00   200

IX+3       ;C8

IX+4       ;01   300

IX+5       ;2C

IX+6       ;00   100

IX+7       ;64

IX+8       ;00   200

IX+9       ; C8

En utilisant un décalage approprié on peut avoir accès a n'importe lequel de ces paramètres. Remarquez que chaque paramètre est stocké sur deux octets, un paramètre peut se trouver dans l'intervalle 0-65535.

Maintenant, des coordonnées transmises par l'instruction externe, quatre couples de coordonnées doivent  être dérivées pour décrire le rectangle.

Considérons la Figure 10.3:

FIGURE 10.3

Comme les coordonnées X,Y et X1,Y1 sont transmises par l'Instruction externe on doit en déduire les coordonnées des deux autres angles et tracer le rectangle. Ceci est représenté par l'organigramme suivant:

FIGURE 10.4

Exprimons cet organigramme dans un programme (remarquez l'utilisation de la Pile pour stocker les coordonnées):

PROGRAMME 10.4

10  DRAW:   EQU   &BBF6
20  PLOT:   EQU   &BBEA
30  INK :   EQU   &BBDE
40  BOX: LD A,(IX+0)
50    CALL  INK:
60    LD D,(IX+8)
70    LD D,(IX+9)
80    PUSH  DE
90    LD E,(IX+6)
100   LD D,(IX+7)
110   PUSH  DE
120   LD E,(IX+4)
130   LD D,(IX+5)
140   PUSH  DE
150   LD E,(IX+2)
160   LD D,(IX+3)
170   PUSH  DE
180   LD E,(IX+8)
190   LD D,(IX+9)
200   LD E,(IX+6)
210   LD H,(IX+7)
220   PUSH  DE
230   CALL  PLOT:
240   POP   DE
250   POP   HL
260   PUSH  HL
270   CALL  DRAW:
280   POP   HL
290   POP   DE
300   PUSH  DE
310   CALL  DRAW:
320   POP   DE
330   POP   HL
340   PUSH  HL
350   CALL  DRAW:
360   POP   HL
370   POP   DE
380   CALL  DRAW:
390   RET

L'utilisation des étiquettes pour les adresses de mémoire augmente grandement la lisibilité du programme.  Maintenant remplacez le sous-programme commençant avec l'étiquette BOX dans le programme précédent par le programme 10.4.

Assemblez-le et exécutez-le.

Maintenant revenez en BASIC et essayez le programme 10.5, après avoir intégré l'instruction avec un "CALL 40000".

Remarque: Comme l'assembleur utilise les lignes BASIC au-dessus de 64000, ne tapez pas NEW ou vous devrez recharger l'assembleur.

PROGRAMME 10.5

10 MODE O:CALL 40000
20 X=RND(1)*550
30 Y=RND(1)*350
40 X1=RND(1)*50
50 Y1=RND(1)*50
60 C=RND(1)*15
70 ùBOX,X,Y,X+X1,Y+Y1,C
80 GOTO 20

Ceci conclut la partie sur les instructions externes. Le reste de ce chapitre expliquera comment on peut ajouter des instructions graphiques additionnelles.

QUELQUES INSTRUCTIONS GRAPHIQUES SUPPLEMENTAIRES

1.BOX,X,Y,X1,Y1,C

Dessine un rectangle sur l'écran en utilisant le PEN C

2. BOXF,X,Y,X1,Y1,C

où les arguments sont exactement les mêmes que pour BOX. La seule différence est que le rectangle est plein.

3. TRI,X,,Y,X1,Y1,X2,Y2,C

Dessine un triangle sur l'écran. Avec:

Notez que Y doit être égal à Y2

4. CIRCLE,X,Y,R,C Avec:

Les instructions externes résident en mémoire en commençant à la case mémoire 40000.  Pour s'assurer qu'elles ne soient pas altérées on ramène le pointeur de mémoire BASIC sur 39999 avec l'instruction suivante:

MEMORY 39999

Il est donc sage de s'assurer que les deux premières lignes de programme BASIC utilisant ces instructions sont les suivantes:

1 MEMORY 39999

2 CALL 40000

 :

Les instructions de remplissage du rectangle

Ces instructions dessinent un rectangle plein sur l'écran; il est dessiné comme une série de lignes horizontales consécutives.

Considérons la figure 10.5

FIGURE 10.5

L'algorithme pour remplir ce rectangle se présente ainsi:

FIGURE 10.6

Exprimons cet algorithme dans un programme

PROGRAMME 10.6

10  COUNT: DEFS 4
20  DRAW:   EQU   &BBF6
30  PLOT:   EQU   &BBEA
40  INK: EQU   &BBDE
50  BOXF:   LD A,(IX+0)
60      CALL INK:
70       LD L,(IX+2)
80       LD H,(IX+3)
90       LD E,(IX+6)
100      LD D,(IX+7)
110      AND   A
120      SBC   HL,DE
130      JP C,END:
140      LD (COUNT:),HL
150      LD E,(IX+8)
160      LD D,(IX+9)
170      LD L,(IX+6)
180      LD H,(IX+7)
190      PUSH  HL
200      PUSH  DE
210      CALL  PLOT:
220      LD E,(IX+4)
230      LD D,(IX+5)
240      POP   IX
250      POP   IY
260 NXT:     PUSH DE
270      PUSH  IY
280      POP   HL
290      CALL  DRAW:
300      PUSH  IX
310      POP   DE
320      POP   IX
330      INC   IY
340      LD HL,(COUNT:)
350      PUSH  DE
360      LD DE,1
370      AND   A
380      SBC   HL,DE
390      LD (COUNT:),HL
400      POP   DE
410      JR NZ,NXT:
420 END:    RET

La cassette d'assembleur (face B) contient un fichier appelé GRAPHICS-EXT qui contient toutes les instructions graphiques additionnelles présentées dans ce chapitre, Pour l'utiliser chargez l'assembleur puis chargez le fichier GRAPHICS-EXT et assemblez-le. Si vous désirez utiliser une instruction supplémentaire dans vos programmes BASIC, sauvegardez une copie du code objet produit en utilisant l'identificateur de fichier '-b'. Sauvegardez-la par  exemple sous le nom GRAPHICS-B, Ce fichier peut alors être chargé a partir du BASIC avec l'instruction : LOAD "GRAPHICS-B",40000.

Assurez-vous cependant que le pointeur de mémoire BASIC a d'abord été ramené sur 39999, en utilisant a la suite l'instruction MEMORY 39999. Ensuite pour intégrer les instructions graphiques, tapez CALL 40000 à partir du BASIC.

Maintenant toutes les instructions sont disponibles. Etudiez le programme de présentation des instructions  supplémentaires GRAPHICS-DEMO si vous n'êtes pas sûr de vous.

L'INSTRUCTION TRIANGLE

Cette instruction produit un triangle plein sur l'écran. La méthode utilisée est itérative et est choisie  pour sa simplicité plutôt que son efficacité. Dans cette méthode une procédure donnée est répétée jusqu'à ce qu'une condition soit remplie. Ici la différence entre deux coordonnées de la base X est utilisée comme compteur. Voir la figure 10.7

FIGURE 10.7

Une série de lignes sont dessinées du sommet (X1,Y1) à la base. Cela se traduit par le fait que le pixel (point) du sommet est réécrit un nombre de fois égal au compteur. Les pixels à proximité du sommet sont aussi réécrits, mais moins fréquemment. C'est un algorithme très peu efficace; l'idéal serait que chaque pixel du triangle soit écrit une fois. Cela peut être accompli en utilisant des algorithmes plus complexes (par exemple un algorithme scan-line), Mais ceci dépasse le cadre de ce livre.

Voici le listing de l'instruction triangle:

10 COUNT:  &emspDEFS 4
20 DRAW:    EQLI  &BBF6
30 PLOT:    EQU   &BBEA
40 INK:      EQU   &BBDE
50 TPI:     LD A,(IX+0)
60       CALL  INK:
70       LD E,(IX+12)
80       LD D,(IX+13)
90       LD L,(IX+4)
100      LD H,(IX+5)
110      AND   A
120      SBC   HL,DE
130      JP M,END:
140      LD (COUNT:),HL
150      LD E,(IX+8)
160      LD D,(IX+9)
170      LD L,(IX+6)
130      LD H,(IX+7)
190      PUSH  DE
200      PUSH  HL
210      LD L,(IX+10)
220      LD H,(IX+11)
230      PUSH  HL
240      POP   IY
250      POP   IY
260      LD E,(IX+12)
270      LD D,(IX+13)
230      PUSH  DE
290      POP   IX
300   NXTT:    POP   HL
310      POP   DE
320      PUSH  DE
330      PUSH  HL
340      CALL  PLOT:
350      PUSH  IX
360      POP   DE
370      PUSH  IY
330      POP   HL
390      CALL  DRAW:
400      INC   IX
410      LD HL,(COUNT:)
420      LD DE,1
430      AND   A
440      SBC   HL,DE
450      LD (COUNT:),HL
460      JR NZ,NXTT:
470      POP   DE
4S0      POP   DE
490   END:     RET

L'instruction CIRCLE

La méthode la plus simple pour réaliser un cercle sur l'écran utilise les fonctions SIN et COS de l'Amstrad.  Considérons la figure 10.8:

FIGURE 10.8

En incrémentant dans l'intervalle 0<alpha<pi/2 et en fixant un point aux coordonnées (X,Y)  on obtient un quart de cercle. Ce quart peut être développé en un cercle plein. En admettant que le centre du cercle est le point d'origine du graphique, considérons la figure 10,9 pour le point X,Y.

FIGURE 10.9

Même si cette méthode fonctionne, elle est pratiquement inefficace parce que les fonctions SIN et COS nécessitent un temps de calcul considérable qui ralentit l'algorithme. Un algorithme légèrement plus  efficace peut-être dérivé du théorème de Pythagore, équation 10.1 ci-dessous:

Théorème de Pythagore

R^2 = X^2 + Y^2     ;Equ 10.1

Réajustons l'équation 10.1:

Pour dessiner un quart de cercle comme auparavant, X doit être incrémenté dans l'intervalle 0<=X<=R,  on trouve alors le Y correspondant à chaque valeur de X, et le Pixel de coordonnées X,Y est mis.

Essayez le programme BASIC suivant:

PROGRAMME 10.8

10 MODE 0
20 DEFINTx,y,r
30 x=0
40 r=100
50 WHILE X<r
60 y=SQR(r*r-x*x)
70 PLOT x,y
80 x=x+1
90 WEND
100 END

Ce programme réalise un quart de cercle comme ci-dessous dans la figure 10.10

FIGURE 10.10

Il y a deux limites principales à l'utilisation de cette méthode.

1. La qualité de l'arc laisse à désirer à mesure que X s'approche de R.

2. Bien que plus rapide que SIN ou COS, la recherche de la racine carrée d'un

   nombre demande quand même un temps de calcul considérable.

Il y a différentes méthodes qui permettent d'amoindrir ces problèmes. Dans ce chapitre nous nous attarderons  sur une solution possible. Elle est basée sur l'algorithme de Bresenham développé à l'origine pour les  traceurs mécaniques. Cet algorithme est considérablement plus efficace que toutes les méthodes mentionnées  précédemment car toutes les opérations arithmétiques peuvent être accomplies facilement grâce à quelques  additions, soustractions et décalages.

UNE ADAPTATION DE L'ALGORITHME DE BRESENHAM POUR DESSINER LES CERCLES

Au lieu d'incrémenter X dans l'intervalle 0<=X<=R cette méthode utilise l'intervalle 0<=X<=pi/4  produisant donc un segment à 45 degrés. On obtient le cercle complet en réfléchissant les points calculés.  Le Cœur de l'algorithme est un sous-programme qui sélectionne le pixel le plus proche du cercle véritable  au point considéré. La distance entre le cercle véritable et le pixel sélectionné est appelée "terne d'erreur" et est déduite de la manière suivante:-

Utilisons le théorème de Pythagore

R^2 = x^2 + y^2

admettons que le pixel est fixé en X,Y, le terme d'erreur est alors donné par

E= (x^2+y)-r^2

En diminuant E à chaque phase, on obtient l'approximation d'un cercle la plus proche possible sur une grille  de pixels discontinue.

FIGURE 10.11

Si on admet que le pixel noir Z vient d'être mis, le prochain pixel à "être mis sera soit A, soit B.  Si on définit le terme d'erreur comme étant la différence entre le carré des distances du centre du cercle  aux pixels A ou B et au cercle actuel à ce point, on peut calculer les équations suivantes.

Pour Pixel A

E =(x^2+y^2)-r^2   ;Equ 10,2

Pour pixel B

E =(x^2-y^2)-r^2   ;Equ 10.3

Donc si la valeur absolue de E de A est supérieure ou égale à la valeur absolue de E de B, c'est le pixel B qui est mis et si la valeur absolue de E de A est inférieure à la valeur absolue de E de B, c'est le pixel A  qui sera mis.

Combinons les équations 10.2 et 10.3 pour former le terme d'erreur totale E:

E = E + E

  T   A   B

Maintenant si E >=0, le pixel B est mis, sinon E     ; T             ; T

Reconsidérons la figure 10.11

Case 1

E   T

Case 2

E   T

Case 3

E   T

Case 4

E >=0 le pixel B est mis

  T

Case 5

E >=0 le pixel B est mis T

Comme on peut le voir la méthode fonctionne, cependant il est quand même nécessaire de calculer le carré  et la racine carré des données pour calculer le terme d'erreur. Grâce a une série d'opérations arithmétiques, on peut montrer que l'erreur initiale se présente ainsi:

E = 3-2r                       ;Equ 10.4

  T

La valeur de E(T) change tout au long du programme suivant le choix du pixel précédent:

Si le Pixel A est choisi quand E              ; T       ;T

E  = E +4X+6                     ; Equ 10.5

  T+1  T

ou si le pixel B est sélectionné quand E >=0 alors

                  ;T

E  = E +4(x-y)+10                   ; Equ 10.7

  T+1  T

L'équation 10,5 a besoin de deux additions et deux décalages, l'équation 10.6 de deux additions, une soustraction et deux décalages; un progrès considérable sur les algorithmes précédents. On a besoin d'une méthode pour réfléchir ces points afin de former un cercle complet. Si on peut trouver les valeurs de X et Y pour un quart  de cercle, on peut alors produire un cercle complet en réfléchissant ces coordonnées. Voir figure 10.12

FIGURE 10.12

Cet algorithme est démontré dans le programme BASIC suivant:

PROGRAMME 10.9

10 MODE 1

20 radius=100

30 x=0

40 y=radius

50 origin 320,200

60 diff=3-2*radius

70 while x<y

80 gosub 50

90 if d100 d=d+4*(x-y)+10

110 y=y-1

120 x=x+1

130 wend

140 end

150 plot x,y

160 plot y,x

170 plot y,-x

180 plot x,-y

190 plot x,-y

200 plot -x,-y

210 plot -y,-x

220 plot -y,x

230 plot -x,y

240 return

Le programme produit une distribution des pixels comme dans la figure 10.13, pour un rayon de 15.

FIGURE 10.13

Ici l'algorithme est converti en langage assembleur: Pour économiser vos doigts, toutes les instructions  externes sont incluses dans la cassette sous le nom de GRAPHICS-EXT.

PROGRAMME 10.10

10  PLOT:    EQU &BBEA

20  INK:     EQU &B6DE

30  ORGIN:   EQU SBBCC

40  ORGET:   EQU &BBCC

50  DIFF:    DEFS 2

60  RAD:   DEFS 2

70  X:  &emspDEFS 2

80  Y:  &emspDEFS 2

90  XO:   DEFS 2

100 YO:   DEFS 2

ne  CIRCLE:  CALL ORGET:

120      LD(XO:),DE

130      LD A,(IX+0)

140      CALL INK:

150      LD (YO:),HL

160      LD D,(IX+7)

170      LD E ,(IX+6)

180      LD H,(IX+5)

190      LD L,(IX+4)

200      PUSH HL

210      LD H,(IX+3)

220      LD L,(IX+0}

230      LD (RAD:),HL

240      POP HL

250      CALL ORGIN:

260      LD BC,0000

270      LD (X:),BC

2S0      LD HL,(RAD:)

290      LD (Y:),HL

300      SLA L

310      RL H

320      PUSH HL

330      POP DE

340      LD HL,3

350      XOR A

360      SBC HL,DE

370      LD (DIFF),HL

380 CALC:   LD HL,(X:)

390      LD DE,(Y:)

400      PUSH HL

410      PUSH DE

420      CALL MIRIM:

430      POP DE

440      POP HL

450      XOR A

460      SBC HL,DE

470      JP P,END2:

430      LD HL,(DIFF:)

490      LD BC,0000

500      SBC HL,BC

510      JP P,LESS:

520      LD DE,(X:)

530      SLA E

540      RL D

550      SLA E

560      RL D

570      LD HL,6

530      ADD HL,DE

590      LD DE,(DIFF:)

600      ADD HL,DE

610      JP NXT3:

620 LESS:   LD HL,(IX:)

630      LD DE,(Y:)

640      XOR A

650      SBC HL,DE

660      SLA L

670      RL H

680      SLA L

690      RL   H

700      LD   DE, 10

710      ADD  HL,DE

720      LD  DE,(DIFF:)

730      ADD  HL,DE

740      LD   DE,(Y:)

750      DEC  DE

760      LD  (Y:),DE

770 NXT3:   LD (DIFF:),HL

780      LD HL,(X:)

790      INC HL

800      LD (X:),HL

810     JP CALC:

820 MIRIM:     LD DE,(X:)

830      LD HL,(Y:)

840     CALL PLOT:

850      LD DE,(Y:)

860      LD HL,(X:)

870      CALL PLOT:

880      LD HL,0000

890      LD BC,(X:)

900      XORA

910      SBC HL,DE

920      PUSH HL

930      PUSH HL

940      LD DE,(Y:)

950      CALL PLOT:

960      POP DE

970      LD HL,(Y:)

930      CALL PLOT:

990      LD HL,0000

1000     LD BC,(Y:)

1010     XOR A

1020     SBC  HL,BC

1030     PUSH HL

1040     PUSH HL

1050     LD DE,(X:)

1060     CALL PLOT:

1070     POP DE

1080     LD HL,(X:)

1090     CALL PLOT:

1100     POP HL

1110     POP DE

1120     PUSH HL

1130     PUSH DE

1140     CALL PLOT:

1150     POP HL

1160     POP DE

1170     CALL PLOT:

1180     RET

1190   END2:      LD DE,(X0:)

1200     LD HL,(Y0:)

1210     CALL ORIGIN:

1220     RET

Ça y'est, vous y êtes arrivé. Bien Joué. Nous espérons que le livre vous a plu et que sa lecture vous a été  profitable. Joyeuse programmation !

★ ANNÉES: 1985
★ AUTEUR: T. Hebertson
★ CONVERTION: CRACKERS VELUS

Page précédente : Dr.Watson - Autoformation à l'assembleur par Micro Application - Chapitre 09
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.732-desktop/c
Page créée en 148 millisecondes et consultée 1882 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.