mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 05:00:07 +02:00
+ some basic system unit. morphos one with _lot_ of commented out parts
git-svn-id: trunk@2392 -
This commit is contained in:
parent
9a879981ed
commit
fe6637884d
7
.gitattributes
vendored
7
.gitattributes
vendored
@ -3585,6 +3585,13 @@ rtl/amiga/os.inc svneol=native#text/plain
|
||||
rtl/amiga/powerpc/prt0.as -text
|
||||
rtl/amiga/printer.pp svneol=native#text/plain
|
||||
rtl/amiga/readme -text
|
||||
rtl/amiga/sysdir.inc -text
|
||||
rtl/amiga/sysfile.inc -text
|
||||
rtl/amiga/sysheap.inc -text
|
||||
rtl/amiga/sysos.inc -text
|
||||
rtl/amiga/sysosh.inc -text
|
||||
rtl/amiga/system.pp -text
|
||||
rtl/amiga/systhrd.inc -text
|
||||
rtl/arm/arm.inc svneol=native#text/plain
|
||||
rtl/arm/int64p.inc svneol=native#text/plain
|
||||
rtl/arm/makefile.cpu -text
|
||||
|
99
rtl/amiga/sysdir.inc
Normal file
99
rtl/amiga/sysdir.inc
Normal file
@ -0,0 +1,99 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 1999-2000 by Florian Klaempfl and Pavel Ozerski
|
||||
member of the Free Pascal development team.
|
||||
|
||||
FPC Pascal system unit for the Win32 API.
|
||||
|
||||
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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
Directory Handling
|
||||
*****************************************************************************}
|
||||
procedure mkdir(const s : string);[IOCheck];
|
||||
var
|
||||
tmpStr : array[0..255] of char;
|
||||
tmpLock: LongInt;
|
||||
begin
|
||||
checkCTRLC;
|
||||
if (s='') or (InOutRes<>0) then exit;
|
||||
tmpStr:=PathConv(s)+#0;
|
||||
// tmpLock:=dosCreateDir(@tmpStr);
|
||||
if tmpLock=0 then begin
|
||||
// dosError2InOut(IoErr);
|
||||
exit;
|
||||
end;
|
||||
// UnLock(tmpLock);
|
||||
end;
|
||||
|
||||
procedure rmdir(const s : string);[IOCheck];
|
||||
var
|
||||
tmpStr : array[0..255] of Char;
|
||||
begin
|
||||
checkCTRLC;
|
||||
if (s='.') then InOutRes:=16;
|
||||
If (s='') or (InOutRes<>0) then exit;
|
||||
tmpStr:=PathConv(s)+#0;
|
||||
// if not dosDeleteFile(@tmpStr) then
|
||||
// dosError2InOut(IoErr);
|
||||
end;
|
||||
|
||||
procedure chdir(const s : string);[IOCheck];
|
||||
var
|
||||
tmpStr : array[0..255] of Char;
|
||||
tmpLock: LongInt;
|
||||
// FIB : PFileInfoBlock;
|
||||
begin
|
||||
checkCTRLC;
|
||||
If (s='') or (InOutRes<>0) then exit;
|
||||
tmpStr:=PathConv(s)+#0;
|
||||
tmpLock:=0;
|
||||
|
||||
{ Changing the directory is a pretty complicated affair }
|
||||
{ 1) Obtain a lock on the directory }
|
||||
{ 2) CurrentDir the lock }
|
||||
// tmpLock:=Lock(@tmpStr,SHARED_LOCK);
|
||||
if tmpLock=0 then begin
|
||||
// dosError2InOut(IoErr);
|
||||
exit;
|
||||
end;
|
||||
{
|
||||
FIB:=nil;
|
||||
new(FIB);
|
||||
|
||||
if (Examine(tmpLock,FIB)=True) and (FIB^.fib_DirEntryType>0) then begin
|
||||
tmpLock:=CurrentDir(tmpLock);
|
||||
if MOS_OrigDir=0 then begin
|
||||
MOS_OrigDir:=tmpLock;
|
||||
tmpLock:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
if tmpLock<>0 then Unlock(tmpLock);
|
||||
if assigned(FIB) then dispose(FIB);
|
||||
}
|
||||
end;
|
||||
|
||||
procedure GetDir (DriveNr: byte; var Dir: ShortString);
|
||||
var tmpbuf: array[0..255] of char;
|
||||
begin
|
||||
checkCTRLC;
|
||||
Dir:='';
|
||||
{
|
||||
if not GetCurrentDirName(tmpbuf,256) then
|
||||
dosError2InOut(IoErr)
|
||||
else
|
||||
Dir:=strpas(tmpbuf);
|
||||
}
|
||||
end;
|
||||
|
||||
|
||||
|
400
rtl/amiga/sysfile.inc
Normal file
400
rtl/amiga/sysfile.inc
Normal file
@ -0,0 +1,400 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2005 by Free Pascal development team
|
||||
|
||||
Low level file functions
|
||||
|
||||
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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{ Enable this for file handling debug }
|
||||
{DEFINE MOSFPC_FILEDEBUG}
|
||||
|
||||
{*****************************************************************************
|
||||
MorphOS File-handling Support Functions
|
||||
*****************************************************************************}
|
||||
type
|
||||
{ AmigaOS does not automatically close opened files on exit back to }
|
||||
{ the operating system, therefore as a precuation we close all files }
|
||||
{ manually on exit. }
|
||||
PFileList = ^TFileList;
|
||||
TFileList = record { no packed, must be correctly aligned }
|
||||
handle : LongInt; { Handle to file }
|
||||
next : PFileList; { Next file in list }
|
||||
buffered : boolean; { used buffered I/O? }
|
||||
end;
|
||||
|
||||
var
|
||||
MOS_fileList: PFileList; public name 'MOS_FILELIST'; { List pointer to opened files }
|
||||
|
||||
{ Function to be called at program shutdown, to close all opened files }
|
||||
procedure CloseList(l: PFileList);
|
||||
var
|
||||
tmpNext : PFileList;
|
||||
tmpHandle : LongInt;
|
||||
begin
|
||||
if l=nil then exit;
|
||||
|
||||
{ First, close all tracked files }
|
||||
tmpNext:=l^.next;
|
||||
while tmpNext<>nil do begin
|
||||
tmpHandle:=tmpNext^.handle;
|
||||
if (tmpHandle<>StdInputHandle) and (tmpHandle<>StdOutputHandle)
|
||||
and (tmpHandle<>StdErrorHandle) then begin
|
||||
// dosClose(tmpHandle);
|
||||
end;
|
||||
tmpNext:=tmpNext^.next;
|
||||
end;
|
||||
|
||||
{ Next, erase the linked list }
|
||||
while l<>nil do begin
|
||||
tmpNext:=l;
|
||||
l:=l^.next;
|
||||
dispose(tmpNext);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ Function to be called to add a file to the opened file list }
|
||||
procedure AddToList(var l: PFileList; h: LongInt); alias: 'ADDTOLIST'; [public];
|
||||
var
|
||||
p : PFileList;
|
||||
inList: Boolean;
|
||||
begin
|
||||
inList:=False;
|
||||
if l<>nil then begin
|
||||
{ if there is a valid filelist, search for the value }
|
||||
{ in the list to avoid double additions }
|
||||
p:=l;
|
||||
while (p^.next<>nil) and (not inList) do
|
||||
if p^.next^.handle=h then inList:=True
|
||||
else p:=p^.next;
|
||||
p:=nil;
|
||||
end else begin
|
||||
{ if the list is not yet allocated, allocate it. }
|
||||
New(l);
|
||||
l^.next:=nil;
|
||||
end;
|
||||
|
||||
if not inList then begin
|
||||
New(p);
|
||||
p^.handle:=h;
|
||||
p^.buffered:=False;
|
||||
p^.next:=l^.next;
|
||||
l^.next:=p;
|
||||
end
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
else
|
||||
RawDoFmt('FPC_FILE_DEBUG: Error! Trying add filehandle a filehandle twice: $%lx !'+#10,@h,pointer(1),nil);
|
||||
{$ENDIF}
|
||||
;
|
||||
end;
|
||||
|
||||
{ Function to be called to remove a file from the list }
|
||||
function RemoveFromList(var l: PFileList; h: LongInt): boolean; alias: 'REMOVEFROMLIST'; [public];
|
||||
var
|
||||
p : PFileList;
|
||||
inList : Boolean;
|
||||
tmpList: PFileList;
|
||||
begin
|
||||
inList:=False;
|
||||
if l=nil then begin
|
||||
RemoveFromList:=inList;
|
||||
exit;
|
||||
end;
|
||||
|
||||
p:=l;
|
||||
while (p^.next<>nil) and (not inList) do
|
||||
if p^.next^.handle=h then inList:=True
|
||||
else p:=p^.next;
|
||||
|
||||
if inList then begin
|
||||
tmpList:=p^.next^.next;
|
||||
dispose(p^.next);
|
||||
p^.next:=tmpList;
|
||||
end
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
else
|
||||
RawDoFmt('FPC_FILE_DEBUG: Error! Trying to remove not existing filehandle: $%lx !'+#10,@h,pointer(1),nil);
|
||||
{$ENDIF}
|
||||
;
|
||||
|
||||
RemoveFromList:=inList;
|
||||
end;
|
||||
|
||||
{ Function to check if file is in the list }
|
||||
function CheckInList(var l: PFileList; h: LongInt): pointer; alias: 'CHECKINLIST'; [public];
|
||||
var
|
||||
p : PFileList;
|
||||
inList : Pointer;
|
||||
tmpList: PFileList;
|
||||
|
||||
begin
|
||||
inList:=nil;
|
||||
if l=nil then begin
|
||||
CheckInList:=inList;
|
||||
exit;
|
||||
end;
|
||||
|
||||
p:=l;
|
||||
while (p^.next<>nil) and (inList=nil) do
|
||||
if p^.next^.handle=h then inList:=p^.next
|
||||
else p:=p^.next;
|
||||
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
if inList=nil then
|
||||
RawDoFmt('FPC_FILE_DEBUG: Warning! Check for not existing filehandle: $%lx !'+#10,@h,pointer(1),nil);
|
||||
{$ENDIF}
|
||||
|
||||
CheckInList:=inList;
|
||||
end;
|
||||
|
||||
|
||||
{****************************************************************************
|
||||
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
|
||||
if RemoveFromList(MOS_fileList,handle) then begin
|
||||
{ Do _NOT_ check CTRL_C on Close, because it will conflict
|
||||
with System_Exit! }
|
||||
// if not dosClose(handle) then
|
||||
// dosError2InOut(IoErr);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure do_erase(p : pchar);
|
||||
var
|
||||
tmpStr: array[0..255] of Char;
|
||||
begin
|
||||
tmpStr:=PathConv(strpas(p))+#0;
|
||||
// checkCTRLC;
|
||||
// if not dosDeleteFile(@tmpStr) then
|
||||
// dosError2InOut(IoErr);
|
||||
end;
|
||||
|
||||
procedure do_rename(p1,p2 : pchar);
|
||||
{ quite stack-effective code, huh? :) damn path conversions... (KB) }
|
||||
var
|
||||
tmpStr1: array[0..255] of Char;
|
||||
tmpStr2: array[0..255] of Char;
|
||||
begin
|
||||
tmpStr1:=PathConv(strpas(p1))+#0;
|
||||
tmpStr2:=PathConv(strpas(p2))+#0;
|
||||
// checkCTRLC;
|
||||
// if not dosRename(@tmpStr1,@tmpStr2) then
|
||||
// dosError2InOut(IoErr);
|
||||
end;
|
||||
|
||||
function do_write(h: longint; addr: pointer; len: longint) : longint;
|
||||
var dosResult: LongInt;
|
||||
begin
|
||||
// checkCTRLC;
|
||||
do_write:=0;
|
||||
if (len<=0) or (h<=0) then exit;
|
||||
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
if not ((h=StdOutputHandle) or (h=StdInputHandle) or
|
||||
(h=StdErrorHandle)) then CheckInList(MOS_fileList,h);
|
||||
{$ENDIF}
|
||||
|
||||
// dosResult:=dosWrite(h,addr,len);
|
||||
// if dosResult<0 then begin
|
||||
// dosError2InOut(IoErr);
|
||||
// end else begin
|
||||
// do_write:=dosResult;
|
||||
// end;
|
||||
end;
|
||||
|
||||
function do_read(h: longint; addr: pointer; len: longint) : longint;
|
||||
var dosResult: LongInt;
|
||||
begin
|
||||
checkCTRLC;
|
||||
do_read:=0;
|
||||
if (len<=0) or (h<=0) then exit;
|
||||
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
if not ((h=StdOutputHandle) or (h=StdInputHandle) or
|
||||
(h=StdErrorHandle)) then CheckInList(MOS_fileList,h);
|
||||
{$ENDIF}
|
||||
{
|
||||
dosResult:=dosRead(h,addr,len);
|
||||
if dosResult<0 then begin
|
||||
dosError2InOut(IoErr);
|
||||
end else begin
|
||||
do_read:=dosResult;
|
||||
end
|
||||
}
|
||||
end;
|
||||
|
||||
function do_filepos(handle: longint) : longint;
|
||||
var dosResult: LongInt;
|
||||
begin
|
||||
// checkCTRLC;
|
||||
do_filepos:=-1;
|
||||
if CheckInList(MOS_fileList,handle)<>nil then begin
|
||||
|
||||
{ Seeking zero from OFFSET_CURRENT to find out where we are }
|
||||
{
|
||||
dosResult:=dosSeek(handle,0,OFFSET_CURRENT);
|
||||
if dosResult<0 then begin
|
||||
dosError2InOut(IoErr);
|
||||
end else begin
|
||||
do_filepos:=dosResult;
|
||||
end;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure do_seek(handle, pos: longint);
|
||||
begin
|
||||
// checkCTRLC;
|
||||
if CheckInList(MOS_fileList,handle)<>nil then begin
|
||||
|
||||
{ Seeking from OFFSET_BEGINNING }
|
||||
{
|
||||
if dosSeek(handle,pos,OFFSET_BEGINNING)<0 then
|
||||
dosError2InOut(IoErr);
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
function do_seekend(handle: longint):longint;
|
||||
var dosResult: LongInt;
|
||||
begin
|
||||
// checkCTRLC;
|
||||
do_seekend:=-1;
|
||||
if CheckInList(MOS_fileList,handle)<>nil then begin
|
||||
|
||||
{ Seeking to OFFSET_END }
|
||||
{
|
||||
dosResult:=dosSeek(handle,0,OFFSET_END);
|
||||
if dosResult<0 then begin
|
||||
dosError2InOut(IoErr);
|
||||
end else begin
|
||||
do_seekend:=dosResult;
|
||||
end;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
function do_filesize(handle : longint) : longint;
|
||||
var currfilepos: longint;
|
||||
begin
|
||||
// checkCTRLC;
|
||||
do_filesize:=-1;
|
||||
if CheckInList(MOS_fileList,handle)<>nil then begin
|
||||
|
||||
currfilepos:=do_filepos(handle);
|
||||
{ We have to do this twice, because seek returns the OLD position }
|
||||
do_filesize:=do_seekend(handle);
|
||||
do_filesize:=do_seekend(handle);
|
||||
do_seek(handle,currfilepos);
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
{ truncate at a given position }
|
||||
procedure do_truncate(handle, pos: longint);
|
||||
begin
|
||||
// checkCTRLC;
|
||||
if CheckInList(MOS_fileList,handle)<>nil then begin
|
||||
|
||||
{ Seeking from OFFSET_BEGINNING }
|
||||
{
|
||||
if SetFileSize(handle,pos,OFFSET_BEGINNING)<0 then
|
||||
dosError2InOut(IoErr);
|
||||
}
|
||||
end;
|
||||
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)
|
||||
}
|
||||
var
|
||||
handle : LongInt;
|
||||
openflags: LongInt;
|
||||
tmpStr : array[0..255] of Char;
|
||||
begin
|
||||
tmpStr:=PathConv(strpas(p))+#0;
|
||||
|
||||
{ close first if opened }
|
||||
if ((flags and $10000)=0) then begin
|
||||
case filerec(f).mode of
|
||||
fminput,fmoutput,fminout : Do_Close(filerec(f).handle);
|
||||
fmclosed : ;
|
||||
else begin
|
||||
inoutres:=102; {not assigned}
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ reset file handle }
|
||||
filerec(f).handle:=UnusedHandle;
|
||||
|
||||
{ convert filemode to filerec modes }
|
||||
{ READ/WRITE on existing file }
|
||||
{ RESET/APPEND }
|
||||
// openflags:=MODE_OLDFILE;
|
||||
case (flags and 3) of
|
||||
0 : filerec(f).mode:=fminput;
|
||||
1 : filerec(f).mode:=fmoutput;
|
||||
2 : filerec(f).mode:=fminout;
|
||||
end;
|
||||
|
||||
{ rewrite (create a new file) }
|
||||
// if (flags and $1000)<>0 then openflags:=MODE_NEWFILE;
|
||||
|
||||
{ empty name is special }
|
||||
if p[0]=#0 then begin
|
||||
case filerec(f).mode of
|
||||
fminput :
|
||||
filerec(f).handle:=StdInputHandle;
|
||||
fmappend,
|
||||
fmoutput : begin
|
||||
filerec(f).handle:=StdOutputHandle;
|
||||
filerec(f).mode:=fmoutput; {fool fmappend}
|
||||
end;
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
{
|
||||
handle:=Open(@tmpStr,openflags);
|
||||
if handle=0 then begin
|
||||
dosError2InOut(IoErr);
|
||||
end else begin
|
||||
AddToList(MOS_fileList,handle);
|
||||
filerec(f).handle:=handle;
|
||||
end;
|
||||
}
|
||||
{ append mode }
|
||||
if ((Flags and $100)<>0) and
|
||||
(FileRec(F).Handle<>UnusedHandle) then begin
|
||||
do_seekend(filerec(f).handle);
|
||||
filerec(f).mode:=fmoutput; {fool fmappend}
|
||||
end;
|
||||
end;
|
||||
|
||||
function do_isdevice(handle: longint): boolean;
|
||||
begin
|
||||
if (handle=StdOutputHandle) or (handle=StdInputHandle) or
|
||||
(handle=StdErrorHandle) then
|
||||
do_isdevice:=True
|
||||
else
|
||||
do_isdevice:=False;
|
||||
end;
|
||||
|
51
rtl/amiga/sysheap.inc
Normal file
51
rtl/amiga/sysheap.inc
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2005 by Free Pascal development team
|
||||
|
||||
Low level memory functions
|
||||
|
||||
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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{ Enable this for memory allocation debugging }
|
||||
{DEFINE MOSFPC_MEMDEBUG}
|
||||
|
||||
{*****************************************************************************
|
||||
OS Memory allocation / deallocation
|
||||
****************************************************************************}
|
||||
|
||||
function SysOSAlloc(size: ptrint): pointer;
|
||||
{$IFDEF MOSFPC_MEMDEBUG}
|
||||
var values: array[0..2] of dword;
|
||||
{$ENDIF}
|
||||
begin
|
||||
{ result:=AllocPooled(MOS_heapPool,size);}
|
||||
{$IFDEF MOSFPC_MEMDEBUG}
|
||||
values[0]:=dword(result);
|
||||
values[1]:=dword(size);
|
||||
values[2]:=DWord(Sptr-StackBottom);
|
||||
RawDoFmt('FPC_MEM_DEBUG: $%lx:=SysOSAlloc(%ld), free stack: %ld bytes'+#10,@values,pointer(1),nil);
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{$define HAS_SYSOSFREE}
|
||||
|
||||
procedure SysOSFree(p: pointer; size: ptrint);
|
||||
{$IFDEF MOSFPC_MEMDEBUG}
|
||||
var values: array[0..2] of dword;
|
||||
{$ENDIF}
|
||||
begin
|
||||
{ FreePooled(MOS_heapPool,p,size);}
|
||||
{$IFDEF MOSFPC_MEMDEBUG}
|
||||
values[0]:=dword(p);
|
||||
values[1]:=dword(size);
|
||||
values[2]:=DWord(Sptr-StackBottom);
|
||||
RawDoFmt('FPC_MEM_DEBUG: SysOSFree($%lx,%ld), free stack: %ld bytes'+#10,@values,pointer(1),nil);
|
||||
{$ENDIF}
|
||||
end;
|
145
rtl/amiga/sysos.inc
Normal file
145
rtl/amiga/sysos.inc
Normal file
@ -0,0 +1,145 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2001 by Free Pascal development team
|
||||
|
||||
This file implements all the base types and limits required
|
||||
for a minimal POSIX compliant subset required to port the compiler
|
||||
to a new OS.
|
||||
|
||||
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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{*****************************************************************************
|
||||
MorphOS structures
|
||||
*****************************************************************************}
|
||||
|
||||
{include execd.inc}
|
||||
{include timerd.inc}
|
||||
{include doslibd.inc}
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
MorphOS functions
|
||||
*****************************************************************************}
|
||||
|
||||
{ exec.library functions }
|
||||
|
||||
{include execf.inc}
|
||||
{include doslibf.inc}
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
System Dependent Structures/Consts
|
||||
*****************************************************************************}
|
||||
|
||||
const
|
||||
CTRL_C = 20; { Error code on CTRL-C press }
|
||||
|
||||
{ Used for CTRL_C checking in I/O calls }
|
||||
procedure checkCTRLC;
|
||||
begin
|
||||
{
|
||||
if BreakOn then begin
|
||||
if (SetSignal(0,0) And SIGBREAKF_CTRL_C)<>0 then begin
|
||||
{ Clear CTRL-C signal }
|
||||
SetSignal(0,SIGBREAKF_CTRL_C);
|
||||
Halt(CTRL_C);
|
||||
end;
|
||||
end;
|
||||
}
|
||||
end;
|
||||
|
||||
|
||||
{ Converts a MorphOS dos.library error code to a TP compatible error code }
|
||||
{ Based on 1.0.x Amiga RTL }
|
||||
procedure dosError2InOut(errno: LongInt);
|
||||
begin
|
||||
{
|
||||
case errno of
|
||||
ERROR_BAD_NUMBER,
|
||||
ERROR_ACTION_NOT_KNOWN,
|
||||
ERROR_NOT_IMPLEMENTED : InOutRes := 1;
|
||||
|
||||
ERROR_OBJECT_NOT_FOUND : InOutRes := 2;
|
||||
ERROR_DIR_NOT_FOUND : InOutRes := 3;
|
||||
ERROR_DISK_WRITE_PROTECTED : InOutRes := 150;
|
||||
ERROR_OBJECT_WRONG_TYPE : InOutRes := 151;
|
||||
|
||||
ERROR_OBJECT_EXISTS,
|
||||
ERROR_DELETE_PROTECTED,
|
||||
ERROR_WRITE_PROTECTED,
|
||||
ERROR_READ_PROTECTED,
|
||||
ERROR_OBJECT_IN_USE,
|
||||
ERROR_DIRECTORY_NOT_EMPTY : InOutRes := 5;
|
||||
|
||||
ERROR_NO_MORE_ENTRIES : InOutRes := 18;
|
||||
ERROR_RENAME_ACROSS_DEVICES : InOutRes := 17;
|
||||
ERROR_DISK_FULL : InOutRes := 101;
|
||||
ERROR_INVALID_RESIDENT_LIBRARY : InoutRes := 153;
|
||||
ERROR_BAD_HUNK : InOutRes := 153;
|
||||
ERROR_NOT_A_DOS_DISK : InOutRes := 157;
|
||||
|
||||
ERROR_NO_DISK,
|
||||
ERROR_DISK_NOT_VALIDATED,
|
||||
ERROR_DEVICE_NOT_MOUNTED : InOutRes := 152;
|
||||
|
||||
ERROR_SEEK_ERROR : InOutRes := 156;
|
||||
|
||||
ERROR_LOCK_COLLISION,
|
||||
ERROR_LOCK_TIMEOUT,
|
||||
ERROR_UNLOCK_ERROR,
|
||||
ERROR_INVALID_LOCK,
|
||||
ERROR_INVALID_COMPONENT_NAME,
|
||||
ERROR_BAD_STREAM_NAME,
|
||||
ERROR_FILE_NOT_OBJECT : InOutRes := 6;
|
||||
else
|
||||
InOutres := errno;
|
||||
end;
|
||||
}
|
||||
end;
|
||||
|
||||
|
||||
{ Converts an Unix-like path to Amiga-like path }
|
||||
function PathConv(path: string): string; alias: 'PATHCONV'; [public];
|
||||
var tmppos: longint;
|
||||
begin
|
||||
{ check for short paths }
|
||||
if length(path)<=2 then begin
|
||||
if (path='.') or (path='./') then path:='' else
|
||||
if path='..' then path:='/' else
|
||||
if path='*' then path:='#?';
|
||||
end else begin
|
||||
{ convert parent directories }
|
||||
tmppos:=pos('../',path);
|
||||
while tmppos<>0 do begin
|
||||
{ delete .. to have / as parent dir sign }
|
||||
delete(path,tmppos,2);
|
||||
tmppos:=pos('../',path);
|
||||
end;
|
||||
{ convert current directories }
|
||||
tmppos:=pos('./',path);
|
||||
while tmppos<>0 do begin
|
||||
{ delete ./ since we doesn't need to sign current directory }
|
||||
delete(path,tmppos,2);
|
||||
tmppos:=pos('./',path);
|
||||
end;
|
||||
{ convert wildstart to #? }
|
||||
tmppos:=pos('*',path);
|
||||
while tmppos<>0 do begin
|
||||
delete(path,tmppos,1);
|
||||
insert('#?',path,tmppos);
|
||||
tmppos:=pos('*',path);
|
||||
end;
|
||||
end;
|
||||
PathConv:=path;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
33
rtl/amiga/sysosh.inc
Normal file
33
rtl/amiga/sysosh.inc
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2001 by Free Pascal development team
|
||||
|
||||
This file implements all the base types and limits required
|
||||
for a minimal POSIX compliant subset required to port the compiler
|
||||
to a new OS.
|
||||
|
||||
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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
{Platform specific information}
|
||||
type
|
||||
{$ifdef CPU64}
|
||||
THandle = Int64;
|
||||
{$else CPU64}
|
||||
THandle = Longint;
|
||||
{$endif CPU64}
|
||||
TThreadID = THandle;
|
||||
|
||||
PRTLCriticalSection = ^TRTLCriticalSection;
|
||||
TRTLCriticalSection = record
|
||||
Locked: boolean
|
||||
end;
|
||||
|
||||
|
||||
|
353
rtl/amiga/system.pp
Normal file
353
rtl/amiga/system.pp
Normal file
@ -0,0 +1,353 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2004 by Karoly Balogh for Genesi S.a.r.l.
|
||||
|
||||
System unit for MorphOS/PowerPC
|
||||
|
||||
Uses parts of the Commodore Amiga/68k port by Carl Eric Codere
|
||||
and Nils Sjoholm
|
||||
|
||||
MorphOS port was done on a free Pegasos II/G4 machine
|
||||
provided by 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.
|
||||
|
||||
**********************************************************************}
|
||||
|
||||
unit System;
|
||||
|
||||
interface
|
||||
|
||||
{$define FPC_IS_SYSTEM}
|
||||
|
||||
{$I systemh.inc}
|
||||
|
||||
const
|
||||
LineEnding = #10;
|
||||
LFNSupport = True;
|
||||
DirectorySeparator = '/';
|
||||
DriveSeparator = ':';
|
||||
PathSeparator = ';';
|
||||
maxExitCode = 255;
|
||||
MaxPathLen = 256;
|
||||
|
||||
const
|
||||
UnusedHandle : LongInt = -1;
|
||||
StdInputHandle : LongInt = 0;
|
||||
StdOutputHandle : LongInt = 0;
|
||||
StdErrorHandle : LongInt = 0;
|
||||
|
||||
FileNameCaseSensitive : Boolean = False;
|
||||
CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
|
||||
|
||||
sLineBreak : string[1] = LineEnding;
|
||||
DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
|
||||
|
||||
BreakOn : Boolean = True;
|
||||
|
||||
|
||||
var
|
||||
MOS_ExecBase : Pointer; external name '_ExecBase';
|
||||
MOS_DOSBase : Pointer;
|
||||
MOS_UtilityBase: Pointer;
|
||||
|
||||
MOS_heapPool : Pointer; { pointer for the OS pool for growing the heap }
|
||||
MOS_origDir : LongInt; { original directory on startup }
|
||||
MOS_ambMsg : Pointer;
|
||||
MOS_ConName : PChar ='CON:10/30/620/100/FPC Console Output/AUTO/CLOSE/WAIT';
|
||||
MOS_ConHandle: LongInt;
|
||||
|
||||
argc: LongInt;
|
||||
argv: PPChar;
|
||||
envp: PPChar;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
{$I system.inc}
|
||||
|
||||
{$IFDEF MOSFPC_FILEDEBUG}
|
||||
{$WARNING Compiling with file debug enabled!}
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF MOSFPC_MEMDEBUG}
|
||||
{$WARNING Compiling with memory debug enabled!}
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
Misc. System Dependent Functions
|
||||
*****************************************************************************}
|
||||
|
||||
procedure haltproc(e:longint);cdecl;external name '_haltproc';
|
||||
|
||||
procedure System_exit;
|
||||
begin
|
||||
{
|
||||
{ We must remove the CTRL-C FLAG here because halt }
|
||||
{ may call I/O routines, which in turn might call }
|
||||
{ halt, so a recursive stack crash }
|
||||
if BreakOn then begin
|
||||
if (SetSignal(0,0) and SIGBREAKF_CTRL_C)<>0 then
|
||||
SetSignal(0,SIGBREAKF_CTRL_C);
|
||||
end;
|
||||
|
||||
{ Closing opened files }
|
||||
CloseList(MOS_fileList);
|
||||
|
||||
{ Changing back to original directory if changed }
|
||||
if MOS_origDir<>0 then begin
|
||||
CurrentDir(MOS_origDir);
|
||||
end;
|
||||
|
||||
if MOS_UtilityBase<>nil then CloseLibrary(MOS_UtilityBase);
|
||||
if MOS_DOSBase<>nil then CloseLibrary(MOS_DOSBase);
|
||||
if MOS_heapPool<>nil then DeletePool(MOS_heapPool);
|
||||
haltproc(ExitCode);
|
||||
}
|
||||
end;
|
||||
|
||||
{ Generates correct argument array on startup }
|
||||
procedure GenerateArgs;
|
||||
var
|
||||
argvlen : longint;
|
||||
|
||||
procedure allocarg(idx,len:longint);
|
||||
var
|
||||
i,oldargvlen : longint;
|
||||
begin
|
||||
if idx>=argvlen then
|
||||
begin
|
||||
oldargvlen:=argvlen;
|
||||
argvlen:=(idx+8) and (not 7);
|
||||
sysreallocmem(argv,argvlen*sizeof(pointer));
|
||||
for i:=oldargvlen to argvlen-1 do
|
||||
argv[i]:=nil;
|
||||
end;
|
||||
ArgV [Idx] := SysAllocMem (Succ (Len));
|
||||
end;
|
||||
|
||||
var
|
||||
count: word;
|
||||
start: word;
|
||||
localindex: word;
|
||||
p : pchar;
|
||||
temp : string;
|
||||
|
||||
begin
|
||||
// p:=GetArgStr;
|
||||
argvlen:=0;
|
||||
|
||||
{ Set argv[0] }
|
||||
temp:=paramstr(0);
|
||||
allocarg(0,length(temp));
|
||||
move(temp[1],argv[0]^,length(temp));
|
||||
argv[0][length(temp)]:=#0;
|
||||
|
||||
{ check if we're started from Ambient }
|
||||
if MOS_ambMsg<>nil then
|
||||
begin
|
||||
argc:=0;
|
||||
exit;
|
||||
end;
|
||||
|
||||
{ Handle the other args }
|
||||
count:=0;
|
||||
{ first index is one }
|
||||
localindex:=1;
|
||||
while (p[count]<>#0) do
|
||||
begin
|
||||
while (p[count]=' ') or (p[count]=#9) or (p[count]=LineEnding) do inc(count);
|
||||
start:=count;
|
||||
while (p[count]<>#0) and (p[count]<>' ') and (p[count]<>#9) and (p[count]<>LineEnding) do inc(count);
|
||||
if (count-start>0) then
|
||||
begin
|
||||
allocarg(localindex,count-start);
|
||||
move(p[start],argv[localindex]^,count-start);
|
||||
argv[localindex][count-start]:=#0;
|
||||
inc(localindex);
|
||||
end;
|
||||
end;
|
||||
argc:=localindex;
|
||||
end;
|
||||
|
||||
function GetProgDir: String;
|
||||
var
|
||||
s1 : String;
|
||||
alock : LongInt;
|
||||
counter: Byte;
|
||||
begin
|
||||
GetProgDir:='';
|
||||
FillChar(s1,255,#0);
|
||||
{ GetLock of program directory }
|
||||
{
|
||||
alock:=GetProgramDir;
|
||||
if alock<>0 then begin
|
||||
if NameFromLock(alock,@s1[1],255) then begin
|
||||
counter:=1;
|
||||
while (s1[counter]<>#0) and (counter<>0) do Inc(counter);
|
||||
s1[0]:=Char(counter-1);
|
||||
GetProgDir:=s1;
|
||||
end;
|
||||
end;
|
||||
}
|
||||
end;
|
||||
|
||||
function GetProgramName: String;
|
||||
{ Returns ONLY the program name }
|
||||
var
|
||||
s1 : String;
|
||||
counter: Byte;
|
||||
begin
|
||||
GetProgramName:='';
|
||||
FillChar(s1,255,#0);
|
||||
{
|
||||
if GetProgramName(@s1[1],255) then begin
|
||||
{ now check out and assign the length of the string }
|
||||
counter := 1;
|
||||
while (s1[counter]<>#0) and (counter<>0) do Inc(counter);
|
||||
s1[0]:=Char(counter-1);
|
||||
|
||||
{ now remove any component path which should not be there }
|
||||
for counter:=length(s1) downto 1 do
|
||||
if (s1[counter] = '/') or (s1[counter] = ':') then break;
|
||||
{ readjust counterv to point to character }
|
||||
if counter<>1 then Inc(counter);
|
||||
|
||||
GetProgramName:=copy(s1,counter,length(s1));
|
||||
end;
|
||||
}
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
ParamStr/Randomize
|
||||
*****************************************************************************}
|
||||
|
||||
{ number of args }
|
||||
function paramcount : longint;
|
||||
begin
|
||||
if MOS_ambMsg<>nil then
|
||||
paramcount:=0
|
||||
else
|
||||
paramcount:=argc-1;
|
||||
end;
|
||||
|
||||
{ argument number l }
|
||||
function paramstr(l : longint) : string;
|
||||
var
|
||||
s1: String;
|
||||
begin
|
||||
paramstr:='';
|
||||
if MOS_ambMsg<>nil then exit;
|
||||
|
||||
if l=0 then begin
|
||||
s1:=GetProgDir;
|
||||
if s1[length(s1)]=':' then paramstr:=s1+GetProgramName
|
||||
else paramstr:=s1+'/'+GetProgramName;
|
||||
end else begin
|
||||
if (l>0) and (l+1<=argc) then paramstr:=strpas(argv[l]);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ set randseed to a new pseudo random value }
|
||||
procedure randomize;
|
||||
//var tmpTime: TDateStamp;
|
||||
begin
|
||||
// DateStamp(@tmpTime);
|
||||
// randseed:=tmpTime.ds_tick;
|
||||
end;
|
||||
|
||||
|
||||
{ MorphOS specific startup }
|
||||
procedure SysInitMorphOS;
|
||||
//var self: PProcess;
|
||||
begin
|
||||
{
|
||||
self:=PProcess(FindTask(nil));
|
||||
if self^.pr_CLI=0 then begin
|
||||
{ if we're running from Ambient/Workbench, we catch its message }
|
||||
WaitPort(@self^.pr_MsgPort);
|
||||
MOS_ambMsg:=GetMsg(@self^.pr_MsgPort);
|
||||
end;
|
||||
|
||||
MOS_DOSBase:=OpenLibrary('dos.library',50);
|
||||
if MOS_DOSBase=nil then Halt(1);
|
||||
MOS_UtilityBase:=OpenLibrary('utility.library',50);
|
||||
if MOS_UtilityBase=nil then Halt(1);
|
||||
|
||||
{ Creating the memory pool for growing heap }
|
||||
MOS_heapPool:=CreatePool(MEMF_FAST,growheapsize2,growheapsize1);
|
||||
if MOS_heapPool=nil then Halt(1);
|
||||
|
||||
if MOS_ambMsg=nil then begin
|
||||
StdInputHandle:=dosInput;
|
||||
StdOutputHandle:=dosOutput;
|
||||
end else begin
|
||||
MOS_ConHandle:=Open(MOS_ConName,MODE_OLDFILE);
|
||||
if MOS_ConHandle<>0 then begin
|
||||
StdInputHandle:=MOS_ConHandle;
|
||||
StdOutputHandle:=MOS_ConHandle;
|
||||
end else
|
||||
Halt(1);
|
||||
end;
|
||||
}
|
||||
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);
|
||||
// OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
|
||||
end;
|
||||
|
||||
function GetProcessID: SizeUInt;
|
||||
begin
|
||||
// GetProcessID:=SizeUInt(FindTask(NIL));
|
||||
end;
|
||||
|
||||
function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
|
||||
begin
|
||||
result := stklen;
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
SysResetFPU;
|
||||
IsConsole := TRUE;
|
||||
IsLibrary := FALSE;
|
||||
StackLength := CheckInitialStkLen(InitialStkLen);
|
||||
StackBottom := Sptr - StackLength;
|
||||
{ OS specific startup }
|
||||
MOS_ambMsg:=nil;
|
||||
MOS_origDir:=0;
|
||||
MOS_fileList:=nil;
|
||||
envp:=nil;
|
||||
SysInitMorphOS;
|
||||
{ Set up signals handlers }
|
||||
// InstallSignals;
|
||||
{ Setup heap }
|
||||
InitHeap;
|
||||
SysInitExceptions;
|
||||
{ Setup stdin, stdout and stderr }
|
||||
SysInitStdIO;
|
||||
{ Reset IO Error }
|
||||
InOutRes:=0;
|
||||
{ Arguments }
|
||||
GenerateArgs;
|
||||
InitSystemThreads;
|
||||
initvariantmanager;
|
||||
initwidestringmanager;
|
||||
end.
|
25
rtl/amiga/systhrd.inc
Normal file
25
rtl/amiga/systhrd.inc
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2002 by Peter Vreman,
|
||||
member of the Free Pascal development team.
|
||||
|
||||
Linux (pthreads) threading support implementation
|
||||
|
||||
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 InitSystemThreads;
|
||||
begin
|
||||
{ This should be changed to a real value during
|
||||
thread driver initialization if appropriate. }
|
||||
ThreadID := 1;
|
||||
SetNoThreadManager;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user