|  | DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC759 "Piccoline" | 
This is an automatic "excavation" of a thematic subset of
 See our Wiki for more about RegneCentralen RC759 "Piccoline" Excavated with: AutoArchaeologist - Free & Open Source Software. | 
top - metrics - download
    Length: 49408 (0xc100)
    Types: TextFile
    Names: »VDIBND.PAS«
└─⟦4fbcde1e4⟧ Bits:30003931/GEM_Development-A.imd Disketter indleveret af Steffen Jensen (Piccolo/Piccoline)
    └─⟦this⟧ »VDIBND.PAS« 
(*****************************************************************)
(**    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;
(********************************************************************)