Pl2 VDI.DOC/fr
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