Pl2 CORRIG 3.DOC/fr

From Atari Wiki
Revision as of 21:07, 17 December 2023 by Olivier.jan (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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