DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦1cff26bc5⟧ TextFile

    Length: 49408 (0xc100)
    Types: TextFile
    Names: »VDIBND.PAS«

Derivation

└─⟦4fbcde1e4⟧ Bits:30003931/GEM_Development-A.imd Disketter indleveret af Steffen Jensen (Piccolo/Piccoline)
    └─⟦this⟧ »VDIBND.PAS« 

TextFile


(*****************************************************************)
(**    File Name   :  VDIBND.PAS                                **)
(**                                                             **)
(**    Modified for Turbo Pascal                                **)
(**                                                             **)
(**    Comments    :  All these language bindings               **)
(**                   use array's relative to 0.                **)
(**                                                             **)
(**     Author         : Athol M Foden                          **)
(**     History        : Feb 1985                               **)
(**     Last Modified  : 12 February 1986                       **)
(**     Digital Research Inc.                                   **)
(**                                                             **)
(*****************************************************************)

(* reuires gempcon.i, gemptype.i, gempvar.i *)

(*****************************************************************)

PROCEDURE GVDI (VAR gptsout : ptsout_ARRAY;
                VAR gintout : intout_ARRAY;
                VAR gptsin : ptsin_ARRAY;
                VAR gintin : intin_ARRAY;
                VAR gcontrl : contrl_ARRAY);

CONST
        VDIinterruptVector = $EF;
        VDImagicConstant = $0473;

TYPE
        ADDRESS = ^BYTE;

VAR
        parameterBlock : RECORD
                controlArray : ADDRESS;
                inputParameterArray : ADDRESS;
                inputPointCoordinateArray : ADDRESS;
                outputParameterArray : ADDRESS;
                outputPointCoordinateArray : ADDRESS;
        END (* RECORD *);

        registers : RECORD
                ax, bx, cx, dx, bp, si, di, ds, es, flags : INTEGER;
        END (* RECORD *);

BEGIN (* GVDI *)

        parameterBlock.controlArray := ADDR(gcontrl);
        parameterBlock.inputParameterArray := ADDR(gintin);
        parameterBlock.inputPointCoordinateArray := ADDR(gptsin);
        parameterBlock.outputParameterArray := ADDR(gintout);
        parameterBlock.outputPointCoordinateArray := ADDR(gptsout);

        registers.cx := VDImagicConstant;
        registers.ds := SEG(parameterBlock);
        registers.dx := OFS(parameterBlock);

        swint(VDIinterruptvector, registers);

END (* GVDI *);

(**************************************************************)
(* general (and only) call to GEM VDI *)

FUNCTION gemvdif(opcode, handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ0Å := opcode;
        contrlÆ6Å := handle;
        (* in gempcall - gdos interrupt*)
        GVDI(ptsout, intout, ptsin, intin, contrl);
        gemvdif := intoutÆ0Å;
END;

(********************************************************************)
        (*** CONTROL FUNCTIONS ***)
(*****************************************************************)
(** open workstation **)

FUNCTION v_opnwk (workin : intin_ARRAY;
                  VAR  handle : INTEGER;
                  VAR workout : ARRAY_57) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        FOR i:=0 TO intin_max DO
                intinÆiÅ := workinÆiÅ;
        contrlÆ1Å := 0;
        contrlÆ3Å := 11;
        v_opnwk := gemvdif(1,handle);             (* opcode = 1 *)
        handle := contrlÆ6Å;
        FOR i:=0 TO 44 DO
                workoutÆiÅ := intoutÆiÅ;
        FOR i:=0 TO 11 DO
                workoutÆi + 44Å := ptsoutÆiÅ;
END;

(****************************************************************)
(** close workstation **)

FUNCTION v_clswk (handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        v_clswk := gemvdif(2,handle);
END;

(*****************************************************************)
(** open virtual workstation **)

FUNCTION v_opnvwk (workin : intin_ARRAY;
                   VAR handle : INTEGER;
                   VAR workout : ARRAY_57) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;           (* no of input vertices *)
        contrlÆ3Å := 11;          (* length of intin *)
        FOR i:=0 TO intin_max DO
                intinÆiÅ := workinÆiÅ;
        v_opnvwk := gemvdif(100,handle);
        (* handle from previously opened screen device *)
        handle := contrlÆ6Å;
        FOR i:=0 TO 44 DO
                workoutÆiÅ := intoutÆiÅ;
        FOR i:=0 TO 11 DO
                workoutÆi + 44Å := ptsoutÆiÅ;
END;

(****************************************************************)
(** close virtual workstation **)

FUNCTION v_clsvwk (handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        v_clsvwk := gemvdif(101,handle);
END;

(*****************************************************************)
(** clear workstation **)

FUNCTION v_clrwk (handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        v_clrwk := gemvdif(3,handle);
END;

(******************************************************************)
(** update workstation **)

FUNCTION v_updwk ( handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        v_updwk := gemvdif(4,handle);
END;

(**************************************************************************)
(** Load extra fonts into memory - caller must free up some memory space **)

FUNCTION vst_load_fonts(handle, select : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := select;
        vst_load_fonts := gemvdif(119,handle);
END;

(********************************************************************)
(** Unload those extra fonts **)

FUNCTION vst_unload_fonts(handle, select : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := select;
        vst_unload_fonts := gemvdif(120,handle);
END;

(**************************************************************************)
(** set clipping rectangle **)

FUNCTION vs_clip (handle : INTEGER;
                  clipflag : INTEGER;
                  pxyarray : ARRAY_4) : INTEGER;

VAR
        i:      INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 1;
        intinÆ0Å := clipflag;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        vs_clip := gemvdif(129,handle);
END;

        (************************)
        (**  OUTPUT FUNCTIONS  **)
(***************************************************************)
(** polyline **)

FUNCTION v_pline (handle, count : INTEGER;
                  pxyarray : ptsin_ARRAY) : INTEGER;

VAR
        i, n :  INTEGER;
BEGIN
        contrlÆ1Å := count;       (* number of vertices to follow *)
        contrlÆ3Å := 0;
        n := count * 2 - 1;               (* twice as many numbers as there are coords *)
        FOR i:=0 TO n DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        v_pline := gemvdif(6,handle);
END;

(****************************************************************)
(** polymarker **)

FUNCTION v_pmarker (handle, count : INTEGER;
                        pxyarray : ptsin_ARRAY) : INTEGER;

VAR
        i, n :  INTEGER;
BEGIN
        contrlÆ1Å := count;       (* number of markers *)
        contrlÆ3Å := 0;
        n := count * 2 - 1;
        FOR i:=0 TO n DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        v_pmarker := gemvdif(7,handle);
END;

(**************************************************************)
(** text **)

FUNCTION v_gtext (handle, x, y : INTEGER;
                  chstring : CharString) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := LEN(chstring);
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        FOR i:=1 TO LEN(chstring) DO
                intinÆi- 1Å := ORD(chstringÆiÅ);
        intinÆLEN(chstring)Å := 0;
        v_gtext := gemvdif(8,handle);
END;

(***************************************************************)
(** filled area **)

FUNCTION  v_fillarea(handle, count : INTEGER;
                        pxyarray : ptsin_ARRAY) : INTEGER;

VAR
        i, n  : INTEGER;
BEGIN
        contrlÆ1Å := count;
        contrlÆ3Å := 0;
        n := count * 2 - 1;
        FOR i:=0 TO n DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        v_fillarea := gemvdif(9,handle);
END;

(**************************************************************)
(** cell array **)

FUNCTION v_cellarray (handle : INTEGER;
pxyarray : ARRAY_4;
                rowlength, elused, numrows, wrtmode : INTEGER;
                        colorlen : INTEGER;
colarray : intin_ARRAY) : INTEGER;

VAR 
        i, j :  INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := colorlen;
        contrlÆ7Å := rowlength;
        contrlÆ8Å := elused;
        contrlÆ9Å := numrows;
        contrlÆ10Å := wrtmode;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        j := colorlen - 1 ;
        FOR i:=0 TO j DO
                intinÆiÅ := colarrayÆiÅ;
        v_cellarray := gemvdif(10,handle);
END;

(***************************************************************)
(** contour fill **)

FUNCTION v_contour (handle, x, y, index : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 1;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        intinÆ0Å := index;
        v_contour := gemvdif(103,handle);
END;

(***********************************************************)
(** fill rectangle **)

FUNCTION vr_recfl(handle : INTEGER;
                  pxyarray : ARRAY_4) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        vr_recfl := gemvdif(114,handle);
END;

                (*****************)
                (**   GDP 's    **)
(****************************************************************)
(** gdp - bar **)

FUNCTION v_bar (handle : INTEGER;
                                pxyarray : ARRAY_4) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        contrlÆ5Å := 1;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        v_bar := gemvdif(11,handle);
END;

(****************************************************************)
(** GDP - arc **)

FUNCTION v_arc (handle, x, y, radius, begang, endang : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 4;
        contrlÆ3Å := 2;
        contrlÆ5Å := 3;
        intinÆ0Å := begang;
        intinÆ1Å := endang;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ6Å := radius;
        v_arc := gemvdif(11,handle);
END;

(********************************************************************)
(** GDP - pieslice **)

FUNCTION v_pieslice (handle, x, y, radius, begang, endang : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 4;
        contrlÆ3Å := 2;
        contrlÆ5Å := 3;
        intinÆ0Å := begang;
        intinÆ1Å := endang;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ6Å := radius;
        v_pieslice := gemvdif(11,handle);
END;

(**********************************************************************)
(** GDP - circle **)

FUNCTION v_circle (handle, x, y, radius : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 3;
        contrlÆ3Å := 0;
        contrlÆ5Å := 4;
        contrlÆ6Å := handle;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ4Å := radius;
        v_circle := gemvdif(11,handle);
END;

(********************************************************************)
(** GDP - elliptical arc **)

FUNCTION v_ellarc (handle, x, y, xradius, yradius, 
                   begang, endang : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 2;
        contrlÆ5Å := 6;
        intinÆ0Å := begang;
        intinÆ1Å := endang;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ2Å := xradius;
        ptsinÆ3Å := yradius;
        v_ellarc := gemvdif(11,handle);
END;

(*****************************************************************)
(** GDP - elliptical pie **)

FUNCTION v_ellpie (handle, x, y, xradius, yradius, 
                                        begang, endang : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 2;
        contrlÆ5Å := 7;
        intinÆ0Å := begang;
        intinÆ1Å := endang;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ2Å := xradius;
        ptsinÆ3Å := yradius;
        v_ellpie := gemvdif(11,handle);
END;

(*****************************************************************)
(** GDP - Ellipse **)

FUNCTION v_ellipse (handle, x, y, xradius, yradius : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        contrlÆ5Å := 5;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ2Å := xradius;
        ptsinÆ3Å := yradius;
        v_ellipse := gemvdif(11,handle);
END;

(****************************************************************)
(** GDP rounded rectangle **)

FUNCTION v_rbox (handle : INTEGER;
                 xyarray : ARRAY_4) : INTEGER;

VAR 
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        contrlÆ5Å := 8;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := xyarrayÆiÅ;
        v_rbox := gemvdif(11,handle);
END;

(****************************************************************)
(** GDP Filled rounded rectangle **)

FUNCTION v_rfbox (handle : INTEGER;
                        xyarray : ARRAY_4) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        contrlÆ5Å := 9;
        FOR i:=0 TO 3 DO
                ptsinÆiÅ := xyarrayÆiÅ;
        v_rfbox := gemvdif(11,handle);
END;

(**************************************************************)
(**  Justified graphics text **)

FUNCTION v_justified(handle, x, y, jlength : INTEGER;
                     gstring : CharString;
                     wordspace, charspace : INTEGER) : INTEGER;

VAR
        i:      INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := LEN(gstring) + 2;
        FOR i:=1 TO LEN(gstring) DO
                intinÆi+1Å := ORD(gstringÆiÅ);
        intinÆLEN(gstring)Å := 0;
        intinÆ0Å := wordspace;
        intinÆ1Å := charspace;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        ptsinÆ2Å := jlength;
        v_justified := gemvdif(10,handle);
END;

                (*******************************)
                (*** SET ATTRIBUTE FUNCTIONS ***)
(**********************************************************)
(** general set routine, called by many procedures below **)

FUNCTION genset(opcode, handle, param : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := param;
        genset := gemvdif(opcode,handle);         (* return value suggested *)
END;

(***************************************************************)
(** set writing mode **)

FUNCTION vswr_mode (handle, mode : INTEGER) : INTEGER;
BEGIN
        vswr_mode := genset(32,handle,mode);
END;

(**************************************************************)
(** set color representation **)

FUNCTION vs_color (handle, index : INTEGER;
                         rgbin : ARRAY_3) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 4;
        intinÆ0Å := index;
        intinÆ1Å := rgbinÆ0Å;
        intinÆ2Å := rgbinÆ1Å;
        intinÆ3Å := rgbinÆ2Å;
        vs_color := gemvdif(14,handle);
END;


(***********************************************************)
(** set polyline line type **)

FUNCTION vsl_type ( handle, style : INTEGER) : INTEGER;
BEGIN
        vsl_type := genset(15,handle,style);
END;

(***********************************************************)
(** set user defined line style pattern **)

FUNCTION vsl_udsty (handle, pattern : INTEGER) : INTEGER;
BEGIN
        vsl_udsty := genset(113,handle,pattern);
END;

(**********************************************************)
(** set polyline linewidth **)

FUNCTION vsl_width (handle, width : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        ptsinÆ0Å := width;
        ptsinÆ1Å := 0;
        vsl_width := gemvdif(16,handle);
        vsl_width := ptsoutÆ0Å;
END;

(***********************************************************)
(** set polyline color index **)

FUNCTION vsl_color (handle, colindex : INTEGER) : INTEGER;
BEGIN
        vsl_color := genset(17,handle,colindex);
END;

(*************************************************************)
(** set polyline end style **)

FUNCTION vsl_ends (handle, begstyle, endstyle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 2;
        intinÆ0Å := begstyle;
        intinÆ1Å := endstyle;
        vsl_ends := gemvdif(108,handle);
END;

(**************************************************************)
(** set polymarker type **)

FUNCTION vsm_type (handle, symbol : INTEGER) : INTEGER;
BEGIN
        vsm_type := genset(18,handle,symbol);
END;

(***************************************************************)
(** set polymarker height **)

FUNCTION vsm_height (handle, height : INTEGER) : INTEGER;
BEGIN
        contrlÆ0Å := 19;
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        contrlÆ6Å := handle;
        ptsinÆ0Å := 0;
        ptsinÆ1Å := height;
        vsm_height := gemvdif(19,handle);
        vsm_height := ptsoutÆ1Å;
END;

(*************************************************************)
(** set polymarker color index **)

FUNCTION vsm_color (handle, colindex : INTEGER) : INTEGER;
BEGIN
        vsm_color := genset(20,handle,colindex);
END;

(***************************************************************)
(** set character height, absolute mode **)

FUNCTION vst_height (handle, height : INTEGER;

VAR     charwidth, charheight, 
                        cellwidth, cellheight : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        ptsinÆ0Å := 0;
        ptsinÆ1Å := height;
        vst_height := gemvdif(12,handle);
        charwidth := ptsoutÆ0Å;
        charheight := ptsoutÆ1Å;
        cellwidth := ptsoutÆ2Å;
        cellheight := ptsoutÆ3Å;
END;

(**********************************************************************)
(** set character cell height, points mode **)

FUNCTION vst_point (handle, point : INTEGER;

VAR     charwidth, charheight, 
                        cellwidth, cellheight : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := point;
        vst_point := gemvdif(107,handle);
        charwidth := ptsoutÆ0Å;
        charheight := ptsoutÆ1Å;
        cellwidth := ptsoutÆ2Å;
        cellheight := ptsoutÆ3Å;
END;

(*********************************************************************)
(** set text character baseline vector - rotation **)

FUNCTION vst_rotation (handle, angle : INTEGER) : INTEGER;
BEGIN
        vst_rotation := genset(13,handle,angle);
END;

(******************************************************************)
(** set text font **)

FUNCTION vst_font (handle, font : INTEGER) : INTEGER;
BEGIN
        vst_font := genset(21,handle,font);
END;

(******************************************************************)
(** set text color **)

FUNCTION vst_color (handle, colindex : INTEGER) : INTEGER;
BEGIN
        vst_color := genset(22,handle,colindex);
END;

(*****************************************************************)
(** set text special effects **)

FUNCTION vst_effects (handle, effects : INTEGER) : INTEGER;
BEGIN
        vst_effects := genset(106,handle,effects);
END;

(****************************************************************)
(** set graphics text alignment **)

FUNCTION vst_alignment (handle, horin, vertin : INTEGER;
                        VAR horout, vertout : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 2;
        intinÆ0Å := horin;
        intinÆ1Å := vertin;
        vst_alignment := gemvdif(39,handle);
        horout := intoutÆ0Å;
        vertout := intoutÆ1Å;
END;


(*****************************************************************)
(** set fill interior style **)

FUNCTION vsf_interior (handle, style : INTEGER) : INTEGER;
BEGIN
        vsf_interior := genset(23,handle,style);
END;

(****************************************************************)
(** set fill style index **)

FUNCTION vsf_style (handle, styleindex : INTEGER) : INTEGER;
BEGIN
        vsf_style := genset(24,handle,styleindex);
END;

(***************************************************************)
(** set fill color index **)

FUNCTION vsf_color ( handle, colorindex : INTEGER) : INTEGER;
BEGIN
        vsf_color := genset(25,handle,colorindex);
END;

(****************************************************************)
(** set fill perimeter visibility **)

FUNCTION vsf_perimeter (handle, pervis : INTEGER) : INTEGER;
BEGIN
        vsf_perimeter := genset(104,handle,pervis);
END;

(********************************************************************)
(** Exchange fill pattern **)

FUNCTION vsf_udpat (handle : INTEGER;
pfillpat, poldfpat : gempoint) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ7Å := pfillpat.hi;
        contrlÆ8Å := pfillpat.lo;
        contrlÆ9Å := poldfpat.hi;
        contrlÆ10Å := poldfpat.lo;
        vsf_udpat := gemvdif(112,handle);
END;


                    (***********************)
                    (***** RASTOR OPS ******)
(****************************************************************)
(** Copy rastor , Opaque **)

FUNCTION vro_cpyfm (handle, wrmode : INTEGER;
                        pxyarray : ARRAY_8;
                        psrcMFDB, pdesMFDB : MFDB) : INTEGER;

VAR
        i :     INTEGER;
        gtemp1, gtemp2 : gempoint;
        sm, dm : MFDB;
BEGIN
        contrlÆ1Å := 4;
        contrlÆ3Å := 1;
        (* ensure MFDB is local to get right segment address *)
        sm := psrcMFDB;   
        gtemp1.gp := ADDR(sm);            (* long address *)
        contrlÆ7Å := gtemp1.hi;           (* offset of MFDB *)
        contrlÆ8Å := gtemp1.lo;           (* segemnt of MFDB *)
        dm := pdesMFDB;
        gtemp2.gp := ADDR(dm);
        contrlÆ9Å := gtemp2.hi;
        contrlÆ10Å := gtemp2.lo;
        intinÆ0Å := wrmode;               (* logic operation write mode *)
        FOR i:=0 TO 7 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        vro_cpyfm := gemvdif(109,handle);
END;

(****************************************************************)
(** Copy rastor , Transparent **)

FUNCTION vrt_cpyfm (handle, wrmode : INTEGER;
                    pxyarray : ARRAY_8;
                    psrcMFDB, pdesMFDB : MFDB;
                    color1, color0 : INTEGER) : INTEGER;

VAR     i :     INTEGER;
        gemp1, gemp2 : gempoint;
        sm, dm : MFDB;
BEGIN
        contrlÆ1Å := 4;
        contrlÆ3Å := 3;
        sm := psrcMFDB;                   (* local MFDB *)
        gemp1.gp := ADDR(sm);
        contrlÆ7Å := gemp1.hi;            (* hi order word of address ptr *)
        contrlÆ8Å := gemp1.lo;            (* lo order word *)
        dm := pdesMFDB;
        gemp2.gp := ADDR(dm);
        contrlÆ9Å := gemp2.hi;
        contrlÆ10Å := gemp2.lo;
        intinÆ0Å := wrmode;               (* logic operation write mode *)
        intinÆ1Å := color1;
        intinÆ2Å := color0;
        FOR i:=0 TO 7 DO
                ptsinÆiÅ := pxyarrayÆiÅ;
        vrt_cpyfm := gemvdif(121,handle);
END;

(*************************************************************)
(** Transform Form **)

FUNCTION vr_trn_fm (handle : INTEGER;
                    psrcMFDB, pdesMFDB : MFDB) : INTEGER;

VAR 
        gemp1, gemp2 : gempoint;
        sm, dm : MFDB;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        sm := psrcMFDB;
        gemp1.gp := ADDR(sm);
        contrlÆ7Å := gemp1.hi;
        contrlÆ8Å := gemp1.lo;
        dm := pdesMFDB;
        gemp2.gp := ADDR(dm);
        contrlÆ9Å := gemp2.hi;
        contrlÆ10Å := gemp2.lo;
        vr_trn_fm := gemvdif(110,handle);
END;

                   (*************************)
                   (**** INPUT FUNCTIONS ****)
(*********************************************************************)
(** Set Input Mode **)

FUNCTION vsin_mode (handle, devtype, mode : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 2;
        intinÆ0Å := devtype;
        intinÆ1Å := mode;
        vsin_mode := gemvdif(33,handle);
        vsin_mode := intoutÆ0Å;
END;

(************************************************************************)
(**  Input locator, request mode **)
(**********************************)

FUNCTION vrq_locator (handle, x, y : INTEGER;
                     VAR xout, yout : INTEGER;
                     VAR term :  CHAR) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        vrq_locator := gemvdif(28,handle);
        xout := ptsoutÆ0Å;
        yout := ptsoutÆ1Å;
        term := CHR(intoutÆ0Å);           (* return single byte character *)
END;

(******************************************************************)
(** Input Locator , Sample mode **)

FUNCTION vsm_locator (handle, x, y : INTEGER;
                VAR xout, yout, term, coorchg, keypress : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        vsm_locator := gemvdif(28,handle);
        xout := ptsoutÆ0Å;
        yout := ptsoutÆ1Å;
        term := intoutÆ0Å;
        coorchg := contrlÆ2Å;
        keypress := contrlÆ4Å;
END;

(********************************************************************)
(**  Input Valuator, Request Mode **)

FUNCTION vrq_valuator (handle, valin : INTEGER;
                       VAR valout : INTEGER;
                       VAR term :  CHAR) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := valin;
        vrq_valuator := gemvdif(29,handle);
        valout := intoutÆ0Å;
        term := CHR(intoutÆ1Å);
END;

(*******************************************************************)
(** Input Valuator, Sample Mode **)    (* check this !!!*)

FUNCTION vsm_valuator (handle, valin : INTEGER;
                       VAR valout : INTEGER;
                       VAR     term :  CHAR;
                       VAR     status : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := valin;
        vsm_valuator := gemvdif(29,handle);
        valout := intoutÆ0Å;
        status := contrlÆ4Å;
        term := CHR(intoutÆ1Å);
END;

(*****************************************************************)
(** Input Choice, request Mode **)

FUNCTION vrq_choice (handle: INTEGER;
                     VAR     choice : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := choice;
        vrq_choice := gemvdif(30,handle);
        choice := intoutÆ0Å;
END;

(*******************************************************************)
(** Input Choice, Sample Mode **)

FUNCTION vsm_choice (handle : INTEGER;
                        VAR choice, status : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vsm_choice := gemvdif(30,handle);
        choice := intoutÆ0Å;
        status := contrlÆ4Å;
END;

(******************************************************************)
(** Input String, Request Mode **)

FUNCTION vrq_string (handle, maxlen, echomode, 
                     echox, echoy : INTEGER;
                     VAR     instring : CharString) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 2;
        intinÆ0Å := 0-maxlen;             (* force standard keyboard input *)
        intinÆ1Å := echomode;
        ptsinÆ0Å := echox;
        ptsinÆ1Å := echoy;
        vrq_string := gemvdif(31,handle);
        instring := '';                           (* null string *)
        FOR i:=1 TO contrlÆ4Å DO
                instring := CONCAT(instring,CHR(intoutÆi-1Å));
                                        (* into string char form *)
END;

(****************************************************************)
(** Input String, Sample Mode **)

FUNCTION vsm_string (handle, maxlen, echomode,
                    echox, echoy : INTEGER;
                    VAR     instring : CharString;
                        VAR status : INTEGER) : INTEGER;

VAR
        I :     INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 2;
        intinÆ0Å := 0-maxlen;             (* force standard keyboard input  *)
        intinÆ1Å := echomode;
        ptsinÆ0Å := echox;
        ptsinÆ1Å := echoy;
        vsm_string := gemvdif(31,handle);
        instring := '';                           (* null string *)
        FOR i:=1 TO contrlÆ4Å DO
                instring := CONCAT(instring,CHR(intoutÆi-1Å));
                                        (* into string char form *)
        status := contrlÆ4Å;
END;

(*******************************************************************)
(** Set Moose Form **)

FUNCTION vsc_form (handle : INTEGER;
                         pcurform : ARRAY_37) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 37;
        FOR i:=0 TO 36 DO
                intinÆiÅ := pcurformÆiÅ;
        vsc_form := gemvdif(111,handle);
END;


(********************************************************************)
(** Exchange Mouse Movement Vector **)

FUNCTION vex_motv (handle : INTEGER;
                   pusrcode : gempoint;
                   VAR psavcode : gempoint) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ7Å := pusrcode.hi;         (* check this !!*)
        contrlÆ8Å := pusrcode.lo;
        vex_motv := gemvdif(126,handle);
        psavcode.hi := contrlÆ9Å;
        psavcode.lo := contrlÆ10Å;
END;

(****************************************************************)
(*** show graphic cursor ****)

FUNCTION v_show_c (handle, reset : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := reset;
        v_show_c := gemvdif(122,handle);
END;

(*******************************************************)
(** hide graphic cursor **)

FUNCTION v_hide_c (handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        v_hide_c := gemvdif(123,handle);
END;

(********************************************************************)
(** Exchange Button Change Vector **)

FUNCTION vex_butv (handle : INTEGER;
                        pusrcode : gempoint;
                        VAR psavcode : gempoint) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ7Å := pusrcode.hi;         (* CHECK THIS *)
        contrlÆ8Å := pusrcode.lo;
        vex_butv := gemvdif(125,handle);
        psavcode.hi := contrlÆ8Å;
        psavcode.lo := contrlÆ9Å;
END;

(**********************************************************************)
(** Exchange Cursor Change  Vector **)

FUNCTION vex_curv (handle : INTEGER;
                        pusrcode : gempoint;
                        VAR psavcode : gempoint) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ7Å := pusrcode.hi;         (* CHECK THIS *)
        contrlÆ8Å := pusrcode.lo;
        vex_curv := gemvdif(127,handle);
        psavcode.hi := contrlÆ8Å;
        psavcode.lo := contrlÆ9Å;
END;

(***********************************************************************)
(** Sample Keyboard State Information **)

FUNCTION vq_key_s (handle : INTEGER;
                  VAR     pstatus : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vq_key_s := gemvdif(128,handle);
        pstatus := intoutÆ0Å;
END;

(********************************************************************)
(** Sample Mouse Button State **)

FUNCTION vq_mouse (handle : INTEGER;
                   VAR pstatus, x, y : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vq_mouse := gemvdif(124,handle);
        pstatus := intoutÆ0Å;
        x := ptsoutÆ0Å;
        y := ptsoutÆ1Å;
END;

(********************************************************************)
(** Exchange Timer Interrupt Vector **)

FUNCTION vex_timv (handle : INTEGER;
                  timaddr : gempoint;
                  VAR otimaddr : gempoint;
                  VAR     timconv : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ7Å := timaddr.hi;                  (* CHECK THIS *)
        contrlÆ8Å := timaddr.lo;
        vex_timv := gemvdif(118,handle);
        otimaddr.hi := contrlÆ9Å;
        otimaddr.lo := contrlÆ10Å;
        timconv := intoutÆ0Å;
END;

(*********************************************************************)


                (**** INQUIRE FUNCTIONS *******)
(**********************************************************************)
(** Extended Inquire Function **)

FUNCTION vq_extend (handle, owflag : INTEGER;
                   VAR workout : ARRAY_57) : INTEGER;

VAR
        i:      INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := owflag;
        vq_extend := gemvdif(102,handle);
        FOR i:=0 TO 44 DO
                workoutÆiÅ := intoutÆiÅ;
        FOR i:=45 TO 56 DO
                workoutÆiÅ := ptsoutÆi-45Å;
END;

(*********************************************************************)
(** Inquire color representation **)

FUNCTION vq_color (handle, colorindex, setflag : INTEGER;
                   VAR rgb : ARRAY_3) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 2;
        intinÆ0Å := colorindex;
        intinÆ1Å := setflag;
        vq_color := gemvdif(26,handle);
        FOR i:=0 TO 2 DO
                rgbÆiÅ := intoutÆiÅ;
END;

(********************************************************)
(** Inquire polyline attributes *)

FUNCTION vql_attributes (handle :INTEGER;
                        VAR attrib : ARRAY_4) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vql_attributes := gemvdif(35,handle);
        FOR i:=0 TO 2 DO
                attribÆiÅ := intoutÆiÅ;
        attribÆ3Å := ptsoutÆ0Å;
END;

(*********************************************************)
(** Inquire polymarker attributes **)

FUNCTION vqm_attributes (handle :INTEGER;
                        VAR attrib : ARRAY_4) : INTEGER;

VAR
        I :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vqm_attributes := gemvdif(36,handle);
        FOR i:= 0 TO 2 DO
                attribÆiÅ := intoutÆiÅ;
        attribÆ3Å := ptsoutÆ0Å;
END;

(***********************************************************)
(** Inquire fill area attributes **)

FUNCTION vqf_attributes (handle :INTEGER;
                        VAR attrib : ARRAY_4) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vqf_attributes := gemvdif(37,handle);
        FOR i:=0 TO 3 DO
                attribÆiÅ := intoutÆiÅ;
                (* what about fill perim status **)
END;

(******************************************************************)
(** Inquire current Graphic text attributes **)

FUNCTION vqt_attributes (handle :INTEGER;
                        VAR attrib : ARRAY_10) : INTEGER;

VAR
        i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vqt_attributes := gemvdif(38,handle);
        FOR i:=0 TO 5 DO
                attribÆiÅ := intoutÆiÅ;
        FOR i:=6 TO 9 DO
                attribÆiÅ := ptsoutÆi-6Å;
END;

(*******************************************************************)
(** Inquire Text Extent **)

FUNCTION vqt_extent (handle : INTEGER;
                     chstring: CharString;
                     VAR extent : ARRAY_8) : INTEGER;

VAR     I :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := LEN(chstring);
        FOR i:=1 TO LEN(chstring) DO intinÆi-1Å := ORD(chstringÆiÅ);
        intinÆLEN(chstring)Å := 0;
        vqt_extent := gemvdif(116,handle);
        FOR i:=0 TO 7 DO extentÆiÅ := ptsoutÆiÅ;
END;

(**********************************************************************)
(** Inquire character cell width **)

FUNCTION vqt_width (handle : INTEGER;
                   character : CHAR;
                   VAR cellwidth, leftdelta, rightdelta : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := ORD(character);
        vqt_width := gemvdif(117,handle);
        cellwidth := ptsoutÆ0Å;
        leftdelta := ptsoutÆ2Å;
        rightdelta := ptsoutÆ4Å;
END;

(********************************************************************)
(*** Inquire font name and index **)

FUNCTION vqt_name (handle, elementnum : INTEGER;
                   VAR name : CharString) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        intinÆ0Å := elementnum;
        vqt_name := gemvdif(130,handle);
        name := '';                       (* initialize string to null *)
        FOR i:=1 TO 32 DO
                name := CONCAT(name,CHR(intoutÆiÅ));
END;

(**********************************************************************)
(** Inquire Cell Array **)

FUNCTION vq_cellarray (handle : INTEGER;
                      pxyarray : ARRAY_4;
                      rowlen, numrows : INTEGER;
                      VAR elused, rowsused, status : INTEGER;
                      VAR     colarray : intout_ARRAY) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ7Å := rowlen;
        contrlÆ8Å := numrows;
        FOR i:=0 TO 3 DO ptsinÆiÅ := pxyarrayÆiÅ;
        vq_cellarray := gemvdif(27,handle);
        elused := contrlÆ9Å;
        rowsused := contrlÆ10Å;
        status := contrlÆ11Å;
        FOR i:=0 TO intout_max DO colarrayÆiÅ := intoutÆiÅ;
END;

(**********************************************************************)
(** Inquire Input Mode **)

FUNCTION vqn_mode (handle :INTEGER;
                  VAR     inputmode : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        vqn_mode := gemvdif(115,handle);
        inputmode := intoutÆ0Å;
END;



(********************************************************************)
(** Inquire Current Font Information **)

FUNCTION vqt_fontinfo (handle : INTEGER;
                       VAR minADE, maxADE : INTEGER;
                       VAR distances : ARRAY_4;
                       VAR maxwidth : INTEGER;
                       effects : ARRAY_3) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        vqt_fontinfo := gemvdif(131,handle);
        minADE := intoutÆ0Å;
        maxADE := intoutÆ1Å;
        distancesÆ0Å := ptsoutÆ1Å;
        distancesÆ1Å := ptsoutÆ3Å;
        distancesÆ2Å := ptsoutÆ5Å;
        distancesÆ3Å := ptsoutÆ7Å;
        maxwidth := ptsoutÆ0Å;
        effectsÆ0Å := ptsoutÆ2Å;
        effectsÆ1Å := ptsoutÆ4Å;
        effectsÆ2Å := ptsoutÆ6Å;
END;

                (*********************)
                (******  ESCAPES *****)
(********************************************************************)
(** escape : inquire addressable alpha char cells **)

FUNCTION vq_chcells (handle : INTEGER;
                    VAR     rows, columns : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := 1;
        vq_chcells := gemvdif(5,handle);
        rows := intoutÆ0Å;
        columns := intoutÆ1Å;
END;

(************************************************************)
(*** general escape routine..called by many of those below **)

FUNCTION genescape (fid, handle : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := fid;         (* function id *)
        genescape := gemvdif(5,handle);
END;

(**************************************************************)

FUNCTION v_exit_cur (handle : INTEGER) : INTEGER;
BEGIN
        v_exit_cur := genescape(2,handle);
END;

FUNCTION v_enter_cur (handle : INTEGER) : INTEGER;
BEGIN
        v_enter_cur := genescape(3,handle);
END;

FUNCTION v_curup (handle : INTEGER) : INTEGER;
BEGIN
        v_curup := genescape(4,handle);
END;

FUNCTION v_curdown (handle : INTEGER) : INTEGER;
BEGIN
        v_curdown := genescape(5,handle);
END;

FUNCTION v_curright (handle : INTEGER) : INTEGER;
BEGIN
        v_curright := genescape(6,handle);
END;

FUNCTION v_curleft (handle : INTEGER) : INTEGER;
BEGIN
        v_curleft := genescape(7,handle);
END;

FUNCTION v_curhome (handle : INTEGER) : INTEGER;
BEGIN
        v_curhome := genescape(8,handle);
END;

FUNCTION v_eeos (handle : INTEGER) : INTEGER;
BEGIN
        v_eeos := genescape(9,handle);
END;

FUNCTION v_eeol (handle : INTEGER) : INTEGER;
BEGIN
        v_eeol := genescape(10,handle);
END;

(*******************************************************************)
(** direct alpha cursor address **)

FUNCTION vs_curaddress (handle, row, column : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 2;
        contrlÆ5Å := 11;
        intinÆ0Å := row;
        intinÆ1Å := column;
        vs_curaddress := gemvdif(5,handle);
END;

(**************************************************************)
(** output cursor addressable text **)

FUNCTION v_curtext (handle : INTEGER;
                   chstring : CharString) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := LEN(chstring);
        contrlÆ5Å := 12;
        FOR i:=1 TO LEN(chstring) DO intinÆi- 1Å := ORD(chstringÆiÅ);
        intinÆLEN(chstring)Å := 0;
        v_curtext := gemvdif(5,handle);
END;

(**************************************************************)

FUNCTION v_rvon (handle : INTEGER) : INTEGER;
BEGIN
        v_rvon := genescape(13,handle);
END;

FUNCTION v_rvoff (handle : INTEGER) : INTEGER;
BEGIN
        v_rvoff := genescape(14,handle);
END;

(***************************************************************)
(** inquire current alpha cursor address **)

FUNCTION vq_curaddress (handle : INTEGER;
                        VAR     row, column : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := 15;
        vq_curaddress := gemvdif(5,handle);
        row := intoutÆ0Å;
        column := intoutÆ1Å;
END;

(**************************************************************)
(** inquire tablet status **)

FUNCTION vq_tabstatus (handle : INTEGER;
                      VAR     status : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := 16;
        vq_tabstatus := gemvdif(5,handle);
        status := intoutÆ0Å;
END;

(***************************************************************)
(** Hard Copy **)

FUNCTION v_hardcopy (handle : INTEGER) : INTEGER;
BEGIN
        v_hardcopy := genescape(17,handle);
END;

(******************************************************************)
(** place a graphic cursor at the specifeid location **)

FUNCTION v_dspcur (handle, x, y : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 1;
        contrlÆ3Å := 0;
        contrlÆ5Å := 18;
        ptsinÆ0Å := x;
        ptsinÆ1Å := y;
        v_dspcur := gemvdif(5,handle);
END;

(**************************************************************)

FUNCTION v_rmcur (handle : INTEGER) : INTEGER;
BEGIN
        v_rmcur := genescape(19,handle);
END;

(**************************************************************)
(***    Form advance **)

FUNCTION v_form_adv(handle : INTEGER) : INTEGER;
BEGIN
        v_form_adv := genescape(20,handle);
END;

(**************************************************************)
(** Output Window **)

FUNCTION v_output_window(handle : INTEGER;
                         xyarray : ARRAY_4) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 2;
        contrlÆ3Å := 0;
        contrlÆ5Å := 21;
        FOR i:=0 TO 3 DO ptsinÆiÅ := xyarrayÆiÅ;
        v_output_window := gemvdif(5,handle);
END;

(***************************************************************)
(** Clear display list **)

FUNCTION v_clear_display_list (handle : INTEGER) : INTEGER;
BEGIN
        v_clear_display_list := genescape(22,handle);
END;


(**************************************************************)
(** selection of IBM color palette 0 = red,green,yelllow 1=cyan,blue,magenta *)

FUNCTION vs_palette(handle, palette : INTEGER) : INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 1;
        contrlÆ5Å := 60;
        intinÆ0Å := palette;
        vs_palette := gemvdif(5,handle);
END;

(**************************************************************)
(** Inquire Palette Film Types **)

FUNCTION vqp_films(handle : INTEGER;
                   VAR     filmnames : CharString) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := 91;
        vqp_films := gemvdif(5,handle);
        filmnames := '';
        FOR i:=0 TO 127 DO filmnames := CONCAT(filmnames,CHR(intoutÆiÅ));
END;

(**************************************************************)
(** Inquire Palette Driver State **)

FUNCTION vqp_state (handle : INTEGER;
                    VAR port, filmname, lightness, interlace, planes : INTEGER;
                    VAR indexes : ARRAY_16) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 0;
        contrlÆ5Å := 92;
        vqp_state := gemvdif(5,handle);
        port := intoutÆ0Å;
        filmname := intoutÆ1Å;
        lightness := intoutÆ2Å;
        interlace := intoutÆ3Å;
        planes := intoutÆ4Å;
        FOR i:=0 TO 15 DO indexesÆiÅ := intoutÆi+5Å;
END;

(*****************************************************************)
(** Set Palette Driver State **)

FUNCTION vsp_state (handle : INTEGER;
                    port, filmname, lightness, interlace, planes : INTEGER;
                    indexes : ARRAY_16) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := 20;
        contrlÆ5Å := 93;
        contrlÆ6Å := 93;
        intinÆ0Å := port;
        intinÆ1Å := filmname;
        intinÆ2Å := lightness;
        intinÆ3Å := interlace;
        intinÆ4Å := planes;
        FOR i:=0 TO 15 DO intinÆi+4Å := indexesÆiÅ;               (* CHECK *)
        vsp_state := gemvdif(5,handle);
END;

(*************************************************************)
(** Save Palette Driver State **)

FUNCTION vsp_save (handle : INTEGER) : INTEGER;
BEGIN
        vsp_save := genescape(94, handle);
END;

(**************************************************************)
(** suppress polaroid palette messages **)

FUNCTION vsp_message (handle : INTEGER) : INTEGER;
BEGIN
        vsp_message := genescape(95,handle);
END;

(**************************************************************)
(** Palette Error Inquiries **)

FUNCTION vqp_error (handle : INTEGER) : INTEGER;
BEGIN
        vqp_error := genescape(96,handle);
END;

(*******************************************************************)
(*** write gsx metafile ***)

FUNCTION v_write_meta (handle, numintin : INTEGER;
                       intin : intin_ARRAY;
                       numptsin : INTEGER;
                       ptsin : ptsin_ARRAY) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := numptsin;
        contrlÆ3Å := numintin;
        contrlÆ5Å := 99;
        contrlÆ6Å := handle;
        v_write_meta := gemvdif(5,handle);        (* CHECK *)
END;

(******************************************************************)
(** change gsx metafile filename from  gsxfile.gsx **)

FUNCTION vm_filename (handle : INTEGER;
                      filename : CharString) : INTEGER;

VAR     i :     INTEGER;
BEGIN
        contrlÆ1Å := 0;
        contrlÆ3Å := LEN(filename);
        contrlÆ5Å := 100;
        FOR i:=1 TO LEN(filename) DO intinÆi- 1Å := ORD(filenameÆiÅ);
        intinÆLEN(filename)Å := 0;
        vm_filename := gemvdif(5,handle);
END;

(********************************************************************)