/************* * DESCRIPTION: create a subtask * INPUT: type type of subtask * sigbit signal bit for reply port * name name of the task * priority * stack * OUTPUT: subtask structure *************/ struct SubTask *CreateSubTaskPPC(ULONG type, LONG sigbit, char *name, ULONG priority, ULONG stack) { struct SubTask *st; st = (struct SubTask*)AllocVec(sizeof(struct SubTask), MEMF_PUBLIC|MEMF_CLEAR); if(st) { st->st_Reply = CreateMsgPortPPC(); if(!st->st_Reply) { FreeVec(st); return NULL; } st->st_Port = CreateMsgPortPPC(); if(!st->st_Port) { DeleteMsgPortPPC(st->st_Reply); FreeVec(st); return NULL; } st->st_Task = (struct Task *)CreateTaskPPCTags( TASKATTR_CODE, PreviewSubTaskPPC, TASKATTR_NAME, name, //TASKATTR_PRI, priority, TASKATTR_R3, st, //TASKATTR_STACKSIZE, stack, TAG_DONE); if(!st->st_Task) { FreeVec(st); st = NULL; } } return st; }
int amigaPutTriggerSigs(ULONG trigs) { int done = -1; #ifndef __OS3PPC__ /* ** 68K / OS4 / MorphOS */ struct TriggerMessage msg; if ((msg.tm_ExecMsg.mn_ReplyPort = CreateMsgPort())) { struct MsgPort *port; msg.tm_TriggerType = trigs; msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE; msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage); Forbid(); if ((port = FindPort("dnetc")) && port != TriggerPort) { PutMsg(port,(struct Message *)&msg); } Permit(); if (port && port != TriggerPort) { WaitPort(msg.tm_ExecMsg.mn_ReplyPort); GetMsg(msg.tm_ExecMsg.mn_ReplyPort); done = 1; } else { done = 0; } DeleteMsgPort(msg.tm_ExecMsg.mn_ReplyPort); } #elif !defined(__POWERUP__) /* ** WarpOS */ struct TriggerMessage msg; struct MsgPortPPC *replyport; if ((replyport = CreateMsgPortPPC())) { msg.tm_ExecMsg.mn_ReplyPort = (struct MsgPort *)replyport; msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE; msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage); msg.tm_TriggerType = trigs; struct MsgPortPPC *port; if ((port = FindPortPPC("dnetc")) && port != TriggerPort) { PutMsgPPC(port,(struct Message *)&msg); WaitPortPPC(replyport); GetMsgPPC(replyport); done = 1; } else { done = 0; } DeleteMsgPortPPC(replyport); } #else /* ** PowerUp */ struct TagItem tags[2] = { {PPCPORTTAG_NAME, (ULONG)"dnetc"}, {TAG_END,0} }; void *msg, *replyport, *port; if ((replyport = PPCCreatePort(NULL))) { if ((msg = PPCCreateMessage(replyport,0))) { done = 0; if ((port = PPCObtainPort(tags))) { if (port != TriggerPort) { if (PPCSendMessage(port,msg,NULL,0,trigs)) { PPCWaitPort(replyport); PPCGetMessage(replyport); done = 1; } } PPCReleasePort(port); } PPCDeleteMessage(msg); } PPCDeletePort(replyport); } #endif return(done); }
int amigaInit(int *argc, char **argv[]) { int done = TRUE; #if !defined(__POWERUP__) && !defined(__amigaos4__) && !defined(__MORPHOS__) if (!MemInit()) return FALSE; #endif #ifdef __OS3PPC__ /* ** PPC */ /* Set the priority of the PPC 68k mirror main task */ #ifdef CHANGE_MIRROR_TASK_PRI Old68kMirrorPri = SetTaskPri(FindTask(NULL), 2); #endif #ifdef __POWERUP__ /* ** PowerUp */ /* Requires ppc.library 46.30 (or PPCLibEmu), due to timer/signal bugs */ #define PPCINFOTAG_EMULATION (TAG_USER + 0x1f0ff) if (PPCGetAttr(PPCINFOTAG_EMULATION) == 'WARP') { if (!((PPCVersion() == 46 && PPCRevision() >= 29) || PPCVersion() > 46)) { printf("Requires PPCLibEmu 0.8a or higher!\n"); done = FALSE; } } else { if (!((PPCVersion() == 46 && PPCRevision() >= 30) || PPCVersion() > 46)) { printf("Requires ppc.library 46.30 or higher!\n"); done = FALSE; } } if (done) { if (PPCGetTaskAttr(PPCTASKTAG_STACKSIZE) < 200000) { printf("Please increase stack size to at least 200000 bytes!\n"); done = FALSE; } } if (done) { done = ((PPCLibBase = OpenLibrary("ppc.library",46)) != NULL); } if (done) { struct TagItem tags[2] = { {PPCPORTTAG_NAME, (ULONG)"dnetc"}, {TAG_END,0} }; void *port; if (!(port = PPCObtainPort(tags))) { done = FALSE; if ((TriggerPort = PPCCreatePort(tags))) { done = TRUE; } } else { PPCReleasePort(port); } } #else /* ** WarpOs */ if (!FindPortPPC("dnetc")) { if ((TriggerPort = CreateMsgPortPPC())) { TriggerPort->mp_Port.mp_Node.ln_Name = "dnetc"; TriggerPort->mp_Port.mp_Node.ln_Pri = 0; AddPortPPC(TriggerPort); } else { done = FALSE; } } #endif #else /* ** 68K / OS4 / MorphOS */ struct MsgPort *portexists; Forbid(); portexists = FindPort("dnetc"); if (!portexists) { if ((TriggerPort = CreateMsgPort())) { TriggerPort->mp_Node.ln_Name = "dnetc"; TriggerPort->mp_Node.ln_Pri = 0; AddPort(TriggerPort); } else { done = FALSE; } } Permit(); #endif if (!TimerBase && done) done = GlobalTimerInit(); if (!done) amigaExit(); #ifndef NO_GUI /* Workbench startup */ if (done && *argc == 0) { struct WBStartup *wbs = (struct WBStartup *)*argv; struct WBArg *arg = wbs->sm_ArgList; static char *newargv[1]; newargv[0] = (char *)arg->wa_Name; *argc = 1; *argv = newargv; if (wbs->sm_NumArgs > 1) { /* Started via a project icon */ arg = &wbs->sm_ArgList[1]; } if (!(amigaGUIInit((char *)wbs->sm_ArgList->wa_Name,arg))) { if (!(amigaOpenNewConsole("CON://630/300/distributed.net client/CLOSE/WAIT"))) { done = FALSE; } } } #endif #if USE_RESETHANDLER if (done) { add_resethandler(); } #endif return(done); }