summaryrefslogtreecommitdiff
path: root/rtl/aros/i386
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/aros/i386')
-rw-r--r--rtl/aros/i386/doslibf.inc59
-rw-r--r--rtl/aros/i386/execd.inc1792
-rw-r--r--rtl/aros/i386/execf.inc89
-rw-r--r--rtl/aros/i386/prt0.as162
-rw-r--r--rtl/aros/i386/utild1.inc153
-rw-r--r--rtl/aros/i386/utild2.inc53
-rw-r--r--rtl/aros/i386/utilf.inc18
7 files changed, 2326 insertions, 0 deletions
diff --git a/rtl/aros/i386/doslibf.inc b/rtl/aros/i386/doslibf.inc
new file mode 100644
index 0000000000..058608e653
--- /dev/null
+++ b/rtl/aros/i386/doslibf.inc
@@ -0,0 +1,59 @@
+{
+ This file is part of the Free Pascal run time library.
+ Copyright (c) 2011 by Marcus Sackrow
+
+ dos.library functions for AROS
+
+ 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.
+
+ **********************************************************************}
+
+function Open(name: PChar; accessMode: longint): Cardinal; syscall AOS_DOSBase 5;
+function dosClose(_file: Cardinal): LongBool; syscall AOS_DOSBase 6;
+function dosRead(_file: Cardinal; buffer: Pointer; length: longint): longint; syscall AOS_DOSBase 7;
+function dosWrite(_file: Cardinal; buffer: Pointer; length: longint): longint; syscall AOS_DOSBase 8;
+function dosInput: Cardinal; syscall AOS_DOSBase 9;
+function dosOutput: Cardinal; syscall AOS_DOSBase 10;
+function DosError1: Cardinal; syscall AOS_DOSBase 142;
+function dosSeek(_file: longint;position: longint;offset: longint): longint; syscall AOS_DOSBase 11;
+function dosDeleteFile(const name: PChar): LongBool; syscall AOS_DOSBase 12;
+function dosRename(const oldName: PChar;newName: PChar): LongInt; syscall AOS_DOSBase 13;
+function Lock(const name: PChar;_type: longint): longint; syscall AOS_DOSBase 14;
+function UnLock(lock: longint): longint; syscall AOS_DOSBase 15;
+function DupLock(Lock: longint): longint; syscall AOS_DOSBase 16;
+function Examine(lock: longint; fileInfoBlock: PFileInfoBlock): LongInt; syscall AOS_DOSBase 17;
+function Info(lock: longint; parameterBlock: PInfoData): LongInt; syscall AOS_DOSBase 19;
+function dosCreateDir(const name: PChar): longint; syscall AOS_DOSBase 20;
+function CurrentDir(lock: longint): longint; syscall AOS_DOSBase 21;
+function IoErr: longint; syscall AOS_DOSBase 22;
+procedure dosExit(ErrCode: longint); syscall AOS_DOSBase 24;
+function SetProtection(const name: PChar; protect: longword): LongInt; syscall AOS_DOSBase 31;
+function DateStamp(date: PDateStamp): PDateStamp; syscall AOS_DOSBase 32;
+procedure Delay(ticks: LongWord); syscall AOS_DOSBase 33;
+function AllocDosObject(Type_: LongWord; const Tags: PTagItem): Pointer; syscall AOS_DOSBase 38;
+procedure FreeDosObject(Type_: LongWord; Ptr: Pointer); syscall AOS_DOSBase 39;
+function SetFileDate(name: PChar; date: PDateStamp): LongBool; syscall AOS_DOSBase 66;
+function NameFromLock(lock: longint; buffer: PChar; len: longint): LongBool; syscall AOS_DOSBase 67;
+function SetFileSize(fh: longint; pos: longint; mode: longint): longint; syscall AOS_DOSBase 76;
+function Cli : pCommandLineInterface; syscall AOS_DOSBase 82;
+function CreateNewProc(const Tags: PTagItem): PProcess; syscall AOS_DOSBase 83;
+function GetArgStr: PChar; syscall AOS_DOSBase 89;
+function GetCurrentDirName(buf: PChar; len: longint): LongBool; syscall AOS_DOSBase 94;
+function GetProgramName(buf: PChar; len: longint): LongBool; syscall AOS_DOSBase 96;
+function GetProgramDir: longint; syscall AOS_DOSBase 100;
+function SystemTagList(command: PChar; tags: PTagItem): longint; syscall AOS_DOSBase 101;
+function LockDosList(flags: longword): PDosList; syscall AOS_DOSBase 109;
+procedure UnLockDosList(flags: longword); syscall AOS_DOSBase 110;
+function NextDosEntry(dlist: PDosList; flags: longword): PDosList; syscall AOS_DOSBase 115;
+function MatchFirst(pat: PChar; anchor: PAnchorPath): longint; syscall AOS_DOSBase 137;
+function MatchNext(anchor: PAnchorPath): longint; syscall AOS_DOSBase 138;
+procedure MatchEnd(anchor: PAnchorPath); syscall AOS_DOSBase 139;
+function GetVar(name: PChar; buffer: PChar; size: longint; flags: longword): longint; syscall AOS_DOSBase 151;
+function ExamineFH(Fh: BPTR; Fib: PFileInfoBlock): LongBool; syscall AOS_DOSBase 65;
+function NameFromFH(Fh: BPTR; Buffer: PChar; Length: LongInt): LongBool; syscall AOS_DOSBase 68;
+
diff --git a/rtl/aros/i386/execd.inc b/rtl/aros/i386/execd.inc
new file mode 100644
index 0000000000..c7a00ee80b
--- /dev/null
+++ b/rtl/aros/i386/execd.inc
@@ -0,0 +1,1792 @@
+{
+ This file is part of the Free Pascal run time library.
+
+ exec definitions (V50) for MorphOS/PowerPC
+ Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
+
+ Free Pascal conversion
+ Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
+
+ AROS conversion
+ Copyright (c) 2011 Marcus Sackrow
+
+ 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.
+
+ **********************************************************************}
+
+{include emuld.inc}
+{$include utild1.inc}
+
+
+{ * exec node definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PNode = ^TNode;
+ TNode = record
+ ln_Succ: PNode;
+ ln_Pred: PNode;
+{$ifdef AROS_BINCOMPAT}
+ ln_Type: Byte;
+ ln_Pri : ShortInt;
+ ln_Name: PChar;
+{$else}
+ ln_Name: PChar;
+ ln_Type: Byte;
+ ln_Pri : ShortInt;
+{$endif}
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PMinNode = ^TMinNode;
+ TMinNode = record
+ mln_Succ: PMinNode;
+ mln_Pred: PMinNode;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ NT_UNKNOWN = 0;
+ NT_TASK = 1;
+ NT_INTERRUPT = 2;
+ NT_DEVICE = 3;
+ NT_MSGPORT = 4;
+ NT_MESSAGE = 5;
+ NT_FREEMSG = 6;
+ NT_REPLYMSG = 7;
+ NT_RESOURCE = 8;
+ NT_LIBRARY = 9;
+ NT_MEMORY = 10;
+ NT_SOFTINT = 11;
+ NT_FONT = 12;
+ NT_PROCESS = 13;
+ NT_SEMAPHORE = 14;
+ NT_SIGNALSEM = 15;
+ NT_BOOTNODE = 16;
+ NT_KICKMEM = 17;
+ NT_GRAPHICS = 18;
+ NT_DEATHMESSAGE = 19;
+ NT_HIDD = 20; // AROS specific
+ NT_USER = 254;
+ NT_EXTENDED = 255;
+
+
+
+{ * exec list definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PList = ^TEList;
+ TEList = record
+ lh_Head : PNode;
+ lh_Tail : PNode;
+ lh_TailPred: PNode;
+ lh_Type : Byte;
+ lh_pad : Byte;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PMinList = ^TMinList;
+ TMinList = record
+ mlh_Head : PMinNode;
+ mlh_Tail : PMinNode;
+ mlh_TailPred: PMinNode;
+ end;
+
+
+
+{ * exec alert definitions (V50)
+ *********************************************************************
+ * }
+
+
+const // Checked OK 04.08.2011 ALB
+// General Types
+ AT_DeadEnd = $80000000; // Alert that crashes
+ AT_Recovery = $00000000; // Alert that returns
+// General Errors
+ AG_NoMemory = $00010000;
+ AG_MakeLib = $00020000;
+ AG_OpenLib = $00030000;
+ AG_OpenDev = $00040000;
+ AG_OpenRes = $00050000;
+ AG_IOError = $00060000;
+ AG_NoSignal = $00070000;
+ AG_BadParm = $00080000;
+ AG_CloseLib = $00090000;
+ AG_CloseDev = $000A0000;
+ AG_ProcCreate = $000B0000;
+// 680x0 Errors
+ ACPU_BusErr = $80000002;
+ ACPU_AddressErr = $80000003;
+ ACPU_InstErr = $80000004;
+ ACPU_DivZero = $80000005;
+ ACPU_CHK = $80000006;
+ ACPU_TRAPV = $80000007;
+ ACPU_PrivErr = $80000008;
+ ACPU_Trace = $80000009;
+ ACPU_LineA = $8000000A;
+ ACPU_LineF = $8000000B;
+ ACPU_Format = $8000000E;
+ ACPU_Spurious = $80000018;
+ ACPU_AutoVec1 = $80000019;
+ ACPU_AutoVec2 = $8000001A;
+ ACPU_AutoVec3 = $8000001B;
+ ACPU_AutoVec4 = $8000001C;
+ ACPU_AutoVec5 = $8000001D;
+ ACPU_AutoVec6 = $8000001E;
+ ACPU_AutoVec7 = $8000001F;
+// Libraries
+ AO_ExecLib = $00008001;
+ AO_GraphicsLib = $00008002;
+ AO_LayersLib = $00008003;
+ AO_Intuition = $00008004;
+ AO_MathLib = $00008005;
+ AO_DOSLib = $00008007;
+ AO_RAMLib = $00008008;
+ AO_IconLib = $00008009;
+ AO_ExpansionLib = $0000800A;
+ AO_DiskfontLib = $0000800B;
+ AO_UtilityLib = $0000800C;
+ AO_KeyMapLib = $0000800D;
+// Devices
+ AO_AudioDev = $00008010;
+ AO_ConsoleDev = $00008011;
+ AO_GamePortDev = $00008012;
+ AO_KeyboardDev = $00008013;
+ AO_TrackDiskDev = $00008014;
+ AO_TimerDev = $00008015;
+// Resources
+ AO_CIARsrc = $00008020;
+ AO_DiskRsrc = $00008021;
+ AO_MiscRsrc = $00008022;
+// Miscellaneous
+ AO_BootStrap = $00008030;
+ AO_Workbench = $00008031;
+ AO_DiskCopy = $00008032;
+ AO_GadTools = $00008033;
+ AO_Unknown = $00008035;
+// AROS Additions, start at 0x40
+ AO_ArosLib = $00008040;
+ AO_OOPLib = $00008041;
+ AO_HiddLib = $00008042;
+
+ { *
+ * exec.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_ExecLib = $01000000;
+ AN_ExcptVect = $01000001;
+ AN_BaseChkSum = $01000002;
+ AN_LibChkSum = $01000003;
+ AN_MemCorrupt = $81000005;
+ AN_IntrMem = $81000006;
+ AN_InitAPtr = $01000007;
+ AN_SemCorrupt = $01000008;
+ AN_FreeTwice = $01000009;
+ AN_BogusExcpt = $8100000A;
+ AN_IOUsedTwice = $0100000B;
+ AN_MemoryInsane = $0100000C;
+ AN_IOAfterClose = $0100000D;
+ AN_StackProbe = $0100000E; // stack has wrong size
+ AN_BadFreeAddr = $0100000F;
+ AN_BadSemaphore = $01000010;
+
+ { *
+ * graphics.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_GraphicsLib = $02000000;
+ AN_GfxNoMem = $82010000;
+ AN_GfxNoMemMspc = $82010001;
+ AN_LongFrame = $82010006;
+ AN_ShortFrame = $82010007;
+ AN_TextTmpRas = $02010009;
+ AN_BltBitMap = $8201000A;
+ AN_RegionMemory = $8201000B;
+ AN_MakeVPort = $82010030;
+ AN_GfxNewError = $0200000C;
+ AN_GfxFreeError = $0200000D;
+ AN_GfxNoLCM = $82011234;
+ AN_ObsoleteFont = $02000401;
+
+ { *
+ * layers.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_LayersLib = $03000000;
+ AN_LayersNoMem = $83010000;
+
+ { *
+ * intuition.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_Intuition = $04000000;
+ AN_GadgetType = $84000001;
+ AN_BadGadget = $04000001;
+ AN_CreatePort = $84010002;
+ AN_ItemAlloc = $04010003;
+ AN_SubAlloc = $04010004;
+ AN_PlaneAlloc = $84010005;
+ AN_ItemBoxTop = $84000006;
+ AN_OpenScreen = $84010007;
+ AN_OpenScrnRast = $84010008;
+ AN_SysScrnType = $84000009;
+ AN_AddSWGadget = $8401000A;
+ AN_OpenWindow = $8401000B;
+ AN_BadState = $8400000C;
+ AN_BadMessage = $8400000D;
+ AN_WeirdEcho = $8400000E;
+ AN_NoConsole = $8400000F;
+ AN_NoISem = $04000010;
+ AN_ISemOrder = $04000011;
+
+ { *
+ * math.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_MathLib = $05000000;
+
+ { *
+ * dos.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_DOSLib = $07000000;
+ AN_StartMem = $07010001;
+ AN_EndTask = $07000002;
+ AN_QPktFail = $07000003;
+ AN_AsyncPkt = $07000004;
+ AN_FreeVec = $07000005;
+ AN_DiskBlkSeq = $07000006;
+ AN_BitMap = $07000007;
+ AN_KeyFree = $07000008;
+ AN_BadChkSum = $07000009;
+ AN_DiskError = $0700000A;
+ AN_KeyRange = $0700000B;
+ AN_BadOverlay = $0700000C;
+ AN_BadInitFunc = $0700000D;
+ AN_FileReclosed = $0700000E;
+
+ { *
+ * ramlib.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_RAMLib = $08000000;
+ AN_BadSegList = $08000001;
+
+ { *
+ * icon.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_IconLib = $09000000;
+
+ { *
+ * expansion.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_ExpansionLib = $0A000000;
+ AN_BadExpansionFree = $0A000001;
+
+ { *
+ * diskfont.library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_DiskfontLib = $0B000000;
+
+ { *
+ * audio.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_AudioDev = $10000000;
+
+ { *
+ * console.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_ConsoleDev = $11000000;
+ AN_NoWindow = $11000001;
+
+ { *
+ * gameport.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_GamePortDev = $12000000;
+
+ { *
+ * keyboard.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_KeyboardDev = $13000000;
+
+ { *
+ * trackdisk.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_TrackDiskDev = $14000000;
+ AN_TDCalibSeek = $14000001;
+ AN_TDDelay = $14000002;
+
+ { *
+ * timer.device
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_TimerDev = $15000000;
+ AN_TMBadReq = $15000001;
+ AN_TMBadSupply = $15000002;
+
+ { *
+ * cia.resource
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_CIARsrc = $20000000;
+
+ { *
+ * disk.resource
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_DiskRsrc = $21000000;
+ AN_DRHasDisk = $21000001;
+ AN_DRIntNoAct = $21000002;
+
+ { *
+ * misc.resource
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_MiscRsrc = $22000000;
+
+ { *
+ * bootstrap
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_BootStrap = $30000000;
+ AN_BootError = $30000001;
+
+ { *
+ * Workbench
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_Workbench = $31000000;
+ AN_NoFonts = $B1000001;
+ AN_WBBadStartupMsg1 = $31000001;
+ AN_WBBadStartupMsg2 = $31000002;
+ AN_WBBadIOMsg = $31000003;
+ AN_WBReLayoutToolMenu = $B1010009;
+
+ { *
+ * DiskCopy
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_DiskCopy = $32000000;
+
+ { *
+ * toolkit for Intuition
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_GadTools = $33000000;
+
+ { *
+ * System utility library
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_UtilityLib = $34000000;
+
+ { *
+ * AROS Additions
+ * }
+ AN_Aros = $40000000;
+ AN_OOP = $41000000;
+// Hidd Subsystem */
+ AN_Hidd = $42000000;
+ AN_HiddNoRoot = $C2000001; // Could not create root device
+
+ { *
+ * For use by any application that needs it
+ * }
+const // Checked OK 04.08.2011 ALB
+ AN_Unknown = $35000000;
+
+
+
+{ * exec error definitions
+ *********************************************************************
+ * }
+
+
+const // Checked OK 04.08.2011 ALB
+ IOERR_OPENFAIL = (-1);
+ IOERR_ABORTED = (-2);
+ IOERR_NOCMD = (-3);
+ IOERR_BADLENGTH = (-4);
+ IOERR_BADADDRESS = (-5);
+ IOERR_UNITBUSY = (-6);
+ IOERR_SELFTEST = (-7);
+
+
+
+{ * exec resident definitions
+ *********************************************************************
+ * }
+
+
+type
+ PResident = ^TResident;
+ TResident = record
+ rt_MatchWord: Word;
+ rt_MatchTag : PResident;
+ rt_EndSkip : Pointer;
+ rt_Flags : Byte;
+ rt_Version : Byte;
+ rt_Type : Byte;
+ rt_Pri : Byte;
+ rt_Name : PChar;
+ rt_IdString : PChar;
+ rt_Init : Pointer;
+ { * Only valid when RTF_EXTENDED is set
+ * }
+ rt_Revision : Word; { * Revision Entry * }
+ rt_Tags : Pointer;
+ end;
+
+
+const
+ RTC_MATCHWORD = $4AFC;
+
+ RTF_AUTOINIT = (1 Shl 7);
+ RTF_EXTENDED = (1 Shl 6); { * structure extension is valid * }
+ { * rt_Init points to a PPC function which must be defined as
+ *
+ * struct Library* LIB_Init(struct Library *MyLibBase,
+ * BPTR SegList,
+ * struct ExecBase *SysBase)
+ * }
+ RTF_PPC = (1 Shl 3);
+ RTF_AFTERDOS = (1 Shl 2);
+ RTF_SINGLETASK = (1 Shl 1);
+ RTF_COLDSTART = (1 Shl 0);
+
+ RTW_NEVER = 0;
+ RTW_COLDSTART = 1;
+
+
+
+{ * exec memory definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PMemChunk = ^TMemChunk;
+ TMemChunk = record
+ nc_Next : PMemChunk;
+ nc_Bytes: PtrUInt;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PMemHeader = ^TMemHeader;
+ TMemHeader = record
+ mh_Node : TNode;
+ mh_Attributes: Word;
+ mh_First : PMemChunk;
+ mh_Lower : Pointer;
+ mh_Upper : Pointer;
+ mh_Free : DWord;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PMemEntry = ^TMemEntry;
+ TMemEntry = record
+ me_Un: record
+ case Byte of
+ 0 : (meu_Regs: DWord);
+ 1 : (meu_Addr: Pointer)
+ end;
+ me_Length: DWord;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PMemList = ^TMemList;
+ TMemList = record
+ ml_Node : TNode;
+ ml_NumEntries: Word;
+ ml_ME : PMemEntry;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ MEMF_ANY = 0;
+ MEMF_PUBLIC = (1 shl 0);
+ MEMF_CHIP = (1 shl 1);
+ MEMF_FAST = (1 shl 2);
+ MEMF_LOCAL = (1 shl 8);
+ MEMF_24BITDMA = (1 shl 9);
+ MEMF_KICK = (1 shl 10);
+ MEMF_SWAP = (1 shl 11); { * Memory that can be swapped out to disk * }
+ MEMF_31BIT = (1 shl 12);
+
+ MEMF_CLEAR = (1 Shl 16);
+ MEMF_LARGEST = (1 Shl 17);
+ MEMF_REVERSE = (1 Shl 18);
+ MEMF_TOTAL = (1 Shl 19);
+ MEMF_HWALIGNED = (1 Shl 20); // For AllocMem() - align address and size to physical page boundary
+ MEMF_SEM_PROTECTED = (1 Shl 20); { * For CreatePool(): semaphore protection * }
+ MEMF_NO_EXPUNGE = (1 Shl 31);
+
+ MEM_BLOCKSIZE = 8;
+ MEM_BLOCKMASK = (MEM_BLOCKSIZE - 1);
+
+
+type // Checked OK 05.08.2011 ALB
+ PMemHandlerData = ^TMemHandlerData;
+ TMemHandlerData = record
+ memh_RequestSize : DWord;
+ memh_RequestFlags: DWord;
+ memh_Flags : DWord;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ MEMHF_RECYCLE = (1 shl 0);
+
+ MEM_DID_NOTHING = 0;
+ MEM_ALL_DONE = -1;
+ MEM_TRY_AGAIN = 1;
+
+
+
+{ * exec port definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PMsgPort = ^TMsgPort;
+ TMsgPort = record
+ mp_Node : TNode;
+ mp_Flags : Byte;
+ mp_SigBit : Byte;
+ mp_SigTask: Pointer;
+ mp_MsgList: TEList;
+ end;
+
+
+const
+ PF_ACTION = 3;
+ PA_SIGNAL = 0;
+ PA_SOFTINT = 1;
+ PA_IGNORE = 2;
+
+
+type
+ PMessage = ^TMessage;
+ TMessage = record
+ mn_Node : TNode;
+ mn_ReplyPort: PMsgPort;
+ mn_Length : Word;
+ end;
+
+
+
+{ * exec task definitions (V50)
+ *********************************************************************
+ * }
+
+
+type
+ PTask = ^TTask;
+ TTask = record
+ tc_Node : TNode;
+ tc_Flags : Byte;
+ tc_State : Byte;
+ tc_IDNestCnt: ShortInt;
+ tc_TDNestCnt: ShortInt;
+ tc_SigAlloc : DWord;
+ tc_SigWait : DWord;
+ tc_SigRecvd : DWord;
+ tc_SigExcept: DWord;
+ {$IF 0}
+ tc_TrapAlloc: Word;
+ tc_TrapAble : Word;
+ {$ELSE}
+ tc_ETask: Pointer;
+ {$ENDIF}
+ tc_ExceptData: Pointer;
+ tc_ExceptCode: Pointer;
+ tc_TrapData : Pointer;
+ tc_TrapCode : Pointer;
+ tc_SPReg : Pointer;
+ tc_SPLower : Pointer;
+ tc_SPUpper : Pointer;
+ tc_Switch : Pointer; { *** OBSOLETE *** }
+ tc_Launch : Pointer; { *** OBSOLETE *** }
+ tc_MemEntry : TEList;
+ tc_UserData : Pointer;
+ end;
+
+
+const
+ TB_PROCTIME = 0;
+ TB_ETASK = 3;
+ TB_STACKCHK = 4;
+ TB_EXCEPT = 5;
+ TB_SWITCH = 6;
+ TB_LAUNCH = 7;
+
+ TF_PROCTIME = (1 Shl TB_PROCTIME);
+ TF_ETASK = (1 Shl TB_ETASK);
+ TF_STACKCHK = (1 Shl TB_STACKCHK);
+ TF_EXCEPT = (1 Shl TB_EXCEPT);
+ TF_SWITCH = (1 Shl TB_SWITCH);
+ TF_LAUNCH = (1 Shl TB_LAUNCH);
+
+ TS_INVALID = 0;
+ TS_ADDED = 1;
+ TS_RUN = 2;
+ TS_READY = 3;
+ TS_WAIT = 4;
+ TS_EXCEPT = 5;
+ TS_REMOVED = 6;
+
+ SIGB_ABORT = 0;
+ SIGB_CHILD = 1;
+ SIGB_BLIT = 4;
+ SIGB_SINGLE = 4;
+ SIGB_INTUITION = 5;
+ SIGB_NET = 7;
+ SIGB_DOS = 8;
+
+ SIGF_ABORT = (1 Shl SIGB_ABORT);
+ SIGF_CHILD = (1 Shl SIGB_CHILD);
+ SIGF_BLIT = (1 Shl SIGB_BLIT);
+ SIGF_SINGLE = (1 Shl SIGB_SINGLE);
+ SIGF_INTUITION = (1 Shl SIGB_INTUITION);
+ SIGF_NET = (1 Shl SIGB_NET);
+ SIGF_DOS = (1 Shl SIGB_DOS);
+
+
+type
+ PTaskTrapMessage = ^TTaskTrapMessage;
+ TTaskTrapMessage = record
+ Message: TMessage; { * Message Header * }
+ Task : TTask; { * connected Task * }
+ Version: DWord; { * version of the structure * }
+ TType : DWord; { * Exception Type * }
+ DAR : DWord; { * Exception Address Register * }
+ DSISR : DWord; { * Exception DSISR Reg * }
+
+ { * This is undiscovered land...
+ * never assume a size of this structure
+ * }
+ end;
+
+
+const
+ VERSION_TASKTRAPMESSAGE = $0;
+
+
+type
+ PETask = ^TETask;
+ TETask = record
+ Message : TMessage;
+ Parent : PTask;
+ UniqueID : DWord;
+ Children : TMinList;
+ TrapAlloc: Word;
+ TrapAble : Word;
+ Result1 : DWord;
+ Result2 : Pointer;
+ MsgPort : TMsgPort;
+
+ { * Don't touch!!!!!!!!!..there'll be an interface
+ * sooner than later.
+ * New Entries...most of the above entries
+ * are only their for structure compatability.
+ * They have no meaning as the OS never supported
+ * them.
+ * }
+
+ { * A Task Pool for the task.
+ * }
+ MemPool: Pointer;
+
+ { * PPC's Stack Lower Ptr
+ * The initial stack is allocated through
+ * AllocVec, so a FreeVec(ETask^.PPCSPLower);
+ * would work.
+ * If you use PPCStackSwap you must allocate
+ * your stack block with AllocVec();
+ * }
+ PPCSPLower: Pointer;
+
+ { * PPC's Stack Upper Ptr
+ * }
+ PPCSPUpper : Pointer;
+ PPCRegFrame: Pointer;
+ PPCLibData : Pointer;
+
+ { * On a PPC exception this msgport
+ * is sent an exception msg...
+ * the task is stopped until somebody
+ * wakes it up again.
+ * (asynchron exception interface)
+ * If this Port is NULL the message is
+ * sent to SysBase->ex_PPCTrapMsgPort.
+ * }
+ PPCTrapMsgPort: PMsgPort;
+ PPCTrapMessage: PTaskTrapMessage;
+
+ { * This is undiscovered land...
+ * never assume a size of this structure
+ * }
+ end;
+
+
+type
+ PTaskInitExtension = ^TTaskInitExtension;
+ TTaskInitExtension = record
+ { * Must be filled with TRAP_PPCTASK
+ * }
+ Trap : Word;
+ Extension: Word; { * Must be set to 0 * }
+ Tags : Pointer;
+ end;
+
+
+const
+ TASKTAG_DUMMY = (TAG_USER + $100000);
+
+ { * Ptr to an ULONG Errorfield where a better error description
+ * can be stored.
+ * }
+ TASKTAG_ERROR = (TASKTAG_DUMMY + $0);
+
+ { * Code type
+ * can be stored.
+ * }
+ TASKTAG_CODETYPE = (TASKTAG_DUMMY + $1);
+
+ { * Start PC
+ * code must be of TASKTAG_CODETYPE
+ * }
+ TASKTAG_PC = (TASKTAG_DUMMY + $2);
+
+ { * Final PC
+ * code must be of TASKTAG_CODETYPE
+ * }
+ TASKTAG_FINALPC = (TASKTAG_DUMMY + $3);
+
+ { * Stacksize...Default 8192
+ * }
+ TASKTAG_STACKSIZE = (TASKTAG_DUMMY + $4);
+
+ { * Std Stacksize...
+ * Default(use the stack defined by tc_SPLower..tc_SPUpper)
+ * }
+ TASKTAG_STACKSIZE_M68K = (TASKTAG_DUMMY + $5);
+
+ { * specify task name, name is copied
+ * }
+ TASKTAG_NAME = (TASKTAG_DUMMY + $6);
+
+ { * tc_UserData
+ * }
+ TASKTAG_USERDATA = (TASKTAG_DUMMY + $7);
+
+ { * Task priority
+ * }
+ TASKTAG_PRI = (TASKTAG_DUMMY + $8);
+
+ { * Pool's Puddlesize
+ * }
+ TASKTAG_POOLPUDDLE = (TASKTAG_DUMMY + $9);
+
+ { * Pool's ThreshSize
+ * }
+ TASKTAG_POOLTHRESH = (TASKTAG_DUMMY + $a);
+
+ { * PPC First Argument..gpr3
+ * }
+ TASKTAG_PPC_ARG1 = (TASKTAG_DUMMY + $10);
+
+ { * PPC First Argument..gpr4
+ * }
+ TASKTAG_PPC_ARG2 = (TASKTAG_DUMMY + $11);
+
+ { * PPC First Argument..gpr5
+ * }
+ TASKTAG_PPC_ARG3 = (TASKTAG_DUMMY + $12);
+
+ { * PPC First Argument..gpr6
+ * }
+ TASKTAG_PPC_ARG4 = (TASKTAG_DUMMY + $13);
+
+ { * PPC First Argument..gpr7
+ * }
+ TASKTAG_PPC_ARG5 = (TASKTAG_DUMMY + $14);
+
+ { * PPC First Argument..gpr8
+ * }
+ TASKTAG_PPC_ARG6 = (TASKTAG_DUMMY + $15);
+
+ { * PPC First Argument..gpr9
+ * }
+ TASKTAG_PPC_ARG7 = (TASKTAG_DUMMY + $16);
+
+ { * PPC First Argument..gpr10
+ * }
+ TASKTAG_PPC_ARG8 = (TASKTAG_DUMMY + $17);
+
+ { *
+ * Startup message to be passed to task/process, ReplyMsg'd at RemTask()
+ * ti_Data: struct Message *
+ * }
+ TASKTAG_STARTUPMSG = (TASKTAG_DUMMY + $18);
+
+ { *
+ * Create internal MsgPort for task/process, deleted at RemTask()
+ * ti_Data: struct MsgPort **, can be NULL
+ * }
+ TASKTAG_TASKMSGPORT = (TASKTAG_DUMMY + $19);
+
+
+const
+ CODETYPE_M68K = $0;
+ { *
+ * System V4 ABI
+ * }
+ CODETYPE_PPC = $1;
+
+const
+ TASKERROR_OK = 0;
+ TASKERROR_NOMEMORY = 1;
+
+
+ { *
+ * Stack swap structure as passed to StackSwap() and PPCStackSwap()
+ * }
+type
+ PStackSwapStruct = ^TStackSwapStruct;
+ TStackSwapStruct = record
+ stk_Lower : Pointer; { * Lowest byte of stack * }
+ stk_Upper : Pointer; { * Upper end of stack (size + Lowert) * }
+ stk_Pointer: Pointer; { * Stack pointer at switch point * }
+ end;
+
+type
+ PPPCStackSwapArgs = ^TPPCStackSwapArgs;
+ TPPCStackSwapArgs = record
+ Args: Array[0..7] Of DWord; { * The C register arguments from gpr3..gpr11 * }
+ end;
+
+
+ { *
+ * NewGetTaskAttrsA(), NewSetTaskAttrsA() tags
+ * }
+const
+ TASKINFOTYPE_ALLTASK = $0;
+ TASKINFOTYPE_NAME = $1;
+ TASKINFOTYPE_PRI = $2;
+ TASKINFOTYPE_TYPE = $3;
+ TASKINFOTYPE_STATE = $4;
+ TASKINFOTYPE_FLAGS = $5;
+ TASKINFOTYPE_SIGALLOC = $6;
+ TASKINFOTYPE_SIGWAIT = $7;
+ TASKINFOTYPE_SIGRECVD = $8;
+ TASKINFOTYPE_SIGEXCEPT = $9;
+ TASKINFOTYPE_EXCEPTDATA = $a;
+ TASKINFOTYPE_EXCEPTCODE = $b;
+ TASKINFOTYPE_TRAPDATA = $c;
+ TASKINFOTYPE_TRAPCODE = $d;
+ TASKINFOTYPE_STACKSIZE_M68K = $e;
+ TASKINFOTYPE_STACKSIZE = $f;
+ TASKINFOTYPE_USEDSTACKSIZE_M68K = $10;
+ TASKINFOTYPE_USEDSTACKSIZE = $11;
+ TASKINFOTYPE_TRAPMSGPORT = $12;
+ TASKINFOTYPE_STARTUPMSG = $13;
+ TASKINFOTYPE_TASKMSGPORT = $14;
+ TASKINFOTYPE_POOLPTR = $15;
+ TASKINFOTYPE_POOLMEMFLAGS = $16;
+ TASKINFOTYPE_POOLPUDDLESIZE = $17;
+ TASKINFOTYPE_POOLTHRESHSIZE = $18;
+
+ { *
+ * Task Scheduler statistics (exec 50.42)
+ * }
+ TASKINFOTYPE_NICE = $19;
+ TASKINFOTYPE_AGETICKS = $1a;
+ TASKINFOTYPE_CPUTIME = $1b;
+ TASKINFOTYPE_LASTSECCPUTIME = $1c;
+ TASKINFOTYPE_RECENTCPUTIME = $1d;
+ TASKINFOTYPE_VOLUNTARYCSW = $1e;
+ TASKINFOTYPE_INVOLUNTARYCSW = $1f;
+ TASKINFOTYPE_LASTSECVOLUNTARYCSW = $20;
+ TASKINFOTYPE_LASTSECINVOLUNTARYCSW = $21;
+ { * Added in exec 50.45 * }
+ TASKINFOTYPE_LAUNCHTIMETICKS = $22;
+ TASKINFOTYPE_LAUNCHTIMETICKS1978 = $23;
+ TASKINFOTYPE_PID = $24;
+
+ TASKINFOTYPE_68K_NEWFRAME = $50;
+
+ TASKINFOTYPE_PPC_SRR0 = $100;
+ TASKINFOTYPE_PPC_SRR1 = $101;
+ TASKINFOTYPE_PPC_LR = $102;
+ TASKINFOTYPE_PPC_CTR = $103;
+ TASKINFOTYPE_PPC_CR = $104;
+ TASKINFOTYPE_PPC_XER = $105;
+ TASKINFOTYPE_PPC_GPR = $106;
+ TASKINFOTYPE_PPC_FPR = $107;
+ TASKINFOTYPE_PPC_FPSCR = $108;
+ TASKINFOTYPE_PPC_VSCR = $109;
+ TASKINFOTYPE_PPC_VMX = $10a;
+ TASKINFOTYPE_PPC_VSAVE = $10b;
+ TASKINFOTYPE_PPC_FRAME = $10c;
+ TASKINFOTYPE_PPC_FRAMESIZE = $10d;
+ TASKINFOTYPE_PPC_NEWFRAME = $10e;
+
+ TASKINFOTAG_DUMMY = (TAG_USER + $110000);
+ { * Used with TASKINFOTYPE_ALLTASK
+ * }
+ TASKINFOTAG_HOOK = (TASKINFOTAG_DUMMY + $0);
+ { * Used with TASKINFOTYPE_PPC_GPR,TASKINFOTYPE_PPC_FPR,TASKINFOTYPE_PPC_VMX
+ * to define the copy area
+ * }
+ TASKINFOTAG_REGSTART = (TASKINFOTAG_DUMMY + $1);
+ { * Used with TASKINFOTYPE_PPC_GPR,TASKINFOTYPE_PPC_FPR,TASKINFOTYPE_PPC_VMX
+ * to define the copy area
+ * }
+ TASKINFOTAG_REGCOUNT = (TASKINFOTAG_DUMMY + $2);
+
+
+ { *
+ * NewSetTaskAttrsA(..,@TaskFrame68k,sizeof(TTaskFrame68k),TASKINFOTYPE_68K_NEWFRAME,...);
+ * }
+type
+ PTaskFrame68k = ^TTaskFrame68k;
+ TTaskFrame68k = record
+ PC: Pointer;
+ SR: Word;
+ Xn: Array[0..14] Of LongInt;
+ end;
+
+
+ { *
+ * Don't depend on these
+ * }
+const
+ DEFAULT_PPCSTACKSIZE = 32768;
+ DEFAULT_M68KSTACKSIZE = 2048;
+ DEFAULT_TASKPUDDLESIZE = 4096;
+ DEFAULT_TASKTHRESHSIZE = 4096;
+
+
+{ * exec interrupt definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PInterrupt = ^TInterrupt;
+ TInterrupt = record
+ is_Node: TNode;
+ is_Data: Pointer;
+ is_Code: Pointer; // server code entry
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PIntVector = ^TIntVector;
+ TIntVector = record
+ iv_Data: Pointer;
+ iv_Code: Pointer;
+ iv_Node: PNode;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PSoftIntList = ^TSoftIntList;
+ TSoftIntList = record
+ sh_List: TEList;
+ sh_Pad : Word;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ SIH_PRIMASK = $f0;
+
+ INTB_NMI = 15;
+ INTF_NMI = (1 Shl INTB_NMI);
+
+
+
+{ * exec semaphore definitions (V50)
+ *********************************************************************
+ * }
+
+
+ { *
+ * Shouldn't be available public..
+ * }
+type
+ PSemaphoreRequest = ^TSemaphoreRequest;
+ TSemaphoreRequest = record
+ sr_Link : TMinNode;
+ sr_Waiter: PTask;
+ end;
+
+type
+ PSignalSemaphore = ^TSignalSemaphore;
+ TSignalSemaphore = record
+ ss_Link : TNode;
+ ss_NestCount : SmallInt;
+ ss_WaitQueue : TMinList;
+ ss_MultipleLink: TSemaphoreRequest;
+ ss_Owner : PTask;
+ ss_QueueCount : SmallInt;
+ end;
+
+type
+ PSemaphoreMessage = ^TSemaphoreMessage;
+ TSemaphoreMessage = record
+ ssm_Message : TMessage;
+ ssm_Semaphore: PSignalSemaphore;
+ end;
+
+
+const
+ SM_SHARED = 1;
+ SM_EXCLUSIVE = 0;
+
+
+
+{ * exec machine definitions (V50)
+ *********************************************************************
+ * }
+
+
+const
+ MACHINE_M68k = $0;
+ MACHINE_PPC = $1;
+ MACHINE_NO = $ffffffff;
+
+
+
+{ * exec library definitions
+ *********************************************************************
+ * }
+
+
+const // Checked OK 05.08.2011 ALB
+ LIB_VECTSIZE = 6;
+ LIB_RESERVED = 4;
+ LIB_BASE = (-LIB_VECTSIZE);
+ LIB_USERDEF = (LIB_BASE - (LIB_RESERVED * LIB_VECTSIZE));
+ LIB_NONSTD = (LIB_USERDEF);
+
+ LIB_OPEN = (LIB_BASE * 1);
+ LIB_CLOSE = (LIB_BASE * 2);
+ LIB_EXPUNGE = (LIB_BASE * 3);
+ LIB_EXTFUNC = (LIB_BASE * 4);
+
+
+type // Checked OK 05.08.2011 ALB
+ PLibrary = ^TLibrary;
+ TLibrary = record
+ lib_Node : TNode;
+ lib_Flags : Byte;
+ lib_pad : Byte;
+ lib_NegSize : Word;
+ lib_PosSize : Word;
+ lib_Version : Word;
+ lib_Revision: Word;
+ lib_IdString: PChar;
+ lib_Sum : DWord;
+ lib_OpenCnt : Word;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ LIBF_SUMMING = (1 shl 0);
+ LIBF_CHANGED = (1 shl 1);
+ LIBF_SUMUSED = (1 shl 2);
+ LIBF_DELEXP = (1 shl 3);
+
+const // Checked OK 05.08.2011 ALB
+ {* ID numbers for Exec/TaggedOpenLibrary
+ *}
+ TAGGEDOPEN_GRAPHICS = 1;
+ TAGGEDOPEN_LAYERS = 2;
+ TAGGEDOPEN_INTUITION = 3;
+ TAGGEDOPEN_DOS = 4;
+ TAGGEDOPEN_ICON = 5;
+ TAGGEDOPEN_EXPANSION = 6;
+ TAGGEDOPEN_UTILITY = 7;
+ TAGGEDOPEN_KEYMAP = 8;
+ TAGGEDOPEN_GADTOOLS = 9;
+ TAGGEDOPEN_WORKBENCH = 10;
+
+const
+ SETFUNCTAG_Dummy = (TAG_USER +$01000000);
+
+ { * Set the machine type of the function
+ * Default is 68k
+ * }
+ SETFUNCTAG_MACHINE = (SETFUNCTAG_Dummy + $1);
+
+ { * Function type specifier
+ * }
+ SETFUNCTAG_TYPE = (SETFUNCTAG_Dummy + $2);
+
+ { * ID String
+ * }
+ SETFUNCTAG_IDNAME = (SETFUNCTAG_Dummy + $3);
+
+ { *
+ * Set to TRUE if the replaced function will never be used
+ * again.
+ * }
+ SETFUNCTAG_DELETE = (SETFUNCTAG_Dummy + $4);
+
+
+ { * See emul/emulinterface.h for more informations
+ * }
+
+ { * Save Emulation PPC Registers
+ * Call Function
+ * Restore Emulation PPC Registers
+ * REG_D0 = Result
+ * }
+const
+ SETFUNCTYPE_NORMAL = 0;
+ { * Call Function
+ * Must use the global register settings of the emulation
+ * REG_D0 = Result
+ * }
+ SETFUNCTYPE_QUICK = 1;
+ { * Save Emulation PPC Registers
+ * Call Function
+ * Restore Emulation PPC Registers
+ * No Result
+ * Needed to replace functions like
+ * forbid,obtainsemaphores which are
+ * defined as trashing no registers
+ * }
+ SETFUNCTYPE_NORMALNR = 2;
+ { * Call Function
+ * Must use the global register settings of the emulation
+ * No Result
+ * Needed to replace functions like
+ * forbid,obtainsemaphores which are
+ * defined as trashing no registers
+ * }
+ SETFUNCTYPE_QUICKNR = 3;
+ SETFUNCTYPE_NORMALSR = 4;
+ SETFUNCTYPE_NORMALSRNR = 5;
+ SETFUNCTYPE_NORMALD0_D1 = 6;
+ SETFUNCTYPE_NORMALRESTORE = 7;
+ SETFUNCTYPE_SYSTEMV = 8;
+ SETFUNCTYPE_NORMALD0D1SR = 9;
+ SETFUNCTYPE_NORMALD0D1A0A1SR = 10;
+
+
+ { * CreateLibrary extensions
+ * }
+ LIBTAG_BASE = (TAG_USER + $01000100);
+
+ { *
+ * Function/Vector Array
+ * }
+ LIBTAG_FUNCTIONINIT = (LIBTAG_BASE+$0);
+ { *
+ * Struct Init
+ * }
+ LIBTAG_STRUCTINIT = (LIBTAG_BASE+$1);
+ { *
+ * Library Init
+ * }
+ LIBTAG_LIBRARYINIT = (LIBTAG_BASE+$2);
+ { *
+ * Init Code Type
+ * }
+ LIBTAG_MACHINE = (LIBTAG_BASE+$3);
+ { *
+ * Library Base Size
+ * }
+ LIBTAG_BASESIZE = (LIBTAG_BASE+$4);
+ { *
+ * SegList Ptr
+ * }
+ LIBTAG_SEGLIST = (LIBTAG_BASE+$5);
+ { *
+ * Library Priority
+ * }
+ LIBTAG_PRI = (LIBTAG_BASE+$6);
+ { *
+ * Library Type..Library,Device,Resource,whatever
+ * }
+ LIBTAG_TYPE = (LIBTAG_BASE+$7);
+ { *
+ * Library Version
+ * (UWORD)
+ * }
+ LIBTAG_VERSION = (LIBTAG_BASE+$8);
+ { *
+ * Library Flags
+ * }
+ LIBTAG_FLAGS = (LIBTAG_BASE+$9);
+ { *
+ * Library Name
+ * }
+ LIBTAG_NAME = (LIBTAG_BASE+$a);
+ { *
+ * Library IDString
+ * }
+ LIBTAG_IDSTRING = (LIBTAG_BASE+$b);
+ { *
+ * AddDevice(),AddLibrary(),AddResource()..
+ * depends on LibNode.ln_Type field which
+ * can be set by some Init function, Struct Scripts
+ * or LIBTAG_TYPE.
+ * If you set LIBTAG_PUBLIC the library
+ * is added to the right system list.
+ * }
+ LIBTAG_PUBLIC = (LIBTAG_BASE+$c);
+ { *
+ * Library Revision
+ * (UWORD)
+ * }
+ LIBTAG_REVISION = (LIBTAG_BASE+$d);
+ { *
+ * Library QueryInfo Flag
+ * (Boolean)
+ * }
+ LIBTAG_QUERYINFO = (LIBTAG_BASE+$e);
+
+
+ { * Private
+ * don`t touch...floating design
+ * }
+ {
+type
+ PFuncEntry = ^TFuncEntry;
+ TFuncEntry = record
+ EmulLibEntry : TEmulLibEntry;
+ OldFunction : Pointer; { * Needed for bookkeeping * }
+ end;
+
+ PFuncOldEntry = ^TFuncOldEntry;
+ TFuncOldEntry = record
+ Command : Word;
+ FuncEntry: PFuncEntry;
+ end;
+}
+
+ { *
+ * EmulLibEntry.Extension
+ * }
+const
+ FUNCENTRYEXTF_LIBRARY = $1; { * Entry created by the OS * }
+
+ { *
+ * Functionarray first ULONG ID defines the format
+ * of the functionarray for MakeFunctions()/MakeLibrary().
+ *
+ * If there`s not such id the functionarray is a
+ * 32Bit 68k function ptr array.
+ * (ULONG) $ffffffff stops it
+ * }
+
+ { * 68k 16bit relative functionarray ptrs
+ * (UWORD) $ffff stops it
+ * }
+
+ FUNCARRAY_16BIT_OLD = $ffffffff;
+
+ { * PPC 32bit functionarray ptrs
+ * (ULONG) $ffff stops it
+ * }
+ FUNCARRAY_32BIT_NATIVE = $fffefffe;
+
+ { * Starts a functionarray block.
+ * This way it`s possible to mix 68k and PPC
+ * function definitions.
+ * BASE:
+ * FUNCTIONARRAY_BEGIN
+ * FUNCARRAY_32BIT_NATIVE
+ * FUNC0
+ * FUNC1
+ * .
+ * FUNCn
+ * $ffffffff
+ * FUNCn+1 (No ID->32Bit 68k)
+ * FUNCn+2
+ * .
+ * FUNCm
+ * $ffffffff
+ * FUNCARRAY_16BIT_OLD
+ * FUNCm+1-BASE
+ * FUNCm+2-BASE
+ * .
+ * FUNCo-BASE
+ * $ffff
+ * FUNCTIONARRAY_END
+ * }
+
+ FUNCARRAY_BEGIN = $fffdfffd;
+
+ { * Ends a functionarray block.
+ * }
+ FUNCARRAY_END = $fffcfffc;
+
+ { * PPC 32bit Quick functionarray ptrs.
+ * These functions must comply to the emulation's
+ * register layout which is defined inside the
+ * emul/emulregs.h. That means the register layout
+ * MUST also be valid during interrupts/task switches.
+ * You can't just destroy A7(r31), SR or PC.
+ *
+ * You shouldn't use this for any normal code
+ * as there's no real reason to do so. If you
+ * really think you need to use it please ask
+ * us first on the dev mailinglist.
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_QUICK_NATIVE = $fffbfffb;
+
+ { * PPC 32bit QuickNR(No Result) functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_QUICKNR_NATIVE = $fffafffa;
+
+ { * PPC 32bit no result functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_NR_NATIVE = $fff9fff9;
+
+ { * PPC 32bit SR functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_SR_NATIVE = $fff8fff8;
+
+ { * PPC 32bit SR(no result) functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_SRNR_NATIVE = $fff7fff7;
+
+ { * PPC 32bit D0_D1 functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_D0D1_NATIVE = $fff6fff6;
+
+ { * PPC 32bit Restore1 functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_RESTORE_NATIVE = $fff5fff5;
+
+ { * PPC 32bit SystemV ABI entry
+ * these function entries DON'T comply
+ * to the amiga register modell REG_D0-A6
+ * but comply to the PPC SystemV ABI so
+ * you can directly use PPC C Argument
+ * parsing. That way you're also not limited
+ * with the register count.
+ * Such library functions can't be used
+ * by 68k emulation, so you can only use
+ * them for new code.
+ * As we allow these new functions to be
+ * used with old functions we keep the
+ * 6 bytes function entry steps in the library.
+ * Layout is
+ *
+ * CODE_JMP, &FuncEntry ; Old Entry
+ * CODE_ILLEGAL, Function ; SystemV ABI Entry
+ *
+ *
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_SYSTEMV = $fff4fff4;
+
+ { * PPC 32bit D0D1SR functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_D0D1SR_NATIVE = $fff3fff3;
+
+ { * PPC 32bit D0D1A0A1SR functionarray ptrs
+ * (ULONG) $ffffffff stops it
+ * }
+ FUNCARRAY_32BIT_D0D1A0A1SR_NATIVE = $fff2fff2;
+
+
+
+{ * exec device definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 04.08.2011 ALB
+ PDevice = ^TDevice;
+ TDevice = record
+ dd_Library: TLibrary;
+ end;
+
+type // Checked OK 04.08.2011 ALB
+ PUnit = ^TUnit;
+ TUnit = record
+ unit_MsgPort: TMsgPort;
+ unit_flags : Byte;
+ unit_pad : Byte;
+ unit_OpenCnt: Word;
+ end;
+
+
+const // Checked OK 04.08.2011 ALB
+ UNITF_ACTIVE = (1 shl 0);
+ UNITF_INTASK = (1 shl 1);
+
+
+
+{ * exec io definitions
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PIORequest = ^TIORequest;
+ TIORequest = record
+ io_Message: TMessage;
+ io_Device : PDevice;
+ io_Unit : PUnit;
+ io_Command: Word;
+ io_Flags : Byte;
+ io_Error : ShortInt;
+ end;
+
+type // Checked OK 05.08.2011 ALB
+ PIOStdReq = ^TIOStdReq;
+ TIOStdReq = record
+ io_Message: TMessage;
+ io_Device : PDevice;
+ io_Unit : PUnit;
+ io_Command: Word;
+ io_Flags : Byte;
+ io_Error : ShortInt;
+ io_Actual : DWord;
+ io_Length : DWord;
+ io_Data : Pointer;
+ io_Offset : DWord;
+ end;
+
+
+const // Checked OK 05.08.2011 ALB
+ DEV_BEGINIO = -30;
+ DEV_ABORTIO = -36;
+
+ IOB_QUICK = 0;
+ IOF_QUICK = (1 Shl IOB_QUICK);
+
+ CMD_INVALID = 0;
+ CMD_RESET = 1;
+ CMD_READ = 2;
+ CMD_WRITE = 3;
+ CMD_UPDATE = 4;
+ CMD_CLEAR = 5;
+ CMD_STOP = 6;
+ CMD_START = 7;
+ CMD_FLUSH = 8;
+ CMD_NONSTD = 9;
+
+type
+
+ PArosSupportBase = ^TArosSupportBase;
+ TArosSupportBase = record
+ StdOut: Pointer;
+ kPrintfPtr: Pointer;
+ rkPrintfPtr: Pointer;
+ vkPrintfPtr: Pointer;
+ DebugConfig: Pointer;
+ end;
+
+{ * exec include
+ *********************************************************************
+ * }
+
+
+type // Checked OK 05.08.2011 ALB
+ PExecBase = ^TExecBase;
+ TExecBase = record
+ // lib structure for Exec
+ LIbNode : TLibrary;
+
+ // system constants
+
+ SoftVer : Word; // obsolete
+ LowMemChkSum: SmallInt;
+ ChkBase : PtrUInt;
+ ColdCapture : Pointer;
+ CoolCapture : Pointer;
+ WarmCapture : Pointer;
+ SysStkUpper : Pointer; // System Stack Bounds
+ SysStkLower : Pointer;
+ MaxLocMem : PtrUInt; // Chip Memory Pointer
+ DebugEntry : Pointer;
+ DebugData : Pointer;
+ AlertData : Pointer;
+ MaxExtMem : Pointer; // Extended Memory Pointer (may be nil)
+ ChkSum : Word; // SoftVer to MaxExtMem
+
+ // interrupts
+
+ IntVects : Array[0..15] Of TIntVector;
+
+ // System Variables
+
+ ThisTask : PTask; // Pointer to currently running Task READONLY
+ IdleCount : DWord;
+ DispCount : DWord;
+ Quantum : Word; // # of ticks a task may run
+ Elapsed : Word; // # of ticks the current task has run
+ SysFlags : Word;
+ IDNestCnt : ShortInt;
+ TDNestCnt : ShortInt;
+ AttnFlags : Word; // Attention Flags .. se below
+ AttnResched : Word;
+ ResModules : Pointer;
+
+ TaskTrapCode : Pointer;
+ TaskExceptCode: Pointer;
+ TaskExitCode : Pointer;
+ TaskSigAlloc : DWord;
+ TaskTrapAlloc : Word;
+
+ // Private Lists
+
+ MemList : TEList;
+ ResourceList: TEList;
+ DeviceList : TEList;
+ IntrList : TEList;
+ LibList : TEList;
+ PortList : TEList;
+ TaskReady : TEList;
+ TaskWait : TEList;
+ SoftInts : Array[0..4] Of TSoftIntList;
+
+ //stuff
+
+ LastAlert : Array[0..3] Of LongInt;
+
+ VBlankFrequency : Byte;
+ PowerSupplyFrequency: Byte; // AROS PRIVATE: VBlankFreq * PowerSupplyFreq = Timer Tick Rate
+ SemaphoreList : TEList;
+
+ // Kickstart
+
+ KickMemPtr : Pointer;
+ KickTagPtr : Pointer;
+ KickCheckSum : Pointer;
+
+ // Miscellaneous stuff
+
+ ex_Pad0 : Word;
+ ex_LaunchPoint : PtrUInt;
+ ex_RamLibPrivate : Pointer;
+ ex_EClockFrequency : DWord;
+ ex_CacheControl : DWord;
+ ex_TaskID : DWord;
+ ex_Reserved1 : Array[0..4] Of DWord;
+ ex_MMULock : Pointer;
+ ex_Reserved2 : Array[0..1] Of DWord;
+ ex_DebugFlags : DWord; { * Exec Debug Flags..*private* * }
+
+ ex_MemHandlers : TMinList;
+ ex_MemHandler : Pointer;
+ // Additional field for AROS
+ DebugAROSBase : PArosSupportBase;
+ end;
+
+
+ { *
+ * Outdated 68k cpu informations
+ *
+ * }
+const // Checked OK 05.08.2011 ALB
+ AFB_68010 = 0;
+ AFB_68020 = 1;
+ AFB_68030 = 2;
+ AFB_68040 = 3;
+ AFB_68881 = 4;
+ AFB_68882 = 5;
+ AFB_FPU40 = 6;
+ AFB_68060 = 7;
+ AFB_PRIVATE = 15;
+
+ AFF_68010 = (1 shl AFB_68010);
+ AFF_68020 = (1 shl AFB_68020);
+ AFF_68030 = (1 shl AFB_68030);
+ AFF_68040 = (1 shl AFB_68040);
+ AFF_68881 = (1 shl AFB_68881);
+ AFF_68882 = (1 shl AFB_68882);
+ AFF_FPU40 = (1 shl AFB_FPU40);
+ AFF_68060 = (1 shl AFB_68060);
+ AFF_PRIVATE = (1 shl AFB_PRIVATE);
+
+ { *
+ * Outdated 68k cache functionality
+ * Mostly without function.
+ * }
+const // Checked OK 05.08.2011 ALB
+ CACRF_EnableI = (1 shl 0);
+ CACRF_FreezeI = (1 shl 1);
+ CACRF_ClearI = (1 shl 3);
+ CACRF_IBE = (1 shl 4);
+ CACRF_EnableD = (1 shl 8);
+ CACRF_FreezeD = (1 shl 9);
+ CACRF_ClearD = (1 shl 11);
+ CACRF_DBE = (1 shl 12);
+ CACRF_WriteAllocate = (1 shl 13);
+ CACRF_EnableE = (1 shl 30);
+ CACRF_CopyBack = (1 shl 31);
+
+ DMA_Continue = (1 shl 1);
+ DMA_NoModify = (1 shl 2);
+ DMA_ReadFromRAM = (1 shl 3);
+(*
+ SB_SAR = 15;
+ SB_TQE = 14;
+ SB_SINT = 13;
+
+ SF_SAR = (1 shl SB_SAR);
+ SF_TQE = (1 shl SB_TQE);
+ SF_SINT = (1 shl SB_SINT);
+*)
+
+ { ****** Debug Flags...(don`t depend on them) ********** }
+const // Checked OK 05.08.2011 ALB
+ EXECDEBUGF_INITRESIDENT = $1;
+ EXECDEBUGF_INITCODE = $2;
+ EXECDEBUGF_FINDRESIDENT = $4;
+
+ EXECDEBUGF_CREATELIBRARY = $10;
+ EXECDEBUGF_SETFUNCTION = $20;
+ EXECDEBUGF_NEWSETFUNCTION = $40;
+ EXECDEBUGF_CHIPRAM = $80;
+
+ EXECDEBUGF_ADDTASK = $100;
+ EXECDEBUGF_REMTASK = $200;
+ EXECDEBUGF_GETTASKATTR = $400;
+ EXECDEBUGF_SETTASKATTR = $800;
+
+ EXECDEBUGF_EXCEPTHANDLER = $1000;
+ EXECDEBUGF_ADDDOSNODE = $2000;
+ EXECDEBUGF_PCI = $4000;
+ EXECDEBUGF_RAMLIB = $8000;
+
+ EXECDEBUGF_NOLOGSERVER = $10000;
+ EXECDEBUGF_NOLOGWINDOW = $20000;
+
+ { *
+ * "env:MorphOS/LogPath" contains the logfile path,
+ * If not specified it`s using "ram:.morphoslog"
+ * }
+ EXECDEBUGF_LOGFILE = $40000;
+ EXECDEBUGF_LOGKPRINTF = $80000;
+
+ { * Memory Tracking Flags
+ * }
+ EXECDEBUGF_PERMMEMTRACK = $100000;
+ EXECDEBUGF_MEMTRACK = $200000;
+
+ { * CyberGuardPPC Flags
+ * }
+ EXECDEBUGF_CYBERGUARDDEADLY = $400000;
+
+ { * PPCLib Flags
+ * }
+ EXECDEBUGF_LOADSEG = $01000000;
+ EXECDEBUGF_UNLOADSEG = $02000000;
+ EXECDEBUGF_PPCSTART = $04000000;
+
+ { * UserFlags
+ * }
+
+ { *
+ * Enables debug output for cybergraphx
+ * }
+const // Checked OK 05.08.2011 ALB
+ EXECDEBUGF_CGXDEBUG = $08000000;
+
+ { *
+ * Should be used to control user LibInit/DevInit Debug output
+ * }
+ EXECDEBUGF_INIT = $40000000;
+
+ { *
+ * Should be used to control logging
+ * }
+ EXECDEBUGF_LOG = $80000000;
+
+
+
+{*
+ * The following definitions are private!
+ *}
+const // Checked OK 05.08.2011 ALB
+// SysFlags
+ SFF_SoftInt = (1 shl 5); // There is a software interrupt
+ SFF_QuantumOver = (1 shl 13); // Task's time slice is over
+
+// AttnFlags
+ ARF_AttnSwitch = (1 shl 7); // Delayed Switch() pending
+ ARF_AttnDispatch = (1 shl 15); // Delayed Dispatch() pending
+
+const
+ { *
+ * Execbase list IDs
+ * }
+ EXECLIST_DEVICE = 0;
+ EXECLIST_INTERRUPT = 1;
+ EXECLIST_LIBRARY = 2;
+ EXECLIST_MEMHANDLER = 3;
+ EXECLIST_MEMHEADER = 4;
+ EXECLIST_PORT = 5;
+ EXECLIST_RESOURCE = 6;
+ EXECLIST_SEMAPHORE = 7;
+ EXECLIST_TASK = 8;
+
+
+ { *
+ * Execnotify hook message
+ * }
+type
+ PExecNotifyMessage = ^TExecNotifyMessage;
+ TExecNotifyMessage = record
+ MType : DWord;
+ Flags : DWord;
+ Extra : DWord;
+ Extension: Pointer;
+ end;
+
+
+const
+ EXECNOTIFYF_REMOVE = (1 Shl 0); { * if clear, is ADD * }
+ EXECNOTIFYF_POST = (1 Shl 1); { * if clear, is PRE * }
+
+
+ { *
+ * AddExecNodeTagList tags
+ * }
+const
+ SAL_Dummy = (TAG_USER + 1000);
+ SAL_Type = (SAL_Dummy + 1);
+ SAL_Priority = (SAL_Dummy + 2);
+ SAL_Name = (SAL_Dummy + 3);
+
+{$include utild2.inc}
+
+
+
diff --git a/rtl/aros/i386/execf.inc b/rtl/aros/i386/execf.inc
new file mode 100644
index 0000000000..0a15874015
--- /dev/null
+++ b/rtl/aros/i386/execf.inc
@@ -0,0 +1,89 @@
+{
+ This file is part of the Free Pascal run time library.
+ Copyright (c) 2006 Karoly Balogh
+
+ exec functions (V40) for Amiga/PowerPC
+
+ 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.
+
+ **********************************************************************}
+
+var
+ LocalExecBase : Pointer; external name '_ExecBase';
+
+procedure Forbid; syscall AOS_ExecBase 22;
+procedure Permit; syscall AOS_ExecBase 23;
+function execAllocMem(byteSize: Cardinal; requirements: Cardinal): Pointer; syscall LocalExecBase 33;
+procedure execFreeMem(memoryBlock: Pointer; byteSize: Cardinal); syscall LocalExecBase 35;
+function FindTask(name: PChar): PTask; syscall LocalExecBase 49;
+function SetSignal(newSignals: Cardinal; signalSet : Cardinal): Cardinal; syscall LocalExecBase 51;
+function Wait(SignalSet: LongWord): LongWord; syscall AOS_ExecBase 53;
+procedure Signal(Task: PTask; SignalSet: LongWord); syscall AOS_ExecBase 54;
+function AllocSignal(signalNum: LongInt): ShortInt; syscall LocalExecBase 55;
+procedure FreeSignal(signalNum: LongInt); syscall LocalExecBase 56;
+procedure AddPort(port: PMsgPort); syscall LocalExecBase 59;
+procedure RemPort(port: PMsgPort); syscall LocalExecBase 60;
+function GetMsg(port: PMsgPort): PMessage; syscall LocalExecBase 62;
+procedure ReplyMsg(message : pMessage); syscall LocalExecBase 63;
+function WaitPort(port: PMsgPort): PMessage; syscall LocalExecBase 64;
+procedure CloseLibrary(libHandle: PLibrary); syscall LocalExecBase 69;
+function OpenDevice(devName: PChar; numunit: Cardinal; ioRequest: pIORequest; flags: Cardinal): ShortInt; syscall LocalExecBase 74;
+procedure CloseDevice(ioRequest: PIORequest); syscall LocalExecBase 75;
+function DoIO(ioRequest: PIORequest): ShortInt; syscall LocalExecBase 76;
+function OpenLibrary(libname: PChar; libver : Cardinal): Pointer; syscall LocalExecBase 92;
+procedure InitSemaphore(SigSem: PSignalSemaphore); syscall AOS_ExecBase 93;
+procedure ObtainSemaphore(SigSem: PSignalSemaphore); syscall AOS_ExecBase 94;
+procedure ReleaseSemaphore(SigSem: PSignalSemaphore); syscall AOS_ExecBase 95;
+function AttemptSemaphore(SigSem: PSignalSemaphore): LongWord; syscall AOS_ExecBase 96;
+function CreatePool(requirements: Cardinal; puddleSize: Cardinal; threshSize: Cardinal): Pointer; syscall LocalExecBase 116;
+procedure DeletePool(poolHeader: Pointer); syscall LocalExecBase 117;
+function AllocPooled(poolHeader: Pointer; memSize: Cardinal): Pointer; syscall LocalExecBase 118;
+function FreePooled(poolHeader: Pointer; memory: Pointer; memSize: Cardinal): Pointer; syscall LocalExecBase 119;
+procedure StackSwap(NewStack: PStackSwapStruct); syscall AOS_ExecBase 122;
+procedure RawPutChar(c: Char); syscall AOS_ExecBase 86;
+
+//function RawDoFmt(const formatString : pCHAR;const dataStream : POINTER; putChProc : tPROCEDURE; putChData : POINTER): pointer;
+function RawDoFmt(const formatString : pCHAR;const dataStream : POINTER; putChProc : POINTER; putChData : POINTER): pointer; syscall LocalExecBase 87;
+
+function GetLibAdress(Base: Pointer; Offset: LongInt): Pointer; inline;
+begin
+ if Base = nil then
+ begin
+ RawDoFmt('FPC_FILE_DEBUG: Error! Illegal library access with not opened library: %d !'+#10,@Offset,pointer(1),nil);
+ Debugln('Illegal library access with not opened library');
+ Halt(1);
+ end;
+ GetLibAdress := Pointer((Base -(Offset * SizeOf(Pointer)))^);
+end;
+
+procedure Debug(s: string);
+type
+ TkPrintf = function(Msg: PChar): Integer; cdecl;
+var
+ kPrintf: TkPrintf;
+ d: string;
+ i: Integer;
+begin
+ if Assigned(AOS_ExecBase) then
+ begin
+ if Assigned(PExecBase(AOS_ExecBase)^.DebugArosBase) then
+ begin
+ kPrintf := TKPrintF(PExecBase(AOS_ExecBase)^.DebugArosBase^.kprintfPtr);
+ if Assigned(kPrintf) then
+ begin
+ d := s + #0;
+ i := kPrintf(@d[1]);
+ end;
+ end;
+ end;
+end;
+
+procedure Debugln(s: string);
+begin
+ Debug(s + #10);
+end;
diff --git a/rtl/aros/i386/prt0.as b/rtl/aros/i386/prt0.as
new file mode 100644
index 0000000000..527dc5cb7e
--- /dev/null
+++ b/rtl/aros/i386/prt0.as
@@ -0,0 +1,162 @@
+#
+# This file is part of the Free Pascal run time library.
+# Copyright (c) 2011 by Marcus Sackrow
+#
+# Startup code for AROS/i386 RTL
+#
+# 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.
+#
+
+# AROS Startup Code
+ .text
+ .align 4
+ .section .aros.startup, "ax"
+ .globl _start
+ .globl start
+ .globl _haltproc
+ .globl haltproc
+_start:
+start:
+
+ /* Save the exec library base */
+ movl 12(%esp),%eax
+ movl %eax,_ExecBase
+
+ /* Save the command line pointer length to CommandLineLen */
+ movl 8(%esp),%eax
+ movl %eax,CommandLineLen
+
+ /* Save the command line pointer to CommandLine */
+ movl 4(%esp),%eax
+ movl %eax,CommandLine
+
+ /* save all registers */
+ pushal
+
+ /* get the pointer to current stack */
+ movl _ExecBase,%eax
+ pushl %eax
+ pushl $0
+ movl -196(%eax),%eax /* FindTask(nil) */
+ call *%eax
+ addl $8,%esp
+
+ movl 64(%eax),%ecx /* SPUpper */
+ subl 60(%eax),%ecx /* SPLower */
+
+/* Uncomment the symbol line below to force system stack use,
+ and do not attempt to reallocate stack if the system-provided
+ stack is smaller than the user specified */
+# FORCE_USE_SYSTEM_STACK:
+
+.ifndef FORCE_USE_SYSTEM_STACK
+ /* Check if we need a new stack
+ Only allocate a new stack if the system-provided
+ stack is smaller than the one set compile time */
+ cmpl __stklen,%ecx
+ jl _allocStack
+.endif
+
+ movl %ecx,__stklen /* Store the new stack size */
+ xorl %eax,%eax
+ movl %eax,StackAreaPtr /* Clear the stackAreaPtr for exit test */
+ jmp _noAllocStack
+
+_allocStack:
+ /* Allocating new stack */
+ movl _ExecBase,%eax
+ pushl %eax
+ pushl $0 /* MEMF_ANY */
+ pushl __stklen
+ movl -456(%eax),%eax /* AllocVec() */
+ call *%eax
+ addl $12,%esp
+
+ testl %eax,%eax
+ je __exit
+ movl %eax,StackAreaPtr
+
+ /* Setting up StackSwap structure, and do the StackSwap */
+ lea StackSwapStruct,%ecx
+ movl %eax,(%ecx) /* Bottom of the stack */
+ addl __stklen,%eax
+ movl %eax,4(%ecx) /* Top of the stack */
+ movl %eax,8(%ecx) /* Initial stackpointer */
+ movl _ExecBase,%eax
+ pushl %eax
+ lea StackSwapArgs,%ebx
+ pushl %ebx
+ lea _initProc,%ebx
+ pushl %ebx
+ pushl %ecx
+ movl -536(%eax),%eax /* NewStackSwap() */
+ call *%eax
+ addl $16,%esp
+ jmp _afterMain
+
+_noAllocStack:
+ call _initProc
+
+_afterMain:
+ /* check if we have a StackArea to free */
+ movl StackAreaPtr,%eax
+ testl %eax,%eax
+ je __exit
+
+_freeStack:
+ /* Freeing up stack area */
+ movl _ExecBase,%eax
+ pushl %eax
+ pushl StackAreaPtr
+ movl -460(%eax),%eax /* FreeVec() */
+ call *%eax
+ addl $8,%esp
+
+__exit:
+ /* get back all registers */
+ popal
+ /* get returncode */
+ movl operatingsystem_result,%eax
+ /* bye bye */
+ ret
+
+ /* This function is getting called from NewStackSwap() or
+ as standalone if we don't do stackswap */
+_initProc:
+ pushal
+ /* Save stack pointer */
+ movl %esp,STKPTR
+
+ /* call the main function */
+ call PASCALMAIN
+
+ /* entry to stop the program */
+_haltproc:
+haltproc:
+ /* restore the old stackPtr and return */
+ movl STKPTR,%esp
+ popal
+ ret
+
+ /*----------------------------------------------------*/
+
+ .bss
+ .global CommandLineLen # byte length of command line
+ .global CommandLine # comandline as PChar
+ .global STKPTR # Used to terminate the program, initial SP
+ .global _ExecBase # exec library base
+ .align 4
+
+CommandLine: .skip 4
+CommandLineLen: .skip 4
+STKPTR: .skip 4
+_ExecBase: .skip 4
+
+StackAreaPtr: .skip 4
+StackSwapStruct: .skip 12
+StackSwapArgs: .skip 32
diff --git a/rtl/aros/i386/utild1.inc b/rtl/aros/i386/utild1.inc
new file mode 100644
index 0000000000..1ba0b964b1
--- /dev/null
+++ b/rtl/aros/i386/utild1.inc
@@ -0,0 +1,153 @@
+{
+ This file is part of the Free Pascal run time library.
+
+ utility definitions (V50) for MorphOS/PowerPC
+ Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
+
+ Free Pascal conversion, first part
+ Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
+
+ See the file COPYING.FPC, included in this distribution,
+ for details about the copyright.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+
+{ * utility.library date defines
+ *********************************************************************
+ * }
+
+
+type
+ PClockData = ^TClockData;
+ TClockData = record
+ sec : Word;
+ min : Word;
+ hour : Word;
+ mday : Word;
+ month: Word;
+ year : Word;
+ wday : Word;
+ end;
+
+
+
+{ * utility.library tagitem defines
+ *********************************************************************
+ * }
+
+
+type
+ Tag = Cardinal;
+
+type
+ PPTagItem = ^PTagItem;
+ PTagItem = ^TTagItem;
+ TTagItem = record
+ ti_Tag : Tag;
+ ti_Data: Cardinal;
+ end;
+
+
+const
+ TAG_DONE = 0;
+ TAG_END = 0;
+ TAG_IGNORE = 1;
+ TAG_MORE = 2;
+ TAG_SKIP = 3;
+
+const
+ TAG_USER = 1 Shl 31;
+
+const
+ TAGFILTER_AND = 0;
+ TAGFILTER_NOT = 1;
+
+const
+ MAP_REMOVE_NOT_FOUND = 0;
+ MAP_KEEP_NOT_FOUND = 1;
+
+
+
+{ * utility.library namespace defines
+ *********************************************************************
+ * }
+
+
+type
+ PNamedObject = ^TNamedObject;
+ TNamedObject = record
+ no_Object: Pointer;
+ end;
+
+
+const
+ ANO_NameSpace = 4000;
+ ANO_UserSpace = 4001;
+ ANO_Priority = 4002;
+ ANO_Flags = 4003;
+
+ NSB_NODUPS = 0;
+ NSB_CASE = 1;
+
+ NSF_NODUPS = 1 Shl NSB_NODUPS;
+ NSF_CASE = 1 Shl NSB_CASE;
+
+
+
+{ * utility.library pack attributes and macros
+ *********************************************************************
+ * }
+
+
+const
+ PSTB_SIGNED = 31;
+ PSTB_UNPACK = 30;
+ PSTB_PACK = 29;
+ PSTB_EXISTS = 26;
+
+ PSTF_SIGNED = (1 Shl PSTB_SIGNED);
+ PSTF_UNPACK = (1 Shl PSTB_UNPACK);
+ PSTF_PACK = (1 Shl PSTB_PACK);
+ PSTF_EXISTS = (1 Shl PSTB_EXISTS);
+
+const
+ 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;
+
+{$WARNING FIX ME!!! Some macros to convert}
+{
+ PK_BITNUM1(flg) ((flg) == 0x01 ? 0 : (flg) == 0x02 ? 1 : (flg) == 0x04 ? 2 : (flg) == 0x08 ? 3 : (flg) == 0x10 ? 4 : (flg) == 0x20 ? 5 : (flg) == 0x40 ? 6 : 7)
+ PK_BITNUM2(flg) ((flg < 0x100 ? PK_BITNUM1(flg) : 8 + PK_BITNUM1(flg >> 8)))
+ PK_BITNUM(flg) ((flg < 0x10000 ? PK_BITNUM2(flg) : 16 + PK_BITNUM2(flg >> 16)))
+ PK_WORDOFFSET(flg) ((flg) < 0x100 ? 1 : 0)
+ PK_LONGOFFSET(flg) ((flg) < 0x100 ? 3 : (flg) < 0x10000 ? 2 : (flg) < 0x1000000 ? 1 : 0)
+ PK_CALCOFFSET(type,field) ((ULONG)(&((struct type *)0)->field))
+
+
+ PACK_STARTTABLE(tagbase) (tagbase)
+ PACK_NEWOFFSET(tagbase) (-1L),(tagbase)
+ PACK_ENDTABLE 0
+ PACK_ENTRY(tagbase,tag,type,field,control) (control | ((tag-tagbase) << 16L) | PK_CALCOFFSET(type,field))
+ PACK_BYTEBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | PK_CALCOFFSET(type,field) | (PK_BITNUM(flags) << 13L))
+ PACK_WORDBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | (PK_CALCOFFSET(type,field) + PK_WORDOFFSET(flags)) | ((PK_BITNUM(flags) & 7) << 13L))
+ PACK_LONGBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | (PK_CALCOFFSET(type,field) + PK_LONGOFFSET(flags)) | ((PK_BITNUM(flags) & 7) << 13L))
+}
+
+
diff --git a/rtl/aros/i386/utild2.inc b/rtl/aros/i386/utild2.inc
new file mode 100644
index 0000000000..75992ceacc
--- /dev/null
+++ b/rtl/aros/i386/utild2.inc
@@ -0,0 +1,53 @@
+{
+ This file is part of the Free Pascal run time library.
+
+ utility definitions (V50) for MorphOS/PowerPC
+ Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
+
+ Free Pascal conversion, second part
+ Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
+
+ See the file COPYING.FPC, included in this distribution,
+ for details about the copyright.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+
+{ * utility.library include
+ *********************************************************************
+ * }
+
+
+const
+ UtilityName = 'utility.library';
+
+
+type
+ PUtilityBase = ^TUtilityName;
+ TUtilityName = record
+ ub_LibNode : TLibrary;
+ ub_Language: Byte;
+ ub_Reserved: Byte;
+ end;
+
+
+
+{ * utility.library hook defines
+ *********************************************************************
+ * }
+
+
+type
+ PHook = ^THook;
+ THook = record
+ h_MinNode : TMinNode;
+ h_Entry : Cardinal;
+ h_SubEntry: Cardinal;
+ h_Data : Pointer;
+ end;
+
+
diff --git a/rtl/aros/i386/utilf.inc b/rtl/aros/i386/utilf.inc
new file mode 100644
index 0000000000..e0ba18b659
--- /dev/null
+++ b/rtl/aros/i386/utilf.inc
@@ -0,0 +1,18 @@
+{
+ This file is part of the Free Pascal run time library.
+ Copyright (c) 2011 by Marcus Sackrow
+
+ utility.library functions for AROS
+
+ 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.
+
+ **********************************************************************}
+
+procedure Amiga2Date(date_amiga: longword; cd: PClockData); syscall AOS_UtilityBase 20;
+function Date2Amiga(date: PClockData): longword; syscall AOS_UtilityBase 21;
+