[comp.sys.atari.st] GDOS and OSS/CCD Pascal

K538915@CZHRZU1A.BITNET.UUCP (02/02/87)

There seem to be quite a lot of people which missed my posting a few months
ago about getting OSS/CCD Personal Pascal programs to run with GDOS.
 
This is a post of a sample dummy program that shows how it should be done.
I'm working on a larger posting that will include this file and a lot of
other sample AES/VDI calls with a bit more documentation which should be
finished soon.
 
                        Simon Poole
                        K538915@CZHRZU1A.BITNET
 
-------------------Cut Here-----------------------------------------------
{*******************************************************************}
{* Sample code for starting a OSS/CCD pascal program correctly     *}
{* with resident GDOS (pulled from UniTerm code (c) Simon Poole)   *}
{* !!!!! pls use only as sample and do your own testing!!!!!!!!!!! *}
{*******************************************************************}
Program The_Correct_Way;
 
Const
{$I GEMCONST.PAS}
 
Type
{$I GEMTYPE.PAS}
    { Arrays for VDI and AES parameters/results }
    Ctrl_Parms   = Array[0..11] Of Integer;
    Int_In_Parms = Array[0..15] Of Integer;
    Int_Out_Parms = Array[0..45] Of Integer;
    Pts_In_Parms = Array[0..11] Of Integer;
    Pts_Out_Parms = Array[0..11] Of Integer;
 
 
Var
    Control : Ctrl_Parms;
    Int_In : Int_In_Parms;
    Int_Out : Int_Out_Parms;
    Pts_In : Pts_In_Parms;
    Pts_Out : Pts_Out_Parms;
 
    Graf_Handle : Integer;
 
{$I GEMSUBS.PAS}
 
    {**************************************************************}
    {*                                                            *}
    {*  CCD/OSS Pascal    VDI trap handler                        *}
    {*                                                            *}
    {**************************************************************}
    Procedure VDI_Call(Cmd, SubCmd : Integer; N_Ints, N_Pts : Integer;
                       Var Control : Ctrl_Parms;
                       Var Int_In : Int_In_Parms;
                       Var Int_Out : Int_Out_Parms;
                       Var Pts_In : Pts_In_Parms;
                       Var Pts_Out : Pts_Out_Parms;
                       Translate : boolean);
    External;
 
    {**************************************************************}
    {*                                                            *}
    {*  This procedure sets the internal device handle            *}
    {*                                                            *}
    {**************************************************************}
    Procedure G_Set_Port(Handle : Integer);
    External;
 
    {**************************************************************}
    {*                                                            *}
    {*  This function gets the internal device handle             *}
    {*                                                            *}
    {**************************************************************}
    Function Get_Port : Integer;
    External;
 
    Procedure OpenVirtualWorkStation(Var Handle,PixelX,PixelY,PixelW,PixelH,
                                       Colors : Integer);
 
       Var i : Integer;
 
 
       Begin
 
          For i := 0 To 9 Do Int_In[i] := 1;
          Int_In[10] := 2;
          VDI_Call(100,0,11,0,Control,Int_In,Int_Out,Pts_In,Pts_Out,False);
          Handle := Control[6];
          PixelX := Int_Out[0];
          PixelY := Int_Out[1];
          PixelW := Int_Out[3];
          PixelH := Int_Out[4];
          Colors := Int_Out[13];
       End;
 
 
    Procedure OpenWorkStation(Var Device : Integer);
 
       Var i : Integer;
 
       Begin
          For i := 1 To 9 Do Int_In[i] := 1;
          Int_In[0] := Device;
          Int_In[10] := 2;   {Raster coordinates}
          VDI_Call(1,0,11,0,Control,Int_In,Int_Out,Pts_In,Pts_Out,False);
          Device := Control[6];
       End;
 
 
    Procedure CloseVirtualWorkStation;
 
       Var i : Integer;
 
       Begin
          VDI_Call(101,0,0,0,Control,Int_In,Int_Out,Pts_In,Pts_Out,False);
       End;
 
 
    Procedure CloseWorkStation;
 
       Var i : Integer;
 
 
       Begin
          VDI_Call(2,0,0,0,Control,Int_In,Int_Out,Pts_In,Pts_Out,False);
       End;
 
 
    {**************************************************************}
    {*                                                            *}
    {*  Replacement for Init_Gem                                  *}
    {*                                                            *}
    {**************************************************************}
    Function InitGEM : Integer;
 
       Var Ap_Id : Integer;
 
       Begin
          Ap_Id := Init_Gem;
          If Ap_Id >= 0 Then Begin {Appl_Init worked OK}
             Graf_Handle := Graf_Hdl(Dummy,Dummy,Dummy,Dummy);
             If Get_Port = 0 Then Begin {If the internal handle is 0}
                G_Set_Port(Graf_Handle);{OSS messed it up!          }
                {The internal version failed, so do it ourselves    }
                OpenVirtualWorkStation(Graf_Handle,
                   Dummy,Dummy,Dummy,Dummy,Dummy);
                {Set the internal handle to the correct value       }
                G_Set_Port(Graf_Handle);
             End
          End
          InitGEM := Ap_Id
       End;
 
 
    {**************************************************************}
    {*                                                            *}
    {*  Replacement for Exit_Gem                                  *}
    {*                                                            *}
    {**************************************************************}
    Procedure ExitGEM;
 
       Begin
          Exit_Gem;
          {The following call should really only be used if GDOS is}
          {really there, but it doesn't seem to hurt               }
          CloseVirtualWorkstation;
       End;
 
 
Begin {Main}
   If InitGEM >= 0 Then Begin
      {Do something here}
      ExitGEM
   End
End.