mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 06:29:38 +02:00
+ added syscalls and structures necessary for DOS unit
This commit is contained in:
parent
440758c2bd
commit
3bc4c92de0
@ -56,6 +56,17 @@ const
|
|||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
type
|
type
|
||||||
|
PClockData = ^TClockData;
|
||||||
|
TClockData = packed Record
|
||||||
|
sec : Word;
|
||||||
|
min : Word;
|
||||||
|
hour : Word;
|
||||||
|
mday : Word;
|
||||||
|
month: Word;
|
||||||
|
year : Word;
|
||||||
|
wday : Word;
|
||||||
|
end;
|
||||||
|
|
||||||
TDateStamp = packed record
|
TDateStamp = packed record
|
||||||
ds_Days : LongInt; { Number of days since Jan. 1, 1978 }
|
ds_Days : LongInt; { Number of days since Jan. 1, 1978 }
|
||||||
ds_Minute : LongInt; { Number of minutes past midnight }
|
ds_Minute : LongInt; { Number of minutes past midnight }
|
||||||
@ -185,15 +196,104 @@ type
|
|||||||
pr_CES : DWord; { Error stream - IF NULL, use pr_COS }
|
pr_CES : DWord; { Error stream - IF NULL, use pr_COS }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
PLibrary = ^TLibrary;
|
||||||
|
TLibrary = packed record
|
||||||
|
lib_Node : tNode;
|
||||||
|
lib_Flags,
|
||||||
|
lib_pad : Byte;
|
||||||
|
lib_NegSize, { number of bytes before library }
|
||||||
|
lib_PosSize, { number of bytes after library }
|
||||||
|
lib_Version, { major }
|
||||||
|
lib_Revision: Word; { minor }
|
||||||
|
lib_IdString: PChar; { ASCII identification }
|
||||||
|
lib_Sum : LongInt; { the checksum itself }
|
||||||
|
lib_OpenCnt : Word; { number of current opens }
|
||||||
|
end; { * Warning: size is not a longword multiple ! * }
|
||||||
|
|
||||||
|
PDevice = ^TDevice;
|
||||||
|
tDevice = record
|
||||||
|
dd_Library: TLibrary;
|
||||||
|
end;
|
||||||
|
|
||||||
|
PUnit = ^tUnit;
|
||||||
|
TUnit = record
|
||||||
|
unit_MsgPort: TMsgPort; { queue for unprocessed messages }
|
||||||
|
{ instance of msgport is recommended }
|
||||||
|
unit_flags,
|
||||||
|
unit_pad : Byte;
|
||||||
|
unit_OpenCnt: Word; { number of active opens }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PIORequest = ^TIORequest;
|
||||||
|
TIORequest = packed record
|
||||||
|
io_Message: TMessage;
|
||||||
|
io_Device : PDevice; { device node pointer }
|
||||||
|
io_Unit : PUnit; { unit (driver private)}
|
||||||
|
io_Command: Word; { device command }
|
||||||
|
io_Flags : Byte;
|
||||||
|
io_Error : Shortint; { error or warning num }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PInfoData = ^TInfoData;
|
||||||
|
TInfoData = packed record
|
||||||
|
id_NumSoftErrors: LongInt; { number of soft errors on disk }
|
||||||
|
id_UnitNumber : LongInt; { Which unit disk is (was) mounted on }
|
||||||
|
id_DiskState : LongInt; { See defines below }
|
||||||
|
id_NumBlocks : LongInt; { Number of blocks on disk }
|
||||||
|
id_NumBlocksUsed: LongInt; { Number of block in use }
|
||||||
|
id_BytesPerBlock: LongInt;
|
||||||
|
id_DiskType : LongInt; { Disk Type code }
|
||||||
|
id_VolumeNode : LongInt; { BCPL pointer to volume node }
|
||||||
|
id_InUse : LongInt; { Flag, zero if not in use }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PChain = ^TChain;
|
||||||
|
TChain = packed record
|
||||||
|
an_Child : PChain;
|
||||||
|
an_Parent: PChain;
|
||||||
|
an_Lock : LongInt;
|
||||||
|
an_info : TFileInfoBlock;
|
||||||
|
an_Flags : ShortInt;
|
||||||
|
an_string: Array[0..0] of char;
|
||||||
|
end;
|
||||||
|
|
||||||
|
PAnchorPath = ^TAnchorPath;
|
||||||
|
TAnchorPath = packed record
|
||||||
|
ap_Base : PChain; { pointer to first anchor }
|
||||||
|
ap_First : PChain; { pointer to last anchor }
|
||||||
|
ap_BreakBits: LongInt; { Bits we want to break on }
|
||||||
|
ap_FondBreak: LongInt; { Bits we broke on. Also returns ERROR_BREAK }
|
||||||
|
ap_Flags : ShortInt; { New use for extra word. }
|
||||||
|
ap_reserved : Byte;
|
||||||
|
ap_StrLen : Word;
|
||||||
|
ap_Info : TFileInfoBlock;
|
||||||
|
ap_Buf : array[0..0] of Char; { Buffer for path name, allocated by user }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PDOSList = ^TDOSList;
|
||||||
|
TDOSList = packed record
|
||||||
|
dol_Next: LongInt; { bptr to next device on list }
|
||||||
|
dol_Type: LongInt; { see DLT below }
|
||||||
|
dol_Task: Pointer; { ptr to handler task }
|
||||||
|
dol_Lock: LongInt;
|
||||||
|
dol_Misc: array[0..23] of ShortInt;
|
||||||
|
dol_Name: LongInt; { bptr to bcpl name }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
var
|
var
|
||||||
MOS_ExecBase: Pointer; external name '_ExecBase';
|
MOS_ExecBase : Pointer; external name '_ExecBase';
|
||||||
MOS_DOSBase : Pointer;
|
MOS_DOSBase : Pointer;
|
||||||
|
MOS_UtilityBase: Pointer;
|
||||||
|
|
||||||
MOS_heapPool: Pointer; { pointer for the OS pool for growing the heap }
|
MOS_heapPool: Pointer; { pointer for the OS pool for growing the heap }
|
||||||
MOS_origDir : LongInt; { original directory on startup }
|
MOS_origDir : LongInt; { original directory on startup }
|
||||||
MOS_ambMsg : PMessage;
|
MOS_ambMsg : PMessage;
|
||||||
MOS_ConName : PChar ='CON:10/30/620/100/FPC Console Output/AUTO/CLOSE/WAIT';
|
MOS_ConName : PChar ='CON:10/30/620/100/FPC Console Output/AUTO/CLOSE/WAIT';
|
||||||
|
|
||||||
|
MOS_argc: LongInt;
|
||||||
|
MOS_argv: PPChar;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
MorphOS functions
|
MorphOS functions
|
||||||
@ -218,11 +318,30 @@ function exec_FindTask(tname: PChar location 'a1'): PTask; SysCall MOS_ExecBase
|
|||||||
function exec_GetMsg(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 372;
|
function exec_GetMsg(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 372;
|
||||||
function exec_WaitPort(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 384;
|
function exec_WaitPort(port: PMsgPort location 'a0'): PMessage; SysCall MOS_ExecBase 384;
|
||||||
|
|
||||||
|
function exec_AllocMem(byteSize: LongInt location 'd0';
|
||||||
|
requirements: LongInt location 'd1'): Pointer; SysCall MOS_ExecBase 198;
|
||||||
|
procedure exec_FreeMem(memoryBlock: Pointer location 'a1';
|
||||||
|
byteSize: LongInt location 'd0'); SysCall MOS_ExecBase 210;
|
||||||
|
function exec_AllocSignal(signalNum: LongInt location 'd0'): ShortInt; SysCall MOS_ExecBase 330;
|
||||||
|
procedure exec_FreeSignal(signalNum: LongInt location 'd0'); SysCall MOS_ExecBase 336;
|
||||||
|
|
||||||
|
procedure exec_AddPort(port: PMsgPort location 'a1'); SysCall MOS_ExecBase 354;
|
||||||
|
procedure exec_RemPort(port: PMsgPort location 'a1'); SysCall MOS_ExecBase 360;
|
||||||
|
|
||||||
|
function exec_DoIO(ioRequest: PIORequest location 'a1'): ShortInt; SysCall MOS_ExecBase 456;
|
||||||
|
function exec_OpenDevice(const devName: PChar location 'a0';
|
||||||
|
unite: LongInt location 'd0';
|
||||||
|
ioRequest: PIORequest location 'a1';
|
||||||
|
flags: LongInt location 'd1'): ShortInt; SysCall MOS_ExecBase 444;
|
||||||
|
procedure exec_CloseDevice(ioRequest: PIORequest location 'a1'); SysCall MOS_ExecBase 450;
|
||||||
|
|
||||||
|
|
||||||
{ dos.library functions }
|
{ dos.library functions }
|
||||||
|
|
||||||
function dos_Output: LongInt; SysCall MOS_DOSBase 60;
|
function dos_Output: LongInt; SysCall MOS_DOSBase 60;
|
||||||
function dos_Input: LongInt; SysCall MOS_DOSBase 54;
|
function dos_Input: LongInt; SysCall MOS_DOSBase 54;
|
||||||
function dos_IoErr: LongInt; SysCall MOS_DOSBase 132;
|
function dos_IoErr: LongInt; SysCall MOS_DOSBase 132;
|
||||||
|
function dos_GetArgStr: PChar; SysCall MOS_DOSBase 534;
|
||||||
|
|
||||||
function dos_Open(fname: PChar location 'd1';
|
function dos_Open(fname: PChar location 'd1';
|
||||||
accessMode: LongInt location 'd2'): LongInt; SysCall MOS_DOSBase 30;
|
accessMode: LongInt location 'd2'): LongInt; SysCall MOS_DOSBase 30;
|
||||||
@ -257,9 +376,43 @@ procedure dos_Unlock(lock: LongInt location 'd1'); SysCall MOS_DOSBase 90;
|
|||||||
function dos_CurrentDir(lock: LongInt location 'd1'): LongInt; SysCall MOS_DOSBase 126;
|
function dos_CurrentDir(lock: LongInt location 'd1'): LongInt; SysCall MOS_DOSBase 126;
|
||||||
function dos_Examine(lock: LongInt location 'd1';
|
function dos_Examine(lock: LongInt location 'd1';
|
||||||
FileInfoBlock: Pointer location 'd2'): Boolean; SysCall MOS_DOSBase 102;
|
FileInfoBlock: Pointer location 'd2'): Boolean; SysCall MOS_DOSBase 102;
|
||||||
|
function dos_NameFromLock(lock: LongInt location 'd1';
|
||||||
|
buffer: PChar location 'd2';
|
||||||
|
len: LongInt location 'd3'): Boolean; SysCall MOS_DOSBase 402;
|
||||||
|
function dos_Info(lock: LongInt location 'd1';
|
||||||
|
parameterBlock: PInfoData location 'd2'): Boolean; SysCall MOS_DOSBase 114;
|
||||||
|
|
||||||
function dos_CreateDir(dname: PChar location 'd1'): LongInt; SysCall MOS_DOSBase 120;
|
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;
|
function dos_DateStamp(var ds: TDateStamp location 'd1'): LongInt; SysCall MOS_DOSBase 192;
|
||||||
|
|
||||||
|
function dos_SystemTagList(command: PChar location 'd1';
|
||||||
|
tags: Pointer location 'd2'): LongInt; SysCall MOS_DOSBase 606;
|
||||||
|
function dos_GetVar(vname: PChar location 'd1';
|
||||||
|
buffer: PChar location 'd2';
|
||||||
|
size: LongInt location 'd3';
|
||||||
|
flags: LongInt location 'd4'): LongInt; SysCall MOS_DOSBase 906;
|
||||||
|
function dos_MatchFirst(pat: PChar location 'd1';
|
||||||
|
anchor: PAnchorPath location 'd2'): LongInt; SysCall MOS_DOSBase 822;
|
||||||
|
function dos_MatchNext(anchor: PAnchorPath location 'd1'): LongInt; SysCall MOS_DOSBase 828;
|
||||||
|
procedure dos_MatchEnd(anchor: PAnchorPath location 'd1') SysCall MOS_DOSBase 834;
|
||||||
|
|
||||||
|
function dos_LockDosList(flags: LongInt location 'd1'): PDOSList; SysCall MOS_DOSBase 654;
|
||||||
|
procedure dos_UnLockDosList(flags: LongInt location 'd2'); SysCall MOS_DOSBase 660;
|
||||||
|
function dos_NextDosEntry(dlist: PDOSList location 'd1';
|
||||||
|
flags: LongInt location 'd2'): PDOSList; SysCall MOS_DOSBase 690;
|
||||||
|
|
||||||
|
function dos_SetProtection(name: PChar location 'd1';
|
||||||
|
mask: LongInt location 'd2'): Boolean; SysCall MOS_DOSBase 186;
|
||||||
|
function dos_SetFileDate(name: PChar location 'd1';
|
||||||
|
date: PDateStamp location 'd2'): Boolean; SysCall MOS_DOSBase 396;
|
||||||
|
|
||||||
|
|
||||||
|
{ utility.library functions }
|
||||||
|
|
||||||
|
function util_Date2Amiga(date: PClockData location 'a0'): LongInt; SysCall MOS_UtilityBase 126;
|
||||||
|
procedure util_Amiga2Date(amigatime: LongInt location 'd0';
|
||||||
|
resultat: PClockData location 'a0'); SysCall MOS_UtilityBase 120;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -465,6 +618,7 @@ begin
|
|||||||
{ Closing opened files }
|
{ Closing opened files }
|
||||||
CloseList(MOS_fileList);
|
CloseList(MOS_fileList);
|
||||||
|
|
||||||
|
if MOS_UtilityBase<>nil then exec_CloseLibrary(MOS_UtilityBase);
|
||||||
if MOS_DOSBase<>nil then exec_CloseLibrary(MOS_DOSBase);
|
if MOS_DOSBase<>nil then exec_CloseLibrary(MOS_DOSBase);
|
||||||
if MOS_heapPool<>nil then exec_DeletePool(MOS_heapPool);
|
if MOS_heapPool<>nil then exec_DeletePool(MOS_heapPool);
|
||||||
haltproc(ExitCode);
|
haltproc(ExitCode);
|
||||||
@ -528,6 +682,71 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
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(MOS_argv,argvlen*sizeof(pointer));
|
||||||
|
for i:=oldargvlen to argvlen-1 do
|
||||||
|
MOS_argv[i]:=nil;
|
||||||
|
end;
|
||||||
|
{ use realloc to reuse already existing memory }
|
||||||
|
sysreallocmem(MOS_argv[idx],len+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
count: word;
|
||||||
|
start: word;
|
||||||
|
localindex: word;
|
||||||
|
p : pchar;
|
||||||
|
temp : string;
|
||||||
|
|
||||||
|
begin
|
||||||
|
p:=dos_GetArgStr;
|
||||||
|
argvlen:=0;
|
||||||
|
|
||||||
|
{ Set argv[0] }
|
||||||
|
temp:=paramstr(0);
|
||||||
|
allocarg(0,length(temp));
|
||||||
|
move(temp[1],MOS_argv[0]^,length(temp));
|
||||||
|
MOS_argv[0][length(temp)]:=#0;
|
||||||
|
|
||||||
|
{ check if we're started from Ambient }
|
||||||
|
if MOS_ambMsg<>nil then
|
||||||
|
begin
|
||||||
|
MOS_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],MOS_argv[localindex]^,count-start);
|
||||||
|
MOS_argv[localindex][count-start]:=#0;
|
||||||
|
inc(localindex);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
MOS_argc:=localindex;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
ParamStr/Randomize
|
ParamStr/Randomize
|
||||||
@ -536,17 +755,19 @@ end;
|
|||||||
{ number of args }
|
{ number of args }
|
||||||
function paramcount : longint;
|
function paramcount : longint;
|
||||||
begin
|
begin
|
||||||
{paramcount := argc - 1;}
|
if MOS_ambMsg<>nil then
|
||||||
paramcount:=0;
|
paramcount:=0
|
||||||
|
else
|
||||||
|
paramcount:=MOS_argc-1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ argument number l }
|
{ argument number l }
|
||||||
function paramstr(l : longint) : string;
|
function paramstr(l : longint) : string;
|
||||||
begin
|
begin
|
||||||
{if (l>=0) and (l+1<=argc) then
|
if (l>=0) and (l+1<=MOS_argc) then
|
||||||
paramstr:=strpas(argv[l])
|
paramstr:=strpas(MOS_argv[l])
|
||||||
else}
|
else
|
||||||
paramstr:='';
|
paramstr:='';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ set randseed to a new pseudo random value }
|
{ set randseed to a new pseudo random value }
|
||||||
@ -966,6 +1187,8 @@ begin
|
|||||||
|
|
||||||
MOS_DOSBase:=exec_OpenLibrary('dos.library',50);
|
MOS_DOSBase:=exec_OpenLibrary('dos.library',50);
|
||||||
if MOS_DOSBase=nil then Halt(1);
|
if MOS_DOSBase=nil then Halt(1);
|
||||||
|
MOS_UtilityBase:=exec_OpenLibrary('utility.library',50);
|
||||||
|
if MOS_UtilityBase=nil then Halt(1);
|
||||||
|
|
||||||
{ Creating the memory pool for growing heap }
|
{ Creating the memory pool for growing heap }
|
||||||
MOS_heapPool:=exec_CreatePool(MEMF_FAST,growheapsize2,growheapsize1);
|
MOS_heapPool:=exec_CreatePool(MEMF_FAST,growheapsize2,growheapsize1);
|
||||||
@ -1022,13 +1245,14 @@ Begin
|
|||||||
{ Setup heap }
|
{ Setup heap }
|
||||||
InitHeap;
|
InitHeap;
|
||||||
// SysInitExceptions;
|
// SysInitExceptions;
|
||||||
{ Arguments }
|
|
||||||
// SetupCmdLine;
|
|
||||||
// SysInitExecPath;
|
|
||||||
{ Setup stdin, stdout and stderr }
|
{ Setup stdin, stdout and stderr }
|
||||||
SysInitStdIO;
|
SysInitStdIO;
|
||||||
{ Reset IO Error }
|
{ Reset IO Error }
|
||||||
InOutRes:=0;
|
InOutRes:=0;
|
||||||
|
{ Arguments }
|
||||||
|
// SetupCmdLine;
|
||||||
|
// SysInitExecPath;
|
||||||
|
GenerateArgs;
|
||||||
(* This should be changed to a real value during *)
|
(* This should be changed to a real value during *)
|
||||||
(* thread driver initialization if appropriate. *)
|
(* thread driver initialization if appropriate. *)
|
||||||
ThreadID := 1;
|
ThreadID := 1;
|
||||||
@ -1039,7 +1263,10 @@ End.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.7 2004-05-12 15:34:16 karoly
|
Revision 1.8 2004-05-12 20:26:04 karoly
|
||||||
|
+ added syscalls and structures necessary for DOS unit
|
||||||
|
|
||||||
|
Revision 1.7 2004/05/12 15:34:16 karoly
|
||||||
* fixed startup code from endless wait when not started from Ambient
|
* fixed startup code from endless wait when not started from Ambient
|
||||||
|
|
||||||
Revision 1.6 2004/05/09 14:42:59 karoly
|
Revision 1.6 2004/05/09 14:42:59 karoly
|
||||||
|
Loading…
Reference in New Issue
Block a user