{
    This file is part of the Free Pascal run time library.

    A file in Amiga system run time library.
    Copyright (c) 1998-2003 by Nils Sjoholm
    member of the Amiga RTL development team.

    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.

 **********************************************************************}

{
    History:

    Found a bug in tFileRequester, rt_ArgList had pWBArg as arg
    should be pWBArgList. Fixed
    27 Oct 1998.

    Added autoopening of asl.library.
    28 Oct 1998.

    Added MessageBox for error report.
    31 Jul 2000.

    Added functions and procedures with array of const.
    For use with fpc 1.0.7 They are in systemvartags.
    11 Nov 2002.

    Added the defines use_amiga_smartlink and
    use_auto_openlib.
    13 Jan 2003.

    Update for AmigaOS 3.9.
    Added some const.
    Added record  tAslSemaphore.
    Added procedures AbortAslRequest and ActivateAslRequest.
    Changed start code for library.
    25 Jan 2003.

    Changed integer > smallint.
            cardinal > longword.
    09 Feb 2003.

    nils.sjoholm@mailbox.swipnet.se
}
{$PACKRECORDS 2}
{$IFNDEF FPC_DOTTEDUNITS}
unit asl;
{$ENDIF FPC_DOTTEDUNITS}

interface
{$IFDEF FPC_DOTTEDUNITS}
uses
  Amiga.Core.Exec, Amiga.Core.Utility, Amiga.Core.Workbench, Amiga.Core.Agraphics;
{$ELSE FPC_DOTTEDUNITS}
uses
  exec, utility, workbench, agraphics;
{$ENDIF FPC_DOTTEDUNITS}

{************************************************************************}

const
  ASLNAME: PAnsiChar = 'asl.library';
  ASL_TB = TAG_USER + $80000;

{************************************************************************}

// Types of requesters known to ASL, used as arguments to AllocAslRequest()
  ASL_FileRequest       = 0;
  ASL_FontRequest       = 1;
  ASL_ScreenModeRequest = 2;

{****************************************************************************
 *
 * ASL File Requester data structures and constants
 *
 * This structure must only be allocated by asl.library amd is READ-ONLY!
 * Control of the various fields is provided via tags when the requester
 * is created with AllocAslRequest() and when it is displayed via
 * AslRequest()
 }

type
  PFileRequester = ^TFileRequester;
  TFileRequester = record
    case SmallInt of
      0: (
        rf_Reserved0: array[0..3] of Byte;
        rf_File: STRPTR;         // Filename pointer
        rf_Dir: STRPTR;          // Directory name pointer
        rf_Reserved1: array[0..9] of Byte;
        rf_LeftEdge: SmallInt;
        rf_TopEdge: SmallInt;    // Preferred window pos
        rf_Width: SmallInt;
        rf_Height: SmallInt;     // Preferred window size
        rf_Reserved2: array[0..1] of Byte;
        rf_NumArgs: LongInt;     // A-la WB Args, FOR multiselects
        rf_ArgList: PWBArgList;
        rf_UserData: APTR;       // Applihandle (you may write!!)
        rf_Reserved3: array[0..7] of Byte;
        rf_Pat: STRPTR;          // Pattern match pointer
      );
      1: (
        fr_Reserved0: array[0..3] of Byte;
        fr_File: STRPTR;         // Filename pointer
        fr_Drawer: STRPTR;          // Directory name pointer
        fr_Reserved1: array[0..9] of Byte;
        fr_LeftEdge: SmallInt;
        fr_TopEdge: SmallInt;    // Preferred window pos
        fr_Width: SmallInt;
        fr_Height: SmallInt;     // Preferred window size
        fr_Reserved2: array[0..1] of Byte;
        fr_NumArgs: LongInt;     // A-la WB Args, FOR multiselects
        fr_ArgList: PWBArgList;
        fr_UserData: APTR;       // Applihandle (you may write!!)
        fr_Reserved3: array[0..7] of Byte;
        fr_Pattern: STRPTR;      // Pattern match pointer
      );
  end;                       // note - more reserved fields follow


{ File requester tag values, used by AllocAslRequest() and AslRequest() }
const
  ASLFR_TitleText = ASL_TB + 1; // Title of requester
  ASLFR_Window    = ASL_TB + 2; // Parent window

  ASLFR_InitialLeftEdge = ASL_TB + 3; // Initial requester coordinates
  ASLFR_InitialTopEdge  = ASL_TB + 4;
  ASLFR_InitialWidth    = ASL_TB + 5; // Initial requester dimensions
  ASLFR_InitialHeight   = ASL_TB + 6;

  ASLFR_HookFunc = ASL_TB + 7; // Combined callback function

  ASLFR_InitialFile    = ASL_TB + 8;  // Initial contents of File gadget
  ASLFR_InitialDrawer  = ASL_TB + 9;  // Initial contents of Drawer gadg.
  ASLFR_InitialPattern = ASL_TB + 10; // Initial contents of Pattern gadg.

  ASLFR_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLFR_NegativeText = ASL_TB + 19; // Negative gadget text

  ASLFR_Flags1 = ASL_TB + 20; // Option flags
  ASLFR_Flags2 = ASL_TB + 22; // Additional option flags

  ASLFR_Screen        = ASL_TB + 40; // Screen to open on if no window
  ASLFR_PubScreenName = ASL_TB + 41; // Name of public screen
  ASLFR_PrivateIDCMP  = ASL_TB + 42; // Allocate private IDCMP?
  ASLFR_SleepWindow   = ASL_TB + 43; // Block input in ASLFR_Window?

  ASLFR_DoSaveMode    = ASL_TB + 44; // Being used for saving?
  ASLFR_DoMultiSelect = ASL_TB + 45; // Do multi-select?
  ASLFR_DoPatterns    = ASL_TB + 46; // Display a Pattern gadget?

  ASLFR_DrawersOnly = ASL_TB + 47; // Don't display files?
  ASLFR_FilterFunc  = ASL_TB + 49; // Function to filter files

  ASLFR_Locale   = ASL_TB + 50; // Locale ASL should use for text
  ASLFR_TextAttr = ASL_TB + 51; // Text font to use for gadget text
  ASLFR_UserData = ASL_TB + 52; // What to put in fr_UserData

  ASLFR_RejectIcons   = ASL_TB + 60; // Display .info files?
  ASLFR_RejectPattern = ASL_TB + 61; // Don't display files matching pat
  ASLFR_AcceptPattern = ASL_TB + 62; // Accept only files matching pat
  ASLFR_FilterDrawers = ASL_TB + 63; // Also filter drawers with patterns

  ASLFR_IntuiMsgFunc = ASL_TB + 70; // Function to handle IntuiMessages

  ASLFR_SetSortBy      = ASL_TB + 124; // Sort criteria (name, date, size)
  ASLFR_GetSortBy      = ASL_TB + 125;
  ASLFR_SetSortDrawers = ASL_TB + 126; // Placement of drawers in the list
  ASLFR_GetSortDrawers = ASL_TB + 127;
  ASLFR_SetSortOrder   = ASL_TB + 128; // Order (ascending or descending)
  ASLFR_GetSortOrder   = ASL_TB + 129;
  // V44
  ASLFR_InitialShowVolumes = ASL_TB + 130; // Initially, show the volume list
  ASLFR_PopToFront         = ASL_TB + 131; // Make the requester window visible
  // V45
  ASLFR_Activate           = ASL_TB + 132; // Activate the requester window when

  // Flag bits for the ASLFR_Flags1 tag
  FRB_FILTERFUNC    = 7;
  FRB_INTUIFUNC     = 6;
  FRB_DOSAVEMODE    = 5;
  FRB_PRIVATEIDCMP  = 4;
  FRB_DOMULTISELECT = 3;
  FRB_DOPATTERNS    = 0;

  FRF_FILTERFUNC    = 1 shl FRB_FILTERFUNC;
  FRF_INTUIFUNC     = 1 shl FRB_INTUIFUNC;
  FRF_DOSAVEMODE    = 1 shl FRB_DOSAVEMODE;
  FRF_PRIVATEIDCMP  = 1 shl FRB_PRIVATEIDCMP;
  FRF_DOMULTISELECT = 1 shl FRB_DOMULTISELECT;
  FRF_DOPATTERNS    = 1 shl FRB_DOPATTERNS;

  // Flag bits for the ASLFR_Flags2 tag
  FRB_DRAWERSONLY   = 0;
  FRB_FILTERDRAWERS = 1;
  FRB_REJECTICONS   = 2;

  FRF_DRAWERSONLY   = 1 shl FRB_DRAWERSONLY;
  FRF_FILTERDRAWERS = 1 shl FRB_FILTERDRAWERS;
  FRF_REJECTICONS   = 1 shl FRB_REJECTICONS;

  // Sort criteria for the ASLFR_SetSortBy/ASLFR_GetSortBy tags
  ASLFRSORTBY_Name = 0;
  ASLFRSORTBY_Date = 1;
  ASLFRSORTBY_Size = 2;

  // Drawer placement for the ASLFR_SetSortDrawers/ASLFR_GetSortDrawers tags
  ASLFRSORTDRAWERS_First = 0;
  ASLFRSORTDRAWERS_Mix   = 1;
  ASLFRSORTDRAWERS_Last  = 2;

  // Sort order for the ASLFR_SetSortOrder/ASLFR_GetSortOrder tags
  ASLFRSORTORDER_Ascend  = 0;
  ASLFRSORTORDER_Descend = 1;

{****************************************************************************
 *
 * ASL Font Requester data structures and constants
 *
 * This structure must only be allocated by asl.library amd is READ-ONLY!
 * Control of the various fields is provided via tags when the requester
 * is created with AllocAslRequest() and when it is displayed via
 * AslRequest()
 }

type
  PFontRequester = ^TFontRequester;
  TFontRequester = record
    fo_Reserved0: array[0..7] of Byte;
    fo_Attr: TTextAttr;    // Returned TextAttr
    fo_FrontPen: Byte;     // Returned front pen
    fo_BackPen: Byte;      // Returned back pen
    fo_DrawMode: Byte;     // Returned drawing mode
    fo_Reserved1: Byte;
    fo_UserData: APTR;     // You can store your own data here
    fo_LeftEdge: SmallInt; // Coordinates Of requester on Exit
    fo_TopEdge: SmallInt;
    fo_Width: SmallInt;
    fo_Height: SmallInt;
    fo_TAttr: TTTextAttr;  // Returned TTextAttr
  end;


// Font requester tag values, used by AllocAslRequest() AND AslRequest()
const
  ASLFO_TitleText = ASL_TB + 1; // Title of requester
  ASLFO_Window    = ASL_TB + 2; // Parent window

  ASLFO_InitialLeftEdge = ASL_TB + 3; // Initial requester coordinates
  ASLFO_InitialTopEdge  = ASL_TB + 4;
  ASLFO_InitialWidth    = ASL_TB + 5; // Initial requester dimensions
  ASLFO_InitialHeight   = ASL_TB + 6;

  ASLFO_HookFunc = ASL_TB + 7; // Combined callback function

  ASLFO_InitialName     = ASL_TB + 10; // Initial contents of Name gadget
  ASLFO_InitialSize     = ASL_TB + 11; // Initial contents of Size gadget
  ASLFO_InitialStyle    = ASL_TB + 12; // Initial font style
  ASLFO_InitialFlags    = ASL_TB + 13; // Initial font flags for TextAttr
  ASLFO_InitialFrontPen = ASL_TB + 14; // Initial front pen
  ASLFO_InitialBackPen  = ASL_TB + 15; // Initial back pen

  ASLFO_MinHeight = ASL_TB + 16; // Minimum font height to display
  ASLFO_MaxHeight = ASL_TB + 17; // Maximum font height to display

  ASLFO_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLFO_NegativeText = ASL_TB + 19; // Negative gadget text

  ASLFO_Flags = ASL_TB + 20; // Option flags

  ASLFO_ModeList = ASL_TB + 21; // Substitute list for drawmodes

  ASLFO_Screen        = ASL_TB + 40; // Screen to open on if no window
  ASLFO_PubScreenName = ASL_TB + 41; // Name of public screen
  ASLFO_PrivateIDCMP  = ASL_TB + 42; // Allocate private IDCMP?
  ASLFO_SleepWindow   = ASL_TB + 43; // Block input in ASLFO_Window?

  ASLFO_DoFrontPen = ASL_TB + 44; // Display Front color selector?
  ASLFO_DoBackPen  = ASL_TB + 45; // Display Back color selector?
  ASLFO_DoStyle    = ASL_TB + 46; // Display Style checkboxes?
  ASLFO_DoDrawMode = ASL_TB + 47; // Display DrawMode cycle gadget?

  ASLFO_FixedWidthOnly = ASL_TB + 48; // Only allow fixed-width fonts?

  ASLFO_FilterFunc = ASL_TB + 49; // Function to filter fonts

  ASLFO_Locale   = ASL_TB + 50; // Locale ASL should use for text
  ASLFO_TextAttr = ASL_TB + 51; // Text font to use for gadget text
  ASLFO_UserData = ASL_TB + 52; // What to put in fo_UserData

  ASLFO_InitialDrawMode = ASL_TB + 59; // Initial draw mode

  ASLFO_FrontPens = ASL_TB + 64; // Color table for front pen palette
  ASLFO_BackPens  = ASL_TB + 65; // Color table for back pen palette

  ASLFO_MaxFrontPen = ASL_TB + 66; // Max # of colors in front palette
  ASLFO_MaxBackPen  = ASL_TB + 67; // Max # of colors in back palette

  ASLFO_IntuiMsgFunc = ASL_TB + 70; // Function to handle IntuiMessages
  // V44
  ASLFO_PopToFront = ASL_TB + 131;  // Make the requester window visible  when it opens
  // V45
  ASLFO_Activate   = ASL_TB + 132; // Activate the requester window when it opens
  ASLFO_SampleText = ASL_TB + 133; // Text to display in font sample area

  // Flag bits for ASLFO_Flags tag
  FOB_DOFRONTPEN     = 0;
  FOB_DOBACKPEN      = 1;
  FOB_DOSTYLE        = 2;
  FOB_DODRAWMODE     = 3;
  FOB_FIXEDWIDTHONLY = 4;
  FOB_PRIVATEIDCMP   = 5;
  FOB_INTUIFUNC      = 6;
  FOB_FILTERFUNC     = 7;

  FOF_DOFRONTPEN     = 1 shl FOB_DOFRONTPEN;
  FOF_DOBACKPEN      = 1 shl FOB_DOBACKPEN;
  FOF_DOSTYLE        = 1 shl FOB_DOSTYLE;
  FOF_DODRAWMODE     = 1 shl FOB_DODRAWMODE;
  FOF_FIXEDWIDTHONLY = 1 shl FOB_FIXEDWIDTHONLY;
  FOF_PRIVATEIDCMP   = 1 shl FOB_PRIVATEIDCMP;
  FOF_INTUIFUNC      = 1 shl FOB_INTUIFUNC;
  FOF_FILTERFUNC     = 1 shl FOB_FILTERFUNC;

{****************************************************************************
 *
 * ASL Screen Mode Requester data structures and constants
 *
 * This structure must only be allocated by asl.library and is READ-ONLY!
 * Control of the various fields is provided via tags when the requester
 * is created with AllocAslRequest() and when it is displayed via
 * AslRequest()
 }

type
  PScreenModeRequester = ^TScreenModeRequester;
  TScreenModeRequester = record
    sm_DisplayID: Cardinal;     // Display mode ID
    sm_DisplayWidth: Cardinal;  // Width of display in pixels
    sm_DisplayHeight: Cardinal; // Height of display in pixels
    sm_DisplayDepth: Word;      // Number of bit-planes of display
    sm_OverscanType: Word;      // type of overscan of display
    sm_AutoScroll: WordBool;    // Display should auto-scroll?

    sm_BitMapWidth: Cardinal;   // Used to create your own BitMap
    sm_BitMapHeight: Cardinal;

    sm_LeftEdge: SmallInt;      // Coordinates of requester on Exit
    sm_TopEdge: SmallInt;
    sm_Width: SmallInt;
    sm_Height: SmallInt;

    sm_InfoOpened: WordBool;    // Info window opened on exit?
    sm_InfoLeftEdge: SmallInt;  // Last coordinates of Info window
    sm_InfoTopEdge: SmallInt;
    sm_InfoWidth: SmallInt;
    sm_InfoHeight: SmallInt;

    sm_UserData: APTR;          // You can store your own data here
  end;


{ An Exec list of custom modes can be added to the list of available modes.
 * The DimensionInfo structure must be completely initialized, including the
 * Header. See <graphics/displayinfo.h>. Custom mode ID's must be in the range
 * $FFFF0000..$FFFFFFFF. Regular properties which apply to your custom modes
 * can be added in the dn_PropertyFlags field. Custom properties are not
 * allowed.
 }
  PDisplayMode = ^TDisplayMode;
  TDisplayMode = record
    dm_Node: TNode;                   // see ln_Name
    dm_DimensionInfo: TDimensionInfo; // mode description
    dm_PropertyFlags: Cardinal;       // applicable properties
  end;

// ScreenMode requester tag values, used by AllocAslRequest() and AslRequest()
const
  ASLSM_TitleText = ASL_TB + 1; // Title of requester
  ASLSM_Window    = ASL_TB + 2; // Parent window

  ASLSM_InitialLeftEdge = ASL_TB + 3; // Initial requester coordinates
  ASLSM_InitialTopEdge  = ASL_TB + 4;
  ASLSM_InitialWidth    = ASL_TB + 5; // Initial requester dimensions
  ASLSM_InitialHeight   = ASL_TB + 6;

  ASLSM_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLSM_NegativeText = ASL_TB + 19; // Negative gadget text

  ASLSM_Screen        = ASL_TB + 40; // Screen to open on if no window
  ASLSM_PubScreenName = ASL_TB + 41; // Name of public screen
  ASLSM_PrivateIDCMP  = ASL_TB + 42; // Allocate private IDCMP?
  ASLSM_SleepWindow   = ASL_TB + 43; // Block input in ASLSM_Window?

  ASLSM_Locale   = ASL_TB + 50; // Locale ASL should use for text
  ASLSM_TextAttr = ASL_TB + 51; // Text font to use for gadget text
  ASLSM_UserData = ASL_TB + 52; // What to put in sm_UserData

  ASLSM_IntuiMsgFunc = ASL_TB + 70; // Function to handle IntuiMessages

  ASLSM_InitialDisplayID     = ASL_TB + 100; // Initial display mode id
  ASLSM_InitialDisplayWidth  = ASL_TB + 101; // Initial display width
  ASLSM_InitialDisplayHeight = ASL_TB + 102; // Initial display height
  ASLSM_InitialDisplayDepth  = ASL_TB + 103; // Initial display depth
  ASLSM_InitialOverscanType  = ASL_TB + 104; // Initial type of overscan
  ASLSM_InitialAutoScroll    = ASL_TB + 105; // Initial autoscroll setting
  ASLSM_InitialInfoOpened    = ASL_TB + 106; // Info wndw initially opened?
  ASLSM_InitialInfoLeftEdge  = ASL_TB + 107; // Initial Info window coords.
  ASLSM_InitialInfoTopEdge   = ASL_TB + 108;

  ASLSM_DoWidth        = ASL_TB + 109; // Display Width gadget?
  ASLSM_DoHeight       = ASL_TB + 110; // Display Height gadget?
  ASLSM_DoDepth        = ASL_TB + 111; // Display Depth gadget?
  ASLSM_DoOverscanType = ASL_TB + 112; // Display Overscan Type gadget?
  ASLSM_DoAutoScroll   = ASL_TB + 113; // Display AutoScroll gadget?

  ASLSM_PropertyFlags = ASL_TB + 114; // Must have these Property flags
  ASLSM_PropertyMask  = ASL_TB + 115; // Only these should be looked at
  ASLSM_MinWidth      = ASL_TB + 116; // Minimum display width to allow
  ASLSM_MaxWidth      = ASL_TB + 117; // Maximum display width to allow
  ASLSM_MinHeight     = ASL_TB + 118; // Minimum display height to allow
  ASLSM_MaxHeight     = ASL_TB + 119; // Maximum display height to allow
  ASLSM_MinDepth      = ASL_TB + 120; // Minimum display depth
  ASLSM_MaxDepth      = ASL_TB + 121; // Maximum display depth
  ASLSM_FilterFunc    = ASL_TB + 122; // Function to filter mode id's

  ASLSM_CustomSMList = ASL_TB + 123; // Exec list of struct DisplayMode
  // V44
  ASLSM_PopToFront = ASL_TB + 131; // Make the requester window visible when it opens
  // V45
  ASLSM_Activate = ASL_TB + 132; // Activate the requester window when it opens

  ASL_LAST_TAG = ASL_TB + 133;

{***************************************************************************}

{ This defines the rendezvous data for setting and querying asl.library's
 * defaults for the window size and the file requester sort order. The name
 * of the semaphore is given below; it exists only with asl.library V45 and
 * IPrefs V45 and beyond.
 }
  ASL_SEMAPHORE_NAME: PAnsiChar = 'asl.library';

type
  PAslSemaphore = ^TAslSemaphore;
  TAslSemaphore = record
    as_Semaphore: TSignalSemaphore;
    as_Version: Word;       // Must be >= 45
    as_Size: Cardinal;      // Size of this data structure.

    as_SortBy: Byte;        // File requester defaults; name, date or size
    as_SortDrawers: Byte;   // File requester defaults; first, mix or last
    as_SortOrder: Byte;     // File requester defaults; ascending or descending

    as_SizePosition: Byte;  // See below

    as_RelativeLeft: Word;  // Window position offset
    as_RelativeTop: Word;

    as_RelativeWidth: Byte; // Window size factor; this is a percentage of the parent window/screen width.
    as_RelativeHeight : Byte;
  end;

const
  // Default position of the ASL window.
  ASLPOS_DefaultPosition = 0; // Position is calculated according to the builtin rules.
  ASLPOS_CenterWindow    = 1; // Centred within the bounds of the parent window.
  ASLPOS_CenterScreen    = 2; // Centred within the bounds of the parent screen.
  ASLPOS_WindowPosition  = 3; // Relative to the top left corner of the parent window, using the offset values provided in the as_RelativeLeft/as_RelativeTop members.
  ASLPOS_ScreenPosition  = 4; // Relative to the top left corner of the parent screen, using the offset values provided in the as_RelativeLeft/as_RelativeTop members.
  ASLPOS_CenterMouse     = 5; // Directly below the mouse pointer.
  ASLPOS_MASK            = $0F;
  // Default size of the ASL window.
  ASLSIZE_DefaultSize  = 0 shl 4; // Size is calculated according to the builtin rules.
  ASLSIZE_RelativeSize = 1 shl 4; // Size is relative to the size of the parent window or screen, using the values provided in
                                  // the as_RelativeWidth/as_RelativeHeight members. The as_RelativeWidth/as_RelativeHeight values are
                                  // taken as percentage, i.e. a value of "50" stands for 50% of the width/height of the parent window/screen.
  ASLSIZE_MASK = $30;
  // Other options.
  ASLOPTION_ASLOverrides = 1 shl 6; // ASL determines placement and size of requester windows; application's choice is ignored.


{****************************************************************************
 *
 * Obsolete ASL definitions, here for source code compatibility only.
 * Please do NOT use in new code.
 *
 *   define ASL_V38_NAMES_ONLY to remove these older names
 }
{$define ASL_V38_NAMES_ONLY}
{$ifndef ASL_V38_NAMES_ONLY}
const
  ASL_Dummy      = TAG_USER + $80000;
  ASL_Hail       = ASL_Dummy + 1;
  ASL_Window     = ASL_Dummy + 2;
  ASL_LeftEdge   = ASL_Dummy + 3;
  ASL_TopEdge    = ASL_Dummy + 4;
  ASL_Width      = ASL_Dummy + 5;
  ASL_Height     = ASL_Dummy + 6;
  ASL_HookFunc   = ASL_Dummy + 7;
  ASL_File       = ASL_Dummy + 8;
  ASL_Dir        = ASL_Dummy + 9;
  ASL_FontName   = ASL_Dummy + 10;
  ASL_FontHeight = ASL_Dummy + 11;
  ASL_FontStyles = ASL_Dummy + 12;
  ASL_FontFlags  = ASL_Dummy + 13;
  ASL_FrontPen   = ASL_Dummy + 14;
  ASL_BackPen    = ASL_Dummy + 15;
  ASL_MinHeight  = ASL_Dummy + 16;
  ASL_MaxHeight  = ASL_Dummy + 17;
  ASL_OKText     = ASL_Dummy + 18;
  ASL_CancelText = ASL_Dummy + 19;
  ASL_FuncFlags  = ASL_Dummy + 20;
  ASL_ModeList   = ASL_Dummy + 21;
  ASL_ExtFlags1  = ASL_Dummy + 22;
  ASL_Pattern    = ASL_FontName;

  // remember what I said up there? Do not use these anymore!
  FILB_DOWILDFUNC  = 7;
  FILB_DOMSGFUNC   = 6;
  FILB_SAVE        = 5;
  FILB_NEWIDCMP    = 4;
  FILB_MULTISELECT = 3;
  FILB_PATGAD      = 0;

  FILF_DOWILDFUNC  = 1 shl FILB_DOWILDFUNC;
  FILF_DOMSGFUNC   = 1 shl FILB_DOMSGFUNC;
  FILF_SAVE        = 1 shl FILB_SAVE;
  FILF_NEWIDCMP    = 1 shl FILB_NEWIDCMP;
  FILF_MULTISELECT = 1 shl FILB_MULTISELECT;
  FILF_PATGAD      = 1 shl FILB_PATGAD;

  FIL1B_NOFILES   = 0;
  FIL1B_MATCHDIRS = 1;
  FIL1F_NOFILES   = 1 shl FIL1B_NOFILES;
  FIL1F_MATCHDIRS = 1 shl FIL1B_MATCHDIRS;

  FONB_FRONTCOLOR  = 0;
  FONB_BACKCOLOR   = 1;
  FONB_STYLES      = 2;
  FONB_DRAWMODE    = 3;
  FONB_FIXEDWIDTH  = 4;
  FONB_NEWIDCMP    = 5;
  FONB_DOMSGFUNC   = 6;
  FONB_DOWILDFUNC  = 7;

  FONF_FRONTCOLOR  = 1 shl FONB_FRONTCOLOR;
  FONF_BACKCOLOR   = 1 shl FONB_BACKCOLOR;
  FONF_STYLES      = 1 shl FONB_STYLES;
  FONF_DRAWMODE    = 1 shl FONB_DRAWMODE;
  FONF_FIXEDWIDTH  = 1 shl FONB_FIXEDWIDTH;
  FONF_NEWIDCMP    = 1 shl FONB_NEWIDCMP;
  FONF_DOMSGFUNC   = 1 shl FONB_DOMSGFUNC;
  FONF_DOWILDFUNC  = 1 shl FONB_DOWILDFUNC;
{$endif ASL_V38_NAMES_ONLY}

var
  AslBase: PLibrary = nil;

function AllocFileRequest: PFileRequester; SysCall AslBase 030;
procedure FreeFileRequest(FileReq: PFileRequester location 'a0'); SysCall AslBase 036;
function RequestFile(FileReq: PFileRequester location 'a0'): LongBool; SysCall AslBase 042;
function AllocAslRequest(ReqType: Cardinal location 'd0'; TagList: PTagItem location 'a0'): APTR; SysCall AslBase 048;
procedure FreeAslRequest(Requester: APTR location 'a0'); SysCall AslBase 054;
function AslRequest(Requester: APTR location 'a0'; TagList: PTagItem location 'a1'): LongBool; SysCall AslBase 060;
procedure AbortAslRequest(Requester: APTR location 'a0'); SysCall AslBase 078;
procedure ActivateAslRequest(Requester: APTR location 'a0'); SysCall AslBase 084;

function AllocAslRequestTags(ReqType: Cardinal; const TagList: array of PtrUInt): APTR; Inline;
function AslRequestTags(Requester: APTR; const TagList: array of PtrUInt): LongBool; Inline;

implementation

function AllocAslRequestTags(ReqType: Cardinal; const TagList: array of PtrUInt): APTR; Inline;
begin
  AllocAslRequestTags := AllocAslRequest(ReqType, @tagList);
end;

function AslRequestTags(Requester: APTR; const TagList: array of PtrUInt): LongBool; Inline;
begin
  AslRequestTags := AslRequest(Requester, @TagList);
end;

const
  // Change VERSION and LIBVERSION to proper values
  VERSION : string[2] = '0';
  LIBVERSION: LongWord = 0;

initialization
  AslBase := OpenLibrary(ASLNAME, LIBVERSION);
finalization
  if Assigned(AslBase) then
    CloseLibrary(PLibrary(AslBase));
end.


