#ifndef __INC_POS_PROTO_PEXEC2_H
#define __INC_POS_PROTO_PEXEC2_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>pExec2.h<<   08 Mar 1997    08:38:57 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_LIST_H
#include <pExec/List.h>
#endif



#ifdef __cplusplus
extern "C" {
#endif

/*------ execbase -----------------------------------------------------*/
VOID pOS_ColdReboot(VOID);
VOID pOS_WriteDebug(_R_A0 const VOID*,_R_D0 size_t,_R_D1 ULONG type);
VOID pOS_LockSemaphoreList(VOID);
VOID pOS_UnlockSemaphoreList(VOID);
VOID pOS_LockMsgPortList(VOID);
VOID pOS_UnlockMsgPortList(VOID);
VOID pOS_LockClassList(VOID);
VOID pOS_UnlockClassList(VOID);
VOID pOS_LockLibraryList(VOID);
VOID pOS_UnlockLibraryList(VOID);
VOID pOS_LockDeviceList(VOID);
VOID pOS_UnlockDeviceList(VOID);
VOID pOS_LockTaskList(VOID);
VOID pOS_UnlockTaskList(VOID);


/*------ tasks --------------------------------------------------------*/
APTR  pOS_AddTask(_R_A0 struct pOS_Task*,_R_A1 APTR initPC,_R_A2 APTR finalPC);
VOID  pOS_RemTask(_R_A0 __ARID__ struct pOS_Task*);
struct pOS_Task *pOS_FindTask(_R_A0 const CHAR*);
SBYTE pOS_SetTaskPriority(_R_A0 struct pOS_Task*,_R_D0 SLONG priority);
ULONG pOS_SetSignal(_R_D0 ULONG newSignals,_R_D1 ULONG signalSet);
ULONG pOS_WaitSignal(_R_D0 ULONG signalSet);
VOID  pOS_SendSignal(_R_A0 struct pOS_Task*,_R_D0 ULONG signalSet);
__ARID__ ULONG pOS_AllocSignal(_R_D0 ULONG signalNum);
VOID  pOS_FreeSignal(_R_D0 __ARID__ ULONG signalNum);
__ARID__ ULONG pOS_AllocTrap(_R_D0 ULONG trapNum);
VOID  pOS_FreeTrap(_R_D0 __ARID__ ULONG trapNum);
VOID  pOS_ForbidSchedul(VOID);
VOID  pOS_PermitSchedul(VOID);
struct pOS_Task* pOS_CreateTask(_R_A0 const CHAR* name,_R_D0 SLONG pri,
          _R_A1 APTR func,_R_D1 size_t stackSize,_R_D2 size_t taskSize,
          _R_D3 ULONG userData0,_R_A2 struct pOS_TaskControl*);
VOID  pOS_CacheClearE(_R_A0 APTR,_R_D0 size_t,_R_D1 ULONG);
VOID  pOS_CacheClearU(VOID);
ULONG pOS_CacheControl(_R_D0 ULONG,_R_D1 ULONG);
VOID  pOS_StackSwap(_R_A0 struct pOS_StackSwapData*);
VOID  pOS_ForbidIRQ(VOID);
VOID  pOS_PermitIRQ(VOID);
ULONG pOS_WaitTimeSignal(_R_D0 ULONG signalSet,_R_D1 ULONG micros);
VOID  pOS_DeleteTask(_R_A0 __ARID__ struct pOS_Task*,_R_A1 struct pOS_Task* sigTask,_R_D0 ULONG signalSet);
SBYTE pOS_SetTaskXPri(_R_A0 struct pOS_Task*,_R_D0 SLONG runPri,_R_D1 SLONG sysPri,_R_D2 ULONG mode);
ULONG pOS_Supervisor(_R_A0 ULONG(*func)(VOID) );



/*------ messages -----------------------------------------------------*/
VOID  pOS_AddPort(_R_A0 struct pOS_MsgPort*);
VOID  pOS_RemPort(_R_A0 struct pOS_MsgPort*);
VOID  pOS_PutMsg(_R_A0 struct pOS_MsgPort*,_R_A1 __ARID__ struct pOS_Message*);
__ARID__ struct pOS_Message *pOS_GetMsg(_R_A0 struct pOS_MsgPort*);
VOID pOS_ReplyMsg(_R_A0 __ARID__ struct pOS_Message*);
__ARID__ struct pOS_Message *pOS_WaitPort(_R_A0 struct pOS_MsgPort*);
struct pOS_MsgPort *pOS_FindPort(_R_A0 const CHAR *name);
__ARID__ struct pOS_MsgPort *pOS_CreatePort(_R_A0 const CHAR*,_R_D0 SLONG pri);
VOID  pOS_DeletePort(_R_A0 __ARID__ struct pOS_MsgPort*);
struct pOS_MsgPort *pOS_ConstructMsgPort(_R_A0 struct pOS_MsgPort*);
VOID  pOS_DestructMsgPort(_R_A0 struct pOS_MsgPort*);
struct pOS_MsgPort *pOS_ConstructSigPort(_R_A0 struct pOS_MsgPort*,_R_D0 ULONG sigBit);
struct pOS_Message *pOS_WaitTimePort(_R_A0 struct pOS_MsgPort*,_R_D0 ULONG micros);




/*------ libraries ----------------------------------------------------*/
VOID  pOS_AddLibrary(_R_A0 struct pOS_Library*);
VOID  pOS_RemLibrary(_R_A0 struct pOS_Library*);
__ARID__ struct pOS_Library* pOS_OpenLibrary(_R_A0 const CHAR*,_R_D0 ULONG version);
VOID  pOS_CloseLibrary(_R_A0 __ARID__ struct pOS_Library*);
VOID  pOS_SumLibrary(_R_A0 struct pOS_Library*);
size_t pOS_MakeFunctions(_R_A0 struct pOS_LibraryFunction*,
                         _R_A1 const ULONG**,_R_A2 ULONG*,_R_D0 size_t);
__ARID__ struct pOS_Library *pOS_MakeLibrary(_R_A0 const ULONG**,_R_A1 APTR,
                             _R_A2 BOOL (*initFunc)(_R_LB struct pOS_ExecBase*,_R_A0 struct pOS_Library*),
                             _R_D0 size_t posSize,_R_A3 struct pOS_SegmentLst*);
struct pOS_LibraryFunction* pOS_SetLibFunction(_R_A0 struct pOS_Library*,
                          _R_D0 SLONG funcIndex,_R_A1 const struct pOS_LibraryFunction* newFunc,
                          _R_A2 struct pOS_LibraryFunction* oldFunc);



/*------ memory allocation --------------------------------------------*/
__ARID__ APTR pOS_Allocate(_R_A0 struct pOS_MemHeader*,_R_D0 size_t byteSize );
VOID  pOS_Deallocate(_R_A0 struct pOS_MemHeader*,_R_A1 __ARID__ APTR memoryBlock,_R_D0 size_t byteSize);
__ARID__ APTR pOS_AllocMem(_R_D0 size_t byteSize,_R_D1 ULONG requirements);
__ARID__ APTR pOS_AllocAbs(_R_D0 size_t byteSize,_R_A0 APTR location);
VOID  pOS_FreeMem(_R_A0 __ARID__ APTR memoryBlock,_R_D0 size_t byteSize);
size_t pOS_AvailMem(_R_D0 ULONG requirements);
__ARID__ struct pOS_MemList *pOS_AllocEntry(_R_A0 struct pOS_MemPool*,_R_A1 struct pOS_MemList*);
VOID  pOS_FreeEntry(_R_A0 struct pOS_MemPool*,_R_A1 __ARID__ struct pOS_MemList*);
VOID  pOS_AddMemList(_R_D0 size_t,_R_D1 ULONG attr,_R_D2 SLONG pri,_R_A0 APTR adr,_R_A1 const CHAR* name);
__ARID__ APTR pOS_AllocVec(_R_D0 size_t,_R_D1 ULONG attr);
VOID  pOS_FreeVec(_R_A0 __ARID__ APTR);
VOID  pOS_InitMemPool(_R_A0 struct pOS_MemPool*,_R_D0 size_t segmSize,_R_D1 ULONG semgMEMF);
__ARID__ APTR pOS_AllocPoolMem(_R_A0 struct pOS_MemPool*,_R_D0 size_t size,_R_D1 ULONG memf);
VOID  pOS_FreePoolMem(_R_A0 struct pOS_MemPool*,_R_A1 __ARID__ APTR,_R_D0 size_t size);
VOID  pOS_FreePoolAll(_R_A0 struct pOS_MemPool*);
__ARID__ APTR pOS_AllocPoolVec(_R_A0 struct pOS_MemPool*,_R_D0 size_t size,_R_D1 ULONG memf);
VOID  pOS_FreePoolVec(_R_A0 struct pOS_MemPool*,_R_A1 __ARID__ APTR);
VOID pOS_CopyMem(_R_A0 const VOID*,_R_A1 VOID*,_R_D0 size_t);
VOID pOS_AddMemHandler(_R_A0 struct pOS_Callback*);
VOID pOS_RemMemHandler(_R_A0 struct pOS_Callback*);
size_t pOS_AvailPoolMem(_R_A0 const struct pOS_MemPool*,_R_D0 ULONG requirements);
ULONG pOS_TypeOfMem(_R_A0 const VOID*,_R_D0 ULONG mode);
BOOL pOS_IsPoolMem(_R_A0 const struct pOS_MemPool*,_R_A1 const VOID*);
__ARID__ APTR pOS_AllocAlignment(_R_A0 struct pOS_MemPool*,_R_D0 size_t byteSize,
                                 _R_D1 ULONG requirements,_R_D2 ULONG lg2);




/*------ signal semaphores (note funny registers)----------------------*/
VOID  pOS_InitSemaphore(_R_A0 struct pOS_Semaphore*);
VOID  pOS_ObtainSemaphore(_R_A0 struct pOS_Semaphore*);
VOID  pOS_ReleaseSemaphore(_R_A0 struct pOS_Semaphore*);
BOOL  pOS_AttemptSemaphore(_R_A0 struct pOS_Semaphore*);
VOID  pOS_ObtainSemaphoreList(_R_A0 struct pOS_ExList*);
VOID  pOS_ReleaseSemaphoreList(_R_A0 struct pOS_ExList*);
struct pOS_Semaphore *pOS_FindSemaphore(_R_A0 const CHAR*);
VOID  pOS_AddSemaphore(_R_A0 struct pOS_Semaphore*);
VOID  pOS_RemSemaphore(_R_A0 struct pOS_Semaphore*);
VOID  pOS_ProcureSemaphore(_R_A0 struct pOS_Semaphore*,_R_A1 struct pOS_Message*);
VOID  pOS_VacateSemaphore(_R_A0 struct pOS_Semaphore*,_R_A1 struct pOS_Message*);
BOOL  pOS_AttemptProcureSemaphore(_R_A0 struct pOS_Semaphore*,_R_A1 struct pOS_Message*);
VOID  pOS_ObtainSemaphoreShared(_R_A0 struct pOS_Semaphore*);
BOOL  pOS_AttemptTimeSemaphore(_R_A0 struct pOS_Semaphore*,_R_D0 ULONG micros);
VOID  pOS_AddSemaphoreQR(_R_A0 struct pOS_Semaphore*,_R_A1 struct pOS_Message*);
VOID  pOS_RemSemaphoreQR(_R_A0 struct pOS_Semaphore*,_R_A1 struct pOS_Message*);
BOOL  pOS_IsObtainSemaphore(_R_A0 struct pOS_Semaphore*);



/*------ diagnostics --------------------------------------------------*/
VOID  pOS_DisplayAlert(_R_D0 ULONG alertNum);
BOOL  pOS_ExecCheckA(_R_A0 const struct pOS_TagItem*);
VOID pOS_KPutChar(_R_D0 ULONG ch);
VOID pOS_VKPrintf(_R_A0 const CHAR* fmt,_R_A1 const ULONG* argv);



/*------ devices ------------------------------------------------------*/
VOID  pOS_AddDevice(_R_A0 struct pOS_Device*);
VOID  pOS_RemDevice(_R_A0 struct pOS_Device*);
SBYTE pOS_OpenDevice(_R_A0 const CHAR*,_R_D0 ULONG unit,
                     _R_A1 struct pOS_IORequest*,_R_D1 ULONG flags,_R_D2 ULONG version);
VOID  pOS_CloseDevice(_R_A0 struct pOS_IORequest*);
SBYTE pOS_DoIO(_R_A0 struct pOS_IORequest*);
VOID  pOS_SendIO(_R_A0 __ARID__ struct pOS_IORequest*);
struct pOS_IORequest *pOS_CheckIO(_R_A0 const struct pOS_IORequest*);
SBYTE pOS_WaitIO(_R_A0 struct pOS_IORequest*);
VOID  pOS_AbortIO(_R_A0 struct pOS_IORequest*);
VOID  pOS_BeginIO(_R_A0 __ARID__ struct pOS_IORequest*);
__ARID__ struct pOS_IORequest *pOS_CreateIORequest(_R_A0 struct pOS_MsgPort*,_R_D0 size_t);
VOID  pOS_DeleteIORequest(_R_A0 __ARID__ struct pOS_IORequest*);


/*------ resources ----------------------------------------------------*/
VOID  pOS_AddResource(_R_A0 struct pOS_Resource*);
VOID  pOS_RemResource(_R_A0 struct pOS_Resource*);
__ARID__ struct pOS_Resource* pOS_OpenResource(_R_A0 const CHAR*);
VOID  pOS_CloseResource(_R_A0 __ARID__ struct pOS_Resource*);


/*------ resident ----------------------------------------------------*/
struct pOS_Resident *pOS_FindResident(_R_A0 const CHAR*);
APTR pOS_InitResident(_R_A0 const struct pOS_Resident*,_R_A1 struct pOS_SegmentLst*);



/*------ RawDoFmt ----------------------------------------------------*/
VOID  pOS_RawDoFmt(_R_A0 struct pOS_RawDoFmtData*);
const CHAR* pOS_ReadAsciiFmt(_R_A0 struct pOS_AsciiFmtData*,_R_A1 const CHAR*);
CHAR* pOS_WriteAsciiFmt(_R_A0 const struct pOS_AsciiFmtData*,_R_A1 CHAR*,_R_D0 size_t);


/*------ Class --------------------------------------------------------*/
VOID  pOS_AddClass(_R_A0 struct pOS_NClass*);
VOID  pOS_AddLinkClass(_R_A0 const struct pOS_NClass*,_R_A1 struct pOS_NClass*);
VOID  pOS_SubClass(_R_A0 struct pOS_NClass*);
APTR  pOS_CreateObject(_R_A0 struct pOS_NClass*,_R_A1 const CHAR*,
                       _R_D0 ULONG,_R_A4 struct pOS_Method*);
VOID  pOS_DeleteObject(_R_A0 APTR);
ULONG pOS_DoIMethodA(_R_A0 APTR,_R_A4 struct pOS_Method*);
ULONG pOS_DoMMethodA(_R_A0 const struct pOS_Class*,_R_D0 ULONG idx,
                     _R_A1 APTR,_R_A4 struct pOS_Method*);
ULONG pOS_DoVirMethodA(_R_A0 const struct pOS_Class*,_R_A1 APTR,_R_A4 struct pOS_Method*);
ULONG pOS_DoAbsMethodA(_R_A0 const struct pOS_Class*,_R_A1 APTR,_R_A4 struct pOS_Method*);
struct pOS_NClass* pOS_OpenClass(_R_A0 const CHAR*,_R_D0 ULONG ver);
VOID  pOS_CloseClass(_R_A0 struct pOS_NClass*);
APTR  pOS_GetMemberAdr(_R_A0 const struct pOS_Class*,
                       _R_D0 ULONG idx,_R_A1 APTR);
BOOL  pOS_MoveUpClassPtr(_R_A0 const struct pOS_Class*,_R_A1 APTR object,
                         _R_A2 struct pOS_Class** newCl,_R_A3 APTR* newObject);
BOOL  pOS_MoveDownClassPtr(_R_A0 const struct pOS_Class*,_R_A1 APTR object,
                         _R_A2 struct pOS_Class** newCl,_R_A3 APTR* newObject);
APTR pOS_GetUpObjectAdr(_R_A0 const struct pOS_Class*,_R_A1 APTR,
                        _R_D0 ULONG num);
struct pOS_NClass* pOS_GetNClass(_R_A0 const struct pOS_Class*);
APTR pOS_GetIMemberAdr(_R_D0 ULONG memberIdx,_R_A0 APTR);
APTR pOS_GetObjectRootAdr(_R_A0 const struct pOS_Class*,_R_A1 APTR object);
__ARID__ struct pOS_NClass *pOS_CreateClass(_R_A0 const CHAR* className,
                          _R_A1 const CHAR* supClName,_R_A2 const struct pOS_NClass* supCl,
                          _R_A3 APTR dispFunc,_R_D0 size_t objSize,_R_D1 ULONG supClVer);
VOID pOS_DeleteClass(__ARID__ _R_A0 struct pOS_NClass*);
BOOL pOS_DebugClassI(_R_A0 const VOID* obj,
                     _R_A1 const CHAR* clName,_R_A2 const struct pOS_NClass* cl,_R_D0 BOOL print);
BOOL pOS_DebugClassAbs(_R_A0 const VOID* obj,
                       _R_A1 const struct pOS_Class* mcl,_R_A2 const CHAR* clName,
                       _R_A3 const struct pOS_NClass* cl,_R_D0 BOOL print);



ULONG pOS_DoIMethod(_R_A0 APTR,ULONG methode,...);
ULONG pOS_DoVirMethod(_R_A0 const struct pOS_Class*,_R_A1 APTR,ULONG methode,...);
ULONG pOS_DoAbsMethod(_R_A0 const struct pOS_Class*,_R_A1 APTR,ULONG methode,...);
BOOL  pOS_ExecCheck(ULONG tag,...);


#ifdef __cplusplus
}
#endif

#endif
