Pl2 CORRIG 3.DOC/fr: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Olivier.jan (talk | contribs) mNo edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | {{Languages|Pl2 CORRIG 3.DOC}} |
||
<pre> |
<pre> |
||
Line 12: | Line 13: | ||
1) Exercice nr°1: |
1) Exercice nr°1: |
||
-------------- |
-------------- |
||
− | Voilà le listing du |
+ | Voilà le listing du corrigé. |
− | Je pense que cet exercice ne vous a pas |
+ | Je pense que cet exercice ne vous a pas posé beaucoup de problèmes , |
− | regardez attentivement ce listing, il ne comporte aucune |
+ | regardez attentivement ce listing, il ne comporte aucune difficulté. |
Line 30: | Line 31: | ||
;du tableau interne |
;du tableau interne |
||
− | ;On |
+ | ;On dépose les adresses des tableaux du VDI dans le tableau interne |
move.l #CONTROL,ticontrol(a0) |
move.l #CONTROL,ticontrol(a0) |
||
Line 52: | Line 53: | ||
move #31,d0 ;31 dans d0 |
move #31,d0 ;31 dans d0 |
||
− | adda.l #10,a6 ; |
+ | adda.l #10,a6 ;incrémente a6 de 10 unités: |
;a6 pointe donc sur intin+10 |
;a6 pointe donc sur intin+10 |
||
− | BOUCLE move (a5)+,(a6)+ ;on |
+ | BOUCLE move (a5)+,(a6)+ ;on dépose les données dans |
− | ;le tableau INTIN |
+ | ;le tableau INTIN pointé par |
;a6 |
;a6 |
||
dbf d0,BOUCLE ;on boucle 32 fois pour les |
dbf d0,BOUCLE ;on boucle 32 fois pour les |
||
− | ;32 |
+ | ;32 données (16 mots pour le |
;masque et 16 mots pour le |
;masque et 16 mots pour le |
||
;premier plan) |
;premier plan) |
||
Line 81: | Line 82: | ||
− | DONNEES DC.W %0000001110000000 ;les 16 |
+ | DONNEES DC.W %0000001110000000 ;les 16 données (MOTS) |
DC.W %0000011111000000 ;du MASQUE |
DC.W %0000011111000000 ;du MASQUE |
||
DC.W %0000111111100000 |
DC.W %0000111111100000 |
||
Line 98: | Line 99: | ||
DC.W %0000001110000000 |
DC.W %0000001110000000 |
||
− | DC.W %0000000000000000 ;les 16 |
+ | DC.W %0000000000000000 ;les 16 données (MOTS) |
DC.W %0000001110000000 ;du PREMIER PLAN |
DC.W %0000001110000000 ;du PREMIER PLAN |
||
DC.W %0000011111000000 |
DC.W %0000011111000000 |
||
Line 125: | Line 126: | ||
2) Exercice nr°2: |
2) Exercice nr°2: |
||
-------------- |
-------------- |
||
− | Là encore, aucune |
+ | Là encore, aucune difficulté majeure... |
− | Il fallait juste faire attention à bien utiliser des |
+ | Il fallait juste faire attention à bien utiliser des coordonnées |
− | graphiques qui correspondent à la |
+ | graphiques qui correspondent à la résolution utilisée. |
(OX)=640 de 0 à 339 |
(OX)=640 de 0 à 339 |
||
− | (OY)=200 de 0 à 199 (MOYENNE |
+ | (OY)=200 de 0 à 199 (MOYENNE résolution) |
Line 143: | Line 144: | ||
DC.W $A000 ;on demande l'adresse du T.I. et |
DC.W $A000 ;on demande l'adresse du T.I. et |
||
movea.l a0,a5 ;on la pose dans a5 car a0 risque |
movea.l a0,a5 ;on la pose dans a5 car a0 risque |
||
− | ;d'ètre |
+ | ;d'ètre modifié par nos MACROS... |
− | ; On |
+ | ; On dépose les adresses des tableaux du VDI |
move.l #CONTROL,ticontrol(a0) |
move.l #CONTROL,ticontrol(a0) |
||
Line 157: | Line 158: | ||
DC.W $A00A ;HIDE MOUSE |
DC.W $A00A ;HIDE MOUSE |
||
CCONOUT #27 ;ESC |
CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+ 'E' = efface l' |
+ | CCONOUT #'E' ;+ 'E' = efface l'écran |
move #1,_fg_bp_1(a5) |
move #1,_fg_bp_1(a5) |
||
Line 164: | Line 165: | ||
move #0,_wrt_mode(a5) ;Write mode AND |
move #0,_wrt_mode(a5) ;Write mode AND |
||
− | move #1,_patmsk(a5) ;1+1=2 |
+ | move #1,_patmsk(a5) ;1+1=2 données pour le PAT |
move.l #LIGNE,_patptr(a5) ;en 'LIGNE' se trouve |
move.l #LIGNE,_patptr(a5) ;en 'LIGNE' se trouve |
||
Line 215: | Line 216: | ||
-------------- |
-------------- |
||
Voilà le listing du programme qui trace un rectangle avec un PAT |
Voilà le listing du programme qui trace un rectangle avec un PAT |
||
− | + | redéfini après avoir chargé le programme de quadrillage précédent. |
|
Line 235: | Line 236: | ||
DC.W $A000 ;On recherche l'adresse du T.I. |
DC.W $A000 ;On recherche l'adresse du T.I. |
||
movea.l a0,a5 ;On sauve cette adresse car elle |
movea.l a0,a5 ;On sauve cette adresse car elle |
||
− | ;risque d'ètre |
+ | ;risque d'ètre effacée par une |
;de nos MACRO si elle utilise ce |
;de nos MACRO si elle utilise ce |
||
;registre... |
;registre... |
||
Line 253: | Line 254: | ||
move #0,_wrt_mode(a5) ;Write mode AND |
move #0,_wrt_mode(a5) ;Write mode AND |
||
− | move #7,_patmsk(a5) ;7+1=8 |
+ | move #7,_patmsk(a5) ;7+1=8 données pour le PAT |
move.l #FILL,_patptr(a5) ;Le nouveau PAT est en |
move.l #FILL,_patptr(a5) ;Le nouveau PAT est en |
||
;'FILL' |
;'FILL' |
||
− | ;les |
+ | ;les coordonnées du rectangle |
move #129,_x1(a5) ;_x1=129 |
move #129,_x1(a5) ;_x1=129 |
||
Line 280: | Line 281: | ||
DC.W %0000000000000000 |
DC.W %0000000000000000 |
||
− | CADRE DC.B 27,'E','Je vais tracer un |
+ | CADRE DC.B 27,'E','Je vais tracer un carré avec $A005 ' |
− | DC.B 'après avoir |
+ | DC.B 'après avoir chargé CADRE.PRG ',0 |
NUL DC.B 0 ;Pas d'environnement et de |
NUL DC.B 0 ;Pas d'environnement et de |
||
Line 302: | Line 303: | ||
Il fallait faire attention à bien utiliser UNDRAW SPRITE à chaque fois |
Il fallait faire attention à bien utiliser UNDRAW SPRITE à chaque fois |
||
− | pour pouvoir |
+ | pour pouvoir réafficher le SPRITE à d'autres coordonnées. |
Il fallait aussi fournir TOUS les paramètres dont les routines DRAW |
Il fallait aussi fournir TOUS les paramètres dont les routines DRAW |
||
− | SPRITE et UNDRAW SPRITE ont besoin pour obtenir un |
+ | SPRITE et UNDRAW SPRITE ont besoin pour obtenir un résultat correct. |
J'ai choisit ,pour la forme de mon SPRITE, un sigle ATARI et mes |
J'ai choisit ,pour la forme de mon SPRITE, un sigle ATARI et mes |
||
intitiales :L-P .(C'est pas très original, je le reconnais...) |
intitiales :L-P .(C'est pas très original, je le reconnais...) |
||
J'utilise aussi la macro instruction VSYNC pour synchroniser nos |
J'utilise aussi la macro instruction VSYNC pour synchroniser nos |
||
− | + | éditions graphiques:le programme en est fortement ralenti mais le |
|
clignotement des affichages du SPRITE disparait... |
clignotement des affichages du SPRITE disparait... |
||
Line 322: | Line 323: | ||
DC.W $A000 ;adresse du T.I. dans a0 et |
DC.W $A000 ;adresse du T.I. dans a0 et |
||
− | movea.l a0,a5 ;dans a5 pour |
+ | movea.l a0,a5 ;dans a5 pour éviter de la |
;perdre si une MACRO utilise |
;perdre si une MACRO utilise |
||
;le registre a0... |
;le registre a0... |
||
Line 338: | Line 339: | ||
DC.W $A00A ;HIDE MOUSE |
DC.W $A00A ;HIDE MOUSE |
||
CCONOUT #27 ;ESC |
CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+'E' = effacer l' |
+ | CCONOUT #'E' ;+'E' = effacer l'écran |
move #0,_wrt_mode(a5) ;Write mode AND |
move #0,_wrt_mode(a5) ;Write mode AND |
||
− | move.l #BLOC,a0 ;Adresse du bloc de |
+ | move.l #BLOC,a0 ;Adresse du bloc de définition |
;du SPRITE dans a0 |
;du SPRITE dans a0 |
||
move.l #SAUVE,a2 ;Adresse du Tampon de sauvegarde |
move.l #SAUVE,a2 ;Adresse du Tampon de sauvegarde |
||
;dans a2 (128 octets pour la moy- |
;dans a2 (128 octets pour la moy- |
||
− | ;enne |
+ | ;enne résolution) |
− | ; Le SPRITE va d'abord de la gauche vers la droite ( |
+ | ; Le SPRITE va d'abord de la gauche vers la droite (coordonnée X dans d0 |
− | et |
+ | et coordonnée Y dans d1) |
move #10,X ;1 MOT=10 en 'X' |
move #10,X ;1 MOT=10 en 'X' |
||
Line 394: | Line 395: | ||
DATA |
DATA |
||
− | ;Le bloc de |
+ | ;Le bloc de définition du SPRITE: |
BLOC DC.W 0 ;X du point chaud |
BLOC DC.W 0 ;X du point chaud |
||
Line 441: | Line 442: | ||
BSS |
BSS |
||
− | X DS.W 1 ;on |
+ | X DS.W 1 ;on réserve un MOT en 'X' |
SAUVE DS.B 128 ;le TAMPON pour le SPRITE ( MOYENNE |
SAUVE DS.B 128 ;le TAMPON pour le SPRITE ( MOYENNE |
||
− | ; |
+ | ;résolution) |
INCLUDE "TABLEAU.L" ;le tableau du VDI |
INCLUDE "TABLEAU.L" ;le tableau du VDI |
||
Line 454: | Line 455: | ||
5) Exercice nr°5: |
5) Exercice nr°5: |
||
-------------- |
-------------- |
||
− | Voilà le listing du programme qui affiche les points de |
+ | Voilà le listing du programme qui affiche les points de différente |
− | couleur sur l' |
+ | couleur sur l'écran. |
Line 465: | Line 466: | ||
− | ; Je teste d'obord si on est dans la bonne |
+ | ; Je teste d'obord si on est dans la bonne résolution: |
− | GETREZ ;on demande la |
+ | GETREZ ;on demande la Résolution |
− | tst d0 ;A-t-on |
+ | tst d0 ;A-t-on résolution=0 (BASSE) |
beq OK ;Si Oui va en 'OK' |
beq OK ;Si Oui va en 'OK' |
||
PRINTLINE MOYENNE ;sinon message |
PRINTLINE MOYENNE ;sinon message |
||
Line 493: | Line 494: | ||
WAIT ;attente |
WAIT ;attente |
||
CCONOUT #27 ;ESC |
CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+'E' = effacer l' |
+ | CCONOUT #'E' ;+'E' = effacer l'écran |
− | ; Je |
+ | ; Je définit une MACRO INSTRUCTION nommée POINT qui admet 3 paramètres |
− | ; et qui permet d' |
+ | ; et qui permet d'éditer un point à l'écran gràce à la routine $A001 |
POINT MACRO $\1,$\2,$\3 ;macro à 3 paramètres |
POINT MACRO $\1,$\2,$\3 ;macro à 3 paramètres |
||
− | move \1,ptsin ;\1= |
+ | move \1,ptsin ;\1=coordonnée X |
− | move \2,ptsin+2 ;\2= |
+ | move \2,ptsin+2 ;\2=coordonnée Y |
move \3,intin ;\3=couleur |
move \3,intin ;\3=couleur |
||
DC.W $A001 ;PUT PIXEL |
DC.W $A001 ;PUT PIXEL |
||
Line 508: | Line 509: | ||
ENDM ;fin de la macro |
ENDM ;fin de la macro |
||
− | ; Ici je vais afficher tous les points de l' |
+ | ; Ici je vais afficher tous les points de l'écran et je leurs donne une |
− | ; couleur grƒce au nombre |
+ | ; couleur grƒce au nombre aléatoire que me donne RANDOM dans d0. |
; Pour ne pas obtenir un nombre trop grand avec RANDOM, je masque le |
; Pour ne pas obtenir un nombre trop grand avec RANDOM, je masque le |
||
; nombre de d0 avec le nombre maximum de chiffres dont j'ai besoin. |
; nombre de d0 avec le nombre maximum de chiffres dont j'ai besoin. |
||
Line 524: | Line 525: | ||
LOOP move #199,d6 ;199 dans d6 |
LOOP move #199,d6 ;199 dans d6 |
||
− | BOUCLE POINT d5,d6,d0 ;POINT aux |
+ | BOUCLE POINT d5,d6,d0 ;POINT aux coordonnées |
;(d5,d6) et avec la couleur |
;(d5,d6) et avec la couleur |
||
;contenue dans d0 |
;contenue dans d0 |
||
− | ENCORE RANDOM ;Nombre |
+ | ENCORE RANDOM ;Nombre aléatoire en retour |
;dans d0 |
;dans d0 |
||
and.l #15,d0 ;on masque les 4 bits de plus |
and.l #15,d0 ;on masque les 4 bits de plus |
||
Line 538: | Line 539: | ||
; Maintenant on fait varier la valeur de la palette des couleurs: |
; Maintenant on fait varier la valeur de la palette des couleurs: |
||
− | ; On a |
+ | ; On a crée un vecteur qui contient les adresses des palettes. |
; (En 'VECTEUR') |
; (En 'VECTEUR') |
||
; On prend une de ces adresses et on change la palette (Je n'utilise pas |
; On prend une de ces adresses et on change la palette (Je n'utilise pas |
||
− | ; la MACRO PALETTE que nous avons |
+ | ; la MACRO PALETTE que nous avons crée car elle attend un LABEL comme pa- |
; ramètre.) puis on recommence avec l'adresse de la palette suivante... |
; ramètre.) puis on recommence avec l'adresse de la palette suivante... |
||
; J'utilise aussi INKEY pour tester si on enfonce une touche et si tel |
; J'utilise aussi INKEY pour tester si on enfonce une touche et si tel |
||
Line 549: | Line 550: | ||
lea VECTEUR,a6 ;adresse de 'VECTEUR' dans a6 |
lea VECTEUR,a6 ;adresse de 'VECTEUR' dans a6 |
||
− | CHANGE move.l (a6)+,-(sp) ;on pose le L-M |
+ | CHANGE move.l (a6)+,-(sp) ;on pose le L-M pointé par a6 |
;(une adresse pour la palette) |
;(une adresse pour la palette) |
||
;dans -(SP) |
;dans -(SP) |
||
Line 557: | Line 558: | ||
INKEY ;je teste une touche au vol |
INKEY ;je teste une touche au vol |
||
tst d0 ;d0=0 ? (Si=0,pas de touche) |
tst d0 ;d0=0 ? (Si=0,pas de touche) |
||
− | bne RETOUR ;Si NON (1 touche a |
+ | bne RETOUR ;Si NON (1 touche a été en- |
− | ; |
+ | ;foncée) on va en 'RETOUR' |
dbf d6,CHANGE ;Sinon boucle en 'CHANGE' |
dbf d6,CHANGE ;Sinon boucle en 'CHANGE' |
||
jmp ICI ;puis va en 'ICI' |
jmp ICI ;puis va en 'ICI' |
||
Line 564: | Line 565: | ||
RETOUR CCONOUT #27 ;ESC |
RETOUR CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+'E' = effacer l' |
+ | CCONOUT #'E' ;+'E' = effacer l'écran |
PALETTE ANCIEN ;On remet l'ancienne PALETTE |
PALETTE ANCIEN ;On remet l'ancienne PALETTE |
||
Line 574: | Line 575: | ||
DATA |
DATA |
||
− | ; Les |
+ | ; Les données définissant les palettes qu'on affiche sucessivement pour |
; obtenir une rotation des couleurs. |
; obtenir une rotation des couleurs. |
||
; A chaque palette, on fait une rotation d'une couleur vers la droite... |
; A chaque palette, on fait une rotation d'une couleur vers la droite... |
||
− | ; La couleur 0 ne change jamais pour |
+ | ; La couleur 0 ne change jamais pour éviter d'obtenir un clignotement du |
− | ; bord de l' |
+ | ; bord de l'écran (Couleur 0) |
NOUVEAU DC.W $000,$027,$037,$027,$017,$016,$006,$015 |
NOUVEAU DC.W $000,$027,$037,$027,$017,$016,$006,$015 |
||
Line 626: | Line 627: | ||
− | ; Le vecteur qui pointe sur les adresses des |
+ | ; Le vecteur qui pointe sur les adresses des différentes palettes |
VECTEUR DC.L NOUVEAU,UN,DEUX,TROIS,QUATRE,CINQ,SIX,SEPT |
VECTEUR DC.L NOUVEAU,UN,DEUX,TROIS,QUATRE,CINQ,SIX,SEPT |
||
Line 638: | Line 639: | ||
− | MESSAGE DC.B 27,'E',174,' Image |
+ | MESSAGE DC.B 27,'E',174,' Image brouillée ',175,':avec la' |
DC.B ' fonction',13,10,'$A001 et RANDOM pour les' |
DC.B ' fonction',13,10,'$A001 et RANDOM pour les' |
||
Line 646: | Line 647: | ||
MOYENNE DC.B 27,'E','ATTENTION, Ce programme ne marche ' |
MOYENNE DC.B 27,'E','ATTENTION, Ce programme ne marche ' |
||
DC.B 'qu',39,'en BASSE RESOLUTION !',13,10,'Il faut ' |
DC.B 'qu',39,'en BASSE RESOLUTION !',13,10,'Il faut ' |
||
− | DC.B 'changer la |
+ | DC.B 'changer la résolution grace au BUREAU GEM...',7,0 |
Line 659: | Line 660: | ||
6) Exercice nr°6: |
6) Exercice nr°6: |
||
-------------- |
-------------- |
||
− | Voilà le |
+ | Voilà le corrigé du programme qui affiche les losanges sans puis avec |
le CLIPPING... |
le CLIPPING... |
||
Line 687: | Line 688: | ||
DC.W $A00A ;HIDE MOUSE |
DC.W $A00A ;HIDE MOUSE |
||
CCONOUT #27 ;ESC |
CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+'E' = effacer l' |
+ | CCONOUT #'E' ;+'E' = effacer l'écran |
Line 696: | Line 697: | ||
− | move #1,_patmsk(a5) ;2 |
+ | move #1,_patmsk(a5) ;2 données pour le PAT |
move.l #PAT,_patptr(a5) ;en 'PAT' |
move.l #PAT,_patptr(a5) ;en 'PAT' |
||
Line 709: | Line 710: | ||
WAIT ;attente |
WAIT ;attente |
||
CCONOUT #27 ;ESC |
CCONOUT #27 ;ESC |
||
− | CCONOUT #'E' ;+'E' = effacer l' |
+ | CCONOUT #'E' ;+'E' = effacer l'écran |
move #1,_clip(a5) ;AVEC CLIPPING |
move #1,_clip(a5) ;AVEC CLIPPING |
||
− | ; Les |
+ | ; Les coordonnées du CADRE DU CLIPPING sont: (0,0)-(320,190) |
move #0,_xmn_clip(a5) |
move #0,_xmn_clip(a5) |
||
Line 729: | Line 730: | ||
; Ici on trace le losange avec FILLED POLYGONE: |
; Ici on trace le losange avec FILLED POLYGONE: |
||
− | ; |
+ | ; Coordonnées du POLYGONE dans PTSIN: (320,10)-(570,100)-(320,190)- |
; (70,100) et on boucle avec (320,10) |
; (70,100) et on boucle avec (320,10) |
||
Line 746: | Line 747: | ||
; Ici on apelle FILLED POLYGONE pour chaque ligne HORIZONTALE du losange: |
; Ici on apelle FILLED POLYGONE pour chaque ligne HORIZONTALE du losange: |
||
− | de Y=10 à Y=190 (car notre losange n'est |
+ | de Y=10 à Y=190 (car notre losange n'est définit qu'entre ces lignes) |
move #9,d6 ;9 dans d6 |
move #9,d6 ;9 dans d6 |
||
Line 781: | Line 782: | ||
Voilà pour la correction des exercices sur les LineAs... |
Voilà pour la correction des exercices sur les LineAs... |
||
− | Les listings de ces 6 programmes ainsi que les programmes |
+ | Les listings de ces 6 programmes ainsi que les programmes exécutables |
se trouvent bien entendu sur cette disquette dans les fichiers: |
se trouvent bien entendu sur cette disquette dans les fichiers: |
||
Latest revision as of 21:07, 17 December 2023
------------------------- CORRECTIONS des EXERCICES sur les LineAs ------------------------- 1) Exercice nr°1: -------------- Voilà le listing du corrigé. Je pense que cet exercice ne vous a pas posé beaucoup de problèmes , regardez attentivement ce listing, il ne comporte aucune difficulté. TEXT INCLUDE "LINEQU.L" ;les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;Les macros SETBLOCK ;Initialisation ;On recherche l'adresse du Tableau interne pour les LineAs DC.W $A000 ;retour dans a0 de l'adresse ;du tableau interne ;On dépose les adresses des tableaux du VDI dans le tableau interne move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) PRINTLINE SOURIS ;texte WAIT ;attente lea INTIN,a6 ;adresse de INTIN dans a6 move #0,6(a6) ;0 dans intin+6 (couleur du ;masque) move #1,8(a6) ;1 dans intin+8 (couleur du ;premier plan) lea DONNEES,a5 ;adresse de 'DONNEES' dans a5 move #31,d0 ;31 dans d0 adda.l #10,a6 ;incrémente a6 de 10 unités: ;a6 pointe donc sur intin+10 BOUCLE move (a5)+,(a6)+ ;on dépose les données dans ;le tableau INTIN pointé par ;a6 dbf d0,BOUCLE ;on boucle 32 fois pour les ;32 données (16 mots pour le ;masque et 16 mots pour le ;premier plan) DC.W $A00B ;TRANSFORM MOUSE move #0,intin ;compteur=0 DC.W $A009 ;SHOW MOUSE PRINTLINE MESSAGE ;texte WAIT ;attente TERM ;fin DATA SOURIS DC.B 27,'E','Je change la forme du curseur de la' DC.B ' souris ...',0 MESSAGE DC.B 27,'E','Bougez la SOURIS SVP ...',7,0 DONNEES DC.W %0000001110000000 ;les 16 données (MOTS) DC.W %0000011111000000 ;du MASQUE DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000111111100000 DC.W %0000011111000000 DC.W %0000001110000000 DC.W %0000011111000000 DC.W %0000111111100000 DC.W %0000011111000000 DC.W %0000001110000000 DC.W %0000000000000000 ;les 16 données (MOTS) DC.W %0000001110000000 ;du PREMIER PLAN DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000011111000000 DC.W %0000001110000000 DC.W %0000000000000000 DC.W %0000001110000000 DC.W %0000011111000000 DC.W %0000001110000000 DC.W %0000000000000000 BSS INCLUDE "TABLEAU.L" ;le tableau du VDI END 2) Exercice nr°2: -------------- Là encore, aucune difficulté majeure... Il fallait juste faire attention à bien utiliser des coordonnées graphiques qui correspondent à la résolution utilisée. (OX)=640 de 0 à 339 (OY)=200 de 0 à 199 (MOYENNE résolution) TEXT INCLUDE "LINEQU.L" ;les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;Les macros SETBLOCK ;initialisation DC.W $A000 ;on demande l'adresse du T.I. et movea.l a0,a5 ;on la pose dans a5 car a0 risque ;d'ètre modifié par nos MACROS... ; On dépose les adresses des tableaux du VDI move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) PRINTLINE CADRE ;texte WAIT ;attente DC.W $A00A ;HIDE MOUSE CCONOUT #27 ;ESC CCONOUT #'E' ;+ 'E' = efface l'écran move #1,_fg_bp_1(a5) move #1,_fg_bp_2(a5) ;couleur=%11=3 move #0,_wrt_mode(a5) ;Write mode AND move #1,_patmsk(a5) ;1+1=2 données pour le PAT move.l #LIGNE,_patptr(a5) ;en 'LIGNE' se trouve ;le nouveau PAT move #%1111111111111111,_ln_mask(a5) ;ligne PLEINE move #0,d5 ;0 dans d5 move #22,d6 ;22 dans d6 BOUCLE move #0,_x1(a5) ;_x1=0 move d5,_y1(a5) ;_y1=d5 move #630,_x2(a5) ;_x2=630 move d5,_y1(a5) ;_y2=d5 add #9,d5 ;on ajoute 9 à d5 DC.W $A004 ;et on trace la H-LINE dbf d6,BOUCLE ;on recommence 23 fois move #0,d5 ;0 dans d5 move #42,d6 ;42 dans d6 LOOP move d5,_x1(a5) ;_x1=d5 move #0,_y1(a5) ;_y1=0 move d5,_x2(a5) ;_x2=d5 move #197,_y2(a5) ;_y2=197 add #15,d5 ;on ajoute 15 à d5 DC.W $A003 ;et on trace la LINE dbf d6,LOOP ;on recommence 43 fois WAIT ;attente TERM ;fin DATA LIGNE DC.W %1111111111111111 ;le PAT (Nombre PAIRE DC.W %1111111111111111 ;de MOTS) CADRE DC.B 27,'E','Je vais tracer un quadrillage ...' DC.B 13,10,'Fonctions LINE et H-LINE :',0 BSS INCLUDE "TABLEAU.L" ;le Tableau du VDI END 3) Exercice nr°3: -------------- Voilà le listing du programme qui trace un rectangle avec un PAT redéfini après avoir chargé le programme de quadrillage précédent. TEXT INCLUDE "LINEQU.L" ;les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;Les MACROS SETBLOCK ;initialisation PRINTLINE CADRE ;texte WAIT ;attente PEXEC NUL,ZERO,PRG,#0 ;on charge le programme dont ;le nom est en 'PRG' en mode ;0 et sans paramètres. DC.W $A000 ;On recherche l'adresse du T.I. movea.l a0,a5 ;On sauve cette adresse car elle ;risque d'ètre effacée par une ;de nos MACRO si elle utilise ce ;registre... ; On pose les adresses des tableaux du VDI dans le T.I. move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) move #1,_fg_bp_1(a5) move #0,_fg_bp_2(a5) ;Couleur=%01=1 move #0,_wrt_mode(a5) ;Write mode AND move #7,_patmsk(a5) ;7+1=8 données pour le PAT move.l #FILL,_patptr(a5) ;Le nouveau PAT est en ;'FILL' ;les coordonnées du rectangle move #129,_x1(a5) ;_x1=129 move #24,_y1(a5) ;_y1=24 move #496,_x2(a5) ;_x2=496 move #183,_y2(a5) ;_y2=183 DC.W $A005 ;FILLED RECTANGLE WAIT ;attente TERM ;fin DATA FILL DC.W %0111111111111110 ;le PAT (Nombre PAIRE de DC.W %0100000000000010 ;MOTS) DC.W %0101000000001010 DC.W %0101111111111010 DC.W %0101000000001010 DC.W %0100000000000010 DC.W %0111111111111110 DC.W %0000000000000000 CADRE DC.B 27,'E','Je vais tracer un carré avec $A005 ' DC.B 'après avoir chargé CADRE.PRG ',0 NUL DC.B 0 ;Pas d'environnement et de ZERO DC.B 0 ;ligne de commande PRG DC.B 'A:\CADRE.PRG',0 ;le NOM du prg à charger BSS INCLUDE "TABLEAU.L" ;le Tableau du VDI END 4) Exercice nr° 4: --------------- Voilà le listing du programme qui affiche le SPRITE. Il fallait faire attention à bien utiliser UNDRAW SPRITE à chaque fois pour pouvoir réafficher le SPRITE à d'autres coordonnées. Il fallait aussi fournir TOUS les paramètres dont les routines DRAW SPRITE et UNDRAW SPRITE ont besoin pour obtenir un résultat correct. J'ai choisit ,pour la forme de mon SPRITE, un sigle ATARI et mes intitiales :L-P .(C'est pas très original, je le reconnais...) J'utilise aussi la macro instruction VSYNC pour synchroniser nos éditions graphiques:le programme en est fortement ralenti mais le clignotement des affichages du SPRITE disparait... TEXT INCLUDE "LINEQU.L" ;Les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;les MACROS SETBLOCK ;initialisation DC.W $A000 ;adresse du T.I. dans a0 et movea.l a0,a5 ;dans a5 pour éviter de la ;perdre si une MACRO utilise ;le registre a0... ; On pose les adresses des Tableaux du VDI dans le T.I. move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) PRINTLINE PIX ;texte WAIT ;attente DC.W $A00A ;HIDE MOUSE CCONOUT #27 ;ESC CCONOUT #'E' ;+'E' = effacer l'écran move #0,_wrt_mode(a5) ;Write mode AND move.l #BLOC,a0 ;Adresse du bloc de définition ;du SPRITE dans a0 move.l #SAUVE,a2 ;Adresse du Tampon de sauvegarde ;dans a2 (128 octets pour la moy- ;enne résolution) ; Le SPRITE va d'abord de la gauche vers la droite (coordonnée X dans d0 et coordonnée Y dans d1) move #10,X ;1 MOT=10 en 'X' BBB add #1,X ;On ajoute 1 en 'X' move X,d0 ;On pose le MOT de 'X' dans d0 move #100,d1 ;On pose 100 dans d1 move.l #BLOC,a0 ;L'adresse du bloc dans a0 cmpi #620,d0 ;A-t-on d0=620 ? beq DEUX ;si OUI, va en 'DEUX' move.l #SAUVE,a2 ;Sinon pose l'adresse du Tampon ;de sauvegarde du sprite dans a2 DC.W $A00C ;et UNDRAW SPRITE move.l #BLOC,a0 ;L'adresse du bloc dans a0 move.l #SAUVE,a2 ;L'adresse du tampon dans a2 DC.W $A00D ;et DRAW SPRITE VSYNC ;On synchronise jmp BBB ;et on recommence en 'BBB' ; Puis le SPRITE revient de la droite vers la gauche. DEUX sub #1,X ;on retranche 1 en 'X' move X,d0 ;on pose le mot de 'X' dans d0 move #100,d1 ;on pose 100 dans d1 move.l #BLOC,a0 ;L'adresse du bloc dans a0 cmpi #10,d0 ;A-t-on d0=10 ? beq FIN ;Si OUI, alors va en 'FIN' move.l #SAUVE,a2 ;Sinon adresse du tampon dans a2 DC.W $A00C ;et UNDRAW SPRITE move.l #BLOC,a0 ;L'adresse du bloc dans a0 move.l #SAUVE,a2 ;L'adresse du tampon dans a2 DC.W $A00D ;et DRAW SPRITE VSYNC ;On synchronise jmp DEUX ;et on recommence en 'DEUX' FIN WAIT ;attente TERM ;fin DATA ;Le bloc de définition du SPRITE: BLOC DC.W 0 ;X du point chaud DC.W 0 ;Y du point chaud DC.W 0 ;Format VDI DC.W 0 ;Couleur du MASQUE DC.W 1 ;Couleur du premier plan DC.W 0 ;pas de masque DC.W %0000000000000000 ;1° ligne du 1° plan DC.W 0 ;pas de masque DC.W %0000110110110000 ;2° ligne du 1° plan DC.W 0 ;pas de masque DC.W %0000110110110000 DC.W 0 DC.W %0000110110110000 DC.W 0 DC.W %0001100110011000 DC.W 0 DC.W %0011000110001100 DC.W 0 DC.W %0011000110001100 DC.W 0 DC.W %0110000110000110 DC.W 0 DC.W %0110000110000110 DC.W 0 DC.W %0000000000000000 DC.W 0 DC.W %0011000001111100 DC.W 0 DC.W %0011000001101100 DC.W 0 DC.W %0011000001111000 DC.W 0 DC.W %0011000001100000 DC.W 0 DC.W %0011111001100000 DC.W 0 ;pas de MASQUE DC.W %0000000000000000 ;16 ° ligne du 1° plan PIX DC.B 27,'E','Je vais faire bouger un SPRITE avec ' DC.B '$A00D',0 BSS X DS.W 1 ;on réserve un MOT en 'X' SAUVE DS.B 128 ;le TAMPON pour le SPRITE ( MOYENNE ;résolution) INCLUDE "TABLEAU.L" ;le tableau du VDI END 5) Exercice nr°5: -------------- Voilà le listing du programme qui affiche les points de différente couleur sur l'écran. TEXT INCLUDE "LINEQU.L" ;les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;les MACROS ; Je teste d'obord si on est dans la bonne résolution: GETREZ ;on demande la Résolution tst d0 ;A-t-on résolution=0 (BASSE) beq OK ;Si Oui va en 'OK' PRINTLINE MOYENNE ;sinon message WAIT ;attente TERM ;et fin OK SETBLOCK ;initialise DC.W $A000 ;adresse du T.I. dans a0 ; On pose les adresses des tableaux du VDI dans le T.I. move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) DC.W $A00A ;HIDE MOUSE PRINTLINE MESSAGE ;texte WAIT ;attente CCONOUT #27 ;ESC CCONOUT #'E' ;+'E' = effacer l'écran ; Je définit une MACRO INSTRUCTION nommée POINT qui admet 3 paramètres ; et qui permet d'éditer un point à l'écran gràce à la routine $A001 POINT MACRO $\1,$\2,$\3 ;macro à 3 paramètres move \1,ptsin ;\1=coordonnée X move \2,ptsin+2 ;\2=coordonnée Y move \3,intin ;\3=couleur DC.W $A001 ;PUT PIXEL ENDM ;fin de la macro ; Ici je vais afficher tous les points de l'écran et je leurs donne une ; couleur grƒce au nombre aléatoire que me donne RANDOM dans d0. ; Pour ne pas obtenir un nombre trop grand avec RANDOM, je masque le ; nombre de d0 avec le nombre maximum de chiffres dont j'ai besoin. ; On obtient ainsi un nombre compris entre 0 et la valeur du masque ; (Voir le chapitre sur le BIOS et l'XBIOS à la fonction RANDOM ...) ; Si d0=0 (couleur 0), je recommence le test avec RANDOM car la couleur ; du bord ne doit pas changer. move #319,d5 ;319 dans d5 move #1,d0 ;1 dans d0 PALETTE NOUVEAU ;on change la PALETTE une ;première fois LOOP move #199,d6 ;199 dans d6 BOUCLE POINT d5,d6,d0 ;POINT aux coordonnées ;(d5,d6) et avec la couleur ;contenue dans d0 ENCORE RANDOM ;Nombre aléatoire en retour ;dans d0 and.l #15,d0 ;on masque les 4 bits de plus ;faible poids de d0 :15=%1111 tst d0 ;A-t-on d0=0 ? beq ENCORE ;Si oui, on recommence dbf d6,BOUCLE ;on boucle d6 fois en BOUCLE dbf d5,LOOP ;on boucle d5 fois en LOOP ; Maintenant on fait varier la valeur de la palette des couleurs: ; On a crée un vecteur qui contient les adresses des palettes. ; (En 'VECTEUR') ; On prend une de ces adresses et on change la palette (Je n'utilise pas ; la MACRO PALETTE que nous avons crée car elle attend un LABEL comme pa- ; ramètre.) puis on recommence avec l'adresse de la palette suivante... ; J'utilise aussi INKEY pour tester si on enfonce une touche et si tel ; est le cas, le programme se termine. ICI move #14,d6 ;14 dans d6 lea VECTEUR,a6 ;adresse de 'VECTEUR' dans a6 CHANGE move.l (a6)+,-(sp) ;on pose le L-M pointé par a6 ;(une adresse pour la palette) ;dans -(SP) move #6,-(sp) ;Code 6 (PALETTE) trap #14 ;du BIOS addq.l #6,sp ;et on repositionne SP INKEY ;je teste une touche au vol tst d0 ;d0=0 ? (Si=0,pas de touche) bne RETOUR ;Si NON (1 touche a été en- ;foncée) on va en 'RETOUR' dbf d6,CHANGE ;Sinon boucle en 'CHANGE' jmp ICI ;puis va en 'ICI' RETOUR CCONOUT #27 ;ESC CCONOUT #'E' ;+'E' = effacer l'écran PALETTE ANCIEN ;On remet l'ancienne PALETTE TERM ;et on quitte le prg DATA ; Les données définissant les palettes qu'on affiche sucessivement pour ; obtenir une rotation des couleurs. ; A chaque palette, on fait une rotation d'une couleur vers la droite... ; La couleur 0 ne change jamais pour éviter d'obtenir un clignotement du ; bord de l'écran (Couleur 0) NOUVEAU DC.W $000,$027,$037,$027,$017,$016,$006,$015 DC.W $014,$036,$025,$005,$004,$014,$007,$003 UN DC.W $000,$007,$027,$037,$027,$017,$016,$006 DC.W $014,$015,$036,$025,$005,$004,$014,$007 DEUX DC.W $000,$003,$007,$027,$037,$027,$017,$016 DC.W $006,$015,$014,$036,$025,$005,$004,$014 TROIS DC.W $000,$007,$003,$007,$027,$037,$027,$017 DC.W $016,$006,$015,$014,$036,$025,$005,$004 QUATRE DC.W $000,$014,$007,$003,$007,$027,$037,$027 DC.W $017,$016,$006,$015,$014,$036,$025,$005 CINQ DC.W $000,$004,$014,$007,$003,$007,$027,$037 DC.W $027,$017,$016,$006,$015,$014,$036,$025 SIX DC.W $000,$005,$004,$014,$007,$003,$007,$027 DC.W $037,$027,$017,$016,$006,$015,$014,$036 SEPT DC.W $000,$025,$005,$004,$014,$007,$003,$014 DC.W $007,$027,$037,$027,$017,$016,$006,$015 HUIT DC.W $000,$036,$025,$005,$004,$014,$007,$003 DC.W $014,$007,$027,$037,$027,$017,$016,$006 NEUF DC.W $000,$015,$036,$025,$005,$004,$014,$007 DC.W $003,$014,$007,$027,$037,$027,$017,$016 DIX DC.W $000,$006,$015,$036,$025,$005,$004,$014 DC.W $07,$003,$014,$007,$027,$037,$027,$017 ONZE DC.W $000,$016,$006,$015,$036,$025,$005,$004 DC.W $014,$007,$003,$014,$007,$027,$037,$027 DOUZE DC.W $000,$017,$016,$006,$015,$036,$025,$005 DC.W $004,$014,$007,$003,$014,$007,$027,$037 TREIZE DC.W $000,$027,$017,$016,$006,$015,$036,$025 DC.W $005,$004,$014,$007,$003,$014,$007,$027 QUATORZE DC.W $000,$037,$027,$017,$016,$006,$015,$036 DC.W $025,$005,$004,$014,$007,$003,$014,$007 ; Le vecteur qui pointe sur les adresses des différentes palettes VECTEUR DC.L NOUVEAU,UN,DEUX,TROIS,QUATRE,CINQ,SIX,SEPT DC.L HUIT,NEUF,DIX,ONZE,DOUZE,TREIZE,QUATORZE ; L'ancienne palette ANCIEN DC.W $777,$500,$070,$000,$000,$000,$000,$000 DC.W $000,$000,$000,$000,$000,$000,$000,$000 MESSAGE DC.B 27,'E',174,' Image brouillée ',175,':avec la' DC.B ' fonction',13,10,'$A001 et RANDOM pour les' DC.B 'couleurs ...',13,10,13,10,'(Une touche pour' DC.B 'Quitter)',0 MOYENNE DC.B 27,'E','ATTENTION, Ce programme ne marche ' DC.B 'qu',39,'en BASSE RESOLUTION !',13,10,'Il faut ' DC.B 'changer la résolution grace au BUREAU GEM...',7,0 BSS INCLUDE "TABLEAU.L" ;le tableau du VDI END 6) Exercice nr°6: -------------- Voilà le corrigé du programme qui affiche les losanges sans puis avec le CLIPPING... TEXT INCLUDE "LINEQU.L" ;Les EQUs INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;Les MACROS SETBLOCK ;initialisation DC.W $A000 ;adresse du T.I. dans a0 movea.l a0,a5 ;je la sauve au cas o— ... ; On pose les adresses des tableaux du VDI dans le T.I. move.l #CONTROL,ticontrol(a0) move.l #INTIN,tiintin(a0) move.l #PTSIN,tiptsin(a0) move.l #INTOUT,tiintout(a0) move.l #PTSOUT,tiptsout(a0) PRINTLINE UN ;texte WAIT ;attente DC.W $A00A ;HIDE MOUSE CCONOUT #27 ;ESC CCONOUT #'E' ;+'E' = effacer l'écran move #0,_fg_bp_1(a5) move #1,_fg_bp_2(a5) ;couleur %10=2 move #0,_wrt_mode(a5) ;Write mode AND move #1,_patmsk(a5) ;2 données pour le PAT move.l #PAT,_patptr(a5) ;en 'PAT' move #4,sptsin ;4 sommets (losange) move #0,_clip(a5) ;PAS de CLIPPING jsr TRACER ;et on trace le losange WAIT ;attente PRINTLINE DEUX ;texte WAIT ;attente CCONOUT #27 ;ESC CCONOUT #'E' ;+'E' = effacer l'écran move #1,_clip(a5) ;AVEC CLIPPING ; Les coordonnées du CADRE DU CLIPPING sont: (0,0)-(320,190) move #0,_xmn_clip(a5) move #0,_ymn_clip(a5) move #320,_xmx_clip(a5) move #190,_ymx_clip(a5) jsr TRACER ;et on trace le losange WAIT ;attente TERM ;fin ; Ici on trace le losange avec FILLED POLYGONE: ; Coordonnées du POLYGONE dans PTSIN: (320,10)-(570,100)-(320,190)- ; (70,100) et on boucle avec (320,10) TRACER move #320,ptsin move #10,ptsin+2 move #570,ptsin+4 move #100,ptsin+6 move #320,ptsin+8 move #190,ptsin+10 move #70,ptsin+12 move #100,ptsin+14 move #320,ptsin+16 move #10,ptsin+18 ; Ici on apelle FILLED POLYGONE pour chaque ligne HORIZONTALE du losange: de Y=10 à Y=190 (car notre losange n'est définit qu'entre ces lignes) move #9,d6 ;9 dans d6 BOUCLE add #1,d6 ;on ajoute 1 à d6 move d6,_y1(a5) ;on pose d6 dans _y1 DC.W $A006 ;FILLED POLYGONE cmpi #190,d6 ;A-t-on d6=190 ? bne BOUCLE ;Si NON alors recommence en BOUCLE rts ;RETOUR du SOUS-PROGRAMME DATA PAT DC.W %1111111111111110 ;le PAT (Nombre PAIRE DC.W %0000000000000000 ;de MOTS) UN DC.B 27,'E','Je trace un POLYGONE avec $A006 :',0 DEUX DC.B 27,'E','Je trace le mème POLYGONE en utilisant ' DC.B 'le CLIPPING',0 BSS INCLUDE "TABLEAU.L" ;Le tableau du VDI END ------------------ Voilà pour la correction des exercices sur les LineAs... Les listings de ces 6 programmes ainsi que les programmes exécutables se trouvent bien entendu sur cette disquette dans les fichiers: 1) TRANSMOU.L & TRANSMOU.PRG 2) CADRE .L & CADRE .PRG 3) RECTANGL.L & RECTANGL.PRG 4) SPRITE .L & SPRITE .PRG 5) POINT .L & POINT .PRG 6) POLYGONE.L & POLYGONE.PRG PIECHOCKI Laurent 8,Impasse Bellevue Suite dans le fichier: INTERRUP.DOC 57980 TENTELING ------------
Back to ASM_Tutorial