123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 2004 by Karoly Balogh for Genesi Sarl
- System unit for MorphOS.
- 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.
- **********************************************************************}
- { These things are set in the makefile, }
- { But you can override them here.}
- { If you use an aout system, set the conditional AOUT}
- { $Define AOUT}
- unit {$ifdef VER1_0}SysMorph{$else}System{$endif};
- interface
- {$define FPC_IS_SYSTEM}
- {$I systemh.inc}
- type
- THandle = DWord;
- {$I heaph.inc}
- const
- LineEnding = #10;
- LFNSupport = True;
- DirectorySeparator = '/';
- DriveSeparator = ':';
- PathSeparator = ';';
- const
- UnusedHandle : LongInt = -1;
- StdInputHandle : LongInt = 0;
- StdOutputHandle : LongInt = 0;
- StdErrorHandle : LongInt = 0;
- FileNameCaseSensitive : Boolean = False;
- sLineBreak : string[1] = LineEnding;
- DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
- var
- MOS_ExecBase : LongInt; external name '_ExecBase';
- int_heap : LongInt; external name 'HEAP';
- int_heapsize : LongInt; external name 'HEAPSIZE';
- function exec_OpenLibrary(libname: PChar location 'a1'; libver: LongInt location 'd0'; LIBBASE: DWORD LOCATION 'LIBBASE') : LongInt; SysCall 552;
- implementation
- {$I system.inc}
- { OS dependant parts }
- { $I errno.inc} // error numbers
- { $I bunxtype.inc} // c-types, unix base types, unix
- // base structures
- { $I ossysc.inc} // base syscalls
- { $I osmain.inc} // base wrappers *nix RTL (derivatives)
- {*****************************************************************************
- Misc. System Dependent Functions
- *****************************************************************************}
- procedure haltproc(e:longint);cdecl;external name '_haltproc';
- procedure System_exit;
- begin
- haltproc(ExitCode);
- End;
- {*****************************************************************************
- ParamStr/Randomize
- *****************************************************************************}
- { number of args }
- function paramcount : longint;
- begin
- {paramcount := argc - 1;}
- paramcount:=0;
- end;
- { argument number l }
- function paramstr(l : longint) : string;
- begin
- {if (l>=0) and (l+1<=argc) then
- paramstr:=strpas(argv[l])
- else}
- paramstr:='';
- end;
- { set randseed to a new pseudo random value }
- procedure randomize;
- begin
- {regs.realeax:=$2c00;
- sysrealintr($21,regs);
- hl:=regs.realedx and $ffff;
- randseed:=hl*$10000+ (regs.realecx and $ffff);}
- randseed:=0;
- end;
- {*****************************************************************************
- Heap Management
- *****************************************************************************}
- { first address of heap }
- function getheapstart:pointer;
- begin
- getheapstart:=@int_heap;
- end;
- { current length of heap }
- function getheapsize:longint;
- begin
- getheapsize:=int_heapsize;
- end;
- { function to allocate size bytes more for the program }
- { must return the first address of new data space or nil if fail }
- function Sbrk(size : longint):pointer;{assembler;
- asm
- movl size,%eax
- pushl %eax
- call ___sbrk
- addl $4,%esp
- end;}
- begin
- Sbrk:=nil;
- end;
- {$I heap.inc}
- {****************************************************************************
- Low level File Routines
- All these functions can set InOutRes on errors
- ****************************************************************************}
- { close a file from the handle value }
- procedure do_close(handle : longint);
- begin
- InOutRes:=1;
- end;
- procedure do_erase(p : pchar);
- begin
- InOutRes:=1;
- end;
- procedure do_rename(p1,p2 : pchar);
- begin
- InOutRes:=1;
- end;
- function do_write(h:longint; addr: pointer; len: longint) : longint;
- begin
- InOutRes:=1;
- end;
- function do_read(h:longint; addr: pointer; len: longint) : longint;
- begin
- InOutRes:=1;
- end;
- function do_filepos(handle : longint) : longint;
- begin
- InOutRes:=1;
- end;
- procedure do_seek(handle,pos : longint);
- begin
- InOutRes:=1;
- end;
- function do_seekend(handle:longint):longint;
- begin
- InOutRes:=1;
- end;
- function do_filesize(handle : longint) : longint;
- begin
- InOutRes:=1;
- end;
- { truncate at a given position }
- procedure do_truncate (handle,pos:longint);
- begin
- InOutRes:=1;
- end;
- procedure do_open(var f;p:pchar;flags:longint);
- {
- filerec and textrec have both handle and mode as the first items so
- they could use the same routine for opening/creating.
- when (flags and $10) the file will be append
- when (flags and $100) the file will be truncate/rewritten
- when (flags and $1000) there is no check for close (needed for textfiles)
- }
- begin
- InOutRes:=1;
- end;
- function do_isdevice(handle:longint):boolean;
- begin
- do_isdevice:=false;
- end;
- {*****************************************************************************
- UnTyped File Handling
- *****************************************************************************}
- {$i file.inc}
- {*****************************************************************************
- Typed File Handling
- *****************************************************************************}
- {$i typefile.inc}
- {*****************************************************************************
- Text File Handling
- *****************************************************************************}
- {$I text.inc}
- {*****************************************************************************
- Directory Handling
- *****************************************************************************}
- procedure mkdir(const s : string);[IOCheck];
- begin
- InOutRes:=1;
- end;
- procedure rmdir(const s : string);[IOCheck];
- begin
- InOutRes:=1;
- end;
- procedure chdir(const s : string);[IOCheck];
- begin
- InOutRes:=1;
- end;
- procedure GetDir (DriveNr: byte; var Dir: ShortString);
- begin
- InOutRes := 1;
- end;
- procedure SysInitStdIO;
- begin
- OpenStdIO(Input,fmInput,StdInputHandle);
- OpenStdIO(Output,fmOutput,StdOutputHandle);
- OpenStdIO(StdOut,fmOutput,StdOutputHandle);
-
- { * MorphOS doesn't have a separate stderr, just like AmigaOS (???) * }
- StdErrorHandle:=StdOutputHandle;
- // OpenStdIO(StdErr,fmOutput,StdErrorHandle);
- end;
- {procedure SysInitExecPath;
- var
- hs : string[16];
- link : string;
- i : longint;
- begin
- str(Fpgetpid,hs);
- hs:='/proc/'+hs+'/exe'#0;
- i:=Fpreadlink(@hs[1],@link[1],high(link));
- { it must also be an absolute filename, linux 2.0 points to a memory
- location so this will skip that }
- if (i>0) and (link[1]='/') then
- begin
- link[0]:=chr(i);
- ExecPathStr:=link;
- end;
- end;
- }
- Begin
- IsConsole := TRUE;
- IsLibrary := FALSE;
- StackLength := InitialStkLen;
- StackBottom := Sptr - StackLength;
- { Set up signals handlers }
- // InstallSignals;
- { Setup heap }
- InitHeap;
- // SysInitExceptions;
- { Arguments }
- // SetupCmdLine;
- // SysInitExecPath;
- { Setup stdin, stdout and stderr }
- // SysInitStdIO;
- { Reset IO Error }
- InOutRes:=0;
- (* This should be changed to a real value during *)
- (* thread driver initialization if appropriate. *)
- // ThreadID := 1;
- {$ifdef HASVARIANT}
- initvariantmanager;
- {$endif HASVARIANT}
- End.
- {
- $Log$
- Revision 1.3 2004-05-01 15:09:47 karoly
- * first working system unit (very limited yet)
- Revision 1.1 2004/02/13 07:19:53 karoly
- * quick hack from Linux system unit
- }
|