diff --git a/rtl/morphos/dos.pp b/rtl/morphos/dos.pp index 97f21ed3cb..c5318117e7 100644 --- a/rtl/morphos/dos.pp +++ b/rtl/morphos/dos.pp @@ -1,11 +1,14 @@ { $Id$ This file is part of the Free Pascal run time library. - Copyright (c) 2004 by Karoly Balogh for Genesi Sarl + Copyright (c) 2004 by Karoly Balogh for Genesi S.a.r.l. - Heavily based on the Amiga/m68k RTL by Nils Sjoholm and + Heavily based on the Commodore Amiga/m68k RTL by Nils Sjoholm and Carl Eric Codere + 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. @@ -161,6 +164,11 @@ Procedure Keep(exitcode: word); implementation +{ * include MorphOS specific functions & definitions * } + +{$include execd.inc} +{$include execf.inc} + const DaysPerMonth : Array[1..12] of ShortInt = (031,028,031,030,031,030,031,031,030,031,030,031); @@ -399,12 +407,9 @@ Type Const { IO_COMMAND to use for adding a timer } - CMD_NONSTD = 9; TR_ADDREQUEST = CMD_NONSTD; TR_GETSYSTIME = CMD_NONSTD + 1; TR_SETSYSTIME = CMD_NONSTD + 2; - MEMF_PUBLIC = %000000000000000000000001; - MEMF_CLEAR = %000000010000000000000000; { To use any of the routines below, TimerBase must be set to point to the timer.device, either by calling CreateTimer or by pulling @@ -436,7 +441,7 @@ begin IOReq := NIL; if port <> NIL then begin - IOReq := exec_AllocMem(size, MEMF_CLEAR or MEMF_PUBLIC); + IOReq := AllocMem2(size, MEMF_CLEAR or MEMF_PUBLIC); if IOReq <> NIL then begin IOReq^.io_Message.mn_Node.ln_Type := 7; @@ -454,7 +459,7 @@ begin ioReq^.io_Message.mn_Node.ln_Type := $FF; ioReq^.io_Message.mn_ReplyPort := pMsgPort(-1); ioReq^.io_Device := pDevice(-1); - exec_FreeMem(ioReq, ioReq^.io_Message.mn_Length); + FreeMem2(ioReq, ioReq^.io_Message.mn_Length); end end; @@ -463,11 +468,11 @@ var sigbit : ShortInt; port : pMsgPort; begin - sigbit := exec_AllocSignal(-1); + sigbit := AllocSignal(-1); if sigbit = -1 then CreatePort := nil; - port := exec_Allocmem(sizeof(tMsgPort),MEMF_CLEAR or MEMF_PUBLIC); + port := AllocMem2(sizeof(tMsgPort),MEMF_CLEAR or MEMF_PUBLIC); if port = nil then begin - exec_FreeSignal(sigbit); + FreeSignal(sigbit); CreatePort := nil; end; with port^ do begin @@ -478,9 +483,9 @@ begin mp_Node.ln_Type := 4; mp_Flags := 0; mp_SigBit := sigbit; - mp_SigTask := exec_FindTask(nil); + mp_SigTask := FindTask(nil); end; - if assigned(name) then exec_AddPort(port) + if assigned(name) then AddPort(port) else NewList(addr(port^.mp_MsgList)); CreatePort := port; end; @@ -490,12 +495,12 @@ begin if port <> NIL then begin if port^.mp_Node.ln_Name <> NIL then - exec_RemPort(port); + RemPort(port); port^.mp_Node.ln_Type := $FF; port^.mp_MsgList.lh_Head := pNode(-1); - exec_FreeSignal(port^.mp_SigBit); - exec_FreeMem(port, sizeof(tMsgPort)); + FreeSignal(port^.mp_SigBit); + FreeMem2(port, sizeof(tMsgPort)); end; end; @@ -514,7 +519,7 @@ begin DeletePort(TimerPort); Create_Timer := Nil; end; - Error := exec_OpenDevice(TIMERNAME, theUnit, pIORequest(TimeReq), 0); + Error := OpenDevice(TIMERNAME, theUnit, pIORequest(TimeReq), 0); if Error <> 0 then begin DeleteExtIO(pIORequest(TimeReq)); DeletePort(TimerPort); @@ -531,7 +536,7 @@ begin WhichPort := WhichTimer^.tr_Node.io_Message.mn_ReplyPort; if assigned(WhichTimer) then begin - exec_CloseDevice(pIORequest(WhichTimer)); + CloseDevice(pIORequest(WhichTimer)); DeleteExtIO(pIORequest(WhichTimer)); end; if assigned(WhichPort) then @@ -550,7 +555,7 @@ begin tr^.tr_time.tv_secs := secs; tr^.tr_time.tv_micro := micro; tr^.tr_node.io_Command := TR_SETSYSTIME; - exec_DoIO(pIORequest(tr)); + DoIO(pIORequest(tr)); delete_timer(tr); set_new_time := 0; @@ -566,7 +571,7 @@ begin if tr = nil then get_sys_time := -1; tr^.tr_node.io_Command := TR_GETSYSTIME; - exec_DoIO(pIORequest(tr)); + DoIO(pIORequest(tr)); { structure assignment } tv^ := tr^.tr_time; @@ -766,7 +771,7 @@ Var Begin Free := -1; { Here we stop systemrequesters to appear } - myproc := pProcess(exec_FindTask(nil)); + myproc := pProcess(FindTask(nil)); OldWinPtr := myproc^.pr_WindowPtr; myproc^.pr_WindowPtr := Pointer(-1); { End of systemrequesterstop } @@ -797,7 +802,7 @@ Var Begin Size := -1; { Here we stop systemrequesters to appear } - myproc := pProcess(exec_FindTask(nil)); + myproc := pProcess(FindTask(nil)); OldWinPtr := myproc^.pr_WindowPtr; myproc^.pr_WindowPtr := Pointer(-1); { End of systemrequesterstop } @@ -1369,7 +1374,10 @@ End. { $Log$ - Revision 1.4 2004-05-16 00:24:19 karoly + Revision 1.5 2004-06-13 22:51:08 karoly + * cleanup and changes to use new includes + + Revision 1.4 2004/05/16 00:24:19 karoly * some cleanup Revision 1.3 2004/05/13 00:48:52 karoly diff --git a/rtl/morphos/system.pp b/rtl/morphos/system.pp index 45047858e6..419c18b92f 100644 --- a/rtl/morphos/system.pp +++ b/rtl/morphos/system.pp @@ -58,6 +58,8 @@ const MorphOS structures *****************************************************************************} +{$include execd.inc} + type PClockData = ^TClockData; TClockData = packed Record @@ -95,79 +97,6 @@ type 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; @@ -199,44 +128,6 @@ type pr_CES : DWord; { Error stream - IF NULL, use pr_COS } 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 = packed record - dd_Library: TLibrary; - end; - - PUnit = ^tUnit; - TUnit = packed 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 } @@ -304,43 +195,6 @@ var MorphOS functions *****************************************************************************} -{ exec.library functions } - -function exec_OpenLibrary(libname: PChar location 'a1'; - libver: LongInt location 'd0'): Pointer; SysCall MOS_ExecBase 552; -procedure exec_CloseLibrary(libhandle: Pointer location 'a1'); SysCall MOS_ExecBase 414; - -function exec_CreatePool(memflags: LongInt location 'd0'; - puddleSize: LongInt location 'd1'; - threshSize: LongInt location 'd2'): Pointer; SysCall MOS_ExecBase 696; -procedure exec_DeletePool(poolHeader: Pointer location 'a0'); SysCall MOS_ExecBase 702; -function exec_AllocPooled(poolHeader: Pointer location 'a0'; - memSize: LongInt location 'd0'): Pointer; SysCall MOS_ExecBase 708; -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; - -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 } function dos_Output: LongInt; SysCall MOS_DOSBase 60; @@ -427,10 +281,21 @@ implementation {$I system.inc} + +{***************************************************************************** + MorphOS functions +*****************************************************************************} + +{ exec.library functions } + +{$include execf.inc} + + {***************************************************************************** System Dependent Structures/Consts *****************************************************************************} + { Errors from dos_IoErr(), etc. } const ERROR_NO_FREE_STORE = 103; @@ -493,23 +358,6 @@ const EXCLUSIVE_LOCK = -1; ACCESS_WRITE = EXCLUSIVE_LOCK; -{ Memory flags } -const - 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_CLEAR = 1 Shl 16; - MEMF_LARGEST = 1 Shl 17; - MEMF_REVERSE = 1 Shl 18; - MEMF_TOTAL = 1 Shl 19; - - MEMF_NO_EXPUNGE = 1 Shl 31; - const CTRL_C = 20; { Error code on CTRL-C press } SIGBREAKF_CTRL_C = $1000; { CTRL-C signal flags } @@ -620,16 +468,16 @@ begin { may call I/O routines, which in turn might call } { halt, so a recursive stack crash } if BreakOn then begin - if (exec_SetSignal(0,0) and SIGBREAKF_CTRL_C)<>0 then - exec_SetSignal(0,SIGBREAKF_CTRL_C); + if (SetSignal(0,0) and SIGBREAKF_CTRL_C)<>0 then + SetSignal(0,SIGBREAKF_CTRL_C); end; { Closing opened files } CloseList(MOS_fileList); - if MOS_UtilityBase<>nil then exec_CloseLibrary(MOS_UtilityBase); - if MOS_DOSBase<>nil then exec_CloseLibrary(MOS_DOSBase); - if MOS_heapPool<>nil then exec_DeletePool(MOS_heapPool); + 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; @@ -683,9 +531,9 @@ end; procedure checkCTRLC; begin if BreakOn then begin - if (exec_SetSignal(0,0) And SIGBREAKF_CTRL_C)<>0 then begin + if (SetSignal(0,0) And SIGBREAKF_CTRL_C)<>0 then begin { Clear CTRL-C signal } - exec_SetSignal(0,SIGBREAKF_CTRL_C); + SetSignal(0,SIGBREAKF_CTRL_C); Halt(CTRL_C); end; end; @@ -865,7 +713,7 @@ end; { must return the first address of new data space or nil if fail } function Sbrk(size : longint):pointer; begin - Sbrk:=exec_AllocPooled(MOS_heapPool,size); + Sbrk:=AllocPooled(MOS_heapPool,size); end; {$I heap.inc} @@ -1240,32 +1088,32 @@ end; procedure SysInitMorphOS; var self: PProcess; begin - self:=PProcess(exec_FindTask(nil)); + self:=PProcess(FindTask(nil)); if self^.pr_CLI=0 then begin { if we're running from Ambient/Workbench, we catch its message } - exec_WaitPort(@self^.pr_MsgPort); - MOS_ambMsg:=exec_GetMsg(@self^.pr_MsgPort); + WaitPort(@self^.pr_MsgPort); + MOS_ambMsg:=GetMsg(@self^.pr_MsgPort); end; - MOS_DOSBase:=exec_OpenLibrary('dos.library',50); + MOS_DOSBase:=OpenLibrary('dos.library',50); if MOS_DOSBase=nil then Halt(1); - MOS_UtilityBase:=exec_OpenLibrary('utility.library',50); + MOS_UtilityBase:=OpenLibrary('utility.library',50); if MOS_UtilityBase=nil then Halt(1); { Creating the memory pool for growing heap } - MOS_heapPool:=exec_CreatePool(MEMF_FAST,growheapsize2,growheapsize1); + MOS_heapPool:=CreatePool(MEMF_FAST,growheapsize2,growheapsize1); if MOS_heapPool=nil then Halt(1); if MOS_ambMsg=nil then begin StdInputHandle:=dos_Input; StdOutputHandle:=dos_Output; end else begin - MOS_ConHandle:=dos_Open(MOS_ConName,1005); - if MOS_ConHandle<>0 then begin - StdInputHandle:=MOS_ConHandle; - StdOutputHandle:=MOS_ConHandle; - end else - Halt(1); + MOS_ConHandle:=dos_Open(MOS_ConName,1005); + if MOS_ConHandle<>0 then begin + StdInputHandle:=MOS_ConHandle; + StdOutputHandle:=MOS_ConHandle; + end else + Halt(1); end; end; @@ -1314,7 +1162,10 @@ end. { $Log$ - Revision 1.12 2004-06-06 23:31:13 karoly + Revision 1.13 2004-06-13 22:50:47 karoly + * cleanup and changes to use new includes + + Revision 1.12 2004/06/06 23:31:13 karoly * fixed dos_UnLockDosList from being nonsense, and some cleanup Revision 1.11 2004/06/06 19:18:05 karoly