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