Pl2 VDI.DOC/fr

From Atari Wiki
Revision as of 20:37, 17 December 2023 by Olivier.jan (talk | contribs) (Replacing content with updated version)
Jump to navigation Jump to search

                         --------------------
                             CHAPITRE N°7:

                               LE   VDI 
     
                         --------------------     


                         *** INTRODUCTION ***
                         --------------------


- Le VDI est un ensemble de fonctions (tout comme le Gemdos,le bios et
  l'xbios) graphiques:

  En appellant les fonctions adequates, on pourra donc par exemple affi-
  cher un cercle,un polygone,remplir des surfaces etc...

  Je vais aussi être amen‚ à parler des fonctions de l'AES, celles-ci ne
  seront pas ‚tudi‚es dans cet ouvrage (vu la complexit‚ de leur mise en
  oeuvre).
  Les fonctions de l'AES s'occupent essentiellement de la gestion de
  l'‚cran et de la souris.(Fenètres,gestion des objets...)
 
- Il faudra fournir un certain nombre de paramètres aux fonctions du VDI
  pour pouvoir obtenir l'effet d‚sir‚:
  La transmission des paramètres se fait par l'interm‚diaire d'un TABLEAU:
  (Un TABLEAU n'est rien d'autre qu'un espace de la m‚moire qu'on a r‚ser-
  v‚ à partir d'une adresse (avec DS.x   place) ).
  Ce tableau est commun aux fonctions du VDI et de l'AES.
  Le tableau se trouve dans le segment BSS et c'est à certaines de ses ad-
  resses qu'on placera les paramètres. 
  Dans le segment DATA, on devra aussi poser un label qui pointe sur les
  diff‚rentes adresses du tableau.(Un label qui pointe sur des adresses
  en zone DATA est g‚n‚ralement appell‚ VECTEUR...)  
  Dans le tableau qui regroupe toutes les r‚servations pour les fonctions
  du VDI et de l'AES, on distingue plusieurs groupes de tableaux:

  .Le tableau point‚ par l'adresse 'CONTROL' (pour le VDI et l'AES)
   :c'est dans ce tableau qu'on d‚posera le code de la fonction et
   les dimensions des tableaux 'intin','ptsin','intout','ptsout'.
 
  .Celui point‚ par l'adresse 'GLOBAL' (pour l'AES)
   :d‚tails plus loin...

  .4 tableaux point‚s par les adresses 'INTIN','INTOUT','PTSIN','PTSOUT'  
   Dans les tableaux de type 'IN', l'utilisateur peut fournir des para-
   mètres et dans ceux du type 'OUT', certaines fonctions du VDI ou de
   l'AES retournent des valeurs. 
   Dans INTIN on placera les paramètres propres à la fonction VDI ou 
   AES utilis‚e.
   Dans INTOUT, le VDI ou l'AES posera des donn‚es de retour.
   Dans PTSIN on range des coordonn‚es:ce tableau est utlis‚ par le VDI.
   Dans PTSOUT le VDI fournit en retour des coordonn‚es (avec certaines
   fonction).
   
  .On trouvera aussi 2 tableaux:  'ADDRIN' et 'ADDROUT' qui sont 
   sp‚cifiques à l'AES et qui contiennent des adresses (pointant
   sur des donn‚es...). 

  .Le vecteur 'VDIPB' du segment DATA pointe successivement les adresses
   des tableaux: CONTROL,INTIN,PTSIN,INTOUT,PTSOUT qui sont utilis‚s par
   le VDI.

  .Il existe aussi un vecteur (AESPB) qui pointe sur les adresses des
   tableaux OPCODE,APVERS,INTIN,INTOUT,ADDRIN,ADDROUT et qui est uti-
   lis‚ par les fonctions de l'AES.

  Ce tableau est donc compos‚ ainsi:


          BSS                 ;segment BSS

CONTROL:                      ;tableau CONTROL (':' car il pointe sur une
                              ;adresse et non pas sur une instruction...)
opcode    ds.w      1         ;1° adresse du tableau 'control':opcode
sptsin    ds.w      1         ;2° adresse:sptsin     
sptsout   ds.w      1         ;3° adresse:sptsout
sintin    ds.w      1         ;4° adresse:sintin
sintout   ds.w      1         ;5° adresse:sintout
idsfct    ds.w      1         ;6° adresse:idsfct
handle    ds.w      1         ;7° adresse:handle
          ds.w      10

;le tableau CONTROL a une taille de 54 octets.


GLOBAL:                       ;d‚but du tableau GLOBAL
apvers    ds.w      1         ;1° adresse du tableau 'global':apvers
apcount   ds.w      1         ;2° adresse:apcount
apid      ds.w      1         ;3° adresse:apid
apprivate ds.l      1         ;4° adresse:apprivate
apptree   ds.l      1         ;5° adresse:apptree
ap1resv   ds.l      1         ;6° adresse:ap1resv
ap2resv   ds.l      1         ;7° adresse:ap2resv
ap3resv   ds.l      1         ;8° adresse:ap3resv
ap4resv   ds.l      1         ;9° adresse:ap4resv

;le tableau GLOBAL a une taille de 30 octets



intin     ds.w      128       ;tableau 'intin':128 mots
     
intout    ds.w      128       ;tableau 'intout':128 mots
     
ptsin     ds.w      128       ;tableau 'ptsint':128 mots

ptsout    ds.w      128       ;tableau 'ptsout':128 mots



addrin    ds.w      128       ;tableau 'addrin' (AES):128 mots

addrout   ds.w      128       ;tableau 'addrout' (AES):128 mots


grhandle  ds.w      1         ;ici on r‚serve 1 mot pour le handle


          ds.b      300       ;RESERVATIONS POUR SETBLOCK en 'PILE'
PILE      ds.b      1


          DATA                ;segment DATA

;le vecteur de l'AES

          ALIGN.W   ;adresse paire car ici se trouvent des L-M
     
aespb     dc.l      control,global,intin,intout,addrin,addrout

;le vecteur du VDI

          ALIGN.W   ;adresse paire car ici se trouvent des L-M

vdipb     dc.l      control,intin,ptsin,intout,ptsout

          END



 -  Ce tableau devra être inclu dans vos listings si vous utilisez des 
    fonctions du VDI ou de l'AES.
    Il se trouve dans le fichier :TABLEAU.L ,il vous suffira donc de 
    l'inclure à la fin de votre listing.

 -  Voilà maintenant la signification de chaque CHAMP (sous-parties)
    des tableaux CONTROL et GLOBAL:

    Tableau CONTROL:

    opcode  :(en CONTROL+0) =le code de la fonction à appeller
    sptsin  :(en CONTROL+2) =le nombre de couples de points dans PTSIN
    sptsout :(en CONTROL+4) =idem pour PTSOUT
    sintin  :(en CONTROL+6) =nombre de mots dans INTIN
    sintout :(en CONTROL+8) =idem pour INTOUT
    idsfct  :(en CONTROL+10)=nr° d'identification de la fonction 
    handle  :(en CONTROL+12)=nr° du handle
             

    Tableau GLOBAL

    apvers   :(en GLOBAL+0) =nr° de la version de l'AES en service
    apcount  :(en GLOBAL+2) =nombre maximum autoris‚ de programmes
                             simultanement en m‚moire
    apid     :(en GLOBAL+4) =nr° de l'application en cours
    apprivate:(en GLOBAL+6) =selon la fonction
    apptree  :(en GLOBAL+10)=pointeur sur une structure d'arbre d'objets
    ap1resv  :(en GLOBAL+14)=r‚serv‚ à des applications futures...
    ap2resv  :(en GLOBAL+18)=idem
    ap3resv  :(en GLOBAL+22)=idem
    ap4resv  :(en GLOBAL+26)=idem


 -  Mais avant de pouvoir utiliser les diff‚rentes fonctions du VDI ou 
    de l'AES, il faudra faire quelques initialisations.
    (Comme pour le GEMDOS avec SETBLOCK).

    Il faudra appeler les fonctions:APPL_INIT puis GRAF_HANDLE 
    pour initialiser l'AES.

    Il faudra appeler les fonctions:OPEN_SCREEN_ WORKSTATION puis
    pour initialiser le VDI.

 -  Pour appeller ces fonctions, nous allons passer les paramètres
    n‚c‚ssaires dans le tableau (aux bonnes adresses) des r‚serva-
    tions et nous appellerons le VDI avec:
    
    MOVE.L  #vdipb,d1    ;adresse du VECTEUR VDIPB dans d1
    MOVE    #$73,d0      ;mot=$73 dans d0
    TRAP    #2           ;appel du VDI
 
    ou l'AES avec:

    MOVE.L  #aespb,d1    ;adresse du VECTEUR AESPB dans d1
    MOVE    #$C8,d0      ;mot=$C8 dans d0
    TRAP    #2

    et cela après chaque fonction VDI ou AES que nous appelleront.
 

    La fonction OPEN_SCREEN_WORKSTATION permet d'ouvrir une station
    de travail en chargeant en m‚moire le système de gestion graphique
    du VDI.

    Les paramètres à fournir sont:

    Dans opcode,1 MOT=100 (le CODE de la fonction)
    Dans sptsin ,1 MOT=0
    Dans sintin,1 MOT=11
    Dans handle,le MOT point‚ par grhandle
    Dans intin jusqu'à intin+20, 1 MOT=1
  
    En r‚alit‚, les paramètres plac‚s en INTIN, doivent donner les
    renseignements suivants:

     intin   =identification du p‚riph‚rique à la carte mère
     intin+2 =type de ligne
     intin+4 =couleur de la ligne
     intin+6 =type de marquage
     intin+8 =couleur du marquage
     intin+10=jeu de caractère
     intin+12=couleur de l'‚criture
     intin+14=type de remplissage
     intin+16=motif de remplissage
     intin+18=couleur du remplissage
     intin+20=coordonn‚es pour des drapeaux          

    Mais nous ne nous en servirons pas, nous mettons alors toutes ces
    valeurs à 1...


    La fonction APPL_INIT de l'AES permet d'initialiser l'AES.

    Les paramètres à fournir sont:

    Dans les 4 apresv,1 L-M=0 
    Dans opcode,1 MOT=10 (le CODE de la fonction)
    Dans sptsin,1 MOT=0
    Dans sptsout,1 MOT=1 
    Dans sintin,1 MOT=0
    Dans sintout,1 MOT=0
    
    La fonction GRAF_HANDLE de l'AES permet de donner un num‚ro 
    d'identification à notre programme.
    Ce num‚ro retourne dans INTOUT et nous le placerons en 'grhandle'.

    Les paramètres à passer sont:

    Dans opcode,1 MOT=77 (le CODE de la fonction)
    Dans sptsin,1 MOT=0
    Dans sptsout,1 MOT=5
    Dans sintin et sintout, 1 MOT=0

    Comme la fonctions OPEN_SCREEN_WORSTATION du VDI a besoin de ce nr°
    d'identification ( paramètre ), c'est par l'appel de l'AES qu'il
    faudra commencer.

    Après l'appel de la fonction GRAF_HANDLE de l'AES, nous poserons
    le nr° d'identification d‚pos‚ en INTOUT en 'grhandle' avec:

    MOVE  INTOUT,GRHANDLE

    Nous allons aussi cr‚er 2 MACROS instructions qui vont se charger
    d'appeller le VDI et l'AES.


VDI  MACRO                      ;macro d'appel du VDI
     MOVE.L    #VDIPB,d1        ;adresse du Vecteur VDIPB dans d1
     MOVE      #$73,d0          ;mot=$73 dans d0
     TRAP      #2               ;appel du GEM 
     ENDM                       ;fin de la macro

AES  MACRO                      ;macro d'appel de l'AES
     MOVE.L    #AESPB,d1        ;adresse du Vecteur AESPB dans d1
     MOVE      #$C8,D0          ;mot=$C8 dans d0
     TRAP      #2               ;appel du GEM   
     ENDM                       ;fin de la macro     


 - Le listing complet du programme d'initialisation pour l'AES et le
   VDI sera donc:
  

; initialisation du VDI et de l'AES 

        TEXT


VDI      MACRO                      
         move.l   #vdipb,d1        
         move     #$73,d0          
         trap     #2               
         ENDM                       

AES      MACRO                      
         move.l    #aespb,d1        
         move      #$C8,D0          
         trap      #2                  
         ENDM                       

;        APPL_INIT 


         move.l    #0,ap1resv
         move.l    #0,ap2resv
         move.l    #0,ap3resv
         move.l    #0,ap4resv
         move.w    #10,opcode
         move.w    #0,sptsin
         move.w    #1,sptsout
         move.w    #0,sintin
         move.w    #0,sintout
         AES                       ;-->AES
  
;         GRAF_HANDLE 

          move.w    #77,opcode
          move.w    #0,sptsin
          move.w    #5,sptsout
          move.w    #0,sintin
          move.w    #0,sintout
          AES                      ;-->AES

          move.w    intout,grhandle     ;On sauvgarde le HANDLE


;         OPEN VIRTUAL SCREEN WORKSTATION 

          move.w    #100,opcode         
          move.w    #0,sptsin
          move.w    #11,sptsout
          move.w    grhandle,handle     
          move.w    #1,intin            
          move.w    #1,intin+2
          move.w    #1,intin+4
          move.w    #1,intin+6
          move.w    #1,intin+8
          move.w    #1,intin+10
          move.w    #1,intin+12
          move.w    #1,intin+14
          move.w    #1,intin+16
          move.w    #1,intin+18
          move.w    #1,intin+20
          VDI                           ;-->VDI

          END


 Le listing de cette initialisation se trouve dans le fichier INIT_GEM.L
 

 - Tous vos programmes qui utilisent le VDI ou l'AES auront donc
   cette structure:


     TEXT
     
     INCLUDE   "INIT_TOS.L"   ;fichier de la macro SETBLOCK
     INCLUDE   "INIT_GEM.L"   ;fichier des initialisations du VDI/AES

     SETBLOCK                 ;r‚serve m‚moire

     .         ;les instructions qui forment
     .         ;votre programme...
     .

     DATA

     .         ;les donn‚es initialis‚es
     .
    
     BSS

     INCLUDE   "TABLEAU.L"    ;le TABLEAU du VDI et de l'AES:
                              ;Contient aussi les r‚servations en 'PILE'
                              ;pour SETBLOCK...                        
     END



                       *** LES FONTIONS DU VDI ***
                       ---------------------------

 Vous voilà prèts à pr‚sent à utiliser les fonctions graphiques du VDI:
 
 Je vais citer les fonctions les plus int‚ressantes et vous donner pour
 chacunes d'elles les paramètres à passer dans le tableau: TABLEAU.L
 
 Je vous donnerais aussi les paramètres de retour si la fonction en
 fournit et si ils peuvent être utiles...


 
 TEXT:Permet l'‚dition d'un texte à des coordonn‚es (x,y)
 ----
 Paramètres:

 Opcode=8
 sptsin=1
 sintin=n
 handle=grhandle
 intin=la chaine de caractère compos‚e de 'n' lettres   
 ptsin=x
 ptsin+2=y
 

 NB:La chaine de caractère doit se terminer par une valeur NULLE.
 --

 GRAPHIC TEXT COLOR:Permet de selectionner la couleur d'un texte graph.
 ------------------
 Paramètre:

 opcode=22
 sptsin=0
 sintin=1
 handle=grhandle
 intin=couleur choisie


 GRAPHIC TEXT SPECIAL EFFECTS:Permet de manipuler le type du texte graph.
 ----------------------------
 Le type du texte graphique est d‚pos‚ en 'intin' sous la forme d'un mot,
 seuls les bits 0 à 5 du mot sont utilis‚s et permettent de choisir:

 nr° BIT:          Effet sur TEXT

 0                 caractères gras
 1                 caractères fins
 2                 caractères italiques
 3                 caractères soulign‚s
 4                 caractères 'light'
 5                 caractères 'outline'
  
 
 paramètres:

 opcode=106
 sptsin=0
 sintin=1
 handle=grhandle
 intin=vecteur bit

 
 CONTOUR FILL:Permet de remplir une surface à partir d'un point de d‚part
 ------------ de coordonn‚es (x,y)

 Paramètres:

 opcode=103
 sptsin=1
 sintin=1
 handle=grhandle
 intin=couleur du remplissage
 ptsin=x
 ptsin+2=y
 

 SET FILL COLOR INDEX:D‚termine la couleur utilis‚e pour les fonctions de
 -------------------- remplissage.

 Paramètres:

 opcode=25
 sptsin=0
 sintin=1
 handle=grhandle
 intin=couleur de remplissage

 Paramètres de retour:

 intout=couleur de remplissage


 SET FILE INTERIOR:Permet de selectionner le type de remplissage pour 
 ----------------- les fonctions de remplissage

 Il existe 5 types de remplissages:
 
 0=pas de remplissage
 1=remplissage de type PLEIN avec la couleur selectionn‚e
 2=remplissage avec des motifs pr‚d‚finis
 3=remplissage avec des HACHURES
 4=remplissage avec un motif red‚fini par le programmeur

 Paramètres:

 opcode=23
 sptsin=0
 sintin=1
 handle=grhandle
 intin=type de remplissage (0-5)
 

 SET FILL STYLE:Permet de selectionner la matrice pour les fonctions de
 -------------- remplissage:36 motifs sont disponibles

 La matrice est la trame utilis‚e pour le remplissage de la surface:
 Elle peut ètre du type 3 (24 motifs) ou du type 2 (12 motifs) (voir
 la fonction SET FILL INTERIOR pour les 5 types disponibles)

 Paramètres:

 opcode=24
 sptsin=0
 sintin=1
 handle=grhandle
 intin=nr° motif (1-24) ou (1-12)


 SET WRITING MODE:Permet de selectionner le mode d'‚criture de toutes les
 ---------------- ‚ditions graphiques.

 En mode 1:mode AND, ce qui est en dessous est toujours effac‚. 
 En mode 2:mode OR , on ‚crit seulement là o— il n'y a pas encore de 
           points et les vides sont toujours repr‚sent‚s.
 En mode 3:mode XOR ,on ne place des points que là o— il n'y en a pas
           encore et les points d‚jà occup‚s sont ‚ffac‚s
 En mode 4:mode transparent inverse, on ne place que des points là o— il
           y en avait d‚jà et seulement si ils ne possèdent pas de cou-
           leur (permet d'obtenir un NEGATIF de la trame destination).
  

 Paramètres:

 opcode=32
 sptsin=0
 sintin=1
 handle=grhandle
 intin=mode graphique (1-4)


 FILL RECTANGLE:Rempli un rectangle d‚finit ainsi:coordonn‚es du coin
 -------------- sup‚rieur gauche (x1,y1),coordonn‚es du coin inf‚rieur
                droit (x2,y2)

 Paramètres:
 
 opcode=114
 sptsin=2
 sintin=0 
 handle=grhandle
 ptsin  =x1
 ptsin+2=y1
 ptsin+4=x2
 ptsin+6=y2


 CIRCLE:Permet de dessiner un cercle de coordonn‚es (x,y) et de rayon R
 ------ à l'‚cran.

 
 Paramètres:

 opcode=11
 sptsin=3
 sintin=0
 idsfct=5
 handle=grhandle
 
 ptsin  =x
 ptsin+2=y
 ptsin+4=0
 ptsin+6=0
 ptsin+8=R
 ptsin+10=0



 - Voilà pour les fonctions du VDI, je n'ai bien sur pas pr‚sent‚ toutes
   les fonctions...
   Elles sont bien trop lentes et trop lourdes à exploiter pour pouvoir
   v‚ritablement être dignes de votre attention...
   Je parlerais bientot des LINES_A, ce sont aussi des fonctions graphi-
   ques mais elles au moins sont très rapides.En attendant, vous pouvez
   regarder le listing d'un programme exemple qui illustre clairement
   l'utilisation des fonctions du VDI d‚crites ci-dessus.
  
   .Listing   :fichier VDI.L
   .‚xecutable:fichier VDI.PRG

 NB:Si vous d‚sirez utiliser une fonction du VDI dans une boucle, il 
 -- n'est pas n‚cessaire de r‚initialiser tous les paramètres du tableau
    puisqu'ils ne sont pas effac‚s:il suffira donc de faire varier les
    paramètres qui doivent changer dans votre boucle puis d'appeller le
    VDI. 

   Ceux qui d‚sirent malgr‚ tout en savoir plus sur les fonctions du VDI
   ou de l'AES pourront se r‚fèrer au livre:
   'LE LIVRE DU GEM' de Micro Application.


   
    PIECHOCKI   Laurent
    8, Impasse Bellevue                Suite dans le fichier LINEA.DOC
    57980     TENTELING                                      ---------



 




Back to ASM_Tutorial