From 92f167fe5ea5fdd9bc3f6b4c5f222d7c4587fc7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Sun, 9 May 2004 14:42:59 +0000 Subject: [PATCH] * again, few more new things added --- rtl/morphos/system.pp | 224 ++++++++++++++++++++++++++++++++---------- 1 file changed, 174 insertions(+), 50 deletions(-) diff --git a/rtl/morphos/system.pp b/rtl/morphos/system.pp index d369c545db..85f1c4e80b 100644 --- a/rtl/morphos/system.pp +++ b/rtl/morphos/system.pp @@ -26,7 +26,7 @@ interface {$I systemh.inc} type - THandle = DWord; + THandle = LongInt; {$I heaph.inc} @@ -50,13 +50,150 @@ const BreakOn : Boolean = True; + +{***************************************************************************** + MorphOS structures +*****************************************************************************} + +type + TDateStamp = packed 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; + PDateStamp = ^TDateStamp; + + PFileInfoBlock = ^TFileInfoBlock; + TFileInfoBlock = packed record + fib_DiskKey : LongInt; + fib_DirEntryType : LongInt; + { Type of Directory. If < 0, then a plain file. If > 0 a directory } + fib_FileName : Array [0..107] of Char; + { Null terminated. Max 30 chars used for now } + fib_Protection : LongInt; + { bit mask of protection, rwxd are 3-0. } + fib_EntryType : LongInt; + fib_Size : LongInt; { Number of bytes in file } + fib_NumBlocks : LongInt; { Number of blocks in file } + fib_Date : TDateStamp; { Date file last changed } + fib_Comment : Array [0..79] of Char; + { Null terminated comment associated with file } + fib_Reserved : Array [0..35] of Char; + end; + + PNode = ^TNode; + TNode = packed record + ln_Succ, { Pointer to next (successor) } + ln_Pred: pNode; { Pointer to previous (predecessor) } + ln_Type: Byte; + ln_Pri : Shortint; { Priority, for sorting } + ln_Name: PChar; { ID string, null terminated } + end; { Note: Integer aligned } + + PMinNode = ^TMinNode; + tMinNode = packed record + mln_Succ, + mln_Pred: pMinNode; + end; + + PList = ^TList; + tList = packed record + lh_Head : pNode; + lh_Tail : pNode; + lh_TailPred: pNode; + lh_Type : Byte; + l_pad : Byte; + end; + + PMinList = ^TMinList; + TMinList = packed record + mlh_Head : PMinNode; + mlh_Tail : PMinNode; + mlh_TailPred: PMinNode; + end; + + PMsgPort = ^TMsgPort; + TMsgPort = packed record + mp_Node : TNode; + mp_Flags : Byte; + mp_SigBit : Byte; { signal bit number } + mp_SigTask: Pointer; { task to be signalled (TaskPtr) } + mp_MsgList: TList; { message linked list } + end; + + PMessage = ^TMessage; + TMessage = packed record + mn_Node : TNode; + mn_ReplyPort: PMsgPort; + mn_Length : Word; + end; + + PTask = ^TTask; + TTask = packed record + tc_Node : TNode; + tc_Flags : Byte; + tc_State : Byte; + tc_IDNestCnt : Shortint; { intr disabled nesting } + tc_TDNestCnt : Shortint; { task disabled nesting } + tc_SigAlloc : DWord; { sigs allocated } + tc_SigWait : DWord; { sigs we are waiting for } + tc_SigRecvd : DWord; { sigs we have received } + tc_SigExcept : DWord; { sigs we will take excepts for } + tc_TrapAlloc : Word; { traps allocated } + tc_TrapAble : Word; { traps enabled } + tc_ExceptData: Pointer; { points to except data } + tc_ExceptCode: Pointer; { points to except code } + tc_TrapData : Pointer; { points to trap data } + tc_TrapCode : Pointer; { points to trap code } + tc_SPReg : Pointer; { stack pointer } + tc_SPLower : Pointer; { stack lower bound } + tc_SPUpper : Pointer; { stack upper bound + 2 } + tc_Switch : Pointer; { task losing CPU } + tc_Launch : Pointer; { task getting CPU } + tc_MemEntry : TList; { allocated memory } + tc_UserData : Pointer; { per task data } + end; + + PProcess = ^TProcess; + TProcess = packed record + pr_Task : TTask; + pr_MsgPort : TMsgPort; { This is BPTR address from DOS functions } + pr_Pad : Word; { Remaining variables on 4 byte boundaries } + pr_SegList : Pointer; { Array of seg lists used by this process } + pr_StackSize : Longint; { Size of process stack in bytes } + pr_GlobVec : Pointer; { Global vector for this process (BCPL) } + pr_TaskNum : Longint; { CLI task number of zero if not a CLI } + pr_StackBase : DWord; { Ptr to high memory end of process stack } + pr_Result2 : Longint; { Value of secondary result from last call } + pr_CurrentDir : DWord; { Lock associated with current directory } + pr_CIS : DWord; { Current CLI Input Stream } + pr_COS : DWord; { Current CLI Output Stream } + pr_ConsoleTask : Pointer; { Console handler process for current window } + pr_FileSystemTask: Pointer; { File handler process for current drive } + pr_CLI : DWord; { pointer to ConsoleLineInterpreter } + pr_ReturnAddr : Pointer; { pointer to previous stack frame } + pr_PktWait : Pointer; { Function to be called when awaiting msg } + pr_WindowPtr : Pointer; { Window for error printing } + { following definitions are new with 2.0 } + pr_HomeDir : DWord; { Home directory of executing program } + pr_Flags : Longint; { flags telling dos about process } + pr_ExitCode : Pointer; { code to call on exit of program OR NULL } + pr_ExitData : Longint; { Passed as an argument to pr_ExitCode. } + pr_Arguments : PChar; { Arguments passed to the process at start } + pr_LocalVars : TMinList; { Local environment variables } + pr_ShellPrivate : Longint; { for the use of the current shell } + pr_CES : DWord; { Error stream - IF NULL, use pr_COS } + end; + var - MOS_ExecBase : Pointer; external name '_ExecBase'; - MOS_DOSBase : Pointer; - - MOS_heapPool : Pointer; { pointer for the OS pool for growing the heap } - MOS_origDir : LongInt; { original directory on startup } + MOS_ExecBase: Pointer; external name '_ExecBase'; + MOS_DOSBase : Pointer; + MOS_heapPool: Pointer; { pointer for the OS pool for growing the heap } + MOS_origDir : LongInt; { original directory on startup } + MOS_ambMsg : PMessage; + MOS_ConName : PChar ='CON:10/30/620/100/FPC Console Output/AUTO/CLOSE/WAIT'; + {***************************************************************************** MorphOS functions @@ -77,6 +214,9 @@ function exec_AllocPooled(poolHeader: Pointer location 'a0'; function exec_SetSignal(newSignals: LongInt location 'd0'; signalMask: LongInt location 'd1'): LongInt; SysCall MOS_ExecBase 306; +function exec_FindTask(tname: PChar location 'a1'): PTask; SysCall MOS_ExecBase 294; +function exec_GetMsg(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 372; +function exec_WaitPort(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 384; { dos.library functions } @@ -118,44 +258,17 @@ function dos_CurrentDir(lock: LongInt location 'd1'): LongInt; SysCall MOS_DOSBa function dos_Examine(lock: LongInt location 'd1'; FileInfoBlock: Pointer location 'd2'): Boolean; SysCall MOS_DOSBase 102; function dos_CreateDir(dname: PChar location 'd1'): LongInt; SysCall MOS_DOSBase 120; +function dos_DateStamp(var ds: TDateStamp location 'd1'): LongInt; SysCall MOS_DOSBase 192; implementation {$I system.inc} - {***************************************************************************** System Dependent Structures/Consts *****************************************************************************} -{ Used system structures } -Type - TDateStamp = packed 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; - PDateStamp = ^TDateStamp; - - PFileInfoBlock = ^TFileInfoBlock; - TFileInfoBlock = packed record - fib_DiskKey : LongInt; - fib_DirEntryType : LongInt; - { Type of Directory. If < 0, then a plain file. If > 0 a directory } - fib_FileName : Array [0..107] of Char; - { Null terminated. Max 30 chars used for now } - fib_Protection : LongInt; - { bit mask of protection, rwxd are 3-0. } - fib_EntryType : LongInt; - fib_Size : LongInt; { Number of bytes in file } - fib_NumBlocks : LongInt; { Number of blocks in file } - fib_Date : TDateStamp; { Date file last changed } - fib_Comment : Array [0..79] of Char; - { Null terminated comment associated with file } - fib_Reserved : Array [0..35] of Char; - end; - { Errors from dos_IoErr(), etc. } const ERROR_NO_FREE_STORE = 103; @@ -352,8 +465,8 @@ begin { Closing opened files } CloseList(MOS_fileList); - if MOS_DOSBase<>NIL then exec_CloseLibrary(MOS_DOSBase); - if MOS_heapPool<>NIL then exec_DeletePool(MOS_heapPool); + if MOS_DOSBase<>nil then exec_CloseLibrary(MOS_DOSBase); + if MOS_heapPool<>nil then exec_DeletePool(MOS_heapPool); haltproc(ExitCode); end; @@ -417,7 +530,7 @@ end; {***************************************************************************** - ParamStr/Randomize + ParamStr/Randomize *****************************************************************************} { number of args } @@ -438,12 +551,10 @@ end; { set randseed to a new pseudo random value } procedure randomize; +var tmpTime: TDateStamp; begin - {regs.realeax:=$2c00; - sysrealintr($21,regs); - hl:=regs.realedx and $ffff; - randseed:=hl*$10000+ (regs.realecx and $ffff);} - randseed:=0; + dos_DateStamp(tmpTime); + randseed:=tmpTime.ds_tick; end; @@ -842,17 +953,23 @@ end; {$I text.inc} - - { MorphOS specific startup } procedure SysInitMorphOS; +var self: PProcess; begin + self:=PProcess(exec_FindTask(nil)); + if self^.pr_CLI<>0 then begin + { if we're running from Ambient, we catch its message } + exec_WaitPort(@self^.pr_MsgPort); + MOS_ambMsg:=exec_GetMsg(@self^.pr_MsgPort); + end; + MOS_DOSBase:=exec_OpenLibrary('dos.library',50); - if MOS_DOSBase=NIL then Halt(1); + if MOS_DOSBase=nil then Halt(1); { Creating the memory pool for growing heap } MOS_heapPool:=exec_CreatePool(MEMF_FAST,growheapsize2,growheapsize1); - if MOS_heapPool=NIL then Halt(1); + if MOS_heapPool=nil then Halt(1); StdInputHandle:=dos_Input; StdOutputHandle:=dos_Output; @@ -896,6 +1013,9 @@ Begin StackLength := InitialStkLen; StackBottom := Sptr - StackLength; { OS specific startup } + MOS_ambMsg:=nil; + MOS_origDir:=0; + MOS_fileList:=nil; SysInitMorphOS; { Set up signals handlers } // InstallSignals; @@ -915,13 +1035,14 @@ Begin {$ifdef HASVARIANT} initvariantmanager; {$endif HASVARIANT} - MOS_origDir:=0; - MOS_fileList:=nil; End. { $Log$ - Revision 1.5 2004-05-09 02:02:42 karoly + Revision 1.6 2004-05-09 14:42:59 karoly + * again, few more new things added + + Revision 1.5 2004/05/09 02:02:42 karoly * more things got implemented Revision 1.4 2004/05/02 02:06:57 karoly @@ -930,6 +1051,9 @@ End. Revision 1.3 2004/05/01 15:09:47 karoly * first working system unit (very limited yet) + Revision 1.2  2004/04/08 06:28:29  karoly + * first steps to have a morphos system unit + Revision 1.1 2004/02/13 07:19:53 karoly - * quick hack from Linux system unit + * quick hack from Linux system unit }