Browse Source

AmigaOS4: library units for utility.library, timer.device and dos.library

git-svn-id: trunk@33552 -
marcus 9 years ago
parent
commit
44a544d0f5

+ 3 - 0
.gitattributes

@@ -6316,7 +6316,10 @@ packages/os4units/Makefile svneol=native#text/plain
 packages/os4units/Makefile.fpc svneol=native#text/plain
 packages/os4units/Makefile.fpc svneol=native#text/plain
 packages/os4units/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/os4units/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/os4units/fpmake.pp svneol=native#text/pascal
 packages/os4units/fpmake.pp svneol=native#text/pascal
+packages/os4units/src/amigados.pas svneol=native#text/pascal
 packages/os4units/src/exec.pas svneol=native#text/pascal
 packages/os4units/src/exec.pas svneol=native#text/pascal
+packages/os4units/src/timer.pas svneol=native#text/pascal
+packages/os4units/src/utility.pas svneol=native#text/pascal
 packages/palmunits/Makefile svneol=native#text/plain
 packages/palmunits/Makefile svneol=native#text/plain
 packages/palmunits/Makefile.fpc svneol=native#text/plain
 packages/palmunits/Makefile.fpc svneol=native#text/plain
 packages/palmunits/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/palmunits/Makefile.fpc.fpcmake svneol=native#text/plain

+ 3 - 0
packages/os4units/fpmake.pp

@@ -32,6 +32,9 @@ begin
     P.IncludePath.Add('src');
     P.IncludePath.Add('src');
 
 
     T:=P.Targets.AddUnit('exec.pas');
     T:=P.Targets.AddUnit('exec.pas');
+    T:=P.Targets.AddUnit('timer.pas');
+    T:=P.Targets.AddUnit('utility.pas');
+    T:=P.Targets.AddUnit('amigados.pas');
 
 
 {$ifndef ALLPACKAGES}
 {$ifndef ALLPACKAGES}
     Run;
     Run;

+ 2780 - 0
packages/os4units/src/amigados.pas

@@ -0,0 +1,2780 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2016 by Free Pascal development team
+
+    dos.library functions for Amiga OS 4.x
+
+    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 amigados;
+
+interface
+
+uses
+  exec, utility, timer;
+
+const
+// Predefined Amiga DOS global constants
+  DOSTRUE     = -1;
+  DOSFALSE    =  0;
+
+  BITSPERBYTE  = 8;
+  BYTESPERLONG = 4;
+  BITSPERLONG  = 32;
+  MAXINT       = $7FFFFFFF;
+  MININT       = $80000000;
+
+// Mode parameter to Open(), all files are positioned at beginning of file.
+  MODE_OLDFILE   = 1005; // Open existing file read/write positioned at beginning of file.
+  MODE_NEWFILE   = 1006; // Open freshly created file (delete old file) read/write
+  MODE_READWRITE = 1004; // Open old file w/exclusive lock
+
+// Relative position to Seek(deprecated) and ChangeFilePosition()
+  OFFSET_BEGINNING = -1; // relative to Begining Of File
+  OFFSET_CURRENT   = 0;  // relative to Current file position
+  OFFSET_END       = 1;  // relative to End Of File
+
+// Passed as 'accessMode' to Lock()
+  SHARED_LOCK    = -2; // File is readable by others
+  ACCESS_READ    = -2; //   Somewhat misleading old synonym
+  EXCLUSIVE_LOCK = -1; // No other access allowed
+  ACCESS_WRITE   = -1; //   Somewhat misleading old synonym
+
+// *********************************************************************
+// Flags for the bitmasks returned by LockTags() when using LK_InfoMask tag.*/
+// These provide detailed information on the string being resolved.  V53.57 */
+
+  LOCKB_SOFTLINK_MIDPART = 8;  // One or more soft links were found in the middle of the path
+                               // but none of these formed the last component of the path.
+  LOCKB_SOFTLINK_ENDPART = 9;  // One soft link exists as the last component of the path.
+  LOCKB_DEVICE           = 16; // The supplied path is a device relative specification.
+  LOCKB_VOLUME           = 17; // The supplied path is a volume relative specification.
+  LOCKB_ASSIGNMENT       = 18; // The supplied path is an assignment relative specification.
+  LOCKB_PROGDIR          = 19; // The supplied path is a PROGDIR: relative specification.
+  LOCKB_CURRDIR          = 20; // The supplied path is a CURRDIR: relative specification.
+  LOCKB_ROOTDIR          = 21; // The supplied path is a root directory relative specification.
+  LOCKB_FILESYS          = 24; // The supplied path returned the root of the default filesystem.
+
+// Field definitions of the above.
+  LOCKF_SOFTLINK_MIDPART = 1 shl LOCKB_SOFTLINK_MIDPART;
+  LOCKF_SOFTLINK_ENDPART = 1 shl LOCKB_SOFTLINK_ENDPART;
+  LOCKF_DEVICE           = 1 shl LOCKB_DEVICE;
+  LOCKF_VOLUME           = 1 shl LOCKB_VOLUME;
+  LOCKF_ASSIGNMENT       = 1 shl LOCKB_ASSIGNMENT;
+  LOCKF_PROGDIR          = 1 shl LOCKB_PROGDIR;
+  LOCKF_CURRDIR          = 1 shl LOCKB_CURRDIR;
+  LOCKF_ROOTDIR          = 1 shl LOCKB_ROOTDIR;
+  LOCKF_FILESYS          = 1 shl LOCKB_FILESYS;
+
+// *********************************************************************
+// Result flags for WaitForData().
+  WFDB_READ  = 0; // Stream has data ready to be read
+  WFDB_WRITE = 1; // Stream is ready to accept more data to be written.
+
+  WFDF_READ  = 1 shl WFDB_READ;
+  WFDF_WRITE = 1 shl WFDB_WRITE;
+
+// *********************************************************************
+// NotifyProcListChange(), NotifyDosListChange(), termination signal value.
+  NPLC_END = $FFFFFFFF;
+  NDLC_END = $FFFFFFFF;
+
+// *********************************************************************
+// SetBlockingMode() mode values which define whether read/write access to a
+// stream will block until a request is satisfied or will return immediately.
+  SBM_BLOCKING     = 1;
+  SBM_NON_BLOCKING = 2;
+
+// *********************************************************************
+// GetPID() function, this flag determins which PID is returned. 53.58
+  GPID_PROCESS = 1;
+  GPID_PARENT  = 2;
+
+// *********************************************************************
+// Length constants specifically for new vector-port based filesystems.
+// Older packet filesystem designs may not support these lengths,
+// so use FileSystemAttr() to find out filesystem specific values.
+  MAX_VP_FILENAME   = 255;
+  MAX_VP_COMMENT    = 255;
+  MAX_VP_SOFTLINK_TARGET = 4000;
+
+type
+  FileHandle = BPTR;
+  FileLock   = BPTR;
+
+// *********************************************************************
+  PDateStamp = ^TDateStamp;
+  TDateStamp = record
+    ds_Days: LongInt;   // Number of days since Jan. 1, 1978
+    ds_Minute: LongInt; // Number of minutes past midnight
+    ds_Tick: LongInt;   // Number of ticks past minute
+  end;
+
+const
+  TICKS_PER_SECOND = 50; // Fifty ticks = one second One tick = twenty milliseconds
+
+// *********************************************************************
+// V52 Struct ExamineData, returned by ExamineObject() and ExamineDir().
+// This structure supports unlimited string lengths, 64 bit file sizes,
+// automatic resolution of link targets and extended auxilliary information.
+//
+// NOTE; Applications DO NOT allocate these, the filesystem does it.
+//       Also, the filesystem itself must always allocate these using
+//       AllocDosObject(), otherwise they will simply not work.
+type
+  // (RO) = Read Only, these fields must not be modified by the application.
+  PExamineData = ^TExamineData;
+  TExamineData = record
+    EXDnode: TMinNode;     // MinList node.
+    EXDinfo: LongWord;     // General purpose user data.
+
+    // These are private members exclusively for the FS & DOS.
+    FSPrivate: LongWord;   // FILESYSTEM ONLY - Private usage.
+    Reserved0: LongWord;   // DOS RESERVED - Private usage.
+    DOSPrivate: APTR;      // DOSLIB ONLY - Private usage.
+
+    // The following are public fields.
+    StructSize: LongWord;  // (RO) Full size of the structure.
+    Type_: LongWord;       // Entry type; use EXD_IS_ macros below.
+    FileSize: Int64;       // Size of a file, otherwise set to -1.
+    Date: TDateStamp;      // Days, Mins, Ticks.
+    RefCount: LongWord;    // Object hardlink references.    [Note 1]
+    ObjectID: QWord;       // Unique object identifier.      [Note 2]
+    Name: STRPTR;          // (RO) Nul-terminated object name.
+    NameSize: LongWord;    // (RO) Allocated size of the name buffer.
+    Comment: STRPTR;       // (RO) Nul-terminated comment string.
+    CommentSize: LongWord; // (RO) Allocated size of comment buffer.
+    Link: STRPTR;          // (RO) Nul-terminated target name string.
+    LinkSize: LongWord;    // (RO) Allocated size of target buffer.
+    Protection: LongWord;  // Protection status bitmask.
+    OwnerUID: LongWord;    // Owner info. [Note 3]
+    OwnerGID: LongWord;    // Group info. [Note 3]
+    Reserved2: LongWord;   // DOS reserved field.
+    Reserved3: LongWord;   // DOS reserved field.
+    Reserved4: LongWord;   // DOS reserved field.
+  end;
+{
+ [Note 1] If possible, this field should be supported by filesystems that
+          support hardlinks, it is used to indicate the hardlink reference
+          count for objects.  A value of one indicates that the object has
+          no additional references other than itself, a value of two will
+          indicate that it has one additional hardlink reference,
+          a value of three means it has two hardlink references, etc...
+          All hardlinks themselves always show a value of 1 in this field
+          when supported, otherwise this field MUST be set to zero for
+          all objects, if the filesystem does not support it.
+          It will be undefined if the caller fails to specify the
+          EXF_REFCOUNT bit in the EX_DataFields mask.
+
+ [Note 2] This field is the mandatory unique object identfier for all
+          objects on this volume, the value used here may be any arbitrary
+          value as long as it is unique from all other objects on this
+          volume, it may use the object node address, the disk header block
+          number or other such values. (Note: this field is 64 bits wide.)
+          This field will be undefined if you fail to specify the
+          EXF_OBJECTID bit in the EX_DataFields mask.
+
+ [Note 3] Historically, these fields only used the low 16 bits.
+          For extensibility, the size of these are now 32 bit fields.
+          However, for interoperability, it is recommended that values
+          greater than 65535 be avoided where possible so reading only
+          the low 16 bits results in the same value for legacy applications.
+          These fields will be undefined if you fail to specify the
+          EXF_OWNER bit in the EX_DataFields mask.
+          (See extended information relating to the UID/GID fields below.)}
+
+// *********************************************************************
+// Bit mask field values that are passed in the EX_DataFields tag,
+// this determines what data is returned from the ExamineDir() function.
+//
+// The data value returned in the respective fields will be undefined if
+// the mask bit is not specified, NEVER assume otherwise.
+const
+  EXF_DATE       = 1 shl 0;
+  EXF_REFCOUNT   = 1 shl 1;
+  EXF_NAME       = 1 shl 2;
+  EXF_COMMENT    = 1 shl 3;
+  EXF_LINK       = 1 shl 4;
+  EXF_PROTECTION = 1 shl 5;
+  EXF_OWNER      = 1 shl 6;  // both Group and User ID
+  EXF_TYPE       = 1 shl 7;  // MUST be specified for EXD_IS macros
+  EXF_SIZE       = 1 shl 8;
+  EXF_OBJECTID   = 1 shl 9;
+
+  EXF_spare1     = 1 shl 10; // reserved for future EXF_ALL feature
+  EXF_spare2     = 1 shl 11; // reserved for future EXF_ALL feature
+  EXF_spare3     = 1 shl 12; // reserved for future EXF_ALL feature
+  EXF_spare4     = 1 shl 13; // reserved for future EXF_ALL feature
+  EXF_spare5     = 1 shl 14; // reserved for future EXF_ALL feature
+  EXF_spare6     = 1 shl 15; // reserved for future EXF_ALL feature
+
+  EXF_ALL        = $FFFF;    // Return all of the information above
+
+// *********************************************************************
+// Values for ExamineData->Type for checking what kind of object it describes.
+// The lower 8 bits form the unique descriptor value, the upper bits are used
+// as a bitmask. The FSO_TYPE_MASK is used to filter the descriptor value.
+// NOTE: You MUST specify EXF_TYPE in the EX_DataFields tag for these macros
+//       to work otherwise random values will be returned in the 'Type' field.
+
+  FSO_TYPE_MASK      = $FF; // mask for object type descriptors
+
+  FSO_TYPE_SOFTLINK  = 0;   // Object is a softlink
+  FSO_TYPE_FILE      = 1;   // Object is a file
+  FSO_TYPE_DIRECTORY = 2;   // Object is a directory
+  FSO_TYPE_PIPE      = 3;   // Object is a pipe stream
+  FSO_TYPE_SOCKET    = 4;   // Object is a socket stream
+
+  FSO_TYPE_INVALID   = $FE; // Object is unidentifiable or corrupt, you SHOULD never actually see this,
+                            // but the value is reserved here for use by the handler AND DOS to indicate internal errors.
+                            // You MAY also possibly see this value if one were to read the 'Type' member without
+                            // setting the EXF_TYPE bit in EX_DataFields.
+  FSOF_LINK    = 1 shl 8; // Bit set for FFS style hard & soft links
+  FSOF_ALTLINK = 1 shl 9; // Reserved bit for alternate style links, these are currently unimplemented.
+
+// Information relating to the ExamineData; OwnerUID and OwnerGID members.
+  DOS_OWNER_ROOT = 65535;
+  DOS_OWNER_NONE = 0;
+
+// *********************************************************************
+// Definitions for the ExamineData "Protection" bitfield.
+  EXDB_OTR_READ        = 15; // Other: file is readable
+  EXDB_OTR_WRITE       = 14; // Other: file is writable
+  EXDB_OTR_EXECUTE     = 13; // Other: file is executable
+  EXDB_OTR_DELETE      = 12; // Other: file is deleted
+  EXDB_GRP_READ        = 11; // Group: file is readable
+  EXDB_GRP_WRITE       = 10; // Group: file is writable
+  EXDB_GRP_EXECUTE     =  9; // Group: file is executable
+  EXDB_GRP_DELETE      =  8; // Group: file is deleteable
+
+  EXDB_HOLD             = 7; // (H) hold loaded program in cli resident list (v50)
+  EXDB_SCRIPT           = 6; // (S) program is a script (execute) file
+  EXDB_PURE             = 5; // (P) program is reentrant and reexecutable
+  EXDB_ARCHIVE          = 4; // (A) cleared whenever file is changed
+  EXDB_NO_READ          = 3; // (R) NOT readable,
+  EXDB_NO_WRITE         = 2; // (W) NOT writable,
+  EXDB_NO_EXECUTE       = 1; // (E) NOT executable, Used by Shell only
+  EXDB_NO_DELETE        = 0; // (D) NOT deletable,
+
+// Masks for above bits
+  EXDF_OTR_READ    = 1 shl EXDB_OTR_READ;
+  EXDF_OTR_WRITE   = 1 shl EXDB_OTR_WRITE;
+  EXDF_OTR_EXECUTE = 1 shl EXDB_OTR_EXECUTE;
+  EXDF_OTR_DELETE  = 1 shl EXDB_OTR_DELETE;
+  EXDF_GRP_READ    = 1 shl EXDB_GRP_READ;
+  EXDF_GRP_WRITE   = 1 shl EXDB_GRP_WRITE;
+  EXDF_GRP_EXECUTE = 1 shl EXDB_GRP_EXECUTE;
+  EXDF_GRP_DELETE  = 1 shl EXDB_GRP_DELETE;
+
+  EXDF_HOLD        = 1 shl EXDB_HOLD;
+  EXDF_SCRIPT      = 1 shl EXDB_SCRIPT;
+  EXDF_PURE        = 1 shl EXDB_PURE;
+  EXDF_ARCHIVE     = 1 shl EXDB_ARCHIVE;
+  EXDF_NO_READ     = 1 shl EXDB_NO_READ;
+  EXDF_NO_WRITE    = 1 shl EXDB_NO_WRITE;
+  EXDF_NO_EXECUTE  = 1 shl EXDB_NO_EXECUTE;
+  EXDF_NO_DELETE   = 1 shl EXDB_NO_DELETE;
+
+  EXDF_DEFAULT = 0;
+
+{$PACKRECORDS 4}
+type
+// Returned by Examine() and ExInfo(), must be on a 4 byte boundary
+// This structure is obsolete, due to 4 gig file size limits, short string
+// length issues and lack of extensibility.
+// Software should migrate to using the new ExamineDir() and the ExamineObject()
+// functions which use the struct ExamineData.
+//
+// This structure is here because it is nested within other structures and for
+// legacy compatibility reasons, so this definition can't be removed at this time.
+//
+// NOTE: The fib_DOSReserved[8] area is ABSOLUTELY DOS PRIVATE !! - Do not access it.
+//       DOS uses all of this space for context information when emulating the
+//       old V40 functions that require this structure.
+
+  PFileInfoBlock = ^TFileInfoBlock;
+  TFileInfoBlock = record
+    fib_DiskKey: LongWord;     // -- FILESYSTEM PRIVATE !!
+    fib_DirEntryType: LongInt; // Use FIB_IS_ macros to identify object.
+    fib_FileName: array[0..107] of Char; // Null terminated.
+    fib_Protection: LongWord;  // Bit mask of protection, rwxd are 3-0.
+    fib_Obsolete: LongInt;     // obsolete use fib_DirEntryType instead
+    fib_Size: LongWord;        // Byte size of file, only good to 4 gig.
+    fib_NumBlocks: LongWord;   // Number of blocks in file
+    fib_Date: TDateStamp;      // Date file last changed
+    fib_Comment: array[0..79] of Char; // Null terminated comment string.
+    // Note: the following two fields are not supported by all filesystems.
+    //   Should be 0 if not supported
+    fib_OwnerUID: Word;        //
+    fib_OwnerGID: Word;        //
+    fib_Reserved: array [0..7] of Pointer; // DOS Private do not access this
+  end; // FileInfoBlock - 260 bytes
+
+const
+
+{ FIB stands for FileInfoBlock }
+
+{* FIBB are bit definitions, FIBF are field definitions *}
+{* Regular RWED bits are 0 == allowed. *}
+{* NOTE: GRP and OTR RWED permissions are 0 == not allowed! *}
+{* Group and Other permissions are not directly handled by the filesystem *}
+
+    FIBB_OTR_READ       = 15;   {* Other: file is readable *}
+    FIBB_OTR_WRITE      = 14;   {* Other: file is writable *}
+    FIBB_OTR_EXECUTE    = 13;   {* Other: file is executable *}
+    FIBB_OTR_DELETE     = 12;   {* Other: prevent file from being deleted *}
+    FIBB_GRP_READ       = 11;   {* Group: file is readable *}
+    FIBB_GRP_WRITE      = 10;   {* Group: file is writable *}
+    FIBB_GRP_EXECUTE    = 9;    {* Group: file is executable *}
+    FIBB_GRP_DELETE     = 8;    {* Group: prevent file from being deleted *}
+
+    FIBB_SCRIPT         = 6;    { program is a script (execute) file }
+    FIBB_PURE           = 5;    { program is reentrant and rexecutable}
+    FIBB_ARCHIVE        = 4;    { cleared whenever file is changed }
+    FIBB_READ           = 3;    { ignored by old filesystem }
+    FIBB_WRITE          = 2;    { ignored by old filesystem }
+    FIBB_EXECUTE        = 1;    { ignored by system, used by Shell }
+    FIBB_DELETE         = 0;    { prevent file from being deleted }
+
+    FIBF_OTR_READ      = (1 shl FIBB_OTR_READ);
+    FIBF_OTR_WRITE     = (1 shl FIBB_OTR_WRITE);
+    FIBF_OTR_EXECUTE   = (1 shl FIBB_OTR_EXECUTE);
+    FIBF_OTR_DELETE    = (1 shl FIBB_OTR_DELETE);
+    FIBF_GRP_READ      = (1 shl FIBB_GRP_READ);
+    FIBF_GRP_WRITE     = (1 shl FIBB_GRP_WRITE);
+    FIBF_GRP_EXECUTE   = (1 shl FIBB_GRP_EXECUTE);
+    FIBF_GRP_DELETE    = (1 shl FIBB_GRP_DELETE);
+
+    FIBF_SCRIPT         = 64;
+    FIBF_PURE           = 32;
+    FIBF_ARCHIVE        = 16;
+    FIBF_READ           = 8;
+    FIBF_WRITE          = 4;
+    FIBF_EXECUTE        = 2;
+    FIBF_DELETE         = 1;
+
+// Standard maximum length for an error string from fault.  However, most
+// error strings should be kept under 60 characters if possible.  Don't
+// forget space for the header you pass in. *}
+  FAULT_MAX = 82;
+
+type
+// For the old Info() function, the structure must be on a 4 byte boundary.
+// The new V51+ GetDiskInfo() doesn't require special structure alignment.
+// Just use AllocDosObject(DOS_INFO,0); to get the right one every time.
+  PInfoData = ^TInfoData;
+  TInfoData = record
+    id_NumSoftErrors: LongInt;  // number of soft errors on disk
+    id_UnitNumber: LongInt;     // Which unit disk is (was) mounted on
+    id_DiskState: LongInt;      // See defines below
+    id_NumBlocks: LongWord;     // Number of blocks on disk
+    id_NumBlocksUsed: LongWord; // Number of block in use
+    id_BytesPerBlock: LongWord;
+    id_DiskType: LongInt;       // Disk Type code
+    id_VolumeNode: BPTR;        // BCPL pointer to volume node
+    id_InUse: LongInt;          // Flag, zero if not in use
+  end;
+{$PACKRECORDS 2}
+
+const
+// InfoData (ID stands for InfoData)
+// Disk states }
+  ID_WRITE_PROTECTED  = 80; // Disk is write protected
+  ID_VALIDATING       = 81; // Disk is currently being validated
+  ID_VALIDATED        = 82; // Disk is consistent and writeable
+// Disk types for; id_DiskType
+  ID_NO_DISK_PRESENT     = -1;
+  ID_UNREADABLE_DISK     = $42414400; // 'BAD\0'
+  ID_BUSY_DISK           = $42555359; // 'BUSY'
+  ID_SWAP_DISK           = $53574150; // 'SWAP'
+  ID_NOT_REALLY_DOS      = $4E444F53; // 'NDOS'
+  ID_KICKSTART_DISK      = $4B49434B; // 'KICK'
+  ID_CDFS_DISK           = ((Ord('C') shl 24) or (Ord('D') shl 16) or (Ord('0') shl 8) or $01); // CDFileSystem 'CD01'
+
+  ID_DOS_DISK            = $444F5300; // 'DOS\0'
+  ID_FFS_DISK            = $444F5301; // 'DOS\1'
+  ID_INTER_DOS_DISK      = $444F5302; // 'DOS\2'
+  ID_INTER_FFS_DISK      = $444F5303; // 'DOS\3'
+  ID_FASTDIR_DOS_DISK    = $444F5304; // 'DOS\4'
+  ID_FASTDIR_FFS_DISK    = $444F5305; // 'DOS\5'
+  ID_LONGNAME_DOS_DISK   = $444F5306; // 'DOS\6'
+  ID_LONGNAME_FFS_DISK   = $444F5307; // 'DOS\7'
+
+// V53 disk type used for new vector-port based filesystems like RAM: ENV: APPDIR:
+  ID_VP255_DOS_DISK     = $444F5309;  // 'DOS\9'
+  ID_NGFS_DISK          = $4E474653;  //  NGFS
+
+// Special 'disk type' signatures returned by con-handler
+  ID_CON                = $434F4E00;  // 'CON\0'
+  ID_RAWCON             = $52415700;  // 'RAW\0'
+
+// Other known disk types
+  ID_MSDOS_DISK    = (Ord('M') shl 24) or (Ord('S') shl 16) or (Ord('D') shl 8) or $00;
+  ID_MSDOS_DISK_HD = (Ord('M') shl 24) or (Ord('S') shl 16) or (Ord('H') shl 8) or $00;
+  ID_MSDOS_DISK_DS = (Ord('M') shl 24) or (Ord('D') shl 16) or (Ord('D') shl 8) or $00;
+
+// FAT disk types
+  ID_FAT00_DISK = (Ord('F') shl 24) or (Ord('A') shl 16) or (Ord('T') shl 8) or $00;
+  ID_FAT01_DISK = (Ord('F') shl 24) or (Ord('A') shl 16) or (Ord('T') shl 8) or $01;
+  ID_FAT32_DISK = (Ord('F') shl 24) or (Ord('A') shl 16) or (Ord('T') shl 8) or $32;
+
+// FUSE filesystems
+  ID_BOX0_DISK        = $424F5800; //  BOX\0 - BoxFileSystem
+  ID_EXFAT_DISK       = $46415458; //  FATX  - exFATFileSystem
+  ID_EXT2_DISK        = $45585402; //  EXT\2 - FuseExt2FileSystem
+  ID_HFS_DISK         = $48465300; //  HFS\0 - FuseHFS
+  ID_NTFS_DISK        = $4e544653; //  NTFS  - NTFileSystem3G
+
+
+
+
+// Errors from IoErr(), etc.
+  ERROR_INVALID_PACKET_MESSAGE     = 101;
+  ERROR_WRONG_PACKET_RETURNED      = 102;
+  ERROR_NO_FREE_STORE              = 103;
+  ERROR_TASK_TABLE_FULL            = 105;
+  ERROR_BAD_TEMPLATE               = 114;
+  ERROR_BAD_NUMBER                 = 115;
+  ERROR_REQUIRED_ARG_MISSING       = 116;
+  ERROR_KEY_NEEDS_ARG              = 117;
+  ERROR_TOO_MANY_ARGS              = 118;
+  ERROR_UNMATCHED_QUOTES           = 119;
+  ERROR_LINE_TOO_LONG              = 120;
+  ERROR_FILE_NOT_OBJECT            = 121;
+  ERROR_INVALID_RESIDENT_LIBRARY   = 122;
+  ERROR_NO_DEFAULT_DIR             = 201;
+  ERROR_OBJECT_IN_USE              = 202;
+  ERROR_OBJECT_EXISTS              = 203;
+  ERROR_DIR_NOT_FOUND              = 204;
+  ERROR_OBJECT_NOT_FOUND           = 205;
+  ERROR_BAD_STREAM_NAME            = 206;
+  ERROR_OBJECT_TOO_LARGE           = 207;
+  ERROR_ACTION_NOT_KNOWN           = 209;
+  ERROR_INVALID_COMPONENT_NAME     = 210;
+  ERROR_INVALID_LOCK               = 211;
+  ERROR_OBJECT_WRONG_TYPE          = 212;
+  ERROR_DISK_NOT_VALIDATED         = 213;
+  ERROR_DISK_WRITE_PROTECTED       = 214;
+  ERROR_RENAME_ACROSS_DEVICES      = 215;
+  ERROR_DIRECTORY_NOT_EMPTY        = 216;
+  ERROR_TOO_MANY_LEVELS            = 217;
+  ERROR_DEVICE_NOT_MOUNTED         = 218;
+  ERROR_SEEK_ERROR                 = 219;
+  ERROR_COMMENT_TOO_BIG            = 220;
+  ERROR_DISK_FULL                  = 221;
+  ERROR_DELETE_PROTECTED           = 222;
+  ERROR_WRITE_PROTECTED            = 223;
+  ERROR_READ_PROTECTED             = 224;
+  ERROR_NOT_A_DOS_DISK             = 225;
+  ERROR_NO_DISK                    = 226;
+  ERROR_NO_MORE_ENTRIES            = 232;
+// added for 1.4
+  ERROR_IS_SOFT_LINK               = 233;
+  ERROR_OBJECT_LINKED              = 234;
+  ERROR_BAD_HUNK                   = 235;
+  ERROR_NOT_IMPLEMENTED            = 236;
+  ERROR_RECORD_NOT_LOCKED          = 240;
+  ERROR_LOCK_COLLISION             = 241;
+  ERROR_LOCK_TIMEOUT               = 242;
+  ERROR_UNLOCK_ERROR               = 243;
+//
+  ERROR_BUFFER_OVERFLOW            = 303; // User or internal buffer overflow
+  ERROR_BREAK                      = 304; // A break character was received
+  ERROR_NOT_EXECUTABLE             = 305; // A file has E bit cleared
+  ERROR_IS_PIPE                    = 306; // Operation is not permitted on pipes
+  ERROR_BROKEN_PIPE                = 307; // No more data can be read from or written to this pipe
+  ERROR_WOULD_BLOCK                = 308; // Operation cannot complete immediately, as requested
+  ERROR_BAD_SIGNAL_BIT             = 309; // An invalid signal bit number was specified
+//
+  ERROR_UNSUPPORTED_HARDWARE       = 350; // The hardware found is unsupported by software
+// Special error codes that can be set by MountDevice().
+  ERROR_INVALID_DEVICE_TYPE        = 401; // Device to be mounted is neither handler nor file system.
+  ERROR_INVALID_DEVICE_NAME        = 402; // Name of device to be mounted does contain more colon characters than necessary, or in the wrong place
+  ERROR_DEVICE_NAME_TOO_LONG       = 403; // Name of device to be mounted is longer than 255 characters
+  ERROR_INVALID_SECTOR_SIZE        = 404; // Sector size is not a multiple of four
+  ERROR_CONTROL_STRING_TOO_LONG    = 405; // Control string for device to be mounted is longer than 255 characters
+  ERROR_EXEC_DEVICE_NAME_TOO_LONG  = 406; // Exec device driver name for device to be mounted is longer than 255 characters
+  ERROR_HANDLER_STRING_TOO_LONG    = 407; // Name of handler to be mounted is longer than 255 characters
+  ERROR_STARTUP_STRING_TOO_LONG    = 408; // Startup string for device to be mounted is longer than 255 characters
+  ERROR_SIZE_MISSING               = 409; // Number of surfaces, sector size, number of sectors per block or number of sectors per track is zero
+  ERROR_DEVICE_NAME_MISSING        = 410; // No exec device driver name was given
+  ERROR_INVALID_NUMBER_OF_CYLINDERS = 411; // Number of cylinders to use is negative
+  ERROR_HANDLER_CANNOT_BE_STARTED   = 412; // No handler name, segment list or port address was given
+  ERROR_INVALID_GLOBAL_VECTOR       = 413; // Global vector must be one of -2 or -1
+  ERROR_INVALID_TASK_PRIORITY       = 414; // The task priority is not in the range -128..127
+
+// *********************************************************************
+// These are the return codes used by convention by AmigaDOS commands.
+// See FAILAT and IF commands for relevance to EXECUTE files.
+// See RunCommand() and CreateNewProc() for relevance to all DOS processes.
+  RETURN_OK    = 0;  // No problems, success
+  RETURN_WARN  = 5;  // A warning only
+  RETURN_ERROR = 10; // Something wrong
+  RETURN_FAIL  = 20; // Complete or severe failure
+
+// Bit numbers that signal that a user has issued a break
+  SIGBREAKB_CTRL_C = 12;
+  SIGBREAKB_CTRL_D = 13;
+  SIGBREAKB_CTRL_E = 14;
+  SIGBREAKB_CTRL_F = 15;
+// Bit fields that signal that a user has issued a break, See CheckSignal() for examples.
+  SIGBREAKF_CTRL_C = 1 shl SIGBREAKB_CTRL_C;
+  SIGBREAKF_CTRL_D = 1 shl SIGBREAKB_CTRL_D;
+  SIGBREAKF_CTRL_E = 1 shl SIGBREAKB_CTRL_E;
+  SIGBREAKF_CTRL_F = 1 shl SIGBREAKB_CTRL_F;
+// Values returned by SameLock()
+  LOCK_DIFFERENT    =  -1;
+  LOCK_SAME         =  0;
+  LOCK_SAME_HANDLER =  1; // locks are on same volume
+// types for ChangeMode()
+  CHANGE_LOCK = 0;
+  CHANGE_FH   = 1;
+// Mode parameter for DevNameFromLock() and DevNameFromFH()
+  DN_DEVICEONLY = 0;
+  DN_FULLPATH   = 1;
+  DN_ROOTPATH   = 2;
+// Mode flags for GetProcSegList() (v51.88)
+  GPSLF_CLI = 1 shl 1;
+  GPSLF_SEG = 1 shl 2;
+  GPSLF_ENT = 1 shl 3;
+  GPSLF_RUN = 1 shl 4;
+// Values for MakeLink() - DO NOT use random values, new link types will be added in the future that require other values to be used.
+  LINK_HARD = 0;
+  LINK_SOFT = 1;
+// Values returned by ReadItem (and ReadLineItem V50)
+  ITEM_EQUAL    = -2; // "=" Symbol
+  ITEM_ERROR    = -1; // error
+  ITEM_NOTHING  = 0;  // *N, ;, endstreamch
+  ITEM_UNQUOTED = 1;  // unquoted item
+  ITEM_QUOTED   = 2;  // quoted item
+// Types for AllocDosObject/FreeDosObject
+  DOS_FILEHANDLE        = 0;  // Very few people should use this
+  DOS_EXALLCONTROL      = 1;  // Must be used to allocate this! - Obsolete struct
+  DOS_FIB               = 2;  // may be useful - not really, it's obsolete now
+  DOS_STDPKT            = 3;  // for doing packet-level I/O
+  DOS_CLI               = 4;  // for shell-writers, etc
+  DOS_RDARGS            = 5;  // for ReadArgs if you pass it in
+  DOS_ANCHORPATH        = 6;  // for MatchFirst/MatchNext (V50)
+  DOS_INFODATA          = 7;  // for Info() aligned InfoData (V50)
+  DOS_NOTIFYREQUEST     = 8;  // for Notify request functions (V51)
+  DOS_LOCK              = 9;  // for filesystem lock allocations (V51)
+  DOS_FREADLINEDATA     = 10; // for FReadLine() structure. (V51)
+  DOS_EXAMINEDATA       = 11; // for filesystem ExamineData allocations.(V51)
+  DOS_DOSLIST           = 12; // for struct DosList allocations. (V52.16)
+  DOS_VOLUMELIST        = 13; // for struct list with attached nodes. (V53.52)
+  DOS_FSVECTORPORT      = 14; // for filesystem vector port creation. (53.80)
+
+type
+// The following is used by the new V51 tag;  NP_NotifyOnDeathMessage
+// See CreateNewProc() autodoc for more details.
+  PDeathMessage = ^TDeathMessage;
+  TDeathMessage = record
+    dm_Msg: PMessage;       // Embedded exec message structure.
+    dm_ReturnCode: LongInt; // Primary process return code, set by DOS
+    dm_Result2: LongInt;    // The value returned from IoErr(),set by DOS
+  end;
+
+// The following is the data structure to be used for FReadLine()
+// which is allocated by the AllocDosObject() function ONLY.
+  PFReadLineData = ^TFReadLineData;
+  TFReadLineData = record
+    frld_Line: STRPTR;                        // NUL-terminated string
+    frld_LineLength: LongWord;                // what strlen(frld_Line) would return
+    frld_DosPrivate: array[0..7] of LongWord; // -- internal dos.library use only
+  end;
+
+// For use by the V1.4+ DOS functions StrtoDate() and DatetoStr()
+type
+  _PDateTime = ^_TDateTime;
+  _TDateTime = record
+    dat_Stamp: TDateStamp; // DOS DateStamp
+    dat_Format: Byte;      // controls appearance of dat_StrDate
+    dat_Flags: Byte;       // see BITDEF's below
+    dat_StrDay: STRPTR;    // day of the week string
+    dat_StrDate: STRPTR;   // date string
+    dat_StrTime: STRPTR;   // time string
+  end;
+
+// You need this much room for each of the DateTime strings:
+CONST
+  LEN_DATSTRING = 16;
+
+// Flags for dat_Flags
+   DTB_SUBST  = 0; // substitute Today, Tomorrow, etc.
+   DTB_FUTURE = 1; // day of the week is in future
+   DTF_SUBST  = 1 shl DTB_SUBST;
+   DTF_FUTURE = 1 shl DTB_FUTURE;
+
+
+// date format values
+  FORMAT_DOS = 0; // dd-mmm-yy
+  FORMAT_INT = 1; // yy-mm-dd
+  FORMAT_USA = 2; // mm-dd-yy
+  FORMAT_CDN = 3; // dd-mm-yy
+  FORMAT_DEF = 4; // use default format, as defined by locale; if locale not
+                      // available, use FORMAT_DOS instead
+  FORMAT_ISO = 5; // yyyy-mm-dd (ISO 8601) Requires locale V48 or dos V50.36 if locale not available
+  FORMAT_MAX = FORMAT_ISO;
+
+// *********************************************************************
+// This structure is mostly DOS private for MatchXXX() directory scanner.
+Type
+  PAChain = ^TAChain;
+  TAChain = record
+    an_Child: PAChain;
+    an_Parent: PAChain;
+    an_Lock: BPTR;
+    // The remaining members are strictly DOS private.
+    an_Info: TFileInfoBlock;
+    an_Flags: Shortint;
+    an_ExData: PExamineData;
+    an_DevProc: Pointer; // real type PDevProc;
+    an_String: Array[0..0] of Char;
+  end;
+
+// Obsolete definition ==ONLY== for legacy reference, pre V50.76 DOS.
+//  This is what DOS will expect when NOT allocated by AllocDosObject().
+
+  PAnchorPathOld = ^TAnchorPathOld;
+  TAnchorPathOld = record
+    case smallint of
+    0 : (
+      ap_First: PAChain;
+      ap_Last: PAChain;
+     );
+    1 : (
+      ap_Base: PAChain;            // pointer to first anchor
+      ap_Current: PAChain;         // pointer to last anchor
+      ap_BreakBits,                // Bits we want to break on
+      ap_FoundBreak: LongWord;     // Bits we broke on. Also returns ERROR_BREAK
+      ap_Flags: Shortint;          // New use for extra word.
+      ap_Reserved: Shortint;
+      ap_Strlen: Word;             // This is what ap_Length used to be
+      ap_Info: TFileInfoBlock;
+      ap_Buf: array[0..0] of Char; // Buffer for path name, allocated by user !!
+     );
+  end;
+
+// ************************ PATTERN MATCHING ***************************
+{
+  Structure expected by MatchFirst, MatchNext.
+  Allocate this structure ONLY with AllocDosObject() from DOS 50.76+
+  and initialize the ADO_Flags with the appropriate bits as follows:
+
+  Set ADO_Mask, (ap_BreakBits) to the signal bitmask (^CDEF) that you want to
+  take a break on, or 0L, (default) if you don't want to convenience the user.
+
+  If you want to have the FULL PATH NAME of the files you found,
+  allocate an additional buffer space using the tag ADO_Strlen, this will
+  place the buffer in ap_Buffer and the size into ap_Strlen.
+
+  If you don't need the full path name, DO NOT specify the ADO_Strlen tag,
+  this will by default, set ap_Strlen to zero, for no additional buffer space.
+  In this case, the name of the file, and other stats are available in the
+  ap_ExData structure if not NULL, (or old FIB ap_Info struct for legacy apps),
+  Note that the ap_ExData pointer was NULL prior to V54, so you MUST check the
+  pointer before access, when operating with previous dos.library releases.
+  Always use ap_ExData in preference to the old ap_Info data, because only
+  ap_ExData supports 64 bit file sizes and long names > 107 bytes.
+
+  Then call MatchFirst() and then afterwards, MatchNext() with this structure.
+  You should check the return value each time (see below) and take the
+  appropriate action, ultimately calling MatchEnd() when there are
+  no more files and you are done.  You can tell when you are done by
+  checking for the normal AmigaDOS return code ERROR_NO_MORE_ENTRIES.
+
+************************************************************************
+WARNING:  You MUST allocate these with AllocDosObject() from DOS 50.76+
+        MatchXXX() will simply not work if you do not heed this warning.
+************************************************************************}
+
+  PAnchorPath = ^TAnchorPath;
+  TAnchorPath = record       // redefined for dos 50.76+ (2004)
+    ap_Magic: LongInt;       // -- PRIVATE - DOS compatibility
+    case smallint of
+    0 : (
+      ap_First: PAChain;
+      ap_Last: PAChain;
+     );
+    1 : (
+      ap_Base: PAChain;        // Ptr to first anchor
+      ap_Current: PAChain;     // Ptr to current anchor
+      ap_BreakBits: LongWord;  // Bits we want to break on
+      ap_FoundBreak: LongWord; // Bits we broke on.
+      ap_Flags: LongWord;      // The flags bitfield.
+      ap_ExData: PExamineData; // Ptr to ExamineData (or nil)
+      ap_CTXPrivate: APTR;     // -- PRIVATE, DOS use only.
+      ap_Reserved: array[0..1] of LongWord;  // Future use, currently 0
+      ap_Strlen: LongWord;     // Strlen : Size of the buffer -1
+      ap_Buffer: STRPTR;       // Full name, (see ADO_Strlen)
+      ap_Info: PFileInfoBlock; // The old FileInfoBlock space
+      ap_Private1: LongWord;   // --PRIVATE, DOS use only.
+      ap_Private2: LongWord;   // --PRIVATE, DOS use only.
+    );
+  end;
+
+// Flags for AnchorPath->ap_Flags.
+
+const
+  APB_DOWILD       = 0; // Unused
+  APB_ITSWILD      = 1; // Set by MatchFirst, used by MatchNext. Application can test APB_ITSWILD, too
+                        // (means that there's a wildcard in the pattern after calling MatchFirst).
+  APB_DODIR        = 2; // Bit is SET if a DIR node should be entered. Application can RESET this
+                        // bit after MatchFirst/MatchNext to AVOID entering a dir.
+  APB_DIDDIR       = 3; // Bit is SET for an "expired" dir node.
+  APB_NOMEMERR     = 4; // Set on memory error
+  APB_DODOT        = 5; // Unused
+  APB_DirChanged   = 6; // ap_Current->an_Lock changed since last MatchNext call
+  APB_FollowHLinks = 7; // follow hardlinks on DODIR - defaults to not following hardlinks on a DODIR.
+  APB_MultiAssigns = 8; // Set this bit via AllocDosObject() to allow Multi-Assign scanning to be enabled.
+                        // ( NOTE: ONLY AVAILABLE FROM DOS 50.76+ )
+  APF_DOWILD       = 1 shl APB_DOWILD;
+  APF_ITSWILD      = 1 shl APB_ITSWILD;
+  APF_DODIR        = 1 shl APB_DODIR;
+  APF_DIDDIR       = 1 shl APB_DIDDIR;
+  APF_NOMEMERR     = 1 shl APB_NOMEMERR;
+  APF_DODOT        = 1 shl APB_DODOT;
+  APF_DirChanged   = 1 shl APB_DirChanged;
+  APF_FollowHLinks = 1 shl APB_FollowHLinks;
+  APF_MultiAssigns = 1 shl APB_MultiAssigns; // New for V50, See AllocDosObject()
+
+// Flags for AChain->an_Flags; these are private to DOS!
+
+
+  DDB_PatternBit  = 0;
+  DDB_ExaminedBit = 1;
+  DDB_Completed   = 2;
+  DDB_AllBit      = 3;
+  DDB_Assign      = 4;
+  DDB_Device      = 5;
+
+  DDF_Device      = 1 shl DDB_Device;
+  DDF_Assign      = 1 shl DDB_Assign;
+  DDF_AllBit      = 1 shl DDB_AllBit;
+  DDF_Completed   = 1 shl DDB_Completed;
+  DDF_ExaminedBit = 1 shl DDB_ExaminedBit;
+  DDF_PatternBit  = 1 shl DDB_PatternBit;
+
+{
+ * Constants used by wildcard routines, these are the pre-parsed tokens
+ * referred to by pattern match.  It is not necessary for you to do
+ * anything about these, MatchFirst() MatchNext() handle all these for you.
+ }
+
+    P_ANY         =  $80;    { Token for '*' or '#?  }
+    P_SINGLE      =  $81;    { Token for '?' }
+    P_ORSTART     =  $82;    { Token for '(' }
+    P_ORNEXT      =  $83;    { Token for '|' }
+    P_OREND       =  $84;    { Token for ')' }
+    P_NOT         =  $85;    { Token for '~' }
+    P_NOTEND      =  $86;    { Token for }
+    P_NOTCLASS    =  $87;    { Token for '^' }
+    P_CLASS       =  $88;    { Token for '[]' }
+    P_REPBEG      =  $89;    { Token for '[' }
+    P_REPEND      =  $8A;    { Token for ']' }
+    P_STOP        =  $8B;    { token to force end of evaluation }
+
+{ Values for an_Status, NOTE: These are the actual bit numbers }
+
+    COMPLEX_BIT   =  1;       { Parsing complex pattern }
+    EXAMINE_BIT   =  2;       { Searching directory }
+
+{   hunk types }
+     HUNK_UNIT      = 999 ;
+     HUNK_NAME      = 1000;
+     HUNK_CODE      = 1001;
+     HUNK_DATA      = 1002;
+     HUNK_BSS       = 1003;
+     HUNK_RELOC32   = 1004;
+     HUNK_RELOC16   = 1005;
+     HUNK_RELOC8    = 1006;
+     HUNK_EXT       = 1007;
+     HUNK_SYMBOL    = 1008;
+     HUNK_DEBUG     = 1009;
+     HUNK_END       = 1010;
+     HUNK_HEADER    = 1011;
+
+     HUNK_OVERLAY   = 1013;
+     HUNK_BREAK     = 1014;
+
+     HUNK_DREL32    = 1015;
+     HUNK_DREL16    = 1016;
+     HUNK_DREL8     = 1017;
+
+     HUNK_LIB       = 1018;
+     HUNK_INDEX     = 1019;
+
+{   hunk_ext sub-types }
+     EXT_SYMB       = 0  ;     {   symbol table }
+     EXT_DEF        = 1  ;     {   relocatable definition }
+     EXT_ABS        = 2  ;     {   Absolute definition }
+     EXT_RES        = 3  ;     {   no longer supported }
+     EXT_REF32      = 129;     {   32 bit reference to symbol }
+     EXT_COMMON     = 130;     {   32 bit reference to COMMON block }
+     EXT_REF16      = 131;     {   16 bit reference to symbol }
+     EXT_REF8       = 132;     {    8 bit reference to symbol }
+     EXT_DEXT32     = 133;     {   32 bit data releative reference }
+     EXT_DEXT16     = 134;     {   16 bit data releative reference }
+     EXT_DEXT8      = 135;     {    8 bit data releative reference }
+
+
+type
+// All DOS processes have this structure
+  PProcess = ^TProcess;
+  TProcess = record
+    // original definitions from version 1.0 and earlier betas (v30 - 1984)
+    pr_Task: TTask;         // The exec task structure for this process
+    pr_MsgPort: TMsgPort;   // This process' message port structure
+    pr_Size: Word;          // Size of struct from V51.08+, previously 0
+    pr_SegArray: BPTR;      // -- PRIVATE - BPTR to internal process segarray[].
+    pr_StackSize: LongWord; // The running process stack size, in bytes
+    pr_gv: LongInt;         // -- OBSOLETE BCPL value - do not access this.
+    pr_CliNum: LongInt;     // CLI number, for DOS allocated cli processes.
+    pr_sb: BPTR;            // -- OBSOLETE BCPL value - do not access this.
+    pr_Result2: LongInt;    // Secondary result from last call, for IoErr()
+    pr_CurrentDir: BPTR;    // Lock associated with current directory
+    pr_CIS: BPTR;           // Current CLI Input Stream
+    pr_COS: BPTR;           // Current CLI Output Stream
+    pr_ConsoleTask: PMsgPort;     // Console handler process for current window
+    pr_FileSystemTask : PMsgPort; // File handler process for current drive
+    pr_CLI: BPTR;           // BCPL Pointer to struct CommandLineInterface
+    pr_ra: APTR;            // -- OBSOLETE - do not access this.
+    pr_PktWait: APTR;       // Function to be called when awaiting packet
+    pr_WindowPtr: APTR;     // Window for posting error requesters
+
+    // following definitions are new with 2.0 (v36 - 1990)
+    pr_ProgramDir: BPTR;       // Program's home directory lock
+    pr_Flags: LongWord;        // Flags telling dos about this process
+    pr_ExitCode: APTR;         // Code to call on exit of process or nil
+    pr_ExitData: LongInt;      // Passed as an argument to pr_ExitCode.
+    pr_Arguments: STRPTR;      // Arguments passed to the process at start
+    pr_LocalVars: TMinList;    // Local environment variables
+    pr_ShellPrivate: LongWord; // -- PRIVATE - Internal shell use only.
+    pr_CES: BPTR;              // Error stream - if nil, use pr_COS
+
+    // following definitions are new from 4.0 (v50 - Apr,2004)
+    pr_PrData: APTR;          // -- PRIVATE - internal dos access ONLY.
+    pr_CurrentSeg: BPTR;      // Seglist of current running code.(READ ONLY)
+    pr_EmulPrivate: LongWord; // -- PRIVATE - Flags for 68k JIT Emulator.
+    pr_68kPrivate: LongWord;  // -- PRIVATE - 68K control opts, OS access only
+    pr_ParentID: LongWord;    // ID# of parent process, 0 if a task. (READ ONLY)
+    pr_ProcessID: LongWord;   // ID# for this process. (READ ONLY)
+    pr_Reserved4: LongWord;   // -- reserved for dos expansion - leave alone
+    pr_OGLContextData: APTR;  // -- PRIVATE - ogl access only.
+    pr_Reserved5: APTR;       // -- reserved for dos expansion - leave alone.
+    pr_CLibData: APTR;        // -- PRIVATE - clib/newlib use, copied by CNP()
+    pr_Reserved6: APTR;       // -- reserved for dos expansion - leave alone
+
+    // following definitions are new from (v51 - Jan,2006)
+    pr_RestoreList: TMinList;  // -- PRIVATE - used by DOS for process cleanup()
+    pr_DeathSigTask: APTR;     // Process/task to signal when the process ends
+    pr_DeathSigBit: LongWord;  // Signal bit number for pr_DeathSigTask
+    pr_DeathMessage: APTR;     // DeathMessage to ReplyMsg() to when process ends
+    pr_EntryCode: APTR;        // Code to call on startup of process, or nil
+    pr_EntryData: LongInt;     // Passed as an argument to pr_EntryCode func.
+    pr_FinalCode: APTR;        // Code to call on exit of the process, or nil
+    pr_FinalData: LongInt;     // Passed as an argument to pr_FinalCode func.
+    pr_DLNotifyData: LongWord; // -- PRIVATE - dos NotifyDosListChange() data.
+    pr_PLNotifyData: LongWord; // -- PRIVATE - dos NotifyProcListChange() data.
+
+    // following definitions are new from (v52 - Dec,2006)
+    pr_UID: LongWord;      // -- PRIVATE - dos Set/GetOwnerInfo() use only.
+    pr_GID: LongWord;      // -- PRIVATE - dos Set/GetOwnerInfo() use only.
+    pr_Reserved3: LongInt; // -- reserved for dos expansion - leave alone
+    pr_Reserved2: LongInt; // -- reserved for dos expansion - leave alone
+    pr_Reserved1: LongInt; // -- reserved for dos expansion - leave alone
+    pr_Reserved0: LongInt; // -- reserved for dos expansion - leave alone
+  end; // Process - 344 bytes
+
+const
+// Flags for Process->pr_Flags for all DOS processes.
+  PRB_FREESEGLIST       = 0;  // NP_FreeSegList,TRUE sets this bit.
+  PRB_FREECURRDIR       = 1;  // NP_CurrentDir will be UnLocked if set
+  PRB_FREECLI           = 2;  // NP_Cli will be freed if this is set.
+  PRB_CLOSEINPUT        = 3;  // NP_CloseInput,TRUE sets this bit.
+  PRB_CLOSEOUTPUT       = 4;  // NP_CloseOutput,TRUE sets this bit.
+  PRB_FREEARGS_OBSOLETE = 5;  // (V50) obsolete, args copy now on task memlist.
+  PRB_CLOSEERROR        = 6;  // NP_CloseError,TRUE sets this bit. (V51)
+  PRB_LOCKSTACK         = 7;  // NP_LockStack,TRUE sets this bit. (V52.10)
+  PRB_spare08           = 8;
+  PRB_spare09           = 9;
+  PRB_spare10           = 10;
+  PRB_spare11           = 11;
+  PRB_spare12           = 12;
+  PRB_spare13           = 13;
+  PRB_spare14           = 14;
+  PRB_spare15           = 15;
+
+  PRB_spare16           = 16;
+  PRB_spare17           = 17;
+  PRB_spare18           = 18;
+  PRB_spare19           = 19;
+  PRB_spare20           = 20;
+  PRB_spare21           = 21;
+  PRB_spare22           = 22;
+  PRB_spare23           = 23;
+  PRB_CHILDPROCESS      = 24; // (V50) NP_Child,TRUE sets this for a dependant child.
+  PRB_HADCHILDREN       = 25; // (V51) Gets set if this process had created any children.
+  PRB_HASDLNOTIFY       = 26; // (V51) Set when doslist change signal notify is enabled.
+  PRB_HASPLNOTIFY       = 27; // (V51) Set when process list change signal notify is on.
+  PRB_SERVERPROCESS     = 28; // (V53) Set when process is one of the internal dos servers
+  PRB_HANDLERPROCESS    = 29; // (V52) Set to indicate if this is a handler/filesystem process
+  PRB_SHELLPROCESS      = 30; // (V51) Set to indicate if this is a shell handler process
+  PRB_EXTENDED_FLAGS    = 31; // (V51) Reserved for internal dos flags expansion use only.
+// Mask definitions for above bits
+  PRF_FREESEGLIST        = 1 shl PRB_FREESEGLIST;
+  PRF_FREECURRDIR        = 1 shl PRB_FREECURRDIR;
+  PRF_FREECLI            = 1 shl PRB_FREECLI;
+  PRF_CLOSEINPUT         = 1 shl PRB_CLOSEINPUT;
+  PRF_CLOSEOUTPUT        = 1 shl PRB_CLOSEOUTPUT;
+  PRF_FREEARGS_OBSOLETE  = 1 shl PRB_FREEARGS_OBSOLETE;
+  PRF_CLOSEERROR         = 1 shl PRB_CLOSEERROR;
+  PRF_LOCKSTACK          = 1 shl PRB_LOCKSTACK;
+
+  PRF_CHILDPROCESS       = 1 shl PRB_CHILDPROCESS;
+  PRF_HADCHILDREN        = 1 shl PRB_HADCHILDREN;
+  PRF_HASDLNOTIFY        = 1 shl PRB_HASDLNOTIFY;
+  PRF_HASPLNOTIFY        = 1 shl PRB_HASPLNOTIFY;
+  PRF_SERVERPROCESS      = 1 shl PRB_SERVERPROCESS;
+  PRF_HANDLERPROCESS     = 1 shl PRB_HANDLERPROCESS;
+  PRF_SHELLPROCESS       = 1 shl PRB_SHELLPROCESS;
+  PRF_EXTENDED_FLAGS     = 1 shl PRB_EXTENDED_FLAGS;
+
+// The long word address (BPTR) of this structure is returned by
+// Open() and other routines that return a filehandle.
+Type
+  PFileHandle = ^TFileHandle;
+  TFileHandle = record
+    fh_StructSize: Word;     // Size of DOS structure allocation.
+    fh_Flags: Word;          // --Private DOS use only.
+    fh_Interactive: LongInt; // Boolean; True if interactive handle
+    fh_MsgPort: PMsgPort;    // MsgPort of the filesystem/handler.
+    fh_Buf: BPTR;            // --Private Bufferered stream members.
+    fh_Pos: LongInt;
+    fh_End: LongInt;
+    fh_Func1: APTR;          // --Private function pointers to the
+    fh_Func2: APTR;          //   DOS i/o routines.
+    fh_Func3: APTR;
+    fh_Arg1: BPTR;           // --Private, packet handler use.
+    fh_Arg2: APTR;           // --Private, FSVP handler use.
+    fh_OpenerPID: LongWord;  // The process ID of the opener. V52.16
+    fh_Reserved2: LongInt;   // public expansion, leave alone.
+    fh_Reserved1: LongInt;   // public expansion, leave alone.
+    fh_Priv: array[0..17] of LongInt; // --Private, start of the remainder of many more private DOS members.
+  end; // FileHandle - 128 bytes
+
+// This is the standard extension to EXEC Messages used by DOS
+  PDosPacket = ^TDosPacket;
+  TDosPacket = record
+    dp_Link: PMessage;  // EXEC message
+    dp_Port: PMsgPort;  // Reply port for the packet Must be filled in each send.
+    case smallint of
+     0:(
+      dp_Action : LongInt;
+      dp_Status : LongInt;
+      dp_Status2 : LongInt;
+      dp_BufAddr : LongInt;
+     );
+     1:(
+      dp_Type : LongInt;      // See ACTION_... below
+      dp_Res1 : LongInt;      // For file system calls this is the result that would have been returned by the
+                              // function, e.g. Write() returns actual length written
+      dp_Res2 : LongInt;      // For file system calls this is what would have been returned by IoErr()
+      dp_Arg1 : LongInt;
+      dp_Arg2 : LongInt;
+      dp_Arg3 : LongInt;
+      dp_Arg4 : LongInt;
+      dp_Arg5 : LongInt;
+      dp_Arg6 : LongInt;
+      dp_Arg7 : LongInt;
+     );
+  end; // DosPacket - 48 bytes
+
+// A Packet does not require the Message to be before it in memory, but for convenience it is useful to associate the two.
+  PStandardPacket = ^TStandardPacket;
+  TStandardPacket = record
+    sp_Msg: TMessage;
+    sp_Pkt: TDosPacket;
+  end;
+
+{$PACKRECORDS 4}
+// This is the extended 64 bit style EXEC Messages used by DOS. Only dp_Type packets between 8000-8999 range use this structure.
+  PDosPacket64 = ^TDosPacket64;
+  TDosPacket64 = record
+    dp_Link: PMessage;  // EXEC message
+    dp_Port: PMsgPort;  // Reply port for the packet Must be filled in each send.
+    case smallint of
+     0:(
+      dp_Action: LongInt;
+      dp_pad: LongInt;
+      dp_Status2: LongInt;
+      dp_Status: Int64;
+      dp_BufAddr: LongInt;
+     );
+     1:(
+      dp_Type: LongInt; // See ACTION_... below
+      dp_Res0: LongInt; // Special compatibility field. [See below]
+      dp_Res2: LongInt; // This is returned for IoErr()
+      dp_Res1: Int64;   // This is the 64 bit primary result
+      dp_Arg1: LongInt; // 32 bit argument
+      dp_Arg2: Int64;   // 64 bit argument
+      dp_Arg3: LongInt; // 32 bit argument
+      dp_Arg4: LongInt; // 32 bit argument
+      dp_Arg5: Int64;   // 64 bit argument
+     );
+  end; // DosPacket64 - 64 bytes
+  PStandardPacket64 = ^TStandardPacket64;
+  TStandardPacket64 = record
+    sp_Msg: TMessage;
+    sp_Pkt: TDosPacket64;
+  end;
+
+{$PACKRECORDS 2}
+const
+// The DosPacket64 dp_Res0 member initialisation value.
+  DP64_INIT       = -3;
+// Packet types
+  ACTION_NIL                  = 0;
+  ACTION_STARTUP              = 0;
+  ACTION_EVENT                = 6; // INTERNAL for CDFS and CrossDos commodity
+  ACTION_CURRENT_VOLUME       = 7; // DEPRECATED from DOS 53.100+
+  ACTION_LOCATE_OBJECT        = 8;
+  ACTION_RENAME_DISK          = 9;
+  ACTION_FREE_LOCK            = 15;
+  ACTION_DELETE_OBJECT        = 16;
+  ACTION_RENAME_OBJECT        = 17;
+  ACTION_MORE_CACHE           = 18;
+  ACTION_COPY_DIR             = 19;
+  ACTION_WAIT_CHAR            = 20;
+  ACTION_SET_PROTECT          = 21;
+  ACTION_CREATE_DIR           = 22;
+  ACTION_EXAMINE_OBJECT       = 23; // DEPRECATED
+  ACTION_EXAMINE_NEXT         = 24; // DEPRECATED
+  ACTION_DISK_INFO            = 25;
+  ACTION_INFO                 = 26;
+  ACTION_FLUSH                = 27;
+  ACTION_SET_COMMENT          = 28;
+  ACTION_PARENT               = 29;
+  ACTION_TIMER                = 30; // INTERNAL
+  ACTION_INHIBIT              = 31;
+  ACTION_SET_DATE             = 34;
+  ACTION_SAME_LOCK            = 40;
+  ACTION_SAME_FH              = 53; // Added 53.71
+
+  ACTION_READ                 = 82; // 'R'
+  ACTION_WRITE                = 87; // 'W'
+
+  ACTION_SINGLE_CHARACTER_MODE = 994;
+  ACTION_CHANGE_SIGNAL         = 995;
+// Internal packets used by con-handler
+  ACTION_READ_RETURN          = 1001; // INTERNAL
+  ACTION_WRITE_RETURN         = 1002; // INTERNAL
+  ACTION_INT_WRITE_RETURN     = 1003; // INTERNAL
+  ACTION_FINDUPDATE           = 1004; // aka MODE_READWRITE
+  ACTION_FINDINPUT            = 1005; // aka MODE_OLDFILE
+  ACTION_FINDOUTPUT           = 1006; // aka MODE_NEWFILE
+  ACTION_END                  = 1007;
+  ACTION_SEEK                 = 1008; // DEPRECATED
+  ACTION_ICONIFY              = 1009; // INTERNAL
+
+  ACTION_FORMAT         = 1020;
+  ACTION_MAKE_LINK      = 1021;
+  ACTION_WRITE_PROTECT  = 1023;
+  ACTION_READ_SOFT_LINK = 1024;
+  ACTION_FH_FROM_LOCK   = 1026;
+  ACTION_IS_FILESYSTEM  = 1027;
+  ACTION_CHANGE_MODE    = 1028;
+  ACTION_COPY_LOCK_FH   = 1030;
+  ACTION_PARENT_FH      = 1031;
+
+// Added V52.18 - SetOwnerInfo() - replaces old SetOwner() packet 1036.
+  ACTION_SET_OWNER_INFO = 1037;
+// Internal packets used by datatypes.library
+  ACTION_NEWMEMFILE     = 1039; // INTERNAL
+  ACTION_NEWMEMLOCK     = 1040; // INTERNAL
+// New packet types for V50
+  ACTION_WAIT_FOR_DATA     = 1998;
+  ACTION_SET_BLOCKING_MODE = 1999;
+
+// PACKETS 2050-2999 are reserved for use by third party applications.
+
+  ACTION_SHUTDOWN = 3000; // Similar functionality to ACTION_DIE
+  ACTION_COLLECT  = 3001; // controls the relinquishing of active filesystem objects
+// The following are the ACTION_COLLECT object identifiers (in dp_Arg1) to identify the object that is placed in dp_Arg2.
+  ID_COLLECT_LOCK         = 1;
+  ID_COLLECT_FILEHANDLE   = 2;
+  ID_COLLECT_NOTIFICATION = 3;
+
+  ACTION_FILESYSTEM_ATTR = 3005; // Obtain or Set filesystem specific attributes; FileSystemAttr()  51.46
+  ACTION_OBTAIN_CON_INFO = 3006; // Release console information, as obtained through ACTION_OBTAIN_CON_INFO; you must pass the same parameters as with ACTION_OBTAIN_CON_INFO.
+// Packets for ExamineObject() and ExamineDir() functions. 51.104
+  ACTION_EXAMINEDATA     = 3030;
+  ACTION_EXAMINEDATA_FH  = 3031; // added @ 52.30
+  ACTION_EXAMINEDATA_DIR = 3040;
+// DOS will emulate notifications from 52.33+ if you do not support these
+  ACTION_ADD_NOTIFY     = 4097; // optional
+  ACTION_REMOVE_NOTIFY  = 4098; // optional
+  ACTION_SERIALIZE_DISK = 4200; // Tell a file system to serialize the current volume.
+  ACTION_GET_DISK_FSSM  = 4201; // DEPRECATED, Obtain a disk's geometry
+  ACTION_FREE_DISK_FSSM = 4202; // DEPRECATED, Obtain a disk's geometry
+
+// New Packet to control dos.library long path handling code. (@ v53.23)
+  ACTION_INHIBIT_DOS_LONGPATH_HANDLING = 5323;
+
+// 64 Bit ACTION types, ONLY the 8000 series use struct DosPacket64.  51.62
+  ACTION_CHANGE_FILE_POSITION64 = 8001;
+  ACTION_GET_FILE_POSITION64    = 8002;
+  ACTION_CHANGE_FILE_SIZE64     = 8003;
+  ACTION_GET_FILE_SIZE64        = 8004;
+  ACTION_LOCK_RECORD64          = 8010; // added 53.86
+  ACTION_FREE_RECORD64          = 8011; // added 53.86
+
+// 64 bit PACKETS 8500-8999 are reserved for use by third party applications.
+
+// The following were used to convert UID and GID to names and visa-versa
+  ACTION_USERNAME_TO_UID  = 20000;
+  ACTION_GROUPNAME_TO_GID = 20001;
+  ACTION_UID_TO_USERINFO  = 20002;
+  ACTION_GID_TO_GROUPINFO = 20003;
+
+type
+// Data structure used by ACTION_OBTAIN_CON_INFO/ACTION_RELEASE_CON_INFO
+  PConsoleWindowData = ^TConsoleWindowData;
+  TConsoleWindowData = record
+    Reserved: array[0..3] of LongWord; // For use by the console handler
+    ConsoleWindow: APTR;   // real type: PWindow - Pointer to console window; this may be nil for console handlers
+                           // which are not bound to a window, or if that window is currently closed.
+    ConsoleIO: PIORequest; // Pointer to console.device I/O request; this may be nil for console handlers which are not
+                           // bound to a window, or if that window is currently closed.
+    ConsoleType: LongWord; // Identifies the type of console, e.g. ID_RAWCON or ID_CON
+    DOSPrivate: array[0..1] of APTR; // Private fields for use by DOS only
+  end;
+
+// The following are used by the new V50 Address Tracking functions
+  PAddressAndSize = ^TAddressAndSize;
+  TAddressAndSize = record
+    aas_Address: LongWord;
+    aas_Size: LongWord;
+  end;
+
+  PFindTrackedAddressMsg = ^TFindTrackedAddressMsg;
+  TFindTrackedAddressMsg = record
+    ftam_Size: LongInt;
+    ftam_Name: STRPTR;
+    ftam_Date: TDateStamp;
+    ftam_SegList: BPTR;
+    ftam_SegmentNumber: LongWord;
+    ftam_SegmentOffset: LongWord;
+    ftam_ExtraInfo: APTR;
+    ftam_ExtraInfoSize: LongInt;
+    // -- 40 bytes @ V50
+    ftam_AAS: TAddressAndSize;
+    // -- 48 bytes @ 53.118
+  end;
+
+// The following is used by the new V50 pattern functions
+  PCapturedExpression = ^TCapturedExpression;
+  TCapturedExpression = record
+    cape_Next: PCapturedExpression;
+    cape_Match: STRPTR;
+    cape_Start: STRPTR;
+    cape_End: STRPTR;
+    cape_Pool: APTR;   // private
+  end;
+
+// The public structure for PseudoSegLists which are used by RunCommand(), LoadSeg(), Create[new]Proc(), AllocSegList(), etc..
+  PPseudoSegList = ^TPseudoSegList;
+  TPseudoSegList = record
+    ps_Next: BPTR;                // Pointer to next segment. Or 0.
+    ps_Jump: LongWord;            // Internal compatibility magic.
+    ps_Entry: APTR;               // The function entry pointer.
+    ps_Ikey: LongWord;            // Identification key.
+    ps_DosPrivate: LongWord;      // DOS Private use only.
+    ps_Reserved1: LongWord;       // Block alignment - reserved.
+    ps_Reserved2: LongWord;       // Block alignment - reserved.
+    ps_Data: array[0..3] of Byte; // First 4 bytes of data area.
+  end;
+
+// This value is always initialised in the ps_Jump member. (PPC & 68K)
+const
+  PSJUMP_MAGIC   = $4e714ef9; // NOP,JMP - 68k compatibility
+// These are the currently used values for use in the ps_Ikey member.
+  PSIKEY_INIT    = 0; // Set this value for normal native, data or 68k types.  UnLoadSeg() will perform the normal memory freeing on these.
+  PSIKEY_NOFREE  = $80000000; // Set this value if your seglist must not be UnLoadSeg()'ed. Not for internal components, see PSIKEY_NFSYS below.
+  PSIKEY_ELF32   = $7F454C46; //7F 'E' 'L' 'F' This is set EXCLUSIVELY by LoadSeg() for ELF32 executables.
+  PSIKEY_NFSYS   = $FFFFFFFF;
+
+type
+// A structure ONLY for the Dos resident list.  Do NOT allocate these, use AddSegment() and heed the warnings in the autodocs!
+  PDosResidentSeg = ^TDosResidentSeg;
+  TDosResidentSeg = record
+    seg_Next: BPTR;   // BCPL pointer to next DosResidentSeg, or zero
+    seg_UC: LongInt;  // Use Count
+    seg_Seg: BPTR;    // BCPL pointer to seglist of command.
+    seg_Name: array[0..3] of Char; // First 4 chars of BCPL style formatted name
+  end;
+const
+  CMD_SYSTEM   = -1;
+  CMD_INTERNAL = -2;
+  CMD_DISABLED = -999;
+
+
+
+{
+ * A structure for holding error messages - stored as array with error == 0
+ * for the last entry.
+ }
+Type
+       pErrorString = ^tErrorString;
+       tErrorString = record
+        estr_Nums     : Pointer;
+        estr_Strings  : Pointer;
+       END;
+
+
+{ DOS library node structure.
+ * This is the data at positive offsets from the library node.
+ * Negative offsets from the node is the jump table to DOS functions
+ * node = (struct DosLibrary *) OpenLibrary( "dos.library" .. )      }
+
+Type
+
+    pDosLibrary = ^tDosLibrary;
+    tDosLibrary = record
+        dl_lib          : tLibrary;
+        dl_Root         : Pointer;      { Pointer to RootNode, described below }
+        dl_GV           : Pointer;      { Pointer to BCPL global vector       }
+        dl_A2           : LongInt;      { Private register dump of DOS        }
+        dl_A5           : LongInt;
+        dl_A6           : LongInt;
+        dl_Errors       : pErrorString; { pointer to array of error msgs }
+        dl_TimeReq      : pTimeRequest; { private pointer to timer request }
+        dl_UtilityBase  : pLibrary;     { private ptr to utility library }
+        dl_IntuitionBase : pLibrary;
+    end;
+
+    pRootNode = ^tRootNode;
+    tRootNode = record
+        rn_TaskArray    : BPTR;         { [0] is max number of CLI's
+                                          [1] is APTR to process id of CLI 1
+                                          [n] is APTR to process id of CLI n }
+        rn_ConsoleSegment : BPTR;       { SegList for the CLI }
+        rn_Time          : tDateStamp;  { Current time }
+        rn_RestartSeg   : LongInt;      { SegList for the disk validator process }
+        rn_Info         : BPTR;         { Pointer ot the Info structure }
+        rn_FileHandlerSegment : BPTR;   { segment for a file handler }
+        rn_CliList      : tMinList;     { new list of all CLI processes }
+                                        { the first cpl_Array is also rn_TaskArray }
+        rn_BootProc     : PMsgPort;     { private ptr to msgport of boot fs      }
+        rn_ShellSegment : BPTR;         { seglist for Shell (for NewShell)         }
+        rn_Flags        : LongInt;      { dos flags }
+    end;
+
+CONST
+ RNB_WILDSTAR   = 24;
+ RNF_WILDSTAR   = 16777216;
+ RNB_PRIVATE1   = 1;       { private for dos }
+ RNF_PRIVATE1   = 2;
+
+Type
+    pDosInfo = ^tDosInfo;
+    tDosInfo = record
+        case smallint of
+        0 : (
+        di_ResList : BPTR;
+        );
+        1 : (
+        di_McName       : BPTR;          { Network name of this machine; currently 0 }
+        di_DevInfo      : BPTR;          { Device List }
+        di_Devices      : BPTR;          { Currently zero }
+        di_Handlers     : BPTR;          { Currently zero }
+        di_NetHand      : Pointer;       { Network handler processid; currently zero }
+        di_DevLock,                      { do NOT access directly! }
+        di_EntryLock,                    { do NOT access directly! }
+        di_DeleteLock   : tSignalSemaphore; { do NOT access directly! }
+        );
+    end;
+
+{ ONLY to be allocated by DOS! }
+
+       pCliProcList = ^tCliProcList;
+       tCliProcList = record
+        cpl_Node   : tMinNode;
+        cpl_First  : LongInt;      { number of first entry in array }
+        cpl_Array  : Array[0..0] of PMsgPort;
+                             { [0] is max number of CLI's in this entry (n)
+                              * [1] is CPTR to process id of CLI cpl_First
+                              * [n] is CPTR to process id of CLI cpl_First+n-1
+                              }
+       END;
+
+// DOS Processes started from the CLI via RUN or NEWCLI have this additional set of data associated with them
+Type
+  PCommandLineInterface = ^TCommandLineInterface;
+  TCommandLineInterface = record
+    cli_Result2: LongInt;       // Value of IoErr from last command
+    cli_CurrentDirName: BSTR;   // Name of current directory
+    cli_PathList: BPTR;         // Lock associated with command directory
+    cli_ReturnCode: LongInt;    // Return code from last command
+    cli_CommandName: BSTR;      // Name of current command
+    cli_FailLevel: LongInt;     // Fail level (set by FAILAT)
+    cli_Prompt: BSTR;           // Current prompt (set by PROMPT)
+    cli_StandardInput: BPTR;    // Default (terminal) CLI input stream
+    cli_CurrentInput: BPTR;     // Current CLI input stream
+    cli_CommandFile: BSTR;      // BSTR name of EXECUTE command file
+    cli_Interactive: LongInt;   // Boolean; Truth if prompts required
+    cli_Background: LongInt;    // Boolean; Truth if CLI created by 'RUN'
+    cli_CurrentOutput: BPTR;    // Current CLI output
+    cli_DefaultStack: LongWord; // Stack size to be obtained in long words
+    cli_StandardOutput: BPTR;   // Default (terminal) CLI output
+    cli_Module: BPTR;           // SegList of currently loaded command
+  end;
+
+  // VOLUME structure; vn_Type==DLT_VOLUME
+  PVolumeNode = ^TVolumeNode;
+  TVolumeNode = record
+    vn_Next: BPTR;             // BPTR to next entry in the chain
+    vn_Type: LongInt;          // always DLT_VOLUME for dos "volumes"
+    vn_Port: PMsgPort;         // msg port for the handler process
+    vn_Reserved2: LongInt;     // reserved for use by DOS
+    vn_VolumeDate: TDateStamp; // creation date
+    vn_LockList: BPTR;         // unused, leave as 0
+    vn_DOSType: LongInt;       // ie; 'DOS\7' - 32 bit hex dostype = vn_DiskType
+    vn_FSPrivate: LongInt;     // private filesystem use
+    vn_Name: BSTR;             // bstr name
+    vn_StructSize: LongInt;    // FULL size of this structure
+    vn_Reserved: array[0..3] of LongInt; // DOS expansion
+  end;
+
+// DEVICE structure; dn_Type==DLT_DEVICE
+  PDeviceNode = ^TDeviceNode;
+  TDeviceNode = record
+    dn_Next: BPTR;          // BPTR to next entry in the chain
+    dn_Type: LongInt;       // always DLT_DEVICE for dos "devices"
+    dn_Port: PMsgPort;      // msg port to the handler process.
+    dn_Reserved1: LongInt;  // reserved for use by DOS
+    dn_Handler: BSTR;       // BSTR name to loadseg if seglist==0
+    dn_StackSize: LongInt;  // stacksize for the handler process
+    dn_Priority: LongInt;   // task priority when starting task
+    dn_Startup: BPTR;       // startup msg / FileSysStartupMsg
+    dn_SegList: BPTR;       // code to run handler process. if nil then dn_Handler will be loaded
+    dn_GlobalVec: LongInt;  // Global vector locking method key to use when starting the handler proc.
+                            // A value of -1 is used for standard C startup locking method. Only values -1 & -2 are valid now.
+    dn_Name: BSTR;          // BSTR device node name.
+    dn_StructSize: LongInt; // FULL size of this structure.
+    dn_Reserved: array[0..3] of LongInt; // DOS expansion space.
+  end;
+
+  PMultiAssign = ^TMultiAssign; // For normal DLT_LOCK and DLT_NONBINDING(v54) multi-assigns
+  TMultiAssign = record
+    ma_Next: PMultiAssign;      // next MultiAssign in chain, or nil
+    dat: record
+      ma_lock: BPTR;   // for DLT_LOCK multi-assigns
+      ma_name: STRPTR; // for DLT_NONBINDING multi-assigns (v54)
+    end;
+  end;
+
+
+  // ASSIGN struct; DLT_LOCK, DLT_LATE, DLT_NONBINDING
+  PAssignNode = ^TAssignNode;
+  TAssignNode = record
+    an_Next: BPTR;                      // BPTR to next entry in the chain
+    an_Type: LongInt;                   // DLT_LOCK,DLT_LATE,DLT_NONBINDING
+    an_Port: PMsgPort;                  // Ptr to handler process port for DLT_LOCK types.
+    an_Lock: BPTR;                      // Primary lock for DLT_LOCK assignments
+    an_AssignName: STRPTR;              // Primary name for non or late-binding assigns
+    an_MultiAssignList: PMultiAssign;   // Chain of DLT_LOCK multi-assigns
+    an_NBMultiAssignList: PMultiAssign; // Chain of DLT_NONBINDING multi-assigns
+    an_Unused: array[0..2] of LongInt;  // not currently used, leave as 0
+    an_Name: BSTR;                      // BSTR assignment node name
+    an_StructSize: LongInt;             // FULL allocated size of this structure.
+    an_Reserved: array[0..3] of LongInt;// DOS reserved expansion space.
+  end;
+
+       pAssignList = ^tAssignList;
+       tAssignList = record
+        al_Next : pAssignList;
+        al_Lock : BPTR;
+       END;
+
+// COMBINED structure for all types.
+  PDosList = ^TDosList;
+  TDosList = record
+    dol_Next: BPTR;      // bptr to next device on list
+    dol_Type: LongInt;   // see DLT below
+    dol_Port: PMsgPort;  // ptr to handler task
+    case smallint of
+    0:(
+        dol_Device: record
+          dol_Reserved1: LongInt; // Reserved for use by DOS.
+          dol_Handler: BSTR;      // BSTR file name to LoadSeg if dol_Seglist = nil.
+          dol_StackSize: LongInt; // Stacksize to use when starting process.
+          dol_Priority: LongInt;  // Task priority when starting process
+          dol_Startup: BPTR;      // Startup msg: FileSysStartupMsg for disks
+          dol_SegList: BPTR;      // Already loaded seglist for new process.
+          dol_GlobVec: LongInt;   // Global vector locking method key (-1 or -2)
+        end;
+    );
+    1 : (
+        dol_Volume: record
+          dol_Reserved2: LongInt;     // Reserved for use by DOS.
+          dol_VolumeDate: TDateStamp; // creation date
+          dol_LockList: BPTR;         // Unused, leave as 0
+          dol_DiskType: LongInt;      // 'DOS\0' - 32 bit hex identity
+          dol_FSPrivate: LongInt;     // Used privately by filesystems.
+        end;
+    );
+    2 : (
+        dol_Assign       :  record
+          dol_Lock: BPTR;         // Used by DLT_LOCK assign type only.
+          dol_AssignName: STRPTR; // name for non-OR-late-binding assign
+          dol_List: PAssignList;  // for multi-directory assigns (regular)
+          dol_MultiAssignList: PMultiAssign;   // Chain of DLT_LOCK multi-assigns
+          dol_NBMultiAssignList: PMultiAssign; // Chain of DLT_NONBINDING multi-assigns (V54)
+          dol_Unused: array[0..2] of LongInt;  // Not used for assigns, leave as 0
+        END;
+    dol_Name: BSTR;          // BSTR formatted name string
+    dol_StructSize: LongInt; // (See NOTES) FULL allocated size of struct
+    dol_Reserved: array[0..3] of LongInt; // DOS reserved expansion space.
+    );
+   END;
+
+
+{ This structure can take on different values depending on whether it is
+ * a device, an assigned directory, or a volume.  Below is the structure
+ * reflecting volumes only.  Following that is the structure representing
+ * only devices.
+ }
+
+{ structure representing a volume }
+
+    pDeviceList = ^tDeviceList;
+    tDeviceList = record
+        dl_Next         : BPTR;         { bptr to next device list }
+        dl_Type         : LongInt;      { see DLT below }
+        dl_Task         : PMsgPort;     { ptr to handler task }
+        dl_Lock         : BPTR;         { not for volumes }
+        dl_VolumeDate   : tDateStamp;   { creation date }
+        dl_LockList     : BPTR;         { outstanding locks }
+        dl_DiskType     : LongInt;      { 'DOS', etc }
+        dl_unused       : LongInt;
+        dl_Name         : BSTR;         { bptr to bcpl name }
+    end;
+
+{ device structure (same as the DeviceNode structure in filehandler.h) }
+
+    pDevInfo = ^tDevInfo;
+    tDevInfo = record
+        dvi_Next        : BPTR;
+        dvi_Type        : LongInt;
+        dvi_Task        : Pointer;
+        dvi_Lock        : BPTR;
+        dvi_Handler     : BSTR;
+        dvi_StackSize   : LongInt;
+        dvi_Priority    : LongInt;
+        dvi_Startup     : LongInt;
+        dvi_SegList     : BPTR;
+        dvi_GlobVec     : BSTR;
+        dvi_Name        : BSTR;
+    end;
+
+{    structure used for multi-directory assigns. AllocVec()ed. }
+
+
+
+
+
+
+const
+// definitions for dl_Type
+  DLT_DEVICE     = 0;
+  DLT_LOCK       = 1;  // normal assign
+  DLT_VOLUME     = 2;
+  DLT_LATE       = 3;  // late-binding assign
+  DLT_NONBINDING = 4;  // non-binding assign
+  DLT_PRIVATE    = -1; // for internal dos use only
+
+// Flags for Doslist functions
+  LDB_READ    = 0;
+  LDB_WRITE   = 1;
+  LDB_DEVICES = 2;
+  LDB_VOLUMES = 3;
+  LDB_ASSIGNS = 4;
+  LDB_ENTRY   = 5;
+  LDB_DELETE  = 6;
+
+// You MUST specify one of LDF_READ or LDF_WRITE
+  LDF_READ  = 1 shl LDB_READ;
+  LDF_WRITE = 1 shl LDB_WRITE;
+
+// Flags to be passed to LockDosList(), etc
+  LDF_DEVICES = 1 shl LDB_DEVICES;
+  LDF_VOLUMES = 1 shl LDB_VOLUMES;
+  LDF_ASSIGNS = 1 shl LDB_ASSIGNS;
+  LDF_ENTRY   = 1 shl LDB_ENTRY;   // internal
+  LDF_DELETE  = 1 shl LDB_DELETE;  // internal
+
+// Actually all but the internal locking flags
+  LDF_ALL = LDF_DEVICES or LDF_VOLUMES or LDF_ASSIGNS;
+
+// Mode types for NonBlockingModifyDosEntry()   (v51.30)
+
+  NBM_ADDDOSENTRY     = 1 shl 0;
+  NBM_REMDOSENTRY     = 1 shl 1;
+  NBM_RENAMEDOSENTRY  = 1 shl 2;
+  NBM_CHANGESIGNAL    = 1 shl 3;
+  NBM_REMFREEDOSENTRY = 1 shl 4; // added 53.67
+  NBM_DISKINSERTED    = 1 shl 5; // added 53.73
+  NBM_DISKREMOVED     = 1 shl 6; // added 53.73
+
+// A filesystem lock structure, as returned by Lock(), DupLock(), etc.. private
+type
+  PLock = ^TLock;
+  TLock = record
+    fl_Link: BPTR;      // PRIVATE - filesystem use only.
+    fl_Key: LongInt;    // PRIVATE - filesystem use only.
+    fl_Access: LongInt; // PRIVATE - filesystem use only.
+    fl_Port: PMsgPort;  // Handler process message port
+    fl_Volume: BPTR;    // BPTR to DLT_VOLUME DosList entry
+      // -- V51 additions --
+    fl_FSPrivate1: APTR;     // PRIVATE - filesystem use only.    */
+    fl_FSPrivate2: APTR;     // PRIVATE - filesystem use only.    */
+    fl_DOSType: LongWord;    // The DOSType of the filesystem, initialised by AllocDosObject(). */
+    fl_StructSize: LongWord; // Full DOS allocated struct size, initialised by AllocDosObject(). */
+      // -- V53 additions --
+    fl_DosPrivate: LongInt;              // PRIVATE - dos library use only.
+    fl_Reserved: array[0..1] of LongInt; // RESERVED for expansion. V53
+  end;// Filesystem private data usually extends past the end of this definition.
+
+type
+// The Public structure return by GetDeviceProc(), GetDeviceProcFlags()
+  PDevProc = ^TDevProc;
+  TDevProc = record
+    dvp_Port: PMsgPort;  // Handler message port
+    dvp_Lock: BPTR;      // Reference lock (or nil)
+    dvp_Flags: LongWord; // Flags fields.
+  end; // DOS private data extends past the end of this definition.
+
+const
+// Definitions for TDevProc.dvp_Flags;
+  DVPB_UNLOCK      = 0; // For DOS internal use.
+  DVPB_MULTIASSIGN = 1; // The Lock refers to part of a multi-assignment
+// The following flags were added at V53.56 to provide additional functionality for LockTags() and other internal subsystems.
+  DVPB_DEVICE      = 16; // The supplied path is a device relative specification.
+  DVPB_VOLUME      = 17; // The supplied path is a volume relative specification.
+  DVPB_ASSIGNMENT  = 18; // The supplied path is an assignment relative specification.
+  DVPB_PROGDIR     = 19; // The supplied path is a PROGDIR: relative specification.
+  DVPB_CURRDIR     = 20; // The supplied path is a CURRDIR: relative specification.
+  DVPB_ROOTDIR     = 21; // The supplied path is a root directory relative specification.
+  DVPB_CONSOLE     = 23; // The supplied path is a CONSOLE: handler specification.
+  DVPB_FILESYS     = 24; // The supplied path returned the root of the default filesystem.
+// Field definitions for above bits
+  DVPF_UNLOCK      = 1 shl DVPB_UNLOCK;
+  DVPF_MULTIASSIGN = 1 shl DVPB_MULTIASSIGN;
+  DVPF_DEVICE      = 1 shl DVPB_DEVICE;
+  DVPF_VOLUME      = 1 shl DVPB_VOLUME;
+  DVPF_ASSIGNMENT  = 1 shl DVPB_ASSIGNMENT;
+  DVPF_PROGDIR     = 1 shl DVPB_PROGDIR;
+  DVPF_CURRDIR     = 1 shl DVPB_CURRDIR;
+  DVPF_ROOTDIR     = 1 shl DVPB_ROOTDIR;
+  DVPF_CONSOLE     = 1 shl DVPB_CONSOLE;
+  DVPF_FILESYS     = 1 shl DVPB_FILESYS;
+
+// Error report types for ErrorReport()
+  REPORT_STREAM = 0; // a stream
+  REPORT_TASK   = 1; // a process - currently unused
+  REPORT_LOCK   = 2; // a lock
+  REPORT_VOLUME = 3; // a volume node
+  REPORT_INSERT = 4; // "please insert volume..."
+
+// Special error codes for ErrorReport()
+  ABORT_DISK_ERROR = 296; // Read/write error
+  ABORT_BUSY       = 288; // "You MUST replace..."
+
+// Types for initial packets to shells from run/newcli/execute/system. For shell-writers only
+  RUN_EXECUTE       = -1;
+  RUN_SYSTEM        = -2;
+  RUN_SYSTEM_ASYNCH = -3;
+
+{    Types for fib_DirEntryType.  NOTE that both USERDIR and ROOT are      }
+{    directories, and that directory/file checks should use <0 and >=0.    }
+{    This is not necessarily exhaustive!  Some handlers may use other      }
+{    values as needed, though <0 and >=0 should remain as supported as     }
+{    possible.                                                             }
+     ST_ROOT       =  1 ;
+     ST_USERDIR    =  2 ;
+     ST_SOFTLINK   =  3 ;      {    looks like dir, but may point to a file! }
+     ST_LINKDIR    =  4 ;      {    hard link to dir }
+     ST_FILE       =  -3;      {    must be negative for FIB! }
+     ST_LINKFILE   =  -4;      {    hard link to file }
+     ST_PIPEFILE   =  -5;      {    for pipes that support ExamineFH   }
+
+Type
+
+{ a lock structure, as returned by Lock() or DupLock() }
+
+    pFileLock = ^tFileLock;
+    tFileLock = record
+        fl_Link         : BPTR;         { bcpl pointer to next lock }
+        fl_Key          : LongInt;      { disk block number }
+        fl_Access       : LongInt;      { exclusive or shared }
+        fl_Task         : PMsgPort;     { handler task's port }
+        fl_Volume       : BPTR;         { bptr to a DeviceList }
+    end;
+
+
+{  NOTE: V37 dos.library, when doing ExAll() emulation, and V37 filesystems  }
+{  will return an error if passed ED_OWNER.  If you get ERROR_BAD_NUMBER,    }
+{  retry with ED_COMMENT to get everything but owner info.  All filesystems  }
+{  supporting ExAll() must support through ED_COMMENT, and must check Type   }
+{  and return ERROR_BAD_NUMBER if they don't support the type.               }
+
+{   values that can be passed for what data you want from ExAll() }
+{   each higher value includes those below it (numerically)       }
+{   you MUST chose one of these values }
+CONST
+     ED_NAME        = 1;
+     ED_TYPE        = 2;
+     ED_SIZE        = 3;
+     ED_PROTECTION  = 4;
+     ED_DATE        = 5;
+     ED_COMMENT     = 6;
+     ED_OWNER       = 7;
+
+// The ExAll() function and associated structures have been deprecated for V50.
+// Use ExamineDir()/ExamineObject() from V50 onwards.
+
+// Structure in which exall results are returned in.
+//  Note that only the fields asked for will exist!
+type
+  PExAllData = ^TExAllData;
+  TExAllData = record
+    ed_Next: PExAllData;
+    ed_Name: STRPTR;
+    ed_Type: LongInt;
+    ed_Size: LongWord;  // only good to 4gig
+    ed_Prot: LongWord;
+    ed_Days: LongWord;
+    ed_Mins: LongWord;
+    ed_Ticks: LongWord;
+    ed_Comment: STRPTR; // strings will be after last used field
+    ed_OwnerUID: Word;  // new for V39
+    ed_OwnerGID: Word;
+  end;
+
+{ Control structure passed to ExAll.  Unused fields MUST be initialized to 0, expecially eac_LastKey.
+  eac_MatchFunc is a hook (see utility.library documentation for usage)
+  It should return true if the entry is to returned, false if it is to be ignored.
+  This structure MUST be allocated by AllocDosObject()!}
+  PExAllControl = ^TExAllControl;
+  TExAllControl = record
+    eac_Entries: LongWord;   // number of entries returned in buffer
+    eac_LastKey: LongWord;   // Don't touch inbetween linked ExAll calls!
+    eac_MatchString: STRPTR; // wildcard string for pattern match OR nil
+    eac_MatchFunc: PHook;    // optional private wildcard function
+  end;
+
+type
+  pDosEnvec = ^tDosEnvec;
+  tDosEnvec = record
+    de_TableSize: LongWord;      // Size of Environment vector
+    de_SizeBlock: LongWord;      // in longwords: standard value is 128
+    de_SecOrg: LongWord;         // not used; must be 0
+    de_Surfaces: LongWord;       // # of heads (surfaces). drive specific
+    de_SectorPerBlock: LongWord; // not used; must be 1
+    de_BlocksPerTrack: LongWord; // blocks per track. drive specific
+    de_Reserved: LongWord;       // DOS reserved blocks at start of partition.
+    de_PreAlloc: LongWord;       // DOS reserved blocks at end of partition
+    de_Interleave: LongWord;     // usually 0
+    de_LowCyl: LongWord;         // starting cylinder. typically 0
+    de_HighCyl: LongWord;        // max cylinder. drive specific
+    de_NumBuffers: LongWord;     // Initial # DOS of buffers.
+    de_BufMemType: LongWord;     // type of mem to allocate for buffers
+    de_MaxTransfer: LongWord;    // Max number of bytes to transfer at a time
+    de_Mask: LongWord;           // Address Mask to block out certain memory
+    de_BootPri: LongInt;         // Boot priority for autoboot
+    de_DosType: LongWord;        // ASCII (HEX) string showing filesystem type; $444F5300 is old filesystem, $444F5301 is fast file system
+    de_Baud: LongWord;           // Baud rate for serial handler
+    de_Control: LongWord;        // Control smallint for handler/filesystem
+    de_BootBlocks: LongWord;     // Number of blocks containing boot code
+  end;
+
+const
+// The following are the offsets when DosEnvec was accessed as an array of longwords; DE_TABLESIZE is set to the number of fields in the array, minus 1,
+//  that is, NOT including the DE_TABLESIZE field itself. So if de_DosType was the last valid entry, de_TableSize = DE_DOSTYPE.
+
+  DE_TABLESIZE        = 0; // minimum value is 11 (includes NumBuffers)
+  DE_SIZEBLOCK        = 1; // in longwords: standard value is 128
+  DE_SECORG           = 2; // not used; must be 0
+  DE_NUMHEADS         = 3; // # of heads (surfaces). drive specific
+  DE_SECSPERBLK       = 4; // not used; must be 1
+  DE_BLKSPERTRACK     = 5; // sectors per track. drive specific
+  DE_RESERVEDBLKS     = 6; // unavailable blocks at start. usually 2
+  DE_PREFAC           = 7; // not used; must be 0
+  DE_INTERLEAVE       = 8; // usually 0
+  DE_LOWCYL           = 9; // starting cylinder. typically 0
+  DE_UPPERCYL         = 10; // max cylinder.  drive specific
+  DE_NUMBUFFERS       = 11; // starting # of buffers.  typically 5
+  DE_MEMBUFTYPE       = 12; // type of mem to allocate for buffers.
+  DE_BUFMEMTYPE       = 12; //    1 is public, 3 is chip, 5 is fast
+  DE_MAXTRANSFER      = 13; // Max number bytes to transfer at a time
+  DE_MASK             = 14; // Address Mask to block out certain memory
+  DE_BOOTPRI          = 15; // Boot priority for autoboot
+  DE_DOSTYPE          = 16; // ASCII (HEX) string showing filesystem type; $444F5300 is old filesystem, $444F5301 is fast file system
+  DE_BAUD             = 17; // Baud rate for serial handler
+  DE_CONTROL          = 18; // Control word for handler/filesystem
+  DE_BOOTBLOCKS       = 19; // Number of blocks containing boot code
+
+// The file system startup message is linked into a device node's startup
+// field.  It contains a pointer to the above environment, plus the
+// information needed to do an exec OpenDevice().
+type
+  PFileSysStartupMsg = ^TFileSysStartupMsg;
+  TFileSysStartupMsg = record
+    fssm_Unit: LongWord;  // exec unit number for this device
+    fssm_Device: BSTR;    // null terminated bstring to the device name
+    fssm_Environ: BPTR;   // ptr to environment table (see above)
+    fssm_Flags: LongWord; // flags for OpenDevice()
+  end;
+
+// The public portion of the structure used for the new V50 functions;
+// GetDiskFileSystemData() and FreeDiskFileSystemData().
+// Do not depend on the size of this structure to stay constant.
+  PFileSystemData = ^TFileSystemData;
+  TFileSystemData = record
+    fsd_Size: LongWord;                  // the size of this structure
+    fsd_FileSystemName: STRPTR;
+    fsd_DeviceName: STRPTR;
+    fsd_DeviceUnit: LongWord;
+    fsd_DeviceFlags: LongWord;
+    fsd_Environment: PDosEnvec;          // WARNING: See (Note 1) below
+    fsd_DosPrivate: array[0..3] of APTR; // this really is dos private !
+    fsd_Reserved: array[0..3] of APTR;
+  end;
+const
+  // The new V53 struct FileSystemVectorPort includes follow.
+  FS_VECTORPORT_VERSION = 53;
+
+type
+  PFileSystemVectors = ^TFileSystemVectors;
+  TFileSystemVectors = record
+    StructSize: LongWord; // Filesystem must initialise this to; sizeof(struct FileSystemVectors)
+    Version: LongWord;    // Filesystem must initialise this to; FS_VECTORPORT_VERSION
+    FSPrivate: APTR;      // Private field for exclusive use by the filesystem, this is generally used to point to the filesystems private global data structure to
+                          // make it accessible from the vector-port functions. Optionally, the filesystem may just initialise this to zero and then after the AllocDosObject() call, place your required data in there.
+    Reserved: array[0..2] of LongWord; // Filesystems initialise these to 0 - reserved expansion
+    DOSPrivate: APTR;     // Filesystems initialise this  to 0 - private DOS usage
+    // function links
+    DOSEmulatePacket: Pointer;
+    FSLock,
+    FSUnLock,
+    FSDupLock,
+    FSCreateDir,
+    FSParentDir,
+    FSDupLockFromFH,
+    FSOpenFromLock,
+    FSParentOfFH,
+    FSOpen,
+    FSClose,
+    FSDelete,
+    FSRead,
+    FSWrite,
+    FSFlush,
+    FSChangeFilePosition,
+    FSChangeFileSize,
+    FSGetFilePosition,
+    FSGetFileSize,
+    FSChangeLockMode,
+    FSChangeFileMode,
+    FSSetDate,
+    FSSetProtection,
+    FSSetComment,
+    FSSetGroup,
+    FSSetOwner,
+    FSRename,
+    FSCreateSoftLink,
+    FSCreateHardLink,
+    FSReadSoftLink,
+    FSSameLock,
+    FSSameFile,
+    FSFileSystemAttr,
+    FSVolumeInfoData,
+    FSDeviceInfoData,
+    FSReserved1,
+    FSReserved2,
+    FSExamineLock,
+    FSExamineFile,
+    FSExamineDir,
+    FSInhibit,
+    FSWriteProtect,
+    FSFormat,
+    FSSerialize,
+    FSRelabel,
+    FSReserved3,
+    FSAddNotify,
+    FSRemoveNotify,
+    FSLockRecord,
+    FSUnLockRecord: Pointer;
+    //=== End of V53 vectors, - New V54 vectors to be added after this line ===
+    End_Marker: LongInt; // This must always be at vector table end, set to -1
+  end;
+
+  PFileSystemVectorPort = ^TFileSystemVectorPort;
+  TFileSystemVectorPort = record
+    MP: TMsgPort;
+    FSV: TFileSystemVectors;
+  end;
+
+  FSVP = TFileSystemVectorPort; // shortcut
+
+const
+ // The type of device to mount
+  MDT_FileSystem = 0; // A file system, which is associated with a block storage device
+  MDT_Handler    = 1; // Any other kind which does not require a block storage device
+// Control tags which describe the device MountDevice() should mount
+  MD_Dummy           = TAG_USER + 4000;
+  MD_SectorSize      = MD_Dummy + 1;  // Sector size in bytes (ULONG); must be a multiple of 4
+  MD_Surfaces        = MD_Dummy + 2;  // Number of surfaces the file system should use (ULONG)
+  MD_SectorsPerBlock = MD_Dummy + 3;  // Number of sectors that make up a data block (ULONG)
+  MD_SectorsPerTrack = MD_Dummy + 4;  // Number of sectors that make up a track (ULONG)
+  MD_Reserved        = MD_Dummy + 5;  // Number of sectors at the beginning of the partition which should not be touched by the file system (ULONG)
+  MD_PreAlloc        = MD_Dummy + 6;  // Number of sectors at the end of the partition which should not be touched by the file system (ULONG)
+  MD_LowCyl          = MD_Dummy + 7;  // Lowest cylinder number used by the file system (ULONG)
+  MD_HighCyl         = MD_Dummy + 8;  // Highest cylinder number used by the file system (ULONG)
+  MD_NumBuffers      = MD_Dummy + 9;  // Number of data buffers the file system is to use (ULONG)
+  MD_BufMemType      = MD_Dummy + 10; // The type of memory to use for data buffers (ULONG)
+  MD_MaxTransfer     = MD_Dummy + 11; // Maximum number of bytes the device driver can transfer in a single step (ULONG)
+  MD_Mask            = MD_Dummy + 12; // Bit mask which covers the address range which the device driver can access (ULONG)
+  MD_DOSType         = MD_Dummy + 13;  // File system signature, e.g. ID_DOS_DISK (ULONG)
+  MD_Baud            = MD_Dummy + 14;  // Transmission speed (bits/second) to be used by the handler (ULONG)
+  MD_Control         = MD_Dummy + 15;  // Control information for the handler/file system (STRPTR).
+  MD_Device          = MD_Dummy + 16;  // Name of the exec device driver this file system is to use (STRPTR).
+  MD_Unit            = MD_Dummy + 17;  // Exec device driver unit number to be used by this file system (ULONG).
+  MD_Flags           = MD_Dummy + 18;  // Flags to use when the file system opens the exec device driver (ULONG).
+  MD_StackSize       = MD_Dummy + 19;  // Size of the stack to allocate for the file system (ULONG).
+  MD_Priority        = MD_Dummy + 20;  // Priority to start the file system process with (LONG).
+  MD_GlobVec         = MD_Dummy + 21;  // Global vector number (LONG).
+  MD_StartupNumber   = MD_Dummy + 22;  // The number to store as the file system startup data (LONG).
+  MD_StartupString   = MD_Dummy + 23;  // The string to store as the file system startup data (STRPTR).
+  MD_IgnoreFSR       = MD_Dummy + 24;  // Whether the file system parameters should be initialized from the FileSystem.resource or not (BOOL).
+  MD_Activate        = MD_Dummy + 25;  // Whether the file system should be activated immediately after it has been mounted (BOOL).
+  MD_Handler         = MD_Dummy + 26;  // Name of the handler which implements the file system (STRPTR).
+  MD_SegList         = MD_Dummy + 27;  // The segment list which refers to the code which implements the file system (BPTR).
+  MD_Port            = MD_Dummy + 28;  // The port which implements the file system (struct MsgPort *).
+  MD_Entry           = MD_Dummy + 29;  // The function which implements the file system (VOID (*)(VOID)).
+
+
+// Flags for DismountDevice()
+  DMDF_KEEPDEVICE     =  1 shl 0;
+  DMDF_REMOVEDEVICE   =  1 shl 1;
+  DMDF_FORCE_DISMOUNT =  1 shl 2;
+
+const
+// --- NotifyMessage Class
+  NOTIFY_CLASS  =  $40000000;
+// --- NotifyMessage Codes
+  NOTIFY_CODE   =  $1234;
+
+
+// Sent to the application if SEND_MESSAGE is specified.
+
+type
+  PNotifyRequest = ^tNotifyRequest;
+  tNotifyRequest = record
+    nr_Name : STRPTR;       // The name of object for notification
+    nr_FullName: STRPTR;   // PRIVATE: set by dos - don't touch
+    nr_UserData: LongWord; // For the applications use
+    nr_Flags: LongWord;    // Notify method flags NRF_xxx
+    nr_stuff: record
+    case smallint of
+    0: (nr_Msg: record
+        nr_Port: PMsgPort;              // for SEND_MESSAGE
+        nr_MsgPad: array[0..3] of Byte; // Reserved
+     end);
+    1: (nr_Signal : record
+        nr_Task : PTask;                // for SEND_SIGNAL
+        nr_SignalNum : Byte;            // for SEND_SIGNAL
+        nr_SigPad: array[0..2] of Byte; // reserved
+     end);
+     0: (nr_CallHook: record
+        nr_Hook: PHook;                  // for CALL_HOOK
+        nr_HookPad: array[0..3] of Byte; // Reserved
+     end);
+    end;
+    nr_Reserved : array[0..1] of LongWord; // Reserved - leave as 0 for now
+    // internal use by dos and handlers
+    nr_DosPrivate:LongWord;                // PRIVATE: DOS use only. -  V51.30
+    nr_FSPrivate: APTR;                    // PRIVATE: FS/Handler use only. - V51.30
+    nr_MsgCount: LongWord;                 // PRIVATE: # of outstanding msgs
+    nr_Handler: PMsgPort;                  // PRIVATE: handler sent to (for EndNotify)
+    nr_Expansion: array[0..3] of LongWord; // expansion space - added V51.30
+  end;
+
+  PNotifyMessage = ^TNotifyMessage;
+  TNotifyMessage = record
+    nm_ExecMessage: TMessage;
+    nm_Class: LongWord;
+    nm_Code: Word;
+    nm_NReq: PNotifyRequest;  // Don't modify the request while active !
+    nm_DoNotTouch: LongWord;  // Like it says! For use by handlers
+    nm_DoNotTouch2: LongWord; // ditto
+  end;
+
+const
+// Flag bit numbers
+  NRB_SEND_MESSAGE      = 0;
+  NRB_SEND_SIGNAL       = 1;
+  NRB_WAIT_REPLY        = 3;
+  NRB_NOTIFY_INITIAL    = 4;
+  NRB_CALL_HOOK         = 5;
+  NRB_DOS_NOTIFY_ONLY   = 12;
+  NRB_MAGIC             = 31; // PRIVATE - Handler use only.
+
+// --- NotifyRequest Flags ------------------------------------------------
+// Notify Methods - the following three are mutually exclusive
+  NRF_SEND_MESSAGE      = 1 shl NRB_SEND_MESSAGE;
+  NRF_SEND_SIGNAL       = 1 shl NRB_SEND_SIGNAL;
+  NRF_CALL_HOOK         = 1 shl NRB_CALL_HOOK;
+// Do not queue messages for NRF_SEND_MESSAGE method
+  NRF_WAIT_REPLY        = 1 shl NRB_WAIT_REPLY;
+// Always send an initial notification on setup
+  NRF_NOTIFY_INITIAL    = 1 shl NRB_NOTIFY_INITIAL;
+// New flag for V52.33+ DOS, specifying this flag prevents the use  of filesystem supported notification, even if it is available,
+// it forces usage of the dos.library notification function instead. The dos.library notification function supports all three methods with both file and directory monitoring.
+  NRF_DOS_NOTIFY_ONLY   = 1 shl NRB_DOS_NOTIFY_ONLY;
+
+// PRIVATE - Handler use only. Do NOT set or remove NRF_MAGIC yourself.
+  NRF_MAGIC             = 1 shl NRB_MAGIC;
+
+// PRIVATE - Bitmask of flags that are reserved for use by the handler:
+  NR_HANDLER_MASK       = $ffff0000;
+  NR_HANDLER_FLAGS      = NR_HANDLER_MASK;  // old source compatibility
+
+type
+// --- NotifyHook data
+  PNotifyHookMsg = ^TNotifyHookMsg;
+  TNotifyHookMsg = record
+    nhm_Size: LongInt;   // Size of data structure
+    nhm_Action: LongInt; // What happened (see below)
+    nhm_Name: STRPTR;    // The name of the object
+  end;
+
+const
+// nhm_Action types
+  NHM_ACTION_INITIAL = -1; // Initial invocation
+  NHM_ACTION_ADD     = 0;  // Object was added
+  NHM_ACTION_CHANGE  = 1;  // Object has changed
+  NHM_ACTION_DELETE  = 2;  // Object was removed
+
+// A shell search path list component. Do not allocate this yourself!
+type
+  PPathNode = ^TPathNode;
+  TPathNode = record
+    pn_Next: BPTR; // Pointer to next path node
+    pn_Lock: BPTR; // Directory lock
+  end;
+
+// Parameters for use with the AddPathNode() function. Where to add the new node?
+const
+  ADDCMDPATHNODE_HEAD = 0;
+  ADDCMDPATHNODE_TAIL = 1;
+
+// The message passed to hook invoked by the SearchCmdPathList() function.
+type
+  PSearchCmdPathListMsg = ^TSearchCmdPathListMsg;
+  TSearchCmdPathListMsg = record
+    splm_Size: LongInt;
+    splm_Lock: BPTR;
+    splm_Name: STRPTR;
+  end;
+
+{*********************************************************************
+ *
+ * The CSource data structure defines the input source for "ReadItem()"
+ * as well as the ReadArgs call.  It is a publicly defined structure
+ * which may be used by applications which use code that follows the
+ * conventions defined for access.
+ *
+ * When passed to the dos.library functions, the value passed as
+ * struct *CSource is defined as follows:
+ *      if ( CSource == 0)      Use buffered IO "ReadChar()" as data source
+ *      else                    Use CSource for input character stream
+ *
+ * The following two pseudo-code routines define how the CSource structure
+ * is used:
+ *
+ * long CS_ReadChar( struct CSource *CSource )
+ *
+ *      if ( CSource == 0 )     return ReadChar();
+ *      if ( CSource->CurChr >= CSource->Length )       return ENDSTREAMCHAR;
+ *      return CSource->Buffer[ CSource->CurChr++ ];
+ *
+ *
+ * BOOL CS_UnReadChar( struct CSource *CSource )
+ *
+ *      if ( CSource == 0 )     return UnReadChar();
+ *      if ( CSource->CurChr <= 0 )     return FALSE;
+ *      CSource->CurChr--;
+ *      return TRUE;
+ *
+ *
+ * To initialize a struct CSource, you set CSource->CS_Buffer to
+ * a string which is used as the data source, and set CS_Length to
+ * the number of characters in the string.  Normally CS_CurChr should
+ * be initialized to ZERO, or left as it was from prior use as
+ * a CSource.
+ *
+ *********************************************************************}
+
+type
+  PCSource = ^TCSource;
+  TCSource = record
+    CS_Buffer: STRPTR;
+    CS_Length: LongInt;
+    CS_CurChr: LongInt;
+  end;
+
+{   *********************************************************************
+ *
+ * The RDArgs data structure is the input parameter passed to the DOS
+ * ReadArgs() function call.
+ *
+ * The RDA_Source structure is a CSource as defined above;
+ * if RDA_Source.CS_Buffer is non-null, RDA_Source is used as the input
+ * character stream to parse, else the input comes from the buffered STDIN
+ * calls ReadChar/UnReadChar.
+ *
+ * RDA_DAList is a private address which is used internally to track
+ * allocations which are freed by FreeArgs().  This MUST be initialized
+ * to NULL prior to the first call to ReadArgs().
+ *
+ * The RDA_Buffer and RDA_BufSiz fields allow the application to supply
+ * a fixed-size buffer in which to store the parsed data.  This allows
+ * the application to pre-allocate a buffer rather than requiring buffer
+ * space to be allocated.  If either RDA_Buffer or RDA_BufSiz is NULL,
+ * the application has not supplied a buffer.
+ *
+ * RDA_ExtHelp is a text string which will be displayed instead of the
+ * template string, if the user is prompted for input.
+ *
+ * RDA_Flags bits control how ReadArgs() works.  The flag bits are
+ * defined below.  Defaults are initialized to ZERO.
+ *
+ *********************************************************************}
+
+  PRDArgs = ^TRDArgs;
+  TRDArgs = record
+    RDA_Source: TCSource; // Select input source
+    RDA_DAList: LongInt;  // PRIVATE.
+    RDA_Buffer: STRPTR;   // Optional string parsing space.
+    RDA_BufSiz: LongInt;  // Size of RDA_Buffer (0..n)
+    RDA_ExtHelp: STRPTR;  // Optional extended help
+    RDA_Flags: LongInt;   // Flags for any required control
+  end;
+
+const
+  RDAB_STDIN     = 0; // Use "STDIN" rather than "COMMAND LINE"
+  RDAB_NOALLOC   = 1; // If set, do not allocate extra string space.
+  RDAB_NOPROMPT  = 2; // Disable reprompting for string input.
+  RDAF_STDIN     = 1 shl RDAB_STDIN;
+  RDAF_NOALLOC   = 1 shl RDAB_NOALLOC;
+  RDAF_NOPROMPT  = 1 shl RDAB_NOPROMPT;
+
+// Modes for LockRecord/LockRecords()
+  REC_EXCLUSIVE       = 0;
+  REC_EXCLUSIVE_IMMED = 1;
+  REC_SHARED          = 2;
+  REC_SHARED_IMMED    = 3;
+
+  RECF_DOS_METHOD_ONLY = 1 shl 16;
+  REC_MODE_MASK        = $FF;
+
+// Struct to be passed to LockRecords()/UnLockRecords() v53.86+
+// Note: the rec_Size member MUST be set in each struct or it won't work.
+type
+  PRecordLock = ^TRecordLock;
+  TRecordLock = record
+    rec_Size: LongWord;   // This MUST be set to sizeof(struct RecordLock)
+    rec_FH: BPTR;         // filehandle
+    rec_Offset: LongWord; // offset in file
+    rec_Length: LongWord; // length of file record to be locked
+    rec_Mode: LongWord;   // Type of lock
+  end;
+
+// The structure in the pr_LocalVars list. Do NOT allocate yourself, use SetVar()!!! This structure may grow in
+// future releases!  The list should be left in alphabetical order, and may have multiple entries with the same name but different types.
+  PLocalVar = ^TLocalVar;
+  TLocalVar = record
+    lv_Node: TNode;
+    lv_Flags: Word;
+    lv_Value: STRPTR;
+    lv_Len: LongWord;
+  end;
+// The LocalVar->lv_Node.ln_Name points to the name buffer.
+// The LocalVar->lv_Node.ln_Type is used by the system.
+// The LocalVar->lv_Node.ln_Pri is reserved for system use.
+const
+// LocalVar type identifiers:
+  LV_VAR     =   0; // a variable
+  LV_ALIAS   =   1; // an alias
+// bit definitions for LocalVar type:
+  LVB_IGNORE =   7;   // ignore this entry on GetVar, FindVar() etc
+  LV_TYPE_MASK = $FF; // the low 8 flags bits hold the local var type
+
+// bit definitions of flags passed to GetVar()/SetVar()/DeleteVar(), ScanVars() these bit defs are OR'ed with the type. Item will be treated as a single line of text unless BINARY_VAR is specified
+  GVB_GLOBAL_ONLY       = 8;  // only use global vars, no local vars will be accessed.
+  GVB_LOCAL_ONLY        = 9;  // only use local vars, no global vars will be accessed.
+  GVB_BINARY_VAR        = 10; // treat as binary var, don't truncate at a newline or carriage return char.
+  GVB_DONT_NULL_TERM    = 11; // can only be used with GVF_BINARY_VAR do not add a nul-terminator 0 byte at the end of data.
+  GVB_SAVE_VAR          = 12; // only works with GVF_GLOBAL_VAR this is only supported in >= V39 dos.  V37 dos ignores this. this causes SetVar to affect ENVARC: as well as ENV:
+  GVB_SCAN_ENVARC       = 13; // only usefull with GLOBAL vars scan envarc: instead of env: for use in ScanVars() - v50
+  GVB_SCAN_LEVEL        = 14; // for ScanVars() - v53 scan single directory level do not go into further sub directories. - v53
+  GVB_SCAN_TOPLEVEL     = GVB_SCAN_LEVEL;
+  GVB_SCAN_STARTDIR     = 15;
+
+  LVF_IGNORE              = 1 shl LVB_IGNORE;
+  GVF_GLOBAL_ONLY         = 1 shl GVB_GLOBAL_ONLY;
+  GVF_LOCAL_ONLY          = 1 shl GVB_LOCAL_ONLY;
+  GVF_BINARY_VAR          = 1 shl GVB_BINARY_VAR;
+  GVF_DONT_NULL_TERM      = 1 shl GVB_DONT_NULL_TERM;
+  GVF_SAVE_VAR            = 1 shl GVB_SAVE_VAR;
+  GVF_SCAN_ENVARC         = 1 shl GVB_SCAN_ENVARC;
+  GVF_SCAN_LEVEL          = 1 shl GVB_SCAN_LEVEL;
+  GVF_SCAN_STARTDIR       = 1 shl GVB_SCAN_STARTDIR;
+
+const
+//definitions for the (V51.96) GetDiskInfo() call.
+  GDI_Dummy           = TAG_USER + 500;
+  GDI_StringNameInput = GDI_Dummy + 1;  // STRPTR - pointer to a string identifier for the handler.
+  GDI_FileHandleInput = GDI_Dummy + 2;  // BPTR - BCPL pointer to a FileHandle to identify the handler
+  GDI_LockInput       = GDI_Dummy + 3;  // BPTR - BCPL pointer to a Lock to identify the handler.
+  GDI_FileLockInput   = GDI_LockInput;
+  GDI_MsgPortInput    = GDI_Dummy + 4;  // PMsgPort - Pointer to the handlers message port
+  GDI_VolumeRequired  = GDI_Dummy + 10; // LongBool - True for ACTION_INFO, FALSE for ACTION_DISK_INFO
+  GDI_InfoData        = GDI_Dummy + 11; // PInfoData - Pointer to an InfoData structure
+// definitions for the (V53.59) ObtainConsoleDataTags() call.
+  OCD_Dummy           = TAG_USER + 600;
+  OCD_FileHandleInput = OCD_Dummy + 1; // BPTR - BCPL pointer to a FileHandle for a console window.
+  OCD_MsgPortInput    = OCD_Dummy + 2; // PMsgPort - Pointer to a console message port.
+// definitions for the (V50) GetSegListInfo() call
+  GSLI_Dummy         = TAG_USER + 4000;
+  GSLI_NATIVE        = GSLI_Dummy + 1;  // PPPseudoSegList - if PPC executable. this only means it's native and executable, it does NOT imply any particular type.
+  GSLI_Data          = GSLI_Dummy + 2;  // PAPTR - data, if a data-only pseudoseglist.
+  GSLI_68KPS         = GSLI_Dummy + 3;  // PPPseudoSeglist - if 68K pseudoseglist
+  GSLI_ElfHandle     = GSLI_Dummy + 4;  // PPElf32_Handle
+  GSLI_68KHUNK       = GSLI_Dummy + 5;  // PBPTR - seglist, if old 68K HUNK style seglist.
+  GSLI_68KOVLAY      = GSLI_Dummy + 6;  // PBPTR - seglist, if old 68K OVERLAY seglist.
+  GSLI_68KFileSize   = GSLI_Dummy + 7;  // PLongWord - size of the 68K binary load file. 51.58
+  GSLI_68KFileXsum   = GSLI_Dummy + 8;  // PLongWord - 32 bit xsum of the 68K binary load file. 51.58
+  GSLI_HeaderSize    = GSLI_Dummy + 9;  // PLongWord - byte size of the DOS allocated segment header. 51.99
+  GSLI_SegmentSize   = GSLI_Dummy + 10; // PLongWord - byte size of the entire segment allocation.  52.13
+  GSLI_VersionString = GSLI_Dummy + 11; // STRPTR - returns a "$VER:" version string in a seglist. 52.18
+  GSLI_ResidentVersionString = GSLI_Dummy + 12; // STRPTR - returns Resident->rt_IDString version string. 53.21
+  GSLI_ResidentStruct = GSLI_Dummy + 13; // PResident - returns a pointer to a struct Resident. 53.70
+// definitions for the (V50) AddSegmentTagList() call
+  AS_Dummy       = TAG_USER + 3000;
+  AS_SegmentList = AS_Dummy + 1; // Segment list, as returned by the LoadSeg() function
+  AS_Entry       = AS_Dummy + 2; // Address of a function which implements the command
+// definitions for the (V53) LockTagList() call
+  LK_Dummy       = TAG_USER + 5750;
+  LK_Name        = LK_Dummy + 1; // STRPTR - Name of object to lock.
+  LK_Mode        = LK_Dummy + 2; // LongInt - Access mode; SHARED_LOCK or EXCLUSIVE_LOCK
+  LK_InfoMask    = LK_Dummy + 3; // PLongWord - pointer to info mask storage area.
+  LK_SoftLinks   = LK_Dummy + 4; // PLongWord - pointer to softlink count storage area.
+  LK_ResolveSL   = LK_Dummy + 5; // LongInt - Boolean switch to control softlink resolution.
+  LK_ResolveMA   = LK_Dummy + 6; // LongInt - Boolean switch to control multi-assign resolution. 54.21
+
+// definitions for the DosSystem() call.
+  SYS_Dummy              = TAG_USER + 32;
+  SYS_CommandRunMode     = SYS_Dummy + 0; // (LongBool) PRIVATE Internal SHELL tag to identify "run" command.
+  SYS_Input              = SYS_Dummy + 1; // (BPTR) specifies the input filehandle
+  SYS_Output             = SYS_Dummy + 2; // (BPTR) specifies the output filehandle
+  SYS_Asynch             = SYS_Dummy + 3; // (LongBool) run asynch, close input/output on exit(!)
+  SYS_UserShell          = SYS_Dummy + 4; // (LongBool) send to user shell instead of boot shell
+  SYS_CustomShell        = SYS_Dummy + 5; // (STRPTR) send to a specific shell (data is name)
+  SYS_Error              = SYS_Dummy + 6; // (BPTR) specifies the error output filehandle (New for V50)
+  SYS_ExecuteInputStream = SYS_Dummy + 7; // (LongBool) instead of reading the 'command' string parameter, reads commands from the input filehandle instead. (V53.45)
+
+//definitions for the CreateNewProc() call; you MUST specify one of NP_Seglist or NP_Entry. All others are optional.
+  NP_Dummy       = TAG_USER + 1000;
+  NP_Seglist     = NP_Dummy + 1;  // seglist of code to run for the process
+  NP_FreeSeglist = NP_Dummy + 2;  // free seglist on exit - only valid for for NP_Seglist. Default is FALSE.
+  NP_Entry       = NP_Dummy + 3;  // entry point to run
+  NP_Input       = NP_Dummy + 4;  // filehandle - default is DosOpen('NIL:'...)
+  NP_Output      = NP_Dummy + 5;  // filehandle - default is DosOpen('NIL:'...)
+  NP_CloseInput  = NP_Dummy + 6;  // close input filehandle on exit default TRUE
+  NP_CloseOutput = NP_Dummy + 7;  // close output filehandle on exit default TRUE
+  NP_Error       = NP_Dummy + 8;  // filehandle - default is nil V50
+  NP_CloseError  = NP_Dummy + 9;  // close error filehandle on exit default FALSE V50
+  NP_CurrentDir  = NP_Dummy + 10; // lock - default is parent's current dir
+  NP_StackSize   = NP_Dummy + 11; // stacksize for process - default 4000
+  NP_Name        = NP_Dummy + 12; // name for process - default 'New Process'
+  NP_Priority    = NP_Dummy + 13; // priority - default same as parent
+  NP_ConsolePort = NP_Dummy + 14; // consoletask - old compatibility  - default same as parent
+  NP_ConsoleTask = NP_ConsolePort;
+  NP_WindowPtr   = NP_Dummy + 15; // window ptr - default is same as parent
+  NP_ProgramDir  = NP_Dummy + 16; // home program directory - default curr progdir
+  NP_CopyVars    = NP_Dummy + 17; // Boolean to copy local vars - default TRUE
+  NP_Cli         = NP_Dummy + 18; // create cli structure - default FALSE
+  NP_Path        = NP_Dummy + 19; // path - default is copy of parents path only valid if a cli process!
+  NP_CommandName = NP_Dummy + 20; // commandname - valid only for CLI
+  NP_Arguments   = NP_Dummy + 21; // cstring of arguments
+  NP_unused1     = NP_Dummy + 22; // never implemented
+  NP_unused2     = NP_Dummy + 23; // INTERNALLY - used
+  NP_ExitCode    = NP_Dummy + 24; // code to be called on process exit, just before cleanup
+  NP_ExitData    = NP_Dummy + 25; // optional argument for NP_ExitCode function - default 0
+  NP_UserData    = NP_Dummy + 26; // optional value to install into TTask.tc_UserData.
+  NP_Child       = NP_Dummy + 27; // LongBool flag to nominate this new process as a dependant child of the parent. (V50)
+  NP_NotifyOnDeathMessage = NP_Dummy + 28; // PDeathMessage -- (V51.53) Specify an initialised death message structure to ReplyMsg() to,
+                                           // upon death of this process. Defaults to none.
+  NP_NotifyOnDeathSigTask = NP_Dummy + 29; // PTask -- (V51.53) Specify the task or process to signal upon death of this process.
+                                           // Specify NULL for the parent of this child process. Defaults to no signalling, if this tag is not specified
+  NP_NotifyOnDeathSignalBit = NP_Dummy + 30; // A value 0-31 for the signal bit number to send to the task NP_NotifyOnDeathSigTask, upon death of this process. Defaults to SIGB_CHILD if not specified.
+  NP_LocalVars   = NP_Dummy + 31; // STRPTR * -- (V51.70) Paired array of string pointers representing a list of local variables to add to the new process, array must be
+                                  // arranged as;  Name1,Value1, Name2,Value2, Name3,Value3, nil; Default nil
+  NP_EntryCode   = NP_Dummy + 32; // code to be called on process startup, just before internalRunCommand()
+  NP_EntryData   = NP_Dummy + 33; // optional argument for NP_EntryCode function - default 0
+  NP_FinalCode   = NP_Dummy + 34; // code to be called on process exit, just before cleanup
+  NP_FinalData   = NP_Dummy + 35; // optional argument for NP_FinalCode function - default 0
+  NP_LocalAlias  = NP_Dummy + 36; // PSTRPTR -- (added V52.5) Paired array of string pointers to represent a list of local aliases to add to the new process,
+                                  // array must be arranged as; Alias1,Value1, Alias2,Value2, Alias3,Value3, nil; Default nil
+  NP_LockStack   = NP_Dummy + 37; // Boolean tag to cause exec to lock the stack in place, specifying TRUE will prevent the stack frame being swapped out. Default FALSE   (added V52.10)
+  NP_OwnerUID    = NP_Dummy + 38; // LongWord -- (added 52.18) Specify the pr_UID value for the new process.
+  NP_OwnerGID    = NP_Dummy + 39; // LongWord -- (added 52.18) Specify the pr_GID value for the new process.
+
+// tags for AllocDosObject()
+  ADO_Dummy        = TAG_USER + 2000;
+  ADO_TermCharStr  = ADO_Dummy + 0;    // Added for FReadLine() V53.19
+// Obsolete tags +1...+5 have removed
+  ADO_AddedSize    = ADO_Dummy + 6; // Size of additional buffer to allocate over and above the base structure size required by the flag DOS_xxxxx .  (V50)
+  ADO_Strlen       = ADO_AddedSize;
+  ADO_Flags        = ADO_Dummy + 7; // Generic 32 bit flags for those allocations that require initialisation of a specific flags field. (V50)
+  ADO_DOSType      = ADO_Flags;     // alias V51
+  ADO_TermChar     = ADO_Flags;     // alias V51
+  ADO_Type         = ADO_Flags;     // alias V52
+  ADO_Vectors      = ADO_Flags;     // alias V53
+  ADO_Mask         = ADO_Dummy + 8; // Generic 32 bit mask for those allocations that require initialisation of a specific bitmask. (V50)
+  ADO_AddColon     = ADO_Mask;      // alias V53
+  ADO_Name         = ADO_Dummy + 9; // Generic STRPTR Name. (V52)
+  ADO_NotifyName   = ADO_Name;      // alias V52 Name of the volume, directory or file to monitor and produce notification messages for. (V51)
+  ADO_NotifyUserData     = ADO_Dummy + 10; // User data to be stored in a NotifyRequest. (V51)
+  ADO_NotifyMethod       = ADO_Dummy + 11; // Notification method; must be one of NRF_SEND_MESSAGE, NRF_SEND_SIGNAL or NRF_CALL_HOOK. (V51)
+  ADO_NotifyPort         = ADO_Dummy + 12; // MsgPort to send notification messages to; this is used for the NRF_SEND_MESSAGE notification method. (V51)
+  ADO_NotifyTask         = ADO_Dummy + 13; // Task to send a notification signal to; this is used for the NRF_SEND_SIGNAL notification method. (V51)
+  ADO_NotifySignalNumber = ADO_Dummy + 14; // The signal number (0..31) to use when sending a notification signal; this is used for the NRF_SEND_SIGNAL notification method. (V51)
+  ADO_NotifyHook         = ADO_Dummy + 15; // The hook to call when a notification is required; this is used for the NRF_CALL_HOOK method. (V51)
+  ADO_NotifyWaitReply    = ADO_Dummy + 16; // Selects if the further notification messages should be sent unless the last message has been replied. (V51)
+  ADO_NotifyInitial      = ADO_Dummy + 17; // Selects if the notification should be sent immediately after it was requested. (V51)
+  ADO_Size               = ADO_Dummy + 18; // Specify allocation size that is larger than the default. (V51)
+  ADO_DOSMethodOnly      = ADO_Dummy + 19; // Force the dos.library to service the notify request, and exclude the filesystem routines even if they are available. (V52.33)
+  ADO_ExamineData_NameSize = ADO_Dummy + 20; // Selects the size of the name buffer for DOS_EXAMINEDATA. (V51)
+  ADO_ExamineData_CommentSize = ADO_Dummy + 21; // Selects the size of the comment buffer for DOS_EXAMINEDATA (V51)
+  ADO_ExamineData_LinkSize = ADO_Dummy + 22; // Selects the size of the link name buffer for DOS_EXAMINEDATA. (V51)
+  ADO_ExamineDir_Context = ADO_Dummy + 23; // Used by filesystems and DOS to pass an ExamineContext. (V51.104)
+
+// Tags for DosControl()
+  DC_Dummy     = TAG_USER + 5000;
+  DC_WildStarW = DC_Dummy + 1; // (LongInt Boolean) -- Write to the default WildStar switch. Default is FALSE.
+  DC_WildStarR = DC_Dummy + 2; // (PLongInt) -- Obtain the state of WildStar switch.
+  DC_FHBufferW = DC_Dummy + 3; // (LongInt) -- Writes the size in bytes for all FileHandle buffers. The default value for V50 DOS is 8000 bytes.
+  DC_FHBufferR = DC_Dummy + 4; // (PLongInt) -- Obtain the size in bytes for FH Buffers.
+  DC_WarnPostTimeW = DC_Dummy + 5;  // (LongInt) -- Write the number of seconds to post warning for. Default posting time is currently 120 seconds.
+  DC_WarnPostTimeR = DC_Dummy + 6;  // (PLongInt) -- Obtain the value for WarnPostTime.
+  DC_WarnWaitTimeW = DC_Dummy + 7;  // (LongInt) -- Write the number of seconds to wait between warnings. Default wait time is currently 5 seconds.
+  DC_WarnWaitTimeR = DC_Dummy + 8;  // (PLongInt) -- Obtain the value for WarnWaitTime.
+  DC_MinProcStackW = DC_Dummy + 9;  // (LongInt) -- Write the number of bytes to enforce as min proc stack
+  DC_MinProcStackR = DC_Dummy + 10; // (PLongInt) -- Obtain the value for MinProcStack.
+  DC_AssignMountW  = DC_Dummy + 11; // (LongInt) -- Write to the default AssignMount switch.
+  DC_AssignMountR  = DC_Dummy + 12; // (PLongInt) -- Obtain the state of the AssignMount switch.
+  DC_BootCliFontSizeW = DC_Dummy + 13; // (LongInt) -- Write the boot cli font size. TOPAZ_SIXTY or TOPAZ_EIGHTY
+  DC_BootCliFontSizeR = DC_Dummy + 14; // (PLongInt) -- Obtain the size of the boot cli font size.
+  DC_Reload68KApplistW = DC_Dummy + 15; // (LongInt) -- DOSTRUE will cause DEVS:applications.dos config file to reload from disk. 51.58
+  DC_unused1R          = DC_Dummy + 16; // pad tag for DC_Reload68KApplistR slot
+  DC_BootCliCloseGadgetW = DC_Dummy + 17; // (LongInt) -- DOSTRUE will cause the boot cli to have a close gadget. 52.8
+  DC_BootCliCloseGadgetR = DC_Dummy + 18; // (PLongInt) -- Obtain the state of the boot cli close gadget switch. 52.8
+  DC_LocaleBaseW = DC_Dummy + 19; // (PLocaleBase) -- Write the locale base pointer for DOS to access. V54
+  DC_LocaleBaseR = DC_Dummy + 20; // (PPLocaleBase) -- Obtain the locale base pointer value from DOS. V54
+
+// Tags for ReadLineItem()
+  RLI_Dummy           = TAG_USER + 5500;
+  RLI_FileHandleInput = RLI_Dummy + 1;  // (BPTR) -- Read with FGetC() from this filehandle. Default is FGetC(Input());
+  RLI_CSourceInput    = RLI_Dummy + 2;  // (PCSource) -- Read from this CSource stream. Default is FGetC(Input());
+  RLI_EscapeChars     = RLI_Dummy + 10; // (STRPTR) -- Nul-terminated string of one or more characters to be recognised as escape characters.
+                                        // This may be an empty string '' or nil, for none. Defaults to '*'.
+  RLI_MultiLine       = RLI_Dummy + 11; // (LongInt; boolean) -- Enable Multi-line processing. Defaults to FALSE.
+  RLI_CommentChars    = RLI_Dummy + 12; // (STRPTR) -- Nul-terminated string of one or more characters to be used as a comment marker.
+                                        // This may be an empty string '' or nil, for none. Defaults to ''.
+  RLI_Substitute_N    = RLI_Dummy + 13; // (LongInt; boolean) -- Substitute quoted escaped 'N' to the hex char $0a.
+                                        // Only works when RLI_EscapeChars is not "" or nil. Defaults to TRUE.
+  RLI_Substitute_E    = RLI_Dummy + 14; // (LongInt; boolean) -- Substitute quoted escaped 'E' to the hex
+                                        // char $1b. Only works when RLI_EscapeChars is not '' or nil. Defaults to TRUE.
+// Tags for SetFileHandleAttr()
+  FH_Dummy      = TAG_USER + 6000;
+
+  FH_BufferSize = FH_Dummy + 1;
+  FH_UserBuffer = FH_Dummy + 2;
+  FH_BufferMode = FH_Dummy + 3;
+  FH_Locking    = FH_Dummy + 4;
+  FH_EndStream  = FH_Dummy + 5;
+
+// Tags for SetOwnerInfo(), GetOwnerInfo().
+  OI_Dummy           = TAG_USER + 6200;
+
+  OI_StringNameInput = OI_Dummy + 1;  // (STRPTR) -- Pointer to a string identifying a filesystem object. This tag is mutually exclusive with OI_Process.
+  OI_StringName      = OI_StringNameInput;
+  OI_ProcessInput    = OI_Dummy + 2;  // (PProcess) -- Pointer to a process structure, or nil for this process, to identify a process. This tag is mutually exclusive with OI_StringName.
+  OI_Process         = OI_ProcessInput;
+  OI_OwnerUID        = OI_Dummy + 10; // GetOwnerInfo() -- Pointer to a LongInt sized storage area. Returns the value of the objects UID field.
+                                      // SetOwnerInfo() -- LongInt value. Sets the value of an objects UID field.
+  OI_OwnerGID        = OI_Dummy + 11; // GetOwnerInfo() -- Pointer to a LongInt sized storage area. Returns the value of the objects GID field.
+                                      // SetOwnerInfo() -- LongInt value. Sets the value of an objects GID field.
+// Tags for TimedDosRequester()
+  TDR_Dummy      = TAG_USER + 3500;
+
+  TDR_IDCMP_Ptr  = TDR_Dummy + 1; // (PLongInt) -- [OPTIONAL] Pointer to a longword initialised with the IDCMP flags that you want to terminate the requester on. (Default nil)
+  TDR_Timeout    = TDR_Dummy + 2; // (LongInt) -- [OPTIONAL] Value in seconds to wait before requester will close without intervention.  A timeout will only occur with values > 0.
+                                 // It is recommended that timouts less than 10 seconds be avoided whenever possible, to be user-friendly. (Default; 0)
+  TDR_Window     = TDR_Dummy + 3; // (PWindow) -- [OPTIONAL] A pointer to an (over-riding) reference window pointer. Normally, you would not need to specify this tag.
+  TDR_EasyStruct = TDR_Dummy + 4; // (PEasyStruct) [OPTIONAL] -- Pointer to your own private struct EasyStruct that has already been initialised.   (Default; internally allocated)
+  TDR_FormatString = TDR_Dummy + 5; // (STRPTR) [OPTIONAL] -- The format string using RawDoFmt style specifiers that match the number of argument array entries.
+                                    // If this tag is present, it will override a formatstring that may have already been supplied with a private TDR_EasyStruct.
+  TDR_TitleString  = TDR_Dummy + 6; // (STRPTR) [OPTIONAL] -- The title string for the requester. If this tag is present, it will override a title string that may have already been supplied with a private TDR_EasyStruct.
+  TDR_GadgetString = TDR_Dummy + 7; // (STRPTR) [OPTIONAL] -- The string spec for the gadgets/text for the requester. If this tag is present, it will override a Gadget string that may have been supplied with a private TDR_EasyStruct.
+  TDR_ImageType    = TDR_Dummy + 8; // (LongInt) -- The visual style of this request. This argument has currently no effect before IPrefs is running, but should always
+                                    // be specified to indicate the style of request this is directedfor.   (Default; TDRIMAGE_DEFAULT) The values for this tag are defined below.
+  TDRIMAGE_DEFAULT    = 0;
+  TDRIMAGE_INFO       = 1;
+  TDRIMAGE_WARNING    = 2;
+  TDRIMAGE_ERROR      = 3;
+  TDRIMAGE_QUESTION   = 4;
+  TDRIMAGE_INSERTDISK = 5;
+
+  TDR_ArgArray = TDR_Dummy + 9;  // (APTR) [OPTIONAL] -- A pointer to a completely initialised argument array with the number of entries that correspond to the RawDoFmt() format specifiers.
+                                 // Do not use this tag if you want to specify up to the first 10 arguments individually with the following TDR_Arg# tags.
+  TDR_Inactive = TDR_Dummy + 10; // (LongInt; Boolean) -- Boolean value to specify the requester should not be activated to avoid its stealing the users input focus.
+                                 // You should set this to TRUE when the gadgets of your requester contain keyboard shortcuts and its possible that the user is
+                                 // currently typing text in another application (otherwise the user could answer the requester by accident). This tag has
+                                 // currently no effect before IPrefs is running, keyboard shortcuts also won't work before either.  (Default; FALSE)
+  TDR_CharSet  = TDR_Dummy + 11; // (LongWord) -- Character set for the requester's text and gadgets. Defaults to 0, meaning the charset of the screen font which
+                                 // will be the current system default charset in most cases. This tag has currently no effect before IPrefs is running.
+                                 // The tag value is based on the IANA MIBenum value for charsets. See the autodoc for diskfont.library/ObtainCharsetInfo().
+                                 // TDR_CharSet should be set by localized applications that want to display localized requesters, they tell locale.library in
+                                 // OpenCatalog() that it shall not convert the catalog charset to current system default charset and use the value of
+                                 // Catalog->cat_CodeSet for the TDR_CharSet.    (Default; 0)
+  TDR_NonBlocking = TDR_Dummy + 12; // (LongInt; Boolean) -- [OPTIONAL] switch to prevent this function from attempting any disk based I/O whatsoever.
+                                    // This makes the function safe to call at any time from handlers and filesystems and in some cases performing dospacket I/O from a task context.
+                                    // This tag will effectively bypass the use of any reaction components that may cause blocking issues and re-apply the original dos.library
+                                    // code that only calls the intuition library EasyRequest() function, as if it was never patched by "IPrefs". (Default; FALSE)
+  TDR_Arg1  = TDR_Dummy+20;
+  TDR_Arg2  = TDR_Dummy+21;
+  TDR_Arg3  = TDR_Dummy+22;
+  TDR_Arg4  = TDR_Dummy+23;
+  TDR_Arg5  = TDR_Dummy+24;
+  TDR_Arg6  = TDR_Dummy+25;
+  TDR_Arg7  = TDR_Dummy+26;
+  TDR_Arg8  = TDR_Dummy+27;
+  TDR_Arg9  = TDR_Dummy+28;
+  TDR_Arg10 = TDR_Dummy+29;
+
+// Tags for FileSystemAttr()
+  FSA_Dummy                    = TAG_USER + 9000;
+  FSA_StringNameInput          = FSA_Dummy + 1; // (STRPTR) -- Identify the filesystem by this name reference.
+  FSA_FileHandleInput          = FSA_Dummy + 2; // (BPTR) -- Identify the filesystem by this FileHandle.
+  FSA_LockInput                = FSA_Dummy + 3; // (BPTR) -- Identify the filesystem by this Lock.
+  FSA_FileLockInput            = FSA_LockInput;
+  FSA_MsgPortInput             = FSA_Dummy + 4;  // (PMsgPort)  Identify the filesystem by this message port. NOTE: This tag was added in dos.library 51.96
+  FSA_MaxFileNameLengthR       = FSA_Dummy + 10; // (PLongWord) -- Obtain the maximum filename length. (including \0)
+  FSA_MaxFileNameLengthW       = FSA_Dummy + 11; // (LongWord) -- Set the maximum filename length. (including \0)
+  FSA_VersionNumberR           = FSA_Dummy + 12; // (PLongWord) -- Obtain the version/rev number for the filesystem.
+  FSA_DOSTypeR                 = FSA_Dummy + 13; // (PLongWord) -- Obtain the dostype identifier for the filesystem.
+  FSA_ActivityFlushTimeoutR    = FSA_Dummy + 14; // (PLongWord) -- Obtain the mS (1000th second) before a flush while active occurs.
+  FSA_ActivityFlushTimeoutW    = FSA_Dummy + 15; // (LongWord) -- Set the mS (1000th second) before a flush while active occurs.
+  FSA_InactivityFlushTimeoutR  = FSA_Dummy + 16; // (PLongWord) -- Obtain the mS (1000th second) before a flush when inactive occurs.
+  FSA_InactivityFlushTimeoutW  = FSA_Dummy + 17; // (LongWord) -- Set the mS (1000th second) before a flush when inactive occurs.
+  FSA_MaxRecycledEntriesR      = FSA_Dummy + 18; // (PLongWord) -- Obtain the number of recycled entries supported.
+  FSA_MaxRecycledEntriesW      = FSA_Dummy + 19; // (LongWord) -- Set the number of recycled entries supported.
+  FSA_HasRecycledEntriesR      = FSA_Dummy + 20; // (PLongWord) -- Obtain boolean value if the filesystem supports recycled entries.
+  FSA_VersionStringR           = FSA_Dummy + 21; // (STRPTR) -- Obtain a copy of the version string for the filesystem.
+  FSA_VersionStringR_BufSize   = FSA_Dummy + 22; // (LongWord) -- Sub tag to specify the length of the space provided for FSA_VersionStringR.
+  FSA_VersionStringR_Len       = FSA_VersionStringR_BufSize;  // temp compatibility
+
+// Common tags for ExamineObject() and ExamineDir().
+  EX_Dummy           = TAG_USER + 6500;
+  EX_StringNameInput = EX_Dummy + 1; // (STRPTR) -- Pointer to a nul-terminated string name, to specify the filesystem object required. This may be relative to the current directory an assignment
+  EX_StringName      = EX_Dummy + 1; //   or an absolute path.  DOS will internally perform a Lock() on the string provided, it will also Unlock() it again for you. Failure will occur if the object is already exclusively locked.
+
+  EX_FileHandleInput = EX_Dummy + 2; // (BPTR) -- BCPL pointer to a FileHandle. Identify the parent directory from the stream pointed to by an open FileHandle.  DOS determins the parent directory of the
+  EX_FileHandle      = EX_Dummy + 2; //   file by calling ParentOfFH() internally. The internal lock is UnLock'ed when the caller invokes ReleaseDirContext().
+
+  EX_LockInput       = EX_Dummy + 3; // (BPTR) -- BCPL pointer to a Lock.
+  EX_FileLockInput   = EX_Dummy + 3; //   Identify the filesystem object by this associated Lock.
+  EX_DirLockInput    = EX_Dummy + 3; //   This lock is always passed directly throught to the filesystem.
+  EX_FileLock        = EX_Dummy + 3;
+  EX_DirLock         = EX_Dummy + 3;
+
+ //The following are specific only for use with ObtainDirContext() when preparing a context for ExamineDir()
+   EX_DataFields     = EX_Dummy + 10; // (LongWord) -- A bitmask to indicate which additional items of data are to be filled in your ExamineData structure, by the filesystem.
+   EX_MatchFunc      = EX_Dummy + 11; // (PHook) -- Pointer to a custom Hook structure which has the h_Entry function pointer set to a filtering function. (Default = nil) for the internal filter to be used instead.
+   EX_MatchString    = EX_Dummy + 12; // (STRPTR) -- A pointer to a pre-parsed pattern string. (Default=NULL) If this field is NULL then all entries will be returned from the internal filter function.
+   EX_DoCurrentDir   = EX_Dummy + 13; // (BOOLEAN) -- Set TRUE if you wish DOS to make the reference to the specified directory the current directory.
+                                      // This will allow for recursive directory scans to nominate the sub-directory by name, without having to specifying the full path. (Default=FALSE)
+   EX_ResetContext   = EX_Dummy + 14; // (APTR) -- Pointer to a previous context for which a change of any parameter/s are required.  By passing in a previous context via this tag, the resources already allocated for the old context and
+                                      // ExamineData nodes will be reused.  All necessary filesystem context information will also be reset to allow a new scan to begin again. (Default = nil)
+
+function DosObtain(): LongWord; syscall IDos 60;
+function DosRelease(): LongWord; syscall IDos 64;
+procedure DosExpunge(); syscall IDos 68;
+function DosClone(): PInterface; syscall IDos 72;
+function DosOpen(const Name: STRPTR; AccessMode: LongInt): BPTR; syscall IDos 76;
+procedure DOSClose(File_: BPTR); syscall IDos 80;
+function DosRead(File_: BPTR; Buffer: APTR; Length: LongInt): LongInt; syscall IDos 84;
+function DosWrite(File_: BPTR; Buffer: APTR; Length: LongInt): LongInt; syscall IDos 88;
+function DosInput: BPTR; syscall IDos 92;
+function DosOutput: BPTR; syscall IDos 96;
+function DosSeek(File_: BPTR; Position: LongInt; Offset: LongInt): LongInt; syscall IDos 100;
+function DosDeleteFile(const Name: STRPTR) : LongBool; overload; syscall IDos 104;  // compatibility to older platforms
+function DosDelete(const Name: STRPTR) : LongBool; overload; syscall IDos 104;
+function DosRename(const OldName: STRPTR; const NewName: STRPTR): LongBool; syscall IDos 108;
+function Lock(const Name: STRPTR; Type_: LongInt): BPTR; syscall IDos 112;
+procedure UnLock(Lock: BPTR); syscall IDos 116;
+function DupLock(Lock: BPTR): BPTR; syscall IDos 120;
+function Examine(Lock: BPTR; FileInfoBlock: PFileInfoBlock): LongBool; syscall IDos 124;
+function ExNext(Lock: BPTR; FileInfoBlock: PFileInfoBlock): LongBool; syscall IDos 128;
+function Info(Lock: BPTR; ParameterBlock: PInfoData): LongBool; syscall IDos 132;
+function CreateDir(const Name: STRPTR) : BPTR; syscall IDos 136;
+function CurrentDir(Lock: BPTR): BPTR; syscall IDos 140; // compatibility to older platforms
+function SetCurrentDir(Lock: BPTR): BPTR; syscall IDos 140;
+function IoErr: LongInt; syscall IDos 144;
+function CreateProc(const Name: STRPTR; Pri: LongInt; SegList: BPTR; StackSize: LongInt): PMsgPort; syscall IDos 148;
+// obsolete - procedure DosExit(ReturnCode: LongInt); syscall IDos 152;
+// obsolete - function LoadSeg(const Name: STRPTR): LongInt; syscall IDos 156;
+procedure UnLoadSeg(Seglist: BPTR); syscall IDos 160;
+// private - function DoPkt32(Port: PMsgPort; Action, Arg1, Arg2, Arg3, Arg4, Arg5, ): LongInt; syscall IDos 164;
+function LoadSeg(const Name: STRPTR): LongInt; syscall IDos 168;
+function DeviceProc(const Name: STRPTR): PMsgPort; syscall IDos 172;
+function SetComment(const Name: STRPTR; const Comment: STRPTR): LongBool; syscall IDos 176;
+function SetProtection(const Name: STRPTR; Protect: LongInt): LongBool; syscall IDos 180;
+function DateStamp(Date: PDateStamp): PDateStamp; syscall IDos 184;
+procedure DosDelay(TimeOut: LongInt); syscall IDos 188;
+function WaitForChar(File_: BPTR; TimeOut: LongInt): LongBool; syscall IDos 192;
+function ParentDir(Lock: BPTR): BPTR; syscall IDos 196;
+function IsInteractive(File_: BPTR): LongBool; syscall IDos 200;
+function Execute(const String_: STRPTR; File_: BPTR; File2: BPTR): LongBool; syscall IDos 204;
+function AllocDosObject(Type_: LongWord; const Tags: PTagItem): APTR; syscall IDos 208;
+function AllocDosObjectTagList(Type_: LongWord; const Tags: PTagItem): APTR; syscall IDos 212;
+// 216 AllocDosObjectTags
+procedure FreeDosObject(Type_: LongWord; Ptr: APTR); syscall IDos 220;
+function DoPkt(Port: PMsgPort; Action, Arg1, Arg2, Arg3, Arg4, Arg5: LongInt): LongInt; syscall IDos 224;
+function DoPkt0(Port: PMsgPort; Action: LongInt): LongInt; syscall IDos 228;
+function DoPkt1(Port: PMsgPort; Action, Arg1: LongInt): LongInt; syscall IDos 232;
+function DoPkt2(Port: PMsgPort; Action, Arg1, Arg2: LongInt): LongInt; syscall IDos 236;
+function DoPkt3(Port: PMsgPort; Action, Arg1, Arg2, Arg3: LongInt): LongInt; syscall IDos 240;
+function DoPkt4(Port: PMsgPort; Action, Arg1, Arg2, Arg3, Arg4: LongInt): LongInt; syscall IDos 244;
+procedure SendPkt(Dp: PDosPacket; Port: PMsgPort; ReplyPort: PMsgPort); syscall IDos 248;
+function WaitPkt: PDosPacket; syscall IDos 252;
+procedure ReplyPkt(Dp: PDosPacket; Res1, Res2: LongInt); syscall IDos 256;
+// 260 Reserved
+// obsolete LockRecord 264
+function LockRecords(RecArray: PRecordLock; TimeOut: LongWord): LongBool; syscall IDos 268;
+// obsolete UnLockRecord 272
+function UnLockRecords(RecArray: PRecordLock): LongBool; syscall IDos 276;
+function SelectInput(Fh: BPTR): BPTR; syscall IDos 280;
+function SelectOutput(Fh: BPTR): BPTR; syscall IDos 284;
+function FGetC(Fh: BPTR): LongInt; syscall IDos 288;
+function FPutC(Fh: BPTR; Ch: LongInt): LongInt; syscall IDos 292;
+function UnGetC(Fh: BPTR; Character: LongInt): LongInt; syscall IDos 296;
+function FRead(Fh: BPTR; Block: APTR; BlockLen: LongWord; Number: LongWord): LongWord; syscall IDos 300;
+function FWrite(Fh: BPTR; Block: APTR; BlockLen: LongWord; Number: LongWord): LongWord; syscall IDos 304;
+function FGets(Fh: BPTR; Buf: STRPTR; BufLen: LongWord): STRPTR; syscall IDos 308;
+function FPuts(Fh: BPTR; const Str: STRPTR): LongInt; syscall IDos 312;
+// obsolete VFWritef 316
+// obsolete FWritef 320
+function VFPrintf(Fh: BPTR; const Format: STRPTR; const ArgArray: APTR): LongInt; syscall IDos 324;
+// 328 FPrintf
+function DosFlush(Fh: BPTR): LongBool; syscall IDos 332; // compatibility to older platforms
+function FFlush(Fh: BPTR): LongBool; syscall IDos 332;
+function SetVBuf(Fh: BPTR; Buff: STRPTR; Type_: LongInt; Size: LongInt): LongBool; syscall IDos 336;
+function DupLockFromFH(Fh: BPTR): BPTR; syscall IDos 340;
+function OpenFromLock(Lock: BPTR): BPTR; syscall IDos 344;
+function ParentOfFH(Fh: BPTR): BPTR; syscall IDos 348;
+function ExamineFH(Fh: BPTR; Fib: PFileInfoBlock): LongBool; syscall IDos 352;
+function SetDate(const Name: STRPTR; const Date: PDateStamp): LongBool; syscall IDos 356;
+function NameFromLock(Lock: BPTR; Buffer: STRPTR; Len: LongInt): LongBool; syscall IDos 360;
+function NameFromFH(Fh: BPTR; Buffer: STRPTR; Len: LongInt): LongBool; syscall IDos 364;
+function SplitName(const Name: STRPTR; Seperator: LongWord; Buf: STRPTR; OldPos: LongInt; Size: LongInt): LongInt; syscall IDos 368;
+function SameLock(Lock1, Lock2: BPTR): LongInt; syscall IDos 372;
+function SetMode(Fh: BPTR; Mode: LongInt): LongBool; syscall IDos 376;
+function ExAll(Lock: BPTR; Buffer: PExAllData; Size, Data: LongInt; Control: PExAllControl): LongBool; syscall IDos 380;
+function ReadSoftLink(Port: PMsgPort; Lock: BPTR; const Path: STRPTR; Size: LongWord): LongInt; syscall IDos 384;
+function MakeLink(const Name: STRPTR; Dest: APTR; soft: LongInt): LongBool; syscall IDos 388;
+function ChangeMode(Type_ : LongInt; Fh: BPTR; NewMode: LongInt): LongBool; syscall IDos 392;
+function SetFileSize(Fh: BPTR; Pos: LongInt; Mode: LongInt): LongBool; syscall IDos 396;
+function SetIoErr(Result: LongInt): LongInt; syscall IDos 400;
+function Fault(Code: LongInt; const Header: STRPTR; Buffer: STRPTR; Len: LongInt): LongBool; syscall IDos 404;
+function PrintFault(Code: LongInt; const Header: STRPTR): LongBool; syscall IDos 408;
+function ErrorReport(Code, Type_: LongInt; Arg1: LongWord; Device: PMsgPort): LongBool; syscall IDos 412;
+// private Requester 416
+function Cli: PCommandLineInterface; syscall IDos 420;
+function CreateNewProc(const Tags: PTagItem): PProcess; syscall IDos 424;
+function CreateNewProcTagList(const Tags: PTagItem): PProcess; syscall IDos 428;
+// 432 CreateNewProcTags
+function RunCommand(Seg: BPTR; Stack: LongWord; const ParamPtr: STRPTR; ParamLen: LongInt): LongInt; syscall IDos 436;
+function GetConsolePort(): PMsgPort; syscall IDos 440;
+function SetConsolePort(const Port: PMsgPort): PMsgPort; syscall IDos 444;
+function GetFileSysPort(): PMsgPort; syscall IDos 448;
+function SetFileSysPort(const Port: PMsgPort): PMsgPort; syscall IDos 452;
+function GetArgStr: STRPTR; syscall IDos 456;
+function SetArgStr(const String_: STRPTR): STRPTR; syscall IDos 460;
+function FindCliProc(Num: LongWord): PProcess; syscall IDos 464;
+function MaxCli: LongWord; syscall IDos 468;
+function SetCliCurrentDirName(const Name: STRPTR): LongInt; syscall IDos 472;
+function GetCliCurrentDirName(Buf: STRPTR; Len: LongInt): LongInt; syscall IDos 476;
+function SetCliProgramName(const Name: STRPTR): LongInt; syscall IDos 480;
+function GetCliProgramName(Buf: STRPTR; Len: LongInt): LongInt; syscall IDos 484;
+function SetCliPrompt(const Name: STRPTR): LongInt; syscall IDos 488;
+function GetCliPrompt(Buf: STRPTR; Len: LongInt): LongInt; syscall IDos 492;
+function SetProgramDir(Lock: BPTR): BPTR; syscall IDos 496;
+function GetProgramDir(): BPTR; syscall IDos 500;
+function SystemTagList(const Command: STRPTR; const Tags: PTagItem): LongInt; syscall IDos 504;
+function DosSystem(const Command: STRPTR; const Tags: PTagItem): LongInt; syscall IDos 508;
+// 512 SystemTags
+function AssignLock(const Name: STRPTR; Lock: BPTR): LongBool; syscall IDos 516;
+function AssignLate(const Name: STRPTR; const Path: STRPTR): LongBool; syscall IDos 520;
+function AssignPath(const Name: STRPTR; const Path: STRPTR) : LongBool; syscall IDos 524;
+function AssignAdd(const Name: STRPTR; Lock: BPTR): LongBool; syscall IDos 528;
+function RemAssignList(const Name: STRPTR; Lock: BPTR): LongBool; syscall IDos 532;
+function GetDeviceProc(const Name: STRPTR; Dp: PDevProc): pDevProc; syscall IDos 536;
+procedure FreeDeviceProc(Dp: PDevProc); syscall IDos 540;
+function LockDosList(Flags: LongWord): PDosList; syscall IDos 544;
+procedure UnLockDosList(Flags: LongWord); syscall IDos 548;
+function AttemptLockDosList(Flags: LongWord): PDosList; syscall IDos 552;
+function RemDosEntry(DList: PDosList): LongBool; syscall IDos 556;
+function AddDosEntry(DList: PDosList): LongBool; syscall IDos 560;
+function FindDosEntry(const DList: PDosList; const Name: STRPTR; Flags: LongWord): PDosList; syscall IDos 564;
+function NextDosEntry(const DList: PDosList; Flags: LongWord) : PDosList; syscall IDos 568;
+function MakeDosEntry(const Name: STRPTR; Type_: LongInt): PDosList; syscall IDos 572;
+procedure FreeDosEntry(DList: PDosList); syscall IDos 576;
+function IsFileSystem(const Name: STRPTR): LongBool; syscall IDos 580;
+function Format(const Filesystem: STRPTR; const VolumeName: STRPTR; DosType: LongWord): LongBool; syscall IDos 584;
+function Relabel(const Drive: STRPTR; const NewName: STRPTR): LongBool; syscall IDos 588;
+function Inhibit(const Name: STRPTR; OnOff: LongInt): LongBool; syscall IDos 592;
+function AddBuffers(const Name: STRPTR; Number: LongInt): LongBool; syscall IDos 596;
+function CompareDates(const Date1: PDateStamp; const Date2: PDateStamp): LongInt; syscall IDos 600;
+function DosDateToStr(DateTime: _PDateTime): LongBool; syscall IDos 604;
+function DosStrToDate(DateTime: _PDateTime): LongBool; syscall IDos 608;
+// obsolete InternalLoadSeg 612
+// obsolete InternalUnLoadSeg 616
+// obsolete NewLoadSeg 620
+// obsolete NewLoadSegTagList 624
+// obsolete NewLoadSegTags 628
+function AddSegment(const Name: STRPTR; Seg: BPTR; Type_: LongInt): LongBool; syscall IDos 632;
+function FindSegment(const Name: STRPTR; const Seg: PDosResidentSeg; Sys: LongInt): PDosResidentSeg; syscall IDos 636;
+function RemSegment(Seg: PDosResidentSeg): LongBool; syscall IDos 640;
+function CheckSignal(Mask: LongWord): LongWord; syscall IDos 644;
+function ReadArgs(const ArgTemplate: STRPTR; Array_: PLongInt; Args: PRDArgs): PRDArgs; syscall IDos 648;
+function FindArg(const KeyWord: STRPTR; const ArgTemplate: STRPTR): LongInt; syscall IDos 652;
+function ReadItem(const Name: STRPTR; MaxChars: LongInt; CSource: PCSource): LongInt; syscall IDos 656;
+function StrToLong(const String_: STRPTR; var Value: LongInt): LongInt; syscall IDos 660;
+function MatchFirst(const Pat: STRPTR; Anchor: PAnchorPath): LongInt; syscall IDos 664;
+function MatchNext(Anchor: PAnchorPath): LongInt; syscall IDos 668;
+procedure MatchEnd(Anchor: PAnchorPath); syscall IDos 672;
+function ParsePattern(const Pat: STRPTR; Buf: STRPTR; BufLen: LongInt): LongInt; syscall IDos 676;
+function MatchPattern(const Pat: STRPTR; Str: STRPTR): LongBool; syscall IDos 680;
+// 684 reserved
+procedure FreeArgs(Args: PRDArgs); syscall IDos 688;
+// 692 reserved
+function FilePart(const Path: STRPTR): STRPTR; syscall IDos 696;
+function PathPart(const Path: STRPTR): STRPTR; syscall IDos 700;
+function AddPart(DestDirName: STRPTR; const FileName: STRPTR; Size: LongWord): LongBool; syscall IDos 704;
+function StartNotify(Notify: PNotifyRequest): LongBool; syscall IDos 708;
+procedure EndNotify(Notify: PNotifyRequest); syscall IDos 712;
+function SetVar(const Name: STRPTR; Buffer: STRPTR; Size: LongInt; Flags: LongWord): LongBool; syscall IDos 716;
+function GetVar(const Name: STRPTR; Buffer: STRPTR; Size: LongInt; Flags: LongInt): LongInt; syscall IDos 720;
+function DeleteVar(const Name: STRPTR; Flags: LongWord): LongBool; syscall IDos 724;
+function FindVar(const Name: STRPTR; Type_: LongWord): PLocalVar; syscall IDos 728;
+// private CLIInit 732
+function CliInitNewcli(Dp: PDosPacket): LongInt; syscall IDos 736;
+function CliInitRun(Dp: PDosPacket): LongInt; syscall IDos 740;
+function WriteChars(const Buf: STRPTR; BufLen: LongWord): LongInt; syscall IDos 744;
+function PutStr(const Str: STRPTR): LongBool; syscall IDos 748;
+function VPrintf(const Format: STRPTR; const ArgArray: PLongInt): LongInt; syscall IDos 752;
+// 756 Printf
+// 760 reserved
+function ParsePatternNoCase(const Pat: STRPTR; Buf: STRPTR; BufLen: LongInt): LongInt; syscall IDos 764;
+function MatchPatternNoCase(const Pat: STRPTR; Str: STRPTR): LongBool; syscall IDos 768;
+// private DosGetString 772
+function SameDevice(Lock1, Lock2: BPTR): LongBool; syscall IDos 776;
+procedure ExAllEnd(Lock: BPTR; Buffer: PExAllData; Size, data: LongInt; Control: PExAllControl); syscall IDos 780;
+function SetOwner(const Name: STRPTR; OwnerInfo: LongInt): LongBool; syscall IDos 784;
+function GetEntryData(): LongInt; syscall IDos 788;
+function ReadLineItem(Buffer: STRPTR; MaxChars: LongInt; TagList: PTagItem): LongInt; syscall IDos 792;
+// 796 ReadLineItemTags
+// private InternalRunCommand 800
+function GetCurrentDir(): BPTR; syscall IDos 804;
+function NonBlockingModifyDosEntry(Dl: PDosList; Mode: LongInt; Arg1, Arg2: APTR): LongInt; syscall IDos 808;
+function SecondsToDateStamp(Seconds: LongWord; Ds: PDateStamp): PDateStamp; syscall IDos 812;
+function DateStampToSeconds(const Ds: PDateStamp): LongWord; syscall IDos 816;
+function FixDateStamp(Ds: PDateStamp): LongInt; syscall IDos 820;
+function AddDates(To_: PDateStamp; const From_: PDateStamp): LongInt; syscall IDos 824;
+function SubtractDates(To_: PDateStamp; const From_: PDateStamp): LongInt; syscall IDos 828;
+function AddSegmentTagList(const Name: STRPTR; Type_: LongInt; const Tags: PTagItem): LongInt; syscall IDos 832;
+function ParseCapturePattern(const Pat: STRPTR; Dst: STRPTR; Length: LongInt; CaseSen: LongInt): LongInt; syscall IDos 836;
+function CapturePattern(const Pat: STRPTR; const Str: STRPTR; CaseSen: LongInt; var Cap: PCapturedExpression): LongInt; syscall IDos 840;
+procedure ReleaseCapturedExpressions(First: PCapturedExpression); syscall IDos 844;
+procedure FindTrackedAddress(const Address: APTR; Hook: PHook); syscall IDos 848;
+function TrackAddressList(const Name: STRPTR; Segment: BPTR; const ExtraInfo: APTR; ExtraInfoSize: LongInt; const Aas: PAddressAndSize; NumPairs: LongInt): LongInt; syscall IDos 852;
+function TrackSegmentList(const Name: STRPTR; Segment: BPTR; const ExtraInfo: APTR; ExtraInfoSize: LongInt): LongInt; syscall IDos 856;
+procedure UnTrackAddress(Address: APTR); syscall IDos 860;
+procedure UnTrackSegmentList(Segment: BPTR); syscall IDos 864;
+function GetExitData(): LongInt; syscall IDos 868;
+function PutErrStr(const str: STRPTR): LongInt; syscall IDos 872;
+function ErrorOutput(): BPTR; syscall IDos 876;
+function SelectErrorOutput(Fh: BPTR): BPTR; syscall IDos 880;
+function MountDevice(const Name: STRPTR; Type_: LongInt; Tags: PTagItem): LongInt; syscall IDos 884;
+// 888 MountDeviceTags
+function SetProcWindow(const Win: APTR): APTR; syscall IDos 892;
+function FindSegmentStackSize(Segment: BPTR): LongWord; syscall IDos 896;
+function CalculateSegmentChecksum(Segment: BPTR): LongWord; syscall IDos 900;
+function AllocSegList(const Entry: APTR; const Data: APTR; DataLen: LongWord; IdentKey: LongWord): BPTR; syscall IDos 904;
+function GetSegListInfo(SegList: BPTR; const Tags: PTagItem): LongInt; syscall IDos 908;
+// 912 GetSegListInfoTags
+function AddSegListTail(BSegList: BPTR; BSegNew: BPTR): LongInt; syscall IDos 916;
+function DevNameFromLock(Lock: BPTR; Buffer: STRPTR; BufLen: LongInt; Mode: LongInt): LongInt; syscall IDos 920;
+function GetProcMsgPort(const Proc: PProcess): PMsgPort; syscall IDos 924;
+function WaitForData(Stream: BPTR; DataDirection: LongInt; TimeOut: LongInt): LongInt; syscall IDos 928;
+function SetBlockingMode(Stream: BPTR; NewBlocking: LongInt): LongInt; syscall IDos 932;
+function SetCurrentCmdPathList(Pn: PPathNode): PPathNode; syscall IDos 936;
+function AllocateCmdPathList(FirstLock: BPTR): PPathNode; syscall IDos 940;
+procedure FreeCmdPathList(Pn: PPathNode); syscall IDos 944;
+function RemoveCmdPathNode(Pn: PPathNode; Lock: BPTR): PPathNode; syscall IDos 948;
+function AddCmdPathNode(Pn: PPathNode; Lock: BPTR; Where: LongInt): PPathNode; syscall IDos 952;
+function SearchCmdPathList(Pn: PPathNode; h: PHook; const Name: STRPTR; const Tags: PTagItem): LongInt; syscall IDos 956;
+// 960 SearchCmdPathListTags
+function ScanVars(Hook: PHook; Flags: LongWord; const UserData: APTR): LongInt; syscall IDos 964;
+function GetProcSegList(const Proc: PProcess; Flags: LongWord): BPTR; syscall IDos 968;
+function HexToLong(const String_: STRPTR; ValuePtr: PLongWord): LongInt; syscall IDos 972;
+function GetDeviceProcFlags(const Name: STRPTR; Odp: PDevProc; Flags: LongWord): PDevProc; syscall IDos 976;
+function DosControl(const Tags: PTagItem): LongInt; syscall IDos 980;
+// 984 DosControlTags
+function CreateDirTree(const Name: STRPTR): BPTR; syscall IDos 988;
+function NotifyVar(const Name: STRPTR; Hook: PHook; Flags: LongInt; const UserData: APTR): LongInt; syscall IDos 992;
+function GetDiskFileSystemData(const Name: STRPTR): PFileSystemData; syscall IDos 996;
+procedure FreeDiskFileSystemData(Fsd: PFileSystemData); syscall IDos 1000;
+function FOpen(const Name: STRPTR; Mode: LongInt; BufSize: LongInt): BPTR; syscall IDos 1004;
+function FClose(Scb: BPTR): LongInt; syscall IDos 1008;
+function FOpenFromLock(Lock: BPTR; BufSize: LongInt): BPTR; syscall IDos 1012;
+// 1016 reserved
+function TimedDosRequester(const Tags: PTagITem): LongInt; syscall IDos 1020;
+// 1024 TimedDosRequesterTags
+function RenameDosEntry(const DList: PDosList; const NewName: STRPTR): LongInt; syscall IDos 1028;
+function DismountDevice(const Name: STRPTR; Flags: LongWord; Reserved: APTR): LongInt; syscall IDos 1032;
+function DupFileHandle(Scb: BPTR): BPTR; syscall IDos 1036;
+function DevNameFromFH(Scb: BPTR; Buffer: STRPTR; BufLen: LongInt; Mode: LongInt): LongInt; syscall IDos 1040;
+function AssignAddToList(const Name: STRPTR; Lock: BPTR; EndPos: LongInt): LongInt; syscall IDos 1044;
+function SetFileHandleAttr(Fh: BPTR; const Tags: PTagItem): LongInt; syscall IDos 1048;
+// 1052 SetFileHandleAttrTags
+function FileSystemAttr(const Tags: PTagItem): LongInt; syscall IDos 1056;
+// 1060 FileSystemAttrTags
+function FReadLine(Fh: BPTR; Frld: PFReadLineData): LongInt; syscall IDos 1064;
+function CopyStringBSTRToC(BSrc: BSTR; Dst: STRPTR; Size: LongWord): LongWord; syscall IDos 1068;
+function CopyStringCToBSTR(const Src: STRPTR; BDest: BSTR; Size: LongWord): LongWord; syscall IDos 1072;
+function GetFilePosition(Fh: BPTR): Int64; syscall IDos 1076;
+function ChangeFilePosition(Fh: BPTR; Position: Int64; Offset: LongInt): LongInt; syscall IDos 1080;
+function ChangeFileSize(Fh: BPTR; Pos: Int64; Mode: LongInt): LongInt; syscall IDos 1084;
+function GetFileSize(Fh: BPTR): Int64; syscall IDos 1088;
+// 1092 reserved
+// 1096 Private DoPkt64
+// 1100 reserved
+// 1104 reserved
+// 1108 reserved
+function ProcessScan(Hook: PHook; const UserData: APTR; Reserved: LongWord): LongInt; syscall IDos 1112;
+function NotifyDosListChange(Process: PProcess; SignalNum, Reserved: LongWord): LongInt; syscall IDos 1116;
+function NotifyProcListChange(Process: PProcess; SignalNum, Reserved: LongWord): LongInt; syscall IDos 1120;
+function GetDiskInfo(const Tags: PTagItem): LongInt; syscall IDos 1124;
+// 1128 GetDiskInfoTags
+function WriteProtectVolume(const Name: STRPTR; OnOff: LongInt; PassKey: LongWord; Reserved: LongWord): LongInt; syscall IDos 1132;
+function ExamineObject(const CTags: PTagItem): PExamineData; syscall IDos 1136;
+// 1140 ExamineObjectTags
+function ExamineDir(Context: APTR): PExamineData; syscall IDos 1144;
+function ObtainDirContext(const CTags: PTagItem): APTR; syscall IDos 1148;
+// 1152 ObtainDirContextTags
+procedure ReleaseDirContext(Contx: APTR); syscall IDos 1156;
+function GetOwnerInfo(const Tags: PTagItem): APTR; syscall IDos 1160;
+// 1164 GetOwnerInfoTags
+function SetOwnerInfo(const Tags: PTagItem): LongInt; syscall IDos 1168;
+// 1172 SetOwnerInfoTags
+function LockTagList(const Tags: PTagItem): BPTR; syscall IDos 1176;
+// 1180 LockTags
+function GetPID(Process: PProcess): LongWord; syscall IDos 1184;
+function FlushVolume(const Name: STRPTR): LongInt; syscall IDos 1188;
+// 1192 obsolete ConsoleData
+// 1196 obsolete ConsoleDataTags
+procedure ReleaseConsoleData(Data: PConsoleWindowData); syscall IDos 1200;
+function Serialize(const Name: STRPTR): LongInt; syscall IDos 1204;
+function NameFromPort(Port: PMsgPort; Buffer: STRPTR; BufLen: LongInt; AddColon: LongInt): LongInt; syscall IDos 1208;
+function DevNameFromPort(Port: PMsgPort; Buffer: STRPTR; BufLen: LongInt; AddColon: LongInt): LongInt; syscall IDos 1212;
+function SameFH(Scb1, Scb2: BPTR): LongInt; syscall IDos 1216;
+function LockRecord(Fh: BPTR; Offset, Length: Int64; Mode: LongWord; TimeOut: LongWord): LongBool; syscall IDos 1220;
+function UnLockRecord(Fh: BPTR; Offset, Length: Int64): LongBool; syscall IDos 1224;
+function IsFileSystemPort(Port: PMsgPort): LongBool; syscall IDos 1228;
+function InhibitPort(Port: PMsgPort; State: LongInt): LongBool; syscall IDos 1232;
+function FormatPort(Port: PMsgPort; const VolumeName: STRPTR; DosType: LongInt): LongBool; syscall IDos 1236;
+function SerializePort(Port: PMsgPort): LongBool; syscall IDos 1240;
+function FlushVolumePort(Port: PMsgPort): LongBool; syscall IDos 1244;
+function FileHandleScan(const Hook: PHook; const UserData: APTR; Reserved: LongWord): LongInt; syscall IDos 1248;
+function GetFileSystemVectorPort(Port: PMsgPort; MinVersion: LongWord): PFileSystemVectorPort; syscall IDos 1252;
+function ResolvePath(Port: PMsgPort; const Path: STRPTR; InLock: BPTR; Out_: STRPTR; OutLen: LongWord; var OutDir: BPTR; var SLCount: LongWord): LongInt; syscall IDos 1256;
+function WriteProtectVolumePort(Port: PMsgPort; OnOff: LongInt; PassKey: LongWord; Reserved: LongInt): LongInt; syscall IDos 1260;
+// 1264 - 1280 Reserved
+
+
+function BADDR(bval :BPTR): POINTER;
+function MKBADDR(adr: Pointer): BPTR;
+
+// var args version
+function AllocDosObjectTags(type_ : LongWord; Const argv : Array of PtrUInt) : POINTER;
+function CreateNewProcTags(Const argv : Array of PtrUInt) : pProcess;
+function SystemTags(command : PChar; Const argv : Array of PtrUInt) : LongInt;
+
+
+
+implementation
+
+
+function BADDR(bval : BPTR): POINTER; inline;
+BEGIN
+  BADDR := POINTER( bval shl 2);
+END;
+
+function MKBADDR(adr : POINTER): BPTR; inline;
+BEGIN
+  MKBADDR := BPTR(LongWord(adr) shr 2);
+END;
+
+function AllocDosObjectTags(type_ : LongWord; Const argv : Array of PtrUInt) : POINTER;
+begin
+  AllocDosObjectTags := AllocDosObjectTagList(type_, @argv);
+end;
+
+function CreateNewProcTags(Const argv : Array of PtrUInt) : pProcess;
+begin
+  CreateNewProcTags := CreateNewProcTagList(@argv);
+end;
+
+function SystemTags(command : PChar; Const argv : Array of PtrUInt) : LongInt;
+begin
+  SystemTags := SystemTagList(command, @argv);
+end;
+
+end.
+
+

+ 11 - 10
packages/os4units/src/exec.pas

@@ -2,7 +2,7 @@
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
     Copyright (c) 2016 by Free Pascal development team
     Copyright (c) 2016 by Free Pascal development team
 
 
-    exec.library functions
+    exec.library functions for Amiga OS 4.x
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -25,11 +25,12 @@ interface
 
 
 type
 type
   STRPTR   = PChar;
   STRPTR   = PChar;
+  PSTRPTR  = PPChar;
   ULONG    = Longword;
   ULONG    = Longword;
   LONG     = LongInt;
   LONG     = LongInt;
   APTR     = Pointer;
   APTR     = Pointer;
-  BPTR     = LongInt;
-  BSTR     = LongInt;
+  BPTR     = LongInt; // Long word (BCPL) pointer
+  BSTR     = LongInt; // Long word pointer to BCPL string
   BOOL     = SmallInt;
   BOOL     = SmallInt;
   UWORD    = Word;
   UWORD    = Word;
   WORDBITS = Word;
   WORDBITS = Word;
@@ -114,14 +115,14 @@ const
 const
 const
 // differentiates user tags from control tags
 // differentiates user tags from control tags
  TAG_USER = $80000000;    // differentiates user tags from system tags
  TAG_USER = $80000000;    // differentiates user tags from system tags
-Type
+type
   Tag = LongWord;
   Tag = LongWord;
   PTag = ^Tag;
   PTag = ^Tag;
 
 
   PTagItem = ^TTagItem;
   PTagItem = ^TTagItem;
   TTagItem = record
   TTagItem = record
-   ti_Tag: Tag;
-   ti_Data: LongWord;
+    ti_Tag: Tag;        // identifies the type of data
+    ti_Data: LongWord;  // type-specific data
   end;
   end;
   PPTagItem = ^PTagItem;
   PPTagItem = ^PTagItem;
 
 
@@ -1742,10 +1743,10 @@ const
 
 
 //**********************************************************************
 //**********************************************************************
 
 
-function Obtain(): LongWord; syscall IExec 60;
-function Release(): LongWord; syscall IExec 64;
-procedure Expunge(); syscall IExec 68;
-function Clone(): PInterface; syscall IExec 72;
+function ExecObtain(): LongWord; syscall IExec 60;
+function ExecRelease(): LongWord; syscall IExec 64;
+procedure ExecExpunge(); syscall IExec 68;
+function ExecClone(): PInterface; syscall IExec 72;
 procedure AddHead(List: PList; Node: PNode); syscall IExec 76;
 procedure AddHead(List: PList; Node: PNode); syscall IExec 76;
 procedure AddMemHandler(MemHand: PInterrupt); syscall IExec 80;
 procedure AddMemHandler(MemHand: PInterrupt); syscall IExec 80;
 procedure AddMemList(Size: LongWord; Attributes: LongWord; Pri: LongInt; Base: APTR; const Name: PChar); syscall IExec 84;
 procedure AddMemList(Size: LongWord; Attributes: LongWord; Pri: LongInt; Base: APTR; const Name: PChar); syscall IExec 84;

+ 86 - 0
packages/os4units/src/timer.pas

@@ -0,0 +1,86 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2016 by Free Pascal development team
+
+    dos.library functions for Amiga OS 4.x
+
+    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 timer;
+
+interface
+
+uses
+  exec;
+
+const
+// unit defintions
+// enTimerUnits
+  UNIT_MICROHZ    = 0; // 1/1000000 second granularity
+  UNIT_VBLANK     = 1; // 1/60 second granularity
+  UNIT_ECLOCK     = 2; // system dependant number of ticks/second
+  UNIT_WAITUNTIL  = 3; // wait until a certain point of time
+  UNIT_WAITECLOCK = 4; // wait until a certain point of time (in EClock ticks)
+  UNIT_ENTROPY    = 5; // Read entropy data
+
+  TIMERNAME : PChar   = 'timer.device';
+
+type
+  PTimeVal = ^TTimeVal;
+  TTimeVal = record
+    tv_secs: LongWord;
+    tv_micro: LongWord;
+  end;
+
+  PTimeRequest = ^TTimeRequest;
+  TTimeRequest = record
+    tr_node: TIORequest;
+    tr_time: TTimeVal;
+  end;
+
+  PEClockVal = ^TEClockVal;
+  TEClockVal = record
+    ev_hi: LongWord;
+    ev_lo: LongWord;
+  end;
+
+const
+// enTimerCmd
+  TR_ADDREQUEST = CMD_NONSTD;
+  TR_GETSYSTIME = CMD_NONSTD + 1;
+  TR_SETSYSTIME = CMD_NONSTD + 2;
+
+{ To use any of the routines below, TimerBase must be set to point
+  to the timer.device, either by calling CreateTimer or by pulling
+  the device pointer from a valid TimeRequest, and get the
+  Interface i.e.
+    TimerBase := TimeRequest.io_Device;
+    ITimer := GetInterface(TimerBase, 'main', 1, nil);
+  _after_ you have called OpenDevice on the timer.}
+var
+  TimerBase: Pointer = nil;
+  ITimer: Pointer = nil;
+
+function TimerObtain(): LongWord; syscall ITimer 60;
+function TimerRelease(): LongWord; syscall ITimer 64;
+procedure TimerExpunge(); syscall ITimer 68;
+function TimerClone(): PInterface; syscall ITimer 72;
+procedure AddTime(Dest: PTimeVal; Src: PTimeVal); syscall TimerBase 76;
+function CmpTime(Dest: PTimeVal; Src: PTimeVal): LongInt; syscall TimerBase 80;
+procedure SubTime(Dest: PTimeVal; Src: PTimeVal); syscall TimerBase 84;
+function ReadEClock(Dest: PEClockVal): LongWord; syscall TimerBase 88;
+procedure GetSysTime(Dest: PTimeVal); syscall TimerBase 92;
+procedure GetUpTime(Dest: PTimeVal); syscall TimerBase 96;
+procedure MicroDelay(MicroSeconds: LongWord); syscall TimerBase 100;
+
+implementation
+
+end.

+ 389 - 0
packages/os4units/src/utility.pas

@@ -0,0 +1,389 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2016 by Free Pascal development team
+
+    utility.library functions for Amiga OS 4.x
+
+    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 utility;
+
+interface
+
+uses
+  exec;
+
+type
+  PClockData = ^TClockData;
+  TClockData = record
+    sec: Word;   // 0..59
+    min: Word;   // 0..59
+    hour: Word;  // 0..23
+    mday: Word;  // 1..31
+    month: Word; // 1..12
+    year: Word;  // 1978..
+    wday: Word;  // 0..6; 0 = Sunday
+  end;
+
+// PHook/THook relocated to Exec
+
+// Namespace definitions
+type
+// The named object structure
+  PNamedObject = ^TNamedObject;
+  TNamedObject = record
+    no_Object: APTR;  // Your pointer, for whatever you want
+  end;
+
+const
+// Tags for AllocNamedObject()
+
+// enAllocNamedObjectTags
+  ANO_NameSpace  = 4000; // Tag to define namespace
+  ANO_UserSpace  = 4001; // tag to define userspace
+  ANO_Priority   = 4002; // tag to define priority
+  ANO_Flags      = 4003; // tag to define flags
+
+// Flags for tag ANO_Flags
+// enANOFlagBits
+  NSB_NODUPS     = 0;
+  NSB_CASE       = 1;
+// enANOFlags
+  NSF_NODUPS     = 1 shl NSB_NODUPS; // Default allow duplicates
+  NSF_CASE       = 1 shl NSB_CASE;   // Default to caseless...
+
+
+   {    Control attributes for Pack/UnpackStructureTags() }
+
+
+{ PackTable definition:
+ *
+ * The PackTable is a simple array of LONGWORDS that are evaluated by
+ * PackStructureTags() and UnpackStructureTags().
+ *
+ * The table contains compressed information such as the tag offset from
+ * the base tag. The tag offset has a limited range so the base tag is
+ * defined in the first longword.
+ *
+ * After the first longword, the fields look as follows:
+ *
+ *      +--------- 1 = signed, 0 = unsigned (for bits, 1=inverted boolean)
+ *      |
+ *      |  +------ 00 = Pack/Unpack, 10 = Pack, 01 = Unpack, 11 = special
+ *      | / \
+ *      | | |  +-- 00 = Byte, 01 = Integer, 10 = Long, 11 = Bit
+ *      | | | / \
+ *      | | | | | /----- For bit operations: 1 = TAG_EXISTS is TRUE
+ *      | | | | | |
+ *      | | | | | | /-------------------- Tag offset from base tag value
+ *      | | | | | | |                 \
+ *      m n n o o p q q q q q q q q q q r r r s s s s s s s s s s s s s
+ *                                      \   | |               |
+ *      Bit offset (for bit operations) ----/ |               |
+ *                                            \                       |
+ *      Offset into data structure -----------------------------------/
+ *
+ * A -1 longword signifies that the next longword will be a new base tag
+ *
+ * A 0 longword signifies that it is the end of the pack table.
+ *
+ * What this implies is that there are only 13-bits of address offset
+ * and 10 bits for tag offsets from the base tag.  For most uses this
+ * should be enough, but when this is not, either multiple pack tables
+ * or a pack table with extra base tags would be able to do the trick.
+ * The goal here was to make the tables small and yet flexible enough to
+ * handle most cases.
+ }
+
+const
+  PSTB_SIGNED = 31;
+  PSTB_UNPACK = 30; // Note that these are active low...
+  PSTB_PACK   = 29; // Note that these are active low...
+  PSTB_EXISTS = 26; // Tag exists bit true flag hack...
+
+  PSTF_SIGNED = 1 shl PSTB_SIGNED;
+  PSTF_UNPACK = 1 shl PSTB_UNPACK;
+  PSTF_PACK   = 1 shl PSTB_PACK;
+
+  PSTF_EXISTS = 1 shl PSTB_EXISTS;
+
+
+// *********************************************************************
+
+ PKCTRL_PACKUNPACK = $00000000;
+ PKCTRL_PACKONLY   = $40000000;
+ PKCTRL_UNPACKONLY = $20000000;
+
+ PKCTRL_BYTE       = $80000000;
+ PKCTRL_WORD       = $88000000;
+ PKCTRL_LONG       = $90000000;
+
+ PKCTRL_UBYTE      = $00000000;
+ PKCTRL_UWORD      = $08000000;
+ PKCTRL_ULONG      = $10000000;
+
+ PKCTRL_BIT        = $18000000;
+ PKCTRL_FLIPBIT    = $98000000;
+
+
+// *********************************************************************
+// Tags are a general mechanism of extensible data arrays for parameter
+// specification and property inquiry. In practice, tags are used in arrays,
+// or chain of arrays.
+
+// PTagItem/TTagItem/TAG relocated to Exec
+
+// constants for Tag.ti_Tag, control tag values
+const
+  TAG_DONE   = 0; // terminates array of TagItems. ti_Data unused
+  TAG_END    = 0; // synonym for TAG_DONE
+  TAG_IGNORE = 1; // ignore this item, not end of array
+  TAG_MORE   = 2; // ti_Data is pointer to another array of TagItems note that this tag terminates the current array
+  TAG_SKIP   = 3; // skip this and the next ti_Data items
+
+// differentiates user tags from control tags
+  TAG_USER = $80000000;    { differentiates user tags from system tags}
+
+{ If the TAG_USER bit is set in a tag number, it tells utility.library that
+  the tag is not a control tag (like TAG_DONE, TAG_IGNORE, TAG_MORE) and is
+  instead an application tag. "USER" means a client of utility.library in
+  general, including system code like Intuition or ASL, it has nothing to do
+  with user code.}
+
+// Tag filter logic specifiers for use with FilterTagItems()
+// enTagLogic
+  TAGFILTER_AND = 0; // exclude everything but filter hits
+  TAGFILTER_NOT = 1; // exclude only filter hits
+
+// Mapping types for use with MapTags()
+// enTagMap
+ MAP_REMOVE_NOT_FOUND = 0; // remove tags that aren't in mapList
+ MAP_KEEP_NOT_FOUND   = 1; // keep tags that aren't in mapList
+
+type
+  PUtilityBase = ^TUtilityBase;
+  TUtilityBase = record
+    ub_LibNode: TLibrary;
+    ub_Language: Byte;    // Private, for lowlevel.library
+    ub_Reserved: Byte;
+  end;
+
+//**********************************************************************
+// Flags used by the UTF-8 functions. */
+const
+  UTF_INVALID_SUBST_FFFD = 1 shl 0;
+  //  Do not abort decoding when an invalid UTF-8 sequence is encountered,
+  //  instead, substitute the invalid byte sequence with the special
+  //  $FFFD character. (inverse ? on square background)
+
+type
+// *********************************************************************
+// Lists with probabilistic balancing
+  PSkipList = ^TSkipList;
+  TSkipList = record
+    sl_Error: LongInt; // If an insertion fails, here is why
+  end;
+
+  PSkipNode = ^TSkipNode;
+  TSkipNode = record
+    sn_Reserved: APTR;
+    sn_Key: APTR;      // Unique key associated with this node
+  end;
+
+// *********************************************************************
+// Self-organizing binary trees
+  PSplayTree = ^TSplayTree;
+  TSplayTree = record
+    st_Error: LongInt; // If an insertion fails, here is why
+  end;
+
+  PSplayNode = ^TSplayNode;
+  TSplayNode = record
+    sn_UserData: APTR; // Points to user data area for this node
+  end;
+
+const
+// *********************************************************************
+// Error codes that may be returned by the insertion functions.
+// enErrorCodes
+  INSERTNODE_OUT_OF_MEMORY = 1; // Not enough memory
+  INSERTNODE_DUPLICATE_KEY = 2; // Key is not unique
+  INSERTNODE_TOO_SHORT     = 3; // Node size must be at least as large as sizeof(TSkipNode)
+
+// *********************************************************************
+// Context information to be passed around between the different SHA-1
+//   calculation routines. When the digest has been calculated, you fill
+//   find it stored in the 'mdsha_Code' member (all 160 bits of it).
+type
+  PMessageDigest_SHA = ^TMessageDigest_SHA;
+  TMessageDigest_SHA = record
+    mdsha_Code: array[0..19] of Byte;
+    mdsha_Reserved: array[0..327] of Byte;
+  end;
+
+  PRandomState = ^TRandomState;
+  TRandomState = record
+    rs_High: LongInt;
+    rs_Low: LongInt;
+  end;
+
+var
+  UtilityBase: pUtilityBase;
+
+function UtilityObtain(): LongWord; syscall IUtility 60;
+function UtilityRelease(): LongWord; syscall IUtility 64;
+procedure UtilityExpunge(); syscall IUtility 68;
+function UtilityClone(): PInterface; syscall IUtility 72;
+function AllocateTagItems(NumTags: LongWord): PTagItem; syscall IUtility 76;
+procedure ApplyTagChanges(List: PTagItem; const ChangeList: PTagItem); syscall IUtility 80;
+function CloneTagItems(const Original: PTagItem): PTagItem; syscall IUtility 84;
+procedure FilterTagChanges(Changelist: PTagItem; OriginalList: PTagItem; Apply: LongWord); syscall IUtility 88;
+function FilterTagItems(Taglist: PTagItem; const FilterArray: PLongWord; Logic: LongWord): LongWord; syscall IUtility 92;
+function FindTagItem(TagValue: Tag; const TagList: PTagItem): PTagItem; syscall IUtility 96;
+procedure FreeTagItems(TagList: PTagItem); syscall IUtility 100;
+function GetTagData(TagValue: Tag; DefaultValue: LongWord; const TagList: PTagItem): LongWord; syscall IUtility 104;
+procedure MapTags(TagList: PTagItem; const Maplist: PTagItem; MapType: LongWord); syscall IUtility 108;
+function NextTagItem(ItemPtr: PPTagItem): PTagItem; overload; syscall IUtility 112;
+function NextTagItem(var Item: PTagItem): PTagItem; overload; syscall IUtility 112;
+function PackBoolTags(InitialFlags: LongWord; const TagList: PTagItem; const Boolmap: PTagItem) : LongWord; syscall IUtility 116;
+procedure RefreshTagItemClones(Clone: PTagItem; const OriginalTagItems : PTagItem); syscall IUtility 120;
+function TagInArray(TagValue: Tag; const TagArray: PLongWord): LongBool; syscall IUtility 124;
+function CallHookPkt(Hook: PHook; Obj: APTR; Message_: APTR): LongWord; syscall IUtility 128;
+// 132 CallHook
+function AddNamedObject(NameSpace: PNamedObject; Obj: PNamedObject): LongBool; syscall IUtility 136;
+function AllocNamedObjectA(const Name: STRPTR; const TagList: PTagItem): PNamedObject; syscall IUtility 140;
+// 144 AllocNamedObject
+function AttemptRemNamedObject(Obj: PNamedObject): LongInt; syscall IUtility 148;
+function FindNamedObject(NameSpace: PNamedObject; const Name: STRPTR; PreviousObject: PNamedObject): PNamedObject; syscall IUtility 152;
+procedure FreeNamedObject(Obj: PNamedObject); syscall IUtility 156;
+function NamedObjectName(Obj: PNamedObject): STRPTR; syscall IUtility 160;
+procedure ReleaseNamedObject(Obj: PNamedObject); syscall IUtility 164;
+procedure RemNamedObject(Obj: PNamedObject; Message_: PMessage); syscall IUtility 168;
+procedure Amiga2Date(DateAmiga: LongWord; Cd: PClockData); syscall IUtility 172;
+function CheckDate(const Date: PClockData): LongWord; syscall IUtility 176;
+function Date2Amiga(const Date: PClockData): LongWord; syscall IUtility 180;
+function CreateSkipList(Hook: PHook; MaxLevels: LongInt): PSkipList; syscall IUtility 184;
+procedure DeleteSkipList(SkipList: PSkipList); syscall IUtility 188;
+function FindSkipNode(SkipList: PSkipList; Key: APTR): PSkipList; syscall IUtility 192;
+function GetFirstSkipNode(SkipList: PSkipList): PSkipList; syscall IUtility 196;
+function GetNextSkipNode(SkipList: PSkipList): PSkipList; syscall IUtility 200;
+function InsertSkipNode(SkipList: PSkipList): PSkipList; syscall IUtility 204;
+function RemoveSkipNode(SkipList: PSkipList; Key: APTR): LongBool; syscall IUtility 208;
+function CreateSplayTree(CompareHook: PHook): PSplayTree; syscall IUtility 212;
+procedure DeleteSplayTree(SplayTree: PSplayTree); syscall IUtility 216;
+function FindSplayNode(SplayTree: PSplayTree; Key: APTR): PSplayTree; syscall IUtility 220;
+function InsertSplayNode(SplayTree: PSplayTree; Key: APTR; DateSize: LongWord): PSplayTree; syscall IUtility 224;
+function RemoveSplayNode(SplayTree: PSplayTree; Key: APTR): PSplayTree; syscall IUtility 228;
+function FindNameNC(List: PList; const Name: PChar): PNode; syscall IUtility 232;
+function GetUniqueID : LongWord; syscall IUtility 236;
+procedure MessageDigest_SHA_Final(SHAs: PMessageDigest_SHA); syscall IUtility 240;
+procedure MessageDigest_SHA_Init(SHAs: PMessageDigest_SHA); syscall IUtility 244;
+procedure MessageDigest_SHA_Update(SHAs: PMessageDigest_SHA; Data: APTR; NumBytes: LongInt); syscall IUtility 248;
+function PackStructureTags(Pack: APTR; const PackTable: PLongWord; const TagList: PTagItem): LongWord; syscall IUtility 252;
+function UnpackStructureTags(const Pack: APTR; const PackTable: PLongWord; TagList: PTagItem): LongWord; syscall IUtility 256;
+function Random(State: PRandomState): LongWord; syscall IUtility 260;
+function SetMem(Destination: APTR; FillChar: Byte; Length: LongInt): APTR; syscall IUtility 264;
+function Stricmp(const S1: STRPTR; const S2: STRPTR): LongInt; syscall IUtility 268;
+function Strlcpy(Dst: STRPTR; const Src: STRPTR; Size: LongInt): LongInt; syscall IUtility 272;
+function Strlcat(Dst: STRPTR; const Src: STRPTR; Size: LongInt): LongInt; syscall IUtility 276;
+function Strnicmp(const S1: STRPTR; const S2: STRPTR; n: LongInt): LongInt; syscall IUtility 280;
+function ToLower(c: Char): LongWord; syscall IUtility 284;
+function ToUpper(c: Char): LongWord; syscall IUtility 288;
+function VASPrintf(const Fmt: STRPTR; Args: APTR): STRPTR; syscall IUtility 292;
+// 296 ASPrintf
+function VSNPrintf(Buffer: STRPTR; BufferSize: LongInt; const Fmt: STRPTR; Args: APTR): STRPTR; syscall IUtility 300;
+// 304 SNPrintf
+procedure ClearMem(Destination: APTR; Size: LongWord); syscall IUtility 308;
+procedure MoveMem(const Source: APTR; Destination: APTR; Size: LongWord); syscall IUtility 312;
+function Strlen(const String_: STRPTR): LongWord; syscall IUtility 316;
+function UTF8toUCS4(const UTF8Source: STRPTR; UCS4Destination: PLongInt; UCS4DestinationSize: LongInt; Flags: LongWord): LongInt; syscall IUtility 320;
+function UCS4toUTF8(const UCS4Source: PLongInt; UTF8Destination: STRPTR;  UTF8DestinationSize: LongInt; Flags: LongWord): LongInt; syscall IUtility 324;
+function UTF8Strnicmp(const UTF8String1: STRPTR; const UTF8String2: STRPTR; MaxUCSchars: LongInt): LongInt; syscall IUtility 328;
+function UTF8Stricmp(const UTF8String1: STRPTR; const UTF8String2: STRPTR): LongInt; syscall IUtility 332;
+function UTF8Count(const UTF8String: STRPTR; Validate: LongInt): LongInt; syscall IUtility 336;
+function UCS4Count(const UCS4String: PLongInt; Validate: LongInt): LongInt; syscall IUtility 340;
+function UTF8Encode(UCS4: LongInt; Buffer: STRPTR; BufSize: LongInt; Flags: LongWord): LongInt; syscall IUtility 344;
+function UTF8Decode(const UTF8PPTR: PSTRPTR; Flags: LongWord): LongInt; syscall IUtility 348;
+function UCS4ToLower(UCS4In: LongInt): LongInt; syscall IUtility 352;
+function UCS4ToUpper(UCS4In: LongInt): LongInt; syscall IUtility 356;
+function UCS4Valid(UCS4: LongInt): LongInt; syscall IUtility 360;
+
+
+function AllocNamedObject(Name: STRPTR; const Tags: array of PtrUInt): PNamedObject; inline;
+
+function TAG_(value: pointer): PtrUInt; overload; inline;
+function TAG_(value: PChar): PtrUInt; overload; inline;
+function TAG_(value: boolean): PtrUInt; overload; inline;
+function TAG_(value: integer): PtrUInt; overload; inline;
+
+function AsTag(value: pointer): PtrUInt; overload; inline;
+function AsTag(value: PChar): PtrUInt; overload; inline;
+function AsTag(value: boolean): PtrUInt; overload; inline;
+function AsTag(value: integer): PtrUInt; overload; inline;
+
+implementation
+
+function AllocNamedObject(Name: STRPTR; const Tags: array of PtrUInt): PNamedObject; inline;
+begin
+  AllocNamedObject := AllocNamedObjectA(Name, @Tags);
+end;
+
+function TAG_(value: pointer): PtrUInt; inline;
+begin
+  TAG_:=PtrUInt(value);
+end;
+
+function TAG_(value: PChar): PtrUInt; inline;
+begin
+  TAG_:=PtrUInt(value);
+end;
+
+function TAG_(value: boolean): PtrUInt; inline;
+begin
+  if value then
+    TAG_ := LTrue
+  else
+    TAG_ := LFalse;
+end;
+
+function TAG_(value: integer): PtrUInt; inline;
+begin
+  TAG_:=PtrUInt(value);
+end;
+
+function AsTag(value: pointer): PtrUInt; inline;
+begin
+  AsTag:=PtrUInt(value);
+end;
+
+function AsTag(value: PChar): PtrUInt; inline;
+begin
+  AsTag:=PtrUInt(value);
+end;
+
+function AsTag(value: boolean): PtrUInt; inline;
+begin
+  if value then
+    AsTag := LTrue
+  else
+    AsTag := LFalse;
+end;
+
+function AsTag(value: integer): PtrUInt; inline;
+begin
+  AsTag:=PtrUInt(value);
+end;
+
+initialization
+  UtilityBase := _UtilityBase;
+end.