Pl2 CORRIG 3.DOC/fr

From Atari Wiki
Revision as of 15:18, 12 October 2011 by Admin (talk | contribs)
Jump to navigation Jump to search


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