Răsfoiți Sursa

* initial revision

Károly Balogh 21 ani în urmă
părinte
comite
1f9eaa9149
1 a modificat fișierele cu 2844 adăugiri și 0 ștergeri
  1. 2844 0
      rtl/morphos/graphics.pas

+ 2844 - 0
rtl/morphos/graphics.pas

@@ -0,0 +1,2844 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
+
+    graphics.library interface unit for MorphOS/PowerPC
+
+    Based on work of Nils Sjoholm member of the Amiga RTL
+    development team.
+
+    MorphOS port was done on a free Pegasos II/G4 machine
+    provided by Genesi S.a.r.l. <www.genesi.lu>
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+{$PACKRECORDS 2}
+
+unit graphics;
+
+interface
+
+uses exec, hardware, utility;
+
+const
+    BITSET      = $8000;
+    BITCLR      = 0;
+
+type
+    pRectangle = ^tRectangle;
+    tRectangle = record
+        MinX,MinY       : Word;
+        MaxX,MaxY       : Word;
+    end;
+
+    pRect32 = ^tRect32;
+    tRect32 = record
+        MinX,MinY       : Longint;
+        MaxX,MaxY       : Longint;
+    end;
+
+    pPoint = ^tPoint;
+    tPoint = record
+        x,y     : Word;
+    end;
+
+    PLANEPTR = Pointer;
+
+    pBitMap = ^tBitMap;
+    tBitMap = record
+        BytesPerRow     : Word;
+        Rows            : Word;
+        Flags           : Byte;
+        Depth           : Byte;
+        pad             : Word;
+        Planes          : Array [0..7] of PLANEPTR;
+    end;
+{* flags for AllocBitMap, etc. *}
+const
+     BMB_CLEAR       = 0;
+     BMB_DISPLAYABLE = 1;
+     BMB_INTERLEAVED = 2;
+     BMB_STANDARD    = 3;
+     BMB_MINPLANES   = 4;
+
+     BMF_CLEAR       = (1 shl BMB_CLEAR);
+     BMF_DISPLAYABLE = (1 shl BMB_DISPLAYABLE);
+     BMF_INTERLEAVED = (1 shl BMB_INTERLEAVED);
+     BMF_STANDARD    = (1 shl BMB_STANDARD);
+     BMF_MINPLANES   = (1 shl BMB_MINPLANES);
+
+{* the following are for GetBitMapAttr() *}
+     BMA_HEIGHT      = 0;
+     BMA_DEPTH       = 4;
+     BMA_WIDTH       = 8;
+     BMA_FLAGS       = 12;
+
+
+{ structures used by and constructed by windowlib.a }
+{ understood by rom software }
+type
+    pClipRect = ^tClipRect;
+    tClipRect = record
+        Next    : pClipRect;    { roms used to find next ClipRect }
+        prev    : pClipRect;    { ignored by roms, used by windowlib }
+        lobs    : Pointer;      { ignored by roms, used by windowlib (LayerPtr)}
+        BitMap  : pBitMap;
+        bounds  : tRectangle;    { set up by windowlib, used by roms }
+        _p1,
+        _p2     : Pointer;    { system reserved }
+        reserved : Longint;     { system use }
+        Flags   : Longint;      { only exists in layer allocation }
+    end;
+
+    pLayer = ^tLayer;
+    tLayer = record
+        front,
+        back            : pLayer;       { ignored by roms }
+        ClipRect        : pClipRect;  { read by roms to find first cliprect }
+        rp              : Pointer;      { (RastPortPtr) ignored by roms, I hope }
+        bounds          : tRectangle;    { ignored by roms }
+        reserved        : Array [0..3] of Byte;
+        priority        : Word;        { system use only }
+        Flags           : Word;        { obscured ?, Virtual BitMap? }
+        SuperBitMap     : pBitMap;
+        SuperClipRect   : pClipRect;  { super bitmap cliprects if
+                                                VBitMap != 0}
+                                        { else damage cliprect list for refresh }
+        Window          : Pointer;      { reserved for user interface use }
+        Scroll_X,
+        Scroll_Y        : Word;
+        cr,
+        cr2,
+        crnew           : pClipRect;  { used by dedice }
+        SuperSaveClipRects : pClipRect; { preallocated cr's }
+        cliprects      : pClipRect;  { system use during refresh }
+        LayerInfo       : Pointer;      { points to head of the list }
+        Lock            : tSignalSemaphore;
+        BackFill        : pHook;
+        reserved1       : Cardinal;
+        ClipRegion      : Pointer;
+        saveClipRects   : Pointer;      { used to back out when in trouble}
+        Width,
+        Height          : smallint;
+        reserved2       : Array [0..17] of Byte;
+        { this must stay here }
+        DamageList      : Pointer;      { list of rectangles to refresh
+                                                through }
+    end;
+
+const
+
+{ internal cliprect flags }
+
+    CR_NEEDS_NO_CONCEALED_RASTERS       = 1;
+    CR_NEEDS_NO_LAYERBLIT_DAMAGE        = 2;
+
+
+{ defines for code values for getcode }
+
+    ISLESSX     = 1;
+    ISLESSY     = 2;
+    ISGRTRX     = 4;
+    ISGRTRY     = 8;
+
+
+{------ Font Styles ------------------------------------------------}
+
+    FS_NORMAL           = 0;    { normal text (no style bits set) }
+    FSB_EXTENDED        = 3;    { extended face (wider than normal) }
+    FSF_EXTENDED        = 8;
+    FSB_ITALIC          = 2;    { italic (slanted 1:2 right) }
+    FSF_ITALIC          = 4;
+    FSB_BOLD            = 1;    { bold face text (ORed w/ shifted) }
+    FSF_BOLD            = 2;
+    FSB_UNDERLINED      = 0;    { underlined (under baseline) }
+    FSF_UNDERLINED      = 1;
+
+    FSB_COLORFONT       = 6;       { this uses ColorTextFont structure }
+    FSF_COLORFONT       = $40;
+    FSB_TAGGED          = 7;       { the TextAttr is really an TTextAttr, }
+    FSF_TAGGED          = $80;
+
+
+{------ Font Flags -------------------------------------------------}
+    FPB_ROMFONT         = 0;    { font is in rom }
+    FPF_ROMFONT         = 1;
+    FPB_DISKFONT        = 1;    { font is from diskfont.library }
+    FPF_DISKFONT        = 2;
+    FPB_REVPATH         = 2;    { designed path is reversed (e.g. left) }
+    FPF_REVPATH         = 4;
+    FPB_TALLDOT         = 3;    { designed for hires non-interlaced }
+    FPF_TALLDOT         = 8;
+    FPB_WIDEDOT         = 4;    { designed for lores interlaced }
+    FPF_WIDEDOT         = 16;
+    FPB_PROPORTIONAL    = 5;    { character sizes can vary from nominal }
+    FPF_PROPORTIONAL    = 32;
+    FPB_DESIGNED        = 6;    { size is "designed", not constructed }
+    FPF_DESIGNED        = 64;
+    FPB_REMOVED         = 7;    { the font has been removed }
+    FPF_REMOVED         = 128;
+
+{***** TextAttr node, matches text attributes in RastPort *********}
+
+type
+
+    pTextAttr = ^tTextAttr;
+    tTextAttr = record
+        ta_Name : PChar;       { name of the font }
+        ta_YSize : Word;       { height of the font }
+        ta_Style : Byte;        { intrinsic font style }
+        ta_Flags : Byte;        { font preferences and flags }
+    end;
+
+    pTTextAttr = ^tTTextAttr;
+    tTTextAttr = record
+        tta_Name : PChar;       { name of the font }
+        tta_YSize : Word;       { height of the font }
+        tta_Style : Byte;        { intrinsic font style }
+        tta_Flags : Byte;        { font preferences AND flags }
+        tta_Tags  : pTagItem;     { extended attributes }
+    end;
+
+{***** Text Tags **************************************************}
+CONST
+  TA_DeviceDPI  =  (1+TAG_USER);    { Tag value is Point union: }
+                                        { Hi Longint XDPI, Lo Longint YDPI }
+
+  MAXFONTMATCHWEIGHT  =    32767;   { perfect match from WeighTAMatch }
+
+
+
+{***** TextFonts node *********************************************}
+Type
+
+    pTextFont = ^tTextFont;
+    tTextFont = record
+        tf_Message      : tMessage;      { reply message for font removal }
+                                        { font name in LN \    used in this }
+        tf_YSize        : Word;        { font height     |    order to best }
+        tf_Style        : Byte;         { font style      |    match a font }
+        tf_Flags        : Byte;         { preferences and flags /    request. }
+        tf_XSize        : Word;        { nominal font width }
+        tf_Baseline     : Word; { distance from the top of char to baseline }
+        tf_BoldSmear    : Word;        { smear to affect a bold enhancement }
+
+        tf_Accessors    : Word;        { access count }
+
+        tf_LoChar       : Byte;         { the first character described here }
+        tf_HiChar       : Byte;         { the last character described here }
+        tf_CharData     : Pointer;      { the bit character data }
+
+        tf_Modulo       : Word; { the row modulo for the strike font data }
+        tf_CharLoc      : Pointer; { ptr to location data for the strike font }
+                                        { 2 words: bit offset then size }
+        tf_CharSpace    : Pointer; { ptr to words of proportional spacing data }
+        tf_CharKern     : Pointer;      { ptr to words of kerning data }
+    end;
+
+
+{----- tfe_Flags0 (partial definition) ----------------------------}
+CONST
+ TE0B_NOREMFONT = 0;       { disallow RemFont for this font }
+ TE0F_NOREMFONT = $01;
+
+Type
+
+   pTextFontExtension = ^tTextFontExtension;
+   tTextFontExtension = record              { this structure is read-only }
+    tfe_MatchWord  : Word;                { a magic cookie for the extension }
+    tfe_Flags0     : Byte;                 { (system private flags) }
+    tfe_Flags1     : Byte;                 { (system private flags) }
+    tfe_BackPtr    : pTextFont;          { validation of compilation }
+    tfe_OrigReplyPort : pMsgPort;        { original value in tf_Extension }
+    tfe_Tags       : pTagItem;              { Text Tags for the font }
+    tfe_OFontPatchS,                       { (system private use) }
+    tfe_OFontPatchK : Pointer;             { (system private use) }
+    { this space is reserved for future expansion }
+   END;
+
+{***** ColorTextFont node *****************************************}
+{----- ctf_Flags --------------------------------------------------}
+CONST
+ CT_COLORMASK  =  $000F;  { mask to get to following color styles }
+ CT_COLORFONT  =  $0001;  { color map contains designer's colors }
+ CT_GREYFONT   =  $0002;  { color map describes even-stepped }
+                                { brightnesses from low to high }
+ CT_ANTIALIAS  =  $0004;  { zero background thru fully saturated char }
+
+ CTB_MAPCOLOR  =  0;      { map ctf_FgColor to the rp_FgPen IF it's }
+ CTF_MAPCOLOR  =  $0001;  { is a valid color within ctf_Low..ctf_High }
+
+{----- ColorFontColors --------------------------------------------}
+Type
+   pColorFontColors = ^tColorFontColors;
+   tColorFontColors = record
+    cfc_Reserved,                 { *must* be zero }
+    cfc_Count   : Word;          { number of entries in cfc_ColorTable }
+    cfc_ColorTable : Pointer;     { 4 bit per component color map packed xRGB }
+   END;
+
+{----- ColorTextFont ----------------------------------------------}
+
+   pColorTextFont = ^tColorTextFont;
+   tColorTextFont = record
+    ctf_TF      : tTextFont;
+    ctf_Flags   : Word;          { extended flags }
+    ctf_Depth,          { number of bit planes }
+    ctf_FgColor,        { color that is remapped to FgPen }
+    ctf_Low,            { lowest color represented here }
+    ctf_High,           { highest color represented here }
+    ctf_PlanePick,      { PlanePick ala Images }
+    ctf_PlaneOnOff : Byte;     { PlaneOnOff ala Images }
+    ctf_ColorFontColors : pColorFontColors; { colors for font }
+    ctf_CharData : Array[0..7] of Pointer;    {pointers to bit planes ala tf_CharData }
+   END;
+
+{***** TextExtent node ********************************************}
+
+   pTextExtent = ^tTextExtent;
+   tTextExtent = record
+    te_Width,                   { same as TextLength }
+    te_Height : Word;          { same as tf_YSize }
+    te_Extent : tRectangle;      { relative to CP }
+   END;
+
+
+const
+
+    COPPER_MOVE = 0;    { pseude opcode for move #XXXX,dir }
+    COPPER_WAIT = 1;    { pseudo opcode for wait y,x }
+    CPRNXTBUF   = 2;    { continue processing with next buffer }
+    CPR_NT_LOF  = $8000; { copper instruction only for Longint frames }
+    CPR_NT_SHT  = $4000; { copper instruction only for long frames }
+    CPR_NT_SYS  = $2000; { copper user instruction only }
+type
+
+{ Note: The combination VWaitAddr and HWaitAddr replace a three way
+        union in C.  The three possibilities are:
+
+        nxtList : CopListPtr;  or
+
+        VWaitPos : Longint;
+        HWaitPos : Longint;  or
+
+        DestAddr : Longint;
+        DestData : Longint;
+}
+
+    pCopIns = ^tCopIns;
+    tCopIns = record
+        OpCode  : smallint; { 0 = move, 1 = wait }
+        VWaitAddr : smallint; { vertical or horizontal wait position }
+        HWaitData : smallint; { destination Pointer or data to send }
+    end;
+
+{ structure of cprlist that points to list that hardware actually executes }
+
+    pcprlist = ^tcprlist;
+    tcprlist = record
+        Next    : pcprlist;
+        start   : psmallint;       { start of copper list }
+        MaxCount : smallint;       { number of long instructions }
+    end;
+
+    pCopList = ^tCopList;
+    tCopList = record
+        Next    : pCopList;     { next block for this copper list }
+        CopList : pCopList;    { system use }
+        ViewPort : Pointer;    { system use }
+        CopIns  : pCopIns;    { start of this block }
+        CopPtr  : pCopIns;    { intermediate ptr }
+        CopLStart : psmallint;     { mrgcop fills this in for Long Frame}
+        CopSStart : psmallint;     { mrgcop fills this in for Longint Frame}
+        Count   : smallint;        { intermediate counter }
+        MaxCount : smallint;       { max # of copins for this block }
+        DyOffset : smallint;       { offset this copper list vertical waits }
+        SLRepeat : Word;
+        Flags    : Word;
+    end;
+
+    pUCopList = ^tUCopList;
+    tUCopList = record
+        Next    : pUCopList;
+        FirstCopList : pCopList;      { head node of this copper list }
+        CopList : pCopList;           { node in use }
+    end;
+
+    pcopinit = ^tcopinit;
+    tcopinit = record
+        vsync_hblank : array [0..1] of word;
+        diagstrt : Array [0..11] of word;
+        fm0      : array [0..1] of word;
+        diwstart : array [0..9] of word;
+        bplcon2  : array [0..1] of word;
+        sprfix   : array [0..(2*8)] of word;
+        sprstrtup : Array [0..(2*8*2)] of Word;
+        wait14    : array [0..1] of word;
+        norm_hblank : array [0..1] of word;
+        jump        : array [0..1] of word;
+        wait_forever : array [0..5] of word;
+        sprstop : Array [0..7] of Word;
+    end;
+
+
+
+    pAreaInfo = ^tAreaInfo;
+    tAreaInfo = record
+        VctrTbl : Pointer;      { ptr to start of vector table }
+        VctrPtr : Pointer;      { ptr to current vertex }
+        FlagTbl : Pointer;      { ptr to start of vector flag table }
+        FlagPtr : Pointer;      { ptrs to areafill flags }
+        Count   : smallint;        { number of vertices in list }
+        MaxCount : smallint;       { AreaMove/Draw will not allow Count>MaxCount}
+        FirstX,
+        FirstY  : smallint;        { first point for this polygon }
+    end;
+
+    pTmpRas = ^tTmpRas;
+    tTmpRas = record
+        RasPtr  : Pointer;
+        Size    : Longint;
+    end;
+
+{ unoptimized for 32bit alignment of pointers }
+
+    pGelsInfo = ^tGelsInfo;
+    tGelsInfo = record
+        sprRsrvd        : Shortint; { flag of which sprites to reserve from
+                                  vsprite system }
+        Flags   : Byte;       { system use }
+        gelHead,
+        gelTail : Pointer; { (VSpritePtr) dummy vSprites for list management}
+
+    { pointer to array of 8 WORDS for sprite available lines }
+
+        nextLine : Pointer;
+
+    { pointer to array of 8 pointers for color-last-assigned to vSprites }
+
+        lastColor : Pointer;
+        collHandler : Pointer;  { (collTablePtr) Pointeres of collision routines }
+        leftmost,
+        rightmost,
+        topmost,
+        bottommost      : smallint;
+        firstBlissObj,
+        lastBlissObj    : Pointer;    { system use only }
+    end;
+
+    pRastPort = ^tRastPort;
+    tRastPort = record
+        Layer           : pLayer;      { LayerPtr }
+        BitMap          : pBitMap;      { BitMapPtr }
+        ArePointern        : Pointer;      { ptr to areafill pattern }
+        TmpRas          : pTmpRas;
+        AreaInfo        : pAreaInfo;
+        GelsInfo        : pGelsInfo;
+        Mask            : Byte;         { write mask for this raster }
+        FgPen           : Shortint;         { foreground pen for this raster }
+        BgPen           : Shortint;         { background pen         }
+        AOlPen          : Shortint;         { areafill outline pen }
+        DrawMode        : Shortint; { drawing mode for fill, lines, and text }
+        AreaPtSz        : Shortint;         { 2^n words for areafill pattern }
+        linpatcnt       : Shortint; { current line drawing pattern preshift }
+        dummy           : Shortint;
+        Flags           : Word;        { miscellaneous control bits }
+        LinePtrn        : Word;        { 16 bits for textured lines }
+        cp_x,
+        cp_y            : smallint;        { current pen position }
+        minterms        : Array [0..7] of Byte;
+        PenWidth        : smallint;
+        PenHeight       : smallint;
+        Font            : pTextFont;      { (TextFontPtr) current font Pointer }
+        AlgoStyle       : Byte;         { the algorithmically generated style }
+        TxFlags         : Byte;         { text specific flags }
+        TxHeight        : Word;        { text height }
+        TxWidth         : Word;        { text nominal width }
+        TxBaseline      : Word;        { text baseline }
+        TxSpacing       : smallint;        { text spacing (per character) }
+        RP_User         : Pointer;
+        longreserved    : Array [0..1] of Cardinal;
+        wordreserved    : Array [0..6] of Word;        { used to be a node }
+        reserved        : Array [0..7] of Byte;         { for future use }
+    end;
+
+const
+
+{ drawing modes }
+
+    JAM1        = 0;    { jam 1 color into raster }
+    JAM2        = 1;    { jam 2 colors into raster }
+    COMPLEMENT  = 2;    { XOR bits into raster }
+    INVERSVID   = 4;    { inverse video for drawing modes }
+
+{ these are the flag bits for RastPort flags }
+
+    FRST_DOT    = $01;  { draw the first dot of this line ? }
+    ONE_DOT     = $02;  { use one dot mode for drawing lines }
+    DBUFFER     = $04;  { flag set when RastPorts are double-buffered }
+
+             { only used for bobs }
+
+    AREAOUTLINE = $08;  { used by areafiller }
+    NOCROSSFILL = $20;  { areafills have no crossovers }
+
+{ there is only one style of clipping: raster clipping }
+{ this preserves the continuity of jaggies regardless of clip window }
+{ When drawing into a RastPort, if the ptr to ClipRect is nil then there }
+{ is no clipping done, this is dangerous but useful for speed }
+
+
+Const
+    CleanUp     = $40;
+    CleanMe     = CleanUp;
+
+    BltClearWait        = 1;    { Waits for blit to finish }
+    BltClearXY          = 2;    { Use Row/Bytes per row method }
+
+        { Useful minterms }
+
+    StraightCopy        = $C0;  { Vanilla copy }
+    InvertAndCopy       = $30;  { Invert the source before copy }
+    InvertDest          = $50;  { Forget source, invert dest }
+
+
+ {      mode coercion definitions }
+
+const
+{  These flags are passed (in combination) to CoerceMode() to determine the
+ * type of coercion required.
+ }
+
+{  Ensure that the mode coerced to can display just as many colours as the
+ * ViewPort being coerced.
+ }
+    PRESERVE_COLORS = 1;
+
+{  Ensure that the mode coerced to is not interlaced. }
+    AVOID_FLICKER   = 2;
+
+{  Coercion should ignore monitor compatibility issues. }
+    IGNORE_MCOMPAT  = 4;
+
+
+    BIDTAG_COERCE   = 1; {  Private }
+
+const
+
+{ VSprite flags }
+{ user-set VSprite flags: }
+
+    SUSERFLAGS  = $00FF;        { mask of all user-settable VSprite-flags }
+    VSPRITE_f   = $0001;        { set if VSprite, clear if Bob }
+                                { VSPRITE had to be changed for name conflict }
+    SAVEBACK    = $0002;        { set if background is to be saved/restored }
+    OVERLAY     = $0004;        { set to mask image of Bob onto background }
+    MUSTDRAW    = $0008;        { set if VSprite absolutely must be drawn }
+
+{ system-set VSprite flags: }
+
+    BACKSAVED   = $0100;        { this Bob's background has been saved }
+    BOBUPDATE   = $0200;        { temporary flag, useless to outside world }
+    GELGONE     = $0400;        { set if gel is completely clipped (offscreen) }
+    VSOVERFLOW  = $0800;        { VSprite overflow (if MUSTDRAW set we draw!) }
+
+{ Bob flags }
+{ these are the user flag bits }
+
+    BUSERFLAGS  = $00FF;        { mask of all user-settable Bob-flags }
+    SAVEBOB     = $0001;        { set to not erase Bob }
+    BOBISCOMP   = $0002;        { set to identify Bob as AnimComp }
+
+{ these are the system flag bits }
+
+    BWAITING    = $0100;        { set while Bob is waiting on 'after' }
+    BDRAWN      = $0200;        { set when Bob is drawn this DrawG pass}
+    BOBSAWAY    = $0400;        { set to initiate removal of Bob }
+    BOBNIX      = $0800;        { set when Bob is completely removed }
+    SAVEPRESERVE = $1000;       { for back-restore during double-buffer}
+    OUTSTEP     = $2000;        { for double-clearing if double-buffer }
+
+{ defines for the animation procedures }
+
+    ANFRACSIZE  = 6;
+    ANIMHALF    = $0020;
+    RINGTRIGGER = $0001;
+
+
+{ UserStuff definitions
+ *  the user can define these to be a single variable or a sub-structure
+ *  if undefined by the user, the system turns these into innocuous variables
+ *  see the manual for a thorough definition of the UserStuff definitions
+ *
+ }
+
+type
+
+    VUserStuff  = smallint;        { Sprite user stuff }
+    BUserStuff  = smallint;        { Bob user stuff }
+    AUserStuff  = smallint;        { AnimOb user stuff }
+
+{********************** GEL STRUCTURES **********************************}
+
+    pVSprite = ^tVSprite;
+    tVSprite = record
+
+{ --------------------- SYSTEM VARIABLES ------------------------------- }
+{ GEL linked list forward/backward pointers sorted by y,x value }
+
+        NextVSprite     : pVSprite;
+        PrevVSprite     : pVSprite;
+
+{ GEL draw list constructed in the order the Bobs are actually drawn, then
+ *  list is copied to clear list
+ *  must be here in VSprite for system boundary detection
+ }
+
+        DrawPath        : pVSprite;     { pointer of overlay drawing }
+        ClearPath       : pVSprite;     { pointer for overlay clearing }
+
+{ the VSprite positions are defined in (y,x) order to make sorting
+ *  sorting easier, since (y,x) as a long Longint
+ }
+
+        OldY, OldX      : smallint;        { previous position }
+
+{ --------------------- COMMON VARIABLES --------------------------------- }
+
+        Flags           : smallint;        { VSprite flags }
+
+
+{ --------------------- USER VARIABLES ----------------------------------- }
+{ the VSprite positions are defined in (y,x) order to make sorting
+ *  sorting easier, since (y,x) as a long Longint
+ }
+
+        Y, X            : smallint;        { screen position }
+
+        Height  : smallint;
+        Width   : smallint;        { number of words per row of image data }
+        Depth   : smallint;        { number of planes of data }
+
+        MeMask  : smallint;        { which types can collide with this VSprite}
+        HitMask : smallint;        { which types this VSprite can collide with}
+
+        ImageData       : Pointer;      { pointer to VSprite image }
+
+{ borderLine is the one-dimensional logical OR of all
+ *  the VSprite bits, used for fast collision detection of edge
+ }
+
+        BorderLine      : Pointer; { logical OR of all VSprite bits }
+        CollMask        : Pointer; { similar to above except this is a matrix }
+
+{ pointer to this VSprite's color definitions (not used by Bobs) }
+
+        SprColors       : Pointer;
+
+        VSBob   : Pointer;      { (BobPtr) points home if this VSprite
+                                   is part of a Bob }
+
+{ planePick flag:  set bit selects a plane from image, clear bit selects
+ *  use of shadow mask for that plane
+ * OnOff flag: if using shadow mask to fill plane, this bit (corresponding
+ *  to bit in planePick) describes whether to fill with 0's or 1's
+ * There are two uses for these flags:
+ *      - if this is the VSprite of a Bob, these flags describe how the Bob
+ *        is to be drawn into memory
+ *      - if this is a simple VSprite and the user intends on setting the
+ *        MUSTDRAW flag of the VSprite, these flags must be set too to describe
+ *        which color registers the user wants for the image
+ }
+
+        PlanePick       : Shortint;
+        PlaneOnOff      : Shortint;
+
+        VUserExt        : VUserStuff;   { user definable:  see note above }
+    end;
+
+
+
+
+{ dBufPacket defines the values needed to be saved across buffer to buffer
+ *  when in double-buffer mode
+ }
+
+    pDBufPacket = ^tDBufPacket;
+    tDBufPacket = record
+        BufY,
+        BufX    : Word;        { save other buffers screen coordinates }
+        BufPath : pVSprite;   { carry the draw path over the gap }
+
+{ these pointers must be filled in by the user }
+{ pointer to other buffer's background save buffer }
+
+        BufBuffer : Pointer;
+    end;
+
+
+
+
+
+    pBob = ^tBob;
+    tBob = record
+{ blitter-objects }
+
+{ --------------------- SYSTEM VARIABLES --------------------------------- }
+
+{ --------------------- COMMON VARIABLES --------------------------------- }
+
+        Flags   : smallint; { general purpose flags (see definitions below) }
+
+{ --------------------- USER VARIABLES ----------------------------------- }
+
+        SaveBuffer : Pointer;   { pointer to the buffer for background save }
+
+{ used by Bobs for "cookie-cutting" and multi-plane masking }
+
+        ImageShadow : Pointer;
+
+{ pointer to BOBs for sequenced drawing of Bobs
+ *  for correct overlaying of multiple component animations
+ }
+        Before  : pBob; { draw this Bob before Bob pointed to by before }
+        After   : pBob; { draw this Bob after Bob pointed to by after }
+
+        BobVSprite : pVSprite;        { this Bob's VSprite definition }
+
+        BobComp : Pointer; { (AnimCompPtr) pointer to this Bob's AnimComp def }
+
+        DBuffer : Pointer;        { pointer to this Bob's dBuf packet }
+
+        BUserExt : BUserStuff;  { Bob user extension }
+    end;
+
+    pAnimComp = ^tAnimComp;
+    tAnimComp = record
+
+{ --------------------- SYSTEM VARIABLES --------------------------------- }
+
+{ --------------------- COMMON VARIABLES --------------------------------- }
+
+        Flags   : smallint;        { AnimComp flags for system & user }
+
+{ timer defines how long to keep this component active:
+ *  if set non-zero, timer decrements to zero then switches to nextSeq
+ *  if set to zero, AnimComp never switches
+ }
+
+        Timer   : smallint;
+
+{ --------------------- USER VARIABLES ----------------------------------- }
+{ initial value for timer when the AnimComp is activated by the system }
+
+        TimeSet : smallint;
+
+{ pointer to next and previous components of animation object }
+
+        NextComp        : pAnimComp;
+        PrevComp        : pAnimComp;
+
+{ pointer to component component definition of next image in sequence }
+
+        NextSeq : pAnimComp;
+        PrevSeq : pAnimComp;
+
+        AnimCRoutine : Pointer; { Pointer of special animation procedure }
+
+        YTrans  : smallint; { initial y translation (if this is a component) }
+        XTrans  : smallint; { initial x translation (if this is a component) }
+
+        HeadOb  : Pointer; { AnimObPtr }
+
+        AnimBob : pBob;
+    end;
+
+    pAnimOb = ^tAnimOb;
+    tAnimOb = record
+
+{ --------------------- SYSTEM VARIABLES --------------------------------- }
+
+        NextOb,
+        PrevOb  : pAnimOb;
+
+{ number of calls to Animate this AnimOb has endured }
+
+        Clock   : Longint;
+
+        AnOldY,
+        AnOldX  : smallint;        { old y,x coordinates }
+
+{ --------------------- COMMON VARIABLES --------------------------------- }
+
+        AnY,
+        AnX     : smallint;        { y,x coordinates of the AnimOb }
+
+{ --------------------- USER VARIABLES ----------------------------------- }
+
+        YVel,
+        XVel    : smallint;        { velocities of this object }
+        YAccel,
+        XAccel  : smallint;        { accelerations of this object }
+
+        RingYTrans,
+        RingXTrans      : smallint;        { ring translation values }
+
+        AnimORoutine    : Pointer;      { Pointer of special animation
+                                          procedure }
+
+        HeadComp        : pAnimComp;  { pointer to first component }
+
+        AUserExt        : AUserStuff;       { AnimOb user extension }
+    end;
+
+    ppAnimOb = ^pAnimOb;
+
+
+{ ************************************************************************ }
+
+const
+
+    B2NORM      = 0;
+    B2SWAP      = 1;
+    B2BOBBER    = 2;
+
+{ ************************************************************************ }
+
+type
+
+{ a structure to contain the 16 collision procedure addresses }
+
+    collTable = Array [0..15] of Pointer;
+    pcollTable = ^collTable;
+
+const
+
+{   These bit descriptors are used by the GEL collide routines.
+ *  These bits are set in the hitMask and meMask variables of
+ *  a GEL to describe whether or not these types of collisions
+ *  can affect the GEL.  BNDRY_HIT is described further below;
+ *  this bit is permanently assigned as the boundary-hit flag.
+ *  The other bit GEL_HIT is meant only as a default to cover
+ *  any GEL hitting any other; the user may redefine this bit.
+ }
+
+    BORDERHIT   = 0;
+
+{   These bit descriptors are used by the GEL boundry hit routines.
+ *  When the user's boundry-hit routine is called (via the argument
+ *  set by a call to SetCollision) the first argument passed to
+ *  the user's routine is the Pointer of the GEL involved in the
+ *  boundry-hit, and the second argument has the appropriate bit(s)
+ *  set to describe which boundry was surpassed
+ }
+
+    TOPHIT      = 1;
+    BOTTOMHIT   = 2;
+    LEFTHIT     = 4;
+    RIGHTHIT    = 8;
+
+Type
+ pExtendedNode = ^tExtendedNode;
+ tExtendedNode = record
+  xln_Succ,
+  xln_Pred  : pNode;
+  xln_Type  : Byte;
+  xln_Pri   : Shortint;
+  xln_Name  : PChar;
+  xln_Subsystem : Byte;
+  xln_Subtype   : Byte;
+  xln_Library : Longint;
+  xln_Init : Pointer;
+ END;
+
+CONST
+ SS_GRAPHICS   =  $02;
+
+ VIEW_EXTRA_TYPE       =  1;
+ VIEWPORT_EXTRA_TYPE   =  2;
+ SPECIAL_MONITOR_TYPE  =  3;
+ MONITOR_SPEC_TYPE     =  4;
+
+type
+
+{ structure used by AddTOFTask }
+
+    pIsrvstr = ^tIsrvstr;
+    tIsrvstr = record
+        is_Node : tNode;
+        Iptr    : pIsrvstr;     { passed to srvr by os }
+        code    : Pointer;
+        ccode   : Pointer;
+        Carg    : Pointer;
+    end;
+
+Type
+ pAnalogSignalInterval = ^tAnalogSignalInterval;
+ tAnalogSignalInterval = record
+  asi_Start,
+  asi_Stop  : Word;
+ END;
+
+ pSpecialMonitor = ^tSpecialMonitor;
+ tSpecialMonitor = record
+  spm_Node      : tExtendedNode;
+  spm_Flags     : Word;
+  do_monitor,
+  reserved1,
+  reserved2,
+  reserved3     : Pointer;
+  hblank,
+  vblank,
+  hsync,
+  vsync : tAnalogSignalInterval;
+ END;
+
+
+ pMonitorSpec = ^tMonitorSpec;
+ tMonitorSpec = record
+    ms_Node     : tExtendedNode;
+    ms_Flags    : Word;
+    ratioh,
+    ratiov      : Longint;
+    total_rows,
+    total_colorclocks,
+    DeniseMaxDisplayColumn,
+    BeamCon0,
+    min_row     : Word;
+    ms_Special  : pSpecialMonitor;
+    ms_OpenCount : Word;
+    ms_transform,
+    ms_translate,
+    ms_scale    : Pointer;
+    ms_xoffset,
+    ms_yoffset  : Word;
+    ms_LegalView : tRectangle;
+    ms_maxoscan,       { maximum legal overscan }
+    ms_videoscan  : Pointer;      { video display overscan }
+    DeniseMinDisplayColumn : Word;
+    DisplayCompatible      : Cardinal;
+    DisplayInfoDataBase    : tList;
+    DisplayInfoDataBaseSemaphore : tSignalSemaphore;
+    ms_MrgCop,
+    ms_LoadView,
+    ms_KillView  : Longint;
+ END;
+
+const
+  TO_MONITOR            =  0;
+  FROM_MONITOR          =  1;
+  STANDARD_XOFFSET      =  9;
+  STANDARD_YOFFSET      =  0;
+
+  MSB_REQUEST_NTSC      =  0;
+  MSB_REQUEST_PAL       =  1;
+  MSB_REQUEST_SPECIAL   =  2;
+  MSB_REQUEST_A2024     =  3;
+  MSB_DOUBLE_SPRITES    =  4;
+  MSF_REQUEST_NTSC      =  1;
+  MSF_REQUEST_PAL       =  2;
+  MSF_REQUEST_SPECIAL   =  4;
+  MSF_REQUEST_A2024     =  8;
+  MSF_DOUBLE_SPRITES    =  16;
+
+
+{ obsolete, v37 compatible definitions follow }
+  REQUEST_NTSC          =  1;
+  REQUEST_PAL           =  2;
+  REQUEST_SPECIAL       =  4;
+  REQUEST_A2024         =  8;
+
+  DEFAULT_MONITOR_NAME  : PChar =  'default.monitor';
+  NTSC_MONITOR_NAME     : PChar =  'ntsc.monitor';
+  PAL_MONITOR_NAME      : PChar =  'pal.monitor';
+  STANDARD_MONITOR_MASK =  ( REQUEST_NTSC OR REQUEST_PAL ) ;
+
+  STANDARD_NTSC_ROWS    =  262;
+  STANDARD_PAL_ROWS     =  312;
+  STANDARD_COLORCLOCKS  =  226;
+  STANDARD_DENISE_MAX   =  455;
+  STANDARD_DENISE_MIN   =  93 ;
+  STANDARD_NTSC_BEAMCON =  $0000;
+  STANDARD_PAL_BEAMCON  =  DISPLAYPAL ;
+
+  SPECIAL_BEAMCON       = ( VARVBLANK OR LOLDIS OR VARVSYNC OR VARHSYNC OR VARBEAM OR CSBLANK OR VSYNCTRUE);
+
+  MIN_NTSC_ROW    = 21   ;
+  MIN_PAL_ROW     = 29   ;
+  STANDARD_VIEW_X = $81  ;
+  STANDARD_VIEW_Y = $2C  ;
+  STANDARD_HBSTRT = $06  ;
+  STANDARD_HSSTRT = $0B  ;
+  STANDARD_HSSTOP = $1C  ;
+  STANDARD_HBSTOP = $2C  ;
+  STANDARD_VBSTRT = $0122;
+  STANDARD_VSSTRT = $02A6;
+  STANDARD_VSSTOP = $03AA;
+  STANDARD_VBSTOP = $1066;
+
+  VGA_COLORCLOCKS = (STANDARD_COLORCLOCKS/2);
+  VGA_TOTAL_ROWS  = (STANDARD_NTSC_ROWS*2);
+  VGA_DENISE_MIN  = 59   ;
+  MIN_VGA_ROW     = 29   ;
+  VGA_HBSTRT      = $08  ;
+  VGA_HSSTRT      = $0E  ;
+  VGA_HSSTOP      = $1C  ;
+  VGA_HBSTOP      = $1E  ;
+  VGA_VBSTRT      = $0000;
+  VGA_VSSTRT      = $0153;
+  VGA_VSSTOP      = $0235;
+  VGA_VBSTOP      = $0CCD;
+
+  VGA_MONITOR_NAME  : PChar    =  'vga.monitor';
+
+{ NOTE: VGA70 definitions are obsolete - a VGA70 monitor has never been
+ * implemented.
+ }
+  VGA70_COLORCLOCKS = (STANDARD_COLORCLOCKS/2) ;
+  VGA70_TOTAL_ROWS  = 449;
+  VGA70_DENISE_MIN  = 59;
+  MIN_VGA70_ROW     = 35   ;
+  VGA70_HBSTRT      = $08  ;
+  VGA70_HSSTRT      = $0E  ;
+  VGA70_HSSTOP      = $1C  ;
+  VGA70_HBSTOP      = $1E  ;
+  VGA70_VBSTRT      = $0000;
+  VGA70_VSSTRT      = $02A6;
+  VGA70_VSSTOP      = $0388;
+  VGA70_VBSTOP      = $0F73;
+
+  VGA70_BEAMCON     = (SPECIAL_BEAMCON XOR VSYNCTRUE);
+  VGA70_MONITOR_NAME  : PChar  =      'vga70.monitor';
+
+  BROADCAST_HBSTRT  =      $01  ;
+  BROADCAST_HSSTRT  =      $06  ;
+  BROADCAST_HSSTOP  =      $17  ;
+  BROADCAST_HBSTOP  =      $27  ;
+  BROADCAST_VBSTRT  =      $0000;
+  BROADCAST_VSSTRT  =      $02A6;
+  BROADCAST_VSSTOP  =      $054C;
+  BROADCAST_VBSTOP  =      $1C40;
+  BROADCAST_BEAMCON =      ( LOLDIS OR CSBLANK );
+  RATIO_FIXEDPART   =      4;
+  RATIO_UNITY       =      16;
+
+
+
+Type
+    pRasInfo = ^tRasInfo;
+    tRasInfo = record    { used by callers to and InitDspC() }
+        Next    : pRasInfo;     { used for dualpf }
+        BitMap  : pBitMap;
+        RxOffset,
+        RyOffset : smallint;       { scroll offsets in this BitMap }
+    end;
+
+
+    pView = ^tView;
+    tView = record
+        ViewPort        : Pointer;      { ViewPortPtr }
+        LOFCprList      : pcprlist;   { used for interlaced and noninterlaced }
+        SHFCprList      : pcprlist;   { only used during interlace }
+        DyOffset,
+        DxOffset        : smallint;        { for complete View positioning }
+                                { offsets are +- adjustments to standard #s }
+        Modes           : WORD;        { such as INTERLACE, GENLOC }
+    end;
+
+{ these structures are obtained via GfxNew }
+{ and disposed by GfxFree }
+Type
+       pViewExtra = ^tViewExtra;
+       tViewExtra = record
+        n : tExtendedNode;
+        View     : pView;       { backwards link }   { view in C-Includes }
+        Monitor : pMonitorSpec; { monitors for this view }
+        TopLine : Word;
+       END;
+
+
+    pViewPort = ^tViewPort;
+    tViewPort = record
+        Next    : pViewPort;
+        ColorMap : Pointer; { table of colors for this viewport }        { ColorMapPtr }
+                          { if this is nil, MakeVPort assumes default values }
+        DspIns  : pCopList;   { user by MakeView() }
+        SprIns  : pCopList;   { used by sprite stuff }
+        ClrIns  : pCopList;   { used by sprite stuff }
+        UCopIns : pUCopList;  { User copper list }
+        DWidth,
+        DHeight : smallint;
+        DxOffset,
+        DyOffset : smallint;
+        Modes   : Word;
+        SpritePriorities : Byte;        { used by makevp }
+        reserved : Byte;
+        RasInfo : pRasInfo;
+    end;
+
+
+{ this structure is obtained via GfxNew }
+{ and disposed by GfxFree }
+
+ pViewPortExtra = ^tViewPortExtra;
+ tViewPortExtra = record
+  n : tExtendedNode;
+  ViewPort     : pViewPort;      { backwards link }   { ViewPort in C-Includes }
+  DisplayClip  : tRectangle;  { makevp display clipping information }
+        { These are added for V39 }
+  VecTable     : Pointer;                { Private }
+  DriverData   : Array[0..1] of Pointer;
+  Flags        : WORD;
+  Origin       : Array[0..1] of tPoint;  { First visible point relative to the DClip.
+                                         * One for each possible playfield.
+                                         }
+  cop1ptr,                  { private }
+  cop2ptr      : Cardinal;   { private }
+ END;
+
+
+    pColorMap = ^tColorMap;
+    tColorMap = record
+        Flags   : Byte;
+        CType   : Byte;         { This is "Type" in C includes }
+        Count   : Word;
+        ColorTable      : Pointer;
+        cm_vpe  : pViewPortExtra;
+        LowColorBits : Pointer;
+        TransparencyPlane,
+        SpriteResolution,
+        SpriteResDefault,
+        AuxFlags         : Byte;
+        cm_vp            : pViewPort;   { ViewPortPtr }
+        NormalDisplayInfo,
+        CoerceDisplayInfo : Pointer;
+        cm_batch_items   : pTagItem;
+        VPModeID         : Cardinal;
+        PalExtra         : Pointer;
+        SpriteBase_Even,
+        SpriteBase_Odd,
+        Bp_0_base,
+        Bp_1_base        : Word;
+    end;
+
+{ if Type == 0 then ColorMap is V1.2/V1.3 compatible }
+{ if Type != 0 then ColorMap is V36       compatible }
+{ the system will never create other than V39 type colormaps when running V39 }
+
+CONST
+ COLORMAP_TYPE_V1_2     = $00;
+ COLORMAP_TYPE_V1_4     = $01;
+ COLORMAP_TYPE_V36      = COLORMAP_TYPE_V1_4;    { use this definition }
+ COLORMAP_TYPE_V39      = $02;
+
+
+{ Flags variable }
+ COLORMAP_TRANSPARENCY   = $01;
+ COLORPLANE_TRANSPARENCY = $02;
+ BORDER_BLANKING         = $04;
+ BORDER_NOTRANSPARENCY   = $08;
+ VIDEOCONTROL_BATCH      = $10;
+ USER_COPPER_CLIP        = $20;
+
+
+CONST
+ EXTEND_VSTRUCT = $1000;  { unused bit in Modes field of View }
+
+
+{ defines used for Modes in IVPargs }
+
+CONST
+ GENLOCK_VIDEO  =  $0002;
+ LACE           =  $0004;
+ SUPERHIRES     =  $0020;
+ PFBA           =  $0040;
+ EXTRA_HALFBRITE=  $0080;
+ GENLOCK_AUDIO  =  $0100;
+ DUALPF         =  $0400;
+ HAM            =  $0800;
+ EXTENDED_MODE  =  $1000;
+ VP_HIDE        =  $2000;
+ SPRITES        =  $4000;
+ HIRES          =  $8000;
+
+ VPF_A2024      =  $40;
+ VPF_AGNUS      =  $20;
+ VPF_TENHZ      =  $20;
+
+ BORDERSPRITES   = $40;
+
+ CMF_CMTRANS   =  0;
+ CMF_CPTRANS   =  1;
+ CMF_BRDRBLNK  =  2;
+ CMF_BRDNTRAN  =  3;
+ CMF_BRDRSPRT  =  6;
+
+ SPRITERESN_ECS       =   0;
+{ ^140ns, except in 35ns viewport, where it is 70ns. }
+ SPRITERESN_140NS     =   1;
+ SPRITERESN_70NS      =   2;
+ SPRITERESN_35NS      =   3;
+ SPRITERESN_DEFAULT   =   -1;
+
+{ AuxFlags : }
+ CMAB_FULLPALETTE = 0;
+ CMAF_FULLPALETTE = 1;
+ CMAB_NO_INTERMED_UPDATE = 1;
+ CMAF_NO_INTERMED_UPDATE = 2;
+ CMAB_NO_COLOR_LOAD = 2;
+ CMAF_NO_COLOR_LOAD = 4;
+ CMAB_DUALPF_DISABLE = 3;
+ CMAF_DUALPF_DISABLE = 8;
+
+Type
+    pPaletteExtra = ^tPaletteExtra;
+    tPaletteExtra = record                            { structure may be extended so watch out! }
+        pe_Semaphore  : tSignalSemaphore;                { shared semaphore for arbitration     }
+        pe_FirstFree,                                   { *private*                            }
+        pe_NFree,                                       { number of free colors                }
+        pe_FirstShared,                                 { *private*                            }
+        pe_NShared    : WORD;                           { *private*                            }
+        pe_RefCnt     : Pointer;                        { *private*                            }
+        pe_AllocList  : Pointer;                        { *private*                            }
+        pe_ViewPort   : pViewPort;                    { back pointer to viewport             }
+        pe_SharableColors : WORD;                       { the number of sharable colors.       }
+    end;
+{ flags values for ObtainPen }
+Const
+ PENB_EXCLUSIVE = 0;
+ PENB_NO_SETCOLOR = 1;
+
+ PENF_EXCLUSIVE = 1;
+ PENF_NO_SETCOLOR = 2;
+
+{ obsolete names for PENF_xxx flags: }
+
+ PEN_EXCLUSIVE = PENF_EXCLUSIVE;
+ PEN_NO_SETCOLOR = PENF_NO_SETCOLOR;
+
+{ precision values for ObtainBestPen : }
+
+ PRECISION_EXACT = -1;
+ PRECISION_IMAGE = 0;
+ PRECISION_ICON  = 16;
+ PRECISION_GUI   = 32;
+
+
+{ tags for ObtainBestPen: }
+ OBP_Precision = $84000000;
+ OBP_FailIfBad = $84000001;
+
+{ From V39, MakeVPort() will return an error if there is not enough memory,
+ * or the requested mode cannot be opened with the requested depth with the
+ * given bitmap (for higher bandwidth alignments).
+ }
+
+ MVP_OK        =  0;       { you want to see this one }
+ MVP_NO_MEM    =  1;       { insufficient memory for intermediate workspace }
+ MVP_NO_VPE    =  2;       { ViewPort does not have a ViewPortExtra, and
+                                 * insufficient memory to allocate a temporary one.
+                                 }
+ MVP_NO_DSPINS =  3;       { insufficient memory for intermidiate copper
+                                 * instructions.
+                                 }
+ MVP_NO_DISPLAY = 4;       { BitMap data is misaligned for this viewport's
+                                 * mode and depth - see AllocBitMap().
+                                 }
+ MVP_OFF_BOTTOM = 5;       { PRIVATE - you will never see this. }
+
+{ From V39, MrgCop() will return an error if there is not enough memory,
+ * or for some reason MrgCop() did not need to make any copper lists.
+ }
+
+ MCOP_OK       =  0;       { you want to see this one }
+ MCOP_NO_MEM   =  1;       { insufficient memory to allocate the system
+                                 * copper lists.
+                                 }
+ MCOP_NOP      =  2;       { MrgCop() did not merge any copper lists
+                                 * (eg, no ViewPorts in the list, or all marked as
+                                 * hidden).
+                                 }
+Type
+    pDBufInfo = ^tDBufInfo;
+    tDBufInfo = record
+        dbi_Link1   : Pointer;
+        dbi_Count1  : Cardinal;
+        dbi_SafeMessage : tMessage;         { replied to when safe to write to old bitmap }
+        dbi_UserData1   : Pointer;                     { first user data }
+
+        dbi_Link2   : Pointer;
+        dbi_Count2  : Cardinal;
+        dbi_DispMessage : tMessage; { replied to when new bitmap has been displayed at least
+                                                        once }
+        dbi_UserData2 : Pointer;                  { second user data }
+        dbi_MatchLong : Cardinal;
+        dbi_CopPtr1,
+        dbi_CopPtr2,
+        dbi_CopPtr3   : Pointer;
+        dbi_BeamPos1,
+        dbi_BeamPos2  : WORD;
+    end;
+
+
+
+   {   include define file for graphics display mode IDs.   }
+
+
+const
+
+   INVALID_ID                   =   NOT 0;
+
+{ With all the new modes that are available under V38 and V39, it is highly
+ * recommended that you use either the asl.library screenmode requester,
+ * and/or the V39 graphics.library function BestModeIDA().
+ *
+ * DO NOT interpret the any of the bits in the ModeID for its meaning. For
+ * example, do not interpret bit 3 ($4) as meaning the ModeID is interlaced.
+ * Instead, use GetDisplayInfoData() with DTAG_DISP, and examine the DIPF_...
+ * flags to determine a ModeID's characteristics. The only exception to
+ * this rule is that bit 7 ($80) will always mean the ModeID is
+ * ExtraHalfBright, and bit 11 ($800) will always mean the ModeID is HAM.
+ }
+
+{ normal identifiers }
+
+   MONITOR_ID_MASK              =   $FFFF1000;
+
+   DEFAULT_MONITOR_ID           =   $00000000;
+   NTSC_MONITOR_ID              =   $00011000;
+   PAL_MONITOR_ID               =   $00021000;
+
+{ the following 22 composite keys are for Modes on the default Monitor.
+ * NTSC & PAL "flavors" of these particular keys may be made by or'ing
+ * the NTSC or PAL MONITOR_ID with the desired MODE_KEY...
+ *
+ * For example, to specifically open a PAL HAM interlaced ViewPort
+ * (or intuition screen), you would use the modeid of
+ * (PAL_MONITOR_ID OR HAMLACE_KEY)
+ }
+
+   LORES_KEY                     =  $00000000;
+   HIRES_KEY                     =  $00008000;
+   SUPER_KEY                     =  $00008020;
+   HAM_KEY                       =  $00000800;
+   LORESLACE_KEY                 =  $00000004;
+   HIRESLACE_KEY                 =  $00008004;
+   SUPERLACE_KEY                 =  $00008024;
+   HAMLACE_KEY                   =  $00000804;
+   LORESDPF_KEY                  =  $00000400;
+   HIRESDPF_KEY                  =  $00008400;
+   SUPERDPF_KEY                  =  $00008420;
+   LORESLACEDPF_KEY              =  $00000404;
+   HIRESLACEDPF_KEY              =  $00008404;
+   SUPERLACEDPF_KEY              =  $00008424;
+   LORESDPF2_KEY                 =  $00000440;
+   HIRESDPF2_KEY                 =  $00008440;
+   SUPERDPF2_KEY                 =  $00008460;
+   LORESLACEDPF2_KEY             =  $00000444;
+   HIRESLACEDPF2_KEY             =  $00008444;
+   SUPERLACEDPF2_KEY             =  $00008464;
+   EXTRAHALFBRITE_KEY            =  $00000080;
+   EXTRAHALFBRITELACE_KEY        =  $00000084;
+{ New for AA ChipSet (V39) }
+   HIRESHAM_KEY                  =  $00008800;
+   SUPERHAM_KEY                  =  $00008820;
+   HIRESEHB_KEY                  =  $00008080;
+   SUPEREHB_KEY                  =  $000080a0;
+   HIRESHAMLACE_KEY              =  $00008804;
+   SUPERHAMLACE_KEY              =  $00008824;
+   HIRESEHBLACE_KEY              =  $00008084;
+   SUPEREHBLACE_KEY              =  $000080a4;
+{ Added for V40 - may be useful modes for some games or animations. }
+   LORESSDBL_KEY                 =  $00000008;
+   LORESHAMSDBL_KEY              =  $00000808;
+   LORESEHBSDBL_KEY              =  $00000088;
+   HIRESHAMSDBL_KEY              =  $00008808;
+
+
+{ VGA identifiers }
+
+   VGA_MONITOR_ID                =  $00031000;
+
+   VGAEXTRALORES_KEY             =  $00031004;
+   VGALORES_KEY                  =  $00039004;
+   VGAPRODUCT_KEY                =  $00039024;
+   VGAHAM_KEY                    =  $00031804;
+   VGAEXTRALORESLACE_KEY         =  $00031005;
+   VGALORESLACE_KEY              =  $00039005;
+   VGAPRODUCTLACE_KEY            =  $00039025;
+   VGAHAMLACE_KEY                =  $00031805;
+   VGAEXTRALORESDPF_KEY          =  $00031404;
+   VGALORESDPF_KEY               =  $00039404;
+   VGAPRODUCTDPF_KEY             =  $00039424;
+   VGAEXTRALORESLACEDPF_KEY      =  $00031405;
+   VGALORESLACEDPF_KEY           =  $00039405;
+   VGAPRODUCTLACEDPF_KEY         =  $00039425;
+   VGAEXTRALORESDPF2_KEY         =  $00031444;
+   VGALORESDPF2_KEY              =  $00039444;
+   VGAPRODUCTDPF2_KEY            =  $00039464;
+   VGAEXTRALORESLACEDPF2_KEY     =  $00031445;
+   VGALORESLACEDPF2_KEY          =  $00039445;
+   VGAPRODUCTLACEDPF2_KEY        =  $00039465;
+   VGAEXTRAHALFBRITE_KEY         =  $00031084;
+   VGAEXTRAHALFBRITELACE_KEY     =  $00031085;
+{ New for AA ChipSet (V39) }
+   VGAPRODUCTHAM_KEY             =  $00039824;
+   VGALORESHAM_KEY               =  $00039804;
+   VGAEXTRALORESHAM_KEY          =  VGAHAM_KEY;
+   VGAPRODUCTHAMLACE_KEY         =  $00039825;
+   VGALORESHAMLACE_KEY           =  $00039805;
+   VGAEXTRALORESHAMLACE_KEY      =  VGAHAMLACE_KEY;
+   VGAEXTRALORESEHB_KEY          =  VGAEXTRAHALFBRITE_KEY;
+   VGAEXTRALORESEHBLACE_KEY      =  VGAEXTRAHALFBRITELACE_KEY;
+   VGALORESEHB_KEY               =  $00039084;
+   VGALORESEHBLACE_KEY           =  $00039085;
+   VGAEHB_KEY                    =  $000390a4;
+   VGAEHBLACE_KEY                =  $000390a5;
+{ These ModeIDs are the scandoubled equivalents of the above, with the
+ * exception of the DualPlayfield modes, as AA does not allow for scandoubling
+ * dualplayfield.
+ }
+   VGAEXTRALORESDBL_KEY          =  $00031000;
+   VGALORESDBL_KEY               =  $00039000;
+   VGAPRODUCTDBL_KEY             =  $00039020;
+   VGAEXTRALORESHAMDBL_KEY       =  $00031800;
+   VGALORESHAMDBL_KEY            =  $00039800;
+   VGAPRODUCTHAMDBL_KEY          =  $00039820;
+   VGAEXTRALORESEHBDBL_KEY       =  $00031080;
+   VGALORESEHBDBL_KEY            =  $00039080;
+   VGAPRODUCTEHBDBL_KEY          =  $000390a0;
+
+{ a2024 identifiers }
+
+   A2024_MONITOR_ID              =  $00041000;
+
+   A2024TENHERTZ_KEY             =  $00041000;
+   A2024FIFTEENHERTZ_KEY         =  $00049000;
+
+{ prototype identifiers (private) }
+
+   PROTO_MONITOR_ID              =  $00051000;
+
+
+{ These monitors and modes were added for the V38 release. }
+
+   EURO72_MONITOR_ID             =  $00061000;
+
+   EURO72EXTRALORES_KEY          =  $00061004;
+   EURO72LORES_KEY               =  $00069004;
+   EURO72PRODUCT_KEY             =  $00069024;
+   EURO72HAM_KEY                 =  $00061804;
+   EURO72EXTRALORESLACE_KEY      =  $00061005;
+   EURO72LORESLACE_KEY           =  $00069005;
+   EURO72PRODUCTLACE_KEY         =  $00069025;
+   EURO72HAMLACE_KEY             =  $00061805;
+   EURO72EXTRALORESDPF_KEY       =  $00061404;
+   EURO72LORESDPF_KEY            =  $00069404;
+   EURO72PRODUCTDPF_KEY          =  $00069424;
+   EURO72EXTRALORESLACEDPF_KEY   =  $00061405;
+   EURO72LORESLACEDPF_KEY        =  $00069405;
+   EURO72PRODUCTLACEDPF_KEY      =  $00069425;
+   EURO72EXTRALORESDPF2_KEY      =  $00061444;
+   EURO72LORESDPF2_KEY           =  $00069444;
+   EURO72PRODUCTDPF2_KEY         =  $00069464;
+   EURO72EXTRALORESLACEDPF2_KEY  =  $00061445;
+   EURO72LORESLACEDPF2_KEY       =  $00069445;
+   EURO72PRODUCTLACEDPF2_KEY     =  $00069465;
+   EURO72EXTRAHALFBRITE_KEY      =  $00061084;
+   EURO72EXTRAHALFBRITELACE_KEY  =  $00061085;
+{ New AA modes (V39) }
+   EURO72PRODUCTHAM_KEY          =  $00069824;
+   EURO72PRODUCTHAMLACE_KEY      =  $00069825;
+   EURO72LORESHAM_KEY            =  $00069804;
+   EURO72LORESHAMLACE_KEY        =  $00069805;
+   EURO72EXTRALORESHAM_KEY       =  EURO72HAM_KEY;
+   EURO72EXTRALORESHAMLACE_KEY   =  EURO72HAMLACE_KEY ;
+   EURO72EXTRALORESEHB_KEY       =  EURO72EXTRAHALFBRITE_KEY;
+   EURO72EXTRALORESEHBLACE_KEY   =  EURO72EXTRAHALFBRITELACE_KEY;
+   EURO72LORESEHB_KEY            =  $00069084;
+   EURO72LORESEHBLACE_KEY        =  $00069085;
+   EURO72EHB_KEY                 =  $000690a4;
+   EURO72EHBLACE_KEY             =  $000690a5;
+{ These ModeIDs are the scandoubled equivalents of the above, with the
+ * exception of the DualPlayfield modes, as AA does not allow for scandoubling
+ * dualplayfield.
+ }
+   EURO72EXTRALORESDBL_KEY       =  $00061000;
+   EURO72LORESDBL_KEY            =  $00069000;
+   EURO72PRODUCTDBL_KEY          =  $00069020;
+   EURO72EXTRALORESHAMDBL_KEY    =  $00061800;
+   EURO72LORESHAMDBL_KEY         =  $00069800;
+   EURO72PRODUCTHAMDBL_KEY       =  $00069820;
+   EURO72EXTRALORESEHBDBL_KEY    =  $00061080;
+   EURO72LORESEHBDBL_KEY         =  $00069080;
+   EURO72PRODUCTEHBDBL_KEY       =  $000690a0;
+
+
+   EURO36_MONITOR_ID             =  $00071000;
+
+{ Euro36 modeids can be ORed with the default modeids a la NTSC and PAL.
+ * For example, Euro36 SuperHires is
+ * (EURO36_MONITOR_ID OR SUPER_KEY)
+ }
+
+   SUPER72_MONITOR_ID            =  $00081000;
+
+{ Super72 modeids can be ORed with the default modeids a la NTSC and PAL.
+ * For example, Super72 SuperHiresLace (80$600) is
+ * (SUPER72_MONITOR_ID OR SUPERLACE_KEY).
+ * The following scandoubled Modes are the exception:
+ }
+   SUPER72LORESDBL_KEY           =  $00081008;
+   SUPER72HIRESDBL_KEY           =  $00089008;
+   SUPER72SUPERDBL_KEY           =  $00089028;
+   SUPER72LORESHAMDBL_KEY        =  $00081808;
+   SUPER72HIRESHAMDBL_KEY        =  $00089808;
+   SUPER72SUPERHAMDBL_KEY        =  $00089828;
+   SUPER72LORESEHBDBL_KEY        =  $00081088;
+   SUPER72HIRESEHBDBL_KEY        =  $00089088;
+   SUPER72SUPEREHBDBL_KEY        =  $000890a8;
+
+
+{ These monitors and modes were added for the V39 release. }
+
+   DBLNTSC_MONITOR_ID            =  $00091000;
+
+   DBLNTSCLORES_KEY              =  $00091000;
+   DBLNTSCLORESFF_KEY            =  $00091004;
+   DBLNTSCLORESHAM_KEY           =  $00091800;
+   DBLNTSCLORESHAMFF_KEY         =  $00091804;
+   DBLNTSCLORESEHB_KEY           =  $00091080;
+   DBLNTSCLORESEHBFF_KEY         =  $00091084;
+   DBLNTSCLORESLACE_KEY          =  $00091005;
+   DBLNTSCLORESHAMLACE_KEY       =  $00091805;
+   DBLNTSCLORESEHBLACE_KEY       =  $00091085;
+   DBLNTSCLORESDPF_KEY           =  $00091400;
+   DBLNTSCLORESDPFFF_KEY         =  $00091404;
+   DBLNTSCLORESDPFLACE_KEY       =  $00091405;
+   DBLNTSCLORESDPF2_KEY          =  $00091440;
+   DBLNTSCLORESDPF2FF_KEY        =  $00091444;
+   DBLNTSCLORESDPF2LACE_KEY      =  $00091445;
+   DBLNTSCHIRES_KEY              =  $00099000;
+   DBLNTSCHIRESFF_KEY            =  $00099004;
+   DBLNTSCHIRESHAM_KEY           =  $00099800;
+   DBLNTSCHIRESHAMFF_KEY         =  $00099804;
+   DBLNTSCHIRESLACE_KEY          =  $00099005;
+   DBLNTSCHIRESHAMLACE_KEY       =  $00099805;
+   DBLNTSCHIRESEHB_KEY           =  $00099080;
+   DBLNTSCHIRESEHBFF_KEY         =  $00099084;
+   DBLNTSCHIRESEHBLACE_KEY       =  $00099085;
+   DBLNTSCHIRESDPF_KEY           =  $00099400;
+   DBLNTSCHIRESDPFFF_KEY         =  $00099404;
+   DBLNTSCHIRESDPFLACE_KEY       =  $00099405;
+   DBLNTSCHIRESDPF2_KEY          =  $00099440;
+   DBLNTSCHIRESDPF2FF_KEY        =  $00099444;
+   DBLNTSCHIRESDPF2LACE_KEY      =  $00099445;
+   DBLNTSCEXTRALORES_KEY         =  $00091200;
+   DBLNTSCEXTRALORESHAM_KEY      =  $00091a00;
+   DBLNTSCEXTRALORESEHB_KEY      =  $00091280;
+   DBLNTSCEXTRALORESDPF_KEY      =  $00091600;
+   DBLNTSCEXTRALORESDPF2_KEY     =  $00091640;
+   DBLNTSCEXTRALORESFF_KEY       =  $00091204;
+   DBLNTSCEXTRALORESHAMFF_KEY    =  $00091a04;
+   DBLNTSCEXTRALORESEHBFF_KEY    =  $00091284;
+   DBLNTSCEXTRALORESDPFFF_KEY    =  $00091604;
+   DBLNTSCEXTRALORESDPF2FF_KEY   =  $00091644;
+   DBLNTSCEXTRALORESLACE_KEY     =  $00091205;
+   DBLNTSCEXTRALORESHAMLACE_KEY  =  $00091a05;
+   DBLNTSCEXTRALORESEHBLACE_KEY  =  $00091285;
+   DBLNTSCEXTRALORESDPFLACE_KEY  =  $00091605;
+   DBLNTSCEXTRALORESDPF2LACE_KEY =  $00091645;
+
+   DBLPAL_MONITOR_ID             =  $000a1000;
+
+   DBLPALLORES_KEY               =  $000a1000;
+   DBLPALLORESFF_KEY             =  $000a1004;
+   DBLPALLORESHAM_KEY            =  $000a1800;
+   DBLPALLORESHAMFF_KEY          =  $000a1804;
+   DBLPALLORESEHB_KEY            =  $000a1080;
+   DBLPALLORESEHBFF_KEY          =  $000a1084;
+   DBLPALLORESLACE_KEY           =  $000a1005;
+   DBLPALLORESHAMLACE_KEY        =  $000a1805;
+   DBLPALLORESEHBLACE_KEY        =  $000a1085;
+   DBLPALLORESDPF_KEY            =  $000a1400;
+   DBLPALLORESDPFFF_KEY          =  $000a1404;
+   DBLPALLORESDPFLACE_KEY        =  $000a1405;
+   DBLPALLORESDPF2_KEY           =  $000a1440;
+   DBLPALLORESDPF2FF_KEY         =  $000a1444;
+   DBLPALLORESDPF2LACE_KEY       =  $000a1445;
+   DBLPALHIRES_KEY               =  $000a9000;
+   DBLPALHIRESFF_KEY             =  $000a9004;
+   DBLPALHIRESHAM_KEY            =  $000a9800;
+   DBLPALHIRESHAMFF_KEY          =  $000a9804;
+   DBLPALHIRESLACE_KEY           =  $000a9005;
+   DBLPALHIRESHAMLACE_KEY        =  $000a9805;
+   DBLPALHIRESEHB_KEY            =  $000a9080;
+   DBLPALHIRESEHBFF_KEY          =  $000a9084;
+   DBLPALHIRESEHBLACE_KEY        =  $000a9085;
+   DBLPALHIRESDPF_KEY            =  $000a9400;
+   DBLPALHIRESDPFFF_KEY          =  $000a9404;
+   DBLPALHIRESDPFLACE_KEY        =  $000a9405;
+   DBLPALHIRESDPF2_KEY           =  $000a9440;
+   DBLPALHIRESDPF2FF_KEY         =  $000a9444;
+   DBLPALHIRESDPF2LACE_KEY       =  $000a9445;
+   DBLPALEXTRALORES_KEY          =  $000a1200;
+   DBLPALEXTRALORESHAM_KEY       =  $000a1a00;
+   DBLPALEXTRALORESEHB_KEY       =  $000a1280;
+   DBLPALEXTRALORESDPF_KEY       =  $000a1600;
+   DBLPALEXTRALORESDPF2_KEY      =  $000a1640;
+   DBLPALEXTRALORESFF_KEY        =  $000a1204;
+   DBLPALEXTRALORESHAMFF_KEY     =  $000a1a04;
+   DBLPALEXTRALORESEHBFF_KEY     =  $000a1284;
+   DBLPALEXTRALORESDPFFF_KEY     =  $000a1604;
+   DBLPALEXTRALORESDPF2FF_KEY    =  $000a1644;
+   DBLPALEXTRALORESLACE_KEY      =  $000a1205;
+   DBLPALEXTRALORESHAMLACE_KEY   =  $000a1a05;
+   DBLPALEXTRALORESEHBLACE_KEY   =  $000a1285;
+   DBLPALEXTRALORESDPFLACE_KEY   =  $000a1605;
+   DBLPALEXTRALORESDPF2LACE_KEY  =  $000a1645;
+
+
+{ Use these tags for passing to BestModeID() (V39) }
+
+   SPECIAL_FLAGS = $100E;
+   { Original:
+     SPECIAL_FLAGS = DIPF_IS_DUALPF OR DIPF_IS_PF2PRI OR DIPF_IS_HAM OR DIPF_IS_EXTRAHALFBRITE;
+     ( Mu?te aufgrund eines Fehler in PCQ ge?ndert werden )
+   }
+
+
+   BIDTAG_DIPFMustHave     = $80000001;      { mask of the DIPF_ flags the ModeID must have }
+                                { Default - NULL }
+   BIDTAG_DIPFMustNotHave  = $80000002;      { mask of the DIPF_ flags the ModeID must not have }
+                                { Default - SPECIAL_FLAGS }
+   BIDTAG_ViewPort         = $80000003;      { ViewPort for which a ModeID is sought. }
+                                { Default - NULL }
+   BIDTAG_NominalWidth     = $80000004;      { \ together make the aspect ratio and }
+   BIDTAG_NominalHeight    = $80000005;      { / override the vp->Width/Height. }
+                                { Default - SourceID NominalDimensionInfo,
+                                 * or vp->DWidth/Height, or (640 * 200),
+                                 * in that preferred order.
+                                 }
+   BIDTAG_DesiredWidth     = $80000006;      { \ Nominal Width and Height of the }
+   BIDTAG_DesiredHeight    = $80000007;      { / returned ModeID. }
+                                { Default - same as Nominal }
+   BIDTAG_Depth            = $80000008;      { ModeID must support this depth. }
+                                { Default - vp->RasInfo->BitMap->Depth or 1 }
+   BIDTAG_MonitorID        = $80000009;      { ModeID must use this monitor. }
+                                { Default - use best monitor available }
+   BIDTAG_SourceID         = $8000000a;      { instead of a ViewPort. }
+                                { Default - VPModeID(vp) if BIDTAG_ViewPort is
+                                 * specified, else leave the DIPFMustHave and
+                                 * DIPFMustNotHave values untouched.
+                                 }
+   BIDTAG_RedBits        =  $8000000b;      { \                            }
+   BIDTAG_BlueBits       =  $8000000c;      {  > Match up from the database }
+   BIDTAG_GreenBits      =  $8000000d;      { /                            }
+                                            { Default - 4 }
+   BIDTAG_GfxPrivate     =  $8000000e;      { Private }
+
+
+const
+
+{ bplcon0 defines }
+
+    MODE_640    = $8000;
+    PLNCNTMSK   = $7;           { how many bit planes? }
+                                { 0 = none, 1->6 = 1->6, 7 = reserved }
+    PLNCNTSHFT  = 12;           { bits to shift for bplcon0 }
+    PF2PRI      = $40;          { bplcon2 bit }
+    COLORON     = $0200;        { disable color burst }
+    DBLPF       = $400;
+    HOLDNMODIFY = $800;
+    INTERLACE   = 4;            { interlace mode for 400 }
+
+{ bplcon1 defines }
+
+    PFA_FINE_SCROLL             = $F;
+    PFB_FINE_SCROLL_SHIFT       = 4;
+    PF_FINE_SCROLL_MASK         = $F;
+
+{ display window start and stop defines }
+
+    DIW_HORIZ_POS       = $7F;  { horizontal start/stop }
+    DIW_VRTCL_POS       = $1FF; { vertical start/stop }
+    DIW_VRTCL_POS_SHIFT = $7;
+
+{ Data fetch start/stop horizontal position }
+
+    DFTCH_MASK  = $FF;
+
+{ vposr bits }
+
+    VPOSRLOF    = $8000;
+
+  {   include define file for displayinfo database }
+
+{ the "public" handle to a DisplayInfoRecord }
+Type
+
+ DisplayInfoHandle = Pointer;
+
+{ datachunk type identifiers }
+
+CONST
+ DTAG_DISP            =   $80000000;
+ DTAG_DIMS            =   $80001000;
+ DTAG_MNTR            =   $80002000;
+ DTAG_NAME            =   $80003000;
+ DTAG_VEC             =   $80004000;      { internal use only }
+
+Type
+
+  pQueryHeader = ^tQueryHeader;
+  tQueryHeader = record
+   tructID,                    { datachunk type identifier }
+   DisplayID,                  { copy of display record key   }
+   SkipID,                     { TAG_SKIP -- see tagitems.h }
+   Length  :  Cardinal;         { length of local data in double-longwords }
+  END;
+
+  pDisplayInfo = ^tDisplayInfo;
+  tDisplayInfo = record
+   Header : tQueryHeader;
+   NotAvailable : Word;    { IF NULL available, else see defines }
+   PropertyFlags : Cardinal;  { Properties of this mode see defines }
+   Resolution : tPoint;     { ticks-per-pixel X/Y                 }
+   PixelSpeed : Word;     { aproximation in nanoseconds         }
+   NumStdSprites : Word;  { number of standard amiga sprites    }
+   PaletteRange : Word;   { distinguishable shades available    }
+   SpriteResolution : tPoint; { std sprite ticks-per-pixel X/Y    }
+   pad : Array[0..3] of Byte;
+   RedBits     : Byte;
+   GreenBits   : Byte;
+   BlueBits    : Byte;
+   pad2        : array [0..4] of Byte;
+   reserved : Array[0..1] of Cardinal;    { terminator }
+  END;
+
+{ availability }
+
+CONST
+ DI_AVAIL_NOCHIPS        =$0001;
+ DI_AVAIL_NOMONITOR      =$0002;
+ DI_AVAIL_NOTWITHGENLOCK =$0004;
+
+{ mode properties }
+
+ DIPF_IS_LACE          =  $00000001;
+ DIPF_IS_DUALPF        =  $00000002;
+ DIPF_IS_PF2PRI        =  $00000004;
+ DIPF_IS_HAM           =  $00000008;
+
+ DIPF_IS_ECS           =  $00000010;      {      note: ECS modes (SHIRES, VGA, AND **
+                                                 PRODUCTIVITY) do not support      **
+                                                 attached sprites.                 **
+                                                                                        }
+ DIPF_IS_AA            =  $00010000;      { AA modes - may only be available
+                                                ** if machine has correct memory
+                                                ** type to support required
+                                                ** bandwidth - check availability.
+                                                ** (V39)
+                                                }
+ DIPF_IS_PAL           =  $00000020;
+ DIPF_IS_SPRITES       =  $00000040;
+ DIPF_IS_GENLOCK       =  $00000080;
+
+ DIPF_IS_WB            =  $00000100;
+ DIPF_IS_DRAGGABLE     =  $00000200;
+ DIPF_IS_PANELLED      =  $00000400;
+ DIPF_IS_BEAMSYNC      =  $00000800;
+
+ DIPF_IS_EXTRAHALFBRITE = $00001000;
+
+{ The following DIPF_IS_... flags are new for V39 }
+  DIPF_IS_SPRITES_ATT           =  $00002000;      { supports attached sprites }
+  DIPF_IS_SPRITES_CHNG_RES      =  $00004000;      { supports variable sprite resolution }
+  DIPF_IS_SPRITES_BORDER        =  $00008000;      { sprite can be displayed in the border }
+  DIPF_IS_SCANDBL               =  $00020000;      { scan doubled }
+  DIPF_IS_SPRITES_CHNG_BASE     =  $00040000;
+                                                   { can change the sprite base colour }
+  DIPF_IS_SPRITES_CHNG_PRI      =  $00080000;
+                                                                                        { can change the sprite priority
+                                                                                        ** with respect to the playfield(s).
+                                                                                        }
+  DIPF_IS_DBUFFER       =  $00100000;      { can support double buffering }
+  DIPF_IS_PROGBEAM      =  $00200000;      { is a programmed beam-sync mode }
+  DIPF_IS_FOREIGN       =  $80000000;      { this mode is not native to the Amiga }
+
+Type
+ pDimensionInfo =^tDimensionInfo;
+ tDimensionInfo = record
+  Header : tQueryHeader;
+  MaxDepth,             { log2( max number of colors ) }
+  MinRasterWidth,       { minimum width in pixels      }
+  MinRasterHeight,      { minimum height in pixels     }
+  MaxRasterWidth,       { maximum width in pixels      }
+  MaxRasterHeight : Word;      { maximum height in pixels     }
+  Nominal,              { "standard" dimensions        }
+  MaxOScan,             { fixed, hardware dependant    }
+  VideoOScan,           { fixed, hardware dependant    }
+  TxtOScan,             { editable via preferences     }
+  StdOScan  : tRectangle; { editable via preferences     }
+  pad  : Array[0..13] of Byte;
+  reserved : Array[0..1] of Longint;          { terminator }
+ END;
+
+ pMonitorInfo = ^tMonitorInfo;
+ tMonitorInfo = record
+  Header : tQueryHeader;
+  Mspc   : pMonitorSpec;         { pointer to monitor specification  }
+  ViewPosition,                    { editable via preferences          }
+  ViewResolution : tPoint;          { standard monitor ticks-per-pixel  }
+  ViewPositionRange : tRectangle;   { fixed, hardware dependant }
+  TotalRows,                       { display height in scanlines       }
+  TotalColorClocks,                { scanline width in 280 ns units    }
+  MinRow        : Word;            { absolute minimum active scanline  }
+  Compatibility : smallint;           { how this coexists with others     }
+  pad : Array[0..31] of Byte;
+  MouseTicks    : tPoint;
+  DefaultViewPosition : tPoint;
+  PreferredModeID : Cardinal;
+  reserved : Array[0..1] of Cardinal;          { terminator }
+ END;
+
+{ monitor compatibility }
+
+CONST
+ MCOMPAT_MIXED =  0;       { can share display with other MCOMPAT_MIXED }
+ MCOMPAT_SELF  =  1;       { can share only within same monitor }
+ MCOMPAT_NOBODY= -1;       { only one viewport at a time }
+
+ DISPLAYNAMELEN = 32;
+
+Type
+ pNameInfo = ^tNameInfo;
+ tNameInfo = record
+  Header : tQueryHeader;
+  Name   : Array[0..DISPLAYNAMELEN-1] of Char;
+  reserved : Array[0..1] of Cardinal;          { terminator }
+ END;
+
+
+{****************************************************************************}
+
+{ The following VecInfo structure is PRIVATE, for our use only
+ * Touch these, and burn! (V39)
+ }
+Type
+ pVecInfo = ^tVecInfo;
+ tVecInfo = record
+        Header  : tQueryHeader;
+        Vec     : Pointer;
+        Data    : Pointer;
+        vi_Type : WORD;               { Type in C Includes }
+        pad     : Array[0..2] of WORD;
+        reserved : Array[0..1] of Cardinal;
+ end;
+
+
+CONST
+ VTAG_END_CM            = $00000000;
+ VTAG_CHROMAKEY_CLR     = $80000000;
+ VTAG_CHROMAKEY_SET     = $80000001;
+ VTAG_BITPLANEKEY_CLR   = $80000002;
+ VTAG_BITPLANEKEY_SET   = $80000003;
+ VTAG_BORDERBLANK_CLR   = $80000004;
+ VTAG_BORDERBLANK_SET   = $80000005;
+ VTAG_BORDERNOTRANS_CLR = $80000006;
+ VTAG_BORDERNOTRANS_SET = $80000007;
+ VTAG_CHROMA_PEN_CLR    = $80000008;
+ VTAG_CHROMA_PEN_SET    = $80000009;
+ VTAG_CHROMA_PLANE_SET  = $8000000A;
+ VTAG_ATTACH_CM_SET     = $8000000B;
+ VTAG_NEXTBUF_CM        = $8000000C;
+ VTAG_BATCH_CM_CLR      = $8000000D;
+ VTAG_BATCH_CM_SET      = $8000000E;
+ VTAG_NORMAL_DISP_GET   = $8000000F;
+ VTAG_NORMAL_DISP_SET   = $80000010;
+ VTAG_COERCE_DISP_GET   = $80000011;
+ VTAG_COERCE_DISP_SET   = $80000012;
+ VTAG_VIEWPORTEXTRA_GET = $80000013;
+ VTAG_VIEWPORTEXTRA_SET = $80000014;
+ VTAG_CHROMAKEY_GET     = $80000015;
+ VTAG_BITPLANEKEY_GET   = $80000016;
+ VTAG_BORDERBLANK_GET   = $80000017;
+ VTAG_BORDERNOTRANS_GET = $80000018;
+ VTAG_CHROMA_PEN_GET    = $80000019;
+ VTAG_CHROMA_PLANE_GET  = $8000001A;
+ VTAG_ATTACH_CM_GET     = $8000001B;
+ VTAG_BATCH_CM_GET      = $8000001C;
+ VTAG_BATCH_ITEMS_GET   = $8000001D;
+ VTAG_BATCH_ITEMS_SET   = $8000001E;
+ VTAG_BATCH_ITEMS_ADD   = $8000001F;
+ VTAG_VPMODEID_GET      = $80000020;
+ VTAG_VPMODEID_SET      = $80000021;
+ VTAG_VPMODEID_CLR      = $80000022;
+ VTAG_USERCLIP_GET      = $80000023;
+ VTAG_USERCLIP_SET      = $80000024;
+ VTAG_USERCLIP_CLR      = $80000025;
+{ The following tags are V39 specific. They will be ignored (returing error -3) by
+        earlier versions }
+ VTAG_PF1_BASE_GET             =  $80000026;
+ VTAG_PF2_BASE_GET             =  $80000027;
+ VTAG_SPEVEN_BASE_GET          =  $80000028;
+ VTAG_SPODD_BASE_GET           =  $80000029;
+ VTAG_PF1_BASE_SET             =  $8000002a;
+ VTAG_PF2_BASE_SET             =  $8000002b;
+ VTAG_SPEVEN_BASE_SET          =  $8000002c;
+ VTAG_SPODD_BASE_SET           =  $8000002d;
+ VTAG_BORDERSPRITE_GET         =  $8000002e;
+ VTAG_BORDERSPRITE_SET         =  $8000002f;
+ VTAG_BORDERSPRITE_CLR         =  $80000030;
+ VTAG_SPRITERESN_SET           =  $80000031;
+ VTAG_SPRITERESN_GET           =  $80000032;
+ VTAG_PF1_TO_SPRITEPRI_SET     =  $80000033;
+ VTAG_PF1_TO_SPRITEPRI_GET     =  $80000034;
+ VTAG_PF2_TO_SPRITEPRI_SET     =  $80000035;
+ VTAG_PF2_TO_SPRITEPRI_GET     =  $80000036;
+ VTAG_IMMEDIATE                =  $80000037;
+ VTAG_FULLPALETTE_SET          =  $80000038;
+ VTAG_FULLPALETTE_GET          =  $80000039;
+ VTAG_FULLPALETTE_CLR          =  $8000003A;
+ VTAG_DEFSPRITERESN_SET        =  $8000003B;
+ VTAG_DEFSPRITERESN_GET        =  $8000003C;
+
+{ all the following tags follow the new, rational standard for videocontrol tags:
+ * VC_xxx,state         set the state of attribute 'xxx' to value 'state'
+ * VC_xxx_QUERY,&var    get the state of attribute 'xxx' and store it into the longword
+ *                      pointed to by &var.
+ *
+ * The following are new for V40:
+ }
+
+ VC_IntermediateCLUpdate       =  $80000080;
+        { default=true. When set graphics will update the intermediate copper
+         * lists on color changes, etc. When false, it won't, and will be faster.
+         }
+ VC_IntermediateCLUpdate_Query =  $80000081;
+
+ VC_NoColorPaletteLoad         =  $80000082;
+        { default = false. When set, graphics will only load color 0
+         * for this ViewPort, and so the ViewPort's colors will come
+         * from the previous ViewPort's.
+         *
+         * NB - Using this tag and VTAG_FULLPALETTE_SET together is undefined.
+         }
+ VC_NoColorPaletteLoad_Query   =  $80000083;
+
+ VC_DUALPF_Disable             =  $80000084;
+        { default = false. When this flag is set, the dual-pf bit
+           in Dual-Playfield screens will be turned off. Even bitplanes
+           will still come from the first BitMap and odd bitplanes
+           from the second BitMap, and both R[xy]Offsets will be
+           considered. This can be used (with appropriate palette
+           selection) for cross-fades between differently scrolling
+           images.
+           When this flag is turned on, colors will be loaded for
+           the viewport as if it were a single viewport of depth
+           depth1+depth2 }
+ VC_DUALPF_Disable_Query       =  $80000085;
+
+
+const
+
+    SPRITE_ATTACHED     = $80;
+
+type
+
+    pSimpleSprite = ^tSimpleSprite;
+    tSimpleSprite = record
+        posctldata      : Pointer;
+        height          : Word;
+        x,y             : Word;        { current position }
+        num             : Word;
+    end;
+
+    pExtSprite = ^tExtSprite;
+    tExtSprite = record
+        es_SimpleSprite : tSimpleSprite;         { conventional simple sprite structure }
+        es_wordwidth    : WORD;                 { graphics use only, subject to change }
+        es_flags        : WORD;                 { graphics use only, subject to change }
+    end;
+
+const
+{ tags for AllocSpriteData() }
+ SPRITEA_Width          = $81000000;
+ SPRITEA_XReplication   = $81000002;
+ SPRITEA_YReplication   = $81000004;
+ SPRITEA_OutputHeight   = $81000006;
+ SPRITEA_Attached       = $81000008;
+ SPRITEA_OldDataFormat  = $8100000a;      { MUST pass in outputheight if using this tag }
+
+{ tags for GetExtSprite() }
+ GSTAG_SPRITE_NUM = $82000020;
+ GSTAG_ATTACHED   = $82000022;
+ GSTAG_SOFTSPRITE = $82000024;
+
+{ tags valid for either GetExtSprite or ChangeExtSprite }
+ GSTAG_SCANDOUBLED     =  $83000000;      { request "NTSC-Like" height if possible. }
+
+
+Type
+    pBitScaleArgs = ^tBitScaleArgs;
+    tBitScaleArgs = record
+    bsa_SrcX, bsa_SrcY,                 { source origin }
+    bsa_SrcWidth, bsa_SrcHeight,        { source size }
+    bsa_XSrcFactor, bsa_YSrcFactor,     { scale factor denominators }
+    bsa_DestX, bsa_DestY,               { destination origin }
+    bsa_DestWidth, bsa_DestHeight,      { destination size result }
+    bsa_XDestFactor, bsa_YDestFactor : Word;   { scale factor numerators }
+    bsa_SrcBitMap,                           { source BitMap }
+    bsa_DestBitMap : pBitMap;              { destination BitMap }
+    bsa_Flags   : Cardinal;              { reserved.  Must be zero! }
+    bsa_XDDA, bsa_YDDA : Word;         { reserved }
+    bsa_Reserved1,
+    bsa_Reserved2 : Longint;
+   END;
+
+  {    tag definitions for GetRPAttr, SetRPAttr     }
+
+const
+ RPTAG_Font            =  $80000000;      { get/set font }
+ RPTAG_APen            =  $80000002;      { get/set apen }
+ RPTAG_BPen            =  $80000003;      { get/set bpen }
+ RPTAG_DrMd            =  $80000004;      { get/set draw mode }
+ RPTAG_OutlinePen      =  $80000005;      { get/set outline pen. corrected case. }
+ RPTAG_WriteMask       =  $80000006;      { get/set WriteMask }
+ RPTAG_MaxPen          =  $80000007;      { get/set maxpen }
+
+ RPTAG_DrawBounds      =  $80000008;      { get only rastport draw bounds. pass &rect }
+
+
+
+
+TYPE
+
+ pRegionRectangle = ^tRegionRectangle;
+ tRegionRectangle = record
+    Next, Prev  : pRegionRectangle;
+    bounds      : tRectangle;
+ END;
+
+ pRegion = ^tRegion;
+ tRegion = record
+    bounds      : tRectangle;
+    RegionRectangle  : pRegionRectangle;
+ END;
+
+type
+
+    pGfxBase = ^tGfxBase;
+    tGfxBase = record
+        LibNode         : tLibrary;
+        ActiView        : pView;      { ViewPtr }
+        copinit         : pcopinit; { (copinitptr) ptr to copper start up list }
+        cia             : Pointer;      { for 8520 resource use }
+        blitter         : Pointer;      { for future blitter resource use }
+        LOFlist         : Pointer;
+        SHFlist         : Pointer;
+        blthd,
+        blttl           : pbltnode;
+        bsblthd,
+        bsblttl         : pbltnode;      { Previous four are (bltnodeptr) }
+        vbsrv,
+        timsrv,
+        bltsrv          : tInterrupt;
+        TextFonts       : tList;
+        DefaultFont     : pTextFont;      { TextFontPtr }
+        Modes           : Word;        { copy of current first bplcon0 }
+        VBlank          : Shortint;
+        Debug           : Shortint;
+        BeamSync        : smallint;
+        system_bplcon0  : smallint; { it is ored into each bplcon0 for display }
+        SpriteReserved  : Byte;
+        bytereserved    : Byte;
+        Flags           : Word;
+        BlitLock        : smallint;
+        BlitNest        : smallint;
+
+        BlitWaitQ       : tList;
+        BlitOwner       : pTask;      { TaskPtr }
+        TOF_WaitQ       : tList;
+        DisplayFlags    : Word;        { NTSC PAL GENLOC etc}
+
+                { Display flags are determined at power on }
+
+        SimpleSprites   : Pointer;      { SimpleSpritePtr ptr }
+        MaxDisplayRow   : Word;        { hardware stuff, do not use }
+        MaxDisplayColumn : Word;       { hardware stuff, do not use }
+        NormalDisplayRows : Word;
+        NormalDisplayColumns : Word;
+
+        { the following are for standard non interlace, 1/2 wb width }
+
+        NormalDPMX      : Word;        { Dots per meter on display }
+        NormalDPMY      : Word;        { Dots per meter on display }
+        LastChanceMemory : pSignalSemaphore;     { SignalSemaphorePtr }
+        LCMptr          : Pointer;
+        MicrosPerLine   : Word;        { 256 time usec/line }
+        MinDisplayColumn : Word;
+        ChipRevBits0    : Byte;
+        MemType         : Byte;
+        crb_reserved  :  Array[0..3] of Byte;
+        monitor_id  : Word;             { normally null }
+        hedley  : Array[0..7] of Cardinal;
+        hedley_sprites  : Array[0..7] of Cardinal;     { sprite ptrs for intuition mouse }
+        hedley_sprites1 : Array[0..7] of Cardinal;            { sprite ptrs for intuition mouse }
+        hedley_count    : smallint;
+        hedley_flags    : Word;
+        hedley_tmp      : smallint;
+        hash_table      : Pointer;
+        current_tot_rows : Word;
+        current_tot_cclks : Word;
+        hedley_hint     : Byte;
+        hedley_hint2    : Byte;
+        nreserved       : Array[0..3] of Cardinal;
+        a2024_sync_raster : Pointer;
+        control_delta_pal : Word;
+        control_delta_ntsc : Word;
+        current_monitor : pMonitorSpec;
+        MonitorList     : tList;
+        default_monitor : pMonitorSpec;
+        MonitorListSemaphore : pSignalSemaphore;
+        DisplayInfoDataBase : Pointer;
+        TopLine      : Word;
+        ActiViewCprSemaphore : pSignalSemaphore;
+        UtilityBase  : Pointer;           { for hook AND tag utilities   }
+        ExecBase     : Pointer;              { to link with rom.lib }
+        bwshifts     : Pointer;
+        StrtFetchMasks,
+        StopFetchMasks,
+        Overrun,
+        RealStops    : Pointer;
+        SpriteWidth,                    { current width (in words) of sprites }
+        SpriteFMode  : WORD;            { current sprite fmode bits    }
+        SoftSprites,                    { bit mask of size change knowledgeable sprites }
+        arraywidth   : Shortint;
+        DefaultSpriteWidth : WORD;      { what width intuition wants }
+        SprMoveDisable : Shortint;
+        WantChips,
+        BoardMemType,
+        Bugs         : Byte;
+        gb_LayersBase : Pointer;
+        ColorMask    : Cardinal;
+        IVector,
+        IData        : Pointer;
+        SpecialCounter : Cardinal;         { special for double buffering }
+        DBList       : Pointer;
+        MonitorFlags : WORD;
+        ScanDoubledSprites,
+        BP3Bits      : Byte;
+        MonitorVBlank  : tAnalogSignalInterval;
+        natural_monitor  : pMonitorSpec;
+        ProgData     : Pointer;
+        ExtSprites   : Byte;
+        pad3         : Byte;
+        GfxFlags     : WORD;
+        VBCounter    : Cardinal;
+        HashTableSemaphore  : pSignalSemaphore;
+        HWEmul       : Array[0..8] of Pointer;
+    end;
+
+const
+
+    NTSC        = 1;
+    GENLOC      = 2;
+    PAL         = 4;
+    TODA_SAFE   = 8;
+
+    BLITMSG_FAULT = 4;
+
+{ bits defs for ChipRevBits }
+   GFXB_BIG_BLITS = 0 ;
+   GFXB_HR_AGNUS  = 0 ;
+   GFXB_HR_DENISE = 1 ;
+   GFXB_AA_ALICE  = 2 ;
+   GFXB_AA_LISA   = 3 ;
+   GFXB_AA_MLISA  = 4 ;      { internal use only. }
+
+   GFXF_BIG_BLITS = 1 ;
+   GFXF_HR_AGNUS  = 1 ;
+   GFXF_HR_DENISE = 2 ;
+   GFXF_AA_ALICE  = 4 ;
+   GFXF_AA_LISA   = 8 ;
+   GFXF_AA_MLISA  = 16;      { internal use only }
+
+{ Pass ONE of these to SetChipRev() }
+   SETCHIPREV_A   = GFXF_HR_AGNUS;
+   SETCHIPREV_ECS = (GFXF_HR_AGNUS OR GFXF_HR_DENISE);
+   SETCHIPREV_AA  = (GFXF_AA_ALICE OR GFXF_AA_LISA OR SETCHIPREV_ECS);
+   SETCHIPREV_BEST= $ffffffff;
+
+{ memory type }
+   BUS_16         = 0;
+   NML_CAS        = 0;
+   BUS_32         = 1;
+   DBL_CAS        = 2;
+   BANDWIDTH_1X   = (BUS_16 OR NML_CAS);
+   BANDWIDTH_2XNML= BUS_32;
+   BANDWIDTH_2XDBL= DBL_CAS;
+   BANDWIDTH_4X   = (BUS_32 OR DBL_CAS);
+
+{ GfxFlags (private) }
+   NEW_DATABASE   = 1;
+
+   GRAPHICSNAME   : PChar  = 'graphics.library';
+
+
+var
+  GfxBase : Pointer;
+
+
+function BltBitMap(srcBitMap : pBitMap location 'a0'; xSrc : LongInt location 'd0'; ySrc : LongInt location 'd1'; destBitMap : pBitMap location 'a1'; xDest : LongInt location 'd2'; yDest : LongInt location 'd3'; xSize : LongInt location 'd4'; ySize : LongInt location 'd5'; minterm : CARDINAL location 'd6'; mask : CARDINAL location 'd7'; tempA : pCHAR location 'a2') : LongInt;
+SysCall GfxBase 030;
+
+procedure BltTemplate(source : pCHAR location 'a0'; xSrc : LongInt location 'd0'; srcMod : LongInt location 'd1'; destRP : pRastPort location 'a1'; xDest : LongInt location 'd2'; yDest : LongInt location 'd3'; xSize : LongInt location 'd4'; ySize : LongInt location 'd5');
+SysCall GfxBase 036;
+
+procedure ClearEOL(rp : pRastPort location 'a1');
+SysCall GfxBase 042;
+
+procedure ClearScreen(rp : pRastPort location 'a1');
+SysCall GfxBase 048;
+
+function TextLength(rp : pRastPort location 'a1'; string1 : pSHORTINT location 'a0'; count : CARDINAL location 'd0') : INTEGER;
+SysCall GfxBase 054;
+
+function Text(rp : pRastPort location 'a1'; string1: pSHORTINT location 'a0'; count : CARDINAL location 'd0') : LongInt;
+SysCall GfxBase 060;
+
+function SetFont(rp : pRastPort location 'a1'; textFont : pTextFont location 'a0') : LongInt;
+SysCall GfxBase 066;
+
+function OpenFont(textAttr : pTextAttr location 'a0') : pTextFont;
+SysCall GfxBase 072;
+
+procedure CloseFont(textFont : pTextFont location 'a1');
+SysCall GfxBase 078;
+
+function AskSoftStyle(rp : pRastPort location 'a1') : CARDINAL;
+SysCall GfxBase 084;
+
+function SetSoftStyle(rp : pRastPort location 'a1'; style : CARDINAL location 'd0'; enable : CARDINAL location 'd1') : CARDINAL;
+SysCall GfxBase 090;
+
+procedure AddBob(bob : pBob location 'a0'; rp : pRastPort location 'a1');
+SysCall GfxBase 096;
+
+procedure AddVSprite(vSprite : pVSprite location 'a0'; rp : pRastPort location 'a1');
+SysCall GfxBase 102;
+
+procedure DoCollision(rp : pRastPort location 'a1');
+SysCall GfxBase 108;
+
+procedure DrawGList(rp : pRastPort location 'a1'; vp : pViewPort location 'a0');
+SysCall GfxBase 114;
+
+procedure InitGels(head : pVSprite location 'a0'; tail : pVSprite location 'a1'; gelsInfo : pGelsInfo location 'a2');
+SysCall GfxBase 120;
+
+procedure InitMasks(vSprite : pVSprite location 'a0');
+SysCall GfxBase 126;
+
+procedure RemIBob(bob : pBob location 'a0'; rp : pRastPort location 'a1'; vp : pViewPort location 'a2');
+SysCall GfxBase 132;
+
+procedure RemVSprite(vSprite : pVSprite location 'a0');
+SysCall GfxBase 138;
+
+procedure SortGList(rp : pRastPort location 'a1');
+SysCall GfxBase 150;
+
+procedure AddAnimOb(anOb : pAnimOb location 'a0'; anKey : ppAnimOb location 'a1'; rp : pRastPort location 'a2');
+SysCall GfxBase 156;
+
+procedure Animate(anKey : ppAnimOb location 'a0'; rp : pRastPort location 'a1');
+SysCall GfxBase 162;
+
+function GetGBuffers(anOb : pAnimOb location 'a0'; rp : pRastPort location 'a1'; flag : LongInt location 'd0') : BOOLEAN;
+SysCall GfxBase 168;
+
+procedure InitGMasks(anOb : pAnimOb location 'a0');
+SysCall GfxBase 174;
+
+procedure DrawEllipse(rp : pRastPort location 'a1'; xCenter : LongInt location 'd0'; yCenter : LongInt location 'd1'; a : LongInt location 'd2'; b : LongInt location 'd3');
+SysCall GfxBase 180;
+
+function AreaEllipse(rp : pRastPort location 'a1'; xCenter : LongInt location 'd0'; yCenter : LongInt location 'd1'; a : LongInt location 'd2'; b : LongInt location 'd3') : LongInt;
+SysCall GfxBase 186;
+
+procedure LoadRGB4(vp : pViewPort location 'a0'; VAR colors : Integer location 'a1'; count : LongInt location 'd0');
+SysCall GfxBase 192;
+
+procedure InitRastPort(rp : pRastPort location 'a1');
+SysCall GfxBase 198;
+
+procedure InitVPort(vp : pViewPort location 'a0');
+SysCall GfxBase 204;
+
+function MrgCop(view : pView location 'a1') : CARDINAL;
+SysCall GfxBase 210;
+
+function MakeVPort(view : pView location 'a0'; vp : pViewPort location 'a1') : CARDINAL;
+SysCall GfxBase 216;
+
+procedure LoadView(view : pView location 'a1');
+SysCall GfxBase 222;
+
+procedure WaitBlit;
+SysCall GfxBase 228;
+
+procedure SetRast(rp : pRastPort location 'a1'; pen : CARDINAL location 'd0');
+SysCall GfxBase 234;
+
+procedure Move(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1');
+SysCall GfxBase 240;
+
+procedure Draw(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1');
+SysCall GfxBase 246;
+
+function AreaMove(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1') : LongInt;
+SysCall GfxBase 252;
+
+function AreaDraw(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1') : LongInt;
+SysCall GfxBase 258;
+
+function AreaEnd(rp : pRastPort location 'a1') : LongInt;
+SysCall GfxBase 264;
+
+procedure WaitTOF;
+SysCall GfxBase 270;
+
+procedure QBlit(blit : pbltnode location 'a1');
+SysCall GfxBase 276;
+
+procedure InitArea(areaInfo : pAreaInfo location 'a0'; vectorBuffer : POINTER location 'a1'; maxVectors : LongInt location 'd0');
+SysCall GfxBase 282;
+
+procedure SetRGB4(vp : pViewPort location 'a0'; index : LongInt location 'd0'; red : CARDINAL location 'd1'; green : CARDINAL location 'd2'; blue : CARDINAL location 'd3');
+SysCall GfxBase 288;
+
+procedure QBSBlit(blit : pbltnode location 'a1');
+SysCall GfxBase 294;
+
+procedure BltClear(memBlock : pCHAR location 'a1'; byteCount : CARDINAL location 'd0'; flags : CARDINAL location 'd1');
+SysCall GfxBase 300;
+
+procedure RectFill(rp : pRastPort location 'a1'; xMin : LongInt location 'd0'; yMin : LongInt location 'd1'; xMax : LongInt location 'd2'; yMax : LongInt location 'd3');
+SysCall GfxBase 306;
+
+procedure BltPattern(rp : pRastPort location 'a1'; mask : pCHAR location 'a0'; xMin : LongInt location 'd0'; yMin : LongInt location 'd1'; xMax : LongInt location 'd2'; yMax : LongInt location 'd3'; maskBPR : CARDINAL location 'd4');
+SysCall GfxBase 312;
+
+function ReadPixel(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1') : CARDINAL;
+SysCall GfxBase 318;
+
+function WritePixel(rp : pRastPort location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1') : LongInt;
+SysCall GfxBase 324;
+
+function Flood(rp : pRastPort location 'a1'; mode : CARDINAL location 'd2'; x : LongInt location 'd0'; y : LongInt location 'd1') : BOOLEAN;
+SysCall GfxBase 330;
+
+procedure PolyDraw(rp : pRastPort location 'a1'; count : LongInt location 'd0'; VAR polyTable : INTEGER location 'a0');
+SysCall GfxBase 336;
+
+procedure SetAPen(rp : pRastPort location 'a1'; pen : CARDINAL location 'd0');
+SysCall GfxBase 342;
+
+procedure SetBPen(rp : pRastPort location 'a1'; pen : CARDINAL location 'd0');
+SysCall GfxBase 348;
+
+procedure SetDrMd(rp : pRastPort location 'a1'; drawMode : CARDINAL location 'd0');
+SysCall GfxBase 354;
+
+procedure InitView(view : pView location 'a1');
+SysCall GfxBase 360;
+
+procedure CBump(copList : pUCopList location 'a1');
+SysCall GfxBase 366;
+
+procedure CMove(copList : pUCopList location 'a1'; destination : POINTER location 'd0'; data : LongInt location 'd1');
+SysCall GfxBase 372;
+
+procedure CWait(copList : pUCopList location 'a1'; v : LongInt location 'd0'; h : LongInt location 'd1');
+SysCall GfxBase 378;
+
+function VBeamPos : LongInt;
+SysCall GfxBase 384;
+
+procedure InitBitMap(bitMap : pBitMap location 'a0'; depth : LongInt location 'd0'; width : LongInt location 'd1'; height : LongInt location 'd2');
+SysCall GfxBase 390;
+
+procedure ScrollRaster(rp : pRastPort location 'a1'; dx : LongInt location 'd0'; dy : LongInt location 'd1'; xMin : LongInt location 'd2'; yMin : LongInt location 'd3'; xMax : LongInt location 'd4'; yMax : LongInt location 'd5');
+SysCall GfxBase 396;
+
+procedure WaitBOVP(vp : pViewPort location 'a0');
+SysCall GfxBase 402;
+
+function GetSprite(sprite : pSimpleSprite location 'a0'; num : LongInt location 'd0') : INTEGER;
+SysCall GfxBase 408;
+
+procedure FreeSprite(num : LongInt location 'd0');
+SysCall GfxBase 414;
+
+procedure ChangeSprite(vp : pViewPort location 'a0'; sprite : pSimpleSprite location 'a1'; VAR newData : Integer location 'a2');
+SysCall GfxBase 420;
+
+procedure MoveSprite(vp : pViewPort location 'a0'; sprite : pSimpleSprite location 'a1'; x : LongInt location 'd0'; y : LongInt location 'd1');
+SysCall GfxBase 426;
+
+procedure LockLayerRom(layer : pLayer location 'a5');
+SysCall GfxBase 432;
+
+procedure UnlockLayerRom(layer : pLayer location 'a5');
+SysCall GfxBase 438;
+
+procedure SyncSBitMap(layer : pLayer location 'a0');
+SysCall GfxBase 444;
+
+procedure CopySBitMap(layer : pLayer location 'a0');
+SysCall GfxBase 450;
+
+procedure OwnBlitter;
+SysCall GfxBase 456;
+
+procedure DisownBlitter;
+SysCall GfxBase 462;
+
+function InitTmpRas(tmpRas : pTmpRas location 'a0'; buffer : pCHAR location 'a1'; size : LongInt location 'd0') : pTmpRas;
+SysCall GfxBase 468;
+
+procedure AskFont(rp : pRastPort location 'a1'; textAttr : pTextAttr location 'a0');
+SysCall GfxBase 474;
+
+procedure AddFont(textFont : pTextFont location 'a1');
+SysCall GfxBase 480;
+
+procedure RemFont(textFont : pTextFont location 'a1');
+SysCall GfxBase 486;
+
+function AllocRaster(width : CARDINAL location 'd0'; height : CARDINAL location 'd1') : pCHAR;
+SysCall GfxBase 492;
+
+procedure FreeRaster(p : pCHAR location 'a0'; width : CARDINAL location 'd0'; height : CARDINAL location 'd1');
+SysCall GfxBase 498;
+
+procedure AndRectRegion(region : pRegion location 'a0'; rectangle : pRectangle location 'a1');
+SysCall GfxBase 504;
+
+function OrRectRegion(region : pRegion location 'a0'; rectangle : pRectangle location 'a1') : BOOLEAN;
+SysCall GfxBase 510;
+
+function NewRegion : pRegion;
+SysCall GfxBase 516;
+
+function ClearRectRegion(region : pRegion location 'a0'; rectangle : pRectangle location 'a1') : BOOLEAN;
+SysCall GfxBase 522;
+
+procedure ClearRegion(region : pRegion location 'a0');
+SysCall GfxBase 528;
+
+procedure DisposeRegion(region : pRegion location 'a0');
+SysCall GfxBase 534;
+
+procedure FreeVPortCopLists(vp : pViewPort location 'a0');
+SysCall GfxBase 540;
+
+procedure FreeCopList(copList : pCopList location 'a0');
+SysCall GfxBase 546;
+
+procedure ClipBlit(srcRP : pRastPort location 'a0'; xSrc : LongInt location 'd0'; ySrc : LongInt location 'd1'; destRP : pRastPort location 'a1'; xDest : LongInt location 'd2'; yDest : LongInt location 'd3'; xSize : LongInt location 'd4'; ySize : LongInt location 'd5'; minterm : CARDINAL location 'd6');
+SysCall GfxBase 552;
+
+function XorRectRegion(region : pRegion location 'a0'; rectangle : pRectangle location 'a1') : BOOLEAN;
+SysCall GfxBase 558;
+
+procedure FreeCprList(cprList : pcprlist location 'a0');
+SysCall GfxBase 564;
+
+function GetColorMap(entries : LongInt location 'd0') : pColorMap;
+SysCall GfxBase 570;
+
+procedure FreeColorMap(colorMap : pColorMap location 'a0');
+SysCall GfxBase 576;
+
+function GetRGB4(colorMap : pColorMap location 'a0'; entry : LongInt location 'd0') : CARDINAL;
+SysCall GfxBase 582;
+
+procedure ScrollVPort(vp : pViewPort location 'a0');
+SysCall GfxBase 588;
+
+function UCopperListInit(uCopList : pUCopList location 'a0'; n : LongInt location 'd0') : pCopList;
+SysCall GfxBase 594;
+
+procedure FreeGBuffers(anOb : pAnimOb location 'a0'; rp : pRastPort location 'a1'; flag : LongInt location 'd0');
+SysCall GfxBase 600;
+
+procedure BltBitMapRastPort(srcBitMap : pBitMap location 'a0'; xSrc : LongInt location 'd0'; ySrc : LongInt location 'd1'; destRP : pRastPort location 'a1'; xDest : LongInt location 'd2'; yDest : LongInt location 'd3'; xSize : LongInt location 'd4'; ySize : LongInt location 'd5'; minterm : CARDINAL location 'd6');
+SysCall GfxBase 606;
+
+function OrRegionRegion(srcRegion : pRegion location 'a0'; destRegion : pRegion location 'a1') : BOOLEAN;
+SysCall GfxBase 612;
+
+function XorRegionRegion(srcRegion : pRegion location 'a0'; destRegion : pRegion location 'a1') : BOOLEAN;
+SysCall GfxBase 618;
+
+function AndRegionRegion(srcRegion : pRegion location 'a0'; destRegion : pRegion location 'a1') : BOOLEAN;
+SysCall GfxBase 624;
+
+procedure SetRGB4CM(colorMap : pColorMap location 'a0'; index : LongInt location 'd0'; red : CARDINAL location 'd1'; green : CARDINAL location 'd2'; blue : CARDINAL location 'd3');
+SysCall GfxBase 630;
+
+procedure BltMaskBitMapRastPort(srcBitMap : pBitMap location 'a0'; xSrc : LongInt location 'd0'; ySrc : LongInt location 'd1'; destRP : pRastPort location 'a1'; xDest : LongInt location 'd2'; yDest : LongInt location 'd3'; xSize : LongInt location 'd4'; ySize : LongInt location 'd5'; minterm : CARDINAL location 'd6'; bltMask : pCHAR location 'a2');
+SysCall GfxBase 636;
+
+function AttemptLockLayerRom(layer : pLayer location 'a5') : BOOLEAN;
+SysCall GfxBase 654;
+
+function GfxNew(gfxNodeType : CARDINAL location 'd0') : POINTER;
+SysCall GfxBase 660;
+
+procedure GfxFree(gfxNodePtr : POINTER location 'a0');
+SysCall GfxBase 666;
+
+procedure GfxAssociate(associateNode : POINTER location 'a0'; gfxNodePtr : POINTER location 'a1');
+SysCall GfxBase 672;
+
+procedure BitMapScale(bitScaleArgs : pBitScaleArgs location 'a0');
+SysCall GfxBase 678;
+
+function ScalerDiv(factor : CARDINAL location 'd0'; numerator : CARDINAL location 'd1'; denominator : CARDINAL location 'd2') : Integer;
+SysCall GfxBase 684;
+
+function TextExtent(rp : pRastPort location 'a1'; string1: pSHORTINT location 'a0'; count : LongInt location 'd0'; textExtent : pTextExtent location 'a2') : INTEGER;
+SysCall GfxBase 690;
+
+function TextFit(rp : pRastPort location 'a1'; string1: pSHORTINT location 'a0'; strLen : CARDINAL location 'd0'; textExtent : pTextExtent location 'a2'; constrainingExtent : pTextExtent location 'a3'; strDirection : LongInt location 'd1'; constrainingBitWidth : CARDINAL location 'd2'; constrainingBitHeight : CARDINAL location 'd3') : CARDINAL;
+SysCall GfxBase 696;
+
+function GfxLookUp(associateNode : POINTER location 'a0') : POINTER;
+SysCall GfxBase 702;
+
+function VideoControl(colorMap : pColorMap location 'a0'; tagarray : pTagItem location 'a1') : BOOLEAN;
+SysCall GfxBase 708;
+
+function OpenMonitor(monitorName : pSHORTINT location 'a1'; displayID : CARDINAL location 'd0') : pMonitorSpec;
+SysCall GfxBase 714;
+
+function CloseMonitor(monitorSpec : pMonitorSpec location 'a0') : BOOLEAN;
+SysCall GfxBase 720;
+
+function FindDisplayInfo(displayID : CARDINAL location 'd0') : POINTER;
+SysCall GfxBase 726;
+
+function NextDisplayInfo(displayID : CARDINAL location 'd0') : CARDINAL;
+SysCall GfxBase 732;
+
+function GetDisplayInfoData(handle : POINTER location 'a0'; buf : POINTER location 'a1'; size : CARDINAL location 'd0'; tagID : CARDINAL location 'd1'; displayID : CARDINAL location 'd2') : CARDINAL;
+SysCall GfxBase 756;
+
+procedure FontExtent(font : pTextFont location 'a0'; fontExtent : pTextExtent location 'a1');
+SysCall GfxBase 762;
+
+function ReadPixelLine8(rp : pRastPort location 'a0'; xstart : CARDINAL location 'd0'; ystart : CARDINAL location 'd1'; width : CARDINAL location 'd2'; array1 : pCHAR location 'a2'; tempRP : pRastPort location 'a1') : LongInt;
+SysCall GfxBase 768;
+
+function WritePixelLine8(rp : pRastPort location 'a0'; xstart : CARDINAL location 'd0'; ystart : CARDINAL location 'd1'; width : CARDINAL location 'd2'; array1 : pCHAR location 'a2'; tempRP : pRastPort location 'a1') : LongInt;
+SysCall GfxBase 774;
+
+function ReadPixelArray8(rp : pRastPort location 'a0'; xstart : CARDINAL location 'd0'; ystart : CARDINAL location 'd1'; xstop : CARDINAL location 'd2'; ystop : CARDINAL location 'd3'; array1: pCHAR location 'a2'; temprp : pRastPort location 'a1') : LongInt;
+SysCall GfxBase 780;
+
+function WritePixelArray8(rp : pRastPort location 'a0'; xstart : CARDINAL location 'd0'; ystart : CARDINAL location 'd1'; xstop : CARDINAL location 'd2'; ystop : CARDINAL location 'd3'; array1: pCHAR location 'a2'; temprp : pRastPort location 'a1') : LongInt;
+SysCall GfxBase 786;
+
+function GetVPModeID(vp : pViewPort location 'a0') : LongInt;
+SysCall GfxBase 792;
+
+function ModeNotAvailable(modeID : CARDINAL location 'd0') : LongInt;
+SysCall GfxBase 798;
+
+function WeighTAMatch(reqTextAttr : pTTextAttr location 'a0'; targetTextAttr : pTextAttr location 'a1'; targetTags : pTagItem location 'a2') : INTEGER;
+SysCall GfxBase 804;
+
+procedure EraseRect(rp : pRastPort location 'a1'; xMin : LongInt location 'd0'; yMin : LongInt location 'd1'; xMax : LongInt location 'd2'; yMax : LongInt location 'd3');
+SysCall GfxBase 810;
+
+function ExtendFont(font : pTextFont location 'a0'; fontTags : pTagItem location 'a1') : CARDINAL;
+SysCall GfxBase 816;
+
+procedure StripFont(font : pTextFont location 'a0');
+SysCall GfxBase 822;
+
+function CalcIVG(v : pView location 'a0'; vp : pViewPort location 'a1') : Integer;
+SysCall GfxBase 828;
+
+function AttachPalExtra(cm : pColorMap location 'a0'; vp : pViewPort location 'a1') : LongInt;
+SysCall GfxBase 834;
+
+function ObtainBestPenA(cm : pColorMap location 'a0'; r : CARDINAL location 'd1'; g : CARDINAL location 'd2'; b : CARDINAL location 'd3'; tags : pTagItem location 'a1') : LongInt;
+SysCall GfxBase 840;
+
+procedure SetRGB32(vp : pViewPort location 'a0'; n : CARDINAL location 'd0'; r : CARDINAL location 'd1'; g : CARDINAL location 'd2'; b : CARDINAL location 'd3');
+SysCall GfxBase 852;
+
+function GetAPen(rp : pRastPort location 'a0') : CARDINAL;
+SysCall GfxBase 858;
+
+function GetBPen(rp : pRastPort location 'a0') : CARDINAL;
+SysCall GfxBase 864;
+
+function GetDrMd(rp : pRastPort location 'a0') : CARDINAL;
+SysCall GfxBase 870;
+
+function GetOutlinePen(rp : pRastPort location 'a0') : CARDINAL;
+SysCall GfxBase 876;
+
+procedure LoadRGB32(vp : pViewPort location 'a0'; VAR table : CARDINAL location 'a1');
+SysCall GfxBase 882;
+
+function SetChipRev(want : CARDINAL location 'd0') : CARDINAL;
+SysCall GfxBase 888;
+
+procedure SetABPenDrMd(rp : pRastPort location 'a1'; apen : CARDINAL location 'd0'; bpen : CARDINAL location 'd1'; drawmode : CARDINAL location 'd2');
+SysCall GfxBase 894;
+
+procedure GetRGB32(cm : pColorMap location 'a0'; firstcolor : CARDINAL location 'd0'; ncolors : CARDINAL location 'd1'; VAR table : CARDINAL location 'a1');
+SysCall GfxBase 900;
+
+function AllocBitMap(sizex : CARDINAL location 'd0'; sizey : CARDINAL location 'd1'; depth : CARDINAL location 'd2'; flags : CARDINAL location 'd3'; friend_bitmap : pBitMap location 'a0') : pBitMap;
+SysCall GfxBase 918;
+
+procedure FreeBitMap(bm : pBitMap location 'a0');
+SysCall GfxBase 924;
+
+function GetExtSpriteA(ss : pExtSprite location 'a2'; tags : pTagItem location 'a1') : LongInt;
+SysCall GfxBase 930;
+
+function CoerceMode(vp : pViewPort location 'a0'; monitorid : CARDINAL location 'd0'; flags : CARDINAL location 'd1') : CARDINAL;
+SysCall GfxBase 936;
+
+procedure ChangeVPBitMap(vp : pViewPort location 'a0'; bm : pBitMap location 'a1'; db : pDBufInfo location 'a2');
+SysCall GfxBase 942;
+
+procedure ReleasePen(cm : pColorMap location 'a0'; n : CARDINAL location 'd0');
+SysCall GfxBase 948;
+
+function ObtainPen(cm : pColorMap location 'a0'; n : CARDINAL location 'd0'; r : CARDINAL location 'd1'; g : CARDINAL location 'd2'; b : CARDINAL location 'd3'; f : LongInt location 'd4') : CARDINAL;
+SysCall GfxBase 954;
+
+function GetBitMapAttr(bm : pBitMap location 'a0'; attrnum : CARDINAL location 'd1') : CARDINAL;
+SysCall GfxBase 960;
+
+function AllocDBufInfo(vp : pViewPort location 'a0') : pDBufInfo;
+SysCall GfxBase 966;
+
+procedure FreeDBufInfo(dbi : pDBufInfo location 'a1');
+SysCall GfxBase 972;
+
+function SetOutlinePen(rp : pRastPort location 'a0'; pen : CARDINAL location 'd0') : CARDINAL;
+SysCall GfxBase 978;
+
+function SetWriteMask(rp : pRastPort location 'a0'; msk : CARDINAL location 'd0') : CARDINAL;
+SysCall GfxBase 984;
+
+procedure SetMaxPen(rp : pRastPort location 'a0'; maxpen : CARDINAL location 'd0');
+SysCall GfxBase 990;
+
+procedure SetRGB32CM(cm : pColorMap location 'a0'; n : CARDINAL location 'd0'; r : CARDINAL location 'd1'; g : CARDINAL location 'd2'; b : CARDINAL location 'd3');
+SysCall GfxBase 996;
+
+procedure ScrollRasterBF(rp : pRastPort location 'a1'; dx : LongInt location 'd0'; dy : LongInt location 'd1'; xMin : LongInt location 'd2'; yMin : LongInt location 'd3'; xMax : LongInt location 'd4'; yMax : LongInt location 'd5');
+SysCall GfxBase 1002;
+
+function FindColor(cm : pColorMap location 'a3'; r : CARDINAL location 'd1'; g : CARDINAL location 'd2'; b : CARDINAL location 'd3'; maxcolor : LongInt location 'd4') : LongInt;
+SysCall GfxBase 1008;
+
+function AllocSpriteDataA(bm : pBitMap location 'a2'; tags : pTagItem location 'a1') : pExtSprite;
+SysCall GfxBase 1020;
+
+function ChangeExtSpriteA(vp : pViewPort location 'a0'; oldsprite : pExtSprite location 'a1'; newsprite : pExtSprite location 'a2'; tags : pTagItem location 'a3') : LongInt;
+SysCall GfxBase 1026;
+
+procedure FreeSpriteData(sp : pExtSprite location 'a2');
+SysCall GfxBase 1032;
+
+procedure SetRPAttrsA(rp : pRastPort location 'a0'; tags : pTagItem location 'a1');
+SysCall GfxBase 1038;
+
+procedure GetRPAttrsA(rp : pRastPort location 'a0'; tags : pTagItem location 'a1');
+SysCall GfxBase 1044;
+
+function BestModeIDA(tags : pTagItem location 'a0') : CARDINAL;
+SysCall GfxBase 1050;
+
+procedure WriteChunkyPixels(rp : pRastPort location 'a0'; xstart : CARDINAL location 'd0'; ystart : CARDINAL location 'd1'; xstop : CARDINAL location 'd2'; ystop : CARDINAL location 'd3'; array1: pCHAR location 'a2'; bytesperrow : LongInt location 'd4');
+SysCall GfxBase 1056;
+
+function OpenFontTagList(textattr : pTextAttr location 'a0'; tags : pTagItem location 'a1') : pTextFont;
+SysCall GfxBase 1062;
+
+
+{ gfxmacros }
+procedure BNDRYOFF (w: pRastPort); 
+procedure InitAnimate (animkey: ppAnimOb);
+procedure SetAfPt(w: pRastPort;p: Pointer; n: Byte);
+procedure SetDrPt(w: pRastPort;p: Word);
+procedure SetOPen(w: pRastPort;c: Byte);
+procedure SetWrMsk(w: pRastPort; m: Byte);
+
+procedure SafeSetOutlinePen(w : pRastPort; c : byte);
+procedure SafeSetWriteMask( w : pRastPort ; m : smallint ) ;
+
+procedure OFF_DISPLAY (cust: pCustom);
+procedure ON_DISPLAY (cust: pCustom);
+procedure OFF_SPRITE (cust: pCustom);
+procedure ON_SPRITE (cust: pCustom);
+procedure OFF_VBLANK (cust: pCustom);
+procedure ON_VBLANK (cust: pCustom);
+
+{ unit/library initialization }
+function InitGraphicsLibrary : boolean;
+
+
+
+implementation
+
+
+procedure BNDRYOFF (w: pRastPort);
+begin
+  with w^ do Flags := Flags And (Not AREAOUTLINE);
+end;
+
+procedure InitAnimate (animkey: ppAnimOb);
+begin
+  animkey^ := NIL;
+end;
+
+procedure SetAfPt(w: pRastPort;p: Pointer; n: Byte);
+begin
+  with w^ do begin
+    ArePointern := p;
+    AreaPtSz := n;
+  end;
+end;
+
+procedure SetDrPt(w: pRastPort;p: Word);
+begin
+  with w^ do begin
+    LinePtrn    := p;
+    Flags       := Flags or FRST_doT;
+    linpatcnt   := 15;
+  end;
+end;
+
+procedure SetOPen(w: pRastPort;c: Byte);
+begin
+  with w^ do begin
+    AOlPen  := c;
+    Flags   := Flags or AREAOUTLINE;
+  end;
+end;
+
+{ This function is fine, but For OS39 the SetWriteMask() gfx function
+  should be prefered because it SHOULD operate with gfx boards as well.
+  At least I hope it does.... }
+procedure SetWrMsk(w: pRastPort; m: Byte);
+begin
+  w^.Mask := m;
+end;
+
+procedure SafeSetOutlinePen(w : pRastPort; c : byte);
+begin
+    IF pGfxBase(GfxBase)^.LibNode.Lib_Version < 39 THEN begin
+        w^.AOlPen := c;
+        w^.Flags := w^.Flags or AREAOUTLINE;
+    end ELSE begin
+        c := SetOutlinePen(w,c);
+    end;
+end;
+
+procedure SafeSetWriteMask( w : pRastPort ; m : smallint ) ;
+  VAR x : smallint ;
+begin
+  IF pGfxBase(GfxBase)^.LibNode.Lib_Version < 39 THEN w^.Mask := BYTE(m)
+  ELSE x := SetWriteMask( w, m );
+end;
+
+procedure OFF_DISPLAY (cust: pCustom);
+begin
+    cust^.dmacon := BITCLR or DMAF_RASTER;
+end;
+
+procedure ON_DISPLAY (cust: pCustom);
+begin
+    cust^.dmacon := BITSET or DMAF_RASTER;
+end;
+
+procedure OFF_SPRITE (cust: pCustom);
+begin
+    cust^.dmacon := BITCLR or DMAF_SPRITE;
+end;
+
+procedure ON_SPRITE (cust: pCustom);
+begin
+    cust^.dmacon := BITSET or DMAF_SPRITE;
+end;
+
+procedure OFF_VBLANK (cust: pCustom);
+begin
+    cust^.intena := BITCLR or INTF_VERTB;
+end;
+
+procedure ON_VBLANK (cust: pCustom);
+begin
+    cust^.intena := BITSET or INTF_VERTB;
+end;
+
+
+const
+  { Change VERSION and LIBVERSION to proper values }
+  VERSION : string[2] = '50';
+  LIBVERSION : longword = 50;
+
+var
+  graphics_exit : Pointer;
+
+procedure CloseGraphicsLibrary;
+begin
+  ExitProc := graphics_exit;
+  if GfxBase <> nil then begin
+    CloseLibrary(GfxBase);
+    GfxBase := nil;
+  end;
+end;
+
+function InitGraphicsLibrary : boolean;
+begin
+  GfxBase := nil;
+  GfxBase := OpenLibrary(GRAPHICSNAME,LIBVERSION);
+  if GfxBase <> nil then begin
+    graphics_exit := ExitProc;
+    ExitProc := @CloseGraphicsLibrary;
+    InitGraphicsLibrary:=True;
+  end else begin
+    InitGraphicsLibrary:=False;
+  end;
+end;
+
+end.
+
+{
+  $Log$
+  Revision 1.1  2004-11-16 21:18:31  karoly
+   * initial revision
+
+}