--------------------
CHAPTER N°7:
THE VDI
--------------------
*** INTRODUCTION ***
--------------------
- The VDI is a set of functions (like Gemdos, bios, and xbios) for graphics:
By calling the relevant functions, you can, for example, display a circle, a polygon, fill surfaces, etc...
I will also have to talk about AES functions, these will not be studied in this book (given the complexity of their implementation).
The AES functions mainly deal with the management of the screen and the mouse (Windows, object management...)
- A certain number of parameters will have to be supplied to the VDI functions to obtain the desired effect:
The transmission of parameters is done via an ARRAY:
(An ARRAY is nothing other than a memory space which we have reserved from an address (with DS.x place)).
This array is common to the functions of the VDI and the AES.
The array is located in the BSS segment and it is at certain of its addresses that we will place the parameters.
In the DATA segment, we will also have to place a label pointing to the various addresses of the array. (A label pointing to addresses in the DATA zone is generally called VECTOR...)
In the array which groups all the reservations for the functions of the VDI and the AES, we can distinguish several groups of arrays:
.The array pointed to by the 'CONTROL' address (for the VDI and AES):
it is in this array that we will deposit the function code and
the dimensions of the arrays 'intin', 'ptsin', 'intout', 'ptsout'.
.The one pointed to by the address 'GLOBAL' (for the AES):
details further on...
.4 arrays pointed to by addresses 'INTIN', 'INTOUT', 'PTSIN', 'PTSOUT'
In the 'IN' type arrays, the user can supply parameters and in the 'OUT' type ones, certain VDI or AES functions return values.
In INTIN we will place the parameters specific to the VDI or AES function used.
In INTOUT, the VDI or AES will deposit return data.
In PTSIN we store coordinates: this array is used by the VDI.
In PTSOUT the VDI in return provides coordinates (with certain functions).
.There will also be 2 arrays: ‘ADDRIN’ and ‘ADDROUT’ which are
specific to the AES and contain addresses (pointing to data...).
.The 'VDIPB' vector of the DATA segment successively points to the addresses of the arrays: CONTROL, INTIN, PTSIN, INTOUT, PTSOUT which are used by the VDI.
.There is also a vector (AESPB) that points to the addresses of the arrays OPCODE, APVERS, INTIN, INTOUT, ADDRIN, ADDROUT, and which is used by the AES functions.
This array is therefore composed as follows:
BSS ;BSS segment
CONTROL: ;CONTROL array (':' because it points to an
;address and not to an instruction...)
opcode ds.w 1 ;1st address of the 'control' array: opcode
sptsin ds.w 1 ;2nd address: sptsin
sptsout ds.w 1 ;3rd address: sptsout
sintin ds.w 1 ;4th address: sintin
sintout ds.w 1 ;5th address: sintout
idsfct ds.w 1 ;6th address: idsfct
handle ds.w 1 ;7th address: handle
ds.w 10
;the CONTROL array has a size of 54 bytes.
GLOBAL: ;start of the GLOBAL array
apvers ds.w 1 ;1st address of the 'global' array: apvers
apcount ds.w 1 ;2nd address: apcount
apid ds.w 1 ;3rd address: apid
apprivate ds.l 1 ;4th address: apprivate
apptree ds.l 1 ;5th address: apptree
ap1resv ds.l 1 ;6th address: ap1resv
ap2resv ds.l 1 ;7th address: ap2resv
ap3resv ds.l 1 ;8th address: ap3resv
ap4resv ds.l 1 ;9th address: ap4resv
;the GLOBAL array has a size of 30 bytes
intin ds.w 128 ;'intin' array: 128 words
intout ds.w 128 ;'intout' array: 128 words
ptsin ds.w 128 ;'ptsint' array: 128 words
ptsout ds.w 128 ;'ptsout' array: 128 words
addrin ds.w 128 ;'addrin' array (AES): 128 words
addrout ds.w 128 ;'addrout' array (AES): 128 words
grhandle ds.w 1 ;here we reserve 1 word for the handle
ds.b 300 ;RESERVATIONS FOR SETBLOCK in 'STACK'
PILE ds.b 1
DATA ;DATA segment
;the vector of the AES
ALIGN.W ;even address because here are L-words
aespb dc.l control,global,intin,intout,addrin,addrout
;the vector of the VDI
ALIGN.W ;even address because here are L-words
vdipb dc.l control,intin,ptsin,intout,ptsout
END
- This array must be included in your listings if you use VDI or AES functions.
It is found in the file: TABLEAU.L, you will just need to include it at the end of your listing.
- Here now is the meaning of each FIELD (sub-parts) of the CONTROL and GLOBAL arrays:
CONTROL Array:
opcode :(at CONTROL+0) = the function code to call
sptsin :(at CONTROL+2) = the number of pairs of points in PTSIN
sptsout :(at CONTROL+4) = idem for PTSOUT
sintin :(at CONTROL+6) = number of words in INTIN
sintout :(at CONTROL+8) = idem for INTOUT
idsfct :(at CONTROL+10)= identification number of the function
handle :(at CONTROL+12)= handle number
GLOBAL Array
apvers :(at GLOBAL+0) = version number of the AES in service
apcount :(at GLOBAL+2) = maximum authorized number of programs simultaneously in memory
apid :(at GLOBAL+4) = current application number
apprivate:(at GLOBAL+6) = depending on the function
apptree :(at GLOBAL+10)= pointer to an object tree structure
ap1resv :(at GLOBAL+14)= reserved for future applications...
ap2resv :(at GLOBAL+18)= idem
ap3resv :(at GLOBAL+22)= idem
ap4resv :(at GLOBAL+26)= idem
- But before you can use the various functions of the VDI or the AES, you will need to make some initializations.
(As for GEMDOS with SETBLOCK).
You will have to call the functions: APPL_INIT and then GRAF_HANDLE
to initialize the AES.
You will have to call the functions: OPEN_SCREEN_ WORKSTATION then
to initialize the VDI.
- To call these functions, we will pass the necessary parameters in the array (at the correct addresses) of the reservations and we will call the VDI with:
MOVE.L #vdipb,d1 ;address of the VDIPB VECTOR in d1
MOVE #$73,d0 ;word=$73 in d0
TRAP #2 ;call to the VDI
or the AES with:
MOVE.L #aespb,d1 ;address of the AESPB VECTOR in d1
MOVE #$C8,d0 ;word=$C8 in d0
TRAP #2
and this after each VDI or AES function that we will call.
The OPEN_SCREEN_WORKSTATION function allows to open a workstation by loading the VDI graphic management system into memory.
The parameters to provide are:
In opcode, 1 WORD=100 (the function CODE)
In sptsin, 1 WORD=0
In sintin, 1 WORD=11
In handle, the WORD pointed by grhandle
In intin up to intin+20, 1 WORD=1
In reality, the parameters placed in INTIN must provide the following information:
intin = identification of the device to the motherboard
intin+2 = line type
intin+4 = line color
intin+6 = marking type
intin+8 = marking color
intin+10= character set
intin+12= writing color
intin+14= fill type
intin+16= fill pattern
intin+18= fill color
intin+20= coordinates for flags
But we will not use them, we then put all these values at 1...
The APPL_INIT function of the AES allows to initialize the AES.
The parameters to provide are:
In the 4 apresv, 1 L-M=0
In opcode, 1 WORD=10 (the function CODE)
In sptsin, 1 WORD=0
In sptsout, 1 WORD=1
In sintin, 1 WORD=0
In sintout, 1 WORD=0
The GRAF_HANDLE function of the AES enables to give an identification number to our program.
This number returns in INTOUT and we will place it in 'grhandle'.
The parameters to pass are:
In opcode, 1 WORD=77 (the function CODE)
In sptsin, 1 WORD=0
In sptsout, 1 WORD=5
In sintin and sintout, 1 WORD=0
As the OPEN_SCREEN_WORSTATION function of the VDI needs this identification number (parameter), it is with the call of the AES that it will be necessary to start.
After calling the GRAF_HANDLE function of the AES, we will deposit the identification number deposited in INTOUT in 'grhandle' with:
MOVE INTOUT,GRHANDLE
We will also create 2 MACRO instructions that will be responsible for calling the VDI and the AES.
VDI MACRO ;VDI call macro
MOVE.L #VDIPB,d1 ;address of the VDIPB Vector in d1
MOVE #$73,d0 ;word=$73 in d0
TRAP #2 ;call to the GEM
ENDM ;end of the macro
AES MACRO ;AES call macro
MOVE.L #AESPB,d1 ;address of the AESPB Vector in d1
MOVE #$C8,D0 ;word=$C8 in d0
TRAP #2 ;call to the GEM
ENDM ;end of the macro
- The complete listing of the initialization program for the AES and the
VDI will therefore be:
; initialization of the VDI and the 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 ;We save the 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
The listing for this initialization is found in the file INIT_GEM.L
- All your programs that use the VDI or AES will therefore have this structure:
TEXT
INCLUDE "INIT_TOS.L" ;file of the SETBLOCK macro
INCLUDE "INIT_GEM.L" ;file of the VDI/AES initializations
SETBLOCK ;memory reserve
. ;the instructions that form
. ;your program...
.
DATA
. ;the initialized data
.
BSS
INCLUDE "TABLEAU.L" ;the TABLEAU of the VDI and AES:
;Also contains the 'STACK' reservations
;for SETBLOCK...
END
*** THE FUNCTIONS OF THE VDI ***
---------------------------
You are now ready to use the graphic functions of the VDI:
I will quote the most interesting functions and give you for each the parameters to pass in the array: TABLEAU.L
I will also give you the return parameters if the function provides them and if they can be useful...
TEXT: Allows editing a text at coordinates (x, y).
----
Parameters:
Opcode=8
sptsin=1
sintin=n
handle=grhandle
intin=the character string composed of 'n' letters
ptsin=x
ptsin+2=y
NB: The character string must end with a NULL value.
GRAPHIC TEXT COLOR: Allows selecting the color of a graphic text.
------------------
Parameter:
opcode=22
sptsin=0
sintin=1
handle=grhandle
intin=chosen color
GRAPHIC TEXT SPECIAL EFFECTS: Allows manipulating the type of graphic text.
----------------------------
The type of graphic text is deposited in 'intin' in the form of a word,
only the bits 0 to 5 of the word are used and allow to choose:
BIT number: Effect on TEXT
0 bold characters
1 thin characters
2 italic characters
3 underlined characters
4 'light' characters
5 'outline' characters
parameters:
opcode=106
sptsin=0
sintin=1
handle=grhandle
intin=bit vector
CONTOUR FILL: Allows filling a surface from a starting point of coordinates (x, y).
------------
Parameters:
opcode=103
sptsin=1
sintin=1
handle=grhandle
intin=fill color
ptsin=x
ptsin+2=y
SET FILL COLOR INDEX: Determines the color used for filling functions.
---------------------
Parameters:
opcode=25
sptsin=0
sintin=1
handle=grhandle
intin=fill color
Return parameters:
intout=fill color
SET FILE INTERIOR: Allows selecting the type of fill for filling functions
------------------
There are 5 types of fills:
0=no fill
1=solid fill with the selected color
2=filling with predefined patterns
3=fills with HATCHES
4=fills with a pattern redefined by the programmer
Parameters:
opcode=23
sptsin=0
sintin=1
handle=grhandle
intin=type of fill (0-5)
SET FILL STYLE: Allows selecting the matrix for filling functions: 36 patterns are available
The matrix is the pattern used for filling the surface:
It can be type 3 (24 patterns) or type 2 (12 patterns) (see the SET FILL INTERIOR function for the 5 types available)
Parameters:
opcode=24
sptsin=0
sintin=1
handle=grhandle
intin=pattern number (1-24) or (1-12)
SET WRITING MODE: Allows selecting the writing mode of all graphic editions.
In mode 1: AND mode, what is underneath is always erased.
In mode 2: OR mode, we only write where there are no points yet and the voids are always represented.
In mode 3: XOR mode, we only place points where there are not any yet and the points already occupied are erased
In mode 4: inverse transparent mode, we only place points where there were already and only if they do not have color (allows to obtain a NEGATIVE of the destination pattern).
Parameters:
opcode=32
sptsin=0
sintin=1
handle=grhandle
intin=graphic mode (1-4)
FILL RECTANGLE: Fills a rectangle defined as follows: coordinates of the upper left corner (x1, y1), coordinates of the lower right corner (x2, y2)
Parameters:
opcode=114
sptsin=2
sintin=0
handle=grhandle
ptsin =x1
ptsin+2=y1
ptsin+4=x2
ptsin+6=y2
CIRCLE: Allows you to draw a circle on the screen with coordinates (x, y) and radius R.
Parameters:
Opcode = 11
Sptsin = 3
Sintin = 0
Idsfct = 5
Handle = grhandle
Ptsin:
x (Ptsin)
y (Ptsin+2)
0 (Ptsin+4)
0 (Ptsin+6)
R (Ptsin+8)
0 (Ptsin+10)
That's it for the VDI functions. I certainly haven't covered all of them. They are too slow and heavy to be truly worthy of your attention. I will soon discuss LINES_A, which are also graphical functions but much faster. In the meantime, you can take a look at the listing of a sample program that clearly illustrates the use of the VDI functions described above.
Listing: VDI.L file
Executable: VDI.PRG file
Note: If you want to use a VDI function in a loop, it's not necessary to reset all the parameters of the table since they are not cleared. You just need to vary the parameters that need to change in your loop and then call the VDI.
For those who still want to learn more about VDI or AES functions, you can refer to the book "LE LIVRE DU GEM" by Micro Application.
PIECHOCKI Laurent
8, Impasse Bellevue
57980 TENTELING
Continued in the LINEA.DOC file.