amiga-libnix2/sources/amiga/misc/CreateTask.c

128 lines
2.8 KiB
C

#if 1
#include <exec/tasks.h>
#include <exec/memory.h>
#include <proto/exec.h>
struct newMemList {
struct Node nml_Node;
UWORD nml_NumEntries;
struct MemEntry nml_ME[2];
};
const struct newMemList MemTemplate = {
{0,},
2,
{ {MEMF_CLEAR|MEMF_PUBLIC, sizeof(struct Task)},
{MEMF_CLEAR, 0} }
};
#define NEWLIST(l) ((l)->lh_Head = (struct Node *)&(l)->lh_Tail, \
/*(l)->lh_Tail = NULL,*/ \
(l)->lh_TailPred = (struct Node *)&(l)->lh_Head)
struct Task *CreateTask(STRPTR name, LONG pri, APTR initpc, ULONG stacksize)
{ struct Library *SysBase = *(struct Library **)4L;
struct newMemList nml;
struct MemList *ml;
struct Task *newtask;
APTR task2;
stacksize=(stacksize+3)&~3;
{ long *p1,*p2;
int i;
for (p1=(long *)&nml,p2=(long*)&MemTemplate,i=7; i; *p1++=*p2++,i--) ;
*p1=stacksize;
}
if (!(((unsigned int)ml=AllocEntry((struct MemList *)&nml)) & (1<<31))) {
newtask=ml->ml_ME[0].me_Addr;
newtask->tc_Node.ln_Type = NT_TASK;
newtask->tc_Node.ln_Pri = pri;
newtask->tc_Node.ln_Name = name;
newtask->tc_SPReg = (APTR)((ULONG)ml->ml_ME[1].me_Addr+stacksize);
newtask->tc_SPLower = ml->ml_ME[1].me_Addr;
newtask->tc_SPUpper = newtask->tc_SPReg;
NEWLIST(&newtask->tc_MemEntry);
AddHead(&newtask->tc_MemEntry,&ml->ml_Node);
task2=AddTask(newtask,initpc,0);
if (SysBase->lib_Version>36 && !task2) {
FreeEntry(ml); newtask = NULL;
}
}
else
newtask = NULL;
return newtask;
}
#else
asm("
.globl _CreateTask
_CreateTask: moveml d2/d3/a2/a3/a6,sp@-
movel sp@(12+6*4:W),d0
addql #3,d0
moveq #-4,d2
andl d0,d2 | stack adjusted
movel d2,sp@-
lea pc@(Lmemlist-.+2+7*4),a0
moveq #6,d0
L3: movel a0@-,sp@- | copy memlist
dbra d0,L3
movel sp,a0
movel 4:W,a6
jsr a6@(-222:W) | AllocEntry()
movel d0,a2
movel a2,d0
lea sp@(32:W),sp
blts L2
movel a2@(16:W),a3
moveb #1,a3@(8:W) | ln_Type
moveb sp@(7+6*4:W),a3@(9:W) | ln_Pri
movel sp@(0+6*4:W),a3@(10:W) | ln_Name
movel a2@(24:W),d0
addl d0,d2
movel d2,a3@(54:W) | tc_SPReg
movel d0,a3@(58:W) | tc_SPLower
movel d2,a3@(62:W) | tc_SPUpper
lea a3@(74:W),a0 | tc_MemList
movel a0,a0@(8:W)
addqw #4,a0
movel a0,a0@-
movel a2,a1
jsr a6@(-240:W) | AddHead()
movel a3,d3
movel d3,a1
movel sp@(8+6*4:W),d2
exg d2,a2
subal a3,a3
jsr a6@(-282:W) | AddTask()
cmpw #37,a6@(20:W)
bcss L1 | kick2.0+ ?
tstl d0
bnes L1 | task added
movel d2,a0
jsr a6@(-228:W) | FreeEntry()
L2: moveq #0,d3
L1: movel d3,d0 | new task
moveml sp@+,d2/d3/a2/a3/a6
rts
.align 2
Lmemlist: .long 0,0 | Succ,Pred
.byte 0,0 | Pri,Type
.long 0 | Name
.word 2 | NumEntries
.long 0x10001 | MemType
.long 92 | Length
.long 0x10000 | MemType
| .long 0 | Length
");
#endif