Pl2 VDI.DOC

From Atari Wiki
Revision as of 20:37, 17 December 2023 by Olivier.jan (talk | contribs) (Replacing content of with translated version)
Jump to navigation Jump to search
                        --------------------
                            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 drawing a circle of coordinates (x, y) with a radius R on the screen.


Parameters:
opcode=11
sptsin=3
sintin=0
idsfct=5
handle=grhandle
ptsin  =x
ptsin+2=y
ptsin+4=0
pts